[tbb-commits] [Git][tpo/applications/tor-browser][tor-browser-115.5.0esr-13.5-1] 6 commits: fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.

richard (@richard) git at gitlab.torproject.org
Wed Dec 6 15:43:22 UTC 2023



richard pushed to branch tor-browser-115.5.0esr-13.5-1 at The Tor Project / Applications / Tor Browser


Commits:
9d6ca8ac by Pier Angelo Vendrame at 2023-12-05T11:00:25+01:00
fixup! Bug 3455: Add DomainIsolator, for isolating circuit by domain.

Collect the browsers also on Android.

- - - - -
9e239230 by Pier Angelo Vendrame at 2023-12-05T11:08:42+01:00
fixup! Bug 40597: Implement TorSettings module

Moved the creation of Meek credentials to a function on its own that we
will reuse also with the Android version of MeekTransport.

- - - - -
6a649d7f by Pier Angelo Vendrame at 2023-12-05T11:25:06+01:00
fixup! Bug 40933: Add tor-launcher functionality

Store the SOCKS settings as a member, so that we can customize them if
needed before applying them.

Also, cleanup the public interface of TorProcess.
E.g., removed TorProcess.connectionWorked, since we do not use this
information anymore.

Finally, added a TorLauncherUtil.isAndroid.

- - - - -
1ad1d839 by Pier Angelo Vendrame at 2023-12-05T13:48:35+01:00
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser

HTML-ize about:torconnect.

Changed file extension, updated the HTML tag, removed short-tags on tags
that are expected to have a closing tag.
Also, removed the preprocessor and moved the onion pattern to this
commit, since it is used only here.

- - - - -
fbd5b4bb by Pier Angelo Vendrame at 2023-12-05T13:48:42+01:00
fixup! Bug 2176: Rebrand Firefox to TorBrowser

Move the onion pattern files to the commit of about:torconnect.

- - - - -
3649cc3f by Pier Angelo Vendrame at 2023-12-05T18:48:25+01:00
Temporary changes to about:torconnect for Android.

We are planning of tempoorarily using about:torconnect on Android, until
the native UX is ready.

- - - - -


14 changed files:

- docshell/base/nsAboutRedirector.cpp
- toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs
- toolkit/components/tor-launcher/TorLauncherUtil.sys.mjs
- toolkit/components/tor-launcher/TorProcess.sys.mjs
- toolkit/components/tor-launcher/TorProvider.sys.mjs
- toolkit/components/torconnect/content/aboutTorConnect.css
- toolkit/components/torconnect/content/aboutTorConnect.xhtml → toolkit/components/torconnect/content/aboutTorConnect.html
- toolkit/components/torconnect/content/aboutTorConnect.js
- toolkit/themes/shared/onionPattern.svg → toolkit/components/torconnect/content/onion-pattern.svg
- toolkit/components/torconnect/jar.mn
- toolkit/modules/Moat.sys.mjs
- toolkit/themes/shared/minimal-toolkit.jar.inc.mn
- − toolkit/themes/shared/onionPattern.css
- − toolkit/themes/shared/onionPattern.inc.xhtml


Changes:

=====================================
docshell/base/nsAboutRedirector.cpp
=====================================
@@ -169,7 +169,7 @@ static const RedirEntry kRedirMap[] = {
 #endif
     {"telemetry", "chrome://global/content/aboutTelemetry.xhtml",
      nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::IS_SECURE_CHROME_UI},
-    {"torconnect", "chrome://global/content/torconnect/aboutTorConnect.xhtml",
+    {"torconnect", "chrome://global/content/torconnect/aboutTorConnect.html",
      nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
          nsIAboutModule::URI_CAN_LOAD_IN_CHILD | nsIAboutModule::ALLOW_SCRIPT |
          nsIAboutModule::HIDE_FROM_ABOUTABOUT |


=====================================
toolkit/components/tor-launcher/TorDomainIsolator.sys.mjs
=====================================
@@ -475,9 +475,19 @@ class TorDomainIsolatorImpl {
    * @returns {MozBrowser?} The browser the channel is associated to
    */
   #getBrowserForChannel(channel) {
+    const currentBrowser =
+      channel.loadInfo.browsingContext?.topChromeWindow?.browser;
+    if (
+      channel.loadInfo.browsingContext &&
+      currentBrowser?.browsingContext === channel.loadInfo.browsingContext
+    ) {
+      // Android has only one browser, and does not have the browsers property.
+      return currentBrowser;
+    }
     const browsers =
       channel.loadInfo.browsingContext?.topChromeWindow?.gBrowser?.browsers;
     if (!browsers || !channel.loadInfo.browsingContext?.browserId) {
+      logger.debug("Missing data to associate to a browser", channel.loadInfo);
       return null;
     }
     for (const browser of browsers) {


=====================================
toolkit/components/tor-launcher/TorLauncherUtil.sys.mjs
=====================================
@@ -325,6 +325,10 @@ class TorFile {
 }
 
 export const TorLauncherUtil = Object.freeze({
+  get isAndroid() {
+    return Services.appinfo.OS === "Android";
+  },
+
   get isMac() {
     return Services.appinfo.OS === "Darwin";
   },


=====================================
toolkit/components/tor-launcher/TorProcess.sys.mjs
=====================================
@@ -33,8 +33,6 @@ export class TorProcess {
   #args = [];
   #subprocess = null;
   #status = TorProcessStatus.Unknown;
-  // Have we ever made a connection on the control port?
-  #didConnectToTorControlPort = false;
 
   onExit = exitCode => {};
 
@@ -69,10 +67,6 @@ export class TorProcess {
     }
   }
 
-  get status() {
-    return this.#status;
-  }
-
   get isRunning() {
     return (
       this.#status === TorProcessStatus.Starting ||
@@ -102,7 +96,6 @@ export class TorProcess {
       }
 
       this.#status = TorProcessStatus.Starting;
-      this.#didConnectToTorControlPort = false;
 
       // useful for simulating slow tor daemon launch
       const kPrefTorDaemonLaunchDelay = "extensions.torlauncher.launch_delay";
@@ -155,13 +148,6 @@ export class TorProcess {
     this.#status = TorProcessStatus.Exited;
   }
 
-  // The owner of the process can use this function to tell us that they
-  // successfully connected to the control port. This information will be used
-  // only to decide which text to show in the confirmation dialog if tor exits.
-  connectionWorked() {
-    this.#didConnectToTorControlPort = true;
-  }
-
   async #dumpStdout() {
     let string;
     while (
@@ -201,20 +187,6 @@ export class TorProcess {
   #processExitedUnexpectedly(exitCode) {
     this.#subprocess = null;
     this.#status = TorProcessStatus.Exited;
-    // FIXME: We can probably drop #didConnectToTorControlPort and use only one
-    // callback. Then we can let the provider actually distinguish between the
-    // cases.
-    if (!this.#didConnectToTorControlPort) {
-      logger.warn("Tor exited before we could connect to its control port.");
-      // tor might be misconfigured, because we could never connect to it.
-      // Two instances of Tor Browser trying to use the same port numbers is
-      // also a typical scenario for this.
-      // This might happen very early, before the browser UI is actually
-      // available. So, we will tell the process owner that the process exited,
-      // without trying to restart it.
-      this.onExit(exitCode);
-      return;
-    }
     logger.warn("Tor exited suddenly.");
     this.onExit(exitCode);
   }


=====================================
toolkit/components/tor-launcher/TorProvider.sys.mjs
=====================================
@@ -35,6 +35,15 @@ const logger = new ConsoleAPI({
  * @property {string=} host The host to connect for a TCP control port
  * @property {number=} port The port number to use for a TCP control port
  */
+/**
+ * @typedef {object} SocksSettings An object that includes the proxy settings to
+ * be configured in the browser.
+ * @property {boolean=} transproxy If true, no proxy is configured
+ * @property {nsIFile=} ipcFile The nsIFile object with the path to a Unix
+ * socket to use for an IPC proxy
+ * @property {string=} host The host to connect for a TCP proxy
+ * @property {number=} port The port number to use for a TCP proxy
+ */
 /**
  * @typedef {object} LogEntry An object with a log message
  * @property {Date} date The date at which we received the message
@@ -111,6 +120,13 @@ export class TorProvider {
    */
   #torProcess = null;
 
+  /**
+   * The settings for the SOCKS proxy.
+   *
+   * @type {SocksSettings?}
+   */
+  #socksSettings = null;
+
   /**
    * The logs we received over the control port.
    * We store a finite number of log entries which can be configured with
@@ -165,8 +181,9 @@ export class TorProvider {
   async init() {
     logger.debug("Initializing the Tor provider.");
 
-    const socksSettings = TorLauncherUtil.getPreferredSocksConfiguration();
-    logger.debug("Requested SOCKS configuration", socksSettings);
+    // These settings might be customized in the following steps.
+    this.#socksSettings = TorLauncherUtil.getPreferredSocksConfiguration();
+    logger.debug("Requested SOCKS configuration", this.#socksSettings);
 
     try {
       await this.#setControlPortConfiguration();
@@ -175,11 +192,11 @@ export class TorProvider {
       throw e;
     }
 
-    if (socksSettings.transproxy) {
+    if (this.#socksSettings.transproxy) {
       logger.info("Transparent proxy required, not starting a Tor daemon.");
     } else if (this.ownsTorDaemon) {
       try {
-        await this.#startDaemon(socksSettings);
+        await this.#startDaemon();
       } catch (e) {
         logger.error("Failed to start the tor daemon", e);
         throw e;
@@ -197,8 +214,7 @@ export class TorProvider {
       throw e;
     }
 
-    // We do not customize SOCKS settings, at least for now.
-    TorLauncherUtil.setProxyConfiguration(socksSettings);
+    TorLauncherUtil.setProxyConfiguration(this.#socksSettings);
 
     logger.info("The Tor provider is ready.");
 
@@ -464,7 +480,7 @@ export class TorProvider {
 
   // Process management
 
-  async #startDaemon(socksSettings) {
+  async #startDaemon() {
     // TorProcess should be instanced once, then always reused and restarted
     // only through the prompt it exposes when the controlled process dies.
     if (this.#torProcess) {
@@ -476,7 +492,7 @@ export class TorProvider {
 
     this.#torProcess = new lazy.TorProcess(
       this.#controlPortSettings,
-      socksSettings
+      this.#socksSettings
     );
     // Use a closure instead of bind because we reassign #cancelConnection.
     // Also, we now assign an exit handler that cancels the first connection,
@@ -619,7 +635,6 @@ export class TorProvider {
         }
         this.#openControlPort()
           .then(controller => {
-            this.#torProcess?.connectionWorked();
             this.#cancelConnection = () => {};
             // The cancel function should have already called reject.
             if (!canceled) {


=====================================
toolkit/components/torconnect/content/aboutTorConnect.css
=====================================
@@ -10,6 +10,11 @@
   --onion-radius: 75px;
 }
 
+html {
+  width: 100%;
+  height: 100%;
+}
+
 input[type="checkbox"]:focus, select:focus {
   outline:  none!important;
   box-shadow: 0 0 0 3px var(--purple-30) !important;
@@ -330,3 +335,166 @@ body {
   background-image: url("chrome://global/content/torconnect/connection-location.svg");
   stroke: var(--warning-color);
 }
+
+.onion-pattern-container {
+  flex: auto;           /* grow to consume remaining space on the page */
+  display: flex;
+  margin: 0 auto;
+  width: 100%;
+  /* two onions tall, 4x the radius */
+  height: calc(4 * var(--onion-radius));
+  max-height: calc(4 * var(--onion-radius));
+  min-height: calc(4 * var(--onion-radius));
+  direction: ltr;
+}
+
+.onion-pattern-crop {
+  height: 100%;
+  width: 100%;
+
+  -moz-context-properties: fill;
+  fill: var(--onion-color, currentColor);
+  /* opacity of the entire div, not context-opacity */
+  opacity: var(--onion-opacity, 1);
+
+  background-image: url("chrome://global/content/torconnect/onion-pattern.svg");
+  background-repeat: repeat;
+  background-attachment: local;
+  background-position: center;
+  /* svg source is 6 onions wide and 2 onions tall */
+  background-size: calc(6 * 2 * var(--onion-radius)) calc(2 * 2 * var(--onion-radius));;
+}
+
+:root {
+  --android-dark-accents-buttons: #9059FF;
+  --android-dark-background-secondary: #E1E0E7;
+  --android-dark-text-primary: #FBFBFE;
+  --android-light-text-primary: #15141A;
+}
+
+[hidden=true] {
+  display: none !important;
+}
+
+body.android {
+  --onion-color: var(--android-dark-text-primary);
+  width: 100%;
+  height: 100%;
+  box-sizing: border-box;
+  margin: 0;
+  padding: 0 24px !important;
+  color: var(--onion-color);
+  background: linear-gradient(194deg, #692E9D -0.93%, #393270 48.91%);
+  font: menu;
+  font-size: 14px;
+  display: flex;
+}
+
+.android #connectPageContainer {
+  max-width: none;
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+}
+
+.android #breadcrumbs {
+  display: none;
+}
+
+.android #text-container {
+  display: flex;
+  flex-direction: column;
+  flex: 1;
+}
+
+.android .title {
+  background-position: left 0;
+  background-repeat: no-repeat;
+  background-size: 40px;
+  padding-top: 64px;
+  font-size: 22px;
+  line-height: 28px;
+}
+
+.android h1 {
+  font-weight: normal;
+  font-size: 100%;
+  margin: 0 0 16px 0;
+}
+
+.android p {
+  margin: 0;
+  padding-bottom: 8px;
+  line-height: 20px;
+}
+
+.android #quickstartContainer {
+  margin-top: 24px;
+}
+
+.android .button-container {
+  display: flex;
+  flex: 1;
+  flex-direction: column;
+}
+
+.android #locationDropdown {
+  width: 100%;
+  max-width: none;
+  margin: 0;
+}
+
+.android select {
+  background: transparent;
+  border: none;
+  border-bottom: 1px solid var(--android-dark-text-primary);
+  color: var(--android-dark-text-primary);
+  display: block;
+  width: 100%;
+  margin-top: 10px;
+  padding: 8px;
+}
+
+.android #buttonPadding {
+  flex: 1;
+}
+
+.android #connectButtonContainer {
+  width: 100%;
+  padding-bottom: 18px;
+  display: grid;
+}
+
+/* Be sure not to match the togglee */
+.android #connectButtonContainer button {
+  display: block;
+  width: 100%;
+  margin: 4px 0;
+  padding: 11px 30px;
+  font-size: 14px;
+  font-weight: 500;
+  border: none;
+  border-radius: 4px;
+}
+
+.android #connectButton, .android #tryBridgeButton, .android #configureButton.primary {
+  color: var(--android-dark-text-primary);
+  background-color: var(--android-dark-accents-buttons);
+}
+
+.android #configureButton {
+  order: 1;
+}
+
+.android #restartButton {
+  order: 2;
+}
+
+.android #restartButton, .android #cancelButton, .android #configureButton {
+  color: var(--android-light-text-primary);
+  background-color: var(--android-dark-background-secondary);
+}
+
+.android .onion-pattern-container {
+  display: none;
+}


=====================================
toolkit/components/torconnect/content/aboutTorConnect.xhtml → toolkit/components/torconnect/content/aboutTorConnect.html
=====================================
@@ -1,17 +1,12 @@
 <!-- Copyright (c) 2021, The Tor Project, Inc. -->
 <!DOCTYPE html>
-<html xmlns="http://www.w3.org/1999/xhtml">
+<html>
   <head>
     <meta
       http-equiv="Content-Security-Policy"
       content="default-src chrome:; object-src 'none'"
     />
-    <link
-      rel="stylesheet"
-      href="chrome://global/skin/onionPattern.css"
-      type="text/css"
-      media="all"
-    />
+    <meta name="viewport" content="width=device-width">
     <link
       rel="stylesheet"
       href="chrome://global/content/torconnect/aboutTorConnect.css"
@@ -21,64 +16,69 @@
   </head>
   <body>
     <div id="progressBar">
-      <div id="progressBackground" />
-      <div id="progressSolid" />
+      <div id="progressBackground"></div>
+      <div id="progressSolid"></div>
     </div>
     <div id="connectPageContainer" class="container">
       <div id="breadcrumbs" class="hidden">
         <span id="connect-to-tor" class="breadcrumb-item">
-          <span id="connect-to-tor-icon" class="breadcrumb-icon" />
-          <span class="breadcrumb-label" />
+          <span id="connect-to-tor-icon" class="breadcrumb-icon"></span>
+          <span class="breadcrumb-label"></span>
         </span>
         <span
           id="connection-assist-separator"
           class="breadcrumb-separator breadcrumb-icon"
-        />
+        ></span>
         <span id="connection-assist" class="breadcrumb-item">
-          <span id="connection-assist-icon" class="breadcrumb-icon" />
-          <span class="breadcrumb-label" />
+          <span id="connection-assist-icon" class="breadcrumb-icon"></span>
+          <span class="breadcrumb-label"></span>
         </span>
         <span
           id="try-bridge-separator"
           class="breadcrumb-separator breadcrumb-icon"
-        />
+        ></span>
         <span id="try-bridge" class="breadcrumb-item">
-          <span id="try-bridge-icon" class="breadcrumb-icon" />
-          <span class="breadcrumb-label" />
+          <span id="try-bridge-icon" class="breadcrumb-icon"></span>
+          <span class="breadcrumb-label"></span>
         </span>
       </div>
       <div id="text-container">
         <div class="title">
-          <h1 class="title-text" />
+          <h1 class="title-text"></h1>
         </div>
         <div id="connectLongContent">
-          <p id="connectLongContentText" />
+          <p id="connectLongContentText"></p>
         </div>
         <div id="connectShortDesc">
-          <p id="connectShortDescText" />
+          <p id="connectShortDescText"></p>
         </div>
 
         <button id="viewLogButton"></button>
 
         <div id="quickstartContainer">
           <input id="quickstartCheckbox" type="checkbox" />
-          <label id="quickstartCheckboxLabel" for="quickstartCheckbox" />
+          <label id="quickstartCheckboxLabel" for="quickstartCheckbox"></label>
         </div>
 
-        <div id="connectButtonContainer" class="button-container">
-          <button id="restartButton" hidden="true"></button>
-          <button id="configureButton" hidden="true"></button>
-          <button id="cancelButton" hidden="true"></button>
-          <button id="connectButton" class="primary" hidden="true"></button>
-          <label id="locationDropdownLabel" for="countries" />
+        <div class="button-container">
+          <label id="locationDropdownLabel" for="countries"></label>
           <form id="locationDropdown" hidden="true">
             <select id="countries"></select>
           </form>
-          <button id="tryBridgeButton" class="primary" hidden="true"></button>
+          <span id="buttonPadding"></span>
+          <span id="connectButtonContainer">
+            <button id="restartButton" hidden="true"></button>
+            <button id="configureButton" hidden="true"></button>
+            <button id="cancelButton" hidden="true"></button>
+            <button id="connectButton" class="primary" hidden="true"></button>
+            <button id="tryBridgeButton" class="primary" hidden="true"></button>
+          </span>
         </div>
       </div>
     </div>
-#include ../../../themes/shared/onionPattern.inc.xhtml
+    <div class="onion-pattern-container">
+      <div class="onion-pattern-crop"></div>
+    </div>
+    <script src="chrome://global/content/torconnect/aboutTorConnect.js"></script>
   </body>
-  <script src="chrome://global/content/torconnect/aboutTorConnect.js" />
 </html>


=====================================
toolkit/components/torconnect/content/aboutTorConnect.js
=====================================
@@ -70,8 +70,8 @@ class AboutTorConnect {
       connect: "button#connectButton",
       tryBridge: "button#tryBridgeButton",
       locationDropdownLabel: "#locationDropdownLabel",
-      locationDropdown: "form#locationDropdown",
-      locationDropdownSelect: "form#locationDropdown select",
+      locationDropdown: "#locationDropdown",
+      locationDropdownSelect: "#locationDropdown select",
     },
   });
 
@@ -666,6 +666,9 @@ class AboutTorConnect {
   }
 
   initElements(direction) {
+    const isAndroid = navigator.userAgent.indexOf("Android") !== -1;
+    document.body.classList.toggle("android", isAndroid);
+
     document.documentElement.setAttribute("dir", direction);
 
     this.elements.connectToTorLink.addEventListener("click", event => {


=====================================
toolkit/themes/shared/onionPattern.svg → toolkit/components/torconnect/content/onion-pattern.svg
=====================================


=====================================
toolkit/components/torconnect/jar.mn
=====================================
@@ -3,12 +3,13 @@ toolkit.jar:
     content/global/torconnect/torConnectTitlebarStatus.js                    (content/torConnectTitlebarStatus.js)
     content/global/torconnect/torConnectTitlebarStatus.css                   (content/torConnectTitlebarStatus.css)
     content/global/torconnect/aboutTorConnect.css                            (content/aboutTorConnect.css)
-*   content/global/torconnect/aboutTorConnect.xhtml                          (content/aboutTorConnect.xhtml)
+    content/global/torconnect/aboutTorConnect.html                           (content/aboutTorConnect.html)
     content/global/torconnect/aboutTorConnect.js                             (content/aboutTorConnect.js)
     content/global/torconnect/arrow-right.svg                                (content/arrow-right.svg)
     content/global/torconnect/bridge.svg                                     (content/bridge.svg)
     content/global/torconnect/connection-failure.svg                         (content/connection-failure.svg)
     content/global/torconnect/connection-location.svg                        (content/connection-location.svg)
+    content/global/torconnect/onion-pattern.svg                              (content/onion-pattern.svg)
     content/global/torconnect/tor-connect.svg                                (content/tor-connect.svg)
     content/global/torconnect/tor-not-connected-to-connected-animated.svg    (content/tor-not-connected-to-connected-animated.svg)
     content/global/torconnect/tor-connect-broken.svg                         (content/tor-connect-broken.svg)


=====================================
toolkit/modules/Moat.sys.mjs
=====================================
@@ -21,6 +21,56 @@ const TorLauncherPrefs = Object.freeze({
   moat_service: "extensions.torlauncher.moat_service",
 });
 
+function makeMeekCredentials(proxyType) {
+  // Construct the per-connection arguments.
+  let meekClientEscapedArgs = "";
+  const meekReflector = Services.prefs.getStringPref(
+    TorLauncherPrefs.bridgedb_reflector
+  );
+
+  // Escape aValue per section 3.5 of the PT specification:
+  //   First the "<Key>=<Value>" formatted arguments MUST be escaped,
+  //   such that all backslash, equal sign, and semicolon characters
+  //   are escaped with a backslash.
+  const escapeArgValue = aValue =>
+    aValue
+      ? aValue
+          .replaceAll("\\", "\\\\")
+          .replaceAll("=", "\\=")
+          .replaceAll(";", "\\;")
+      : "";
+
+  if (meekReflector) {
+    meekClientEscapedArgs += "url=";
+    meekClientEscapedArgs += escapeArgValue(meekReflector);
+  }
+  const meekFront = Services.prefs.getStringPref(
+    TorLauncherPrefs.bridgedb_front
+  );
+  if (meekFront) {
+    if (meekClientEscapedArgs.length) {
+      meekClientEscapedArgs += ";";
+    }
+    meekClientEscapedArgs += "front=";
+    meekClientEscapedArgs += escapeArgValue(meekFront);
+  }
+
+  // socks5
+  if (proxyType === "socks") {
+    if (meekClientEscapedArgs.length <= 255) {
+      return [meekClientEscapedArgs, "\x00"];
+    } else {
+      return [
+        meekClientEscapedArgs.substring(0, 255),
+        meekClientEscapedArgs.substring(255),
+      ];
+    }
+    // socks4
+  } else {
+    return [meekClientEscapedArgs, undefined];
+  }
+}
+
 //
 // Launches and controls the PT process lifetime
 //
@@ -70,39 +120,6 @@ class MeekTransport {
         proxy.pathToBinary = meekPath.path;
       }
 
-      // Construct the per-connection arguments.
-      let meekClientEscapedArgs = "";
-      const meekReflector = Services.prefs.getStringPref(
-        TorLauncherPrefs.bridgedb_reflector
-      );
-
-      // Escape aValue per section 3.5 of the PT specification:
-      //   First the "<Key>=<Value>" formatted arguments MUST be escaped,
-      //   such that all backslash, equal sign, and semicolon characters
-      //   are escaped with a backslash.
-      const escapeArgValue = aValue =>
-        aValue
-          ? aValue
-              .replaceAll("\\", "\\\\")
-              .replaceAll("=", "\\=")
-              .replaceAll(";", "\\;")
-          : "";
-
-      if (meekReflector) {
-        meekClientEscapedArgs += "url=";
-        meekClientEscapedArgs += escapeArgValue(meekReflector);
-      }
-      const meekFront = Services.prefs.getStringPref(
-        TorLauncherPrefs.bridgedb_front
-      );
-      if (meekFront) {
-        if (meekClientEscapedArgs.length) {
-          meekClientEscapedArgs += ";";
-        }
-        meekClientEscapedArgs += "front=";
-        meekClientEscapedArgs += escapeArgValue(meekFront);
-      }
-
       // Setup env and start meek process
       const ptStateDir = lazy.TorLauncherUtil.getTorFile("tordatadir", false);
       ptStateDir.append("pt_state"); // Match what tor uses.
@@ -247,22 +264,9 @@ class MeekTransport {
         this.#meekClientProcess = null;
         this.uninit();
       });
-
-      // socks5
-      if (this.proxyType === "socks") {
-        if (meekClientEscapedArgs.length <= 255) {
-          this.proxyUsername = meekClientEscapedArgs;
-          this.proxyPassword = "\x00";
-        } else {
-          this.proxyUsername = meekClientEscapedArgs.substring(0, 255);
-          this.proxyPassword = meekClientEscapedArgs.substring(255);
-        }
-        // socks4
-      } else {
-        this.proxyUsername = meekClientEscapedArgs;
-        this.proxyPassword = undefined;
-      }
-
+      [this.proxyUsername, this.proxyPassword] = makeMeekCredentials(
+        this.proxyType
+      );
       this.#inited = true;
     } catch (ex) {
       if (this.#meekClientProcess) {
@@ -403,7 +407,7 @@ export class MoatRPC {
       throw new Error("MoatRPC: Already initialized");
     }
 
-    let meekTransport = new MeekTransport();
+    const meekTransport = new MeekTransport();
     await meekTransport.init();
     this.#meekTransport = meekTransport;
     this.#inited = true;


=====================================
toolkit/themes/shared/minimal-toolkit.jar.inc.mn
=====================================
@@ -47,7 +47,3 @@ toolkit.jar:
   skin/classic/global/media/textrecognition.css            (../../shared/media/textrecognition.css)
 
   skin/classic/global/browser-colors.css                   (../../shared/browser-colors.css)
-
-# Tor customization
-  skin/classic/global/onionPattern.css                     (../../shared/onionPattern.css)
-  skin/classic/global/onionPattern.svg                     (../../shared/onionPattern.svg)


=====================================
toolkit/themes/shared/onionPattern.css deleted
=====================================
@@ -1,31 +0,0 @@
-/* Onion pattern */
-
-.onion-pattern-container {
-
-  flex: auto;           /* grow to consume remaining space on the page */
-  display: flex;
-  margin: 0 auto;
-  width: 100%;
-  /* two onions tall, 4x the radius */
-  height: calc(4 * var(--onion-radius));
-  max-height: calc(4 * var(--onion-radius));
-  min-height: calc(4 * var(--onion-radius));
-  direction: ltr;
-}
-
-.onion-pattern-crop {
-  height: 100%;
-  width: 100%;
-
-  -moz-context-properties: fill;
-  fill: var(--onion-color, currentColor);
-  /* opacity of the entire div, not context-opacity */
-  opacity: var(--onion-opacity, 1);
-
-  background-image: url("chrome://global/skin/onionPattern.svg");
-  background-repeat: repeat;
-  background-attachment: local;
-  background-position: center;
-  /* svg source is 6 onions wide and 2 onions tall */
-  background-size: calc(6 * 2 * var(--onion-radius)) calc(2 * 2 * var(--onion-radius));;
-}


=====================================
toolkit/themes/shared/onionPattern.inc.xhtml deleted
=====================================
@@ -1,12 +0,0 @@
-<!--
-  Container div that holds onionPattern.svg
-  It is expected the includer of this xhtml file also includes onionPattern.css
-  and define the following vars:
-    onion-radius : radius of an onion
-    onion-color : the base color of the onion pattern
-    onion-opacity : the opacity of the entire repeating pattern
--->
-
-<div class="onion-pattern-container">
-  <div class="onion-pattern-crop"/>
-</div>
\ No newline at end of file



View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/410b9a4c4e0cda415666c18c9c3aa3b7a9127286...3649cc3f5f227d0dffbf2506da7072a7e7b3793f

-- 
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/410b9a4c4e0cda415666c18c9c3aa3b7a9127286...3649cc3f5f227d0dffbf2506da7072a7e7b3793f
You're receiving this email because of your account on gitlab.torproject.org.


-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.torproject.org/pipermail/tbb-commits/attachments/20231206/40318551/attachment-0001.htm>


More information about the tbb-commits mailing list