richard pushed to branch tor-browser-115.2.1esr-13.0-1 at The Tor Project / Applications / Tor Browser
Commits:
- 
de6b3303
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 - 
1a422b66
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 - 
7c864096
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 - 
6662e2dd
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 - 
d66b44eb
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 - 
6f0199ab
by Henry Wilkes at 2023-09-19T01:24:50+00:00
 
10 changed files:
- browser/base/content/browser-siteIdentity.js
 - browser/base/content/browser.js
 - browser/components/onionservices/content/authPreferences.js
 - browser/components/onionservices/content/authPrompt.js
 - − browser/components/onionservices/content/authUtil.jsm
 - browser/components/onionservices/jar.mn
 - browser/components/torcircuit/content/torCircuitPanel.js
 - browser/modules/TorStrings.jsm
 - + browser/modules/TorUIUtils.sys.mjs
 - browser/modules/moz.build
 
Changes:
| ... | ... | @@ -729,7 +729,15 @@ var gIdentityHandler = { | 
| 729 | 729 |        host = this._uri.specIgnoringRef;
 | 
| 730 | 730 |      }
 | 
| 731 | 731 | |
| 732 | -    return host;
 | 
|
| 732 | +    // For tor browser we want to shorten onion addresses for the site identity
 | 
|
| 733 | +    // panel (gIdentityHandler) to match the circuit display and the onion
 | 
|
| 734 | +    // authorization panel.
 | 
|
| 735 | +    // See tor-browser#42091 and tor-browser#41600.
 | 
|
| 736 | +    // This will also shorten addresses for other consumers of this method,
 | 
|
| 737 | +    // which includes the permissions panel (gPermissionPanel) and the
 | 
|
| 738 | +    // protections panel (gProtectionsHandler), although the latter is hidden in
 | 
|
| 739 | +    // tor browser.
 | 
|
| 740 | +    return TorUIUtils.shortenOnionAddress(host);
 | 
|
| 733 | 741 |    },
 | 
| 734 | 742 | |
| 735 | 743 |    /**
 | 
| ... | ... | @@ -67,6 +67,7 @@ ChromeUtils.defineESModuleGetters(this, { | 
| 67 | 67 |      "resource:///modules/firefox-view-tabs-setup-manager.sys.mjs",
 | 
| 68 | 68 |    TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.sys.mjs",
 | 
| 69 | 69 |    TorDomainIsolator: "resource://gre/modules/TorDomainIsolator.sys.mjs",
 | 
| 70 | +  TorUIUtils: "resource:///modules/TorUIUtils.sys.mjs",
 | 
|
| 70 | 71 |    TranslationsParent: "resource://gre/actors/TranslationsParent.sys.mjs",
 | 
| 71 | 72 |    UITour: "resource:///modules/UITour.sys.mjs",
 | 
| 72 | 73 |    UpdateUtils: "resource://gre/modules/UpdateUtils.sys.mjs",
 | 
| ... | ... | @@ -42,10 +42,11 @@ const _OnionServicesAuthPreferences_ = { | 
| 42 | 42 | |
| 43 | 43 |      elem = groupbox.querySelector(this.selector.learnMore);
 | 
| 44 | 44 |      elem.setAttribute("value", TorStrings.onionServices.learnMore);
 | 
| 45 | -    elem.setAttribute("href", TorStrings.onionServices.learnMoreURL);
 | 
|
| 46 | -    if (TorStrings.onionServices.learnMoreURL.startsWith("about:")) {
 | 
|
| 47 | -      elem.setAttribute("useoriginprincipal", "true");
 | 
|
| 48 | -    }
 | 
|
| 45 | +    elem.setAttribute(
 | 
|
| 46 | +      "href",
 | 
|
| 47 | +      "about:manual#onion-services_onion-service-authentication"
 | 
|
| 48 | +    );
 | 
|
| 49 | +    elem.setAttribute("useoriginprincipal", "true");
 | 
|
| 49 | 50 | |
| 50 | 51 |      elem = groupbox.querySelector(this.selector.savedKeysButton);
 | 
| 51 | 52 |      elem.setAttribute(
 | 
| 1 | -// Copyright (c) 2020, The Tor Project, Inc.
 | 
|
| 1 | +/* eslint-env mozilla/browser-window */
 | 
|
| 2 | 2 | |
| 3 | 3 |  "use strict";
 | 
| 4 | 4 | |
| 5 | -/* globals gBrowser, PopupNotifications, Services, XPCOMUtils */
 | 
|
| 6 | -  | 
|
| 7 | -ChromeUtils.defineESModuleGetters(this, {
 | 
|
| 8 | -  TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs",
 | 
|
| 9 | -});
 | 
|
| 10 | -  | 
|
| 11 | -XPCOMUtils.defineLazyModuleGetters(this, {
 | 
|
| 12 | -  OnionAuthUtil: "chrome://browser/content/onionservices/authUtil.jsm",
 | 
|
| 13 | -  CommonUtils: "resource://services-common/utils.js",
 | 
|
| 14 | -  TorStrings: "resource:///modules/TorStrings.jsm",
 | 
|
| 15 | -});
 | 
|
| 16 | -  | 
|
| 17 | 5 |  const OnionAuthPrompt = (function () {
 | 
| 6 | +  // Only import to our internal scope, rather than the global scope of
 | 
|
| 7 | +  // browser.xhtml.
 | 
|
| 8 | +  const lazy = {};
 | 
|
| 9 | +  ChromeUtils.defineESModuleGetters(lazy, {
 | 
|
| 10 | +    TorProviderBuilder: "resource://gre/modules/TorProviderBuilder.sys.mjs",
 | 
|
| 11 | +    CommonUtils: "resource://services-common/utils.sys.mjs",
 | 
|
| 12 | +  });
 | 
|
| 13 | +  XPCOMUtils.defineLazyModuleGetters(lazy, {
 | 
|
| 14 | +    TorStrings: "resource:///modules/TorStrings.jsm",
 | 
|
| 15 | +  });
 | 
|
| 16 | +  | 
|
| 18 | 17 |    // OnionServicesAuthPrompt objects run within the main/chrome process.
 | 
| 19 | 18 |    // aReason is the topic passed within the observer notification that is
 | 
| 20 | 19 |    // causing this auth prompt to be displayed.
 | 
| ... | ... | @@ -25,11 +24,16 @@ const _OnionAuthPrompt_ = (function () { | 
| 25 | 24 |      this._onionHostname = aOnionName;
 | 
| 26 | 25 |    }
 | 
| 27 | 26 | |
| 27 | +  const topics = {
 | 
|
| 28 | +    clientAuthMissing: "tor-onion-services-clientauth-missing",
 | 
|
| 29 | +    clientAuthIncorrect: "tor-onion-services-clientauth-incorrect",
 | 
|
| 30 | +  };
 | 
|
| 31 | +  | 
|
| 28 | 32 |    OnionServicesAuthPrompt.prototype = {
 | 
| 29 | 33 |      show(aWarningMessage) {
 | 
| 30 | 34 |        let mainAction = {
 | 
| 31 | -        label: TorStrings.onionServices.authPrompt.done,
 | 
|
| 32 | -        accessKey: TorStrings.onionServices.authPrompt.doneAccessKey,
 | 
|
| 35 | +        label: lazy.TorStrings.onionServices.authPrompt.done,
 | 
|
| 36 | +        accessKey: lazy.TorStrings.onionServices.authPrompt.doneAccessKey,
 | 
|
| 33 | 37 |          leaveOpen: true, // Callback is responsible for closing the notification.
 | 
| 34 | 38 |          callback: this._onDone.bind(this),
 | 
| 35 | 39 |        };
 | 
| ... | ... | @@ -68,9 +72,9 @@ const _OnionAuthPrompt_ = (function () { | 
| 68 | 72 | |
| 69 | 73 |        this._prompt = PopupNotifications.show(
 | 
| 70 | 74 |          this._browser,
 | 
| 71 | -        OnionAuthUtil.domid.notification,
 | 
|
| 75 | +        "tor-clientauth",
 | 
|
| 72 | 76 |          "",
 | 
| 73 | -        OnionAuthUtil.domid.anchor,
 | 
|
| 77 | +        "tor-clientauth-notification-icon",
 | 
|
| 74 | 78 |          mainAction,
 | 
| 75 | 79 |          [cancelAction],
 | 
| 76 | 80 |          options
 | 
| ... | ... | @@ -79,52 +83,38 @@ const _OnionAuthPrompt_ = (function () { | 
| 79 | 83 | |
| 80 | 84 |      _onPromptShowing(aWarningMessage) {
 | 
| 81 | 85 |        let xulDoc = this._browser.ownerDocument;
 | 
| 82 | -      let descElem = xulDoc.getElementById(OnionAuthUtil.domid.description);
 | 
|
| 86 | +      let descElem = xulDoc.getElementById("tor-clientauth-notification-desc");
 | 
|
| 83 | 87 |        if (descElem) {
 | 
| 84 | 88 |          // Handle replacement of the onion name within the localized
 | 
| 85 | 89 |          // string ourselves so we can show the onion name as bold text.
 | 
| 86 | 90 |          // We do this by splitting the localized string and creating
 | 
| 87 | 91 |          // several HTML <span> elements.
 | 
| 88 | -        while (descElem.firstChild) {
 | 
|
| 89 | -          descElem.firstChild.remove();
 | 
|
| 90 | -        }
 | 
|
| 92 | +        const fmtString = lazy.TorStrings.onionServices.authPrompt.description;
 | 
|
| 93 | +        const [prefix, suffix] = fmtString.split("%S");
 | 
|
| 91 | 94 | |
| 92 | -        let fmtString = TorStrings.onionServices.authPrompt.description;
 | 
|
| 93 | -        let prefix = "";
 | 
|
| 94 | -        let suffix = "";
 | 
|
| 95 | -        const kToReplace = "%S";
 | 
|
| 96 | -        let idx = fmtString.indexOf(kToReplace);
 | 
|
| 97 | -        if (idx < 0) {
 | 
|
| 98 | -          prefix = fmtString;
 | 
|
| 99 | -        } else {
 | 
|
| 100 | -          prefix = fmtString.substring(0, idx);
 | 
|
| 101 | -          suffix = fmtString.substring(idx + kToReplace.length);
 | 
|
| 102 | -        }
 | 
|
| 95 | +        const domainEl = xulDoc.createElement("span");
 | 
|
| 96 | +        domainEl.id = "tor-clientauth-notification-onionname";
 | 
|
| 97 | +        domainEl.textContent = TorUIUtils.shortenOnionAddress(
 | 
|
| 98 | +          this._onionHostname
 | 
|
| 99 | +        );
 | 
|
| 103 | 100 | |
| 104 | -        const kHTMLNS = "http://www.w3.org/1999/xhtml";
 | 
|
| 105 | -        let span = xulDoc.createElementNS(kHTMLNS, "span");
 | 
|
| 106 | -        span.textContent = prefix;
 | 
|
| 107 | -        descElem.appendChild(span);
 | 
|
| 108 | -        span = xulDoc.createElementNS(kHTMLNS, "span");
 | 
|
| 109 | -        span.id = OnionAuthUtil.domid.onionNameSpan;
 | 
|
| 110 | -        span.textContent = this._onionHostname;
 | 
|
| 111 | -        descElem.appendChild(span);
 | 
|
| 112 | -        span = xulDoc.createElementNS(kHTMLNS, "span");
 | 
|
| 113 | -        span.textContent = suffix;
 | 
|
| 114 | -        descElem.appendChild(span);
 | 
|
| 101 | +        descElem.replaceChildren(prefix, domainEl, suffix);
 | 
|
| 115 | 102 |        }
 | 
| 116 | 103 | |
| 117 | 104 |        // Set "Learn More" label and href.
 | 
| 118 | -      let learnMoreElem = xulDoc.getElementById(OnionAuthUtil.domid.learnMore);
 | 
|
| 105 | +      let learnMoreElem = xulDoc.getElementById(
 | 
|
| 106 | +        "tor-clientauth-notification-learnmore"
 | 
|
| 107 | +      );
 | 
|
| 119 | 108 |        if (learnMoreElem) {
 | 
| 120 | -        learnMoreElem.setAttribute("value", TorStrings.onionServices.learnMore);
 | 
|
| 109 | +        learnMoreElem.setAttribute(
 | 
|
| 110 | +          "value",
 | 
|
| 111 | +          lazy.TorStrings.onionServices.learnMore
 | 
|
| 112 | +        );
 | 
|
| 121 | 113 |          learnMoreElem.setAttribute(
 | 
| 122 | 114 |            "href",
 | 
| 123 | -          TorStrings.onionServices.learnMoreURL
 | 
|
| 115 | +          "about:manual#onion-services_onion-service-authentication"
 | 
|
| 124 | 116 |          );
 | 
| 125 | -        if (TorStrings.onionServices.learnMoreURL.startsWith("about:")) {
 | 
|
| 126 | -          learnMoreElem.setAttribute("useoriginprincipal", "true");
 | 
|
| 127 | -        }
 | 
|
| 117 | +        learnMoreElem.setAttribute("useoriginprincipal", "true");
 | 
|
| 128 | 118 |        }
 | 
| 129 | 119 | |
| 130 | 120 |        this._showWarning(aWarningMessage);
 | 
| ... | ... | @@ -139,7 +129,7 @@ const _OnionAuthPrompt_ = (function () { | 
| 139 | 129 |        if (keyElem) {
 | 
| 140 | 130 |          keyElem.setAttribute(
 | 
| 141 | 131 |            "placeholder",
 | 
| 142 | -          TorStrings.onionServices.authPrompt.keyPlaceholder
 | 
|
| 132 | +          lazy.TorStrings.onionServices.authPrompt.keyPlaceholder
 | 
|
| 143 | 133 |          );
 | 
| 144 | 134 |          this._boundOnKeyFieldKeyPress = this._onKeyFieldKeyPress.bind(this);
 | 
| 145 | 135 |          this._boundOnKeyFieldInput = this._onKeyFieldInput.bind(this);
 | 
| ... | ... | @@ -186,14 +176,14 @@ const _OnionAuthPrompt_ = (function () { | 
| 186 | 176 | |
| 187 | 177 |        const base64key = this._keyToBase64(keyElem.value);
 | 
| 188 | 178 |        if (!base64key) {
 | 
| 189 | -        this._showWarning(TorStrings.onionServices.authPrompt.invalidKey);
 | 
|
| 179 | +        this._showWarning(lazy.TorStrings.onionServices.authPrompt.invalidKey);
 | 
|
| 190 | 180 |          return;
 | 
| 191 | 181 |        }
 | 
| 192 | 182 | |
| 193 | 183 |        this._prompt.remove();
 | 
| 194 | 184 | |
| 195 | 185 |        const controllerFailureMsg =
 | 
| 196 | -        TorStrings.onionServices.authPrompt.failedToSetKey;
 | 
|
| 186 | +        lazy.TorStrings.onionServices.authPrompt.failedToSetKey;
 | 
|
| 197 | 187 |        try {
 | 
| 198 | 188 |          // ^(subdomain.)*onionserviceid.onion$ (case-insensitive)
 | 
| 199 | 189 |          const onionServiceIdRegExp =
 | 
| ... | ... | @@ -205,7 +195,7 @@ const _OnionAuthPrompt_ = (function () { | 
| 205 | 195 | |
| 206 | 196 |          const checkboxElem = this._getCheckboxElement();
 | 
| 207 | 197 |          const isPermanent = checkboxElem && checkboxElem.checked;
 | 
| 208 | -        const provider = await TorProviderBuilder.build();
 | 
|
| 198 | +        const provider = await lazy.TorProviderBuilder.build();
 | 
|
| 209 | 199 |          await provider.onionAuthAdd(onionServiceId, base64key, isPermanent);
 | 
| 210 | 200 |          // Success! Reload the page.
 | 
| 211 | 201 |          this._browser.sendMessageToActor("Browser:Reload", {}, "BrowserTab");
 | 
| ... | ... | @@ -227,7 +217,7 @@ const _OnionAuthPrompt_ = (function () { | 
| 227 | 217 |        // this authentication prompt.
 | 
| 228 | 218 |        const failedURI = this._failedURI.spec;
 | 
| 229 | 219 |        const errorCode =
 | 
| 230 | -        this._reasonForPrompt === OnionAuthUtil.topic.clientAuthMissing
 | 
|
| 220 | +        this._reasonForPrompt === topics.clientAuthMissing
 | 
|
| 231 | 221 |            ? Cr.NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH
 | 
| 232 | 222 |            : Cr.NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH;
 | 
| 233 | 223 |        const io =
 | 
| ... | ... | @@ -245,19 +235,17 @@ const _OnionAuthPrompt_ = (function () { | 
| 245 | 235 | |
| 246 | 236 |      _getKeyElement() {
 | 
| 247 | 237 |        let xulDoc = this._browser.ownerDocument;
 | 
| 248 | -      return xulDoc.getElementById(OnionAuthUtil.domid.keyElement);
 | 
|
| 238 | +      return xulDoc.getElementById("tor-clientauth-notification-key");
 | 
|
| 249 | 239 |      },
 | 
| 250 | 240 | |
| 251 | 241 |      _getCheckboxElement() {
 | 
| 252 | 242 |        let xulDoc = this._browser.ownerDocument;
 | 
| 253 | -      return xulDoc.getElementById(OnionAuthUtil.domid.checkboxElement);
 | 
|
| 243 | +      return xulDoc.getElementById("tor-clientauth-persistkey-checkbox");
 | 
|
| 254 | 244 |      },
 | 
| 255 | 245 | |
| 256 | 246 |      _showWarning(aWarningMessage) {
 | 
| 257 | 247 |        let xulDoc = this._browser.ownerDocument;
 | 
| 258 | -      let warningElem = xulDoc.getElementById(
 | 
|
| 259 | -        OnionAuthUtil.domid.warningElement
 | 
|
| 260 | -      );
 | 
|
| 248 | +      let warningElem = xulDoc.getElementById("tor-clientauth-warning");
 | 
|
| 261 | 249 |        let keyElem = this._getKeyElement();
 | 
| 262 | 250 |        if (warningElem) {
 | 
| 263 | 251 |          if (aWarningMessage) {
 | 
| ... | ... | @@ -289,7 +277,7 @@ const _OnionAuthPrompt_ = (function () { | 
| 289 | 277 |          // a tor onion-auth file (which uses lowercase).
 | 
| 290 | 278 |          let rawKey;
 | 
| 291 | 279 |          try {
 | 
| 292 | -          rawKey = CommonUtils.decodeBase32(aKeyString.toUpperCase());
 | 
|
| 280 | +          rawKey = lazy.CommonUtils.decodeBase32(aKeyString.toUpperCase());
 | 
|
| 293 | 281 |          } catch (e) {}
 | 
| 294 | 282 | |
| 295 | 283 |          if (rawKey) {
 | 
| ... | ... | @@ -313,24 +301,21 @@ const _OnionAuthPrompt_ = (function () { | 
| 313 | 301 | |
| 314 | 302 |    let retval = {
 | 
| 315 | 303 |      init() {
 | 
| 316 | -      Services.obs.addObserver(this, OnionAuthUtil.topic.clientAuthMissing);
 | 
|
| 317 | -      Services.obs.addObserver(this, OnionAuthUtil.topic.clientAuthIncorrect);
 | 
|
| 304 | +      Services.obs.addObserver(this, topics.clientAuthMissing);
 | 
|
| 305 | +      Services.obs.addObserver(this, topics.clientAuthIncorrect);
 | 
|
| 318 | 306 |      },
 | 
| 319 | 307 | |
| 320 | 308 |      uninit() {
 | 
| 321 | -      Services.obs.removeObserver(this, OnionAuthUtil.topic.clientAuthMissing);
 | 
|
| 322 | -      Services.obs.removeObserver(
 | 
|
| 323 | -        this,
 | 
|
| 324 | -        OnionAuthUtil.topic.clientAuthIncorrect
 | 
|
| 325 | -      );
 | 
|
| 309 | +      Services.obs.removeObserver(this, topics.clientAuthMissing);
 | 
|
| 310 | +      Services.obs.removeObserver(this, topics.clientAuthIncorrect);
 | 
|
| 326 | 311 |      },
 | 
| 327 | 312 | |
| 328 | 313 |      // aSubject is the DOM Window or browser where the prompt should be shown.
 | 
| 329 | 314 |      // aData contains the .onion name.
 | 
| 330 | 315 |      observe(aSubject, aTopic, aData) {
 | 
| 331 | 316 |        if (
 | 
| 332 | -        aTopic != OnionAuthUtil.topic.clientAuthMissing &&
 | 
|
| 333 | -        aTopic != OnionAuthUtil.topic.clientAuthIncorrect
 | 
|
| 317 | +        aTopic != topics.clientAuthMissing &&
 | 
|
| 318 | +        aTopic != topics.clientAuthIncorrect
 | 
|
| 334 | 319 |        ) {
 | 
| 335 | 320 |          return;
 | 
| 336 | 321 |        }
 | 
| 1 | -// Copyright (c) 2020, The Tor Project, Inc.
 | 
|
| 2 | -  | 
|
| 3 | -"use strict";
 | 
|
| 4 | -  | 
|
| 5 | -var EXPORTED_SYMBOLS = ["OnionAuthUtil"];
 | 
|
| 6 | -  | 
|
| 7 | -const _OnionAuthUtil_ = {
 | 
|
| 8 | -  topic: {
 | 
|
| 9 | -    clientAuthMissing: "tor-onion-services-clientauth-missing",
 | 
|
| 10 | -    clientAuthIncorrect: "tor-onion-services-clientauth-incorrect",
 | 
|
| 11 | -  },
 | 
|
| 12 | -  message: {
 | 
|
| 13 | -    authPromptCanceled: "Tor:OnionServicesAuthPromptCanceled",
 | 
|
| 14 | -  },
 | 
|
| 15 | -  domid: {
 | 
|
| 16 | -    anchor: "tor-clientauth-notification-icon",
 | 
|
| 17 | -    notification: "tor-clientauth",
 | 
|
| 18 | -    description: "tor-clientauth-notification-desc",
 | 
|
| 19 | -    learnMore: "tor-clientauth-notification-learnmore",
 | 
|
| 20 | -    onionNameSpan: "tor-clientauth-notification-onionname",
 | 
|
| 21 | -    keyElement: "tor-clientauth-notification-key",
 | 
|
| 22 | -    warningElement: "tor-clientauth-warning",
 | 
|
| 23 | -    checkboxElement: "tor-clientauth-persistkey-checkbox",
 | 
|
| 24 | -  },
 | 
|
| 25 | -}; | 
| ... | ... | @@ -2,7 +2,6 @@ browser.jar: | 
| 2 | 2 |      content/browser/onionservices/authPreferences.css              (content/authPreferences.css)
 | 
| 3 | 3 |      content/browser/onionservices/authPreferences.js               (content/authPreferences.js)
 | 
| 4 | 4 |      content/browser/onionservices/authPrompt.js                    (content/authPrompt.js)
 | 
| 5 | -    content/browser/onionservices/authUtil.jsm                     (content/authUtil.jsm)
 | 
|
| 6 | 5 |      content/browser/onionservices/netError/                        (content/netError/*)
 | 
| 7 | 6 |      content/browser/onionservices/onionservices.css                (content/onionservices.css)
 | 
| 8 | 7 |      content/browser/onionservices/savedKeysDialog.js               (content/savedKeysDialog.js)
 | 
| ... | ... | @@ -408,21 +408,6 @@ var gTorCircuitPanel = { | 
| 408 | 408 |      return this._fallbackStringBundle.formatStringFromName(name, args);
 | 
| 409 | 409 |    },
 | 
| 410 | 410 | |
| 411 | -  /**
 | 
|
| 412 | -   * Shorten the given address if it is an onion address.
 | 
|
| 413 | -   *
 | 
|
| 414 | -   * @param {string} address - The address to shorten.
 | 
|
| 415 | -   *
 | 
|
| 416 | -   * @returns {string} The shortened form of the address, or the address itself
 | 
|
| 417 | -   *   if it was not shortened.
 | 
|
| 418 | -   */
 | 
|
| 419 | -  _shortenOnionAddress(address) {
 | 
|
| 420 | -    if (!address.endsWith(".onion") || address.length <= 22) {
 | 
|
| 421 | -      return address;
 | 
|
| 422 | -    }
 | 
|
| 423 | -    return `${address.slice(0, 7)}…${address.slice(-12)}`;
 | 
|
| 424 | -  },
 | 
|
| 425 | -  | 
|
| 426 | 411 |    /**
 | 
| 427 | 412 |     * Updates the circuit display in the panel to show the current browser data.
 | 
| 428 | 413 |     */
 | 
| ... | ... | @@ -465,12 +450,12 @@ var gTorCircuitPanel = { | 
| 465 | 450 |      this._panelElements.heading.textContent = this._getString(
 | 
| 466 | 451 |        "torbutton.circuit_display.heading",
 | 
| 467 | 452 |        // Only shorten the onion domain if it has no alias.
 | 
| 468 | -      [onionAlias ? domain : this._shortenOnionAddress(domain)]
 | 
|
| 453 | +      [TorUIUtils.shortenOnionAddress(domain)]
 | 
|
| 469 | 454 |      );
 | 
| 470 | 455 | |
| 471 | 456 |      if (onionAlias) {
 | 
| 472 | 457 |        this._panelElements.aliasLink.textContent =
 | 
| 473 | -        this._shortenOnionAddress(onionAlias);
 | 
|
| 458 | +        TorUIUtils.shortenOnionAddress(onionAlias);
 | 
|
| 474 | 459 |        if (scheme === "http" || scheme === "https") {
 | 
| 475 | 460 |          // We assume the same scheme as the current page for the alias, which we
 | 
| 476 | 461 |          // expect to be either http or https.
 | 
| ... | ... | @@ -521,7 +506,8 @@ var gTorCircuitPanel = { | 
| 521 | 506 |      );
 | 
| 522 | 507 | |
| 523 | 508 |      // Set the address that we want to copy.
 | 
| 524 | -    this._panelElements.endItem.textContent = this._shortenOnionAddress(domain);
 | 
|
| 509 | +    this._panelElements.endItem.textContent =
 | 
|
| 510 | +      TorUIUtils.shortenOnionAddress(domain);
 | 
|
| 525 | 511 | |
| 526 | 512 |      // Button description text, depending on whether our first node was a
 | 
| 527 | 513 |      // bridge, or otherwise a guard.
 | 
| ... | ... | @@ -300,7 +300,6 @@ const Loader = { | 
| 300 | 300 | |
| 301 | 301 |      const retval = {
 | 
| 302 | 302 |        learnMore: getString("learnMore", "Learn more"),
 | 
| 303 | -      learnMoreURL: "about:manual#onion-services_onion-service-authentication",
 | 
|
| 304 | 303 |        errorPage: {
 | 
| 305 | 304 |          browser: getString("errorPage.browser", "Browser"),
 | 
| 306 | 305 |          network: getString("errorPage.network", "Network"),
 | 
| 1 | +/**
 | 
|
| 2 | + * Common methods for tor UI components.
 | 
|
| 3 | + */
 | 
|
| 4 | +export const TorUIUtils = {
 | 
|
| 5 | +  /**
 | 
|
| 6 | +   * Shorten the given address if it is an onion address.
 | 
|
| 7 | +   *
 | 
|
| 8 | +   * @param {string} address - The address to shorten.
 | 
|
| 9 | +   *
 | 
|
| 10 | +   * @returns {string} The shortened form of the address, or the address itself
 | 
|
| 11 | +   *   if it was not shortened.
 | 
|
| 12 | +   */
 | 
|
| 13 | +  shortenOnionAddress(address) {
 | 
|
| 14 | +    if (
 | 
|
| 15 | +      // Only shorten ".onion" addresses.
 | 
|
| 16 | +      !address.endsWith(".onion") ||
 | 
|
| 17 | +      // That are not "onion" aliases.
 | 
|
| 18 | +      address.endsWith(".tor.onion") ||
 | 
|
| 19 | +      // And are long.
 | 
|
| 20 | +      address.length <= 21
 | 
|
| 21 | +    ) {
 | 
|
| 22 | +      return address;
 | 
|
| 23 | +    }
 | 
|
| 24 | +    return `${address.slice(0, 6)}…${address.slice(-12)}`;
 | 
|
| 25 | +  },
 | 
|
| 26 | +}; | 
| ... | ... | @@ -152,6 +152,7 @@ EXTRA_JS_MODULES += [ | 
| 152 | 152 |      "TorConnect.sys.mjs",
 | 
| 153 | 153 |      "TorSettings.sys.mjs",
 | 
| 154 | 154 |      "TorStrings.jsm",
 | 
| 155 | +    "TorUIUtils.sys.mjs",
 | 
|
| 155 | 156 |      "TransientPrefs.jsm",
 | 
| 156 | 157 |      "URILoadingHelper.sys.mjs",
 | 
| 157 | 158 |      "webrtcUI.jsm",
 |