X-Git-Url: https://git.danieliu.xyz/?a=blobdiff_plain;f=surf.c;h=2e9c38d2660f3168ae95875c27bcd71b7300b077;hb=637902b452c723e8d5fdb714e8a38861e9c9f64e;hp=093bdf42c4213008610bed7cee4c077064b81516;hpb=a78aec66302f36341ab44ef2fbb7d7555eeb755c;p=surf.git diff --git a/surf.c b/surf.c index 093bdf4..2e9c38d 100644 --- a/surf.c +++ b/surf.c @@ -78,8 +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, @@ -91,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, @@ -161,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); @@ -295,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 @@ -310,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; @@ -617,7 +656,7 @@ loadstatuschange(WebKitWebView *view, GParamSpec *pspec, Client *c) { static void loaduri(Client *c, const Arg *arg) { - char *u, *rp; + char *u = NULL, *rp; const char *uri = (char *)arg->v; Arg a = { .b = FALSE }; struct stat st; @@ -644,9 +683,9 @@ loaduri(Client *c, const Arg *arg) { webkit_web_view_load_uri(c->view, u); c->progress = 0; c->title = copystr(&c->title, u); - g_free(u); updatetitle(c); } + g_free(u); } static void @@ -668,6 +707,9 @@ newclient(void) { if(!(c = calloc(1, sizeof(Client)))) die("Cannot malloc!\n"); + c->title = NULL; + c->progress = 100; + /* Window */ if(embed) { c->win = gtk_plug_new(embed); @@ -851,7 +893,6 @@ newclient(void) { if(hidebackground) webkit_web_view_set_transparent(c->view, TRUE); - c->title = NULL; c->next = clients; clients = c; @@ -871,11 +912,13 @@ newclient(void) { static void newwindow(Client *c, const Arg *arg, gboolean noembed) { guint i = 0; - const char *cmd[14], *uri; + const char *cmd[16], *uri; const Arg a = { .v = (void *)cmd }; char tmp[64]; cmd[i++] = argv0; + cmd[i++] = "-a"; + cmd[i++] = cookiepolicies; if(!enablescrollbars) cmd[i++] = "-b"; if(embed && !noembed) { @@ -1012,7 +1055,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) * @@ -1044,6 +1087,7 @@ setup(void) { char *new_proxy; SoupURI *puri; SoupSession *s; + GError *error = NULL; /* clean up any zombies immediately */ sigchld(0); @@ -1066,11 +1110,17 @@ 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 */ - g_object_set(G_OBJECT(s), "ssl-ca-file", cafile, NULL); + tlsdb = g_tls_file_database_new(cafile, &error); + + if(error) { + g_warning("Error loading SSL database %s: %s", cafile, error->message); + g_error_free(error); + } + g_object_set(G_OBJECT(s), "tls-database", tlsdb, NULL); g_object_set(G_OBJECT(s), "ssl-strict", strictssl, NULL); /* proxy */ @@ -1147,6 +1197,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; @@ -1165,15 +1246,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; @@ -1211,27 +1283,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 @@ -1262,16 +1337,18 @@ updatetitle(Client *c) { pagestat, c->linkhover); } else if(c->progress != 100) { t = g_strdup_printf("[%i%%] %s:%s | %s", c->progress, - togglestat, pagestat, c->title); + togglestat, pagestat, + (c->title == NULL)? "" : c->title); } else { t = g_strdup_printf("%s:%s | %s", togglestat, pagestat, - c->title); + (c->title == NULL)? "" : c->title); } gtk_window_set_title(GTK_WINDOW(c->win), t); g_free(t); } else { - gtk_window_set_title(GTK_WINDOW(c->win), c->title); + gtk_window_set_title(GTK_WINDOW(c->win), + (c->title == NULL)? "" : c->title); } } @@ -1284,6 +1361,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)); @@ -1314,11 +1392,15 @@ zoom(Client *c, const Arg *arg) { int main(int argc, char *argv[]) { Arg arg; + Client *c; memset(&arg, 0, sizeof(arg)); /* command line args */ ARGBEGIN { + case 'a': + cookiepolicies = EARGF(usage()); + break; case 'b': enablescrollbars = 0; break; @@ -1383,7 +1465,7 @@ main(int argc, char *argv[]) { useragent = EARGF(usage()); break; case 'v': - die("surf-"VERSION", ©2009-2012 surf engineers, " + die("surf-"VERSION", ©2009-2014 surf engineers, " "see LICENSE for details\n"); case 'x': showxid = TRUE; @@ -1398,9 +1480,12 @@ main(int argc, char *argv[]) { arg.v = argv[0]; setup(); - newclient(); - if(arg.v) + c = newclient(); + if(arg.v) { loaduri(clients, &arg); + } else { + updatetitle(c); + } gtk_main(); cleanup();