henry pushed to branch tor-browser-128.8.0esr-14.5-1 at The Tor Project / Applications / Tor Browser
Commits:
-
03900c02
by Henry Wilkes at 2025-03-10T11:05:42+00:00
-
8e2dc3e0
by Henry Wilkes at 2025-03-10T11:05:44+00:00
-
48d3af20
by Henry Wilkes at 2025-03-10T11:05:45+00:00
10 changed files:
- .eslintignore
- .prettierignore
- browser/components/torpreferences/content/connectionPane.js
- toolkit/components/torconnect/TorConnectParent.sys.mjs
- toolkit/components/torconnect/content/aboutTorConnect.js
- toolkit/content/jar.mn
- + toolkit/content/moat_countries_dev_build.json
- toolkit/modules/Moat.sys.mjs
- toolkit/modules/RemotePageAccessManager.sys.mjs
- toolkit/modules/TorConnect.sys.mjs
Changes:
... | ... | @@ -304,4 +304,5 @@ browser/app/profile/001-base-profile.js |
304 | 304 | browser/app/profile/000-tor-browser.js
|
305 | 305 | mobile/android/app/000-tor-browser-android.js
|
306 | 306 | toolkit/content/pt_config.json
|
307 | +toolkit/content/moat_contries_dev_build.json
|
|
307 | 308 | toolkit/components/lox/lox_wasm.jsm |
... | ... | @@ -1533,4 +1533,5 @@ browser/app/profile/001-base-profile.js |
1533 | 1533 | browser/app/profile/000-tor-browser.js
|
1534 | 1534 | mobile/android/app/000-tor-browser-android.js
|
1535 | 1535 | toolkit/content/pt_config.json
|
1536 | +toolkit/content/moat_countries_dev_build.json
|
|
1536 | 1537 | toolkit/components/lox/lox_wasm.jsm |
... | ... | @@ -2529,65 +2529,48 @@ const gConnectionPane = (function () { |
2529 | 2529 | regionCode: location.value,
|
2530 | 2530 | });
|
2531 | 2531 | });
|
2532 | - this._populateLocations = () => {
|
|
2533 | - const currentValue = location.value;
|
|
2534 | - locationEntries.textContent = "";
|
|
2535 | - const createItem = (value, label, disabled) => {
|
|
2536 | - const item = document.createXULElement("menuitem");
|
|
2537 | - item.setAttribute("value", value);
|
|
2538 | - item.setAttribute("label", label);
|
|
2539 | - if (disabled) {
|
|
2540 | - item.setAttribute("disabled", "true");
|
|
2541 | - }
|
|
2542 | - return item;
|
|
2543 | - };
|
|
2544 | - const addLocations = codes => {
|
|
2545 | - const items = [];
|
|
2546 | - for (const code of codes) {
|
|
2547 | - items.push(
|
|
2548 | - createItem(
|
|
2549 | - code,
|
|
2550 | - TorConnect.countryNames[code]
|
|
2551 | - ? TorConnect.countryNames[code]
|
|
2552 | - : code
|
|
2553 | - )
|
|
2554 | - );
|
|
2555 | - }
|
|
2556 | - items.sort((left, right) => left.label.localeCompare(right.label));
|
|
2557 | - locationEntries.append(...items);
|
|
2558 | - };
|
|
2559 | - locationEntries.append(
|
|
2560 | - createItem("automatic", TorStrings.settings.bridgeLocationAutomatic)
|
|
2561 | - );
|
|
2562 | - if (TorConnect.countryCodes.length) {
|
|
2563 | - locationEntries.append(
|
|
2564 | - createItem("", TorStrings.settings.bridgeLocationFrequent, true)
|
|
2565 | - );
|
|
2566 | - addLocations(TorConnect.countryCodes);
|
|
2567 | - locationEntries.append(
|
|
2568 | - createItem("", TorStrings.settings.bridgeLocationOther, true)
|
|
2532 | + const createItem = (value, label, disabled) => {
|
|
2533 | + const item = document.createXULElement("menuitem");
|
|
2534 | + item.setAttribute("value", value);
|
|
2535 | + item.setAttribute("label", label);
|
|
2536 | + if (disabled) {
|
|
2537 | + item.setAttribute("disabled", "true");
|
|
2538 | + }
|
|
2539 | + return item;
|
|
2540 | + };
|
|
2541 | + const addLocations = codes => {
|
|
2542 | + const items = [];
|
|
2543 | + for (const code of codes) {
|
|
2544 | + items.push(
|
|
2545 | + createItem(
|
|
2546 | + code,
|
|
2547 | + TorConnect.countryNames[code]
|
|
2548 | + ? TorConnect.countryNames[code]
|
|
2549 | + : code
|
|
2550 | + )
|
|
2569 | 2551 | );
|
2570 | 2552 | }
|
2571 | - addLocations(Object.keys(TorConnect.countryNames));
|
|
2572 | - location.value = currentValue;
|
|
2553 | + items.sort((left, right) => left.label.localeCompare(right.label));
|
|
2554 | + locationEntries.append(...items);
|
|
2573 | 2555 | };
|
2556 | + // Add automatic before waiting for getFrequentRegions.
|
|
2557 | + locationEntries.append(
|
|
2558 | + createItem("automatic", TorStrings.settings.bridgeLocationAutomatic)
|
|
2559 | + );
|
|
2560 | + location.value = "automatic";
|
|
2561 | + TorConnect.getFrequentRegions().then(frequentCodes => {
|
|
2562 | + locationEntries.append(
|
|
2563 | + createItem("", TorStrings.settings.bridgeLocationFrequent, true)
|
|
2564 | + );
|
|
2565 | + addLocations(frequentCodes);
|
|
2566 | + locationEntries.append(
|
|
2567 | + createItem("", TorStrings.settings.bridgeLocationOther, true)
|
|
2568 | + );
|
|
2569 | + addLocations(Object.keys(TorConnect.countryNames));
|
|
2570 | + });
|
|
2574 | 2571 | this._showAutoconfiguration = () => {
|
2575 | - if (
|
|
2576 | - !TorConnect.canBeginAutoBootstrap ||
|
|
2577 | - !TorConnect.potentiallyBlocked
|
|
2578 | - ) {
|
|
2579 | - locationGroup.setAttribute("hidden", "true");
|
|
2580 | - return;
|
|
2581 | - }
|
|
2582 | - // Populate locations, even though we will show only the automatic
|
|
2583 | - // item for a moment. In my opinion showing the button immediately is
|
|
2584 | - // better then waiting for the Moat query to finish (after a while)
|
|
2585 | - // and showing the controls only after that.
|
|
2586 | - this._populateLocations();
|
|
2587 | - locationGroup.removeAttribute("hidden");
|
|
2588 | - if (!TorConnect.countryCodes.length) {
|
|
2589 | - TorConnect.getCountryCodes().then(() => this._populateLocations());
|
|
2590 | - }
|
|
2572 | + locationGroup.hidden =
|
|
2573 | + !TorConnect.canBeginAutoBootstrap || !TorConnect.potentiallyBlocked;
|
|
2591 | 2574 | };
|
2592 | 2575 | this._showAutoconfiguration();
|
2593 | 2576 | }
|
... | ... | @@ -132,8 +132,8 @@ export class TorConnectParent extends JSWindowActorParent { |
132 | 132 | stage: TorConnect.stage,
|
133 | 133 | quickstartEnabled: TorConnect.quickstart,
|
134 | 134 | };
|
135 | - case "torconnect:get-country-codes":
|
|
136 | - return TorConnect.getCountryCodes();
|
|
135 | + case "torconnect:get-frequent-regions":
|
|
136 | + return TorConnect.getFrequentRegions();
|
|
137 | 137 | }
|
138 | 138 | return undefined;
|
139 | 139 | }
|
... | ... | @@ -610,7 +610,7 @@ class AboutTorConnect { |
610 | 610 | |
611 | 611 | showLocationForm(isChoose, buttonLabel) {
|
612 | 612 | this.hideButtons();
|
613 | - RPMSendQuery("torconnect:get-country-codes").then(codes => {
|
|
613 | + RPMSendQuery("torconnect:get-frequent-regions").then(codes => {
|
|
614 | 614 | if (codes && codes.length) {
|
615 | 615 | this.populateFrequentLocations(codes);
|
616 | 616 | this.setLocation();
|
... | ... | @@ -158,4 +158,9 @@ toolkit.jar: |
158 | 158 | content/global/third_party/d3/d3.js (/third_party/js/d3/d3.js)
|
159 | 159 | content/global/third_party/cfworker/json-schema.js (/third_party/js/cfworker/json-schema.js)
|
160 | 160 | |
161 | + # The pt_config.json content should be replaced in the omni.ja in
|
|
162 | + # tor-browser-build. See tor-browser#42343.
|
|
161 | 163 | content/global/pt_config.json (pt_config.json)
|
164 | + # The moat_countries.json content should be replaced in the omni.ja in
|
|
165 | + # tor-browser-build. See tor-browser#43463.
|
|
166 | + content/global/moat_countries.json (moat_countries_dev_build.json) |
1 | +[
|
|
2 | + {
|
|
3 | + "_comment1": "Used for dev build, replaced for release builds in tor-browser-build.",
|
|
4 | + "_comment2": "List is taken from tpo/anti-censorship/rdsys-admin 810fb24b:conf/circumvention.json and filtered with `jq -c keys`."
|
|
5 | + },
|
|
6 | + "by","cn","eg","hk","ir","mm","ru","tm"
|
|
7 | +] |
... | ... | @@ -335,20 +335,6 @@ export class MoatRPC { |
335 | 335 | return settings;
|
336 | 336 | }
|
337 | 337 | |
338 | - // Request a list of country codes with available censorship circumvention
|
|
339 | - // settings.
|
|
340 | - //
|
|
341 | - // returns an array of ISO 3166-1 alpha-2 country codes which we can query
|
|
342 | - // settings for.
|
|
343 | - async circumvention_countries() {
|
|
344 | - const args = {};
|
|
345 | - const { response } = await this.#makeRequest(
|
|
346 | - "circumvention/countries",
|
|
347 | - args
|
|
348 | - );
|
|
349 | - return response;
|
|
350 | - }
|
|
351 | - |
|
352 | 338 | // Request a copy of the builtin bridges, takes the following parameters:
|
353 | 339 | // - transports: optional, an array of transports we would like the latest
|
354 | 340 | // bridge strings for; if empty (or not given) returns all of them
|
... | ... | @@ -255,7 +255,7 @@ export let RemotePageAccessManager = { |
255 | 255 | ],
|
256 | 256 | RPMSendQuery: [
|
257 | 257 | "torconnect:get-init-args",
|
258 | - "torconnect:get-country-codes",
|
|
258 | + "torconnect:get-frequent-regions",
|
|
259 | 259 | ],
|
260 | 260 | },
|
261 | 261 | "about:welcome": {
|
... | ... | @@ -817,8 +817,14 @@ export const TorConnect = { |
817 | 817 | };
|
818 | 818 | },
|
819 | 819 | |
820 | - // list of country codes Moat has settings for
|
|
821 | - _countryCodes: [],
|
|
820 | + /**
|
|
821 | + * Promise that resolves to a list of region codes that Moat has special
|
|
822 | + * bridge settings for.
|
|
823 | + *
|
|
824 | + * @type {Promise<string[]>}
|
|
825 | + */
|
|
826 | + _moatRegionsPromise: null,
|
|
827 | + |
|
822 | 828 | _countryNames: Object.freeze(
|
823 | 829 | (() => {
|
824 | 830 | const codes = Services.intl.getAvailableLocaleDisplayNames("region");
|
... | ... | @@ -892,6 +898,18 @@ export const TorConnect = { |
892 | 898 | return;
|
893 | 899 | }
|
894 | 900 | |
901 | + this._moatRegionsPromise = fetch(
|
|
902 | + "chrome://global/content/moat_countries.json"
|
|
903 | + )
|
|
904 | + .then(req => req.json())
|
|
905 | + // Filter out the "_comment" object in the moat_countries_dev_build.json
|
|
906 | + // file.
|
|
907 | + .then(regionList => regionList.filter(r => typeof r === "string"))
|
|
908 | + .catch(e => {
|
|
909 | + lazy.logger.error("Failed to fetch Moat region codes", e);
|
|
910 | + return [];
|
|
911 | + });
|
|
912 | + |
|
895 | 913 | let observeTopic = addTopic => {
|
896 | 914 | Services.obs.addObserver(this, addTopic);
|
897 | 915 | lazy.logger.debug(`Observing topic '${addTopic}'`);
|
... | ... | @@ -1113,10 +1131,6 @@ export const TorConnect = { |
1113 | 1131 | return null;
|
1114 | 1132 | },
|
1115 | 1133 | |
1116 | - get countryCodes() {
|
|
1117 | - return this._countryCodes;
|
|
1118 | - },
|
|
1119 | - |
|
1120 | 1134 | get countryNames() {
|
1121 | 1135 | return this._countryNames;
|
1122 | 1136 | },
|
... | ... | @@ -1526,25 +1540,12 @@ export const TorConnect = { |
1526 | 1540 | this._makeStageRequest(TorConnectStage.ChooseRegion);
|
1527 | 1541 | },
|
1528 | 1542 | |
1529 | - /*
|
|
1530 | - Further external commands and helper methods
|
|
1543 | + /**
|
|
1544 | + * Get the list of regions that Moat has settings for.
|
|
1545 | + *
|
|
1546 | + * @returns {string[]} - The list of region codes.
|
|
1531 | 1547 | */
|
1532 | - |
|
1533 | - async getCountryCodes() {
|
|
1534 | - // Difference with the getter: this is to be called by TorConnectParent, and
|
|
1535 | - // downloads the country codes if they are not already in cache.
|
|
1536 | - if (this._countryCodes.length) {
|
|
1537 | - return this._countryCodes;
|
|
1538 | - }
|
|
1539 | - const mrpc = new lazy.MoatRPC();
|
|
1540 | - try {
|
|
1541 | - await mrpc.init();
|
|
1542 | - this._countryCodes = await mrpc.circumvention_countries();
|
|
1543 | - } catch (err) {
|
|
1544 | - lazy.logger.error("An error occurred while fetching country codes", err);
|
|
1545 | - } finally {
|
|
1546 | - mrpc.uninit();
|
|
1547 | - }
|
|
1548 | - return this._countryCodes;
|
|
1548 | + async getFrequentRegions() {
|
|
1549 | + return this._moatRegionsPromise ?? [];
|
|
1549 | 1550 | },
|
1550 | 1551 | }; |