Pier Angelo Vendrame pushed to branch tor-browser-128.7.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
e0edfde0
by Henry Wilkes at 2025-02-25T14:30:32+00:00
-
163e2fae
by Henry Wilkes at 2025-02-25T14:30:32+00:00
-
1f7e489c
by Henry Wilkes at 2025-02-25T14:30:32+00:00
9 changed files:
- browser/base/content/browser-init.js
- browser/base/content/browser.js
- browser/base/content/browser.js.globals
- browser/components/torpreferences/content/connectionPane.js
- browser/modules/URILoadingHelper.sys.mjs
- toolkit/components/torconnect/TorConnectChild.sys.mjs
- toolkit/components/torconnect/TorConnectParent.sys.mjs
- toolkit/components/torconnect/content/torConnectUrlbarButton.js
- toolkit/modules/TorConnect.sys.mjs
Changes:
... | ... | @@ -980,14 +980,9 @@ var gBrowserInit = { |
980 | 980 | |
981 | 981 | // if using TorConnect, convert these uris to redirects
|
982 | 982 | if (TorConnect.shouldShowTorConnect) {
|
983 | - return Promise.resolve(uri).then(aUri => {
|
|
984 | - if (aUri == null) {
|
|
985 | - aUri = [];
|
|
986 | - }
|
|
987 | - |
|
988 | - aUri = TorConnect.getURIsToLoad(aUri);
|
|
989 | - return aUri;
|
|
990 | - });
|
|
983 | + return Promise.resolve(uri).then(aUri =>
|
|
984 | + TorConnectParent.getURIsToLoad(aUri ?? [])
|
|
985 | + );
|
|
991 | 986 | }
|
992 | 987 | return uri;
|
993 | 988 | })());
|
... | ... | @@ -86,6 +86,7 @@ ChromeUtils.defineESModuleGetters(this, { |
86 | 86 | TorConnect: "resource://gre/modules/TorConnect.sys.mjs",
|
87 | 87 | TorConnectStage: "resource://gre/modules/TorConnect.sys.mjs",
|
88 | 88 | TorConnectTopics: "resource://gre/modules/TorConnect.sys.mjs",
|
89 | + TorConnectParent: "resource://gre/actors/TorConnectParent.sys.mjs",
|
|
89 | 90 | TorDomainIsolator: "resource://gre/modules/TorDomainIsolator.sys.mjs",
|
90 | 91 | TorUIUtils: "resource:///modules/TorUIUtils.sys.mjs",
|
91 | 92 | TranslationsParent: "resource://gre/actors/TranslationsParent.sys.mjs",
|
... | ... | @@ -279,6 +279,7 @@ |
279 | 279 | "TorConnect",
|
280 | 280 | "TorConnectStage",
|
281 | 281 | "TorConnectTopics",
|
282 | + "TorConnectParent",
|
|
282 | 283 | "gTorConnectUrlbarButton",
|
283 | 284 | "gTorConnectTitlebarStatus",
|
284 | 285 | "OnionAuthPrompt",
|
... | ... | @@ -25,6 +25,10 @@ const { TorProviderBuilder, TorProviderTopics } = ChromeUtils.importESModule( |
25 | 25 | const { InternetStatus, TorConnect, TorConnectTopics, TorConnectStage } =
|
26 | 26 | ChromeUtils.importESModule("resource://gre/modules/TorConnect.sys.mjs");
|
27 | 27 | |
28 | +const { TorConnectParent } = ChromeUtils.importESModule(
|
|
29 | + "resource://gre/actors/TorConnectParent.sys.mjs"
|
|
30 | +);
|
|
31 | + |
|
28 | 32 | const { QRCode } = ChromeUtils.importESModule(
|
29 | 33 | "resource://gre/modules/QRCode.sys.mjs"
|
30 | 34 | );
|
... | ... | @@ -2261,7 +2265,7 @@ const gBridgeSettings = { |
2261 | 2265 | |
2262 | 2266 | // Start Bootstrapping, which should use the configured bridges.
|
2263 | 2267 | // NOTE: We do this regardless of any previous TorConnect Error.
|
2264 | - TorConnect.openTorConnect({ beginBootstrapping: "hard" });
|
|
2268 | + TorConnectParent.open({ beginBootstrapping: "hard" });
|
|
2265 | 2269 | });
|
2266 | 2270 | },
|
2267 | 2271 | // closedCallback should be called after gSubDialog has already
|
... | ... | @@ -2374,7 +2378,7 @@ const gNetworkStatus = { |
2374 | 2378 | "network-status-tor-connect-button"
|
2375 | 2379 | );
|
2376 | 2380 | this._torConnectButton.addEventListener("click", () => {
|
2377 | - TorConnect.openTorConnect({ beginBootstrapping: "soft" });
|
|
2381 | + TorConnectParent.open({ beginBootstrapping: "soft" });
|
|
2378 | 2382 | });
|
2379 | 2383 | |
2380 | 2384 | this._updateInternetStatus();
|
... | ... | @@ -2513,7 +2517,10 @@ const gConnectionPane = (function () { |
2513 | 2517 | TorStrings.settings.bridgeChooseForMe
|
2514 | 2518 | );
|
2515 | 2519 | chooseForMe.addEventListener("command", () => {
|
2516 | - TorConnect.openTorConnect({
|
|
2520 | + if (!location.value) {
|
|
2521 | + return;
|
|
2522 | + }
|
|
2523 | + TorConnectParent.open({
|
|
2517 | 2524 | beginBootstrapping: "hard",
|
2518 | 2525 | regionCode: location.value,
|
2519 | 2526 | });
|
... | ... | @@ -12,6 +12,7 @@ ChromeUtils.defineESModuleGetters(lazy, { |
12 | 12 | AboutNewTab: "resource:///modules/AboutNewTab.sys.mjs",
|
13 | 13 | BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
|
14 | 14 | TorConnect: "resource://gre/modules/TorConnect.sys.mjs",
|
15 | + TorConnectParent: "resource://gre/actors/TorConnectParent.sys.mjs",
|
|
15 | 16 | });
|
16 | 17 | |
17 | 18 | ChromeUtils.defineLazyGetter(lazy, "ReferrerInfo", () =>
|
... | ... | @@ -445,7 +446,7 @@ export const URILoadingHelper = { |
445 | 446 | (url === "about:newtab" &&
|
446 | 447 | Services.prefs.getBoolPref("browser.newtabpage.enabled", false))
|
447 | 448 | ) {
|
448 | - url = lazy.TorConnect.getRedirectURL(url);
|
|
449 | + url = lazy.TorConnectParent.getRedirectURL(url);
|
|
449 | 450 | }
|
450 | 451 | }
|
451 | 452 |
... | ... | @@ -55,8 +55,8 @@ export class TorConnectChild extends RemotePageChild { |
55 | 55 | } else {
|
56 | 56 | console.error(`Scheme is not allowed "${redirect}"`);
|
57 | 57 | }
|
58 | - } catch {
|
|
59 | - console.error(`Invalid redirect URL "${redirect}"`);
|
|
58 | + } catch (e) {
|
|
59 | + console.error(`Invalid redirect URL "${redirect}"`, e);
|
|
60 | 60 | }
|
61 | 61 | |
62 | 62 | // Replace the destination to prevent "about:torconnect" entering the
|
... | ... | @@ -9,7 +9,8 @@ import { |
9 | 9 | const lazy = {};
|
10 | 10 | |
11 | 11 | ChromeUtils.defineESModuleGetters(lazy, {
|
12 | - HomePage: "resource:///modules/HomePage.sys.jsm",
|
|
12 | + BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
|
|
13 | + HomePage: "resource:///modules/HomePage.sys.mjs",
|
|
13 | 14 | });
|
14 | 15 | |
15 | 16 | /*
|
... | ... | @@ -88,7 +89,9 @@ export class TorConnectParent extends JSWindowActorParent { |
88 | 89 | return Promise.resolve(TorConnect.shouldShowTorConnect);
|
89 | 90 | case "torconnect:home-page":
|
90 | 91 | // If there are multiple home pages, just load the first one.
|
91 | - return Promise.resolve(TorConnect.fixupURIs(lazy.HomePage.get())[0]);
|
|
92 | + return Promise.resolve(
|
|
93 | + TorConnectParent.fixupURIs(lazy.HomePage.get())[0]
|
|
94 | + );
|
|
92 | 95 | case "torconnect:set-quickstart":
|
93 | 96 | TorConnect.quickstart = message.data;
|
94 | 97 | break;
|
... | ... | @@ -134,4 +137,111 @@ export class TorConnectParent extends JSWindowActorParent { |
134 | 137 | }
|
135 | 138 | return undefined;
|
136 | 139 | }
|
140 | + |
|
141 | + /**
|
|
142 | + * Open the "about:torconnect" tab.
|
|
143 | + *
|
|
144 | + * Bootstrapping can also be automatically triggered at the same time, if the
|
|
145 | + * current TorConnect stage allows for it.
|
|
146 | + *
|
|
147 | + * @param {object} [options] - extra options.
|
|
148 | + * @param {"soft"|"hard"} [options.beginBootstrapping] - Whether to try and
|
|
149 | + * begin bootstrapping. "soft" will only trigger the bootstrap if we are not
|
|
150 | + * `potentiallyBlocked`. "hard" will try begin the bootstrap regardless.
|
|
151 | + * @param {string} [options.regionCode] - A region to pass in for
|
|
152 | + * auto-bootstrapping.
|
|
153 | + */
|
|
154 | + static open(options) {
|
|
155 | + const win = lazy.BrowserWindowTracker.getTopWindow();
|
|
156 | + win.switchToTabHavingURI("about:torconnect", true, {
|
|
157 | + ignoreQueryString: true,
|
|
158 | + });
|
|
159 | + |
|
160 | + if (!options?.beginBootstrapping || !TorConnect.canBeginBootstrap) {
|
|
161 | + return;
|
|
162 | + }
|
|
163 | + |
|
164 | + if (options.beginBootstrapping === "hard") {
|
|
165 | + if (TorConnect.canBeginAutoBootstrap && !options.regionCode) {
|
|
166 | + // Treat as an addition startAgain request to first move back to the
|
|
167 | + // "Start" stage before bootstrapping.
|
|
168 | + TorConnect.startAgain();
|
|
169 | + }
|
|
170 | + } else if (TorConnect.potentiallyBlocked) {
|
|
171 | + // Do not trigger the bootstrap if we have ever had an error.
|
|
172 | + return;
|
|
173 | + }
|
|
174 | + |
|
175 | + TorConnect.beginBootstrapping(options.regionCode);
|
|
176 | + }
|
|
177 | + |
|
178 | + /**
|
|
179 | + * Convert the given url into an about:torconnect page that redirects to it.
|
|
180 | + *
|
|
181 | + * @param {string} url - The url to convert.
|
|
182 | + *
|
|
183 | + * @returns {string} - The about:torconnect url.
|
|
184 | + */
|
|
185 | + static getRedirectURL(url) {
|
|
186 | + return `about:torconnect?redirect=${encodeURIComponent(url)}`;
|
|
187 | + }
|
|
188 | + |
|
189 | + /**
|
|
190 | + * Convert the given object into a list of valid URIs.
|
|
191 | + *
|
|
192 | + * The object is either from the user's homepage preference (which may
|
|
193 | + * contain multiple domains separated by "|") or uris passed to the browser
|
|
194 | + * via command-line.
|
|
195 | + *
|
|
196 | + * @param {string|string[]} uriVariant - The string to extract uris from.
|
|
197 | + *
|
|
198 | + * @returns {string[]} - The array of uris found.
|
|
199 | + */
|
|
200 | + static fixupURIs(uriVariant) {
|
|
201 | + let uriArray;
|
|
202 | + if (typeof uriVariant === "string") {
|
|
203 | + uriArray = uriVariant.split("|");
|
|
204 | + } else if (
|
|
205 | + Array.isArray(uriVariant) &&
|
|
206 | + uriVariant.every(entry => typeof entry === "string")
|
|
207 | + ) {
|
|
208 | + uriArray = uriVariant;
|
|
209 | + } else {
|
|
210 | + // about:tor as safe fallback
|
|
211 | + console.error(`Received unknown variant '${JSON.stringify(uriVariant)}'`);
|
|
212 | + uriArray = ["about:tor"];
|
|
213 | + }
|
|
214 | + |
|
215 | + // Attempt to convert user-supplied string to a uri, fallback to
|
|
216 | + // about:tor if cannot convert to valid uri object
|
|
217 | + return uriArray.map(uriString => {
|
|
218 | + try {
|
|
219 | + return (
|
|
220 | + Services.uriFixup.getFixupURIInfo(
|
|
221 | + uriString,
|
|
222 | + Ci.nsIURIFixup.FIXUP_FLAG_NONE
|
|
223 | + ).preferredURI?.spec ?? "about:tor"
|
|
224 | + );
|
|
225 | + } catch (e) {
|
|
226 | + console.error(`Failed to parse ${uriString}`, e);
|
|
227 | + return "about:tor";
|
|
228 | + }
|
|
229 | + });
|
|
230 | + }
|
|
231 | + |
|
232 | + /**
|
|
233 | + * Replace startup URIs (home pages or command line) with about:torconnect
|
|
234 | + * URIs which redirect to them after bootstrapping.
|
|
235 | + *
|
|
236 | + * @param {string|string[]} uriVariant - The string to extract uris from.
|
|
237 | + *
|
|
238 | + * @returns {string[]} - The array or uris to use instead.
|
|
239 | + */
|
|
240 | + static getURIsToLoad(uriVariant) {
|
|
241 | + const uris = this.fixupURIs(uriVariant);
|
|
242 | + const localUriRx = /^(file:|moz-extension:)/;
|
|
243 | + return uris.map(uri =>
|
|
244 | + localUriRx.test(uri) ? uri : this.getRedirectURL(uri)
|
|
245 | + );
|
|
246 | + }
|
|
137 | 247 | } |
... | ... | @@ -105,7 +105,7 @@ var gTorConnectUrlbarButton = { |
105 | 105 | * Begin the tor connection bootstrapping process.
|
106 | 106 | */
|
107 | 107 | connect() {
|
108 | - TorConnect.openTorConnect({ beginBootstrapping: "soft" });
|
|
108 | + TorConnectParent.open({ beginBootstrapping: "soft" });
|
|
109 | 109 | },
|
110 | 110 | |
111 | 111 | /**
|
... | ... | @@ -7,7 +7,6 @@ import { setTimeout, clearTimeout } from "resource://gre/modules/Timer.sys.mjs"; |
7 | 7 | const lazy = {};
|
8 | 8 | |
9 | 9 | ChromeUtils.defineESModuleGetters(lazy, {
|
10 | - BrowserWindowTracker: "resource:///modules/BrowserWindowTracker.sys.mjs",
|
|
11 | 10 | MoatRPC: "resource://gre/modules/Moat.sys.mjs",
|
12 | 11 | TorBootstrapRequest: "resource://gre/modules/TorBootstrapRequest.sys.mjs",
|
13 | 12 | TorProviderTopics: "resource://gre/modules/TorProviderBuilder.sys.mjs",
|
... | ... | @@ -1534,47 +1533,6 @@ export const TorConnect = { |
1534 | 1533 | Further external commands and helper methods
|
1535 | 1534 | */
|
1536 | 1535 | |
1537 | - /**
|
|
1538 | - * Open the "about:torconnect" tab.
|
|
1539 | - *
|
|
1540 | - * Bootstrapping or AutoBootstrapping can also be automatically triggered at
|
|
1541 | - * the same time, if the current state allows for it.
|
|
1542 | - *
|
|
1543 | - * Bootstrapping will not be triggered if the connection is
|
|
1544 | - * potentially blocked.
|
|
1545 | - *
|
|
1546 | - * @param {object} [options] - extra options.
|
|
1547 | - * @property {"soft"|"hard"} [options.beginBootstrapping] - Whether to try and
|
|
1548 | - * begin bootstrapping. "soft" will only trigger the bootstrap if we are not
|
|
1549 | - * `potentiallyBlocked`. "hard" will try begin the bootstrap regardless.
|
|
1550 | - * @property {string} [options.regionCode] - A region to pass in for
|
|
1551 | - * auto-bootstrapping.
|
|
1552 | - */
|
|
1553 | - openTorConnect(options) {
|
|
1554 | - // FIXME: Should we move this to the about:torconnect actor?
|
|
1555 | - const win = lazy.BrowserWindowTracker.getTopWindow();
|
|
1556 | - win.switchToTabHavingURI("about:torconnect", true, {
|
|
1557 | - ignoreQueryString: true,
|
|
1558 | - });
|
|
1559 | - |
|
1560 | - if (!options?.beginBootstrapping || !this.canBeginBootstrap) {
|
|
1561 | - return;
|
|
1562 | - }
|
|
1563 | - |
|
1564 | - if (options.beginBootstrapping === "hard") {
|
|
1565 | - if (this.canBeginAutoBootstrap && !options.regionCode) {
|
|
1566 | - // Treat as an addition startAgain request to first move back to the
|
|
1567 | - // "Start" stage before bootstrapping.
|
|
1568 | - this.startAgain();
|
|
1569 | - }
|
|
1570 | - } else if (this.potentiallyBlocked) {
|
|
1571 | - // Do not trigger the bootstrap if we have ever had an error.
|
|
1572 | - return;
|
|
1573 | - }
|
|
1574 | - |
|
1575 | - this.beginBootstrapping(options.regionCode);
|
|
1576 | - },
|
|
1577 | - |
|
1578 | 1536 | async getCountryCodes() {
|
1579 | 1537 | // Difference with the getter: this is to be called by TorConnectParent, and
|
1580 | 1538 | // downloads the country codes if they are not already in cache.
|
... | ... | @@ -1592,64 +1550,4 @@ export const TorConnect = { |
1592 | 1550 | }
|
1593 | 1551 | return this._countryCodes;
|
1594 | 1552 | },
|
1595 | - |
|
1596 | - getRedirectURL(url) {
|
|
1597 | - return `about:torconnect?redirect=${encodeURIComponent(url)}`;
|
|
1598 | - },
|
|
1599 | - |
|
1600 | - /**
|
|
1601 | - * Convert the given object into a list of valid URIs.
|
|
1602 | - *
|
|
1603 | - * The object is either from the user's homepage preference (which may
|
|
1604 | - * contain multiple domains separated by "|") or uris passed to the browser
|
|
1605 | - * via command-line.
|
|
1606 | - *
|
|
1607 | - * @param {string|string[]} uriVariant - The string to extract uris from.
|
|
1608 | - *
|
|
1609 | - * @return {string[]} - The array of uris found.
|
|
1610 | - */
|
|
1611 | - fixupURIs(uriVariant) {
|
|
1612 | - let uriArray;
|
|
1613 | - if (typeof uriVariant === "string") {
|
|
1614 | - uriArray = uriVariant.split("|");
|
|
1615 | - } else if (
|
|
1616 | - Array.isArray(uriVariant) &&
|
|
1617 | - uriVariant.every(entry => typeof entry === "string")
|
|
1618 | - ) {
|
|
1619 | - uriArray = uriVariant;
|
|
1620 | - } else {
|
|
1621 | - // about:tor as safe fallback
|
|
1622 | - lazy.logger.error(
|
|
1623 | - `Received unknown variant '${JSON.stringify(uriVariant)}'`
|
|
1624 | - );
|
|
1625 | - uriArray = ["about:tor"];
|
|
1626 | - }
|
|
1627 | - |
|
1628 | - // Attempt to convert user-supplied string to a uri, fallback to
|
|
1629 | - // about:tor if cannot convert to valid uri object
|
|
1630 | - return uriArray.map(
|
|
1631 | - uriString =>
|
|
1632 | - Services.uriFixup.getFixupURIInfo(
|
|
1633 | - uriString,
|
|
1634 | - Ci.nsIURIFixup.FIXUP_FLAG_NONE
|
|
1635 | - ).preferredURI?.spec ?? "about:tor"
|
|
1636 | - );
|
|
1637 | - },
|
|
1638 | - |
|
1639 | - // called from browser.js on browser startup, passed in either the user's homepage(s)
|
|
1640 | - // or uris passed via command-line; we want to replace them with about:torconnect uris
|
|
1641 | - // which redirect after bootstrapping
|
|
1642 | - getURIsToLoad(uriVariant) {
|
|
1643 | - const uris = this.fixupURIs(uriVariant);
|
|
1644 | - const localUriRx = /^(file:\/\/\/|moz-extension:)/;
|
|
1645 | - lazy.logger.debug(
|
|
1646 | - `Will load after bootstrap => [${uris
|
|
1647 | - .filter(uri => !localUriRx.test(uri))
|
|
1648 | - .join(", ")}]`
|
|
1649 | - );
|
|
1650 | - |
|
1651 | - return uris.map(uri =>
|
|
1652 | - localUriRx.test(uri) ? uri : this.getRedirectURL(uri)
|
|
1653 | - );
|
|
1654 | - },
|
|
1655 | 1553 | }; |