diff options
author | Xan Lopez <xan@igalia.com> | 2012-10-03 03:31:10 +0800 |
---|---|---|
committer | Xan Lopez <xan@igalia.com> | 2012-10-03 05:21:05 +0800 |
commit | 530ef74c3ca2b8fcb3b54947cc111397b943b417 (patch) | |
tree | b99260f9c0773890791ea950af323396212beb95 /src | |
parent | 59934f569070b08e57444d0f650cb6e9bd6a036e (diff) | |
download | gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar.gz gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar.bz2 gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar.lz gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar.xz gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.tar.zst gsoc2013-epiphany-530ef74c3ca2b8fcb3b54947cc111397b943b417.zip |
Move adblock extension to embed/
No reason for it to be in src/ now.
https://bugzilla.gnome.org/show_bug.cgi?id=681657
Diffstat (limited to 'src')
-rw-r--r-- | src/Makefile.am | 4 | ||||
-rw-r--r-- | src/ephy-adblock-extension.c | 127 | ||||
-rw-r--r-- | src/ephy-adblock-extension.h | 55 | ||||
-rw-r--r-- | src/uri-tester.c | 895 | ||||
-rw-r--r-- | src/uri-tester.h | 72 |
5 files changed, 0 insertions, 1153 deletions
diff --git a/src/Makefile.am b/src/Makefile.am index 899fa8338..ada8e4716 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -18,7 +18,6 @@ header_DATA = \ NOINST_H_FILES = \ ephy-action-helper.h \ - ephy-adblock-extension.h \ ephy-combined-stop-reload-action.h \ ephy-encoding-dialog.h \ ephy-encoding-menu.h \ @@ -38,7 +37,6 @@ NOINST_H_FILES = \ pdm-dialog.h \ popup-commands.h \ prefs-dialog.h \ - uri-tester.h \ window-commands.h INST_H_FILES = \ @@ -54,7 +52,6 @@ INST_H_FILES = \ libephymain_la_SOURCES = \ ephy-action-helper.c \ - ephy-adblock-extension.c \ ephy-completion-model.c \ ephy-completion-model.h \ ephy-combined-stop-reload-action.c \ @@ -82,7 +79,6 @@ libephymain_la_SOURCES = \ popup-commands.c \ prefs-dialog.c \ window-commands.c \ - uri-tester.c \ $(INST_H_FILES) \ $(NOINST_H_FILES) \ $(NULL) diff --git a/src/ephy-adblock-extension.c b/src/ephy-adblock-extension.c deleted file mode 100644 index 9e7bf5e94..000000000 --- a/src/ephy-adblock-extension.c +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright © 2011 Igalia S.L. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * Some parts of this file based on the previous 'adblock' extension, - * licensed with the GNU General Public License 2 and later versions, - * Copyright (C) 2003 Marco Pesenti Gritti, Christian Persch. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" -#include "ephy-adblock-extension.h" - -#include "ephy-adblock.h" -#include "ephy-adblock-manager.h" -#include "ephy-debug.h" -#include "ephy-embed-shell.h" -#include "ephy-file-helpers.h" -#include "uri-tester.h" - -#include <glib/gi18n-lib.h> -#include <gtk/gtk.h> - -#define EPHY_ADBLOCK_EXTENSION_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), EPHY_TYPE_ADBLOCK_EXTENSION, EphyAdblockExtensionPrivate)) - -struct EphyAdblockExtensionPrivate -{ - UriTester *tester; -}; - -static void ephy_adblock_adblock_iface_init (EphyAdBlockIface *iface); - -G_DEFINE_TYPE_WITH_CODE (EphyAdblockExtension, - ephy_adblock_extension, - G_TYPE_OBJECT, - G_IMPLEMENT_INTERFACE (EPHY_TYPE_ADBLOCK, - ephy_adblock_adblock_iface_init)) - -/* Private functions. */ - -static void -ephy_adblock_extension_init (EphyAdblockExtension *extension) -{ - LOG ("EphyAdblockExtension initialising"); - - extension->priv = EPHY_ADBLOCK_EXTENSION_GET_PRIVATE (extension); - extension->priv->tester = uri_tester_new (); -} - -static void -ephy_adblock_extension_dispose (GObject *object) -{ - EphyAdblockExtension *extension = NULL; - - LOG ("EphyAdblockExtension disposing"); - - extension = EPHY_ADBLOCK_EXTENSION (object); - g_clear_object (&extension->priv->tester); - - G_OBJECT_CLASS (ephy_adblock_extension_parent_class)->dispose (object); -} - -static void -ephy_adblock_extension_finalize (GObject *object) -{ - LOG ("EphyAdblockExtension finalising"); - - G_OBJECT_CLASS (ephy_adblock_extension_parent_class)->finalize (object); -} - -static void -ephy_adblock_extension_class_init (EphyAdblockExtensionClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->dispose = ephy_adblock_extension_dispose; - object_class->finalize = ephy_adblock_extension_finalize; - - g_type_class_add_private (object_class, sizeof (EphyAdblockExtensionPrivate)); -} - -static gboolean -ephy_adblock_impl_should_load (EphyAdBlock *blocker, - EphyEmbed *embed, - const char *url, - AdUriCheckType type) -{ - EphyAdblockExtension *self = NULL; - EphyWebView* web_view = NULL; - const char *address = NULL; - - LOG ("ephy_adblock_impl_should_load checking %s", url); - - self = EPHY_ADBLOCK_EXTENSION (blocker); - g_return_val_if_fail (self != NULL, TRUE); - - web_view = ephy_embed_get_web_view (embed); - address = ephy_web_view_get_address (web_view); - - return !uri_tester_test_uri (self->priv->tester, url, address, type); -} - -static void -ephy_adblock_impl_edit_rule (EphyAdBlock *blocker, - const char *url, - gboolean allowed) -{ -} - -static void -ephy_adblock_adblock_iface_init (EphyAdBlockIface *iface) -{ - iface->should_load = ephy_adblock_impl_should_load; - iface->edit_rule = ephy_adblock_impl_edit_rule; -} diff --git a/src/ephy-adblock-extension.h b/src/ephy-adblock-extension.h deleted file mode 100644 index 46bea1bca..000000000 --- a/src/ephy-adblock-extension.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright © 2011 Igalia S.L. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef EPHY_ADBLOCK_EXTENSION_H -#define EPHY_ADBLOCK_EXTENSION_H - -#include <glib-object.h> -#include <glib.h> - -G_BEGIN_DECLS - -#define EPHY_TYPE_ADBLOCK_EXTENSION (ephy_adblock_extension_get_type ()) -#define EPHY_ADBLOCK_EXTENSION(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), EPHY_TYPE_ADBLOCK_EXTENSION, EphyAdblockExtension)) -#define EPHY_ADBLOCK_EXTENSION_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), EPHY_TYPE_ADBLOCK_EXTENSION, EphyAdblockExtensionClass)) -#define EPHY_IS_ADBLOCK_EXTENSION(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), EPHY_TYPE_ADBLOCK_EXTENSION)) -#define EPHY_IS_ADBLOCK_EXTENSION_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), EPHY_TYPE_ADBLOCK_EXTENSION)) -#define EPHY_ADBLOCK_EXTENSION_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), EPHY_TYPE_ADBLOCK_EXTENSION, EphyAdblockExtensionClass)) - -typedef struct EphyAdblockExtension EphyAdblockExtension; -typedef struct EphyAdblockExtensionClass EphyAdblockExtensionClass; -typedef struct EphyAdblockExtensionPrivate EphyAdblockExtensionPrivate; - -struct EphyAdblockExtensionClass -{ - GObjectClass parent_class; -}; - -struct EphyAdblockExtension -{ - GObject parent_instance; - - /*< private >*/ - EphyAdblockExtensionPrivate *priv; -}; - -GType ephy_adblock_extension_get_type (void); - -G_END_DECLS - -#endif diff --git a/src/uri-tester.c b/src/uri-tester.c deleted file mode 100644 index 0b4ada297..000000000 --- a/src/uri-tester.c +++ /dev/null @@ -1,895 +0,0 @@ -/* - * Copyright © 2011 Igalia S.L. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * Some parts of this file based on the Midori's 'adblock' extension, - * licensed with the GNU Lesser General Public License 2.1, Copyright - * (C) 2009-2010 Christian Dywan <christian@twotoasts.de> and 2009 - * Alexander Butenko <a.butenka@gmail.com>. Check Midori's web site - * at http://www.twotoasts.de - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#include "config.h" -#include "uri-tester.h" - -#include "ephy-debug.h" -#include "ephy-file-helpers.h" - -#include <gio/gio.h> -#include <glib/gstdio.h> -#include <string.h> -#include <webkit/webkit.h> - -#define DEFAULT_FILTER_URL "http://adblockplus.mozdev.org/easylist/easylist.txt" -#define FILTERS_LIST_FILENAME "filters.list" -#define SIGNATURE_SIZE 8 -#define UPDATE_FREQUENCY 24 * 60 * 60 /* In seconds */ - -#define URI_TESTER_GET_PRIVATE(object) (G_TYPE_INSTANCE_GET_PRIVATE ((object), TYPE_URI_TESTER, UriTesterPrivate)) - -struct _UriTesterPrivate -{ - GSList *filters; - - GHashTable *pattern; - GHashTable *keys; - GHashTable *optslist; - GHashTable *urlcache; - - GString *blockcss; - GString *blockcssprivate; -}; - -enum -{ - PROP_0, - PROP_FILTERS, -}; - -G_DEFINE_TYPE (UriTester, uri_tester, G_TYPE_OBJECT); - -/* Private functions. */ - -static void uri_tester_class_init (UriTesterClass *klass); -static void uri_tester_init (UriTester *dialog); - -static GString * -uri_tester_fixup_regexp (const char *prefix, char *src); - -static gboolean -uri_tester_parse_file_at_uri (UriTester *tester, const char *fileuri); - -static char * -uri_tester_ensure_data_dir () -{ - char *folder = NULL; - - /* Ensure adblock's dir is there. */ - folder = g_build_filename (ephy_dot_dir (), "adblock", NULL); - g_mkdir_with_parents (folder, 0700); - - return folder; -} - -static char* -uri_tester_get_fileuri_for_url (const char *url) -{ - char *filename = NULL; - char *folder = NULL; - char *path = NULL; - char *uri = NULL; - - if (!strncmp (url, "file", 4)) - return g_strndup (url + 7, strlen (url) - 7); - - folder = uri_tester_ensure_data_dir (); - filename = g_compute_checksum_for_string (G_CHECKSUM_MD5, url, -1); - - path = g_build_filename (folder, filename, NULL); - uri = g_filename_to_uri (path, NULL, NULL); - - g_free (filename); - g_free (path); - g_free (folder); - - return uri; -} - -static void -uri_tester_download_notify_status_cb (WebKitDownload *download, - GParamSpec *pspec, - UriTester *tester) -{ - const char *dest = NULL; - - if (webkit_download_get_status (download) != WEBKIT_DOWNLOAD_STATUS_FINISHED) - return; - - LOG ("Download from %s to %s completed", - webkit_download_get_uri (download), - webkit_download_get_destination_uri (download)); - - /* Parse the file from disk. */ - dest = webkit_download_get_destination_uri (download); - uri_tester_parse_file_at_uri (tester, dest); -} - -static void -uri_tester_retrieve_filter (UriTester *tester, const char *url, const char *fileuri) -{ - WebKitNetworkRequest *request = NULL; - WebKitDownload *download = NULL; - - g_return_if_fail (IS_URI_TESTER (tester)); - g_return_if_fail (url != NULL); - g_return_if_fail (fileuri != NULL); - - request = webkit_network_request_new (url); - download = webkit_download_new (request); - g_object_unref (request); - - webkit_download_set_destination_uri (download, fileuri); - - g_signal_connect (download, "notify::status", - G_CALLBACK (uri_tester_download_notify_status_cb), tester); - - webkit_download_start (download); -} - -static gboolean -uri_tester_filter_is_valid (const char *fileuri) -{ - GFile *file = NULL; - GFileInfo *file_info = NULL; - gboolean result; - - /* Now check if the local file is too old. */ - file = g_file_new_for_uri (fileuri); - file_info = g_file_query_info (file, - G_FILE_ATTRIBUTE_TIME_MODIFIED, - G_FILE_QUERY_INFO_NONE, - NULL, - NULL); - result = FALSE; - if (file_info) - { - GTimeVal current_time; - GTimeVal mod_time; - - g_get_current_time (¤t_time); - g_file_info_get_modification_time (file_info, &mod_time); - - if (current_time.tv_sec > mod_time.tv_sec) - { - gint64 expire_time = mod_time.tv_sec + UPDATE_FREQUENCY; - result = current_time.tv_sec < expire_time; - } - g_object_unref (file_info); - } - - g_object_unref (file); - - return result; -} - -static void -uri_tester_load_patterns (UriTester *tester) -{ - GSList *filter = NULL; - char *url = NULL; - char *fileuri = NULL; - - /* Load patterns from the list of filters. */ - for (filter = tester->priv->filters; filter; filter = g_slist_next(filter)) - { - url = (char*)filter->data; - fileuri = uri_tester_get_fileuri_for_url (url); - - if (!uri_tester_filter_is_valid (fileuri)) - uri_tester_retrieve_filter (tester, url, fileuri); - else - uri_tester_parse_file_at_uri (tester, fileuri); - - g_free (fileuri); - } -} - -static void -uri_tester_load_filters (UriTester *tester) -{ - GSList *list = NULL; - char *data_dir = NULL; - char *filepath = NULL; - - data_dir = uri_tester_ensure_data_dir (); - filepath = g_build_filename (data_dir, FILTERS_LIST_FILENAME, NULL); - - if (g_file_test (filepath, G_FILE_TEST_EXISTS | G_FILE_TEST_IS_REGULAR)) - { - GFile *file = NULL; - char *contents = NULL; - gsize length = 0; - GError *error = NULL; - - file = g_file_new_for_path (filepath); - if (g_file_load_contents (file, NULL, &contents, &length, NULL, &error)) - { - char **urls_array = NULL; - char *url = NULL; - int i = 0; - - urls_array = g_strsplit (contents, ";", -1); - for (i = 0; urls_array [i]; i++) - { - url = g_strstrip (g_strdup (urls_array[i])); - if (!g_str_equal (url, "")) - list = g_slist_prepend (list, url); - } - g_strfreev (urls_array); - - g_free (contents); - } - - if (error) - { - LOG ("Error loading filters from %s: %s", filepath, error->message); - g_error_free (error); - } - - g_object_unref (file); - } - else - { - /* No file exists yet, so use the default filter and save it. */ - list = g_slist_prepend (list, g_strdup (DEFAULT_FILTER_URL)); - } - - g_free (filepath); - - uri_tester_set_filters (tester, g_slist_reverse(list)); -} - -static void -uri_tester_save_filters (UriTester *tester) -{ - FILE *file = NULL; - char *data_dir = NULL; - char *filepath = NULL; - - data_dir = uri_tester_ensure_data_dir (); - filepath = g_build_filename (data_dir, FILTERS_LIST_FILENAME, NULL); - - if ((file = g_fopen (filepath, "w"))) - { - GSList *item = NULL; - char *filter = NULL; - - for (item = tester->priv->filters; item; item = g_slist_next (item)) - { - filter = g_strdup_printf ("%s;", (char*)item->data); - fputs (filter, file); - g_free (filter); - } - fclose (file); - } - g_free (filepath); -} - -static inline int -uri_tester_check_rule (UriTester *tester, - GRegex *regex, - const char *patt, - const char *req_uri, - const char *page_uri) -{ - char *opts; - - if (!g_regex_match_full (regex, req_uri, -1, 0, 0, NULL, NULL)) - return FALSE; - - opts = g_hash_table_lookup (tester->priv->optslist, patt); - if (opts && g_regex_match_simple (",third-party", opts, - G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY)) - { - if (page_uri && g_regex_match_full (regex, page_uri, -1, 0, 0, NULL, NULL)) - return FALSE; - } - /* TODO: Domain opt check */ - LOG ("blocked by pattern regexp=%s -- %s", g_regex_get_pattern (regex), req_uri); - return TRUE; -} - -static inline gboolean -uri_tester_is_matched_by_pattern (UriTester *tester, - const char *req_uri, - const char *page_uri) -{ - GHashTableIter iter; - gpointer patt, regex; - - g_hash_table_iter_init (&iter, tester->priv->pattern); - while (g_hash_table_iter_next (&iter, &patt, ®ex)) - { - if (uri_tester_check_rule(tester, regex, patt, req_uri, page_uri)) - return TRUE; - } - return FALSE; -} - -static inline gboolean -uri_tester_is_matched_by_key (UriTester *tester, - const char *opts, - const char *req_uri, - const char *page_uri) -{ - UriTesterPrivate *priv = NULL; - char *uri; - int len; - int pos = 0; - GList *regex_bl = NULL; - GString *guri; - gboolean ret = FALSE; - char sig[SIGNATURE_SIZE + 1]; - - priv = tester->priv; - - memset (&sig[0], 0, sizeof (sig)); - /* Signatures are made on pattern, so we need to convert url to a pattern as well */ - guri = uri_tester_fixup_regexp ("", (char*)req_uri); - uri = guri->str; - len = guri->len; - - for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--) - { - GRegex *regex; - strncpy (sig, uri + pos, SIGNATURE_SIZE); - regex = g_hash_table_lookup (priv->keys, sig); - - /* Dont check if regex is already blacklisted */ - if (!regex || g_list_find (regex_bl, regex)) - continue; - ret = uri_tester_check_rule (tester, regex, sig, req_uri, page_uri); - if (ret) - break; - regex_bl = g_list_prepend (regex_bl, regex); - } - g_string_free (guri, TRUE); - g_list_free (regex_bl); - return ret; -} - -static gboolean -uri_tester_is_matched (UriTester *tester, - const char *opts, - const char *req_uri, - const char *page_uri) -{ - UriTesterPrivate *priv = NULL; - char *value; - - priv = tester->priv; - - /* Check cached URLs first. */ - if ((value = g_hash_table_lookup (priv->urlcache, req_uri))) - return (value[0] != '0') ? TRUE : FALSE; - - /* Look for a match either by key or by pattern. */ - if (uri_tester_is_matched_by_key (tester, opts, req_uri, page_uri)) - { - g_hash_table_insert (priv->urlcache, g_strdup (req_uri), g_strdup("1")); - return TRUE; - } - - /* Matching by pattern is pretty expensive, so do it if needed only. */ - if (uri_tester_is_matched_by_pattern (tester, req_uri, page_uri)) - { - g_hash_table_insert (priv->urlcache, g_strdup (req_uri), g_strdup("1")); - return TRUE; - } - - g_hash_table_insert (priv->urlcache, g_strdup (req_uri), g_strdup("0")); - return FALSE; -} - -static GString * -uri_tester_fixup_regexp (const char *prefix, char *src) -{ - GString *str; - int len = 0; - - if (!src) - return NULL; - - str = g_string_new (prefix); - - /* lets strip first .* */ - if (src[0] == '*') - { - (void)*src++; - } - - do - { - switch (*src) - { - case '*': - g_string_append (str, ".*"); - break; - /*case '.': - g_string_append (str, "\\."); - break;*/ - case '?': - g_string_append (str, "\\?"); - break; - case '|': - /* FIXME: We actually need to match :[0-9]+ or '/'. Sign means - "here could be port number or nothing". So bla.com^ will match - bla.com/ or bla.com:8080/ but not bla.com.au/ */ - case '^': - case '+': - break; - default: - g_string_append_printf (str,"%c", *src); - break; - } - src++; - } - while (*src); - - len = str->len; - /* We dont need .* in the end of url. Thats stupid */ - if (str->str && str->str[len-1] == '*' && str->str[len-2] == '.') - g_string_erase (str, len-2, 2); - - return str; -} - -static gboolean -uri_tester_compile_regexp (UriTester *tester, - GString *gpatt, - char *opts) -{ - GRegex *regex; - GError *error = NULL; - char *patt; - int len; - - if (!gpatt) - return FALSE; - - patt = gpatt->str; - len = gpatt->len; - - /* TODO: Play with optimization flags */ - regex = g_regex_new (patt, G_REGEX_OPTIMIZE, - G_REGEX_MATCH_NOTEMPTY, &error); - if (error) - { - g_warning ("%s: %s", G_STRFUNC, error->message); - g_error_free (error); - g_regex_unref (regex); - return TRUE; - } - - if (!g_regex_match_simple ("^/.*[\\^\\$\\*].*/$", patt, G_REGEX_UNGREEDY, G_REGEX_MATCH_NOTEMPTY)) - { - int signature_count = 0; - int pos = 0; - char *sig; - - for (pos = len - SIGNATURE_SIZE; pos >= 0; pos--) { - sig = g_strndup (patt + pos, SIGNATURE_SIZE); - if (!g_regex_match_simple ("[\\*]", sig, G_REGEX_UNGREEDY, G_REGEX_MATCH_NOTEMPTY) && - !g_hash_table_lookup (tester->priv->keys, sig)) - { - LOG ("sig: %s %s", sig, patt); - g_hash_table_insert (tester->priv->keys, g_strdup (sig), g_regex_ref (regex)); - g_hash_table_insert (tester->priv->optslist, g_strdup (sig), g_strdup (opts)); - signature_count++; - } - else - { - if (g_regex_match_simple ("^\\*", sig, G_REGEX_UNGREEDY, G_REGEX_MATCH_NOTEMPTY) && - !g_hash_table_lookup (tester->priv->pattern, patt)) - { - LOG ("patt2: %s %s", sig, patt); - g_hash_table_insert (tester->priv->pattern, g_strdup (patt), g_regex_ref (regex)); - g_hash_table_insert (tester->priv->optslist, g_strdup (patt), g_strdup (opts)); - } - } - g_free (sig); - } - g_regex_unref (regex); - - if (signature_count > 1 && g_hash_table_lookup (tester->priv->pattern, patt)) - { - g_hash_table_steal (tester->priv->pattern, patt); - return TRUE; - } - - return FALSE; - } - else - { - LOG ("patt: %s%s", patt, ""); - /* Pattern is a regexp chars */ - g_hash_table_insert (tester->priv->pattern, g_strdup (patt), regex); - g_hash_table_insert (tester->priv->optslist, g_strdup (patt), g_strdup (opts)); - return FALSE; - } -} - -static char* -uri_tester_add_url_pattern (UriTester *tester, - char *prefix, - char *type, - char *line) -{ - char **data; - char *patt; - GString *format_patt; - char *opts; - gboolean should_free; - - data = g_strsplit (line, "$", -1); - if (!data || !data[0]) - { - g_strfreev (data); - return NULL; - } - - if (data[1] && data[2]) - { - patt = g_strconcat (data[0], data[1], NULL); - opts = g_strconcat (type, ",", data[2], NULL); - } - else if (data[1]) - { - patt = data[0]; - opts = g_strconcat (type, ",", data[1], NULL); - } - else - { - patt = data[0]; - opts = type; - } - - if (g_regex_match_simple ("subdocument", opts, - G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY)) - { - if (data[1] && data[2]) - g_free (patt); - if (data[1]) - g_free (opts); - g_strfreev (data); - return NULL; - } - - format_patt = uri_tester_fixup_regexp (prefix, patt); - - LOG ("got: %s opts %s", format_patt->str, opts); - should_free = uri_tester_compile_regexp (tester, format_patt, opts); - - if (data[1] && data[2]) - g_free (patt); - if (data[1]) - g_free (opts); - g_strfreev (data); - - return g_string_free (format_patt, should_free); -} - -static inline void -uri_tester_frame_add (UriTester *tester, char *line) -{ - const char *separator = " , "; - - (void)*line++; - (void)*line++; - if (strchr (line, '\'') - || (strchr (line, ':') - && !g_regex_match_simple (".*\\[.*:.*\\].*", line, - G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY))) - { - return; - } - g_string_append (tester->priv->blockcss, separator); - g_string_append (tester->priv->blockcss, line); -} - -static inline void -uri_tester_frame_add_private (UriTester *tester, - const char *line, - const char *sep) -{ - char **data; - data = g_strsplit (line, sep, 2); - - if (!(data[1] && *data[1]) - || strchr (data[1], '\'') - || (strchr (data[1], ':') - && !g_regex_match_simple (".*\\[.*:.*\\].*", data[1], - G_REGEX_CASELESS, G_REGEX_MATCH_NOTEMPTY))) - { - g_strfreev (data); - return; - } - - if (strchr (data[0], ',')) - { - char **domains; - int i; - - domains = g_strsplit (data[0], ",", -1); - for (i = 0; domains[i]; i++) - { - g_string_append_printf (tester->priv->blockcssprivate, ";sites['%s']+=',%s'", - g_strstrip (domains[i]), data[1]); - } - g_strfreev (domains); - } - else - { - g_string_append_printf (tester->priv->blockcssprivate, ";sites['%s']+=',%s'", - data[0], data[1]); - } - g_strfreev (data); -} - -static char* -uri_tester_parse_line (UriTester *tester, char *line) -{ - if (!line) - return NULL; - g_strchomp (line); - /* Ignore comments and new lines */ - if (line[0] == '!') - return NULL; - /* FIXME: No support for whitelisting */ - if (line[0] == '@' && line[1] == '@') - return NULL; - /* FIXME: No support for [include] and [exclude] tags */ - if (line[0] == '[') - return NULL; - - /* Skip garbage */ - if (line[0] == ' ' || !line[0]) - return NULL; - - /* Got CSS block hider */ - if (line[0] == '#' && line[1] == '#' ) - { - uri_tester_frame_add (tester, line); - return NULL; - } - /* Got CSS block hider. Workaround */ - if (line[0] == '#') - return NULL; - - /* Got per domain CSS hider rule */ - if (strstr (line, "##")) - { - uri_tester_frame_add_private (tester, line, "##"); - return NULL; - } - - /* Got per domain CSS hider rule. Workaround */ - if (strchr (line, '#')) - { - uri_tester_frame_add_private (tester, line, "#"); - return NULL; - } - /* Got URL blocker rule */ - if (line[0] == '|' && line[1] == '|' ) - { - (void)*line++; - (void)*line++; - return uri_tester_add_url_pattern (tester, "", "fulluri", line); - } - if (line[0] == '|') - { - (void)*line++; - return uri_tester_add_url_pattern (tester, "^", "fulluri", line); - } - return uri_tester_add_url_pattern (tester, "", "uri", line); -} - -static gboolean -uri_tester_parse_file_at_uri (UriTester *tester, const char *fileuri) -{ - FILE *file; - char line[2000]; - char *path = NULL; - gboolean result = FALSE; - - path = g_filename_from_uri (fileuri, NULL, NULL); - if ((file = g_fopen (path, "r"))) - { - while (fgets (line, 2000, file)) - g_free (uri_tester_parse_line (tester, line)); - fclose (file); - - result = TRUE; - } - g_free (path); - - return result; -} - -static void -uri_tester_init (UriTester *tester) -{ - UriTesterPrivate *priv = NULL; - - LOG ("UriTester initializing %p", tester); - - priv = URI_TESTER_GET_PRIVATE (tester); - tester->priv = priv; - - priv->filters = NULL; - priv->pattern = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, - (GDestroyNotify)g_regex_unref); - priv->keys = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, - (GDestroyNotify)g_regex_unref); - priv->optslist = g_hash_table_new_full (g_str_hash, g_str_equal, - NULL, - (GDestroyNotify)g_free); - priv->urlcache = g_hash_table_new_full (g_str_hash, g_str_equal, - (GDestroyNotify)g_free, - (GDestroyNotify)g_free); - - priv->blockcss = g_string_new ("z-non-exist"); - priv->blockcssprivate = g_string_new (""); - - uri_tester_load_filters (tester); - uri_tester_load_patterns (tester); -} - -static void -uri_tester_set_property (GObject *object, - guint prop_id, - const GValue *value, - GParamSpec *pspec) -{ - UriTester *tester = URI_TESTER (object); - - switch (prop_id) - { - case PROP_FILTERS: - uri_tester_set_filters (tester, (GSList*) g_value_get_pointer (value)); - break; - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); - break; - } -} - -static void -uri_tester_finalize (GObject *object) -{ - UriTesterPrivate *priv = URI_TESTER_GET_PRIVATE (URI_TESTER (object)); - - LOG ("UriTester finalizing %p", object); - - g_slist_foreach (priv->filters, (GFunc) g_free, NULL); - g_slist_free (priv->filters); - - g_hash_table_destroy (priv->pattern); - g_hash_table_destroy (priv->keys); - g_hash_table_destroy (priv->optslist); - g_hash_table_destroy (priv->urlcache); - - g_string_free (priv->blockcss, TRUE); - g_string_free (priv->blockcssprivate, TRUE); - - G_OBJECT_CLASS (uri_tester_parent_class)->finalize (object); -} - -static void -uri_tester_class_init (UriTesterClass *klass) -{ - GObjectClass *object_class = G_OBJECT_CLASS (klass); - - object_class->set_property = uri_tester_set_property; - object_class->finalize = uri_tester_finalize; - - g_object_class_install_property - (object_class, - PROP_FILTERS, - g_param_spec_pointer ("filters", - "filters", - "filters", - G_PARAM_WRITABLE)); - - g_type_class_add_private (object_class, sizeof (UriTesterPrivate)); -} - -UriTester * -uri_tester_new (void) -{ - return g_object_new (TYPE_URI_TESTER, NULL); -} - -gboolean -uri_tester_test_uri (UriTester *tester, - const char *req_uri, - const char *page_uri, - AdUriCheckType type) -{ - /* Don't block top level documents. */ - if (type == AD_URI_CHECK_TYPE_DOCUMENT) - return FALSE; - - return uri_tester_is_matched (tester, NULL, req_uri, page_uri); -} - -void -uri_tester_set_filters (UriTester *tester, GSList *filters) -{ - UriTesterPrivate *priv = tester->priv; - - if (priv->filters) - { - g_slist_foreach (priv->filters, (GFunc) g_free, NULL); - g_slist_free (priv->filters); - } - - /* Update private variable and save to disk. */ - priv->filters = filters; - uri_tester_save_filters (tester); -} - -GSList * -uri_tester_get_filters (UriTester *tester) -{ - return tester->priv->filters; -} - -void -uri_tester_reload (UriTester *tester) -{ - GDir *g_data_dir = NULL; - const char *data_dir = NULL; - - /* Remove data files in the data dir first. */ - data_dir = uri_tester_ensure_data_dir (); - - g_data_dir = g_dir_open (data_dir, 0, NULL); - if (g_data_dir) - { - const char *filename = NULL; - char *filepath = NULL; - - while ((filename = g_dir_read_name (g_data_dir))) - { - /* Omit the list of filters. */ - if (!g_strcmp0 (filename, FILTERS_LIST_FILENAME)) - continue; - - filepath = g_build_filename (data_dir, filename, NULL); - g_unlink (filepath); - - g_free (filepath); - } - - g_dir_close (g_data_dir); - } - - /* Load patterns from current filters. */ - uri_tester_load_patterns (tester); -} diff --git a/src/uri-tester.h b/src/uri-tester.h deleted file mode 100644 index d8fb85aec..000000000 --- a/src/uri-tester.h +++ /dev/null @@ -1,72 +0,0 @@ -/* - * Copyright © 2011 Igalia S.L. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef URI_TESTER_H -#define URI_TESTER_H - -#include "ephy-adblock.h" - -#include <glib-object.h> -#include <glib.h> - -G_BEGIN_DECLS - -#define TYPE_URI_TESTER (uri_tester_get_type ()) -#define URI_TESTER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), TYPE_URI_TESTER, UriTester)) -#define URI_TESTER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST((k), TYPE_URI_TESTER, UriTesterClass)) -#define IS_URI_TESTER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), TYPE_URI_TESTER)) -#define IS_URI_TESTER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), TYPE_URI_TESTER)) -#define URI_TESTER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), TYPE_URI_TESTER, UriTesterClass)) - -typedef struct _UriTester UriTester; -typedef struct _UriTesterClass UriTesterClass; -typedef struct _UriTesterPrivate UriTesterPrivate; - -struct _UriTester -{ - GObject parent_instance; - - /*< private >*/ - UriTesterPrivate *priv; -}; - -struct _UriTesterClass -{ - GObjectClass parent_class; -}; - -GType uri_tester_get_type (void); - -void uri_tester_register (GTypeModule *module); - -UriTester *uri_tester_new (void); - -gboolean uri_tester_test_uri (UriTester *tester, - const char *req_uri, - const char *page_uri, - AdUriCheckType type); - -void uri_tester_set_filters (UriTester *tester, GSList *filters); - -GSList *uri_tester_get_filters (UriTester *tester); - -void uri_tester_reload (UriTester *tester); - -G_END_DECLS - -#endif /* URI_TESTER_H */ |