summaryrefslogtreecommitdiff
path: root/data/extensions/spyblock@gnu.org/lib/utils.js
diff options
context:
space:
mode:
Diffstat (limited to 'data/extensions/spyblock@gnu.org/lib/utils.js')
-rw-r--r--data/extensions/spyblock@gnu.org/lib/utils.js751
1 files changed, 0 insertions, 751 deletions
diff --git a/data/extensions/spyblock@gnu.org/lib/utils.js b/data/extensions/spyblock@gnu.org/lib/utils.js
deleted file mode 100644
index 7b07041..0000000
--- a/data/extensions/spyblock@gnu.org/lib/utils.js
+++ /dev/null
@@ -1,751 +0,0 @@
-/*
- * This file is part of Adblock Plus <https://adblockplus.org/>,
- * Copyright (C) 2006-2017 eyeo GmbH
- *
- * Adblock Plus is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License version 3 as
- * published by the Free Software Foundation.
- *
- * Adblock Plus 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 Adblock Plus. If not, see <http://www.gnu.org/licenses/>.
- */
-
-/**
- * @fileOverview Module containing a bunch of utility functions.
- */
-
-Cu.import("resource://gre/modules/XPCOMUtils.jsm");
-Cu.import("resource://gre/modules/Services.jsm");
-let sidebarParams = null;
-
-/**
- * Provides a bunch of utility functions.
- * @class
- */
-let Utils = exports.Utils =
-{
- /**
- * Returns the add-on ID used by Adblock Plus
- */
- get addonID()
- {
- let {addonID} = require("info");
- return addonID;
- },
-
- /**
- * Returns the installed Adblock Plus version
- */
- get addonVersion()
- {
- let {addonVersion} = require("info");
- return addonVersion;
- },
-
- /**
- * Returns whether we are running in Fennec, for Fennec-specific hacks
- * @type Boolean
- */
- get isFennec()
- {
- let {application} = require("info");
- let result = (application == "fennec" || application == "fennec2" || application == "icecatmobile");
- Utils.__defineGetter__("isFennec", () => result);
- return result;
- },
-
- /**
- * Returns the user interface locale selected for adblockplus chrome package.
- */
- get appLocale()
- {
- let locale = "en-US";
- try
- {
- locale = Utils.chromeRegistry.getSelectedLocale("adblockplus");
- }
- catch (e)
- {
- Cu.reportError(e);
- }
- Object.defineProperty(this, "appLocale", {value: locale});
- return locale;
- },
-
- /**
- * Returns version of the Gecko platform
- */
- get platformVersion()
- {
- let platformVersion = Services.appinfo.platformVersion;
- Object.defineProperty(this, "platformVersion", {value: platformVersion});
- return platformVersion;
- },
-
- /**
- * Retrieves a string from global.properties string bundle, will throw if string isn't found.
- *
- * @param {String} name string name
- * @return {String}
- */
- getString: function(name)
- {
- // Randomize URI to work around bug 719376
- let stringBundle = Services.strings.createBundle("chrome://adblockplus/locale/global.properties?" + Math.random());
- Utils.getString = function(name)
- {
- return stringBundle.GetStringFromName(name);
- }
- return Utils.getString(name);
- },
-
- /**
- * Shows an alert message like window.alert() but with a custom title.
- *
- * @param {Window} parentWindow parent window of the dialog (can be null)
- * @param {String} message message to be displayed
- * @param {String} [title] dialog title, default title will be used if omitted
- */
- alert: function(parentWindow, message, title)
- {
- if (!title)
- title = Utils.getString("default_dialog_title");
- Utils.promptService.alert(parentWindow, title, message);
- },
-
- /**
- * Asks the user for a confirmation like window.confirm() but with a custom title.
- *
- * @param {Window} parentWindow parent window of the dialog (can be null)
- * @param {String} message message to be displayed
- * @param {String} [title] dialog title, default title will be used if omitted
- * @return {Bool}
- */
- confirm: function(parentWindow, message, title)
- {
- if (!title)
- title = Utils.getString("default_dialog_title");
- return Utils.promptService.confirm(parentWindow, title, message);
- },
-
- /**
- * Retrieves the window for a document node.
- * @return {Window} will be null if the node isn't associated with a window
- */
- getWindow: function(/**Node*/ node)
- {
- if ("ownerDocument" in node && node.ownerDocument)
- node = node.ownerDocument;
-
- if ("defaultView" in node)
- return node.defaultView;
-
- return null;
- },
-
- /**
- * Retrieves the top-level chrome window for a content window.
- */
- getChromeWindow: function(/**Window*/ window) /**Window*/
- {
- return window.QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIWebNavigation)
- .QueryInterface(Ci.nsIDocShellTreeItem)
- .rootTreeItem
- .QueryInterface(Ci.nsIInterfaceRequestor)
- .getInterface(Ci.nsIDOMWindow);
- },
-
- /**
- * If the window doesn't have its own security context (e.g. about:blank or
- * data: URL) walks up the parent chain until a window is found that has a
- * security context.
- */
- getOriginWindow: function(/**Window*/ wnd) /**Window*/
- {
- while (wnd != wnd.parent)
- {
- let uri = Utils.makeURI(wnd.location.href);
- if (uri.spec != "about:blank" && uri.spec != "moz-safe-about:blank" &&
- !Utils.netUtils.URIChainHasFlags(uri, Ci.nsIProtocolHandler.URI_INHERITS_SECURITY_CONTEXT))
- {
- break;
- }
- wnd = wnd.parent;
- }
- return wnd;
- },
-
- /**
- * If a protocol using nested URIs like jar: is used - retrieves innermost
- * nested URI.
- */
- unwrapURL: function(/**nsIURI or String*/ url) /**nsIURI*/
- {
- if (!(url instanceof Ci.nsIURI))
- url = Utils.makeURI(url);
-
- if (url instanceof Ci.nsINestedURI)
- return url.innermostURI;
- else
- return url;
- },
-
- /**
- * Translates a string URI into its nsIURI representation, will return null for
- * invalid URIs.
- */
- makeURI: function(/**String*/ url) /**nsIURI*/
- {
- try
- {
- return Utils.ioService.newURI(url, null, null);
- }
- catch (e) {
- return null;
- }
- },
-
- /**
- * Posts an action to the event queue of the current thread to run it
- * asynchronously.
- * @param {function} callback
- */
- runAsync: function(callback)
- {
- Services.tm.currentThread.dispatch(callback, Ci.nsIEventTarget.DISPATCH_NORMAL);
- },
-
- /**
- * Generates filter subscription checksum.
- *
- * @param {string[]} lines filter subscription lines (with checksum line removed)
- * @return {String} checksum or null
- */
- generateChecksum: function(lines)
- {
- let stream = null;
- try
- {
- // Checksum is an MD5 checksum (base64-encoded without the trailing "=") of
- // all lines in UTF-8 without the checksum line, joined with "\n".
-
- let converter = Cc["@mozilla.org/intl/scriptableunicodeconverter"].createInstance(Ci.nsIScriptableUnicodeConverter);
- converter.charset = "UTF-8";
- stream = converter.convertToInputStream(lines.join("\n"));
-
- let hashEngine = Cc["@mozilla.org/security/hash;1"].createInstance(Ci.nsICryptoHash);
- hashEngine.init(hashEngine.MD5);
- hashEngine.updateFromStream(stream, stream.available());
- return hashEngine.finish(true).replace(/=+$/, "");
- }
- catch (e)
- {
- return null;
- }
- finally
- {
- if (stream)
- stream.close();
- }
- },
-
- /**
- * Formats a unix time according to user's locale.
- * @param {Integer} time unix time in milliseconds
- * @return {String} formatted date and time
- */
- formatTime: function(time)
- {
- try
- {
- let date = new Date(time);
- return Utils.dateFormatter.FormatDateTime("", Ci.nsIScriptableDateFormat.dateFormatShort,
- Ci.nsIScriptableDateFormat.timeFormatNoSeconds,
- date.getFullYear(), date.getMonth() + 1, date.getDate(),
- date.getHours(), date.getMinutes(), date.getSeconds());
- }
- catch(e)
- {
- // Make sure to return even on errors
- Cu.reportError(e);
- return "";
- }
- },
-
- /**
- * Checks whether any of the prefixes listed match the application locale,
- * returns matching prefix if any.
- */
- checkLocalePrefixMatch: function(/**String*/ prefixes) /**String*/
- {
- if (!prefixes)
- return null;
-
- let appLocale = Utils.appLocale;
- for (let prefix of prefixes.split(/,/))
- if (new RegExp("^" + prefix + "\\b").test(appLocale))
- return prefix;
-
- return null;
- },
-
- /**
- * Chooses the best filter subscription for user's language.
- */
- chooseFilterSubscription: function(/**NodeList*/ subscriptions) /**Node*/
- {
- let selectedItem = null;
- let selectedPrefix = null;
- let matchCount = 0;
- for (let i = 0; i < subscriptions.length; i++)
- {
- let subscription = subscriptions[i];
- if (!selectedItem)
- selectedItem = subscription;
-
- let prefix = Utils.checkLocalePrefixMatch(subscription.getAttribute("prefixes"));
- if (prefix)
- {
- if (!selectedPrefix || selectedPrefix.length < prefix.length)
- {
- selectedItem = subscription;
- selectedPrefix = prefix;
- matchCount = 1;
- }
- else if (selectedPrefix && selectedPrefix.length == prefix.length)
- {
- matchCount++;
-
- // If multiple items have a matching prefix of the same length:
- // Select one of the items randomly, probability should be the same
- // for all items. So we replace the previous match here with
- // probability 1/N (N being the number of matches).
- if (Math.random() * matchCount < 1)
- {
- selectedItem = subscription;
- selectedPrefix = prefix;
- }
- }
- }
- }
- return selectedItem;
- },
-
- /**
- * Saves sidebar state before detaching/reattaching
- */
- setParams: function(params)
- {
- sidebarParams = params;
- },
-
- /**
- * Retrieves and removes sidebar state after detaching/reattaching
- */
- getParams: function()
- {
- let ret = sidebarParams;
- sidebarParams = null;
- return ret;
- },
-
- /**
- * Verifies RSA signature. The public key and signature should be base64-encoded.
- * @param {string} key
- * @param {string} signature
- * @param {string} data
- * @return {boolean}
- */
- verifySignature: function(key, signature, data)
- {
- if (!Utils.crypto)
- return false;
-
- // Maybe we did the same check recently, look it up in the cache
- if (!("_cache" in Utils.verifySignature))
- Utils.verifySignature._cache = new Cache(5);
- let cache = Utils.verifySignature._cache;
- let cacheKey = key + " " + signature + " " + data;
- if (cacheKey in cache.data)
- return cache.data[cacheKey];
- else
- cache.add(cacheKey, false);
-
- let keyInfo, pubKey, context;
- try
- {
- let keyItem = Utils.crypto.getSECItem(atob(key));
- keyInfo = Utils.crypto.SECKEY_DecodeDERSubjectPublicKeyInfo(keyItem.address());
- if (keyInfo.isNull())
- throw new Error("SECKEY_DecodeDERSubjectPublicKeyInfo failed");
-
- pubKey = Utils.crypto.SECKEY_ExtractPublicKey(keyInfo);
- if (pubKey.isNull())
- throw new Error("SECKEY_ExtractPublicKey failed");
-
- let signatureItem = Utils.crypto.getSECItem(atob(signature));
-
- context = Utils.crypto.VFY_CreateContext(pubKey, signatureItem.address(), Utils.crypto.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE, null);
- if (context.isNull())
- return false; // This could happen if the signature is invalid
-
- let error = Utils.crypto.VFY_Begin(context);
- if (error < 0)
- throw new Error("VFY_Begin failed");
-
- error = Utils.crypto.VFY_Update(context, data, data.length);
- if (error < 0)
- throw new Error("VFY_Update failed");
-
- error = Utils.crypto.VFY_End(context);
- if (error < 0)
- return false;
-
- cache.data[cacheKey] = true;
- return true;
- }
- catch (e)
- {
- Cu.reportError(e);
- return false;
- }
- finally
- {
- if (keyInfo && !keyInfo.isNull())
- Utils.crypto.SECKEY_DestroySubjectPublicKeyInfo(keyInfo);
- if (pubKey && !pubKey.isNull())
- Utils.crypto.SECKEY_DestroyPublicKey(pubKey);
- if (context && !context.isNull())
- Utils.crypto.VFY_DestroyContext(context, true);
- }
- },
-
- /**
- * Returns the documentation link from the preferences.
- */
- getDocLink: function(/**String*/ linkID)
- {
- let {Prefs} = require("prefs");
- let docLink = Prefs.documentation_link;
- return docLink.replace(/%LINK%/g, linkID).replace(/%LANG%/g, Utils.appLocale);
- },
-
- /**
- * Splits up a combined label into the label and access key components.
- *
- * @return {Array} An array with two strings: label and access key
- */
- splitLabel: function(/**String*/ label)
- {
- let match = /^(.*)\s*\(&(.)\)\s*(\u2026?)$/.exec(label);
- if (match)
- {
- // Access key not part of the label
- return [match[1] + match[3], match[2]];
- }
- else
- {
- // Access key part of the label
- let pos = label.indexOf("&");
- if (pos >= 0 && pos < label.length - 1)
- return [label.substr(0, pos) + label.substr(pos + 1), label[pos + 1]];
- else
- return [label, ""];
- }
- },
-
- /**
- * Split all labels starting from a particular DOM node.
- */
- splitAllLabels: function(/**DOMNode*/ root)
- {
- let attrMap = {
- __proto__: null,
- "label": "value",
- "setting": "title"
- };
-
- let elements = root.querySelectorAll("*[label], label[value], setting[title]");
- for (let i = 0; i < elements.length; i++)
- {
- let element = elements[i];
- let attr = (element.localName in attrMap ? attrMap[element.localName] : "label");
- let origLabel = element.getAttribute(attr);
-
- let [label, accesskey] = this.splitLabel(origLabel);
- if (label != origLabel)
- element.setAttribute(attr, label);
- if (accesskey != "")
- element.setAttribute("accesskey", accesskey);
-
- // Labels forward changes of the accessKey property to their control, only
- // set it for actual controls.
- if (element.localName != "label")
- element.accessKey = accesskey;
- }
- }
-};
-
-/**
- * A cache with a fixed capacity, newer entries replace entries that have been
- * stored first.
- * @constructor
- */
-function Cache(/**Integer*/ size)
-{
- this._ringBuffer = new Array(size);
- this.data = Object.create(null);
-}
-exports.Cache = Cache;
-
-Cache.prototype =
-{
- /**
- * Ring buffer storing hash keys, allows determining which keys need to be
- * evicted.
- * @type Array
- */
- _ringBuffer: null,
-
- /**
- * Index in the ring buffer to be written next.
- * @type Integer
- */
- _bufferIndex: 0,
-
- /**
- * Cache data, maps values to the keys. Read-only access, for writing use
- * add() method.
- * @type Object
- */
- data: null,
-
- /**
- * Adds a key and the corresponding value to the cache.
- */
- add: function(/**String*/ key, value)
- {
- if (!(key in this.data))
- {
- // This is a new key - we need to add it to the ring buffer and evict
- // another entry instead.
- let oldKey = this._ringBuffer[this._bufferIndex];
- if (typeof oldKey != "undefined")
- delete this.data[oldKey];
- this._ringBuffer[this._bufferIndex] = key;
-
- this._bufferIndex++;
- if (this._bufferIndex >= this._ringBuffer.length)
- this._bufferIndex = 0;
- }
-
- this.data[key] = value;
- },
-
- /**
- * Clears cache contents.
- */
- clear: function()
- {
- this._ringBuffer = new Array(this._ringBuffer.length);
- this.data = Object.create(null);
- }
-}
-
-// Getters for common services, this should be replaced by Services.jsm in future
-
-XPCOMUtils.defineLazyServiceGetter(Utils, "categoryManager", "@mozilla.org/categorymanager;1", "nsICategoryManager");
-XPCOMUtils.defineLazyServiceGetter(Utils, "ioService", "@mozilla.org/network/io-service;1", "nsIIOService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "promptService", "@mozilla.org/embedcomp/prompt-service;1", "nsIPromptService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "effectiveTLD", "@mozilla.org/network/effective-tld-service;1", "nsIEffectiveTLDService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "netUtils", "@mozilla.org/network/util;1", "nsINetUtil");
-XPCOMUtils.defineLazyServiceGetter(Utils, "styleService", "@mozilla.org/content/style-sheet-service;1", "nsIStyleSheetService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "prefService", "@mozilla.org/preferences-service;1", "nsIPrefService");
-XPCOMUtils.defineLazyServiceGetter(Utils, "versionComparator", "@mozilla.org/xpcom/version-comparator;1", "nsIVersionComparator");
-XPCOMUtils.defineLazyServiceGetter(Utils, "windowMediator", "@mozilla.org/appshell/window-mediator;1", "nsIWindowMediator");
-XPCOMUtils.defineLazyServiceGetter(Utils, "windowWatcher", "@mozilla.org/embedcomp/window-watcher;1", "nsIWindowWatcher");
-XPCOMUtils.defineLazyServiceGetter(Utils, "chromeRegistry", "@mozilla.org/chrome/chrome-registry;1", "nsIXULChromeRegistry");
-XPCOMUtils.defineLazyServiceGetter(Utils, "systemPrincipal", "@mozilla.org/systemprincipal;1", "nsIPrincipal");
-XPCOMUtils.defineLazyServiceGetter(Utils, "dateFormatter", "@mozilla.org/intl/scriptabledateformat;1", "nsIScriptableDateFormat");
-XPCOMUtils.defineLazyServiceGetter(Utils, "httpProtocol", "@mozilla.org/network/protocol;1?name=http", "nsIHttpProtocolHandler");
-XPCOMUtils.defineLazyServiceGetter(Utils, "clipboard", "@mozilla.org/widget/clipboard;1", "nsIClipboard");
-XPCOMUtils.defineLazyServiceGetter(Utils, "clipboardHelper", "@mozilla.org/widget/clipboardhelper;1", "nsIClipboardHelper");
-XPCOMUtils.defineLazyGetter(Utils, "crypto", function()
-{
- try
- {
- let ctypes = Cu.import("resource://gre/modules/ctypes.jsm", null).ctypes;
-
- let nsslib;
- try
- {
- nsslib = ctypes.open(ctypes.libraryName("nss3"));
- }
- catch (e)
- {
- // It seems that on Mac OS X the full path name needs to be specified
- let file;
- // Gecko 35 added GreBinD key, see https://bugzilla.mozilla.org/show_bug.cgi?id=1077099
- if (Services.dirsvc.has("GreBinD"))
- file = Services.dirsvc.get("GreBinD", Ci.nsILocalFile);
- else
- file = Services.dirsvc.get("GreD", Ci.nsILocalFile);
- file.append(ctypes.libraryName("nss3"));
- nsslib = ctypes.open(file.path);
- }
-
- let result = {};
-
- // seccomon.h
- result.siUTF8String = 14;
-
- // secoidt.h
- result.SEC_OID_ISO_SHA_WITH_RSA_SIGNATURE = 15;
-
- // The following types are opaque to us
- result.VFYContext = ctypes.void_t;
- result.SECKEYPublicKey = ctypes.void_t;
- result.CERTSubjectPublicKeyInfo = ctypes.void_t;
-
- /*
- * seccomon.h
- * struct SECItemStr {
- * SECItemType type;
- * unsigned char *data;
- * unsigned int len;
- * };
- */
- result.SECItem = ctypes.StructType("SECItem", [
- {type: ctypes.int},
- {data: ctypes.unsigned_char.ptr},
- {len: ctypes.int}
- ]);
-
- /*
- * cryptohi.h
- * extern VFYContext *VFY_CreateContext(SECKEYPublicKey *key, SECItem *sig,
- * SECOidTag sigAlg, void *wincx);
- */
- result.VFY_CreateContext = nsslib.declare(
- "VFY_CreateContext",
- ctypes.default_abi, result.VFYContext.ptr,
- result.SECKEYPublicKey.ptr,
- result.SECItem.ptr,
- ctypes.int,
- ctypes.voidptr_t
- );
-
- /*
- * cryptohi.h
- * extern void VFY_DestroyContext(VFYContext *cx, PRBool freeit);
- */
- result.VFY_DestroyContext = nsslib.declare(
- "VFY_DestroyContext",
- ctypes.default_abi, ctypes.void_t,
- result.VFYContext.ptr,
- ctypes.bool
- );
-
- /*
- * cryptohi.h
- * extern SECStatus VFY_Begin(VFYContext *cx);
- */
- result.VFY_Begin = nsslib.declare("VFY_Begin",
- ctypes.default_abi, ctypes.int,
- result.VFYContext.ptr
- );
-
- /*
- * cryptohi.h
- * extern SECStatus VFY_Update(VFYContext *cx, const unsigned char *input,
- * unsigned int inputLen);
- */
- result.VFY_Update = nsslib.declare(
- "VFY_Update",
- ctypes.default_abi, ctypes.int,
- result.VFYContext.ptr,
- ctypes.unsigned_char.ptr,
- ctypes.int
- );
-
- /*
- * cryptohi.h
- * extern SECStatus VFY_End(VFYContext *cx);
- */
- result.VFY_End = nsslib.declare(
- "VFY_End",
- ctypes.default_abi, ctypes.int,
- result.VFYContext.ptr
- );
-
- /*
- * keyhi.h
- * extern CERTSubjectPublicKeyInfo *
- * SECKEY_DecodeDERSubjectPublicKeyInfo(SECItem *spkider);
- */
- result.SECKEY_DecodeDERSubjectPublicKeyInfo = nsslib.declare(
- "SECKEY_DecodeDERSubjectPublicKeyInfo",
- ctypes.default_abi, result.CERTSubjectPublicKeyInfo.ptr,
- result.SECItem.ptr
- );
-
- /*
- * keyhi.h
- * extern void SECKEY_DestroySubjectPublicKeyInfo(CERTSubjectPublicKeyInfo *spki);
- */
- result.SECKEY_DestroySubjectPublicKeyInfo = nsslib.declare(
- "SECKEY_DestroySubjectPublicKeyInfo",
- ctypes.default_abi, ctypes.void_t,
- result.CERTSubjectPublicKeyInfo.ptr
- );
-
- /*
- * keyhi.h
- * extern SECKEYPublicKey *
- * SECKEY_ExtractPublicKey(CERTSubjectPublicKeyInfo *);
- */
- result.SECKEY_ExtractPublicKey = nsslib.declare(
- "SECKEY_ExtractPublicKey",
- ctypes.default_abi, result.SECKEYPublicKey.ptr,
- result.CERTSubjectPublicKeyInfo.ptr
- );
-
- /*
- * keyhi.h
- * extern void SECKEY_DestroyPublicKey(SECKEYPublicKey *key);
- */
- result.SECKEY_DestroyPublicKey = nsslib.declare(
- "SECKEY_DestroyPublicKey",
- ctypes.default_abi, ctypes.void_t,
- result.SECKEYPublicKey.ptr
- );
-
- // Convenience method
- result.getSECItem = function(data)
- {
- var dataArray = new ctypes.ArrayType(ctypes.unsigned_char, data.length)();
- for (let i = 0; i < data.length; i++)
- dataArray[i] = data.charCodeAt(i) % 256;
- return new result.SECItem(result.siUTF8String, dataArray, dataArray.length);
- };
-
- return result;
- }
- catch (e)
- {
- Cu.reportError(e);
- // Expected, ctypes isn't supported in Gecko 1.9.2
- return null;
- }
-});
-
-if ("@mozilla.org/messenger/headerparser;1" in Cc)
- XPCOMUtils.defineLazyServiceGetter(Utils, "headerParser", "@mozilla.org/messenger/headerparser;1", "nsIMsgHeaderParser");
-else
- Utils.headerParser = null;