From 04a5223d6abb42c42acc31c8b50ed11a049c59db Mon Sep 17 00:00:00 2001 From: keis Date: Tue, 30 Nov 2010 21:45:57 +0100 Subject: cookies rework * send events on cookie changes * add command to add a new cookie parses same syntax as events no ADD_COOKIE event is raised for these cookies * add command to delete a cookie parses same syntax as events, ignoring everything after 5th argument no DELETE_COOKIE event is raised for these cookies --- src/cookie-jar.c | 26 +++++++++++++++++++++++--- src/cookie-jar.h | 1 + src/events.c | 4 +++- src/events.h | 1 + src/uzbl-core.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++++++++++- src/uzbl-core.h | 6 ++++++ 6 files changed, 88 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/cookie-jar.c b/src/cookie-jar.c index f2e340b..626e454 100644 --- a/src/cookie-jar.c +++ b/src/cookie-jar.c @@ -12,6 +12,7 @@ #include "cookie-jar.h" #include "uzbl-core.h" +#include "events.h" static void uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data); @@ -38,6 +39,8 @@ soup_cookie_jar_socket_init(UzblCookieJar *jar) { jar->handler = NULL; jar->socket_path = NULL; jar->connection_fd = -1; + jar->in_get_callback = 0; + jar->in_manual_add = 0; } static void @@ -141,7 +144,7 @@ request_started(SoupSessionFeature *feature, SoupSession *session, static void changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { - (void) old_cookie; + SoupCookie * cookie = new_cookie ? new_cookie : old_cookie; UzblCookieJar *uzbl_jar = UZBL_COOKIE_JAR(jar); @@ -155,6 +158,25 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { if(uzbl_jar->in_get_callback) return; + gchar *scheme = cookie->secure ? "https" : "http"; + + /* send a ADD or DELETE -_COOKIE event depending on what have changed */ + if(!uzbl_jar->in_manual_add) { + gchar *expires = NULL; + if(cookie->expires) + expires = g_strdup_printf ("%d", soup_date_to_time_t (cookie->expires)); + + gchar * eventstr = g_strdup_printf ("'%s' '%s' '%s' '%s' '%s' '%s'", + cookie->domain, cookie->path, cookie->name, cookie->value, scheme, expires?expires:""); + if(new_cookie) + send_event(ADD_COOKIE, eventstr, NULL); + else + send_event(DELETE_COOKIE, eventstr, NULL); + g_free(eventstr); + if(expires) + g_free(expires); + } + /* the cookie daemon is only interested in new cookies and changed ones, it can take care of deleting expired cookies on its own. */ if(!new_cookie) @@ -162,8 +184,6 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) { GString *s = g_string_new ("PUT"); - gchar *scheme = new_cookie->secure ? "https" : "http"; - if(has_socket_handler(uzbl_jar)) { g_string_append_c(s, 0); /* null-terminate the PUT */ g_string_append_len(s, scheme, strlen(scheme)+1); diff --git a/src/cookie-jar.h b/src/cookie-jar.h index 80af00e..f3e3733 100644 --- a/src/cookie-jar.h +++ b/src/cookie-jar.h @@ -16,6 +16,7 @@ typedef struct { int connection_fd; gboolean in_get_callback; + gboolean in_manual_add; } UzblCookieJar; typedef struct { diff --git a/src/events.c b/src/events.c index b02cb89..baaf8f3 100644 --- a/src/events.c +++ b/src/events.c @@ -49,7 +49,9 @@ const char *event_table[LAST_EVENT] = { "SCROLL_HORIZ" , "DOWNLOAD_STARTED" , "DOWNLOAD_PROGRESS", - "DOWNLOAD_COMPLETE" + "DOWNLOAD_COMPLETE", + "ADD_COOKIE" , + "DELETE_COOKIE" }; void diff --git a/src/events.h b/src/events.h index 4b04dd2..3c7b933 100644 --- a/src/events.h +++ b/src/events.h @@ -17,6 +17,7 @@ enum event_type { PLUG_CREATED, COMMAND_ERROR, BUILTINS, PTR_MOVE, SCROLL_VERT, SCROLL_HORIZ, DOWNLOAD_STARTED, DOWNLOAD_PROGRESS, DOWNLOAD_COMPLETE, + ADD_COOKIE, DELETE_COOKIE, /* must be last entry */ LAST_EVENT diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 1fc8593..eb340e0 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -613,7 +613,9 @@ struct {const char *key; CommandInfo value;} cmdlist[] = { "menu_editable_remove", {menu_remove_edit, TRUE} }, { "hardcopy", {hardcopy, TRUE} }, { "include", {include, TRUE} }, - { "show_inspector", {show_inspector, 0} } + { "show_inspector", {show_inspector, 0} }, + { "add_cookie", {add_cookie, 0} }, + { "delete_cookie", {delete_cookie, 0} } }; void @@ -907,6 +909,57 @@ show_inspector(WebKitWebView *page, GArray *argv, GString *result) { webkit_web_inspector_show(uzbl.gui.inspector); } +void +add_cookie(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; + gchar *host, *path, *name, *value; + gboolean http_only = 0, secure = 0; + SoupDate *expires = NULL; + + if(argv->len != 6) + return; + + // Parse with same syntax as ADD_COOKIE event + host = argv_idx (argv, 0); + path = argv_idx (argv, 1); + name = argv_idx (argv, 2); + value = argv_idx (argv, 3); + secure = strcmp (argv_idx (argv, 4), "https") == 0; + if (strlen (argv_idx (argv, 5)) != 0) + expires = soup_date_new_from_time_t ( + strtoul (argv_idx (argv, 5), NULL, 10)); + + // Create new cookie + SoupCookie * cookie = soup_cookie_new (name, value, host, path, -1); + soup_cookie_set_secure (cookie, secure); + if (expires) + soup_cookie_set_expires (cookie, expires); + + // Add cookie to jar + uzbl.net.soup_cookie_jar->in_manual_add = 1; + soup_cookie_jar_add_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie); + uzbl.net.soup_cookie_jar->in_manual_add = 0; +} + +void +delete_cookie(WebKitWebView *page, GArray *argv, GString *result) { + (void) page; (void) result; + + if(argv->len < 4) + return; + + SoupCookie * cookie = soup_cookie_new ( + argv_idx (argv, 2), + argv_idx (argv, 3), + argv_idx (argv, 0), + argv_idx (argv, 1), + 0); + + uzbl.net.soup_cookie_jar->in_manual_add = 1; + soup_cookie_jar_delete_cookie (SOUP_COOKIE_JAR (uzbl.net.soup_cookie_jar), cookie); + uzbl.net.soup_cookie_jar->in_manual_add = 0; +} + void act_dump_config() { dump_config(); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index b521f93..098cc95 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -451,6 +451,12 @@ include(WebKitWebView *page, GArray *argv, GString *result); void show_inspector(WebKitWebView *page, GArray *argv, GString *result); +void +add_cookie(WebKitWebView *page, GArray *argv, GString *result); + +void +delete_cookie(WebKitWebView *page, GArray *argv, GString *result); + void builtins(); -- cgit v1.2.3