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!
This commit is contained in:
Christoph Lohmann 2014-01-30 20:36:06 +01:00
parent e4869357f1
commit 780cca964c
3 changed files with 124 additions and 37 deletions

View 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";
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 } },
};

31
surf.1
View File

@ -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.

112
surf.c
View File

@ -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);
}
@ -1155,6 +1193,37 @@ toggle(Client *c, const Arg *arg) {
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;
@ -1173,15 +1242,6 @@ twitch(Client *c, const Arg *arg) {
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;
@ -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));