From ecda3bd031607a9dc11819c7c3f8e41419618c37 Mon Sep 17 00:00:00 2001 From: Cedric Staub Date: Wed, 17 Feb 2010 12:20:03 +0100 Subject: Use SoupCookieJar to handle JavaScript cookies --- src/callbacks.c | 17 +++++++++++++++++ src/callbacks.h | 2 ++ src/uzbl-core.c | 25 +++++++++++++++++++++++++ src/uzbl-core.h | 1 + 4 files changed, 45 insertions(+) diff --git a/src/callbacks.c b/src/callbacks.c index 9b90d3c..97ee52a 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -779,3 +779,20 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { } } +void +cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) { + (void) jar; + (void) user_data; + (void) old_cookie; + char *scheme; + GString *s; + + if(new_cookie != NULL) { + scheme = (new_cookie->secure == TRUE) ? "https" : "http"; + + s = g_string_new(""); + g_string_printf(s, "PUT '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value); + run_handler(uzbl.behave.cookie_handler, s->str); + g_string_free(s, TRUE); + } +} diff --git a/src/callbacks.h b/src/callbacks.h index 6ed8986..07c286a 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -208,3 +208,5 @@ button_release_cb (GtkWidget* window, GdkEventButton* event); gboolean focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud); +void +cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index ebd8ef8..5834f8b 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2412,6 +2412,27 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) if ( p != NULL ) *p = '\0'; soup_message_headers_replace (msg->request_headers, "Cookie", (const char *) uzbl.comm.sync_stdout); + int len = strlen(uzbl.comm.sync_stdout); + + if(len > 0) { + SoupCookie *soup_cookie; + char *cookies = (char *) g_malloc(len+1); + strncpy(cookies, uzbl.comm.sync_stdout, len+1); + + g_object_disconnect((GObject*)uzbl.net.soup_cookie_jar, "any_signal", (GCallback)cookie_handler_cb, NULL, NULL); + + p = cookies - 1; + while(p != NULL) { + p = p + 1; + soup_cookie = soup_cookie_parse((const char *) p, soup_uri); + if(soup_cookie->domain == NULL) soup_cookie->domain = soup_uri->host; + soup_cookie_jar_add_cookie(uzbl.net.soup_cookie_jar, soup_cookie); + p = strchr(p, ';'); + } + + g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL); + g_free(cookies); + } } if (uzbl.comm.sync_stdout) uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); @@ -2535,6 +2556,10 @@ initialize(int argc, char *argv[]) { uzbl.net.soup_session = webkit_get_default_session(); uzbl.state.keycmd = g_strdup(""); + uzbl.net.soup_cookie_jar = soup_cookie_jar_new(); + soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar)); + g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL); + for(i=0; sigs[i]; i++) { if(setup_signal(sigs[i], catch_signal) == SIG_ERR) fprintf(stderr, "uzbl: error hooking %d: %s\n", sigs[i], strerror(errno)); diff --git a/src/uzbl-core.h b/src/uzbl-core.h index 23072e4..b5a527a 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -106,6 +106,7 @@ typedef struct { /* networking */ typedef struct { SoupSession *soup_session; + SoupCookieJar *soup_cookie_jar; SoupLogger *soup_logger; char *proxy_url; char *useragent; -- cgit v1.2.3 From b15176878a1779f8a603797bce5d379770e8fe32 Mon Sep 17 00:00:00 2001 From: Cedric Staub Date: Sat, 27 Feb 2010 11:58:37 +0100 Subject: Cleaned up cookie handling code --- src/callbacks.c | 21 ++++++++++++++++++++- src/callbacks.h | 5 ++++- src/uzbl-core.c | 32 ++++++++------------------------ src/uzbl-core.h | 2 -- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/src/callbacks.c b/src/callbacks.c index 97ee52a..b96f8bc 100644 --- a/src/callbacks.c +++ b/src/callbacks.c @@ -780,7 +780,7 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) { } void -cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) { +save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data) { (void) jar; (void) user_data; (void) old_cookie; @@ -796,3 +796,22 @@ cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_co g_string_free(s, TRUE); } } + +void +save_cookies_http(SoupMessage *msg, gpointer user_data) { + (void) user_data; + GSList *ck; + char *cookie; + + for(ck = soup_cookies_from_response(msg); ck; ck = ck->next){ + cookie = soup_cookie_to_set_cookie_header(ck->data); + SoupURI *soup_uri = soup_message_get_uri(msg); + GString *s = g_string_new(""); + g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie); + run_handler(uzbl.behave.cookie_handler, s->str); + g_free (cookie); + g_string_free(s, TRUE); + } + + g_slist_free(ck); +} diff --git a/src/callbacks.h b/src/callbacks.h index 07c286a..88da845 100644 --- a/src/callbacks.h +++ b/src/callbacks.h @@ -209,4 +209,7 @@ gboolean focus_cb(GtkWidget* window, GdkEventFocus* event, void *ud); void -cookie_handler_cb(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); +save_cookies_js(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie, gpointer user_data); + +void +save_cookies_http(SoupMessage *msg, gpointer user_data); diff --git a/src/uzbl-core.c b/src/uzbl-core.c index 5834f8b..a309bf8 100644 --- a/src/uzbl-core.c +++ b/src/uzbl-core.c @@ -2393,16 +2393,15 @@ void handle_authentication (SoupSession *session, SoupMessage *msg, SoupAuth *au } } -void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data){ +void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) { (void) session; (void) user_data; - //if (!uzbl.behave.cookie_handler) - // return; - soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies), NULL); + soup_message_add_header_handler(msg, "got-headers", "Set-Cookie", G_CALLBACK(save_cookies_http), NULL); GString *s = g_string_new (""); SoupURI * soup_uri = soup_message_get_uri(msg); g_string_printf(s, "GET '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path); + if(uzbl.behave.cookie_handler) run_handler(uzbl.behave.cookie_handler, s->str); @@ -2419,7 +2418,8 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) char *cookies = (char *) g_malloc(len+1); strncpy(cookies, uzbl.comm.sync_stdout, len+1); - g_object_disconnect((GObject*)uzbl.net.soup_cookie_jar, "any_signal", (GCallback)cookie_handler_cb, NULL, NULL); + /* Disconnect to avoid recusion */ + g_object_disconnect(G_OBJECT(uzbl.net.soup_cookie_jar), "any_signal", G_CALLBACK(save_cookies_js), NULL, NULL); p = cookies - 1; while(p != NULL) { @@ -2430,33 +2430,17 @@ void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data) p = strchr(p, ';'); } - g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL); + g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); g_free(cookies); } } + if (uzbl.comm.sync_stdout) uzbl.comm.sync_stdout = strfree(uzbl.comm.sync_stdout); g_string_free(s, TRUE); } -void -save_cookies (SoupMessage *msg, gpointer user_data){ - (void) user_data; - GSList *ck; - char *cookie; - for (ck = soup_cookies_from_response(msg); ck; ck = ck->next){ - cookie = soup_cookie_to_set_cookie_header(ck->data); - SoupURI * soup_uri = soup_message_get_uri(msg); - GString *s = g_string_new (""); - g_string_printf(s, "PUT '%s' '%s' '%s' '%s'", soup_uri->scheme, soup_uri->host, soup_uri->path, cookie); - run_handler(uzbl.behave.cookie_handler, s->str); - g_free (cookie); - g_string_free(s, TRUE); - } - g_slist_free(ck); -} - void dump_var_hash(gpointer k, gpointer v, gpointer ud) { (void) ud; @@ -2558,7 +2542,7 @@ initialize(int argc, char *argv[]) { uzbl.net.soup_cookie_jar = soup_cookie_jar_new(); soup_session_add_feature(uzbl.net.soup_session, SOUP_SESSION_FEATURE(uzbl.net.soup_cookie_jar)); - g_object_connect((GObject*)uzbl.net.soup_cookie_jar, "signal::changed", (GCallback)cookie_handler_cb, NULL, NULL); + g_object_connect(G_OBJECT(uzbl.net.soup_cookie_jar), "signal::changed", G_CALLBACK(save_cookies_js), NULL, NULL); for(i=0; sigs[i]; i++) { if(setup_signal(sigs[i], catch_signal) == SIG_ERR) diff --git a/src/uzbl-core.h b/src/uzbl-core.h index b5a527a..0ec46c6 100644 --- a/src/uzbl-core.h +++ b/src/uzbl-core.h @@ -403,8 +403,6 @@ handle_authentication (SoupSession *session, void handle_cookies (SoupSession *session, SoupMessage *msg, gpointer user_data); -void -save_cookies (SoupMessage *msg, gpointer user_data); void set_var(WebKitWebView *page, GArray *argv, GString *result); -- cgit v1.2.3