aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar Brendan Taylor <whateley@gmail.com>2010-12-27 21:40:22 -0700
committerGravatar Brendan Taylor <whateley@gmail.com>2010-12-28 10:42:32 -0700
commitf6bd9e08bf16165f1ae2a7c98255fd89709a72a9 (patch)
tree5e564dc91a99fe3ac452d3eabb1809091412d53d
parent32800e94c6667c8f44dfe2178115049c280de339 (diff)
remove talk_to_socket and all its associated bits
-rw-r--r--README5
-rw-r--r--docs/README.cookies63
-rw-r--r--extras/vim/syntax/uzbl.vim2
-rw-r--r--src/callbacks.c10
-rw-r--r--src/callbacks.h3
-rw-r--r--src/cookie-jar.c286
-rw-r--r--src/cookie-jar.h12
-rw-r--r--src/uzbl-core.c5
-rw-r--r--src/uzbl-core.h1
9 files changed, 12 insertions, 375 deletions
diff --git a/README b/README
index 35492da..2c87290 100644
--- a/README
+++ b/README
@@ -183,11 +183,6 @@ The following commands are recognized:
the end, so the argument numbers will be higher.
* `sync_sh <command>`
- Synchronous version of `sh`, See `sync_spawn`.
-* `talk_to_socket <socketfile> <tokens>`
- - Send a message to `<socketfile>` and wait for a response. `<tokens>` are
- concatenated and separated by ASCII NUL bytes.
- - Expects the socket type to be `SOCK_SEQPACKET` (see `connect(2)`).
- - Waits for 500ms for a response.
* `exit`
- Closes `uzbl`.
* `search <string>`
diff --git a/docs/README.cookies b/docs/README.cookies
deleted file mode 100644
index 148603f..0000000
--- a/docs/README.cookies
+++ /dev/null
@@ -1,63 +0,0 @@
-# Cookies and Uzbl #
-
-The speed of cookie lookups is important, since a single page load can involve
-dozens of HTTP requests, each of which needs a separate cookie lookup (since
-another instance of uzbl may have obtained new cookies for a site).
-
-It is possible handle cookie lookup (and storage) using a `spawn_async` cookie
-handler, but spawning new processes is inherently slow so a `talk_to_socket`
-cookie daemon (like the default uzbl-cookie-manager) is recommended.
-
-## uzbl-cookie-manager ##
-
-uzbl-cookie-manager is a cookie daemon based on libsoup's SoupCookieJar. Cookies
-are stored in a file in the Mozilla cookies.txt format (default location
-$XDG_DATA_HOME/.local/share/cookies.txt).
-
-### uzbl-cookie-manager Whitelist ###
-
-If a whitelist file is present (default location
-$XDG_CONFIG_HOME/uzbl/cookie_whitelist), then website attempts to set cookies
-will be ignored unless the site's domain is present in the whitelist.
-
-The whitelist can contain comment lines beginning with `#`, and domain lines. A
-domain line beginning with . will whitelist the given domain name and any
-subdomain of it. Otherwise only exact matches of the domain are whitelisted.
-
-For instance, given this whitelist file:
-
- example.com
- .uzbl.org
-
-uzbl-cookie-manager would accept cookies for example.com, uzbl.org and
-www.uzbl.org, but ignore cookies set for www.example.com (and any other
-domain that is not a subdomain of uzbl.org).
-
-## uzbl-cookie-daemon ##
-
-uzbl-cookie-daemon is a Python cookie daemon based on Python's cookielib.
-Cookielib's lookup algorithm isn't very efficient for our needs, so
-uzbl-cookie-daemon is noticeably slow.
-
-## Cookie Daemon Protocol ##
-
-When uzbl's `cookie_handler` variable is set to `talk_to_socket path`, uzbl
-connects to the Unix domain socket located at `path`. uzbl will send a cookie
-lookup request on this socket every time it makes an HTTP request. The format of
-this lookup request is:
-
- GET\0scheme\0host\0path\0
-
-where `\0` is the null character, `scheme` is the URL scheme (http or https),
-`host` is the hostname from the URL and `path` is the requested path. The cookie
-daemon should respond with the names and values of cookies that match the
-request, in the format used by the `Cookie` header, terminated with a `\0`.
-
-When a website adds, deletes or changes a cookie, uzbl notifies the cookie
-daemon with a request in the format:
-
- PUT\0scheme\0host\0path\0name=value\0
-
-where `scheme`, `host` and `path` are (approximately) as above, and `name=value`
-is the cookie name-value pair to store. The cookie daemon should respond by
-writing `\0` to the socket.
diff --git a/extras/vim/syntax/uzbl.vim b/extras/vim/syntax/uzbl.vim
index b8572c9..bf7108c 100644
--- a/extras/vim/syntax/uzbl.vim
+++ b/extras/vim/syntax/uzbl.vim
@@ -30,7 +30,7 @@ setl iskeyword=!-~,192-255
syn keyword uzblKeyword back forward scroll reload reload_ign_cache stop
syn keyword uzblKeyword zoom_in zoom_out toggle_zoom_type uri script
-syn keyword uzblKeyword toggle_status spawn sync_spawn sync_sh talk_to_socket
+syn keyword uzblKeyword toggle_status spawn sync_spawn sync_sh sync_spawn_exec
syn keyword uzblKeyword exit search search_reverse search_clear dehilight set
syn keyword uzblKeyword dump_config dump_config_as_events chain print event
syn keyword uzblKeyword request menu_add menu_link_add menu_image_add
diff --git a/src/callbacks.c b/src/callbacks.c
index f09dd0d..f41ac74 100644
--- a/src/callbacks.c
+++ b/src/callbacks.c
@@ -983,13 +983,3 @@ populate_popup_cb(WebKitWebView *v, GtkMenu *m, void *c) {
}
}
}
-
-void
-cmd_set_cookie_handler() {
- if(uzbl.behave.cookie_handler[0] == 0) {
- g_free(uzbl.behave.cookie_handler);
- uzbl.behave.cookie_handler = NULL;
- }
-
- uzbl_cookie_jar_set_handler(uzbl.net.soup_cookie_jar, uzbl.behave.cookie_handler);
-}
diff --git a/src/callbacks.h b/src/callbacks.h
index 40fa80d..2116dd4 100644
--- a/src/callbacks.h
+++ b/src/callbacks.h
@@ -213,6 +213,3 @@ scroll_vert_cb(GtkAdjustment *adjust, void *w);
gboolean
scroll_horiz_cb(GtkAdjustment *adjust, void *w);
-
-void
-cmd_set_cookie_handler();
diff --git a/src/cookie-jar.c b/src/cookie-jar.c
index 626e454..82a5269 100644
--- a/src/cookie-jar.c
+++ b/src/cookie-jar.c
@@ -1,51 +1,20 @@
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <sys/un.h>
-#include <poll.h>
-#include <unistd.h>
-#include <sys/ioctl.h>
-#include <string.h>
-#include <errno.h>
-
-#include <libsoup/soup-uri.h>
#include <libsoup/soup-cookie.h>
#include "cookie-jar.h"
#include "uzbl-core.h"
#include "events.h"
-static void
-uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data);
-
-G_DEFINE_TYPE_WITH_CODE (UzblCookieJar, soup_cookie_jar_socket, SOUP_TYPE_COOKIE_JAR,
- G_IMPLEMENT_INTERFACE (SOUP_TYPE_SESSION_FEATURE, uzbl_cookie_jar_session_feature_init))
+G_DEFINE_TYPE (UzblCookieJar, soup_cookie_jar_socket, SOUP_TYPE_COOKIE_JAR)
-static void request_started (SoupSessionFeature *feature, SoupSession *session, SoupMessage *msg, SoupSocket *socket);
static void changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie);
-static void setup_handler(UzblCookieJar *jar);
-
-static void connect_cookie_socket(UzblCookieJar *jar);
-static void disconnect_cookie_socket(UzblCookieJar *jar);
-
-static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_len);
-
-static bool has_socket_handler(UzblCookieJar *jar) {
- return jar->socket_path != NULL;
-}
-
static void
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
finalize(GObject *object) {
- disconnect_cookie_socket(UZBL_COOKIE_JAR(object));
G_OBJECT_CLASS(soup_cookie_jar_socket_parent_class)->finalize(object);
}
@@ -55,120 +24,30 @@ soup_cookie_jar_socket_class_init(UzblCookieJarClass *socket_class) {
SOUP_COOKIE_JAR_CLASS(socket_class)->changed = changed;
}
-/* override SoupCookieJar's request_started handler */
-static void
-uzbl_cookie_jar_session_feature_init(SoupSessionFeatureInterface *iface, gpointer user_data) {
- (void) user_data;
- iface->request_started = request_started;
-}
-
UzblCookieJar *uzbl_cookie_jar_new() {
return g_object_new(UZBL_TYPE_COOKIE_JAR, NULL);
}
-void
-uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar* handler) {
- jar->handler = handler;
- setup_handler(jar);
-}
-
-char *get_cookies(UzblCookieJar *jar, SoupURI *uri) {
- gchar *result, *path;
- GString *s = g_string_new ("GET");
-
- path = uri->path[0] ? uri->path : "/";
-
- if(has_socket_handler(jar)) {
- g_string_append_c(s, 0); /* null-terminate the GET */
- g_string_append_len(s, uri->scheme, strlen(uri->scheme)+1);
- g_string_append_len(s, uri->host, strlen(uri->host)+1 );
- g_string_append_len(s, path, strlen(path)+1 );
-
- result = do_socket_request(jar, s->str, s->len);
- /* try it again; older cookie daemons closed the connection after each request */
- if(result == NULL)
- result = do_socket_request(jar, s->str, s->len);
- } else {
- g_string_append_printf(s, " '%s' '%s' '%s'", uri->scheme, uri->host, uri->path);
-
- run_handler(jar->handler, s->str);
- result = g_strdup(uzbl.comm.sync_stdout);
- }
- g_string_free(s, TRUE);
- return result;
-}
-
-/* this is a duplicate of SoupCookieJar's request_started that uses our get_cookies instead */
-static void
-request_started(SoupSessionFeature *feature, SoupSession *session,
- SoupMessage *msg, SoupSocket *socket) {
- (void) session; (void) socket;
- gchar *cookies;
-
- UzblCookieJar *jar = UZBL_COOKIE_JAR (feature);
- SoupURI *uri = soup_message_get_uri(msg);
- gboolean add_to_internal_jar = false;
-
- if(jar->handler) {
- cookies = get_cookies(jar, uri);
- } else {
- /* no handler is set, fall back to the internal soup cookie jar */
- cookies = soup_cookie_jar_get_cookies(SOUP_COOKIE_JAR(jar), soup_message_get_uri (msg), TRUE);
- }
-
- if (cookies && cookies[0] != 0) {
- const gchar *next_cookie_start = cookies;
-
- if (add_to_internal_jar) {
- /* add the cookie data that we just obtained from the cookie handler
- to the cookie jar so that javascript has access to them.
- we set this flag so that we don't trigger the PUT handler. */
- jar->in_get_callback = true;
- do {
- SoupCookie *soup_cookie = soup_cookie_parse(next_cookie_start, uri);
- if(soup_cookie)
- soup_cookie_jar_add_cookie(SOUP_COOKIE_JAR(uzbl.net.soup_cookie_jar), soup_cookie);
- next_cookie_start = strchr(next_cookie_start, ';');
- } while(next_cookie_start++ != NULL);
- jar->in_get_callback = false;
- }
-
- soup_message_headers_replace (msg->request_headers, "Cookie", cookies);
- } else {
- soup_message_headers_remove (msg->request_headers, "Cookie");
- }
-
- if(cookies)
- g_free (cookies);
-}
-
static void
changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) {
- SoupCookie * cookie = new_cookie ? new_cookie : old_cookie;
+ SoupCookie *cookie = new_cookie ? new_cookie : old_cookie;
UzblCookieJar *uzbl_jar = UZBL_COOKIE_JAR(jar);
- /* when Uzbl begins an HTTP request, it GETs cookies from the handler
- and then adds them to the cookie jar so that javascript can access
- these cookies. this causes a 'changed' callback, which we don't want
- to do anything, so we just return.
-
- (if SoupCookieJar let us override soup_cookie_jar_get_cookies we
- wouldn't have to do this.) */
- 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 */
+ /* send a ADD or DELETE -_COOKIE event depending on what has changed. these
+ * events aren't sent when a cookie changes due to an add/delete_cookie
+ * command because otherwise a loop would occur when a cookie change is
+ * propagated to other uzbl instances using add/delete_cookie. */
if(!uzbl_jar->in_manual_add) {
+ gchar *scheme = cookie->secure ? "https" : "http";
+
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)
+ if(new_cookie)
send_event(ADD_COOKIE, eventstr, NULL);
else
send_event(DELETE_COOKIE, eventstr, NULL);
@@ -176,151 +55,4 @@ changed(SoupCookieJar *jar, SoupCookie *old_cookie, SoupCookie *new_cookie) {
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)
- return;
-
- GString *s = g_string_new ("PUT");
-
- 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);
- g_string_append_len(s, new_cookie->domain, strlen(new_cookie->domain)+1 );
- g_string_append_len(s, new_cookie->path, strlen(new_cookie->path)+1 );
- g_string_append_printf(s, "%s=%s", new_cookie->name, new_cookie->value);
-
- gchar *result = do_socket_request(uzbl_jar, s->str, s->len+1);
- /* try it again; older cookie daemons closed the connection after each request */
- if(!result)
- result = do_socket_request(uzbl_jar, s->str, s->len+1);
-
- g_free(result);
- } else {
- g_string_append_printf(s, " '%s' '%s' '%s' '%s=%s'", scheme, new_cookie->domain, new_cookie->path, new_cookie->name, new_cookie->value);
-
- run_handler(uzbl_jar->handler, s->str);
- }
-
- g_string_free(s, TRUE);
-}
-
-static void
-setup_handler(UzblCookieJar *jar) {
- if(jar->handler && strncmp(jar->handler, "talk_to_socket", strlen("talk_to_socket")) == 0) {
- /* extract the socket path from the handler. */
- jar->socket_path = jar->handler + strlen("talk_to_socket");
- while(isspace(*jar->socket_path))
- jar->socket_path++;
- if(*jar->socket_path == 0)
- return; /* there was no path specified. */
- disconnect_cookie_socket(jar);
- connect_cookie_socket(jar);
- } else {
- jar->socket_path = NULL;
- }
-}
-
-static void
-connect_cookie_socket(UzblCookieJar *jar) {
- struct sockaddr_un sa;
- int fd;
-
- g_strlcpy(sa.sun_path, jar->socket_path, sizeof(sa.sun_path));
- sa.sun_family = AF_UNIX;
-
- /* create socket file descriptor and connect it to path */
- fd = socket(AF_UNIX, SOCK_SEQPACKET, 0);
- if(fd == -1) {
- g_printerr("connect_cookie_socket: creating socket failed (%s)\n", strerror(errno));
- return;
- }
-
- if(connect(fd, (struct sockaddr*)&sa, sizeof(sa))) {
- g_printerr("connect_cookie_socket: connect failed (%s)\n", strerror(errno));
- close(fd);
- return;
- }
-
- /* successful connection! */
- jar->connection_fd = fd;
-}
-
-static void
-disconnect_cookie_socket(UzblCookieJar *jar) {
- if(jar->connection_fd > 0) {
- close(jar->connection_fd);
- jar->connection_fd = -1;
- }
-}
-
-static gchar *do_socket_request(UzblCookieJar *jar, gchar *request, int request_length) {
- int len;
- ssize_t ret;
- struct pollfd pfd;
- gchar *result = NULL;
-
- if(jar->connection_fd < 0)
- connect_cookie_socket(jar); /* connection was lost, reconnect */
-
- /* write request */
- ret = write(jar->connection_fd, request, request_length);
- if(ret == -1) {
- g_printerr("talk_to_socket: write failed (%s)\n", strerror(errno));
- disconnect_cookie_socket(jar);
- return NULL;
- }
-
- /* wait for a response, with a 500ms timeout */
- pfd.fd = jar->connection_fd;
- pfd.events = POLLIN;
- while(1) {
- ret = poll(&pfd, 1, 500);
- if(ret == 1) break;
- if(ret == 0) errno = ETIMEDOUT;
- if(errno == EINTR) continue;
- g_printerr("talk_to_socket: poll failed while waiting for input (%s)\n",
- strerror(errno));
- if(errno != ETIMEDOUT)
- disconnect_cookie_socket(jar);
- return NULL;
- }
-
- /* get length of response */
- if(ioctl(jar->connection_fd, FIONREAD, &len) == -1) {
- g_printerr("talk_to_socket: cannot find daemon response length, "
- "ioctl failed (%s)\n", strerror(errno));
- disconnect_cookie_socket(jar);
- return NULL;
- }
-
- /* there was an empty response. */
- if(len == 0)
- return g_strdup("");
-
- /* there is a response, read it */
- result = g_malloc(len + 1);
- if(!result) {
- g_printerr("talk_to_socket: failed to allocate %d bytes\n", len);
- return NULL;
- }
- result[len] = 0; /* ensure result is null terminated */
-
- gchar *p = result;
- while(len > 0) {
- ret = read(jar->connection_fd, p, len);
- if(ret == -1) {
- g_printerr("talk_to_socket: failed to read from socket (%s)\n",
- strerror(errno));
- disconnect_cookie_socket(jar);
- g_free(result);
- return NULL;
- } else {
- len -= ret;
- p += ret;
- }
- }
-
- return result;
}
diff --git a/src/cookie-jar.h b/src/cookie-jar.h
index f3e3733..05f4a6f 100644
--- a/src/cookie-jar.h
+++ b/src/cookie-jar.h
@@ -10,12 +10,6 @@
typedef struct {
SoupCookieJar parent;
- const gchar *handler;
-
- const gchar *socket_path;
- int connection_fd;
-
- gboolean in_get_callback;
gboolean in_manual_add;
} UzblCookieJar;
@@ -25,10 +19,4 @@ typedef struct {
UzblCookieJar *uzbl_cookie_jar_new();
-void
-uzbl_cookie_jar_set_handler(UzblCookieJar *jar, const gchar *handler);
-
-char
-*get_cookies(UzblCookieJar *jar, SoupURI *uri);
-
#endif
diff --git a/src/uzbl-core.c b/src/uzbl-core.c
index fc21978..66842a9 100644
--- a/src/uzbl-core.c
+++ b/src/uzbl-core.c
@@ -90,7 +90,6 @@ const struct var_name_to_ptr_t {
{ "title_format_short", PTR_V_STR(uzbl.behave.title_format_short, 1, NULL)},
{ "icon", PTR_V_STR(uzbl.gui.icon, 1, set_icon)},
{ "forward_keys", PTR_V_INT(uzbl.behave.forward_keys, 1, NULL)},
- { "cookie_handler", PTR_V_STR(uzbl.behave.cookie_handler, 1, cmd_set_cookie_handler)},
{ "authentication_handler", PTR_V_STR(uzbl.behave.authentication_handler, 1, set_authentication_handler)},
{ "scheme_handler", PTR_V_STR(uzbl.behave.scheme_handler, 1, NULL)},
{ "download_handler", PTR_V_STR(uzbl.behave.download_handler, 1, NULL)},
@@ -584,10 +583,10 @@ struct {const char *key; CommandInfo value;} cmdlist[] =
{ "script", {run_external_js, 0} },
{ "toggle_status", {toggle_status_cb, 0} },
{ "spawn", {spawn_async, 0} },
- { "sync_spawn", {spawn_sync, 0} }, // needed for cookie handler
+ { "sync_spawn", {spawn_sync, 0} },
{ "sync_spawn_exec", {spawn_sync_exec, 0} }, // needed for load_cookies.sh :(
{ "sh", {spawn_sh_async, 0} },
- { "sync_sh", {spawn_sh_sync, 0} }, // needed for cookie handler
+ { "sync_sh", {spawn_sh_sync, 0} },
{ "exit", {close_uzbl, 0} },
{ "search", {search_forward_text, TRUE} },
{ "search_reverse", {search_reverse_text, TRUE} },
diff --git a/src/uzbl-core.h b/src/uzbl-core.h
index 98ae342..14f03a6 100644
--- a/src/uzbl-core.h
+++ b/src/uzbl-core.h
@@ -124,7 +124,6 @@ typedef struct {
gchar* status_background;
gchar* fifo_dir;
gchar* socket_dir;
- gchar* cookie_handler;
gchar* authentication_handler;
gchar* default_font_family;
gchar* monospace_font_family;