Pier Angelo Vendrame pushed to branch tor-browser-128.6.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
266cf821
by Henry Wilkes at 2025-01-21T17:10:38+00:00
-
ecdccd3f
by Henry Wilkes at 2025-01-21T17:10:38+00:00
6 changed files:
- browser/components/torpreferences/content/builtinBridgeDialog.js
- browser/components/torpreferences/content/connectionPane.js
- browser/components/torpreferences/content/provideBridgeDialog.js
- browser/components/torpreferences/content/requestBridgeDialog.js
- toolkit/modules/TorConnect.sys.mjs
- toolkit/modules/TorSettings.sys.mjs
Changes:
| ... | ... | @@ -4,9 +4,8 @@ const { TorSettings, TorBridgeSource } = ChromeUtils.importESModule( |
| 4 | 4 | "resource://gre/modules/TorSettings.sys.mjs"
|
| 5 | 5 | );
|
| 6 | 6 | |
| 7 | -const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
|
|
| 8 | - "resource://gre/modules/TorConnect.sys.mjs"
|
|
| 9 | -);
|
|
| 7 | +const { TorConnect, TorConnectStage, TorConnectTopics } =
|
|
| 8 | + ChromeUtils.importESModule("resource://gre/modules/TorConnect.sys.mjs");
|
|
| 10 | 9 | |
| 11 | 10 | const gBuiltinBridgeDialog = {
|
| 12 | 11 | init() {
|
| ... | ... | @@ -96,7 +95,7 @@ const gBuiltinBridgeDialog = { |
| 96 | 95 | },
|
| 97 | 96 | |
| 98 | 97 | onAcceptStateChange() {
|
| 99 | - const connect = TorConnect.canBeginBootstrap;
|
|
| 98 | + const connect = TorConnect.stageName !== TorConnectStage.Bootstrapped;
|
|
| 100 | 99 | this._result.connect = connect;
|
| 101 | 100 | this._acceptButton.setAttribute(
|
| 102 | 101 | "data-l10n-id",
|
| ... | ... | @@ -2257,6 +2257,8 @@ const gBridgeSettings = { |
| 2257 | 2257 | }
|
| 2258 | 2258 | |
| 2259 | 2259 | // Wait until the settings are applied before bootstrapping.
|
| 2260 | + // NOTE: Saving the settings should also cancel any existing bootstrap
|
|
| 2261 | + // attempt first. See tor-browser#41921.
|
|
| 2260 | 2262 | savedSettings.then(() => {
|
| 2261 | 2263 | // The bridge dialog button is "connect" when Tor is not
|
| 2262 | 2264 | // bootstrapped, so do the connect.
|
| ... | ... | @@ -3,9 +3,8 @@ |
| 3 | 3 | const { TorSettings, TorBridgeSource, validateBridgeLines } =
|
| 4 | 4 | ChromeUtils.importESModule("resource://gre/modules/TorSettings.sys.mjs");
|
| 5 | 5 | |
| 6 | -const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
|
|
| 7 | - "resource://gre/modules/TorConnect.sys.mjs"
|
|
| 8 | -);
|
|
| 6 | +const { TorConnect, TorConnectStage, TorConnectTopics } =
|
|
| 7 | + ChromeUtils.importESModule("resource://gre/modules/TorConnect.sys.mjs");
|
|
| 9 | 8 | |
| 10 | 9 | const { TorParsers } = ChromeUtils.importESModule(
|
| 11 | 10 | "resource://gre/modules/TorParsers.sys.mjs"
|
| ... | ... | @@ -190,7 +189,7 @@ const gProvideBridgeDialog = { |
| 190 | 189 | "user-provide-bridge-dialog-next-button"
|
| 191 | 190 | );
|
| 192 | 191 | } else {
|
| 193 | - connect = TorConnect.canBeginBootstrap;
|
|
| 192 | + connect = TorConnect.stageName !== TorConnectStage.Bootstrapped;
|
|
| 194 | 193 | this._acceptButton.setAttribute(
|
| 195 | 194 | "data-l10n-id",
|
| 196 | 195 | connect ? "bridge-dialog-button-connect" : "bridge-dialog-button-accept"
|
| ... | ... | @@ -4,9 +4,8 @@ const { BridgeDB } = ChromeUtils.importESModule( |
| 4 | 4 | "resource://gre/modules/BridgeDB.sys.mjs"
|
| 5 | 5 | );
|
| 6 | 6 | |
| 7 | -const { TorConnect, TorConnectTopics } = ChromeUtils.importESModule(
|
|
| 8 | - "resource://gre/modules/TorConnect.sys.mjs"
|
|
| 9 | -);
|
|
| 7 | +const { TorConnect, TorConnectStage, TorConnectTopics } =
|
|
| 8 | + ChromeUtils.importESModule("resource://gre/modules/TorConnect.sys.mjs");
|
|
| 10 | 9 | |
| 11 | 10 | const log = console.createInstance({
|
| 12 | 11 | maxLogLevel: "Warn",
|
| ... | ... | @@ -102,7 +101,7 @@ const gRequestBridgeDialog = { |
| 102 | 101 | },
|
| 103 | 102 | |
| 104 | 103 | onAcceptStateChange() {
|
| 105 | - const connect = TorConnect.canBeginBootstrap;
|
|
| 104 | + const connect = TorConnect.stageName !== TorConnectStage.Bootstrapped;
|
|
| 106 | 105 | this._result.connect = connect;
|
| 107 | 106 | this._submitButton.setAttribute(
|
| 108 | 107 | "data-l10n-id",
|
| ... | ... | @@ -13,6 +13,7 @@ ChromeUtils.defineESModuleGetters(lazy, { |
| 13 | 13 | TorProviderTopics: "resource://gre/modules/TorProviderBuilder.sys.mjs",
|
| 14 | 14 | TorLauncherUtil: "resource://gre/modules/TorLauncherUtil.sys.mjs",
|
| 15 | 15 | TorSettings: "resource://gre/modules/TorSettings.sys.mjs",
|
| 16 | + TorSettingsTopics: "resource://gre/modules/TorSettings.sys.mjs",
|
|
| 16 | 17 | });
|
| 17 | 18 | |
| 18 | 19 | const TorConnectPrefs = Object.freeze({
|
| ... | ... | @@ -629,16 +630,6 @@ class AutoBootstrapAttempt { |
| 629 | 630 | |
| 630 | 631 | // Send the new settings directly to the provider. We will save them only
|
| 631 | 632 | // if the bootstrap succeeds.
|
| 632 | - // FIXME: We should somehow signal TorSettings users that we have set
|
|
| 633 | - // custom settings, and they should not apply theirs until we are done
|
|
| 634 | - // with trying ours.
|
|
| 635 | - // Otherwise, the new settings provided by the user while we were
|
|
| 636 | - // bootstrapping could be the ones that cause the bootstrap to succeed,
|
|
| 637 | - // but we overwrite them (unless we backup the original settings, and then
|
|
| 638 | - // save our new settings only if they have not changed).
|
|
| 639 | - // Another idea (maybe easier to implement) is to disable the settings
|
|
| 640 | - // UI while *any* bootstrap is going on.
|
|
| 641 | - // This is also documented in tor-browser#41921.
|
|
| 642 | 633 | await lazy.TorSettings.applyTemporaryBridges(bridges);
|
| 643 | 634 | |
| 644 | 635 | if (this.#cancelled || this.#resolved) {
|
| ... | ... | @@ -1036,6 +1027,7 @@ export const TorConnect = { |
| 1036 | 1027 | // register the Tor topics we always care about
|
| 1037 | 1028 | observeTopic(lazy.TorProviderTopics.ProcessExited);
|
| 1038 | 1029 | observeTopic(lazy.TorProviderTopics.HasWarnOrErr);
|
| 1030 | + observeTopic(lazy.TorSettingsTopics.SettingsChanged);
|
|
| 1039 | 1031 | |
| 1040 | 1032 | // NOTE: At this point, _requestedStage should still be `null`.
|
| 1041 | 1033 | this._setStage(TorConnectStage.Start);
|
| ... | ... | @@ -1070,8 +1062,32 @@ export const TorConnect = { |
| 1070 | 1062 | Services.prefs.setBoolPref(TorConnectPrefs.prompt_at_startup, true);
|
| 1071 | 1063 | this._makeStageRequest(TorConnectStage.Start, true);
|
| 1072 | 1064 | break;
|
| 1073 | - default:
|
|
| 1074 | - // ignore
|
|
| 1065 | + case lazy.TorSettingsTopics.SettingsChanged:
|
|
| 1066 | + if (
|
|
| 1067 | + this._stageName !== TorConnectStage.Bootstrapped &&
|
|
| 1068 | + this._stageName !== TorConnectStage.Loading &&
|
|
| 1069 | + this._stageName !== TorConnectStage.Start &&
|
|
| 1070 | + subject.wrappedJSObject.changes.some(propertyName =>
|
|
| 1071 | + propertyName.startsWith("bridges.")
|
|
| 1072 | + )
|
|
| 1073 | + ) {
|
|
| 1074 | + // A change in bridge settings before we are bootstrapped, we reset
|
|
| 1075 | + // the stage to Start to:
|
|
| 1076 | + // + Cancel any ongoing bootstrap attempt. In particular, we
|
|
| 1077 | + // definitely do not want to continue with an auto-bootstrap's
|
|
| 1078 | + // temporary bridges if the settings have changed.
|
|
| 1079 | + // + Reset the UI to be ready for normal bootstrapping in case the
|
|
| 1080 | + // user returns to about:torconnect.
|
|
| 1081 | + // See tor-browser#41921.
|
|
| 1082 | + // NOTE: We do not reset in response to a change in the quickstart,
|
|
| 1083 | + // firewall or proxy settings.
|
|
| 1084 | + lazy.logger.warn(
|
|
| 1085 | + "Resetting to Start stage since bridge settings changed"
|
|
| 1086 | + );
|
|
| 1087 | + // Rather than cancel and return to the pre-bootstrap stage, we
|
|
| 1088 | + // explicitly cancel and return to the start stage.
|
|
| 1089 | + this._makeStageRequest(TorConnectStage.Start);
|
|
| 1090 | + }
|
|
| 1075 | 1091 | break;
|
| 1076 | 1092 | }
|
| 1077 | 1093 | },
|
| ... | ... | @@ -953,6 +953,7 @@ class TorSettingsImpl { |
| 953 | 953 | };
|
| 954 | 954 | |
| 955 | 955 | if ("bridges" in newValues) {
|
| 956 | + const changesLength = changes.length;
|
|
| 956 | 957 | if ("source" in newValues.bridges) {
|
| 957 | 958 | this.#fixupBridgeSettings(newValues.bridges);
|
| 958 | 959 | changeSetting("bridges", "source", newValues.bridges.source);
|
| ... | ... | @@ -982,6 +983,19 @@ class TorSettingsImpl { |
| 982 | 983 | if ("enabled" in newValues.bridges) {
|
| 983 | 984 | changeSetting("bridges", "enabled", newValues.bridges.enabled);
|
| 984 | 985 | }
|
| 986 | + |
|
| 987 | + if (this.#temporaryBridgeSettings && changes.length !== changesLength) {
|
|
| 988 | + // A change in the bridges settings.
|
|
| 989 | + // We want to clear the temporary bridge settings to ensure that they
|
|
| 990 | + // cannot be used to overwrite these user-provided settings.
|
|
| 991 | + // See tor-browser#41921.
|
|
| 992 | + // NOTE: This should also trigger TorConnect to cancel any ongoing
|
|
| 993 | + // AutoBootstrap that would have otherwise used these settings.
|
|
| 994 | + this.#temporaryBridgeSettings = null;
|
|
| 995 | + lazy.logger.warn(
|
|
| 996 | + "Cleared temporary bridges since bridge settings were changed"
|
|
| 997 | + );
|
|
| 998 | + }
|
|
| 985 | 999 | }
|
| 986 | 1000 | |
| 987 | 1001 | if ("proxy" in newValues) {
|