[epiphany/gnome-3-18] Revert "EphyUriTester: Drop keys/signatures logic"
- From: Michael Catanzaro <mcatanzaro src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [epiphany/gnome-3-18] Revert "EphyUriTester: Drop keys/signatures logic"
- Date: Fri, 18 Dec 2015 15:52:46 +0000 (UTC)
commit b4dfe8f20b12da43b4ab84a5d1b10f71234a2958
Author: Michael Catanzaro <mcatanzaro igalia com>
Date: Fri Dec 18 09:52:18 2015 -0600
Revert "EphyUriTester: Drop keys/signatures logic"
This reverts commit d694e8d260831caf181d0939fc2e33a0b4480d6a.
https://bugzilla.gnome.org/show_bug.cgi?id=759501
embed/web-extension/uri-tester.c | 113 +++++++++++++++++++++++++++++++++++++-
1 files changed, 110 insertions(+), 3 deletions(-)
---
diff --git a/embed/web-extension/uri-tester.c b/embed/web-extension/uri-tester.c
index 8d2636e..8758719 100644
--- a/embed/web-extension/uri-tester.c
+++ b/embed/web-extension/uri-tester.c
@@ -44,10 +44,12 @@ struct _UriTesterPrivate
char *data_dir;
GHashTable *pattern;
+ GHashTable *keys;
GHashTable *optslist;
GHashTable *urlcache;
GHashTable *whitelisted_pattern;
+ GHashTable *whitelisted_keys;
GHashTable *whitelisted_optslist;
GHashTable *whitelisted_urlcache;
@@ -350,6 +352,54 @@ uri_tester_is_matched_by_pattern (UriTester *tester,
return FALSE;
}
+static inline gboolean
+uri_tester_is_matched_by_key (UriTester *tester,
+ const char *opts,
+ const char *req_uri,
+ const char *page_uri,
+ gboolean whitelist)
+{
+ UriTesterPrivate *priv = NULL;
+ char *uri;
+ int len;
+ int pos = 0;
+ GList *regex_bl = NULL;
+ GString *guri;
+ gboolean ret = FALSE;
+ char sig[SIGNATURE_SIZE + 1];
+ GHashTable *keys;
+
+ priv = tester->priv;
+
+ keys = priv->keys;
+ if (whitelist)
+ keys = priv->whitelisted_keys;
+
+ 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 (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, whitelist);
+ 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,
@@ -371,6 +421,13 @@ uri_tester_is_matched (UriTester *tester,
if ((value = g_hash_table_lookup (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, whitelist))
+ {
+ g_hash_table_insert (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, whitelist))
{
@@ -444,15 +501,18 @@ uri_tester_compile_regexp (UriTester *tester,
gboolean whitelist)
{
GHashTable *pattern;
+ GHashTable *keys;
GHashTable *optslist;
GRegex *regex;
GError *error = NULL;
char *patt;
+ int len;
if (!gpatt)
return;
patt = gpatt->str;
+ len = gpatt->len;
/* TODO: Play with optimization flags */
regex = g_regex_new (patt, G_REGEX_OPTIMIZE | G_REGEX_JAVASCRIPT_COMPAT,
@@ -465,16 +525,55 @@ uri_tester_compile_regexp (UriTester *tester,
}
pattern = tester->priv->pattern;
+ keys = tester->priv->keys;
optslist = tester->priv->optslist;
if (whitelist)
{
pattern = tester->priv->whitelisted_pattern;
+ keys = tester->priv->whitelisted_keys;
optslist = tester->priv->whitelisted_optslist;
}
- LOG ("patt: %s%s", patt, "");
- g_hash_table_insert (pattern, g_strdup (patt), regex);
- g_hash_table_insert (optslist, g_strdup (patt), g_strdup (opts));
+ if (!g_regex_match (tester->priv->regex_pattern, patt, 0, NULL))
+ {
+ 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 (!strchr (sig, '*') &&
+ !g_hash_table_lookup (keys, sig))
+ {
+ LOG ("sig: %s %s", sig, patt);
+ g_hash_table_insert (keys, g_strdup (sig), g_regex_ref (regex));
+ g_hash_table_insert (optslist, g_strdup (sig), g_strdup (opts));
+ signature_count++;
+ }
+ else
+ {
+ if (sig[0] == '*' &&
+ !g_hash_table_lookup (pattern, patt))
+ {
+ LOG ("patt2: %s %s", sig, patt);
+ g_hash_table_insert (pattern, g_strdup (patt), g_regex_ref (regex));
+ g_hash_table_insert (optslist, g_strdup (patt), g_strdup (opts));
+ }
+ }
+ g_free (sig);
+ }
+ g_regex_unref (regex);
+
+ if (signature_count > 1 && g_hash_table_lookup (pattern, patt))
+ g_hash_table_steal (pattern, patt);
+ }
+ else
+ {
+ LOG ("patt: %s%s", patt, "");
+ /* Pattern is a regexp chars */
+ g_hash_table_insert (pattern, g_strdup (patt), regex);
+ g_hash_table_insert (optslist, g_strdup (patt), g_strdup (opts));
+ }
}
static void
@@ -742,6 +841,9 @@ uri_tester_init (UriTester *tester)
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,
(GDestroyNotify)g_free,
(GDestroyNotify)g_free);
@@ -752,6 +854,9 @@ uri_tester_init (UriTester *tester)
priv->whitelisted_pattern = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify)g_free,
(GDestroyNotify)g_regex_unref);
+ priv->whitelisted_keys = g_hash_table_new_full (g_str_hash, g_str_equal,
+ (GDestroyNotify)g_free,
+ (GDestroyNotify)g_regex_unref);
priv->whitelisted_optslist = g_hash_table_new_full (g_str_hash, g_str_equal,
(GDestroyNotify)g_free,
(GDestroyNotify)g_free);
@@ -825,10 +930,12 @@ uri_tester_finalize (GObject *object)
g_free (priv->data_dir);
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_hash_table_destroy (priv->whitelisted_pattern);
+ g_hash_table_destroy (priv->whitelisted_keys);
g_hash_table_destroy (priv->whitelisted_optslist);
g_hash_table_destroy (priv->whitelisted_urlcache);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]