This is an automated email from the git hooks/post-receive script.
richard pushed a commit to branch tor-browser-102.3.0esr-12.0-2 in repository tor-browser.
commit 2df6696ded66b62ca03109d3db7ab8f9b56e1cff Author: Pier Angelo Vendrame pierov@torproject.org AuthorDate: Mon Oct 10 15:17:46 2022 +0200
fixup! Bug 40597: Implement TorSettings module
Bug 40933: Move tor-launcher to tor-browser.git --- browser/components/sessionstore/SessionStore.jsm | 5 - browser/modules/BridgeDB.jsm | 2 +- browser/modules/Moat.jsm | 4 +- browser/modules/TorConnect.jsm | 73 ++- browser/modules/TorProcessService.jsm | 12 - browser/modules/TorProtocolService.jsm | 510 --------------------- browser/modules/TorSettings.jsm | 25 +- browser/modules/moz.build | 2 - .../processsingleton/MainProcessSingleton.jsm | 2 - .../components/tor-launcher/TorStartupService.jsm | 14 + 10 files changed, 57 insertions(+), 592 deletions(-)
diff --git a/browser/components/sessionstore/SessionStore.jsm b/browser/components/sessionstore/SessionStore.jsm index 5f9f6aab2e54..58c5a4fed6ca 100644 --- a/browser/components/sessionstore/SessionStore.jsm +++ b/browser/components/sessionstore/SessionStore.jsm @@ -234,11 +234,6 @@ ChromeUtils.defineModuleGetter( "resource://gre/modules/sessionstore/SessionHistory.jsm" );
-// FIXME: Is this really necessary? -const { TorProtocolService } = ChromeUtils.import( - "resource:///modules/TorProtocolService.jsm" -); - const { OnionAuthUtil } = ChromeUtils.import( "chrome://browser/content/onionservices/authUtil.jsm" ); diff --git a/browser/modules/BridgeDB.jsm b/browser/modules/BridgeDB.jsm index 50665710ebf4..3110dfbbf20f 100644 --- a/browser/modules/BridgeDB.jsm +++ b/browser/modules/BridgeDB.jsm @@ -46,7 +46,7 @@ var BridgeDB = { this._image = "data:image/jpeg;base64," + encodeURIComponent(response.image); } catch (err) { - console.log(`error : ${err}`); + console.error("Could not request a captcha image", err); } return this._image; }, diff --git a/browser/modules/Moat.jsm b/browser/modules/Moat.jsm index 90a6ae4e521c..28f177e27b3b 100644 --- a/browser/modules/Moat.jsm +++ b/browser/modules/Moat.jsm @@ -9,11 +9,11 @@ const { Subprocess } = ChromeUtils.import( );
const { TorLauncherUtil } = ChromeUtils.import( - "resource://torlauncher/modules/tl-util.jsm" + "resource://gre/modules/TorLauncherUtil.jsm" );
const { TorProtocolService } = ChromeUtils.import( - "resource:///modules/TorProtocolService.jsm" + "resource://gre/modules/TorProtocolService.jsm" );
const { TorSettings, TorBridgeSource } = ChromeUtils.import( diff --git a/browser/modules/TorConnect.jsm b/browser/modules/TorConnect.jsm index cc0eeb2b1eba..34a3a9ee7d33 100644 --- a/browser/modules/TorConnect.jsm +++ b/browser/modules/TorConnect.jsm @@ -17,14 +17,14 @@ const { BrowserWindowTracker } = ChromeUtils.import( "resource:///modules/BrowserWindowTracker.jsm" );
-const { - TorProtocolService, - TorTopics, - TorBootstrapRequest, -} = ChromeUtils.import("resource:///modules/TorProtocolService.jsm"); - +const { TorMonitorService } = ChromeUtils.import( + "resource://gre/modules/TorMonitorService.jsm" +); +const { TorBootstrapRequest } = ChromeUtils.import( + "resource://gre/modules/TorBootstrapRequest.jsm" +); const { TorLauncherUtil } = ChromeUtils.import( - "resource://torlauncher/modules/tl-util.jsm" + "resource://gre/modules/TorLauncherUtil.jsm" );
const { @@ -37,9 +37,9 @@ const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
const { MoatRPC } = ChromeUtils.import("resource:///modules/Moat.jsm");
-/* Browser observer topis */ -const BrowserTopics = Object.freeze({ - ProfileAfterChange: "profile-after-change", +const TorTopics = Object.freeze({ + LogHasWarnOrErr: "TorLogHasWarnOrErr", + ProcessExited: "TorProcessExited", });
/* Relevant prefs used by tor-launcher */ @@ -445,7 +445,7 @@ const TorConnect = (() => { "Error: Censorship simulation", true ); - TorProtocolService._torBootstrapDebugSetError(); + TorMonitorService.setBootstrapError(); return; }
@@ -567,7 +567,7 @@ const TorConnect = (() => { ); return; } - TorProtocolService._torBootstrapDebugSetError(); + TorMonitorService.setBootstrapError(); } }
@@ -817,42 +817,31 @@ const TorConnect = (() => { ); },
- // init should be called on app-startup in MainProcessingSingleton.jsm + // init should be called by TorStartupService init() { console.log("TorConnect: init()"); - - // delay remaining init until after profile-after-change - Services.obs.addObserver(this, BrowserTopics.ProfileAfterChange); - this._callback(TorConnectState.Initial).begin(); + + if (!TorMonitorService.ownsTorDaemon) { + // Disabled + this._changeState(TorConnectState.Disabled); + } else { + let observeTopic = addTopic => { + Services.obs.addObserver(this, addTopic); + console.log(`TorConnect: Observing topic '${addTopic}'`); + }; + + // register the Tor topics we always care about + observeTopic(TorTopics.ProcessExited); + observeTopic(TorTopics.LogHasWarnOrErr); + observeTopic(TorSettingsTopics.Ready); + } },
async observe(subject, topic, data) { console.log(`TorConnect: Observed ${topic}`);
switch (topic) { - /* Determine which state to move to from Initial */ - case BrowserTopics.ProfileAfterChange: { - if ( - TorLauncherUtil.useLegacyLauncher || - !TorProtocolService.ownsTorDaemon - ) { - // Disabled - this._changeState(TorConnectState.Disabled); - } else { - let observeTopic = addTopic => { - Services.obs.addObserver(this, addTopic); - console.log(`TorConnect: Observing topic '${addTopic}'`); - }; - - // register the Tor topics we always care about - observeTopic(TorTopics.ProcessExited); - observeTopic(TorTopics.LogHasWarnOrErr); - observeTopic(TorSettingsTopics.Ready); - } - Services.obs.removeObserver(this, topic); - break; - } /* We need to wait until TorSettings have been loaded and applied before we can Quickstart */ case TorSettingsTopics.Ready: { if (this.shouldQuickStart) { @@ -881,11 +870,9 @@ const TorConnect = (() => { get shouldShowTorConnect() { // TorBrowser must control the daemon return ( - TorProtocolService.ownsTorDaemon && - // and we're not using the legacy launcher - !TorLauncherUtil.useLegacyLauncher && + TorMonitorService.ownsTorDaemon && // if we have succesfully bootstraped, then no need to show TorConnect - this.state != TorConnectState.Bootstrapped + this.state !== TorConnectState.Bootstrapped ); },
diff --git a/browser/modules/TorProcessService.jsm b/browser/modules/TorProcessService.jsm deleted file mode 100644 index 201e331b2806..000000000000 --- a/browser/modules/TorProcessService.jsm +++ /dev/null @@ -1,12 +0,0 @@ -"use strict"; - -var EXPORTED_SYMBOLS = ["TorProcessService"]; - -var TorProcessService = { - get isBootstrapDone() { - const svc = Cc["@torproject.org/torlauncher-process-service;1"].getService( - Ci.nsISupports - ).wrappedJSObject; - return svc.mIsBootstrapDone; - }, -}; diff --git a/browser/modules/TorProtocolService.jsm b/browser/modules/TorProtocolService.jsm deleted file mode 100644 index 6a1d6b94fff7..000000000000 --- a/browser/modules/TorProtocolService.jsm +++ /dev/null @@ -1,510 +0,0 @@ -// Copyright (c) 2021, The Tor Project, Inc. - -"use strict"; - -var EXPORTED_SYMBOLS = [ - "TorProtocolService", - "TorProcessStatus", - "TorTopics", - "TorBootstrapRequest", -]; - -const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); - -const { setTimeout, clearTimeout } = ChromeUtils.import( - "resource://gre/modules/Timer.jsm" -); - -const { TorLauncherUtil } = ChromeUtils.import( - "resource://torlauncher/modules/tl-util.jsm" -); - -// see tl-process.js -const TorProcessStatus = Object.freeze({ - Unknown: 0, - Starting: 1, - Running: 2, - Exited: 3, -}); - -/* tor-launcher observer topics */ -const TorTopics = Object.freeze({ - BootstrapStatus: "TorBootstrapStatus", - BootstrapError: "TorBootstrapError", - ProcessExited: "TorProcessExited", - LogHasWarnOrErr: "TorLogHasWarnOrErr", -}); - -/* Browser observer topis */ -const BrowserTopics = Object.freeze({ - ProfileAfterChange: "profile-after-change", -}); - -var TorProtocolService = { - _TorLauncherProtocolService: null, - _TorProcessService: null, - - // maintain a map of tor settings set by Tor Browser so that we don't - // repeatedly set the same key/values over and over - // this map contains string keys to primitive or array values - _settingsCache: new Map(), - - init() { - Services.obs.addObserver(this, BrowserTopics.ProfileAfterChange); - }, - - observe(subject, topic, data) { - if (topic === BrowserTopics.ProfileAfterChange) { - // we have to delay init'ing this or else the crypto service inits too early without a profile - // which breaks the password manager - this._TorLauncherProtocolService = Cc[ - "@torproject.org/torlauncher-protocol-service;1" - ].getService(Ci.nsISupports).wrappedJSObject; - this._TorProcessService = Cc[ - "@torproject.org/torlauncher-process-service;1" - ].getService(Ci.nsISupports).wrappedJSObject; - Services.obs.removeObserver(this, topic); - } - }, - - _typeof(aValue) { - switch (typeof aValue) { - case "boolean": - return "boolean"; - case "string": - return "string"; - case "object": - if (aValue == null) { - return "null"; - } else if (Array.isArray(aValue)) { - return "array"; - } - return "object"; - } - return "unknown"; - }, - - _assertValidSettingKey(aSetting) { - // ensure the 'key' is a string - if (typeof aSetting != "string") { - throw new Error( - `Expected setting of type string but received ${typeof aSetting}` - ); - } - }, - - _assertValidSetting(aSetting, aValue) { - this._assertValidSettingKey(aSetting); - - const valueType = this._typeof(aValue); - switch (valueType) { - case "boolean": - case "string": - case "null": - return; - case "array": - for (const element of aValue) { - if (typeof element != "string") { - throw new Error( - `Setting '${aSetting}' array contains value of invalid type '${typeof element}'` - ); - } - } - return; - default: - throw new Error( - `Invalid object type received for setting '${aSetting}'` - ); - } - }, - - // takes a Map containing tor settings - // throws on error - async writeSettings(aSettingsObj) { - // only write settings that have changed - let newSettings = new Map(); - for (const [setting, value] of aSettingsObj) { - let saveSetting = false; - - // make sure we have valid data here - this._assertValidSetting(setting, value); - - if (!this._settingsCache.has(setting)) { - // no cached setting, so write - saveSetting = true; - } else { - const cachedValue = this._settingsCache.get(setting); - if (value != cachedValue) { - // compare arrays member-wise - if (Array.isArray(value) && Array.isArray(cachedValue)) { - if (value.length != cachedValue.length) { - saveSetting = true; - } else { - const arrayLength = value.length; - for (let i = 0; i < arrayLength; ++i) { - if (value[i] != cachedValue[i]) { - saveSetting = true; - break; - } - } - } - } else { - // some other different values - saveSetting = true; - } - } - } - - if (saveSetting) { - newSettings.set(setting, value); - } - } - - // only write if new setting to save - if (newSettings.size > 0) { - // convert settingsObject map to js object for torlauncher-protocol-service - let settingsObject = {}; - for (const [setting, value] of newSettings) { - settingsObject[setting] = value; - } - - let errorObject = {}; - if ( - !(await this._TorLauncherProtocolService.TorSetConfWithReply( - settingsObject, - errorObject - )) - ) { - throw new Error(errorObject.details); - } - - // save settings to cache after successfully writing to Tor - for (const [setting, value] of newSettings) { - this._settingsCache.set(setting, value); - } - } - }, - - async _readSetting(aSetting) { - this._assertValidSettingKey(aSetting); - let reply = await this._TorLauncherProtocolService.TorGetConf(aSetting); - if (this._TorLauncherProtocolService.TorCommandSucceeded(reply)) { - return reply.lineArray; - } - throw new Error(reply.lineArray.join("\n")); - }, - - async _readBoolSetting(aSetting) { - let lineArray = await this._readSetting(aSetting); - if (lineArray.length != 1) { - throw new Error( - `Expected an array with length 1 but received array of length ${lineArray.length}` - ); - } - - let retval = lineArray[0]; - switch (retval) { - case "0": - return false; - case "1": - return true; - default: - throw new Error(`Expected boolean (1 or 0) but received '${retval}'`); - } - }, - - async _readStringSetting(aSetting) { - let lineArray = await this._readSetting(aSetting); - if (lineArray.length != 1) { - throw new Error( - `Expected an array with length 1 but received array of length ${lineArray.length}` - ); - } - return lineArray[0]; - }, - - async _readStringArraySetting(aSetting) { - let lineArray = await this._readSetting(aSetting); - return lineArray; - }, - - async readBoolSetting(aSetting) { - let value = await this._readBoolSetting(aSetting); - this._settingsCache.set(aSetting, value); - return value; - }, - - async readStringSetting(aSetting) { - let value = await this._readStringSetting(aSetting); - this._settingsCache.set(aSetting, value); - return value; - }, - - async readStringArraySetting(aSetting) { - let value = await this._readStringArraySetting(aSetting); - this._settingsCache.set(aSetting, value); - return value; - }, - - // writes current tor settings to disk - async flushSettings() { - await this.sendCommand("SAVECONF"); - }, - - getLog(countObj) { - countObj = countObj || { value: 0 }; - let torLog = this._TorLauncherProtocolService.TorGetLog(countObj); - return torLog; - }, - - // true if we launched and control tor, false if using system tor - get ownsTorDaemon() { - return TorLauncherUtil.shouldStartAndOwnTor; - }, - - // Assumes `ownsTorDaemon` is true - isNetworkDisabled() { - const reply = TorProtocolService._TorLauncherProtocolService.TorGetConfBool( - "DisableNetwork", - true - ); - if ( - TorProtocolService._TorLauncherProtocolService.TorCommandSucceeded(reply) - ) { - return reply.retVal; - } - return true; - }, - - async enableNetwork() { - let settings = {}; - settings.DisableNetwork = false; - let errorObject = {}; - if ( - !(await this._TorLauncherProtocolService.TorSetConfWithReply( - settings, - errorObject - )) - ) { - throw new Error(errorObject.details); - } - }, - - async sendCommand(cmd) { - return this._TorLauncherProtocolService.TorSendCommand(cmd); - }, - - retrieveBootstrapStatus() { - return this._TorLauncherProtocolService.TorRetrieveBootstrapStatus(); - }, - - _GetSaveSettingsErrorMessage(aDetails) { - try { - return TorLauncherUtil.getSaveSettingsErrorMessage(aDetails); - } catch (e) { - console.log("GetSaveSettingsErrorMessage error", e); - return "Unexpected Error"; - } - }, - - async setConfWithReply(settings) { - let result = false; - const error = {}; - try { - result = await this._TorLauncherProtocolService.TorSetConfWithReply( - settings, - error - ); - } catch (e) { - console.log("TorSetConfWithReply error", e); - error.details = this._GetSaveSettingsErrorMessage(e.message); - } - return { result, error }; - }, - - isBootstrapDone() { - return this._TorProcessService.mIsBootstrapDone; - }, - - clearBootstrapError() { - return this._TorProcessService.TorClearBootstrapError(); - }, - - torBootstrapErrorOccurred() { - return this._TorProcessService.TorBootstrapErrorOccurred; - }, - - _torBootstrapDebugSetError() { - this._TorProcessService._TorSetBootstrapErrorForDebug(); - }, - - // Resolves to null if ok, or an error otherwise - async connect() { - const kTorConfKeyDisableNetwork = "DisableNetwork"; - const settings = {}; - settings[kTorConfKeyDisableNetwork] = false; - const { result, error } = await this.setConfWithReply(settings); - if (!result) { - return error; - } - try { - await this.sendCommand("SAVECONF"); - this.clearBootstrapError(); - this.retrieveBootstrapStatus(); - } catch (e) { - return error; - } - return null; - }, - - torLogHasWarnOrErr() { - return this._TorLauncherProtocolService.TorLogHasWarnOrErr; - }, - - async torStopBootstrap() { - // Tell tor to disable use of the network; this should stop the bootstrap - // process. - const kErrorPrefix = "Setting DisableNetwork=1 failed: "; - try { - let settings = {}; - settings.DisableNetwork = true; - const { result, error } = await this.setConfWithReply(settings); - if (!result) { - console.log( - `Error stopping bootstrap ${kErrorPrefix} ${error.details}` - ); - } - } catch (e) { - console.log(`Error stopping bootstrap ${kErrorPrefix} ${e}`); - } - this.retrieveBootstrapStatus(); - }, - - get torProcessStatus() { - if (this._TorProcessService) { - return this._TorProcessService.TorProcessStatus; - } - return TorProcessStatus.Unknown; - }, -}; -TorProtocolService.init(); - -// modeled after XMLHttpRequest -// nicely encapsulates the observer register/unregister logic -class TorBootstrapRequest { - constructor() { - // number of ms to wait before we abandon the bootstrap attempt - // a value of 0 implies we never wait - this.timeout = 0; - // callbacks for bootstrap process status updates - this.onbootstrapstatus = (progress, status) => {}; - this.onbootstrapcomplete = () => {}; - this.onbootstraperror = (message, details) => {}; - - // internal resolve() method for bootstrap - this._bootstrapPromiseResolve = null; - this._bootstrapPromise = null; - this._timeoutID = null; - } - - async observe(subject, topic, data) { - const obj = subject?.wrappedJSObject; - switch (topic) { - case TorTopics.BootstrapStatus: { - const progress = obj.PROGRESS; - const status = TorLauncherUtil.getLocalizedBootstrapStatus(obj, "TAG"); - if (this.onbootstrapstatus) { - this.onbootstrapstatus(progress, status); - } - if (progress === 100) { - if (this.onbootstrapcomplete) { - this.onbootstrapcomplete(); - } - this._bootstrapPromiseResolve(true); - clearTimeout(this._timeoutID); - } - - break; - } - case TorTopics.BootstrapError: { - // first stop our bootstrap timeout before handling the error - clearTimeout(this._timeoutID); - - await TorProtocolService.torStopBootstrap(); - - const message = obj.message; - const details = obj.details; - if (this.onbootstraperror) { - this.onbootstraperror(message, details); - } - this._bootstrapPromiseResolve(false); - break; - } - } - } - - // resolves 'true' if bootstrap succeeds, false otherwise - bootstrap() { - if (this._bootstrapPromise) { - return this._bootstrapPromise; - } - - this._bootstrapPromise = new Promise((resolve, reject) => { - this._bootstrapPromiseResolve = resolve; - - // register ourselves to listen for bootstrap events - Services.obs.addObserver(this, TorTopics.BootstrapStatus); - Services.obs.addObserver(this, TorTopics.BootstrapError); - - // optionally cancel bootstrap after a given timeout - if (this.timeout > 0) { - this._timeoutID = setTimeout(async () => { - await TorProtocolService.torStopBootstrap(); - if (this.onbootstraperror) { - this.onbootstraperror( - "Tor Bootstrap process timed out", - `Bootstrap attempt abandoned after waiting ${this.timeout} ms` - ); - } - this._bootstrapPromiseResolve(false); - }, this.timeout); - } - - // wait for bootstrapping to begin and maybe handle error - TorProtocolService.connect() - .then(async err => { - if (!err) { - return; - } - - clearTimeout(this._timeoutID); - await TorProtocolService.torStopBootstrap(); - - const message = err.message; - const details = err.details; - if (this.onbootstraperror) { - this.onbootstraperror(message, details); - } - this._bootstrapPromiseResolve(false); - }) - .catch(err => { - // Currently, TorProtocolService.connect() should never throw - reject(err); - }); - }).finally(() => { - // and remove ourselves once bootstrap is resolved - Services.obs.removeObserver(this, TorTopics.BootstrapStatus); - Services.obs.removeObserver(this, TorTopics.BootstrapError); - }); - - return this._bootstrapPromise; - } - - async cancel() { - clearTimeout(this._timeoutID); - - await TorProtocolService.torStopBootstrap(); - - this._bootstrapPromiseResolve(false); - } -} diff --git a/browser/modules/TorSettings.jsm b/browser/modules/TorSettings.jsm index 57a2a80c7d3f..4084ee71a1ce 100644 --- a/browser/modules/TorSettings.jsm +++ b/browser/modules/TorSettings.jsm @@ -11,14 +11,12 @@ var EXPORTED_SYMBOLS = [
const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
-const { TorProtocolService, TorProcessStatus } = ChromeUtils.import( - "resource:///modules/TorProtocolService.jsm" +const { TorMonitorService } = ChromeUtils.import( + "resource://gre/modules/TorMonitorService.jsm" +); +const { TorProtocolService } = ChromeUtils.import( + "resource://gre/modules/TorProtocolService.jsm" ); - -/* Browser observer topics */ -const BrowserTopics = Object.freeze({ - ProfileAfterChange: "profile-after-change", -});
/* tor-launcher observer topics */ const TorTopics = Object.freeze({ @@ -290,7 +288,7 @@ const TorSettings = (() => {
/* load or init our settings, and register observers */ init() { - if (TorProtocolService.ownsTorDaemon) { + if (TorMonitorService.ownsTorDaemon) { // if the settings branch exists, load settings from prefs if (Services.prefs.getBoolPref(TorSettingsPrefs.enabled, false)) { this.loadFromPrefs(); @@ -298,8 +296,11 @@ const TorSettings = (() => { // otherwise load defaults this._settings = this.defaultSettings(); } - Services.obs.addObserver(this, BrowserTopics.ProfileAfterChange); Services.obs.addObserver(this, TorTopics.ProcessIsReady); + + if (TorMonitorService.isRunning) { + handleProcessReady(); + } } },
@@ -316,12 +317,6 @@ const TorSettings = (() => { };
switch (topic) { - case BrowserTopics.ProfileAfterChange: - Services.obs.removeObserver(this, BrowserTopics.ProfileAfterChange); - if (TorProtocolService.torProcessStatus == TorProcessStatus.Running) { - await handleProcessReady(); - } - break; case TorTopics.ProcessIsReady: Services.obs.removeObserver(this, TorTopics.ProcessIsReady); await handleProcessReady(); diff --git a/browser/modules/moz.build b/browser/modules/moz.build index 98caa91ee6f4..b9158588b812 100644 --- a/browser/modules/moz.build +++ b/browser/modules/moz.build @@ -147,8 +147,6 @@ EXTRA_JS_MODULES += [ "TabsList.jsm", "TabUnloader.jsm", "TorConnect.jsm", - "TorProcessService.jsm", - "TorProtocolService.jsm", "TorSettings.jsm", "TorStrings.jsm", "TransientPrefs.jsm", diff --git a/toolkit/components/processsingleton/MainProcessSingleton.jsm b/toolkit/components/processsingleton/MainProcessSingleton.jsm index 4afa7f118a72..f99dd538ec7c 100644 --- a/toolkit/components/processsingleton/MainProcessSingleton.jsm +++ b/toolkit/components/processsingleton/MainProcessSingleton.jsm @@ -20,8 +20,6 @@ MainProcessSingleton.prototype = { // Imported for side-effects. ChromeUtils.import("resource://gre/modules/CustomElementsListener.jsm");
- // FIXME: Is this import really necessary? - ChromeUtils.import("resource:///modules/TorSettings.jsm"); ChromeUtils.import("resource:///modules/TorConnect.jsm");
Services.ppmm.loadProcessScript( diff --git a/toolkit/components/tor-launcher/TorStartupService.jsm b/toolkit/components/tor-launcher/TorStartupService.jsm index 9c27b34b2f6f..539c599aec62 100644 --- a/toolkit/components/tor-launcher/TorStartupService.jsm +++ b/toolkit/components/tor-launcher/TorStartupService.jsm @@ -22,6 +22,17 @@ ChromeUtils.defineModuleGetter( "resource://gre/modules/TorProtocolService.jsm" );
+ChromeUtils.defineModuleGetter( + this, + "TorConnect", + "resource:///modules/TorConnect.jsm" +); +ChromeUtils.defineModuleGetter( + this, + "TorSettings", + "resource:///modules/TorSettings.jsm" +); + /* Browser observer topis */ const BrowserTopics = Object.freeze({ ProfileAfterChange: "profile-after-change", @@ -53,6 +64,9 @@ class TorStartupService { await TorProtocolService.init(); TorMonitorService.init();
+ TorSettings.init(); + TorConnect.init(); + try { TorLauncherUtil.removeMeekAndMoatHelperProfiles(); } catch (e) {