[tor-commits] [tor-browser] branch tor-browser-91.10.0esr-11.5-1 updated: fixup! Bug 40458: Implement .tor.onion aliases

gitolite role git at cupani.torproject.org
Fri Jun 24 07:34:50 UTC 2022


This is an automated email from the git hooks/post-receive script.

pierov pushed a commit to branch tor-browser-91.10.0esr-11.5-1
in repository tor-browser.

The following commit(s) were added to refs/heads/tor-browser-91.10.0esr-11.5-1 by this push:
     new 9a5d862212abb fixup! Bug 40458: Implement .tor.onion aliases
9a5d862212abb is described below

commit 9a5d862212abbade74b97e4e3dbe87e09ed9ac67
Author: Pier Angelo Vendrame <pierov at torproject.org>
AuthorDate: Thu Jun 23 17:10:07 2022 +0200

    fixup! Bug 40458: Implement .tor.onion aliases
    
    Bug 41036: Add a preference to disable Onion Aliases
---
 .../components/onionservices/OnionAliasStore.jsm   | 92 ++++++++++++++++------
 modules/libpref/init/StaticPrefList.yaml           |  5 ++
 netwerk/dns/OnionAliasService.cpp                  |  5 +-
 3 files changed, 79 insertions(+), 23 deletions(-)

diff --git a/browser/components/onionservices/OnionAliasStore.jsm b/browser/components/onionservices/OnionAliasStore.jsm
index 059bca8f5a2bf..d5849e4b94289 100644
--- a/browser/components/onionservices/OnionAliasStore.jsm
+++ b/browser/components/onionservices/OnionAliasStore.jsm
@@ -40,6 +40,8 @@ const SECURE_DROP = {
   currentTimestamp: 0,
 };
 
+const kPrefOnionAliasEnabled = "browser.urlbar.onionRewrites.enabled";
+
 // Logger adapted from CustomizableUI.jsm
 const kPrefOnionAliasDebug = "browser.onionalias.debug";
 XPCOMUtils.defineLazyPreferenceGetter(
@@ -299,29 +301,19 @@ class _OnionAliasStore {
 
   async init() {
     await this._loadSettings();
-    const dt = Date.now() - this._lastCheck;
-    let force = false;
-    for (const ch of this._channels.values()) {
-      if (ch.enabled && !ch.currentTimestamp) {
-        // Edited while being offline or some other error happened
-        force = true;
-        break;
-      }
-    }
-    if (dt > _OnionAliasStore.RULESET_CHECK_INTERVAL || force) {
-      log.debug(
-        `Mappings are stale (${dt}), or force check requested (${force}), checking them immediately`
-      );
-      await this._periodicRulesetCheck();
-    } else {
-      this._scheduleCheck(_OnionAliasStore.RULESET_CHECK_INTERVAL - dt);
+    if (this.enabled) {
+      await this._startUpdates();
     }
+    Services.prefs.addObserver(kPrefOnionAliasEnabled, this);
   }
 
   uninit() {
     this._clear();
-    clearTimeout(this._rulesetTimeout);
+    if (this._rulesetTimeout) {
+      clearTimeout(this._rulesetTimeout);
+    }
     this._rulesetTimeout = null;
+    Services.prefs.removeObserver(kPrefOnionAliasEnabled, this);
   }
 
   async getChannels() {
@@ -362,13 +354,16 @@ class _OnionAliasStore {
       this._applyMappings();
       this._saveSettings();
       this._notifyChanges();
-      if (enabled && !channel.currentTimestamp) {
+      if (this.enabled && enabled && !channel.currentTimestamp) {
         this.updateChannel(name);
       }
     }
   }
 
   async updateChannel(name) {
+    if (!this.enabled) {
+      throw Error("Onion Aliases are disabled");
+    }
     const channel = this._channels.get(name);
     if (channel === null) {
       throw Error("Channel not found");
@@ -469,6 +464,10 @@ class _OnionAliasStore {
   }
 
   async _periodicRulesetCheck() {
+    if (!this.enabled) {
+      log.debug("Onion Aliases are disabled, not updating rulesets.");
+      return;
+    }
     log.debug("Begin scheduled ruleset update");
     this._lastCheck = Date.now();
     let anyUpdated = false;
@@ -495,12 +494,46 @@ class _OnionAliasStore {
     this._scheduleCheck(_OnionAliasStore.RULESET_CHECK_INTERVAL);
   }
 
+  async _startUpdates() {
+    // This is a "private" function, so we expect the callers to verify wheter
+    // onion aliases are enabled.
+    // Callees will also do, so we avoid an additional check here.
+    const dt = Date.now() - this._lastCheck;
+    let force = false;
+    for (const ch of this._channels.values()) {
+      if (ch.enabled && !ch.currentTimestamp) {
+        // Edited while being offline or some other error happened
+        force = true;
+        break;
+      }
+    }
+    if (dt > _OnionAliasStore.RULESET_CHECK_INTERVAL || force) {
+      log.debug(
+        `Mappings are stale (${dt}), or force check requested (${force}), checking them immediately`
+      );
+      await this._periodicRulesetCheck();
+    } else {
+      this._scheduleCheck(_OnionAliasStore.RULESET_CHECK_INTERVAL - dt);
+    }
+  }
+
   _scheduleCheck(dt) {
+    if (this._rulesetTimeout) {
+      log.warn("The previous update timeout was not null");
+      clearTimeout(this._rulesetTimeout);
+    }
+    if (!this.enabled) {
+      log.warn(
+        "Ignoring the scheduling of a new check because the Onion Alias feature is currently disabled."
+      );
+      this._rulesetTimeout = null;
+      return;
+    }
     log.debug(`Scheduling ruleset update in ${dt}`);
-    this._rulesetTimeout = setTimeout(
-      this._periodicRulesetCheck.bind(this),
-      dt
-    );
+    this._rulesetTimeout = setTimeout(() => {
+      this._rulesetTimeout = null;
+      this._periodicRulesetCheck();
+    }, dt);
   }
 
   _notifyChanges() {
@@ -509,6 +542,21 @@ class _OnionAliasStore {
       OnionAliasStoreTopics.ChannelsChanged
     );
   }
+
+  get enabled() {
+    return Services.prefs.getBoolPref(kPrefOnionAliasEnabled, true);
+  }
+
+  observe(aSubject, aTopic, aData) {
+    if (aTopic === "nsPref:changed") {
+      if (this.enabled) {
+        this._startUpdates();
+      } else if (this._rulesetTimeout) {
+        clearTimeout(this._rulesetTimeout);
+        this._rulesetTimeout = null;
+      }
+    }
+  }
 }
 
 const OnionAliasStore = new _OnionAliasStore();
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index b3e93c5443969..243585deecbf7 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -1338,6 +1338,11 @@
   value: true
   mirror: always
 
+- name: browser.urlbar.onionRewrites.enabled
+  type: RelaxedAtomicBool
+  value: true
+  mirror: always
+
 - name: browser.viewport.desktopWidth
   type: RelaxedAtomicInt32
   value: 980
diff --git a/netwerk/dns/OnionAliasService.cpp b/netwerk/dns/OnionAliasService.cpp
index 5140f4fe0d833..a23bf93cee8b0 100644
--- a/netwerk/dns/OnionAliasService.cpp
+++ b/netwerk/dns/OnionAliasService.cpp
@@ -1,5 +1,7 @@
 #include "torproject/OnionAliasService.h"
 
+#include "mozilla/StaticPrefs_browser.h"
+
 #include "nsUnicharUtils.h"
 
 /**
@@ -74,7 +76,8 @@ NS_IMETHODIMP
 OnionAliasService::GetOnionAlias(const nsACString& aShortHostname, nsACString& aLongHostname)
 {
   aLongHostname = aShortHostname;
-  if (StringEndsWith(aShortHostname, ".tor.onion"_ns)) {
+  if (mozilla::StaticPrefs::browser_urlbar_onionRewrites_enabled() &&
+      StringEndsWith(aShortHostname, ".tor.onion"_ns)) {
     nsAutoCString* alias = nullptr;
     // We want to keep the string stored in the map alive at least until we
     // finish to copy it to the output parameter.

-- 
To stop receiving notification emails like this one, please contact
the administrator of this repository.


More information about the tor-commits mailing list