--- config.def.h | 2 ++ libsurf-webext.c | 63 ++++++++++++++++++++++++++++++++++++++++++++++++ surf.c | 18 +++++++++++++- 3 files changed, 82 insertions(+), 1 deletion(-) diff --git a/config.def.h b/config.def.h index 8cdc397..e93ba1f 100644 --- a/config.def.h +++ b/config.def.h _AT_@ -37,6 +37,7 @@ static Parameter defconfig[ParameterLast] = { [MediaManualPlay] = { { .i = 1 }, }, [Plugins] = { { .i = 1 }, }, [PreferredLanguages] = { { .v = (char *[]){ NULL } }, }, + [RefererPolicies] = { { .v = "E#_AT_e" },}, [RunInFullscreen] = { { .i = 0 }, }, [ScrollBars] = { { .i = 1 }, }, [ShowIndicators] = { { .i = 1 }, }, _AT_@ -168,6 +169,7 @@ static Key keys[] = { { MODKEY, GDK_KEY_t, showcert, { 0 } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_a, togglecookiepolicy, { 0 } }, + { MODKEY|GDK_SHIFT_MASK, GDK_KEY_e, togglerefererpolicy, { 0 } }, { 0, GDK_KEY_F11, togglefullscreen, { 0 } }, { MODKEY|GDK_SHIFT_MASK, GDK_KEY_o, toggleinspector, { 0 } }, diff --git a/libsurf-webext.c b/libsurf-webext.c index 684d4a5..1bc8da7 100644 --- a/libsurf-webext.c +++ b/libsurf-webext.c _AT_@ -20,6 +20,7 @@ typedef struct Page { static int pipein, pipeout; static Page *pages; +static int refererpolicy; Page * newpage(WebKitWebPage *page) _AT_@ -95,15 +96,76 @@ readpipe(GIOChannel *s, GIOCondition c, gpointer unused) webkit_dom_dom_window_scroll_by(view, 0, (wh / 100) * msg[2]); break; + case 'r': + refererpolicy = msg[2]; + break; } return TRUE; } +static int +originlen(const char *url) +{ + const char *p; + + p = strstr(url, "://"); + p = p ? p + 3 : url; + while (*p && *p != '/') + ++p; + return p - url; +} + +static int +sameorigin(const gchar *u1, const gchar *u2) +{ + int l1, l2; + + l1 = originlen(u1); + l2 = originlen(u2); + return l1 == l2 && memcmp(u1, u2, l1) == 0; +} + +static gboolean +webpagesendrequest(WebKitWebPage *wp, WebKitURIRequest *req, WebKitURIResponse *res, + gpointer unused) +{ + SoupMessageHeaders *h = webkit_uri_request_get_http_headers(req); + const char *referer; + char *origin; + + if (!h) + return FALSE; + switch (refererpolicy) { + case 'e': /* disallow */ + soup_message_headers_remove(h, "Referer"); + break; + case '_AT_': /* allow if same-origin */ + referer = soup_message_headers_get_one(h, "Referer"); + if (referer && !sameorigin(referer, webkit_uri_request_get_uri(req))) + soup_message_headers_remove(h, "Referer"); + break; + case '#': /* strip path if cross-origin */ + referer = soup_message_headers_get_one(h, "Referer"); + if (referer && !sameorigin(referer, webkit_uri_request_get_uri(req))) { + origin = g_strdup(referer); + origin[originlen(origin)] = '\0'; + soup_message_headers_replace(h, "Referer", origin); + g_free(origin); + } + break; + default: + case 'E': /* allow */ + break; + } + return FALSE; +} + static void webpagecreated(WebKitWebExtension *e, WebKitWebPage *wp, gpointer unused) { Page *p = newpage(wp); + g_signal_connect(wp, "send-request", G_CALLBACK(webpagesendrequest), NULL); } G_MODULE_EXPORT void _AT_@ -111,6 +173,7 @@ webkit_web_extension_initialize_with_user_data(WebKitWebExtension *e, GVariant * { GIOChannel *gchanpipe; + refererpolicy = 'E'; g_signal_connect(e, "page-created", G_CALLBACK(webpagecreated), NULL); g_variant_get(gv, "(ii)", &pipein, &pipeout); diff --git a/surf.c b/surf.c index d48fbc9..b753cf0 100644 --- a/surf.c +++ b/surf.c _AT_@ -71,6 +71,7 @@ typedef enum { MediaManualPlay, Plugins, PreferredLanguages, + RefererPolicies, RunInFullscreen, ScrollBars, ShowIndicators, _AT_@ -229,6 +230,7 @@ static void stop(Client *c, const Arg *a); static void toggle(Client *c, const Arg *a); static void togglefullscreen(Client *c, const Arg *a); static void togglecookiepolicy(Client *c, const Arg *a); +static void togglerefererpolicy(Client *c, const Arg *a); static void toggleinspector(Client *c, const Arg *a); static void find(Client *c, const Arg *a); _AT_@ -244,6 +246,7 @@ static Atom atoms[AtomLast]; static Window embed; static int showxid; static int cookiepolicy; +static int refererpolicy; static Display *dpy; static Client *clients; static GdkDevice *gdkkb; _AT_@ -656,7 +659,8 @@ gettogglestats(Client *c) togglestats[8] = curconfig[FrameFlattening].val.i ? 'F' : 'f'; togglestats[9] = curconfig[Certificate].val.i ? 'X' : 'x'; togglestats[10] = curconfig[StrictTLS].val.i ? 'T' : 't'; - togglestats[11] = '\0'; + togglestats[11] = ((char *)curconfig[RefererPolicies].val.v)[refererpolicy]; + togglestats[12] = '\0'; } void _AT_@ -1904,6 +1908,18 @@ togglecookiepolicy(Client *c, const Arg *a) setparameter(c, 0, CookiePolicies, NULL); } +void +togglerefererpolicy(Client *c, const Arg *unused) +{ + Arg a; + + ++refererpolicy; + refererpolicy %= strlen(curconfig[RefererPolicies].val.v); + a.i = ((char *)curconfig[RefererPolicies].val.v)[refererpolicy]; + msgext(c, 'r', &a); + updatetitle(c); +} + void toggleinspector(Client *c, const Arg *a) { -- 2.19.1Received on Mon Nov 19 2018 - 13:18:27 CET
This archive was generated by hypermail 2.3.0 : Mon Nov 19 2018 - 13:24:22 CET