Pier Angelo Vendrame pushed to branch tor-browser-115.10.0esr-13.5-1 at The Tor Project / Applications / Tor Browser
Commits:
- 
303a1239
by Henry Wilkes at 2024-04-22T17:35:39+01:00
- 
45f5e2d9
by Henry Wilkes at 2024-04-22T17:35:39+01:00
- 
94374ba5
by Henry Wilkes at 2024-04-22T18:01:19+01:00
3 changed files:
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/provideBridgeDialog.js
- toolkit/components/lox/Lox.sys.mjs
Changes:
| ... | ... | @@ -1284,6 +1284,11 @@ const gLoxStatus = { | 
| 1284 | 1284 |     * Initialize the bridge pass area.
 | 
| 1285 | 1285 |     */
 | 
| 1286 | 1286 |    init() {
 | 
| 1287 | +    if (!Lox.enabled) {
 | |
| 1288 | +      // Area should remain inactive and hidden.
 | |
| 1289 | +      return;
 | |
| 1290 | +    }
 | |
| 1291 | + | |
| 1287 | 1292 |      this._area = document.getElementById("tor-bridges-lox-status");
 | 
| 1288 | 1293 |      this._detailsArea = document.getElementById("tor-bridges-lox-details");
 | 
| 1289 | 1294 |      this._nextUnlockCounterEl = document.getElementById(
 | 
| ... | ... | @@ -1333,6 +1338,10 @@ const gLoxStatus = { | 
| 1333 | 1338 |     * Uninitialize the built-in bridges area.
 | 
| 1334 | 1339 |     */
 | 
| 1335 | 1340 |    uninit() {
 | 
| 1341 | +    if (!Lox.enabled) {
 | |
| 1342 | +      return;
 | |
| 1343 | +    }
 | |
| 1344 | + | |
| 1336 | 1345 |      Services.obs.removeObserver(this, TorSettingsTopics.SettingsChanged);
 | 
| 1337 | 1346 |      Services.obs.removeObserver(this, LoxTopics.UpdateActiveLoxId);
 | 
| 1338 | 1347 |      Services.obs.removeObserver(this, LoxTopics.UpdateEvents);
 | 
| ... | ... | @@ -72,8 +72,7 @@ const gProvideBridgeDialog = { | 
| 72 | 72 | |
| 73 | 73 |      document.l10n.setAttributes(document.documentElement, titleId);
 | 
| 74 | 74 | |
| 75 | -    // TODO: Make conditional on Lox being enabled.
 | |
| 76 | -    this._allowLoxInvite = mode !== "edit"; // && Lox.enabled
 | |
| 75 | +    this._allowLoxInvite = mode !== "edit" && Lox.enabled;
 | |
| 77 | 76 | |
| 78 | 77 |      document.l10n.setAttributes(
 | 
| 79 | 78 |        document.getElementById("user-provide-bridge-textarea-label"),
 | 
| ... | ... | @@ -403,33 +402,39 @@ const gProvideBridgeDialog = { | 
| 403 | 402 |        return null;
 | 
| 404 | 403 |      }
 | 
| 405 | 404 | |
| 406 | -    let loxInvite = null;
 | |
| 407 | -    for (let line of this._textarea.value.split(/\r?\n/)) {
 | |
| 408 | -      line = line.trim();
 | |
| 409 | -      if (!line) {
 | |
| 410 | -        continue;
 | |
| 411 | -      }
 | |
| 412 | -      // TODO: Once we have a Lox invite encoding, distinguish between a valid
 | |
| 413 | -      // invite and something that looks like it should be an invite.
 | |
| 414 | -      const isLoxInvite = Lox.validateInvitation(line);
 | |
| 415 | -      if (isLoxInvite) {
 | |
| 416 | -        if (!this._allowLoxInvite) {
 | |
| 417 | -          this.updateError({ type: "not-allowed-invite" });
 | |
| 418 | -          return null;
 | |
| 405 | +    // Only check if this looks like a Lox invite when the Lox module is
 | |
| 406 | +    // enabled.
 | |
| 407 | +    if (Lox.enabled) {
 | |
| 408 | +      let loxInvite = null;
 | |
| 409 | +      for (let line of this._textarea.value.split(/\r?\n/)) {
 | |
| 410 | +        line = line.trim();
 | |
| 411 | +        if (!line) {
 | |
| 412 | +          continue;
 | |
| 419 | 413 |          }
 | 
| 420 | -        if (loxInvite) {
 | |
| 421 | -          this.updateError({ type: "multiple-invites" });
 | |
| 414 | +        // TODO: Once we have a Lox invite encoding, distinguish between a valid
 | |
| 415 | +        // invite and something that looks like it should be an invite.
 | |
| 416 | +        const isLoxInvite = Lox.validateInvitation(line);
 | |
| 417 | +        if (isLoxInvite) {
 | |
| 418 | +          if (!this._allowLoxInvite) {
 | |
| 419 | +            // Lox is enabled, but not allowed invites when editing bridge
 | |
| 420 | +            // addresses.
 | |
| 421 | +            this.updateError({ type: "not-allowed-invite" });
 | |
| 422 | +            return null;
 | |
| 423 | +          }
 | |
| 424 | +          if (loxInvite) {
 | |
| 425 | +            this.updateError({ type: "multiple-invites" });
 | |
| 426 | +            return null;
 | |
| 427 | +          }
 | |
| 428 | +          loxInvite = line;
 | |
| 429 | +        } else if (loxInvite) {
 | |
| 430 | +          this.updateError({ type: "mixed" });
 | |
| 422 | 431 |            return null;
 | 
| 423 | 432 |          }
 | 
| 424 | -        loxInvite = line;
 | |
| 425 | -      } else if (loxInvite) {
 | |
| 426 | -        this.updateError({ type: "mixed" });
 | |
| 427 | -        return null;
 | |
| 428 | 433 |        }
 | 
| 429 | -    }
 | |
| 430 | 434 | |
| 431 | -    if (loxInvite) {
 | |
| 432 | -      return { loxInvite };
 | |
| 435 | +      if (loxInvite) {
 | |
| 436 | +        return { loxInvite };
 | |
| 437 | +      }
 | |
| 433 | 438 |      }
 | 
| 434 | 439 | |
| 435 | 440 |      const validation = validateBridgeLines(this._textarea.value);
 | 
| 1 | 1 |  import { XPCOMUtils } from "resource://gre/modules/XPCOMUtils.sys.mjs";
 | 
| 2 | +import { AppConstants } from "resource://gre/modules/AppConstants.sys.mjs";
 | |
| 2 | 3 |  import {
 | 
| 3 | 4 |    clearInterval,
 | 
| 4 | 5 |    setInterval,
 | 
| ... | ... | @@ -103,8 +104,24 @@ export class LoxError extends Error { | 
| 103 | 104 |  }
 | 
| 104 | 105 | |
| 105 | 106 |  class LoxImpl {
 | 
| 107 | +  /**
 | |
| 108 | +   * Whether the Lox module has completed initialization.
 | |
| 109 | +   *
 | |
| 110 | +   * @type {boolean}
 | |
| 111 | +   */
 | |
| 106 | 112 |    #initialized = false;
 | 
| 107 | -  #window = null;
 | |
| 113 | + | |
| 114 | +  /**
 | |
| 115 | +   * Whether the Lox module is enabled for this Tor Browser instance.
 | |
| 116 | +   *
 | |
| 117 | +   * @type {boolean}
 | |
| 118 | +   */
 | |
| 119 | +  #enabled = AppConstants.MOZ_UPDATE_CHANNEL !== "release";
 | |
| 120 | + | |
| 121 | +  get enabled() {
 | |
| 122 | +    return this.#enabled;
 | |
| 123 | +  }
 | |
| 124 | + | |
| 108 | 125 |    #pubKeyPromise = null;
 | 
| 109 | 126 |    #encTablePromise = null;
 | 
| 110 | 127 |    #constantsPromise = null;
 | 
| ... | ... | @@ -218,13 +235,14 @@ class LoxImpl { | 
| 218 | 235 |     * Assert that the module is initialized.
 | 
| 219 | 236 |     */
 | 
| 220 | 237 |    #assertInitialized() {
 | 
| 221 | -    if (!this.#initialized) {
 | |
| 238 | +    if (!this.enabled || !this.#initialized) {
 | |
| 222 | 239 |        throw new LoxError("Not initialized");
 | 
| 223 | 240 |      }
 | 
| 224 | 241 |    }
 | 
| 225 | 242 | |
| 226 | 243 |    get #inuse() {
 | 
| 227 | 244 |      return (
 | 
| 245 | +      this.enabled &&
 | |
| 228 | 246 |        Boolean(this.#activeLoxId) &&
 | 
| 229 | 247 |        lazy.TorSettings.bridges.enabled === true &&
 | 
| 230 | 248 |        lazy.TorSettings.bridges.source === lazy.TorBridgeSource.Lox
 | 
| ... | ... | @@ -532,16 +550,20 @@ class LoxImpl { | 
| 532 | 550 |    }
 | 
| 533 | 551 | |
| 534 | 552 |    async init() {
 | 
| 553 | +    if (!this.enabled) {
 | |
| 554 | +      lazy.logger.info(
 | |
| 555 | +        "Skipping initialization since Lox module is not enabled"
 | |
| 556 | +      );
 | |
| 557 | +      return;
 | |
| 558 | +    }
 | |
| 535 | 559 |      // If lox_id is set, load it
 | 
| 536 | 560 |      Services.obs.addObserver(this, lazy.TorSettingsTopics.SettingsChanged);
 | 
| 537 | 561 |      Services.obs.addObserver(this, lazy.TorSettingsTopics.Ready);
 | 
| 538 | 562 | |
| 539 | 563 |      // Hack to make the generated wasm happy
 | 
| 540 | -    this.#window = {
 | |
| 541 | -      crypto,
 | |
| 542 | -    };
 | |
| 543 | -    this.#window.window = this.#window;
 | |
| 544 | -    await lazy.init(this.#window);
 | |
| 564 | +    const win = { crypto };
 | |
| 565 | +    win.window = win;
 | |
| 566 | +    await lazy.init(win);
 | |
| 545 | 567 |      lazy.set_panic_hook();
 | 
| 546 | 568 |      if (typeof lazy.open_invite !== "function") {
 | 
| 547 | 569 |        throw new LoxError("Initialization failed");
 | 
| ... | ... | @@ -551,6 +573,9 @@ class LoxImpl { | 
| 551 | 573 |    }
 | 
| 552 | 574 | |
| 553 | 575 |    async uninit() {
 | 
| 576 | +    if (!this.enabled) {
 | |
| 577 | +      return;
 | |
| 578 | +    }
 | |
| 554 | 579 |      Services.obs.removeObserver(this, lazy.TorSettingsTopics.SettingsChanged);
 | 
| 555 | 580 |      Services.obs.removeObserver(this, lazy.TorSettingsTopics.Ready);
 | 
| 556 | 581 |      if (this.#domainFrontedRequests !== null) {
 | 
| ... | ... | @@ -561,7 +586,6 @@ class LoxImpl { | 
| 561 | 586 |        this.#domainFrontedRequests = null;
 | 
| 562 | 587 |      }
 | 
| 563 | 588 |      this.#initialized = false;
 | 
| 564 | -    this.#window = null;
 | |
| 565 | 589 |      this.#invites = [];
 | 
| 566 | 590 |      this.#pubKeys = null;
 | 
| 567 | 591 |      this.#encTable = null;
 |