Pier Angelo Vendrame pushed to branch tor-browser-102.10.0esr-12.5-1 at The Tor Project / Applications / Tor Browser
Commits: d2c3dcac by Henry Wilkes at 2023-04-17T15:10:44+01:00 fixup! Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#connection
Bug 41617 - Tidy up:
- Lint builtinBridgeDialog.jsm and connectionPane.js. - Use TorConnect.canBeginBootstrap. - Always start Bootstrapping with the built in bridges, regardless of a previous errors. - Wait until settings have been applied before starting bootstrap. - Use new string ids for the new strings. Mark the old ones for removal. - Clean up unused properties.
- - - - - 64ea04a6 by Henry Wilkes at 2023-04-17T15:23:13+01:00 fixup! Add TorStrings module for localization
Bug 41617 - Tidy up:
- Use new string ids for the new strings. Mark the old ones for removal. - Use "website" rather than "web site".
- - - - -
4 changed files:
- browser/components/torpreferences/content/builtinBridgeDialog.jsm - browser/components/torpreferences/content/connectionPane.js - browser/modules/TorStrings.jsm - toolkit/torbutton/chrome/locale/en-US/settings.properties
Changes:
===================================== browser/components/torpreferences/content/builtinBridgeDialog.jsm ===================================== @@ -1,35 +1,30 @@ "use strict";
-const obs = Components.classes["@mozilla.org/observer-service;1"].getService(Components.interfaces.nsIObserverService); - var EXPORTED_SYMBOLS = ["BuiltinBridgeDialog"];
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm"); + const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
const { TorSettings, - TorSettingsTopics, TorBridgeSource, TorBuiltinBridgeTypes, } = ChromeUtils.import("resource:///modules/TorSettings.jsm");
-const { - TorConnect, - TorConnectTopics, - TorConnectState, -} = ChromeUtils.import("resource:///modules/TorConnect.jsm"); +const { TorConnect, TorConnectTopics } = ChromeUtils.import( + "resource:///modules/TorConnect.jsm" +);
class BuiltinBridgeDialog { constructor(onSubmit) { this.onSubmit = onSubmit; this._dialog = null; - this._window = null; this._acceptButton = null; }
static get selectors() { return { - header: "#torPreferences-builtinBridge-header", description: "#torPreferences-builtinBridge-description", radiogroup: "#torPreferences-builtinBridge-typeSelection", obfsRadio: "#torPreferences-builtinBridges-radioObfs", @@ -38,22 +33,20 @@ class BuiltinBridgeDialog { snowflakeDescr: "#torPreferences-builtinBridges-descrSnowflake", meekAzureRadio: "#torPreferences-builtinBridges-radioMeekAzure", meekAzureDescr: "#torPreferences-builtinBridges-descrMeekAzure", - acceptButton: "accept" /* not really a selector but a key for dialog's getButton */, }; }
_populateXUL(window, aDialog) { const selectors = BuiltinBridgeDialog.selectors;
- this._window = window; this._dialog = aDialog; const dialogWin = this._dialog.parentElement; dialogWin.setAttribute("title", TorStrings.settings.builtinBridgeHeader);
this._dialog.querySelector(selectors.description).textContent = - TorStrings.settings.builtinBridgeDescription; + TorStrings.settings.builtinBridgeDescription2;
- this._acceptButton = this._dialog.getButton(selectors.acceptButton); + this._acceptButton = this._dialog.getButton("accept"); this.onTorStateChange();
let radioGroup = this._dialog.querySelector(selectors.radiogroup); @@ -63,19 +56,19 @@ class BuiltinBridgeDialog { elemRadio: this._dialog.querySelector(selectors.obfsRadio), elemDescr: this._dialog.querySelector(selectors.obfsDescr), label: TorStrings.settings.builtinBridgeObfs4Title, - descr: TorStrings.settings.builtinBridgeObfs4Description, + descr: TorStrings.settings.builtinBridgeObfs4Description2, }, snowflake: { elemRadio: this._dialog.querySelector(selectors.snowflakeRadio), elemDescr: this._dialog.querySelector(selectors.snowflakeDescr), label: TorStrings.settings.builtinBridgeSnowflake, - descr: TorStrings.settings.builtinBridgeSnowflakeDescription, + descr: TorStrings.settings.builtinBridgeSnowflakeDescription2, }, "meek-azure": { elemRadio: this._dialog.querySelector(selectors.meekAzureRadio), elemDescr: this._dialog.querySelector(selectors.meekAzureDescr), label: TorStrings.settings.builtinBridgeMeekAzure, - descr: TorStrings.settings.builtinBridgeMeekAzureDescription, + descr: TorStrings.settings.builtinBridgeMeekAzureDescription2, }, };
@@ -96,8 +89,8 @@ class BuiltinBridgeDialog { radioGroup.selectedItem = null; }
- this._dialog.addEventListener("dialogaccept", e => { - this.onSubmit(radioGroup.value); + this._dialog.addEventListener("dialogaccept", () => { + this.onSubmit(radioGroup.value, TorConnect.canBeginBootstrap); }); this._dialog.addEventListener("dialoghelp", e => { window.top.openTrustedLinkIn( @@ -110,14 +103,20 @@ class BuiltinBridgeDialog { this._dialog.style.minWidth = "0"; this._dialog.style.minHeight = "0";
- obs.addObserver(this, TorConnectTopics.StateChange); + Services.obs.addObserver(this, TorConnectTopics.StateChange); }
onTorStateChange() { - if (TorConnect.state === TorConnectState.Configuring) { - this._acceptButton.setAttribute("label", TorStrings.settings.bridgeButtonConnect); + if (TorConnect.canBeginBootstrap) { + this._acceptButton.setAttribute( + "label", + TorStrings.settings.bridgeButtonConnect + ); } else { - this._acceptButton.setAttribute("label", TorStrings.settings.bridgeButtonAccept); + this._acceptButton.setAttribute( + "label", + TorStrings.settings.bridgeButtonAccept + ); } }
@@ -130,25 +129,26 @@ class BuiltinBridgeDialog {
observe(subject, topic, data) { switch (topic) { - case TorConnectTopics.StateChange: { + case TorConnectTopics.StateChange: this.onTorStateChange(); break; - } } }
close() { // unregister our observer topics - obs.removeObserver(this, TorConnectTopics.StateChange); + Services.obs.removeObserver(this, TorConnectTopics.StateChange); }
openDialog(gSubDialog) { gSubDialog.open( "chrome://browser/content/torpreferences/builtinBridgeDialog.xhtml", - { features: "resizable=yes", + { + features: "resizable=yes", closingCallback: () => { this.close(); - },}, + }, + }, this ); }
===================================== browser/components/torpreferences/content/connectionPane.js ===================================== @@ -323,7 +323,7 @@ const gConnectionPane = (function() { prefpane.querySelector(selectors.bridges.header).innerText = TorStrings.settings.bridgesHeading; prefpane.querySelector(selectors.bridges.description).textContent = - TorStrings.settings.bridgesDescription; + TorStrings.settings.bridgesDescription2; { const learnMore = prefpane.querySelector(selectors.bridges.learnMore); learnMore.setAttribute("value", TorStrings.settings.learnMore); @@ -424,7 +424,8 @@ const gConnectionPane = (function() { selectors.bridges.currentHeader ); bridgeHeader.textContent = TorStrings.settings.bridgeCurrent; - prefpane.querySelector(selectors.bridges.switchLabel).textContent = TorStrings.settings.allBridgesEnabled; + prefpane.querySelector(selectors.bridges.switchLabel).textContent = + TorStrings.settings.allBridgesEnabled; const bridgeSwitch = prefpane.querySelector(selectors.bridges.switch); bridgeSwitch.addEventListener("change", () => { TorSettings.bridges.enabled = bridgeSwitch.checked; @@ -887,34 +888,34 @@ const gConnectionPane = (function() { }); }
- { - this._confirmBridgeRemoval = () => { - const aParentWindow = Services.wm.getMostRecentWindow("navigator:browser"); - - const ps = Services.prompt; - const btnFlags = - ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING + - ps.BUTTON_POS_0_DEFAULT + - ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL; - - const notUsed = { value: false }; - const btnIndex = ps.confirmEx( - aParentWindow, - TorStrings.settings.bridgeRemoveAllDialogTitle, - TorStrings.settings.bridgeRemoveAllDialogDescription, - btnFlags, - TorStrings.settings.remove, - null, - null, - null, - notUsed - ); + this._confirmBridgeRemoval = () => { + const aParentWindow = Services.wm.getMostRecentWindow( + "navigator:browser" + );
- if (btnIndex === 0) { - this.onRemoveAllBridges(); - } - }; - } + const ps = Services.prompt; + const btnFlags = + ps.BUTTON_POS_0 * ps.BUTTON_TITLE_IS_STRING + + ps.BUTTON_POS_0_DEFAULT + + ps.BUTTON_POS_1 * ps.BUTTON_TITLE_CANCEL; + + const notUsed = { value: false }; + const btnIndex = ps.confirmEx( + aParentWindow, + TorStrings.settings.bridgeRemoveAllDialogTitle, + TorStrings.settings.bridgeRemoveAllDialogDescription, + btnFlags, + TorStrings.settings.remove, + null, + null, + null, + notUsed + ); + + if (btnIndex === 0) { + this.onRemoveAllBridges(); + } + };
// Advanced setup prefpane.querySelector(selectors.advanced.header).innerText = @@ -1058,25 +1059,41 @@ const gConnectionPane = (function() { },
onAddBuiltinBridge() { - const builtinBridgeDialog = new BuiltinBridgeDialog(aBridgeType => { - if (!aBridgeType) { - TorSettings.bridges.enabled = false; - TorSettings.bridges.builtin_type = ""; - } else { - TorSettings.bridges.enabled = true; - TorSettings.bridges.source = TorBridgeSource.BuiltIn; - TorSettings.bridges.builtin_type = aBridgeType; - } - TorSettings.saveToPrefs(); - TorSettings.applySettings().then(result => { + const builtinBridgeDialog = new BuiltinBridgeDialog( + async (bridgeType, connect) => { + if (!bridgeType) { + TorSettings.bridges.enabled = false; + TorSettings.bridges.builtin_type = ""; + } else { + TorSettings.bridges.enabled = true; + TorSettings.bridges.source = TorBridgeSource.BuiltIn; + TorSettings.bridges.builtin_type = bridgeType; + } + TorSettings.saveToPrefs(); + await TorSettings.applySettings(); + this._populateBridgeCards(); - }); - // The bridge dialog button is "connect" when Tor is not bootstrapped, - // so do the connect - if (TorConnect.state == TorConnectState.Configuring) { - TorConnect.openTorConnect({ beginBootstrap: true }) + + // The bridge dialog button is "connect" when Tor is not bootstrapped, + // so do the connect. + if (connect) { + // Start Bootstrapping, which should use the configured bridges. + // NOTE: We do this regardless of any previous TorConnect Error. + if (TorConnect.canBeginBootstrap) { + TorConnect.beginBootstrap(); + } + // Open "about:torconnect". + // FIXME: If there has been a previous bootstrapping error then + // "about:torconnect" will be trying to get the user to use + // AutoBootstrapping. It is not set up to handle a forced direct + // entry to plain Bootstrapping from this dialog so the UI will not + // be aligned. In particular the + // AboutTorConnect.uiState.bootstrapCause will be aligned to + // whatever was shown previously in "about:torconnect" instead. + TorConnect.openTorConnect(); + } } - }); + ); builtinBridgeDialog.openDialog(gSubDialog); },
===================================== browser/modules/TorStrings.jsm ===================================== @@ -94,7 +94,7 @@ const Loader = { quickstartCheckbox: "Always connect automatically", // Bridge settings bridgesHeading: "Bridges", - bridgesDescription: + bridgesDescription2: "Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.", bridgeLocation: "Your location", bridgeLocationAutomatic: "Automatic", @@ -116,7 +116,8 @@ const Loader = { allBridgesEnabled: "Use current bridges", bridgeRemoveAll: "Remove All Bridges", bridgeRemoveAllDialogTitle: "Remove all bridges?", - bridgeRemoveAllDialogDescription: "If these bridges were received from torproject.org or added manually, this action cannot be undone", + bridgeRemoveAllDialogDescription: + "If these bridges were received from torproject.org or added manually, this action cannot be undone", bridgeAdd: "Add a New Bridge", bridgeSelectBrowserBuiltin: "Choose from one of Tor Browser’s built-in bridges", @@ -138,20 +139,18 @@ const Loader = { // Scan bridge QR dialog scanQrTitle: "Scan the QR code", // Builtin bridges dialog - builtinBridgeTitle: "Built-In Bridges", builtinBridgeHeader: "Select a Built-In Bridge", - builtinBridgeDescription: + builtinBridgeDescription2: "Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor.", - builtinBridgeObfs4: "obfs4", builtinBridgeObfs4Title: "obfs4 (Built-in)", - builtinBridgeObfs4Description: + builtinBridgeObfs4Description2: "Makes your Tor traffic look like random data. May not work in heavily censored regions.", builtinBridgeSnowflake: "Snowflake", - builtinBridgeSnowflakeDescription: + builtinBridgeSnowflakeDescription2: "Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example.", builtinBridgeMeekAzure: "meek-azure", - builtinBridgeMeekAzureDescription: - "Makes it look like you’re connected to a Microsoft web site, instead of using Tor. May work in heavily censored regions, but is usually very slow.", + builtinBridgeMeekAzureDescription2: + "Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow.", bridgeButtonConnect: "Connect", bridgeButtonAccept: "OK", // Request bridges dialog
===================================== toolkit/torbutton/chrome/locale/en-US/settings.properties ===================================== @@ -26,7 +26,9 @@ settings.quickstartCheckbox=Always connect automatically
# Bridge settings settings.bridgesHeading=Bridges -settings.bridgesDescription=Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another. +# Old description used up to 12.0 - TODO: remove when 12.5 becomes stable: +settings.bridgesDescription=Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another. +settings.bridgesDescription2=Bridges help you securely access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another. settings.bridgeLocation=Your location settings.bridgeLocationAutomatic=Automatic settings.bridgeLocationFrequent=Frequently selected locations @@ -72,20 +74,26 @@ settings.cancel=Cancel settings.scanQrTitle=Scan the QR code
# Builtin bridges dialog -settings.builtinBridgeTitle=Built-In Bridges -# Bug 41617: Todo - delete builtinBridgeHeader, no longer user settings.builtinBridgeHeader=Select a Built-In Bridge -settings.builtinBridgeDescription=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor. -settings.builtinBridgeObfs4=obfs4 +settings.builtinBridgeDescription2=Tor Browser includes some specific types of bridges known as “pluggable transports”, which can help conceal the fact you’re using Tor. settings.builtinBridgeObfs4Title=obfs4 (Built-in) -settings.builtinBridgeObfs4Description=Makes your Tor traffic look like random data. May not work in heavily censored regions. +settings.builtinBridgeObfs4Description2=Makes your Tor traffic look like random data. May not work in heavily censored regions. settings.builtinBridgeSnowflake=Snowflake -settings.builtinBridgeSnowflakeDescription=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example. +settings.builtinBridgeSnowflakeDescription2=Routes your connection through Snowflake proxies to make it look like you’re placing a video call, for example. settings.builtinBridgeMeekAzure=meek-azure -settings.builtinBridgeMeekAzureDescription=Makes it look like you’re connected to a Microsoft web site, instead of using Tor. May work in heavily censored regions, but is usually very slow. +settings.builtinBridgeMeekAzureDescription2=Makes it look like you’re connected to a Microsoft website, instead of using Tor. May work in heavily censored regions, but is usually very slow. settings.bridgeButtonConnect=Connect settings.bridgeButtonAccept=OK
+# Old dialog strings used up to 12.0 - TODO: remove when 12.5 becomes stable: +settings.builtinBridgeTitle=Built-In Bridges +settings.builtinBridgeDescription=Tor Browser includes some specific types of bridges known as “pluggable transports”. +settings.builtinBridgeObfs4=obfs4 +settings.builtinBridgeObfs4Description=obfs4 is a type of built-in bridge that makes your Tor traffic look random. They are also less likely to be blocked than their predecessors, obfs3 bridges. +settings.builtinBridgeSnowflakeDescription=Snowflake is a built-in bridge that defeats censorship by routing your connection through Snowflake proxies, ran by volunteers. +settings.builtinBridgeMeekAzureDescription=meek-azure is a built-in bridge that makes it look like you are using a Microsoft web site instead of using Tor. +# end + # Request bridges dialog settings.requestBridgeDialogTitle=Request Bridge settings.submitCaptcha=Submit
View it on GitLab: https://gitlab.torproject.org/tpo/applications/tor-browser/-/compare/f0df648...