surf

Surf web browser.
git clone git://r-36.net/surf
Log | Files | Refs | README | LICENSE

commit 780cca964ca0cf622746ad6e8cae8beb8047d1df
parent e4869357f1c625a2b56ca1327ed8c89864341d77
Author: Christoph Lohmann <20h@r-36.net>
Date:   Thu, 30 Jan 2014 20:36:06 +0100

Add a way to define the cookie policy.

This adds the -a flag to define a string of the toggle string for the cookie
policy modes. There is now a new »cookiepolicies« string in config.h and the
Mod+Shift+a now can toggle the policy but will not cause a reload, because
this would only add a burden when toggling through accept and not accept.

Thanks Quentin Rameau <quinq.ml@gmail.com> for the suggestions!

Diffstat:
config.def.h | 18++++++++++++------
surf.1 | 31++++++++++++++++++++++++-------
surf.c | 112++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-----------------
3 files changed, 124 insertions(+), 37 deletions(-)

diff --git a/config.def.h b/config.def.h @@ -4,10 +4,7 @@ static char *useragent = "Mozilla/5.0 (X11; U; Unix; en-US) " "Safari/537.15 Surf/"VERSION; static char *stylefile = "~/.surf/style.css"; static char *scriptfile = "~/.surf/script.js"; -static char *cookiefile = "~/.surf/cookies.txt"; -static time_t sessiontime = 3600; -static char *cafile = "/etc/ssl/certs/ca-certificates.crt"; -static char *strictssl = FALSE; /* Refuse untrusted SSL connections */ + static Bool kioskmode = FALSE; /* Ignore shortcuts */ static Bool showindicators = TRUE; /* Show indicators in window title */ static Bool zoomto96dpi = TRUE; /* Zoom pages to always emulate 96dpi */ @@ -16,6 +13,14 @@ static Bool runinfullscreen = FALSE; /* Run in fullscreen mode by default */ static guint defaultfontsize = 12; /* Default font size */ static gfloat zoomlevel = 1.0; /* Default zoom level */ +/* Soup default features */ +static char *cookiefile = "~/.surf/cookies.txt"; +static char *cookiepolicies = "Aa@"; /* A: accept all; a: accept nothing, + @: accept third party */ +static char *cafile = "/etc/ssl/certs/ca-certificates.crt"; +static char *strictssl = FALSE; /* Refuse untrusted SSL connections */ +static time_t sessiontime = 3600; + /* Webkit default features */ static Bool enablescrollbars = TRUE; static Bool enablespatialbrowsing = TRUE; @@ -92,8 +97,9 @@ static Key keys[] = { { MODKEY|GDK_SHIFT_MASK,GDK_i, toggle, { .v = "auto-load-images" } }, { MODKEY|GDK_SHIFT_MASK,GDK_s, toggle, { .v = "enable-scripts" } }, { MODKEY|GDK_SHIFT_MASK,GDK_v, toggle, { .v = "enable-plugins" } }, - { MODKEY|GDK_SHIFT_MASK,GDK_m, togglestyle,{ 0 } }, - { MODKEY|GDK_SHIFT_MASK,GDK_b, togglescrollbars,{ 0 } }, + { MODKEY|GDK_SHIFT_MASK,GDK_a, togglecookiepolicy, { 0 } }, + { MODKEY|GDK_SHIFT_MASK,GDK_m, togglestyle, { 0 } }, + { MODKEY|GDK_SHIFT_MASK,GDK_b, togglescrollbars, { 0 } }, { MODKEY|GDK_SHIFT_MASK,GDK_g, togglegeolocation, { 0 } }, }; diff --git a/surf.1 b/surf.1 @@ -4,6 +4,7 @@ surf \- simple webkit-based browser .SH SYNOPSIS .B surf .RB [-bBfFgGiIkKnNpPsSvx] +.RB [-a\ cookiepolicies] .RB [-c\ cookiefile] .RB [-e\ xid] .RB [-r\ scriptfile] @@ -18,6 +19,16 @@ which makes it possible to embed it in another application. Furthermore, one can point surf to another URI by setting its XProperties. .SH OPTIONS .TP +.B \-a cookiepolicies +Define the order of +.I cookie policies. +The default is "Aa@" but could be +redefined in the +.I config.h, +with "A" meaning to +accept all cookies, "a" to deny all cookies and "@", which tells surf to +accept all third party cookies. +.TP .B \-b Disable Scrollbars .TP @@ -158,7 +169,7 @@ Calls Printpage Dialog. Reloads the website. .TP .B Ctrl\-Shift\-r -Reloads the website without using cache. +Reloads the website without using the cache. .TP .B Ctrl\-y Copies current URI to primary selection. @@ -166,28 +177,34 @@ Copies current URI to primary selection. .B Ctrl\-o Show the sourcecode of the current page. .TP +.B Ctrl\-Shift\-a +Toggle through the the +.I cookie policies. +This will not reload the page. +.TP .B Ctrl\-Shift\-b -Toggle scrollbars +Toggle scrollbars. This will reload the page. .TP .B Ctrl\-Shift\-c -Toggle caret browsing. +Toggle caret browsing. This will reload the page. .TP .B Ctrl\-Shift\-i -Toggle auto-loading of images. +Toggle auto-loading of images. This will reload the page. .TP .B Ctrl\-Shift\-m Toggle if the .I stylefile -file should be loaded. +file should be loaded. This will reload the page. .TP .B Ctrl\-Shift\-o Open the Web Inspector (Developer Tools) window for the current page. .TP .B Ctrl\-Shift\-s -Toggle script execution. +Toggle script execution. This will reload the page. .TP .B Ctrl\-Shift\-v -Toggle the enabling of plugins on that surf instance. +Toggle the enabling of plugins on that surf instance. This will reload the +page. .TP .B F11 Toggle fullscreen mode. diff --git a/surf.c b/surf.c @@ -78,9 +78,10 @@ static GdkNativeWindow embed = 0; static gboolean showxid = FALSE; static char winid[64]; static gboolean usingproxy = 0; -static char togglestat[7]; +static char togglestat[8]; static char pagestat[3]; static GTlsDatabase *tlsdb; +static int policysel = 0; static void addaccelgroup(Client *c); static void beforerequest(WebKitWebView *w, WebKitWebFrame *f, @@ -92,12 +93,16 @@ static gboolean buttonrelease(WebKitWebView *web, GdkEventButton *e, static void cleanup(void); static void clipboard(Client *c, const Arg *arg); +/* Cookiejar implementation */ static void cookiejar_changed(SoupCookieJar *self, SoupCookie *old_cookie, SoupCookie *new_cookie); static void cookiejar_finalize(GObject *self); -static SoupCookieJar *cookiejar_new(const char *filename, gboolean read_only); +static SoupCookieJarAcceptPolicy cookiepolicy_get(void); +static SoupCookieJar *cookiejar_new(const char *filename, gboolean read_only, + SoupCookieJarAcceptPolicy policy); static void cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, GParamSpec *pspec); +static char cookiepolicy_set(const SoupCookieJarAcceptPolicy p); static char *copystr(char **str, const char *src); static WebKitWebView *createwindow(WebKitWebView *v, WebKitWebFrame *f, @@ -162,6 +167,7 @@ static void stop(Client *c, const Arg *arg); static void titlechange(WebKitWebView *v, WebKitWebFrame *frame, const char *title, Client *c); static void toggle(Client *c, const Arg *arg); +static void togglecookiepolicy(Client *c, const Arg *arg); static void togglegeolocation(Client *c, const Arg *arg); static void togglescrollbars(Client *c, const Arg *arg); static void togglestyle(Client *c, const Arg *arg); @@ -296,10 +302,12 @@ cookiejar_init(CookieJar *self) { } static SoupCookieJar * -cookiejar_new(const char *filename, gboolean read_only) { +cookiejar_new(const char *filename, gboolean read_only, + SoupCookieJarAcceptPolicy policy) { return g_object_new(COOKIEJAR_TYPE, SOUP_COOKIE_JAR_TEXT_FILENAME, filename, - SOUP_COOKIE_JAR_READ_ONLY, read_only, NULL); + SOUP_COOKIE_JAR_READ_ONLY, read_only, + SOUP_COOKIE_JAR_ACCEPT_POLICY, policy, NULL); } static void @@ -311,6 +319,36 @@ cookiejar_set_property(GObject *self, guint prop_id, const GValue *value, flock(COOKIEJAR(self)->lock, LOCK_UN); } +static SoupCookieJarAcceptPolicy +cookiepolicy_get(void) { + switch(cookiepolicies[policysel]) { + case 'a': + return SOUP_COOKIE_JAR_ACCEPT_NEVER; + case '@': + return SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY; + case 'A': + default: + break; + } + + return SOUP_COOKIE_JAR_ACCEPT_ALWAYS; +} + +static char +cookiepolicy_set(const SoupCookieJarAcceptPolicy ep) { + switch(ep) { + case SOUP_COOKIE_JAR_ACCEPT_NEVER: + return 'a'; + case SOUP_COOKIE_JAR_ACCEPT_NO_THIRD_PARTY: + return '@'; + case SOUP_COOKIE_JAR_ACCEPT_ALWAYS: + default: + break; + } + + return 'A'; +} + static void evalscript(JSContextRef js, char *script, char* scriptname) { JSStringRef jsscript, jsscriptname; @@ -1013,7 +1051,7 @@ scroll(GtkAdjustment *a, const Arg *arg) { gdouble v; v = gtk_adjustment_get_value(a); - switch (arg->i){ + switch(arg->i) { case +10000: case -10000: v += gtk_adjustment_get_page_increment(a) * @@ -1068,13 +1106,13 @@ setup(void) { /* cookie jar */ soup_session_add_feature(s, - SOUP_SESSION_FEATURE(cookiejar_new(cookiefile, - FALSE))); + SOUP_SESSION_FEATURE(cookiejar_new(cookiefile, FALSE, + cookiepolicy_get()))); /* ssl */ tlsdb = g_tls_file_database_new(cafile, &error); - if (error) { + if(error) { g_warning("Error loading SSL database %s: %s", cafile, error->message); g_error_free(error); } @@ -1156,6 +1194,37 @@ toggle(Client *c, const Arg *arg) { } static void +togglecookiepolicy(Client *c, const Arg *arg) { + SoupCookieJar *jar; + SoupCookieJarAcceptPolicy policy; + + jar = SOUP_COOKIE_JAR( + soup_session_get_feature( + webkit_get_default_session(), + SOUP_TYPE_COOKIE_JAR)); + g_object_get(G_OBJECT(jar), "accept-policy", &policy, NULL); + + policysel++; + if(policysel >= strlen(cookiepolicies)) + policysel = 0; + + g_object_set(G_OBJECT(jar), "accept-policy", + cookiepolicy_get(), NULL); + + updatetitle(c); + /* Do not reload. */ +} + +static void +togglegeolocation(Client *c, const Arg *arg) { + Arg a = { .b = FALSE }; + + allowgeolocation ^= 1; + + reload(c, &a); +} + +static void twitch(Client *c, const Arg *arg) { GtkAdjustment *a; gdouble v; @@ -1174,15 +1243,6 @@ twitch(Client *c, const Arg *arg) { } static void -togglegeolocation(Client *c, const Arg *arg) { - Arg a = { .b = FALSE }; - - allowgeolocation ^= 1; - - reload(c, &a); -} - -static void togglescrollbars(Client *c, const Arg *arg) { GtkPolicyType vspolicy; Arg a; @@ -1219,27 +1279,30 @@ static void gettogglestat(Client *c){ gboolean value; char *uri; + int p = 0; WebKitWebSettings *settings = webkit_web_view_get_settings(c->view); + togglestat[p++] = cookiepolicy_set(cookiepolicy_get()); + g_object_get(G_OBJECT(settings), "enable-caret-browsing", &value, NULL); - togglestat[0] = value? 'C': 'c'; + togglestat[p++] = value? 'C': 'c'; - togglestat[1] = allowgeolocation? 'G': 'g'; + togglestat[p++] = allowgeolocation? 'G': 'g'; g_object_get(G_OBJECT(settings), "auto-load-images", &value, NULL); - togglestat[2] = value? 'I': 'i'; + togglestat[p++] = value? 'I': 'i'; g_object_get(G_OBJECT(settings), "enable-scripts", &value, NULL); - togglestat[3] = value? 'S': 's'; + togglestat[p++] = value? 'S': 's'; g_object_get(G_OBJECT(settings), "enable-plugins", &value, NULL); - togglestat[4] = value? 'V': 'v'; + togglestat[p++] = value? 'V': 'v'; g_object_get(G_OBJECT(settings), "user-stylesheet-uri", &uri, NULL); - togglestat[5] = uri[0] ? 'M': 'm'; + togglestat[p++] = uri[0] ? 'M': 'm'; - togglestat[6] = '\0'; + togglestat[p] = '\0'; } static void @@ -1292,6 +1355,7 @@ updatewinid(Client *c) { static void usage(void) { die("usage: %s [-bBfFgGiIkKnNpPsSvx]" + " [-a cookiepolicies ] " " [-c cookiefile] [-e xid] [-r scriptfile]" " [-t stylefile] [-u useragent] [-z zoomlevel]" " [uri]\n", basename(argv0));