commit e5ecb22e0f4bfec84935f8266cc1520642301660 Author: Igor Oliveira igt0@torproject.org Date: Mon May 14 17:56:18 2018 -0300
Bug 26100: Load extension preferences during initialization
Mozilla removed the code that loads the default extension preferences[1].
Thus we need to load them in the startup time.
[1] https://bugzilla.mozilla.org/show_bug.cgi?id=1413413 --- src/chrome/content/torbutton.js | 8 ++++---- src/components/cookie-jar-selector.js | 4 ++++ src/components/domain-isolator.js | 11 ++++++++--- src/components/dragDropFilter.js | 2 ++ src/components/startup-observer.js | 9 ++++++--- src/components/torbutton-logger.js | 19 ++++++++++--------- src/modules/default-prefs.js | 30 ++++++++++++++++++++++++++++++ 7 files changed, 64 insertions(+), 19 deletions(-)
diff --git a/src/chrome/content/torbutton.js b/src/chrome/content/torbutton.js index cf39dc2..40d63fd 100644 --- a/src/chrome/content/torbutton.js +++ b/src/chrome/content/torbutton.js @@ -1217,7 +1217,7 @@ function torbutton_do_new_identity() { torbutton_log(3, "New Identity: Syncing prefs");
// Force prefs to be synced to disk - m_tb_prefs.savePrefFile(null); + Services.prefs.savePrefFile(null);
torbutton_log(3, "New Identity: Clearing permissions");
@@ -1634,7 +1634,7 @@ function torbutton_update_disk_prefs() { } catch (e) {}
// Force prefs to be synced to disk - m_tb_prefs.savePrefFile(null); + Services.prefs.savePrefFile(null); }
function torbutton_update_fingerprinting_prefs() { @@ -1667,7 +1667,7 @@ function torbutton_update_fingerprinting_prefs() { m_tb_prefs.setBoolPref("extensions.torbutton.resize_new_windows", mode);
// Force prefs to be synced to disk - m_tb_prefs.savePrefFile(null); + Services.prefs.savePrefFile(null); }
function torbutton_update_isolation_prefs() { @@ -1682,7 +1682,7 @@ function torbutton_update_isolation_prefs() { m_tb_prefs.setBoolPref("security.enable_tls_session_tickets", !isolate);
// Force prefs to be synced to disk - m_tb_prefs.savePrefFile(null); + Services.prefs.savePrefFile(null); }
// This function closes all XUL browser windows except this one. For this diff --git a/src/components/cookie-jar-selector.js b/src/components/cookie-jar-selector.js index 4f137d7..8456da3 100644 --- a/src/components/cookie-jar-selector.js +++ b/src/components/cookie-jar-selector.js @@ -19,6 +19,10 @@ const kMODULE_CONTRACTID = "@torproject.org/cookie-jar-selector;1"; const kMODULE_CID = Components.ID("e6204253-b690-4159-bfe8-d4eedab6b3be");
const Cr = Components.results; +const Cu = Components.utils; + +Cu.import("resource://torbutton/modules/default-prefs.js", {}) + .ensureDefaultPrefs();
// XXX: Must match the definition in torcookie.js :/ function Cookie(number,name,value,isDomain,host,rawHost,HttpOnly,path,isSecure,isSession, diff --git a/src/components/domain-isolator.js b/src/components/domain-isolator.js index a52cccc..a698439 100644 --- a/src/components/domain-isolator.js +++ b/src/components/domain-isolator.js @@ -16,6 +16,12 @@ const Cc = Components.classes, Ci = Components.interfaces, Cu = Components.utils let logger = Cc["@torproject.org/torbutton-logger;1"] .getService(Components.interfaces.nsISupports).wrappedJSObject;
+let { ensureDefaultPrefs } = Cu.import("resource://torbutton/modules/default-prefs.js", {}); +ensureDefaultPrefs(); + +// Import Services object +Cu.import("resource://gre/modules/Services.jsm"); + // Import crypto object (FF 37+). Cu.importGlobalProperties(["crypto"]);
@@ -165,6 +171,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); function DomainIsolator() { this.wrappedJSObject = this; } + // Firefox component requirements DomainIsolator.prototype = { QueryInterface: XPCOMUtils.generateQI([Ci.nsISupports, Ci.nsIObserver]), @@ -175,9 +182,7 @@ DomainIsolator.prototype = { if (topic === "profile-after-change") { logger.eclog(3, "domain isolator: set up isolating circuits by domain");
- let prefs = Cc["@mozilla.org/preferences-service;1"] - .getService(Ci.nsIPrefBranch); - if (prefs.getBoolPref("extensions.torbutton.use_nontor_proxy")) { + if (Services.prefs.getBoolPref("extensions.torbutton.use_nontor_proxy")) { tor.isolationEnabled = false; } tor.isolateCircuitsByDomain(); diff --git a/src/components/dragDropFilter.js b/src/components/dragDropFilter.js index 22dde86..916b835 100644 --- a/src/components/dragDropFilter.js +++ b/src/components/dragDropFilter.js @@ -9,6 +9,8 @@ const Cc = Components.classes; const Ci = Components.interfaces; const Cu = Components.utils;
+Cu.import("resource://torbutton/modules/default-prefs.js", {}).ensureDefaultPrefs(); + Cu.import("resource://gre/modules/XPCOMUtils.jsm");
// Module specific constants diff --git a/src/components/startup-observer.js b/src/components/startup-observer.js index dac7aff..144d600 100644 --- a/src/components/startup-observer.js +++ b/src/components/startup-observer.js @@ -22,6 +22,7 @@ Cu.import("resource://gre/modules/XPCOMUtils.jsm"); XPCOMUtils.defineLazyModuleGetter(this, "FileUtils", "resource://gre/modules/FileUtils.jsm");
+Cu.import("resource://torbutton/modules/default-prefs.js", {}).ensureDefaultPrefs();
// Module specific constants const kMODULE_NAME = "Startup"; @@ -96,7 +97,9 @@ StartupObserver.prototype = { let tlps = Cc["@torproject.org/torlauncher-protocol-service;1"] .getService(Ci.nsISupports).wrappedJSObject; socksPortInfo = tlps.TorGetSOCKSPortInfo(); - } catch(e) {} + } catch(e) { + this.logger.log(3, "tor launcher failed " + e); + }
// If Tor Launcher is not available, check environment variables. if (!socksPortInfo) { @@ -143,7 +146,7 @@ StartupObserver.prototype = { }
// Force prefs to be synced to disk - this._prefs.savePrefFile(null); + Services.prefs.savePrefFile(null);
this.logger.log(3, "Synced network settings to environment."); }, @@ -158,7 +161,7 @@ StartupObserver.prototype = { }
// In all cases, force prefs to be synced to disk - this._prefs.savePrefFile(null); + Services.prefs.savePrefFile(null); },
QueryInterface: function(iid) { diff --git a/src/components/torbutton-logger.js b/src/components/torbutton-logger.js index 18a5f1e..b25d039 100644 --- a/src/components/torbutton-logger.js +++ b/src/components/torbutton-logger.js @@ -16,17 +16,18 @@ const kMODULE_CID = Components.ID("f36d72c9-9718-4134-b550-e109638331d7"); const Cr = Components.results; const Cc = Components.classes; const Ci = Components.interfaces; +const Cu = Components.utils;
-function TorbuttonLogger() { - this.prefs = Components.classes["@mozilla.org/preferences-service;1"] - .getService(Components.interfaces.nsIPrefBranch); +Cu.import("resource://torbutton/modules/default-prefs.js", {}).ensureDefaultPrefs(); + +Cu.import("resource://gre/modules/Services.jsm");
+function TorbuttonLogger() { // Register observer - this._branch = this.prefs.QueryInterface(Components.interfaces.nsIPrefBranch); - this._branch.addObserver("extensions.torbutton", this, false); + Services.prefs.addObserver("extensions.torbutton", this, false);
- this.loglevel = this.prefs.getIntPref("extensions.torbutton.loglevel"); - this.logmethod = this.prefs.getIntPref("extensions.torbutton.logmethod"); + this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel"); + this.logmethod = Services.prefs.getIntPref("extensions.torbutton.logmethod");
try { var logMngr = Components.classes["@mozmonkey.com/debuglogger/manager;1"] @@ -152,10 +153,10 @@ TorbuttonLogger.prototype = if (topic != "nsPref:changed") return; switch (data) { case "extensions.torbutton.logmethod": - this.logmethod = this.prefs.getIntPref("extensions.torbutton.logmethod"); + this.logmethod = Services.prefs.getIntPref("extensions.torbutton.logmethod"); break; case "extensions.torbutton.loglevel": - this.loglevel = this.prefs.getIntPref("extensions.torbutton.loglevel"); + this.loglevel = Services.prefs.getIntPref("extensions.torbutton.loglevel"); break; } } diff --git a/src/modules/default-prefs.js b/src/modules/default-prefs.js new file mode 100644 index 0000000..d4c948f --- /dev/null +++ b/src/modules/default-prefs.js @@ -0,0 +1,30 @@ +let loaded = false; + +function ensureDefaultPrefs () { + if (loaded) { + return; + } + Components.utils.import("resource://gre/modules/Services.jsm"); + const kDefaultPreferences = "resource://torbutton/defaults/preferences/preferences.js"; + const defaultPrefBranch = Services.prefs.getDefaultBranch(null); + + const context = { + pref: function (aPrefName, aValue) { + const aValueType = typeof aValue; + if (aValueType === "boolean") { + defaultPrefBranch.setBoolPref(aPrefName, aValue); + } else if (aValueType === "number") { + defaultPrefBranch.setIntPref(aPrefName, aValue); + } else if (aValueType === "string") { + defaultPrefBranch.setCharPref(aPrefName, aValue); + } else { + Services.console.logStringMessage( + `Preference ${aPrefName} with value ${aValue} has an invalid value type`); + } + } + }; + Services.scriptloader.loadSubScript(kDefaultPreferences, context); + loaded = true; +} + +let EXPORTED_SYMBOLS = ["ensureDefaultPrefs"];