"Fossies" - the Fresh Open Source Software Archive

Member "xombrero-1.6.4/whitelist.c" (17 Feb 2015, 12622 Bytes) of package /linux/www/old/xombrero-1.6.4.tgz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "whitelist.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 1.6.3_vs_1.6.4.

    1 /*
    2  * Copyright (c) 2010, 2011 Marco Peereboom <marco@peereboom.us>
    3  * Copyright (c) 2011 Stevan Andjelkovic <stevan@student.chalmers.se>
    4  * Copyright (c) 2010, 2011 Edd Barrett <vext01@gmail.com>
    5  * Copyright (c) 2011 Todd T. Fries <todd@fries.net>
    6  * Copyright (c) 2011 Raphael Graf <r@undefined.ch>
    7  * Copyright (c) 2011 Michal Mazurek <akfaew@jasminek.net>
    8  * Copyright (c) 2012 Josh Rickmar <jrick@devio.us>
    9  *
   10  * Permission to use, copy, modify, and distribute this software for any
   11  * purpose with or without fee is hereby granted, provided that the above
   12  * copyright notice and this permission notice appear in all copies.
   13  *
   14  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
   15  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
   16  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
   17  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
   18  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   19  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
   20  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
   21  */
   22 
   23 #include <xombrero.h>
   24 
   25 gchar *
   26 find_domain(const gchar *s, int flags)
   27 {
   28     SoupURI         *uri;
   29     gchar           *ret, *p;
   30 
   31     if (s == NULL)
   32         return (NULL);
   33 
   34     uri = soup_uri_new(s);
   35 
   36     if (uri == NULL)
   37         return (NULL);
   38     if (!SOUP_URI_VALID_FOR_HTTP(uri)) {
   39         soup_uri_free(uri);
   40         return (NULL);
   41     }
   42 
   43     if (flags & XT_WL_TOPLEVEL &&
   44         !isdigit((unsigned char)uri->host[strlen(uri->host) - 1]))
   45         p = tld_get_suffix(uri->host);
   46     else
   47         p = uri->host;
   48 
   49     if (flags & XT_WL_TOPLEVEL)
   50         ret = g_strdup_printf(".%s", p);
   51     else    /* assume FQDN */
   52         ret = g_strdup(p);
   53 
   54     soup_uri_free(uri);
   55 
   56     return (ret);
   57 }
   58 
   59 struct wl_entry *
   60 wl_find(const gchar *s, struct wl_list *wl)
   61 {
   62     struct wl_entry     *w;
   63 
   64     if (s == NULL || strlen(s) == 0 || wl == NULL)
   65         return (NULL);
   66 
   67     TAILQ_FOREACH(w, wl, entry) {
   68         if (w->re == NULL)
   69             continue;
   70         if (!regexec(w->re, s, 0, 0, 0))
   71             return (w);
   72     }
   73 
   74     return (NULL);
   75 }
   76 
   77 int
   78 wl_save(struct tab *t, struct karg *args, int list)
   79 {
   80     char            file[PATH_MAX], *lst_str = NULL;
   81     FILE            *f = NULL;
   82     char            *line = NULL, *lt = NULL, *dom;
   83     size_t          linelen;
   84     const gchar     *uri;
   85     struct karg     a;
   86     struct wl_entry     *w;
   87     GSList          *cf;
   88     SoupCookie      *ci, *c;
   89 
   90     if (t == NULL || args == NULL)
   91         return (1);
   92 
   93     if (runtime_settings[0] == '\0')
   94         return (1);
   95 
   96     switch (list) {
   97     case XT_WL_JAVASCRIPT:
   98         lst_str = "JavaScript";
   99         break;
  100     case XT_WL_COOKIE:
  101         lst_str = "Cookie";
  102         break;
  103     case XT_WL_PLUGIN:
  104         lst_str = "Plugin";
  105         break;
  106     case XT_WL_HTTPS:
  107         lst_str = "HTTPS";
  108         break;
  109     default:
  110         show_oops(t, "Invalid list id: %d", list);
  111         return (1);
  112     }
  113 
  114     uri = get_uri(t);
  115     dom = find_domain(uri, args->i);
  116     if (uri == NULL || dom == NULL ||
  117         webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
  118         show_oops(t, "Can't add domain to %s white list", lst_str);
  119         goto done;
  120     }
  121 
  122     switch (list) {
  123     case XT_WL_JAVASCRIPT:
  124         lt = g_strdup_printf("js_wl=%s", dom);
  125         break;
  126     case XT_WL_COOKIE:
  127         lt = g_strdup_printf("cookie_wl=%s", dom);
  128         break;
  129     case XT_WL_PLUGIN:
  130         lt = g_strdup_printf("pl_wl=%s", dom);
  131         break;
  132     case XT_WL_HTTPS:
  133         lt = g_strdup_printf("force_https=%s", dom);
  134         break;
  135     default:
  136         /* can't happen */
  137         show_oops(t, "Invalid list id: %d", list);
  138         goto done;
  139     }
  140 
  141     snprintf(file, sizeof file, "%s" PS "%s", work_dir, runtime_settings);
  142     if ((f = fopen(file, "r+")) == NULL) {
  143         show_oops(t, "can't open file %s");
  144         goto done;
  145     }
  146 
  147     while (!feof(f)) {
  148         line = fparseln(f, &linelen, NULL, NULL, 0);
  149         if (line == NULL)
  150             continue;
  151         if (!strcmp(line, lt))
  152             goto done;
  153         free(line);
  154         line = NULL;
  155     }
  156 
  157     fprintf(f, "%s\n", lt);
  158 
  159     a.i = XT_WL_ENABLE;
  160     a.i |= args->i;
  161     switch (list) {
  162     case XT_WL_JAVASCRIPT:
  163         w = wl_find(dom, &js_wl);
  164         if (w == NULL) {
  165             settings_add("js_wl", dom);
  166             w = wl_find(dom, &js_wl);
  167         }
  168         toggle_js(t, &a);
  169         break;
  170 
  171     case XT_WL_COOKIE:
  172         w = wl_find(dom, &c_wl);
  173         if (w == NULL) {
  174             settings_add("cookie_wl", dom);
  175             w = wl_find(dom, &c_wl);
  176         }
  177         toggle_cwl(t, &a);
  178 
  179         /* find and add to persistent jar */
  180         cf = soup_cookie_jar_all_cookies(s_cookiejar);
  181         for (;cf; cf = cf->next) {
  182             ci = cf->data;
  183             if (!strcmp(dom, ci->domain) ||
  184                 !strcmp(&dom[1], ci->domain)) /* deal with leading . */ {
  185                 c = soup_cookie_copy(ci);
  186                 _soup_cookie_jar_add_cookie(p_cookiejar, c);
  187             }
  188         }
  189         soup_cookies_free(cf);
  190         break;
  191 
  192     case XT_WL_PLUGIN:
  193         w = wl_find(dom, &pl_wl);
  194         if (w == NULL) {
  195             settings_add("pl_wl", dom);
  196             w = wl_find(dom, &pl_wl);
  197         }
  198         toggle_pl(t, &a);
  199         break;
  200     case XT_WL_HTTPS:
  201         w = wl_find(dom, &force_https);
  202         if (w == NULL) {
  203             settings_add("force_https", dom);
  204             w = wl_find(dom, &force_https);
  205         }
  206         toggle_force_https(t, &a);
  207         break;
  208     default:
  209         abort(); /* can't happen */
  210     }
  211     if (w != NULL)
  212         w->handy = 1;
  213 
  214 done:
  215     if (line)
  216         free(line);
  217     if (dom)
  218         g_free(dom);
  219     if (lt)
  220         g_free(lt);
  221     if (f)
  222         fclose(f);
  223 
  224     return (0);
  225 }
  226 
  227 int
  228 wl_show(struct tab *t, struct karg *args, char *title, struct wl_list *wl)
  229 {
  230     struct wl_entry     *w;
  231     char            *tmp, *body;
  232 
  233     body = g_strdup("");
  234 
  235     /* p list */
  236     if (args->i & XT_WL_PERSISTENT) {
  237         tmp = body;
  238         body = g_strdup_printf("%s<h2>Persistent</h2>", body);
  239         g_free(tmp);
  240         TAILQ_FOREACH(w, wl, entry) {
  241             if (w->handy == 0)
  242                 continue;
  243             tmp = body;
  244             body = g_strdup_printf("%s%s<br/>", body, w->pat);
  245             g_free(tmp);
  246         }
  247     }
  248 
  249     /* s list */
  250     if (args->i & XT_WL_SESSION) {
  251         tmp = body;
  252         body = g_strdup_printf("%s<h2>Session</h2>", body);
  253         g_free(tmp);
  254         TAILQ_FOREACH(w, wl, entry) {
  255             if (w->handy == 1)
  256                 continue;
  257             tmp = body;
  258             body = g_strdup_printf("%s%s<br/>", body, w->pat);
  259             g_free(tmp);
  260         }
  261     }
  262 
  263     tmp = get_html_page(title, body, "", 0);
  264     g_free(body);
  265     if (wl == &js_wl)
  266         load_webkit_string(t, tmp, XT_URI_ABOUT_JSWL, 0);
  267     else if (wl == &c_wl)
  268         load_webkit_string(t, tmp, XT_URI_ABOUT_COOKIEWL, 0);
  269     else if (wl == &pl_wl)
  270         load_webkit_string(t, tmp, XT_URI_ABOUT_PLUGINWL, 0);
  271     else if (wl == &force_https)
  272         load_webkit_string(t, tmp, XT_URI_ABOUT_HTTPS, 0);
  273     g_free(tmp);
  274     return (0);
  275 }
  276 
  277 void
  278 wl_add(const char *str, struct wl_list *wl, int flags)
  279 {
  280     struct wl_entry     *w;
  281     int         add_dot = 0, chopped = 0;
  282     const char      *s = str;
  283     char            *escstr, *p, *pat;
  284     char            **sv;
  285 
  286     if (str == NULL || wl == NULL || strlen(str) < 2)
  287         return;
  288 
  289     DNPRINTF(XT_D_COOKIE, "wl_add in: %s\n", str);
  290 
  291     /* slice off port number */
  292     p = g_strrstr(str, ":");
  293     if (p)
  294         *p = '\0';
  295 
  296     w = g_malloc(sizeof *w);
  297     w->re = g_malloc(sizeof *w->re);
  298     if (flags & XT_WL_REGEX) {
  299         w->pat = g_strdup_printf("re:%s", str);
  300         regcomp(w->re, str, REG_EXTENDED | REG_NOSUB);
  301         DNPRINTF(XT_D_COOKIE, "wl_add: %s\n", str);
  302     } else {
  303         /* treat *.moo.com the same as .moo.com */
  304         if (s[0] == '*' && s[1] == '.')
  305             s = &s[1];
  306         else if (s[0] != '.' && (flags & XT_WL_TOPLEVEL))
  307             add_dot = 1;
  308 
  309         if (s[0] == '.') {
  310             s = &s[1];
  311             chopped = 1;
  312         }
  313         sv = g_strsplit(s, ".", 0);
  314         escstr = g_strjoinv("\\.", sv);
  315         g_strfreev(sv);
  316 
  317         if (add_dot) {
  318             w->pat = g_strdup_printf(".%s", str);
  319             pat = g_strdup_printf("^(.*\\.)*%s$", escstr);
  320             regcomp(w->re, pat, REG_EXTENDED | REG_NOSUB);
  321         } else {
  322             w->pat = g_strdup(str);
  323             if (chopped)
  324                 pat = g_strdup_printf("^(.*\\.)*%s$", escstr);
  325             else
  326                 pat = g_strdup_printf("^%s$", escstr);
  327             regcomp(w->re, pat, REG_EXTENDED | REG_NOSUB);
  328         }
  329         DNPRINTF(XT_D_COOKIE, "wl_add: %s\n", pat);
  330         g_free(escstr);
  331         g_free(pat);
  332     }
  333 
  334     w->handy = (flags & XT_WL_PERSISTENT) ? 1 : 0;
  335 
  336     TAILQ_INSERT_HEAD(wl, w, entry);
  337 
  338     return;
  339 }
  340 
  341 int
  342 add_cookie_wl(struct settings *s, char *entry)
  343 {
  344     if (g_str_has_prefix(entry, "re:")) {
  345         entry = &entry[3];
  346         wl_add(entry, &c_wl, XT_WL_PERSISTENT | XT_WL_REGEX);
  347     } else
  348         wl_add(entry, &c_wl, XT_WL_PERSISTENT);
  349     return (0);
  350 }
  351 
  352 int
  353 add_js_wl(struct settings *s, char *entry)
  354 {
  355     if (g_str_has_prefix(entry, "re:")) {
  356         entry = &entry[3];
  357         wl_add(entry, &js_wl, XT_WL_PERSISTENT | XT_WL_REGEX);
  358     } else
  359         wl_add(entry, &js_wl, XT_WL_PERSISTENT);
  360     return (0);
  361 }
  362 
  363 int
  364 add_pl_wl(struct settings *s, char *entry)
  365 {
  366     if (g_str_has_prefix(entry, "re:")) {
  367         entry = &entry[3];
  368         wl_add(entry, &pl_wl, XT_WL_PERSISTENT | XT_WL_REGEX);
  369     } else
  370         wl_add(entry, &pl_wl, XT_WL_PERSISTENT);
  371     return (0);
  372 }
  373 
  374 int
  375 toggle_cwl(struct tab *t, struct karg *args)
  376 {
  377     struct wl_entry     *w;
  378     const gchar     *uri;
  379     char            *dom = NULL;
  380     int         es;
  381 
  382     if (args == NULL)
  383         return (1);
  384 
  385     uri = get_uri(t);
  386     dom = find_domain(uri, args->i);
  387 
  388     if (uri == NULL || dom == NULL ||
  389         webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
  390         show_oops(t, "Can't toggle domain in cookie white list");
  391         goto done;
  392     }
  393     w = wl_find(dom, &c_wl);
  394 
  395     if (w == NULL)
  396         es = 0;
  397     else
  398         es = 1;
  399 
  400     if (args->i & XT_WL_TOGGLE)
  401         es = !es;
  402     else if ((args->i & XT_WL_ENABLE) && es != 1)
  403         es = 1;
  404     else if ((args->i & XT_WL_DISABLE) && es != 0)
  405         es = 0;
  406 
  407     if (es) {
  408         /* enable cookies for domain */
  409         args->i |= !XT_WL_PERSISTENT;
  410         wl_add(dom, &c_wl, args->i);
  411     } else {
  412         /* disable cookies for domain */
  413         if (w != NULL) {
  414             TAILQ_REMOVE(&c_wl, w, entry);
  415             g_free(w->re);
  416             g_free(w->pat);
  417         }
  418     }
  419 
  420     if (args->i & XT_WL_RELOAD)
  421         webkit_web_view_reload(t->wv);
  422 
  423 done:
  424     g_free(dom);
  425     return (0);
  426 }
  427 
  428 int
  429 toggle_js(struct tab *t, struct karg *args)
  430 {
  431     int         es;
  432     const gchar     *uri;
  433     struct wl_entry     *w;
  434     char            *dom = NULL;
  435 
  436     if (args == NULL)
  437         return (1);
  438 
  439     g_object_get(G_OBJECT(t->settings),
  440         "enable-scripts", &es, (char *)NULL);
  441     if (args->i & XT_WL_TOGGLE)
  442         es = !es;
  443     else if ((args->i & XT_WL_ENABLE) && es != 1)
  444         es = 1;
  445     else if ((args->i & XT_WL_DISABLE) && es != 0)
  446         es = 0;
  447     else
  448         return (1);
  449 
  450     uri = get_uri(t);
  451     dom = find_domain(uri, args->i);
  452 
  453     if (uri == NULL || dom == NULL ||
  454         webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
  455         show_oops(t, "Can't toggle domain in JavaScript white list");
  456         goto done;
  457     }
  458 
  459     if (es) {
  460         button_set_icon_name(t->js_toggle, "media-playback-start");
  461         args->i |= !XT_WL_PERSISTENT;
  462         wl_add(dom, &js_wl, args->i);
  463     } else {
  464         w = wl_find(dom, &js_wl);
  465         if (w != NULL) {
  466             TAILQ_REMOVE(&js_wl, w, entry);
  467             g_free(w->re);
  468             g_free(w->pat);
  469         }
  470         button_set_icon_name(t->js_toggle, "media-playback-pause");
  471     }
  472     g_object_set(G_OBJECT(t->settings),
  473         "enable-scripts", es, (char *)NULL);
  474     g_object_set(G_OBJECT(t->settings),
  475         "javascript-can-open-windows-automatically", js_auto_open_windows ? es : 0, (char *)NULL);
  476     webkit_web_view_set_settings(t->wv, t->settings);
  477 
  478     if (args->i & XT_WL_RELOAD)
  479         webkit_web_view_reload(t->wv);
  480 done:
  481     if (dom)
  482         g_free(dom);
  483     return (0);
  484 }
  485 
  486 int
  487 toggle_pl(struct tab *t, struct karg *args)
  488 {
  489     int         es;
  490     const gchar     *uri;
  491     struct wl_entry     *w;
  492     char            *dom = NULL;
  493 
  494     if (args == NULL)
  495         return (1);
  496 
  497     g_object_get(G_OBJECT(t->settings),
  498         "enable-plugins", &es, (char *)NULL);
  499     if (args->i & XT_WL_TOGGLE)
  500         es = !es;
  501     else if ((args->i & XT_WL_ENABLE) && es != 1)
  502         es = 1;
  503     else if ((args->i & XT_WL_DISABLE) && es != 0)
  504         es = 0;
  505     else
  506         return (1);
  507 
  508     uri = get_uri(t);
  509     dom = find_domain(uri, args->i);
  510 
  511     if (uri == NULL || dom == NULL ||
  512         webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
  513         show_oops(t, "Can't toggle domain in plugins white list");
  514         goto done;
  515     }
  516 
  517     if (es) {
  518         args->i |= !XT_WL_PERSISTENT;
  519         wl_add(dom, &pl_wl, args->i);
  520     } else {
  521         w = wl_find(dom, &pl_wl);
  522         if (w != NULL) {
  523             TAILQ_REMOVE(&pl_wl, w, entry);
  524             g_free(w->re);
  525             g_free(w->pat);
  526         }
  527     }
  528     g_object_set(G_OBJECT(t->settings),
  529         "enable-plugins", es, (char *)NULL);
  530     webkit_web_view_set_settings(t->wv, t->settings);
  531 
  532     if (args->i & XT_WL_RELOAD)
  533         webkit_web_view_reload(t->wv);
  534 done:
  535     if (dom)
  536         g_free(dom);
  537     return (0);
  538 }
  539 
  540 int
  541 toggle_force_https(struct tab *t, struct karg *args)
  542 {
  543     int         es;
  544     const gchar     *uri;
  545     struct wl_entry     *w;
  546     char            *dom = NULL;
  547 
  548     if (args == NULL)
  549         return (1);
  550 
  551     uri = get_uri(t);
  552     dom = find_domain(uri, args->i);
  553 
  554     if (uri == NULL || dom == NULL ||
  555         webkit_web_view_get_load_status(t->wv) == WEBKIT_LOAD_FAILED) {
  556         show_oops(t, "Can't toggle domain in https force list");
  557         goto done;
  558     }
  559     w = wl_find(dom, &force_https);
  560 
  561     if (w == NULL)
  562         es = 0;
  563     else
  564         es = 1;
  565 
  566     if (args->i & XT_WL_TOGGLE)
  567         es = !es;
  568     else if ((args->i & XT_WL_ENABLE) && es != 1)
  569         es = 1;
  570     else if ((args->i & XT_WL_DISABLE) && es != 0)
  571         es = 0;
  572 
  573     if (es) {
  574         args->i |= !XT_WL_PERSISTENT;
  575         wl_add(dom, &force_https, args->i);
  576     } else if (w != NULL) {
  577         TAILQ_REMOVE(&force_https, w, entry);
  578         g_free(w->re);
  579         g_free(w->pat);
  580     }
  581 
  582     if (args->i & XT_WL_RELOAD)
  583         webkit_web_view_reload(t->wv);
  584 done:
  585     if (dom)
  586         g_free(dom);
  587     return (0);
  588 }