Add a way to define the cookie policy.
authorChristoph Lohmann <20h@r-36.net>
Thu, 30 Jan 2014 19:36:06 +0000 (20:36 +0100)
committerChristoph Lohmann <20h@r-36.net>
Thu, 30 Jan 2014 19:36:06 +0000 (20:36 +0100)
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!

config.def.h
surf.1
surf.c

index b81e6b0..988f327 100644 (file)
@@ -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";
        "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 */
 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 */
 
 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;
 /* 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_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 } },
 };
 
     { MODKEY|GDK_SHIFT_MASK,GDK_g,      togglegeolocation, { 0 } },
 };
 
diff --git a/surf.1 b/surf.1
index 325e817..5b194ec 100644 (file)
--- a/surf.1
+++ b/surf.1
@@ -4,6 +4,7 @@ surf \- simple webkit-based browser
 .SH SYNOPSIS
 .B surf
 .RB [-bBfFgGiIkKnNpPsSvx]
 .SH SYNOPSIS
 .B surf
 .RB [-bBfFgGiIkKnNpPsSvx]
+.RB [-a\ cookiepolicies]
 .RB [-c\ cookiefile]
 .RB [-e\ xid]
 .RB [-r\ scriptfile]
 .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
 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
 .B \-b
 Disable Scrollbars
 .TP
@@ -158,7 +169,7 @@ Calls Printpage Dialog.
 Reloads the website.
 .TP
 .B Ctrl\-Shift\-r
 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.
 .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\-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
 .B Ctrl\-Shift\-b
-Toggle scrollbars
+Toggle scrollbars. This will reload the page.
 .TP
 .B Ctrl\-Shift\-c
 .TP
 .B Ctrl\-Shift\-c
-Toggle caret browsing.
+Toggle caret browsing. This will reload the page.
 .TP
 .B Ctrl\-Shift\-i
 .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 
 .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
 .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
 .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.
 .TP
 .B F11
 Toggle fullscreen mode.
diff --git a/surf.c b/surf.c
index 7b71f0e..906d145 100644 (file)
--- 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 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 char pagestat[3];
 static GTlsDatabase *tlsdb;
+static int policysel = 0;
 
 static void addaccelgroup(Client *c);
 static void beforerequest(WebKitWebView *w, WebKitWebFrame *f,
 
 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);
 
 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 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 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,
 
 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 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);
 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 *
 }
 
 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,
        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
 }
 
 static void
@@ -311,6 +319,36 @@ cookiejar_set_property(GObject *self, guint prop_id, const GValue *value,
        flock(COOKIEJAR(self)->lock, LOCK_UN);
 }
 
        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;
 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);
        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) *
        case +10000:
        case -10000:
                v += gtk_adjustment_get_page_increment(a) *
@@ -1068,13 +1106,13 @@ setup(void) {
 
        /* cookie jar */
        soup_session_add_feature(s,
 
        /* 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);
 
 
        /* 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);
        }
                g_warning("Error loading SSL database %s: %s", cafile, error->message);
                g_error_free(error);
        }
@@ -1155,6 +1193,37 @@ toggle(Client *c, const Arg *arg) {
        reload(c, &a);
 }
 
        reload(c, &a);
 }
 
+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;
 static void
 twitch(Client *c, const Arg *arg) {
        GtkAdjustment *a;
@@ -1173,15 +1242,6 @@ twitch(Client *c, const Arg *arg) {
        gtk_adjustment_set_value(a, v);
 }
 
        gtk_adjustment_set_value(a, v);
 }
 
-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;
 static void
 togglescrollbars(Client *c, const Arg *arg) {
        GtkPolicyType vspolicy;
@@ -1219,27 +1279,30 @@ static void
 gettogglestat(Client *c){
        gboolean value;
        char *uri;
 gettogglestat(Client *c){
        gboolean value;
        char *uri;
+       int p = 0;
        WebKitWebSettings *settings = webkit_web_view_get_settings(c->view);
 
        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);
        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);
 
        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);
 
        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);
 
        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);
 
        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
 }
 
 static void
@@ -1292,6 +1355,7 @@ updatewinid(Client *c) {
 static void
 usage(void) {
        die("usage: %s [-bBfFgGiIkKnNpPsSvx]"
 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));
                " [-c cookiefile] [-e xid] [-r scriptfile]"
                " [-t stylefile] [-u useragent] [-z zoomlevel]"
                " [uri]\n", basename(argv0));