tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2021
- 16 participants
- 1356 discussions

[tor-browser/tor-browser-88.0-10.5-1] Bug 31607: App menu items stop working on macOS
by sysrqb@torproject.org 21 Apr '21
by sysrqb@torproject.org 21 Apr '21
21 Apr '21
commit 39b8b232ae5c06a6a1edf5fb40db23409ec3ac16
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Oct 3 10:53:43 2019 -0400
Bug 31607: App menu items stop working on macOS
Avoid re-creating the hidden window, since this causes the nsMenuBarX
object that is associated with the app menu to be freed (which in
turn causes all of the app menu items to stop working).
More detail: There should only be one hidden window.
XREMain::XRE_mainRun() contains an explicit call to create the
hidden window and that is the normal path by which it is created.
However, when Tor Launcher's wizard/progress window is opened during
startup, a hidden window is created earlier as a side effect of
calls to nsAppShellService::GetHiddenWindow(). Then, when
XREMain::XRE_mainRun() creates its hidden window, the original one
is freed which also causes the app menu's nsMenuBarX object which
is associated with that window to be destroyed. When that happens,
the menuGroupOwner property within each Cocoa menu items's MenuItemInfo
object is cleared. This breaks the link that is necessary for
NativeMenuItemTarget's menuItemHit method to dispatch a menu item
event.
---
xpfe/appshell/nsAppShellService.cpp | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/xpfe/appshell/nsAppShellService.cpp b/xpfe/appshell/nsAppShellService.cpp
index c7c3da49d86e..1cb1c6f5a7f9 100644
--- a/xpfe/appshell/nsAppShellService.cpp
+++ b/xpfe/appshell/nsAppShellService.cpp
@@ -93,6 +93,10 @@ void nsAppShellService::EnsureHiddenWindow() {
NS_IMETHODIMP
nsAppShellService::CreateHiddenWindow() {
+ if (mHiddenWindow) {
+ return NS_OK;
+ }
+
if (!XRE_IsParentProcess()) {
return NS_ERROR_NOT_IMPLEMENTED;
}
1
0

[tor-browser/tor-browser-88.0-10.5-1] Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#tor
by sysrqb@torproject.org 21 Apr '21
by sysrqb@torproject.org 21 Apr '21
21 Apr '21
commit 15eeb12159695a18caba7109485b4a0e3d55363f
Author: Richard Pospesel <richard(a)torproject.org>
Date: Mon Sep 16 15:25:39 2019 -0700
Bug 31286: Implementation of bridge, proxy, and firewall settings in about:preferences#tor
This patch adds a new about:preferences#tor page which allows modifying
bridge, proxy, and firewall settings from within Tor Browser. All of the
functionality present in tor-launcher's Network Configuration panel is
present:
- Setting built-in bridges
- Requesting bridges from BridgeDB via moat
- Using user-provided bridges
- Configuring SOCKS4, SOCKS5, and HTTP/HTTPS proxies
- Setting firewall ports
- Viewing and Copying Tor's logs
- The Networking Settings in General preferences has been removed
---
browser/components/moz.build | 1 +
browser/components/preferences/main.inc.xhtml | 55 --
browser/components/preferences/main.js | 14 -
browser/components/preferences/preferences.js | 9 +
browser/components/preferences/preferences.xhtml | 5 +
browser/components/preferences/privacy.js | 1 +
.../torpreferences/content/parseFunctions.jsm | 89 +++
.../torpreferences/content/requestBridgeDialog.jsm | 204 +++++
.../content/requestBridgeDialog.xhtml | 35 +
.../torpreferences/content/torBridgeSettings.jsm | 325 ++++++++
.../torpreferences/content/torCategory.inc.xhtml | 9 +
.../torpreferences/content/torFirewallSettings.jsm | 72 ++
.../torpreferences/content/torLogDialog.jsm | 66 ++
.../torpreferences/content/torLogDialog.xhtml | 23 +
.../components/torpreferences/content/torPane.js | 857 +++++++++++++++++++++
.../torpreferences/content/torPane.xhtml | 123 +++
.../torpreferences/content/torPreferences.css | 77 ++
.../torpreferences/content/torPreferencesIcon.svg | 5 +
.../torpreferences/content/torProxySettings.jsm | 245 ++++++
browser/components/torpreferences/jar.mn | 14 +
browser/components/torpreferences/moz.build | 1 +
browser/modules/BridgeDB.jsm | 110 +++
browser/modules/TorProtocolService.jsm | 212 +++++
browser/modules/moz.build | 2 +
24 files changed, 2485 insertions(+), 69 deletions(-)
diff --git a/browser/components/moz.build b/browser/components/moz.build
index ef09055b990a..e99fa19d896a 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -55,6 +55,7 @@ DIRS += [
"syncedtabs",
"uitour",
"urlbar",
+ "torpreferences",
"translation",
]
diff --git a/browser/components/preferences/main.inc.xhtml b/browser/components/preferences/main.inc.xhtml
index 2d55e165c5ba..78d0cea8b8a2 100644
--- a/browser/components/preferences/main.inc.xhtml
+++ b/browser/components/preferences/main.inc.xhtml
@@ -665,59 +665,4 @@
<label id="cfrFeaturesLearnMore" class="learnMore" data-l10n-id="browsing-cfr-recommendations-learn-more" is="text-link"/>
</hbox>
</groupbox>
-
-<hbox id="networkProxyCategory"
- class="subcategory"
- hidden="true"
- data-category="paneGeneral">
- <html:h1 data-l10n-id="network-settings-title"/>
-</hbox>
-
-<!-- Network Settings-->
-<groupbox id="connectionGroup" data-category="paneGeneral" hidden="true">
- <label class="search-header" hidden="true"><html:h2 data-l10n-id="network-settings-title"/></label>
-
- <hbox align="center">
- <hbox align="center" flex="1">
- <description id="connectionSettingsDescription" control="connectionSettings"/>
- <spacer width="5"/>
- <label id="connectionSettingsLearnMore" class="learnMore" is="text-link"
- data-l10n-id="network-proxy-connection-learn-more">
- </label>
- <separator orient="vertical"/>
- </hbox>
-
- <!-- Please don't remove the wrapping hbox/vbox/box for these elements. It's used to properly compute the search tooltip position. -->
- <hbox>
- <button id="connectionSettings"
- is="highlightable-button"
- class="accessory-button"
- data-l10n-id="network-proxy-connection-settings"
- searchkeywords="doh trr"
- search-l10n-ids="
- connection-window.title,
- connection-proxy-option-no.label,
- connection-proxy-option-auto.label,
- connection-proxy-option-system.label,
- connection-proxy-option-manual.label,
- connection-proxy-http,
- connection-proxy-https,
- connection-proxy-ftp,
- connection-proxy-http-port,
- connection-proxy-socks,
- connection-proxy-socks4,
- connection-proxy-socks5,
- connection-proxy-noproxy,
- connection-proxy-noproxy-desc,
- connection-proxy-http-sharing.label,
- connection-proxy-autotype.label,
- connection-proxy-reload.label,
- connection-proxy-autologin.label,
- connection-proxy-socks-remote-dns.label,
- connection-dns-over-https.label,
- connection-dns-over-https-url-custom.label,
- " />
- </hbox>
- </hbox>
-</groupbox>
</html:template>
diff --git a/browser/components/preferences/main.js b/browser/components/preferences/main.js
index b5a192fc274a..6daf5b329878 100644
--- a/browser/components/preferences/main.js
+++ b/browser/components/preferences/main.js
@@ -364,15 +364,6 @@ var gMainPane = {
});
this.updatePerformanceSettingsBox({ duringChangeEvent: false });
this.displayUseSystemLocale();
- let connectionSettingsLink = document.getElementById(
- "connectionSettingsLearnMore"
- );
- let connectionSettingsUrl =
- Services.urlFormatter.formatURLPref("app.support.baseURL") +
- "prefs-connection-settings";
- connectionSettingsLink.setAttribute("href", connectionSettingsUrl);
- this.updateProxySettingsUI();
- initializeProxyUI(gMainPane);
if (Services.prefs.getBoolPref("intl.multilingual.enabled")) {
gMainPane.initBrowserLocale();
@@ -506,11 +497,6 @@ var gMainPane = {
"change",
gMainPane.updateHardwareAcceleration.bind(gMainPane)
);
- setEventListener(
- "connectionSettings",
- "command",
- gMainPane.showConnections
- );
setEventListener(
"browserContainersCheckbox",
"command",
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index 91e9e469cea2..a89fddd0306d 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -13,6 +13,7 @@
/* import-globals-from findInPage.js */
/* import-globals-from ../../base/content/utilityOverlay.js */
/* import-globals-from ../../../toolkit/content/preferencesBindings.js */
+/* import-globals-from ../torpreferences/content/torPane.js */
"use strict";
@@ -136,6 +137,14 @@ function init_all() {
register_module("paneSync", gSyncPane);
}
register_module("paneSearchResults", gSearchResultsPane);
+ if (gTorPane.enabled) {
+ document.getElementById("category-tor").hidden = false;
+ register_module("paneTor", gTorPane);
+ } else {
+ // Remove the pane from the DOM so it doesn't get incorrectly included in search results.
+ document.getElementById("template-paneTor").remove();
+ }
+
gSearchResultsPane.init();
gMainPane.preInit();
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index c1322ea10357..fd4098471966 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -13,6 +13,7 @@
<?xml-stylesheet href="chrome://browser/skin/preferences/containers.css"?>
<?xml-stylesheet href="chrome://browser/skin/preferences/privacy.css"?>
<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPreferences.css"?>
+<?xml-stylesheet href="chrome://browser/content/torpreferences/torPreferences.css"?>
<!DOCTYPE html [
<!ENTITY % aboutTorDTD SYSTEM "chrome://torbutton/locale/aboutTor.dtd">
@@ -155,6 +156,9 @@
<image class="category-icon"/>
<label class="category-name" flex="1" data-l10n-id="pane-experimental-title"></label>
</richlistitem>
+
+#include ../torpreferences/content/torCategory.inc.xhtml
+
</richlistbox>
<spacer flex="1"/>
@@ -208,6 +212,7 @@
#include containers.inc.xhtml
#include sync.inc.xhtml
#include experimental.inc.xhtml
+#include ../torpreferences/content/torPane.xhtml
</vbox>
</vbox>
</vbox>
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index 8401d4d101e4..1c5f31934d82 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -80,6 +80,7 @@ XPCOMUtils.defineLazyGetter(this, "AlertsServiceDND", function() {
}
});
+// TODO: module import via ChromeUtils.defineModuleGetter
XPCOMUtils.defineLazyScriptGetter(
this,
["SecurityLevelPreferences"],
diff --git a/browser/components/torpreferences/content/parseFunctions.jsm b/browser/components/torpreferences/content/parseFunctions.jsm
new file mode 100644
index 000000000000..954759de63a5
--- /dev/null
+++ b/browser/components/torpreferences/content/parseFunctions.jsm
@@ -0,0 +1,89 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "parsePort",
+ "parseAddrPort",
+ "parseUsernamePassword",
+ "parseAddrPortList",
+ "parseBridgeStrings",
+ "parsePortList",
+];
+
+// expects a string representation of an integer from 1 to 65535
+let parsePort = function(aPort) {
+ // ensure port string is a valid positive integer
+ const validIntRegex = /^[0-9]+$/;
+ if (!validIntRegex.test(aPort)) {
+ throw new Error(`Invalid PORT string : '${aPort}'`);
+ }
+
+ // ensure port value is on valid range
+ let port = Number.parseInt(aPort);
+ if (port < 1 || port > 65535) {
+ throw new Error(
+ `Invalid PORT value, needs to be on range [1,65535] : '${port}'`
+ );
+ }
+
+ return port;
+};
+// expects a string in the format: "ADDRESS:PORT"
+let parseAddrPort = function(aAddrColonPort) {
+ let tokens = aAddrColonPort.split(":");
+ if (tokens.length != 2) {
+ throw new Error(`Invalid ADDRESS:PORT string : '${aAddrColonPort}'`);
+ }
+ let address = tokens[0];
+ let port = parsePort(tokens[1]);
+ return [address, port];
+};
+
+// expects a string in the format: "USERNAME:PASSWORD"
+// split on the first colon and any subsequent go into password
+let parseUsernamePassword = function(aUsernameColonPassword) {
+ let colonIndex = aUsernameColonPassword.indexOf(":");
+ if (colonIndex < 0) {
+ // we don't log the contents of the potentially password containing string
+ throw new Error("Invalid USERNAME:PASSWORD string");
+ }
+
+ let username = aUsernameColonPassword.substring(0, colonIndex);
+ let password = aUsernameColonPassword.substring(colonIndex + 1);
+
+ return [username, password];
+};
+
+// expects a string in the format: ADDRESS:PORT,ADDRESS:PORT,...
+// returns array of ports (as ints)
+let parseAddrPortList = function(aAddrPortList) {
+ let addrPorts = aAddrPortList.split(",");
+ // parse ADDRESS:PORT string and only keep the port (second element in returned array)
+ let retval = addrPorts.map(addrPort => parseAddrPort(addrPort)[1]);
+ return retval;
+};
+
+// expects a '/n' or '/r/n' delimited bridge string, which we split and trim
+// each bridge string can also optionally have 'bridge' at the beginning ie:
+// bridge $(type) $(address):$(port) $(certificate)
+// we strip out the 'bridge' prefix here
+let parseBridgeStrings = function(aBridgeStrings) {
+
+ // replace carriage returns ('\r') with new lines ('\n')
+ aBridgeStrings = aBridgeStrings.replace(/\r/g, "\n");
+ // then replace contiguous new lines ('\n') with a single one
+ aBridgeStrings = aBridgeStrings.replace(/[\n]+/g, "\n");
+
+ // split on the newline and for each bridge string: trim, remove starting 'bridge' string
+ // finally discard entries that are empty strings; empty strings could occur if we receive
+ // a new line containing only whitespace
+ let splitStrings = aBridgeStrings.split("\n");
+ return splitStrings.map(val => val.trim().replace(/^bridge\s+/i, ""))
+ .filter(bridgeString => bridgeString != "");
+};
+
+// expecting a ',' delimited list of ints with possible white space between
+// returns an array of ints
+let parsePortList = function(aPortListString) {
+ let splitStrings = aPortListString.split(",");
+ return splitStrings.map(val => parsePort(val.trim()));
+};
diff --git a/browser/components/torpreferences/content/requestBridgeDialog.jsm b/browser/components/torpreferences/content/requestBridgeDialog.jsm
new file mode 100644
index 000000000000..807d46cdfb18
--- /dev/null
+++ b/browser/components/torpreferences/content/requestBridgeDialog.jsm
@@ -0,0 +1,204 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["RequestBridgeDialog"];
+
+const { BridgeDB } = ChromeUtils.import("resource:///modules/BridgeDB.jsm");
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
+class RequestBridgeDialog {
+ constructor() {
+ this._dialog = null;
+ this._submitButton = null;
+ this._dialogDescription = null;
+ this._captchaImage = null;
+ this._captchaEntryTextbox = null;
+ this._captchaRefreshButton = null;
+ this._incorrectCaptchaHbox = null;
+ this._incorrectCaptchaLabel = null;
+ this._bridges = [];
+ this._proxyURI = null;
+ }
+
+ static get selectors() {
+ return {
+ submitButton:
+ "accept" /* not really a selector but a key for dialog's getButton */,
+ dialogDescription: "description#torPreferences-requestBridge-description",
+ captchaImage: "image#torPreferences-requestBridge-captchaImage",
+ captchaEntryTextbox: "input#torPreferences-requestBridge-captchaTextbox",
+ refreshCaptchaButton:
+ "button#torPreferences-requestBridge-refreshCaptchaButton",
+ incorrectCaptchaHbox:
+ "hbox#torPreferences-requestBridge-incorrectCaptchaHbox",
+ incorrectCaptchaLabel:
+ "label#torPreferences-requestBridge-incorrectCaptchaError",
+ };
+ }
+
+ _populateXUL(dialog) {
+ const selectors = RequestBridgeDialog.selectors;
+
+ this._dialog = dialog;
+ const dialogWin = dialog.parentElement;
+ dialogWin.setAttribute(
+ "title",
+ TorStrings.settings.requestBridgeDialogTitle
+ );
+ // user may have opened a Request Bridge dialog in another tab, so update the
+ // CAPTCHA image or close out the dialog if we have a bridge list
+ this._dialog.addEventListener("focusin", () => {
+ const uri = BridgeDB.currentCaptchaImage;
+ const bridges = BridgeDB.currentBridges;
+
+ // new captcha image
+ if (uri) {
+ this._setcaptchaImage(uri);
+ } else if (bridges) {
+ this._bridges = bridges;
+ this._submitButton.disabled = false;
+ this._dialog.cancelDialog();
+ }
+ });
+
+ this._submitButton = this._dialog.getButton(selectors.submitButton);
+ this._submitButton.setAttribute("label", TorStrings.settings.submitCaptcha);
+ this._submitButton.disabled = true;
+ this._dialog.addEventListener("dialogaccept", e => {
+ e.preventDefault();
+ this.onSubmitCaptcha();
+ });
+
+ this._dialogDescription = this._dialog.querySelector(
+ selectors.dialogDescription
+ );
+ this._dialogDescription.textContent =
+ TorStrings.settings.contactingBridgeDB;
+
+ this._captchaImage = this._dialog.querySelector(selectors.captchaImage);
+
+ // request captcha from bridge db
+ BridgeDB.requestNewCaptchaImage(this._proxyURI).then(uri => {
+ this._setcaptchaImage(uri);
+ });
+
+ this._captchaEntryTextbox = this._dialog.querySelector(
+ selectors.captchaEntryTextbox
+ );
+ this._captchaEntryTextbox.setAttribute(
+ "placeholder",
+ TorStrings.settings.captchaTextboxPlaceholder
+ );
+ this._captchaEntryTextbox.disabled = true;
+ // disable submit if entry textbox is empty
+ this._captchaEntryTextbox.oninput = () => {
+ this._submitButton.disabled = this._captchaEntryTextbox.value == "";
+ };
+
+ this._captchaRefreshButton = this._dialog.querySelector(
+ selectors.refreshCaptchaButton
+ );
+ this._captchaRefreshButton.disabled = true;
+
+ this._incorrectCaptchaHbox = this._dialog.querySelector(
+ selectors.incorrectCaptchaHbox
+ );
+ this._incorrectCaptchaLabel = this._dialog.querySelector(
+ selectors.incorrectCaptchaLabel
+ );
+ this._incorrectCaptchaLabel.setAttribute(
+ "value",
+ TorStrings.settings.incorrectCaptcha
+ );
+
+ return true;
+ }
+
+ _setcaptchaImage(uri) {
+ if (uri != this._captchaImage.src) {
+ this._captchaImage.src = uri;
+ this._dialogDescription.textContent = TorStrings.settings.solveTheCaptcha;
+ this._setUIDisabled(false);
+ this._captchaEntryTextbox.focus();
+ this._captchaEntryTextbox.select();
+ }
+ }
+
+ _setUIDisabled(disabled) {
+ this._submitButton.disabled = this._captchaGuessIsEmpty() || disabled;
+ this._captchaEntryTextbox.disabled = disabled;
+ this._captchaRefreshButton.disabled = disabled;
+ }
+
+ _captchaGuessIsEmpty() {
+ return this._captchaEntryTextbox.value == "";
+ }
+
+ init(window, dialog) {
+ // defer to later until firefox has populated the dialog with all our elements
+ window.setTimeout(() => {
+ this._populateXUL(dialog);
+ }, 0);
+ }
+
+ close() {
+ BridgeDB.close();
+ }
+
+ /*
+ Event Handlers
+ */
+ onSubmitCaptcha() {
+ let captchaText = this._captchaEntryTextbox.value.trim();
+ // noop if the field is empty
+ if (captchaText == "") {
+ return;
+ }
+
+ // freeze ui while we make request
+ this._setUIDisabled(true);
+ this._incorrectCaptchaHbox.style.visibility = "hidden";
+
+ BridgeDB.submitCaptchaGuess(captchaText)
+ .then(aBridges => {
+ this._bridges = aBridges;
+
+ this._submitButton.disabled = false;
+ // This was successful, but use cancelDialog() to close, since
+ // we intercept the `dialogaccept` event.
+ this._dialog.cancelDialog();
+ })
+ .catch(aError => {
+ this._bridges = [];
+ this._setUIDisabled(false);
+ this._incorrectCaptchaHbox.style.visibility = "visible";
+ });
+ }
+
+ onRefreshCaptcha() {
+ this._setUIDisabled(true);
+ this._captchaImage.src = "";
+ this._dialogDescription.textContent =
+ TorStrings.settings.contactingBridgeDB;
+ this._captchaEntryTextbox.value = "";
+ this._incorrectCaptchaHbox.style.visibility = "hidden";
+
+ BridgeDB.requestNewCaptchaImage(this._proxyURI).then(uri => {
+ this._setcaptchaImage(uri);
+ });
+ }
+
+ openDialog(gSubDialog, aProxyURI, aCloseCallback) {
+ this._proxyURI = aProxyURI;
+ gSubDialog.open(
+ "chrome://browser/content/torpreferences/requestBridgeDialog.xhtml",
+ {
+ features: "resizable=yes",
+ closingCallback: () => {
+ this.close();
+ aCloseCallback(this._bridges);
+ }
+ },
+ this,
+ );
+ }
+}
diff --git a/browser/components/torpreferences/content/requestBridgeDialog.xhtml b/browser/components/torpreferences/content/requestBridgeDialog.xhtml
new file mode 100644
index 000000000000..64c4507807fb
--- /dev/null
+++ b/browser/components/torpreferences/content/requestBridgeDialog.xhtml
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css"?>
+<?xml-stylesheet href="chrome://browser/content/torpreferences/torPreferences.css"?>
+
+<window type="child"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+<dialog id="torPreferences-requestBridge-dialog"
+ buttons="accept,cancel">
+ <!-- ok, so ​ is a zero-width space. We need to have *something* in the innerText so that XUL knows how tall the
+ description node is so that it can determine how large to make the dialog element's inner draw area. If we have
+ nothing in the innerText, then it collapse to 0 height, and the contents of the dialog ends up partially hidden >:( -->
+ <description id="torPreferences-requestBridge-description">​</description>
+ <!-- init to transparent 400x125 png -->
+ <image id="torPreferences-requestBridge-captchaImage" flex="1"/>
+ <hbox id="torPreferences-requestBridge-inputHbox">
+ <html:input id="torPreferences-requestBridge-captchaTextbox" type="text" style="-moz-box-flex: 1;"/>
+ <button id="torPreferences-requestBridge-refreshCaptchaButton"
+ image="chrome://browser/skin/reload.svg"
+ oncommand="requestBridgeDialog.onRefreshCaptcha();"/>
+ </hbox>
+ <hbox id="torPreferences-requestBridge-incorrectCaptchaHbox" align="center">
+ <image id="torPreferences-requestBridge-errorIcon" />
+ <label id="torPreferences-requestBridge-incorrectCaptchaError" flex="1"/>
+ </hbox>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ let requestBridgeDialog = window.arguments[0];
+ let dialog = document.getElementById("torPreferences-requestBridge-dialog");
+ requestBridgeDialog.init(window, dialog);
+ ]]></script>
+</dialog>
+</window>
\ No newline at end of file
diff --git a/browser/components/torpreferences/content/torBridgeSettings.jsm b/browser/components/torpreferences/content/torBridgeSettings.jsm
new file mode 100644
index 000000000000..ceb61d3ec972
--- /dev/null
+++ b/browser/components/torpreferences/content/torBridgeSettings.jsm
@@ -0,0 +1,325 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "TorBridgeSource",
+ "TorBridgeSettings",
+ "makeTorBridgeSettingsNone",
+ "makeTorBridgeSettingsBuiltin",
+ "makeTorBridgeSettingsBridgeDB",
+ "makeTorBridgeSettingsUserProvided",
+];
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
+const TorBridgeSource = {
+ NONE: "NONE",
+ BUILTIN: "BUILTIN",
+ BRIDGEDB: "BRIDGEDB",
+ USERPROVIDED: "USERPROVIDED",
+};
+
+class TorBridgeSettings {
+ constructor() {
+ this._bridgeSource = TorBridgeSource.NONE;
+ this._selectedDefaultBridgeType = null;
+ this._bridgeStrings = [];
+ }
+
+ get selectedDefaultBridgeType() {
+ if (this._bridgeSource == TorBridgeSource.BUILTIN) {
+ return this._selectedDefaultBridgeType;
+ }
+ return undefined;
+ }
+
+ get bridgeSource() {
+ return this._bridgeSource;
+ }
+
+ // for display
+ get bridgeStrings() {
+ return this._bridgeStrings.join("\n");
+ }
+
+ // raw
+ get bridgeStringsArray() {
+ return this._bridgeStrings;
+ }
+
+ static get defaultBridgeTypes() {
+ if (TorBridgeSettings._defaultBridgeTypes) {
+ return TorBridgeSettings._defaultBridgeTypes;
+ }
+
+ let bridgeListBranch = Services.prefs.getBranch(
+ TorStrings.preferenceBranches.defaultBridge
+ );
+ let bridgePrefs = bridgeListBranch.getChildList("", {});
+
+ // an unordered set for shoving bridge types into
+ let bridgeTypes = new Set();
+ // look for keys ending in ".N" and treat string before that as the bridge type
+ const pattern = /\.[0-9]+$/;
+ for (const key of bridgePrefs) {
+ const offset = key.search(pattern);
+ if (offset != -1) {
+ const bt = key.substring(0, offset);
+ bridgeTypes.add(bt);
+ }
+ }
+
+ // recommended bridge type goes first in the list
+ let recommendedBridgeType = Services.prefs.getCharPref(
+ TorStrings.preferenceKeys.recommendedBridgeType,
+ null
+ );
+
+ let retval = [];
+ if (recommendedBridgeType && bridgeTypes.has(recommendedBridgeType)) {
+ retval.push(recommendedBridgeType);
+ }
+
+ for (const bridgeType of bridgeTypes.values()) {
+ if (bridgeType != recommendedBridgeType) {
+ retval.push(bridgeType);
+ }
+ }
+
+ // cache off
+ TorBridgeSettings._defaultBridgeTypes = retval;
+ return retval;
+ }
+
+ _readDefaultBridges(aBridgeType) {
+ let bridgeBranch = Services.prefs.getBranch(
+ TorStrings.preferenceBranches.defaultBridge
+ );
+ let bridgeBranchPrefs = bridgeBranch.getChildList("", {});
+
+ let retval = [];
+
+ // regex matches against strings ending in ".N" where N is a positive integer
+ let pattern = /\.[0-9]+$/;
+ for (const key of bridgeBranchPrefs) {
+ // verify the location of the match is the correct offset required for aBridgeType
+ // to fit, and that the string begins with aBridgeType
+ if (
+ key.search(pattern) == aBridgeType.length &&
+ key.startsWith(aBridgeType)
+ ) {
+ let bridgeStr = bridgeBranch.getCharPref(key);
+ retval.push(bridgeStr);
+ }
+ }
+
+ // fisher-yates shuffle
+ // shuffle so that Tor Browser users don't all try the built-in bridges in the same order
+ for (let i = retval.length - 1; i > 0; --i) {
+ // number n such that 0.0 <= n < 1.0
+ const n = Math.random();
+ // integer j such that 0 <= j <= i
+ const j = Math.floor(n * (i + 1));
+
+ // swap values at indices i and j
+ const tmp = retval[i];
+ retval[i] = retval[j];
+ retval[j] = tmp;
+ }
+
+ return retval;
+ }
+
+ _readBridgeDBBridges() {
+ let bridgeBranch = Services.prefs.getBranch(
+ `${TorStrings.preferenceBranches.bridgeDBBridges}`
+ );
+ let bridgeBranchPrefs = bridgeBranch.getChildList("", {});
+ // the child prefs do not come in any particular order so sort the keys
+ // so the values can be compared to what we get out off torrc
+ bridgeBranchPrefs.sort();
+
+ // just assume all of the prefs under the parent point to valid bridge string
+ let retval = bridgeBranchPrefs.map(key =>
+ bridgeBranch.getCharPref(key).trim()
+ );
+
+ return retval;
+ }
+
+ _readTorrcBridges() {
+ let bridgeList = TorProtocolService.readStringArraySetting(
+ TorStrings.configKeys.bridgeList
+ );
+
+ let retval = [];
+ for (const line of bridgeList) {
+ let trimmedLine = line.trim();
+ if (trimmedLine) {
+ retval.push(trimmedLine);
+ }
+ }
+
+ return retval;
+ }
+
+ // analagous to initBridgeSettings()
+ readSettings() {
+ // restore to defaults
+ this._bridgeSource = TorBridgeSource.NONE;
+ this._selectedDefaultBridgeType = null;
+ this._bridgeStrings = [];
+
+ // So the way tor-launcher determines the origin of the configured bridges is a bit
+ // weird and depends on inferring our scenario based on some firefox prefs and the
+ // relationship between the saved list of bridges in about:config vs the list saved in torrc
+
+ // first off, if "extensions.torlauncher.default_bridge_type" is set to one of our
+ // builtin default types (obfs4, meek-azure, snowflake, etc) then we provide the
+ // bridges in "extensions.torlauncher.default_bridge.*" (filtered by our default_bridge_type)
+
+ // next, we compare the list of bridges saved in torrc to the bridges stored in the
+ // "extensions.torlauncher.bridgedb_bridge."" branch. If they match *exactly* then we assume
+ // the bridges were retrieved from BridgeDB and use those. If the torrc list is empty then we know
+ // we have no bridge settings
+
+ // finally, if none of the previous conditions are not met, it is assumed the bridges stored in
+ // torrc are user-provided
+
+ // what we should(?) do once we excise tor-launcher entirely is explicitly store an int/enum in
+ // about:config that tells us which scenario we are in so we don't have to guess
+
+ let defaultBridgeType = Services.prefs.getCharPref(
+ TorStrings.preferenceKeys.defaultBridgeType,
+ null
+ );
+
+ // check if source is BUILTIN
+ if (defaultBridgeType) {
+ this._bridgeStrings = this._readDefaultBridges(defaultBridgeType);
+ this._bridgeSource = TorBridgeSource.BUILTIN;
+ this._selectedDefaultBridgeType = defaultBridgeType;
+ return;
+ }
+
+ let torrcBridges = this._readTorrcBridges();
+
+ // no stored bridges means no bridge is in use
+ if (torrcBridges.length == 0) {
+ this._bridgeStrings = [];
+ this._bridgeSource = TorBridgeSource.NONE;
+ return;
+ }
+
+ let bridgedbBridges = this._readBridgeDBBridges();
+
+ // if these two lists are equal then we got our bridges from bridgedb
+ // ie: same element in identical order
+ let arraysEqual = (left, right) => {
+ if (left.length != right.length) {
+ return false;
+ }
+ const length = left.length;
+ for (let i = 0; i < length; ++i) {
+ if (left[i] != right[i]) {
+ return false;
+ }
+ }
+ return true;
+ };
+
+ // agreement between prefs and torrc means bridgedb bridges
+ if (arraysEqual(torrcBridges, bridgedbBridges)) {
+ this._bridgeStrings = torrcBridges;
+ this._bridgeSource = TorBridgeSource.BRIDGEDB;
+ return;
+ }
+
+ // otherwise they must be user provided
+ this._bridgeStrings = torrcBridges;
+ this._bridgeSource = TorBridgeSource.USERPROVIDED;
+ }
+
+ writeSettings() {
+ let settingsObject = new Map();
+
+ // init tor bridge settings to null
+ settingsObject.set(TorStrings.configKeys.useBridges, null);
+ settingsObject.set(TorStrings.configKeys.bridgeList, null);
+
+ // clear bridge related firefox prefs
+ Services.prefs.setCharPref(TorStrings.preferenceKeys.defaultBridgeType, "");
+ let bridgeBranch = Services.prefs.getBranch(
+ `${TorStrings.preferenceBranches.bridgeDBBridges}`
+ );
+ let bridgeBranchPrefs = bridgeBranch.getChildList("", {});
+ for (const pref of bridgeBranchPrefs) {
+ Services.prefs.clearUserPref(
+ `${TorStrings.preferenceBranches.bridgeDBBridges}${pref}`
+ );
+ }
+
+ switch (this._bridgeSource) {
+ case TorBridgeSource.BUILTIN:
+ // set builtin bridge type to use in prefs
+ Services.prefs.setCharPref(
+ TorStrings.preferenceKeys.defaultBridgeType,
+ this._selectedDefaultBridgeType
+ );
+ break;
+ case TorBridgeSource.BRIDGEDB:
+ // save bridges off to prefs
+ for (let i = 0; i < this.bridgeStringsArray.length; ++i) {
+ Services.prefs.setCharPref(
+ `${TorStrings.preferenceBranches.bridgeDBBridges}${i}`,
+ this.bridgeStringsArray[i]
+ );
+ }
+ break;
+ }
+
+ // write over our bridge list if bridges are enabled
+ if (this._bridgeSource != TorBridgeSource.NONE) {
+ settingsObject.set(TorStrings.configKeys.useBridges, true);
+ settingsObject.set(
+ TorStrings.configKeys.bridgeList,
+ this.bridgeStringsArray
+ );
+ }
+ TorProtocolService.writeSettings(settingsObject);
+ }
+}
+
+function makeTorBridgeSettingsNone() {
+ return new TorBridgeSettings();
+}
+
+function makeTorBridgeSettingsBuiltin(aBridgeType) {
+ let retval = new TorBridgeSettings();
+ retval._bridgeSource = TorBridgeSource.BUILTIN;
+ retval._selectedDefaultBridgeType = aBridgeType;
+ retval._bridgeStrings = retval._readDefaultBridges(aBridgeType);
+
+ return retval;
+}
+
+function makeTorBridgeSettingsBridgeDB(aBridges) {
+ let retval = new TorBridgeSettings();
+ retval._bridgeSource = TorBridgeSource.BRIDGEDB;
+ retval._selectedDefaultBridgeType = null;
+ retval._bridgeStrings = aBridges;
+
+ return retval;
+}
+
+function makeTorBridgeSettingsUserProvided(aBridges) {
+ let retval = new TorBridgeSettings();
+ retval._bridgeSource = TorBridgeSource.USERPROVIDED;
+ retval._selectedDefaultBridgeType = null;
+ retval._bridgeStrings = aBridges;
+
+ return retval;
+}
diff --git a/browser/components/torpreferences/content/torCategory.inc.xhtml b/browser/components/torpreferences/content/torCategory.inc.xhtml
new file mode 100644
index 000000000000..abe56200f571
--- /dev/null
+++ b/browser/components/torpreferences/content/torCategory.inc.xhtml
@@ -0,0 +1,9 @@
+<richlistitem id="category-tor"
+ class="category"
+ value="paneTor"
+ helpTopic="prefs-tor"
+ align="center"
+ hidden="true">
+ <image class="category-icon"/>
+ <label id="torPreferences-labelCategory" class="category-name" flex="1" value="Tor"/>
+</richlistitem>
diff --git a/browser/components/torpreferences/content/torFirewallSettings.jsm b/browser/components/torpreferences/content/torFirewallSettings.jsm
new file mode 100644
index 000000000000..e77f18ef2fae
--- /dev/null
+++ b/browser/components/torpreferences/content/torFirewallSettings.jsm
@@ -0,0 +1,72 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "TorFirewallSettings",
+ "makeTorFirewallSettingsNone",
+ "makeTorFirewallSettingsCustom",
+];
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+const { parseAddrPortList } = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/parseFunctions.jsm"
+);
+
+class TorFirewallSettings {
+ constructor() {
+ this._allowedPorts = [];
+ }
+
+ get portsConfigurationString() {
+ let portStrings = this._allowedPorts.map(port => `*:${port}`);
+ return portStrings.join(",");
+ }
+
+ get commaSeparatedListString() {
+ return this._allowedPorts.join(",");
+ }
+
+ get hasPorts() {
+ return this._allowedPorts.length > 0;
+ }
+
+ readSettings() {
+ let addressPortList = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.reachableAddresses
+ );
+
+ let allowedPorts = [];
+ if (addressPortList) {
+ allowedPorts = parseAddrPortList(addressPortList);
+ }
+ this._allowedPorts = allowedPorts;
+ }
+
+ writeSettings() {
+ let settingsObject = new Map();
+
+ // init to null so Tor daemon resets if no ports
+ settingsObject.set(TorStrings.configKeys.reachableAddresses, null);
+
+ if (this._allowedPorts.length > 0) {
+ settingsObject.set(
+ TorStrings.configKeys.reachableAddresses,
+ this.portsConfigurationString
+ );
+ }
+
+ TorProtocolService.writeSettings(settingsObject);
+ }
+}
+
+function makeTorFirewallSettingsNone() {
+ return new TorFirewallSettings();
+}
+
+function makeTorFirewallSettingsCustom(aPortsList) {
+ let retval = new TorFirewallSettings();
+ retval._allowedPorts = aPortsList;
+ return retval;
+}
diff --git a/browser/components/torpreferences/content/torLogDialog.jsm b/browser/components/torpreferences/content/torLogDialog.jsm
new file mode 100644
index 000000000000..ecc684d878c2
--- /dev/null
+++ b/browser/components/torpreferences/content/torLogDialog.jsm
@@ -0,0 +1,66 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["TorLogDialog"];
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
+class TorLogDialog {
+ constructor() {
+ this._dialog = null;
+ this._logTextarea = null;
+ this._copyLogButton = null;
+ }
+
+ static get selectors() {
+ return {
+ copyLogButton: "extra1",
+ logTextarea: "textarea#torPreferences-torDialog-textarea",
+ };
+ }
+
+ _populateXUL(aDialog) {
+ this._dialog = aDialog;
+ const dialogWin = this._dialog.parentElement;
+ dialogWin.setAttribute("title", TorStrings.settings.torLogDialogTitle);
+
+ this._logTextarea = this._dialog.querySelector(
+ TorLogDialog.selectors.logTextarea
+ );
+
+ this._copyLogButton = this._dialog.getButton(
+ TorLogDialog.selectors.copyLogButton
+ );
+ this._copyLogButton.setAttribute("label", TorStrings.settings.copyLog);
+ this._copyLogButton.addEventListener("command", () => {
+ this.copyTorLog();
+ });
+
+ this._logTextarea.value = TorProtocolService.getLog();
+ }
+
+ init(window, aDialog) {
+ // defer to later until firefox has populated the dialog with all our elements
+ window.setTimeout(() => {
+ this._populateXUL(aDialog);
+ }, 0);
+ }
+
+ copyTorLog() {
+ // Copy tor log messages to the system clipboard.
+ let clipboard = Cc["@mozilla.org/widget/clipboardhelper;1"].getService(
+ Ci.nsIClipboardHelper
+ );
+ clipboard.copyString(this._logTextarea.value);
+ }
+
+ openDialog(gSubDialog) {
+ gSubDialog.open(
+ "chrome://browser/content/torpreferences/torLogDialog.xhtml",
+ { features: "resizable=yes" },
+ this
+ );
+ }
+}
diff --git a/browser/components/torpreferences/content/torLogDialog.xhtml b/browser/components/torpreferences/content/torLogDialog.xhtml
new file mode 100644
index 000000000000..9c17f8132978
--- /dev/null
+++ b/browser/components/torpreferences/content/torLogDialog.xhtml
@@ -0,0 +1,23 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css"?>
+<?xml-stylesheet href="chrome://browser/content/torpreferences/torPreferences.css"?>
+
+<window type="child"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ xmlns:html="http://www.w3.org/1999/xhtml">
+<dialog id="torPreferences-torLog-dialog"
+ buttons="accept,extra1">
+ <html:textarea
+ id="torPreferences-torDialog-textarea"
+ multiline="true"
+ readonly="true"/>
+ <script type="application/javascript"><![CDATA[
+ "use strict";
+
+ let torLogDialog = window.arguments[0];
+ let dialog = document.getElementById("torPreferences-torLog-dialog");
+ torLogDialog.init(window, dialog);
+ ]]></script>
+</dialog>
+</window>
\ No newline at end of file
diff --git a/browser/components/torpreferences/content/torPane.js b/browser/components/torpreferences/content/torPane.js
new file mode 100644
index 000000000000..49054b5dac6a
--- /dev/null
+++ b/browser/components/torpreferences/content/torPane.js
@@ -0,0 +1,857 @@
+"use strict";
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+
+const {
+ TorBridgeSource,
+ TorBridgeSettings,
+ makeTorBridgeSettingsNone,
+ makeTorBridgeSettingsBuiltin,
+ makeTorBridgeSettingsBridgeDB,
+ makeTorBridgeSettingsUserProvided,
+} = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/torBridgeSettings.jsm"
+);
+
+const {
+ TorProxyType,
+ TorProxySettings,
+ makeTorProxySettingsNone,
+ makeTorProxySettingsSocks4,
+ makeTorProxySettingsSocks5,
+ makeTorProxySettingsHTTPS,
+} = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/torProxySettings.jsm"
+);
+const {
+ TorFirewallSettings,
+ makeTorFirewallSettingsNone,
+ makeTorFirewallSettingsCustom,
+} = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/torFirewallSettings.jsm"
+);
+
+const { TorLogDialog } = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/torLogDialog.jsm"
+);
+
+const { RequestBridgeDialog } = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/requestBridgeDialog.jsm"
+);
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+const { parsePort, parseBridgeStrings, parsePortList } = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/parseFunctions.jsm"
+);
+
+/*
+ Tor Pane
+
+ Code for populating the XUL in about:preferences#tor, handling input events, interfacing with tor-launcher
+*/
+const gTorPane = (function() {
+ /* CSS selectors for all of the Tor Network DOM elements we need to access */
+ const selectors = {
+ category: {
+ title: "label#torPreferences-labelCategory",
+ },
+ torPreferences: {
+ header: "h1#torPreferences-header",
+ description: "span#torPreferences-description",
+ learnMore: "label#torPreferences-learnMore",
+ },
+ bridges: {
+ header: "h2#torPreferences-bridges-header",
+ description: "span#torPreferences-bridges-description",
+ learnMore: "label#torPreferences-bridges-learnMore",
+ useBridgeCheckbox: "checkbox#torPreferences-bridges-toggle",
+ bridgeSelectionRadiogroup:
+ "radiogroup#torPreferences-bridges-bridgeSelection",
+ builtinBridgeOption: "radio#torPreferences-bridges-radioBuiltin",
+ builtinBridgeList: "menulist#torPreferences-bridges-builtinList",
+ requestBridgeOption: "radio#torPreferences-bridges-radioRequestBridge",
+ requestBridgeButton: "button#torPreferences-bridges-buttonRequestBridge",
+ requestBridgeTextarea:
+ "textarea#torPreferences-bridges-textareaRequestBridge",
+ provideBridgeOption: "radio#torPreferences-bridges-radioProvideBridge",
+ provideBridgeDescription:
+ "description#torPreferences-bridges-descriptionProvideBridge",
+ provideBridgeTextarea:
+ "textarea#torPreferences-bridges-textareaProvideBridge",
+ },
+ advanced: {
+ header: "h2#torPreferences-advanced-header",
+ description: "span#torPreferences-advanced-description",
+ learnMore: "label#torPreferences-advanced-learnMore",
+ useProxyCheckbox: "checkbox#torPreferences-advanced-toggleProxy",
+ proxyTypeLabel: "label#torPreferences-localProxy-type",
+ proxyTypeList: "menulist#torPreferences-localProxy-builtinList",
+ proxyAddressLabel: "label#torPreferences-localProxy-address",
+ proxyAddressTextbox: "input#torPreferences-localProxy-textboxAddress",
+ proxyPortLabel: "label#torPreferences-localProxy-port",
+ proxyPortTextbox: "input#torPreferences-localProxy-textboxPort",
+ proxyUsernameLabel: "label#torPreferences-localProxy-username",
+ proxyUsernameTextbox: "input#torPreferences-localProxy-textboxUsername",
+ proxyPasswordLabel: "label#torPreferences-localProxy-password",
+ proxyPasswordTextbox: "input#torPreferences-localProxy-textboxPassword",
+ useFirewallCheckbox: "checkbox#torPreferences-advanced-toggleFirewall",
+ firewallAllowedPortsLabel: "label#torPreferences-advanced-allowedPorts",
+ firewallAllowedPortsTextbox:
+ "input#torPreferences-advanced-textboxAllowedPorts",
+ torLogsLabel: "label#torPreferences-torLogs",
+ torLogsButton: "button#torPreferences-buttonTorLogs",
+ },
+ }; /* selectors */
+
+ let retval = {
+ // cached frequently accessed DOM elements
+ _useBridgeCheckbox: null,
+ _bridgeSelectionRadiogroup: null,
+ _builtinBridgeOption: null,
+ _builtinBridgeMenulist: null,
+ _requestBridgeOption: null,
+ _requestBridgeButton: null,
+ _requestBridgeTextarea: null,
+ _provideBridgeOption: null,
+ _provideBridgeTextarea: null,
+ _useProxyCheckbox: null,
+ _proxyTypeLabel: null,
+ _proxyTypeMenulist: null,
+ _proxyAddressLabel: null,
+ _proxyAddressTextbox: null,
+ _proxyPortLabel: null,
+ _proxyPortTextbox: null,
+ _proxyUsernameLabel: null,
+ _proxyUsernameTextbox: null,
+ _proxyPasswordLabel: null,
+ _proxyPasswordTextbox: null,
+ _useFirewallCheckbox: null,
+ _allowedPortsLabel: null,
+ _allowedPortsTextbox: null,
+
+ // tor network settings
+ _bridgeSettings: null,
+ _proxySettings: null,
+ _firewallSettings: null,
+
+ // disables the provided list of elements
+ _setElementsDisabled(elements, disabled) {
+ for (let currentElement of elements) {
+ currentElement.disabled = disabled;
+ }
+ },
+
+ // populate xul with strings and cache the relevant elements
+ _populateXUL() {
+ // saves tor settings to disk when navigate away from about:preferences
+ window.addEventListener("blur", val => {
+ TorProtocolService.flushSettings();
+ });
+
+ document
+ .querySelector(selectors.category.title)
+ .setAttribute("value", TorStrings.settings.categoryTitle);
+
+ let prefpane = document.getElementById("mainPrefPane");
+
+ // Heading
+ prefpane.querySelector(selectors.torPreferences.header).innerText =
+ TorStrings.settings.torPreferencesHeading;
+ prefpane.querySelector(selectors.torPreferences.description).textContent =
+ TorStrings.settings.torPreferencesDescription;
+ {
+ let learnMore = prefpane.querySelector(
+ selectors.torPreferences.learnMore
+ );
+ learnMore.setAttribute("value", TorStrings.settings.learnMore);
+ learnMore.setAttribute(
+ "href",
+ TorStrings.settings.learnMoreTorBrowserURL
+ );
+ }
+
+ // Bridge setup
+ prefpane.querySelector(selectors.bridges.header).innerText =
+ TorStrings.settings.bridgesHeading;
+ prefpane.querySelector(selectors.bridges.description).textContent =
+ TorStrings.settings.bridgesDescription;
+ {
+ let learnMore = prefpane.querySelector(selectors.bridges.learnMore);
+ learnMore.setAttribute("value", TorStrings.settings.learnMore);
+ learnMore.setAttribute("href", TorStrings.settings.learnMoreBridgesURL);
+ }
+
+ this._useBridgeCheckbox = prefpane.querySelector(
+ selectors.bridges.useBridgeCheckbox
+ );
+ this._useBridgeCheckbox.setAttribute(
+ "label",
+ TorStrings.settings.useBridge
+ );
+ this._useBridgeCheckbox.addEventListener("command", e => {
+ const checked = this._useBridgeCheckbox.checked;
+ gTorPane.onToggleBridge(checked).onUpdateBridgeSettings();
+ });
+ this._bridgeSelectionRadiogroup = prefpane.querySelector(
+ selectors.bridges.bridgeSelectionRadiogroup
+ );
+ this._bridgeSelectionRadiogroup.value = TorBridgeSource.BUILTIN;
+ this._bridgeSelectionRadiogroup.addEventListener("command", e => {
+ const value = this._bridgeSelectionRadiogroup.value;
+ gTorPane.onSelectBridgeOption(value).onUpdateBridgeSettings();
+ });
+
+ // Builtin bridges
+ this._builtinBridgeOption = prefpane.querySelector(
+ selectors.bridges.builtinBridgeOption
+ );
+ this._builtinBridgeOption.setAttribute(
+ "label",
+ TorStrings.settings.selectBridge
+ );
+ this._builtinBridgeOption.setAttribute("value", TorBridgeSource.BUILTIN);
+ this._builtinBridgeMenulist = prefpane.querySelector(
+ selectors.bridges.builtinBridgeList
+ );
+ this._builtinBridgeMenulist.addEventListener("command", e => {
+ gTorPane.onUpdateBridgeSettings();
+ });
+
+ // Request bridge
+ this._requestBridgeOption = prefpane.querySelector(
+ selectors.bridges.requestBridgeOption
+ );
+ this._requestBridgeOption.setAttribute(
+ "label",
+ TorStrings.settings.requestBridgeFromTorProject
+ );
+ this._requestBridgeOption.setAttribute("value", TorBridgeSource.BRIDGEDB);
+ this._requestBridgeButton = prefpane.querySelector(
+ selectors.bridges.requestBridgeButton
+ );
+ this._requestBridgeButton.setAttribute(
+ "label",
+ TorStrings.settings.requestNewBridge
+ );
+ this._requestBridgeButton.addEventListener("command", () =>
+ gTorPane.onRequestBridge()
+ );
+ this._requestBridgeTextarea = prefpane.querySelector(
+ selectors.bridges.requestBridgeTextarea
+ );
+
+ // Provide a bridge
+ this._provideBridgeOption = prefpane.querySelector(
+ selectors.bridges.provideBridgeOption
+ );
+ this._provideBridgeOption.setAttribute(
+ "label",
+ TorStrings.settings.provideBridge
+ );
+ this._provideBridgeOption.setAttribute(
+ "value",
+ TorBridgeSource.USERPROVIDED
+ );
+ prefpane.querySelector(
+ selectors.bridges.provideBridgeDescription
+ ).textContent = TorStrings.settings.provideBridgeDirections;
+ this._provideBridgeTextarea = prefpane.querySelector(
+ selectors.bridges.provideBridgeTextarea
+ );
+ this._provideBridgeTextarea.setAttribute(
+ "placeholder",
+ TorStrings.settings.provideBridgePlaceholder
+ );
+ this._provideBridgeTextarea.addEventListener("blur", () => {
+ gTorPane.onUpdateBridgeSettings();
+ });
+
+ // Advanced setup
+ prefpane.querySelector(selectors.advanced.header).innerText =
+ TorStrings.settings.advancedHeading;
+ prefpane.querySelector(selectors.advanced.description).textContent =
+ TorStrings.settings.advancedDescription;
+ {
+ let learnMore = prefpane.querySelector(selectors.advanced.learnMore);
+ learnMore.setAttribute("value", TorStrings.settings.learnMore);
+ learnMore.setAttribute(
+ "href",
+ TorStrings.settings.learnMoreNetworkSettingsURL
+ );
+ }
+
+ // Local Proxy
+ this._useProxyCheckbox = prefpane.querySelector(
+ selectors.advanced.useProxyCheckbox
+ );
+ this._useProxyCheckbox.setAttribute(
+ "label",
+ TorStrings.settings.useLocalProxy
+ );
+ this._useProxyCheckbox.addEventListener("command", e => {
+ const checked = this._useProxyCheckbox.checked;
+ gTorPane.onToggleProxy(checked).onUpdateProxySettings();
+ });
+ this._proxyTypeLabel = prefpane.querySelector(
+ selectors.advanced.proxyTypeLabel
+ );
+ this._proxyTypeLabel.setAttribute("value", TorStrings.settings.proxyType);
+
+ let mockProxies = [
+ {
+ value: TorProxyType.SOCKS4,
+ label: TorStrings.settings.proxyTypeSOCKS4,
+ },
+ {
+ value: TorProxyType.SOCKS5,
+ label: TorStrings.settings.proxyTypeSOCKS5,
+ },
+ { value: TorProxyType.HTTPS, label: TorStrings.settings.proxyTypeHTTP },
+ ];
+ this._proxyTypeMenulist = prefpane.querySelector(
+ selectors.advanced.proxyTypeList
+ );
+ this._proxyTypeMenulist.addEventListener("command", e => {
+ const value = this._proxyTypeMenulist.value;
+ gTorPane.onSelectProxyType(value).onUpdateProxySettings();
+ });
+ for (let currentProxy of mockProxies) {
+ let menuEntry = document.createXULElement("menuitem");
+ menuEntry.setAttribute("value", currentProxy.value);
+ menuEntry.setAttribute("label", currentProxy.label);
+ this._proxyTypeMenulist
+ .querySelector("menupopup")
+ .appendChild(menuEntry);
+ }
+
+ this._proxyAddressLabel = prefpane.querySelector(
+ selectors.advanced.proxyAddressLabel
+ );
+ this._proxyAddressLabel.setAttribute(
+ "value",
+ TorStrings.settings.proxyAddress
+ );
+ this._proxyAddressTextbox = prefpane.querySelector(
+ selectors.advanced.proxyAddressTextbox
+ );
+ this._proxyAddressTextbox.setAttribute(
+ "placeholder",
+ TorStrings.settings.proxyAddressPlaceholder
+ );
+ this._proxyAddressTextbox.addEventListener("blur", () => {
+ gTorPane.onUpdateProxySettings();
+ });
+ this._proxyPortLabel = prefpane.querySelector(
+ selectors.advanced.proxyPortLabel
+ );
+ this._proxyPortLabel.setAttribute("value", TorStrings.settings.proxyPort);
+ this._proxyPortTextbox = prefpane.querySelector(
+ selectors.advanced.proxyPortTextbox
+ );
+ this._proxyPortTextbox.addEventListener("blur", () => {
+ gTorPane.onUpdateProxySettings();
+ });
+ this._proxyUsernameLabel = prefpane.querySelector(
+ selectors.advanced.proxyUsernameLabel
+ );
+ this._proxyUsernameLabel.setAttribute(
+ "value",
+ TorStrings.settings.proxyUsername
+ );
+ this._proxyUsernameTextbox = prefpane.querySelector(
+ selectors.advanced.proxyUsernameTextbox
+ );
+ this._proxyUsernameTextbox.setAttribute(
+ "placeholder",
+ TorStrings.settings.proxyUsernamePasswordPlaceholder
+ );
+ this._proxyUsernameTextbox.addEventListener("blur", () => {
+ gTorPane.onUpdateProxySettings();
+ });
+ this._proxyPasswordLabel = prefpane.querySelector(
+ selectors.advanced.proxyPasswordLabel
+ );
+ this._proxyPasswordLabel.setAttribute(
+ "value",
+ TorStrings.settings.proxyPassword
+ );
+ this._proxyPasswordTextbox = prefpane.querySelector(
+ selectors.advanced.proxyPasswordTextbox
+ );
+ this._proxyPasswordTextbox.setAttribute(
+ "placeholder",
+ TorStrings.settings.proxyUsernamePasswordPlaceholder
+ );
+ this._proxyPasswordTextbox.addEventListener("blur", () => {
+ gTorPane.onUpdateProxySettings();
+ });
+
+ // Local firewall
+ this._useFirewallCheckbox = prefpane.querySelector(
+ selectors.advanced.useFirewallCheckbox
+ );
+ this._useFirewallCheckbox.setAttribute(
+ "label",
+ TorStrings.settings.useFirewall
+ );
+ this._useFirewallCheckbox.addEventListener("command", e => {
+ const checked = this._useFirewallCheckbox.checked;
+ gTorPane.onToggleFirewall(checked).onUpdateFirewallSettings();
+ });
+ this._allowedPortsLabel = prefpane.querySelector(
+ selectors.advanced.firewallAllowedPortsLabel
+ );
+ this._allowedPortsLabel.setAttribute(
+ "value",
+ TorStrings.settings.allowedPorts
+ );
+ this._allowedPortsTextbox = prefpane.querySelector(
+ selectors.advanced.firewallAllowedPortsTextbox
+ );
+ this._allowedPortsTextbox.setAttribute(
+ "placeholder",
+ TorStrings.settings.allowedPortsPlaceholder
+ );
+ this._allowedPortsTextbox.addEventListener("blur", () => {
+ gTorPane.onUpdateFirewallSettings();
+ });
+
+ // Tor logs
+ prefpane
+ .querySelector(selectors.advanced.torLogsLabel)
+ .setAttribute("value", TorStrings.settings.showTorDaemonLogs);
+ let torLogsButton = prefpane.querySelector(
+ selectors.advanced.torLogsButton
+ );
+ torLogsButton.setAttribute("label", TorStrings.settings.showLogs);
+ torLogsButton.addEventListener("command", () => {
+ gTorPane.onViewTorLogs();
+ });
+
+ // Disable all relevant elements by default
+ this._setElementsDisabled(
+ [
+ this._builtinBridgeOption,
+ this._builtinBridgeMenulist,
+ this._requestBridgeOption,
+ this._requestBridgeButton,
+ this._requestBridgeTextarea,
+ this._provideBridgeOption,
+ this._provideBridgeTextarea,
+ this._proxyTypeLabel,
+ this._proxyTypeMenulist,
+ this._proxyAddressLabel,
+ this._proxyAddressTextbox,
+ this._proxyPortLabel,
+ this._proxyPortTextbox,
+ this._proxyUsernameLabel,
+ this._proxyUsernameTextbox,
+ this._proxyPasswordLabel,
+ this._proxyPasswordTextbox,
+ this._allowedPortsLabel,
+ this._allowedPortsTextbox,
+ ],
+ true
+ );
+
+ // load bridge settings
+ let torBridgeSettings = new TorBridgeSettings();
+ torBridgeSettings.readSettings();
+
+ // populate the bridge list
+ for (let currentBridge of TorBridgeSettings.defaultBridgeTypes) {
+ let menuEntry = document.createXULElement("menuitem");
+ menuEntry.setAttribute("value", currentBridge);
+ menuEntry.setAttribute("label", currentBridge);
+ this._builtinBridgeMenulist
+ .querySelector("menupopup")
+ .appendChild(menuEntry);
+ }
+
+ this.onSelectBridgeOption(torBridgeSettings.bridgeSource);
+ this.onToggleBridge(
+ torBridgeSettings.bridgeSource != TorBridgeSource.NONE
+ );
+ switch (torBridgeSettings.bridgeSource) {
+ case TorBridgeSource.NONE:
+ break;
+ case TorBridgeSource.BUILTIN:
+ this._builtinBridgeMenulist.value =
+ torBridgeSettings.selectedDefaultBridgeType;
+ break;
+ case TorBridgeSource.BRIDGEDB:
+ this._requestBridgeTextarea.value = torBridgeSettings.bridgeStrings;
+ break;
+ case TorBridgeSource.USERPROVIDED:
+ this._provideBridgeTextarea.value = torBridgeSettings.bridgeStrings;
+ break;
+ }
+
+ this._bridgeSettings = torBridgeSettings;
+
+ // load proxy settings
+ let torProxySettings = new TorProxySettings();
+ torProxySettings.readSettings();
+
+ if (torProxySettings.type != TorProxyType.NONE) {
+ this.onToggleProxy(true);
+ this.onSelectProxyType(torProxySettings.type);
+ this._proxyAddressTextbox.value = torProxySettings.address;
+ this._proxyPortTextbox.value = torProxySettings.port;
+ this._proxyUsernameTextbox.value = torProxySettings.username;
+ this._proxyPasswordTextbox.value = torProxySettings.password;
+ }
+
+ this._proxySettings = torProxySettings;
+
+ // load firewall settings
+ let torFirewallSettings = new TorFirewallSettings();
+ torFirewallSettings.readSettings();
+
+ if (torFirewallSettings.hasPorts) {
+ this.onToggleFirewall(true);
+ this._allowedPortsTextbox.value =
+ torFirewallSettings.commaSeparatedListString;
+ }
+
+ this._firewallSettings = torFirewallSettings;
+ },
+
+ init() {
+ this._populateXUL();
+ },
+
+ // whether the page should be present in about:preferences
+ get enabled() {
+ return TorProtocolService.ownsTorDaemon;
+ },
+
+ //
+ // Callbacks
+ //
+
+ // callback when using bridges toggled
+ onToggleBridge(enabled) {
+ this._useBridgeCheckbox.checked = enabled;
+ let disabled = !enabled;
+
+ // first disable all the bridge related elements
+ this._setElementsDisabled(
+ [
+ this._builtinBridgeOption,
+ this._builtinBridgeMenulist,
+ this._requestBridgeOption,
+ this._requestBridgeButton,
+ this._requestBridgeTextarea,
+ this._provideBridgeOption,
+ this._provideBridgeTextarea,
+ ],
+ disabled
+ );
+
+ // and selectively re-enable based on the radiogroup's current value
+ if (enabled) {
+ this.onSelectBridgeOption(this._bridgeSelectionRadiogroup.value);
+ } else {
+ this.onSelectBridgeOption(TorBridgeSource.NONE);
+ }
+ return this;
+ },
+
+ // callback when a bridge option is selected
+ onSelectBridgeOption(source) {
+ // disable all of the bridge elements under radio buttons
+ this._setElementsDisabled(
+ [
+ this._builtinBridgeMenulist,
+ this._requestBridgeButton,
+ this._requestBridgeTextarea,
+ this._provideBridgeTextarea,
+ ],
+ true
+ );
+
+ if (source != TorBridgeSource.NONE) {
+ this._bridgeSelectionRadiogroup.value = source;
+ }
+
+ switch (source) {
+ case TorBridgeSource.BUILTIN: {
+ this._setElementsDisabled([this._builtinBridgeMenulist], false);
+ break;
+ }
+ case TorBridgeSource.BRIDGEDB: {
+ this._setElementsDisabled(
+ [this._requestBridgeButton, this._requestBridgeTextarea],
+ false
+ );
+ break;
+ }
+ case TorBridgeSource.USERPROVIDED: {
+ this._setElementsDisabled([this._provideBridgeTextarea], false);
+ break;
+ }
+ }
+ return this;
+ },
+
+ // called when the request bridge button is activated
+ onRequestBridge() {
+ let requestBridgeDialog = new RequestBridgeDialog();
+ requestBridgeDialog.openDialog(
+ gSubDialog,
+ this._proxySettings.proxyURI,
+ aBridges => {
+ if (aBridges.length > 0) {
+ let bridgeSettings = makeTorBridgeSettingsBridgeDB(aBridges);
+ bridgeSettings.writeSettings();
+ this._bridgeSettings = bridgeSettings;
+
+ this._requestBridgeTextarea.value = bridgeSettings.bridgeStrings;
+ }
+ }
+ );
+ return this;
+ },
+
+ // pushes bridge settings from UI to tor
+ onUpdateBridgeSettings() {
+ let bridgeSettings = null;
+
+ let source = this._useBridgeCheckbox.checked
+ ? this._bridgeSelectionRadiogroup.value
+ : TorBridgeSource.NONE;
+ switch (source) {
+ case TorBridgeSource.NONE: {
+ bridgeSettings = makeTorBridgeSettingsNone();
+ break;
+ }
+ case TorBridgeSource.BUILTIN: {
+ // if there is a built-in bridge already selected, use that
+ let bridgeType = this._builtinBridgeMenulist.value;
+ if (bridgeType) {
+ bridgeSettings = makeTorBridgeSettingsBuiltin(bridgeType);
+ } else {
+ bridgeSettings = makeTorBridgeSettingsNone();
+ }
+ break;
+ }
+ case TorBridgeSource.BRIDGEDB: {
+ // if there are bridgedb bridges saved in the text area, use them
+ let bridgeStrings = this._requestBridgeTextarea.value;
+ if (bridgeStrings) {
+ let bridgeStringList = parseBridgeStrings(bridgeStrings);
+ bridgeSettings = makeTorBridgeSettingsBridgeDB(bridgeStringList);
+ } else {
+ bridgeSettings = makeTorBridgeSettingsNone();
+ }
+ break;
+ }
+ case TorBridgeSource.USERPROVIDED: {
+ // if bridges already exist in the text area, use them
+ let bridgeStrings = this._provideBridgeTextarea.value;
+ if (bridgeStrings) {
+ let bridgeStringList = parseBridgeStrings(bridgeStrings);
+ bridgeSettings = makeTorBridgeSettingsUserProvided(
+ bridgeStringList
+ );
+ } else {
+ bridgeSettings = makeTorBridgeSettingsNone();
+ }
+ break;
+ }
+ }
+ bridgeSettings.writeSettings();
+ this._bridgeSettings = bridgeSettings;
+ return this;
+ },
+
+ // callback when proxy is toggled
+ onToggleProxy(enabled) {
+ this._useProxyCheckbox.checked = enabled;
+ let disabled = !enabled;
+
+ this._setElementsDisabled(
+ [
+ this._proxyTypeLabel,
+ this._proxyTypeMenulist,
+ this._proxyAddressLabel,
+ this._proxyAddressTextbox,
+ this._proxyPortLabel,
+ this._proxyPortTextbox,
+ this._proxyUsernameLabel,
+ this._proxyUsernameTextbox,
+ this._proxyPasswordLabel,
+ this._proxyPasswordTextbox,
+ ],
+ disabled
+ );
+ this.onSelectProxyType(this._proxyTypeMenulist.value);
+ return this;
+ },
+
+ // callback when proxy type is changed
+ onSelectProxyType(value) {
+ if (value == "") {
+ value = TorProxyType.NONE;
+ }
+ this._proxyTypeMenulist.value = value;
+ switch (value) {
+ case TorProxyType.NONE: {
+ this._setElementsDisabled(
+ [
+ this._proxyAddressLabel,
+ this._proxyAddressTextbox,
+ this._proxyPortLabel,
+ this._proxyPortTextbox,
+ this._proxyUsernameLabel,
+ this._proxyUsernameTextbox,
+ this._proxyPasswordLabel,
+ this._proxyPasswordTextbox,
+ ],
+ true
+ ); // DISABLE
+
+ this._proxyAddressTextbox.value = "";
+ this._proxyPortTextbox.value = "";
+ this._proxyUsernameTextbox.value = "";
+ this._proxyPasswordTextbox.value = "";
+ break;
+ }
+ case TorProxyType.SOCKS4: {
+ this._setElementsDisabled(
+ [
+ this._proxyAddressLabel,
+ this._proxyAddressTextbox,
+ this._proxyPortLabel,
+ this._proxyPortTextbox,
+ ],
+ false
+ ); // ENABLE
+ this._setElementsDisabled(
+ [
+ this._proxyUsernameLabel,
+ this._proxyUsernameTextbox,
+ this._proxyPasswordLabel,
+ this._proxyPasswordTextbox,
+ ],
+ true
+ ); // DISABLE
+
+ this._proxyUsernameTextbox.value = "";
+ this._proxyPasswordTextbox.value = "";
+ break;
+ }
+ case TorProxyType.SOCKS5:
+ case TorProxyType.HTTPS: {
+ this._setElementsDisabled(
+ [
+ this._proxyAddressLabel,
+ this._proxyAddressTextbox,
+ this._proxyPortLabel,
+ this._proxyPortTextbox,
+ this._proxyUsernameLabel,
+ this._proxyUsernameTextbox,
+ this._proxyPasswordLabel,
+ this._proxyPasswordTextbox,
+ ],
+ false
+ ); // ENABLE
+ break;
+ }
+ }
+ return this;
+ },
+
+ // pushes proxy settings from UI to tor
+ onUpdateProxySettings() {
+ const proxyType = this._useProxyCheckbox.checked
+ ? this._proxyTypeMenulist.value
+ : TorProxyType.NONE;
+ const addressString = this._proxyAddressTextbox.value;
+ const portString = this._proxyPortTextbox.value;
+ const usernameString = this._proxyUsernameTextbox.value;
+ const passwordString = this._proxyPasswordTextbox.value;
+
+ let proxySettings = null;
+
+ switch (proxyType) {
+ case TorProxyType.NONE:
+ proxySettings = makeTorProxySettingsNone();
+ break;
+ case TorProxyType.SOCKS4:
+ proxySettings = makeTorProxySettingsSocks4(
+ addressString,
+ parsePort(portString)
+ );
+ break;
+ case TorProxyType.SOCKS5:
+ proxySettings = makeTorProxySettingsSocks5(
+ addressString,
+ parsePort(portString),
+ usernameString,
+ passwordString
+ );
+ break;
+ case TorProxyType.HTTPS:
+ proxySettings = makeTorProxySettingsHTTPS(
+ addressString,
+ parsePort(portString),
+ usernameString,
+ passwordString
+ );
+ break;
+ }
+
+ proxySettings.writeSettings();
+ this._proxySettings = proxySettings;
+ return this;
+ },
+
+ // callback when firewall proxy is toggled
+ onToggleFirewall(enabled) {
+ this._useFirewallCheckbox.checked = enabled;
+ let disabled = !enabled;
+
+ this._setElementsDisabled(
+ [this._allowedPortsLabel, this._allowedPortsTextbox],
+ disabled
+ );
+
+ return this;
+ },
+
+ // pushes firewall settings from UI to tor
+ onUpdateFirewallSettings() {
+ let portListString = this._useFirewallCheckbox.checked
+ ? this._allowedPortsTextbox.value
+ : "";
+ let firewallSettings = null;
+
+ if (portListString) {
+ firewallSettings = makeTorFirewallSettingsCustom(
+ parsePortList(portListString)
+ );
+ } else {
+ firewallSettings = makeTorFirewallSettingsNone();
+ }
+
+ firewallSettings.writeSettings();
+ this._firewallSettings = firewallSettings;
+ return this;
+ },
+
+ onViewTorLogs() {
+ let torLogDialog = new TorLogDialog();
+ torLogDialog.openDialog(gSubDialog);
+ },
+ };
+ return retval;
+})(); /* gTorPane */
diff --git a/browser/components/torpreferences/content/torPane.xhtml b/browser/components/torpreferences/content/torPane.xhtml
new file mode 100644
index 000000000000..3c966b2b3726
--- /dev/null
+++ b/browser/components/torpreferences/content/torPane.xhtml
@@ -0,0 +1,123 @@
+<!-- Tor panel -->
+
+<script type="application/javascript"
+ src="chrome://browser/content/torpreferences/torPane.js"/>
+<html:template id="template-paneTor">
+<hbox id="torPreferencesCategory"
+ class="subcategory"
+ data-category="paneTor"
+ hidden="true">
+ <html:h1 id="torPreferences-header"/>
+</hbox>
+
+<groupbox data-category="paneTor"
+ hidden="true">
+ <description flex="1">
+ <html:span id="torPreferences-description" class="tail-with-learn-more"/>
+ <label id="torPreferences-learnMore" class="learnMore text-link" is="text-link"/>
+ </description>
+</groupbox>
+
+<!-- Bridges -->
+<groupbox id="torPreferences-bridges-group"
+ data-category="paneTor"
+ hidden="true">
+ <html:h2 id="torPreferences-bridges-header"/>
+ <description flex="1">
+ <html:span id="torPreferences-bridges-description" class="tail-with-learn-more"/>
+ <label id="torPreferences-bridges-learnMore" class="learnMore text-link" is="text-link"/>
+ </description>
+ <checkbox id="torPreferences-bridges-toggle"/>
+ <radiogroup id="torPreferences-bridges-bridgeSelection">
+ <hbox class="indent">
+ <radio id="torPreferences-bridges-radioBuiltin"/>
+ <spacer flex="1"/>
+ <menulist id="torPreferences-bridges-builtinList" class="torMarginFix">
+ <menupopup/>
+ </menulist>
+ </hbox>
+ <vbox class="indent">
+ <hbox>
+ <radio id="torPreferences-bridges-radioRequestBridge"/>
+ <space flex="1"/>
+ <button id="torPreferences-bridges-buttonRequestBridge" class="torMarginFix"/>
+ </hbox>
+ <html:textarea
+ id="torPreferences-bridges-textareaRequestBridge"
+ class="indent torMarginFix"
+ multiline="true"
+ rows="3"
+ readonly="true"/>
+ </vbox>
+ <hbox class="indent" flex="1">
+ <vbox flex="1">
+ <radio id="torPreferences-bridges-radioProvideBridge"/>
+ <description id="torPreferences-bridges-descriptionProvideBridge" class="indent"/>
+ <html:textarea
+ id="torPreferences-bridges-textareaProvideBridge"
+ class="indent torMarginFix"
+ multiline="true"
+ rows="3"/>
+ </vbox>
+ </hbox>
+ </radiogroup>
+</groupbox>
+
+<!-- Advanced -->
+<groupbox id="torPreferences-advanced-group"
+ data-category="paneTor"
+ hidden="true">
+ <html:h2 id="torPreferences-advanced-header"/>
+ <description flex="1">
+ <html:span id="torPreferences-advanced-description" class="tail-with-learn-more"/>
+ <label id="torPreferences-advanced-learnMore" class="learnMore text-link" is="text-link" style="display:none"/>
+ </description>
+ <box id="torPreferences-advanced-grid">
+ <!-- Local Proxy -->
+ <hbox class="torPreferences-advanced-checkbox-container">
+ <checkbox id="torPreferences-advanced-toggleProxy"/>
+ </hbox>
+ <hbox class="indent" align="center">
+ <label id="torPreferences-localProxy-type"/>
+ </hbox>
+ <hbox align="center">
+ <spacer flex="1"/>
+ <menulist id="torPreferences-localProxy-builtinList" class="torMarginFix">
+ <menupopup/>
+ </menulist>
+ </hbox>
+ <hbox class="indent" align="center">
+ <label id="torPreferences-localProxy-address"/>
+ </hbox>
+ <hbox align="center">
+ <html:input id="torPreferences-localProxy-textboxAddress" type="text" class="torMarginFix"/>
+ <label id="torPreferences-localProxy-port"/>
+ <!-- proxy-port-input class style pulled from preferences.css and used in the vanilla proxy setup menu -->
+ <html:input id="torPreferences-localProxy-textboxPort" class="proxy-port-input torMarginFix" hidespinbuttons="true" type="number" min="0" max="65535" maxlength="5"/>
+ </hbox>
+ <hbox class="indent" align="center">
+ <label id="torPreferences-localProxy-username"/>
+ </hbox>
+ <hbox align="center">
+ <html:input id="torPreferences-localProxy-textboxUsername" type="text" class="torMarginFix"/>
+ <label id="torPreferences-localProxy-password"/>
+ <html:input id="torPreferences-localProxy-textboxPassword" class="torMarginFix" type="password"/>
+ </hbox>
+ <!-- Firewall -->
+ <hbox class="torPreferences-advanced-checkbox-container">
+ <checkbox id="torPreferences-advanced-toggleFirewall"/>
+ </hbox>
+ <hbox class="indent" align="center">
+ <label id="torPreferences-advanced-allowedPorts"/>
+ </hbox>
+ <hbox align="center">
+ <html:input id="torPreferences-advanced-textboxAllowedPorts" type="text" class="torMarginFix" value="80,443"/>
+ </hbox>
+ </box>
+ <hbox id="torPreferences-torDaemon-hbox" align="center">
+ <label id="torPreferences-torLogs"/>
+ <spacer flex="1"/>
+ <button id="torPreferences-buttonTorLogs" class="torMarginFix"/>
+ </hbox>
+</groupbox>
+</html:template>
\ No newline at end of file
diff --git a/browser/components/torpreferences/content/torPreferences.css b/browser/components/torpreferences/content/torPreferences.css
new file mode 100644
index 000000000000..4dac2c457823
--- /dev/null
+++ b/browser/components/torpreferences/content/torPreferences.css
@@ -0,0 +1,77 @@
+#category-tor > .category-icon {
+ list-style-image: url("chrome://browser/content/torpreferences/torPreferencesIcon.svg");
+}
+
+#torPreferences-advanced-grid {
+ display: grid;
+ grid-template-columns: auto 1fr;
+}
+
+.torPreferences-advanced-checkbox-container {
+ grid-column: 1 / 3;
+}
+
+#torPreferences-localProxy-textboxAddress,
+#torPreferences-localProxy-textboxUsername,
+#torPreferences-localProxy-textboxPassword,
+#torPreferences-advanced-textboxAllowedPorts {
+ -moz-box-flex: 1;
+}
+
+hbox#torPreferences-torDaemon-hbox {
+ margin-top: 20px;
+}
+
+description#torPreferences-requestBridge-description {
+ /*margin-bottom: 1em;*/
+ min-height: 2em;
+}
+
+image#torPreferences-requestBridge-captchaImage {
+ margin: 1em;
+ min-height: 125px;
+}
+
+button#torPreferences-requestBridge-refreshCaptchaButton {
+ min-width: initial;
+}
+
+dialog#torPreferences-requestBridge-dialog > hbox {
+ margin-bottom: 1em;
+}
+
+/*
+ Various elements that really should be lining up don't because they have inconsistent margins
+*/
+.torMarginFix {
+ margin-left : 4px;
+ margin-right : 4px;
+}
+
+/*
+ This hbox is hidden by css here by default so that the
+ xul dialog allocates enough screen space for the error message
+ element, otherwise it gets cut off since dialog's overflow is hidden
+*/
+hbox#torPreferences-requestBridge-incorrectCaptchaHbox {
+ visibility: hidden;
+}
+
+image#torPreferences-requestBridge-errorIcon {
+ list-style-image: url("chrome://browser/skin/warning.svg");
+}
+
+groupbox#torPreferences-bridges-group textarea {
+ white-space: pre;
+ overflow: auto;
+}
+
+textarea#torPreferences-torDialog-textarea {
+ -moz-box-flex: 1;
+ font-family: monospace;
+ font-size: 0.8em;
+ white-space: pre;
+ overflow: auto;
+ /* 10 lines */
+ min-height: 20em;
+}
\ No newline at end of file
diff --git a/browser/components/torpreferences/content/torPreferencesIcon.svg b/browser/components/torpreferences/content/torPreferencesIcon.svg
new file mode 100644
index 000000000000..d7895f1107c5
--- /dev/null
+++ b/browser/components/torpreferences/content/torPreferencesIcon.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24">
+ <g fill="context-fill" fill-opacity="context-fill-opacity" fill-rule="nonzero">
+ <path d="M12.0246161,21.8174863 L12.0246161,20.3628098 C16.6324777,20.3495038 20.3634751,16.6108555 20.3634751,11.9996673 C20.3634751,7.38881189 16.6324777,3.65016355 12.0246161,3.63685757 L12.0246161,2.18218107 C17.4358264,2.1958197 21.8178189,6.58546322 21.8178189,11.9996673 C21.8178189,17.4142042 17.4358264,21.8041803 12.0246161,21.8174863 L12.0246161,21.8174863 Z M12.0246161,16.7259522 C14.623607,16.7123136 16.7272828,14.6023175 16.7272828,11.9996673 C16.7272828,9.39734991 14.623607,7.28735377 12.0246161,7.27371516 L12.0246161,5.81937131 C15.4272884,5.8326773 18.1819593,8.59400123 18.1819593,11.9996673 C18.1819593,15.4056661 15.4272884,18.1669901 12.0246161,18.1802961 L12.0246161,16.7259522 Z M12.0246161,9.45556355 C13.4187503,9.46886953 14.5454344,10.6022066 14.5454344,11.9996673 C14.5454344,13.3974608 13.4187503,14.5307978 12.0246161,14.5441038 L12.0246161,9.45556355 Z M0,11.9996673 C0,18.6273771 5.37229031,24 12,24 C18.6273771,24 24,18.6273771 24,11.9996673 C24,5.37229031
18.6273771,0 12,0 C5.37229031,0 0,5.37229031 0,11.9996673 Z"/>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/browser/components/torpreferences/content/torProxySettings.jsm b/browser/components/torpreferences/content/torProxySettings.jsm
new file mode 100644
index 000000000000..98bb5e8d5cbf
--- /dev/null
+++ b/browser/components/torpreferences/content/torProxySettings.jsm
@@ -0,0 +1,245 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "TorProxyType",
+ "TorProxySettings",
+ "makeTorProxySettingsNone",
+ "makeTorProxySettingsSocks4",
+ "makeTorProxySettingsSocks5",
+ "makeTorProxySettingsHTTPS",
+];
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+const { parseAddrPort, parseUsernamePassword } = ChromeUtils.import(
+ "chrome://browser/content/torpreferences/parseFunctions.jsm"
+);
+
+const TorProxyType = {
+ NONE: "NONE",
+ SOCKS4: "SOCKS4",
+ SOCKS5: "SOCKS5",
+ HTTPS: "HTTPS",
+};
+
+class TorProxySettings {
+ constructor() {
+ this._proxyType = TorProxyType.NONE;
+ this._proxyAddress = undefined;
+ this._proxyPort = undefined;
+ this._proxyUsername = undefined;
+ this._proxyPassword = undefined;
+ }
+
+ get type() {
+ return this._proxyType;
+ }
+ get address() {
+ return this._proxyAddress;
+ }
+ get port() {
+ return this._proxyPort;
+ }
+ get username() {
+ return this._proxyUsername;
+ }
+ get password() {
+ return this._proxyPassword;
+ }
+ get proxyURI() {
+ switch (this._proxyType) {
+ case TorProxyType.SOCKS4:
+ return `socks4a://${this._proxyAddress}:${this._proxyPort}`;
+ case TorProxyType.SOCKS5:
+ if (this._proxyUsername) {
+ return `socks5://${this._proxyUsername}:${this._proxyPassword}@${
+ this._proxyAddress
+ }:${this._proxyPort}`;
+ }
+ return `socks5://${this._proxyAddress}:${this._proxyPort}`;
+ case TorProxyType.HTTPS:
+ if (this._proxyUsername) {
+ return `http://${this._proxyUsername}:${this._proxyPassword}@${
+ this._proxyAddress
+ }:${this._proxyPort}`;
+ }
+ return `http://${this._proxyAddress}:${this._proxyPort}`;
+ }
+ return undefined;
+ }
+
+ // attempts to read proxy settings from Tor daemon
+ readSettings() {
+ // SOCKS4
+ {
+ let addressPort = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.socks4Proxy
+ );
+ if (addressPort) {
+ // address+port
+ let [proxyAddress, proxyPort] = parseAddrPort(addressPort);
+
+ this._proxyType = TorProxyType.SOCKS4;
+ this._proxyAddress = proxyAddress;
+ this._proxyPort = proxyPort;
+ this._proxyUsername = "";
+ this._proxyPassword = "";
+
+ return;
+ }
+ }
+
+ // SOCKS5
+ {
+ let addressPort = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.socks5Proxy
+ );
+
+ if (addressPort) {
+ // address+port
+ let [proxyAddress, proxyPort] = parseAddrPort(addressPort);
+ // username
+ let proxyUsername = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.socks5ProxyUsername
+ );
+ // password
+ let proxyPassword = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.socks5ProxyPassword
+ );
+
+ this._proxyType = TorProxyType.SOCKS5;
+ this._proxyAddress = proxyAddress;
+ this._proxyPort = proxyPort;
+ this._proxyUsername = proxyUsername;
+ this._proxyPassword = proxyPassword;
+
+ return;
+ }
+ }
+
+ // HTTP
+ {
+ let addressPort = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.httpsProxy
+ );
+
+ if (addressPort) {
+ // address+port
+ let [proxyAddress, proxyPort] = parseAddrPort(addressPort);
+
+ // username:password
+ let proxyAuthenticator = TorProtocolService.readStringSetting(
+ TorStrings.configKeys.httpsProxyAuthenticator
+ );
+
+ let [proxyUsername, proxyPassword] = ["", ""];
+ if (proxyAuthenticator) {
+ [proxyUsername, proxyPassword] = parseUsernamePassword(
+ proxyAuthenticator
+ );
+ }
+
+ this._proxyType = TorProxyType.HTTPS;
+ this._proxyAddress = proxyAddress;
+ this._proxyPort = proxyPort;
+ this._proxyUsername = proxyUsername;
+ this._proxyPassword = proxyPassword;
+ }
+ }
+ // no proxy settings
+ } /* TorProxySettings::ReadFromTor() */
+
+ // attempts to write proxy settings to Tor daemon
+ // throws on error
+ writeSettings() {
+ let settingsObject = new Map();
+
+ // init proxy related settings to null so Tor daemon resets them
+ settingsObject.set(TorStrings.configKeys.socks4Proxy, null);
+ settingsObject.set(TorStrings.configKeys.socks5Proxy, null);
+ settingsObject.set(TorStrings.configKeys.socks5ProxyUsername, null);
+ settingsObject.set(TorStrings.configKeys.socks5ProxyPassword, null);
+ settingsObject.set(TorStrings.configKeys.httpsProxy, null);
+ settingsObject.set(TorStrings.configKeys.httpsProxyAuthenticator, null);
+
+ switch (this._proxyType) {
+ case TorProxyType.SOCKS4:
+ settingsObject.set(
+ TorStrings.configKeys.socks4Proxy,
+ `${this._proxyAddress}:${this._proxyPort}`
+ );
+ break;
+ case TorProxyType.SOCKS5:
+ settingsObject.set(
+ TorStrings.configKeys.socks5Proxy,
+ `${this._proxyAddress}:${this._proxyPort}`
+ );
+ settingsObject.set(
+ TorStrings.configKeys.socks5ProxyUsername,
+ this._proxyUsername
+ );
+ settingsObject.set(
+ TorStrings.configKeys.socks5ProxyPassword,
+ this._proxyPassword
+ );
+ break;
+ case TorProxyType.HTTPS:
+ settingsObject.set(
+ TorStrings.configKeys.httpsProxy,
+ `${this._proxyAddress}:${this._proxyPort}`
+ );
+ settingsObject.set(
+ TorStrings.configKeys.httpsProxyAuthenticator,
+ `${this._proxyUsername}:${this._proxyPassword}`
+ );
+ break;
+ }
+
+ TorProtocolService.writeSettings(settingsObject);
+ } /* TorProxySettings::WriteToTor() */
+}
+
+// factory methods for our various supported proxies
+function makeTorProxySettingsNone() {
+ return new TorProxySettings();
+}
+
+function makeTorProxySettingsSocks4(aProxyAddress, aProxyPort) {
+ let retval = new TorProxySettings();
+ retval._proxyType = TorProxyType.SOCKS4;
+ retval._proxyAddress = aProxyAddress;
+ retval._proxyPort = aProxyPort;
+ return retval;
+}
+
+function makeTorProxySettingsSocks5(
+ aProxyAddress,
+ aProxyPort,
+ aProxyUsername,
+ aProxyPassword
+) {
+ let retval = new TorProxySettings();
+ retval._proxyType = TorProxyType.SOCKS5;
+ retval._proxyAddress = aProxyAddress;
+ retval._proxyPort = aProxyPort;
+ retval._proxyUsername = aProxyUsername;
+ retval._proxyPassword = aProxyPassword;
+ return retval;
+}
+
+function makeTorProxySettingsHTTPS(
+ aProxyAddress,
+ aProxyPort,
+ aProxyUsername,
+ aProxyPassword
+) {
+ let retval = new TorProxySettings();
+ retval._proxyType = TorProxyType.HTTPS;
+ retval._proxyAddress = aProxyAddress;
+ retval._proxyPort = aProxyPort;
+ retval._proxyUsername = aProxyUsername;
+ retval._proxyPassword = aProxyPassword;
+ return retval;
+}
diff --git a/browser/components/torpreferences/jar.mn b/browser/components/torpreferences/jar.mn
new file mode 100644
index 000000000000..857bc9ee3eac
--- /dev/null
+++ b/browser/components/torpreferences/jar.mn
@@ -0,0 +1,14 @@
+browser.jar:
+ content/browser/torpreferences/parseFunctions.jsm (content/parseFunctions.jsm)
+ content/browser/torpreferences/requestBridgeDialog.xhtml (content/requestBridgeDialog.xhtml)
+ content/browser/torpreferences/requestBridgeDialog.jsm (content/requestBridgeDialog.jsm)
+ content/browser/torpreferences/torBridgeSettings.jsm (content/torBridgeSettings.jsm)
+ content/browser/torpreferences/torCategory.inc.xhtml (content/torCategory.inc.xhtml)
+ content/browser/torpreferences/torFirewallSettings.jsm (content/torFirewallSettings.jsm)
+ content/browser/torpreferences/torLogDialog.jsm (content/torLogDialog.jsm)
+ content/browser/torpreferences/torLogDialog.xhtml (content/torLogDialog.xhtml)
+ content/browser/torpreferences/torPane.js (content/torPane.js)
+ content/browser/torpreferences/torPane.xhtml (content/torPane.xhtml)
+ content/browser/torpreferences/torPreferences.css (content/torPreferences.css)
+ content/browser/torpreferences/torPreferencesIcon.svg (content/torPreferencesIcon.svg)
+ content/browser/torpreferences/torProxySettings.jsm (content/torProxySettings.jsm)
diff --git a/browser/components/torpreferences/moz.build b/browser/components/torpreferences/moz.build
new file mode 100644
index 000000000000..2661ad7cb9f3
--- /dev/null
+++ b/browser/components/torpreferences/moz.build
@@ -0,0 +1 @@
+JAR_MANIFESTS += ["jar.mn"]
diff --git a/browser/modules/BridgeDB.jsm b/browser/modules/BridgeDB.jsm
new file mode 100644
index 000000000000..2caa26b4e2e0
--- /dev/null
+++ b/browser/modules/BridgeDB.jsm
@@ -0,0 +1,110 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["BridgeDB"];
+
+const { TorLauncherBridgeDB } = ChromeUtils.import(
+ "resource://torlauncher/modules/tl-bridgedb.jsm"
+);
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
+var BridgeDB = {
+ _moatRequestor: null,
+ _currentCaptchaInfo: null,
+ _bridges: null,
+
+ get currentCaptchaImage() {
+ if (this._currentCaptchaInfo) {
+ return this._currentCaptchaInfo.captchaImage;
+ }
+ return null;
+ },
+
+ get currentBridges() {
+ return this._bridges;
+ },
+
+ submitCaptchaGuess(aCaptchaSolution) {
+ if (this._moatRequestor && this._currentCaptchaInfo) {
+ return this._moatRequestor
+ .finishFetch(
+ this._currentCaptchaInfo.transport,
+ this._currentCaptchaInfo.challenge,
+ aCaptchaSolution
+ )
+ .then(aBridgeInfo => {
+ this._moatRequestor.close();
+ this._moatRequestor = null;
+ this._currentCaptchaInfo = null;
+ this._bridges = aBridgeInfo.bridges;
+ // array of bridge strings
+ return this._bridges;
+ });
+ }
+
+ return new Promise((aResponse, aReject) => {
+ aReject(new Error("Invalid _moatRequestor or _currentCaptchaInfo"));
+ });
+ },
+
+ requestNewCaptchaImage(aProxyURI) {
+ // close and clear out existing state on captcha request
+ this.close();
+
+ let transportPlugins = TorProtocolService.readStringArraySetting(
+ TorStrings.configKeys.clientTransportPlugin
+ );
+
+ let meekClientPath;
+ let meekTransport; // We support both "meek" and "meek_lite".
+ let meekClientArgs;
+ // TODO: shouldn't this early out once meek settings are found?
+ for (const line of transportPlugins) {
+ // Parse each ClientTransportPlugin line and look for the meek or
+ // meek_lite transport. This code works a lot like the Tor daemon's
+ // parse_transport_line() function.
+ let tokens = line.split(" ");
+ if (tokens.length > 2 && tokens[1] == "exec") {
+ let transportArray = tokens[0].split(",").map(aStr => aStr.trim());
+ let transport = transportArray.find(
+ aTransport => aTransport === "meek"
+ );
+ if (!transport) {
+ transport = transportArray.find(
+ aTransport => aTransport === "meek_lite"
+ );
+ }
+ if (transport) {
+ meekTransport = transport;
+ meekClientPath = tokens[2];
+ meekClientArgs = tokens.slice(3);
+ }
+ }
+ }
+
+ this._moatRequestor = TorLauncherBridgeDB.createMoatRequestor();
+
+ return this._moatRequestor
+ .init(aProxyURI, meekTransport, meekClientPath, meekClientArgs)
+ .then(() => {
+ // TODO: get this from TorLauncherUtil
+ let bridgeType = "obfs4";
+ return this._moatRequestor.fetchBridges([bridgeType]);
+ })
+ .then(aCaptchaInfo => {
+ // cache off the current captcha info as the challenge is needed for response
+ this._currentCaptchaInfo = aCaptchaInfo;
+ return aCaptchaInfo.captchaImage;
+ });
+ },
+
+ close() {
+ if (this._moatRequestor) {
+ this._moatRequestor.close();
+ this._moatRequestor = null;
+ }
+ this._currentCaptchaInfo = null;
+ },
+};
diff --git a/browser/modules/TorProtocolService.jsm b/browser/modules/TorProtocolService.jsm
new file mode 100644
index 000000000000..b4e6ed9a3253
--- /dev/null
+++ b/browser/modules/TorProtocolService.jsm
@@ -0,0 +1,212 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["TorProtocolService"];
+
+const { TorLauncherUtil } = ChromeUtils.import(
+ "resource://torlauncher/modules/tl-util.jsm"
+);
+
+var TorProtocolService = {
+ _tlps: Cc["@torproject.org/torlauncher-protocol-service;1"].getService(
+ Ci.nsISupports
+ ).wrappedJSObject,
+
+ // maintain a map of tor settings set by Tor Browser so that we don't
+ // repeatedly set the same key/values over and over
+ // this map contains string keys to primitive or array values
+ _settingsCache: new Map(),
+
+ _typeof(aValue) {
+ switch (typeof aValue) {
+ case "boolean":
+ return "boolean";
+ case "string":
+ return "string";
+ case "object":
+ if (aValue == null) {
+ return "null";
+ } else if (Array.isArray(aValue)) {
+ return "array";
+ }
+ return "object";
+ }
+ return "unknown";
+ },
+
+ _assertValidSettingKey(aSetting) {
+ // ensure the 'key' is a string
+ if (typeof aSetting != "string") {
+ throw new Error(
+ `Expected setting of type string but received ${typeof aSetting}`
+ );
+ }
+ },
+
+ _assertValidSetting(aSetting, aValue) {
+ this._assertValidSettingKey(aSetting);
+
+ const valueType = this._typeof(aValue);
+ switch (valueType) {
+ case "boolean":
+ case "string":
+ case "null":
+ return;
+ case "array":
+ for (const element of aValue) {
+ if (typeof element != "string") {
+ throw new Error(
+ `Setting '${aSetting}' array contains value of invalid type '${typeof element}'`
+ );
+ }
+ }
+ return;
+ default:
+ throw new Error(
+ `Invalid object type received for setting '${aSetting}'`
+ );
+ }
+ },
+
+ // takes a Map containing tor settings
+ // throws on error
+ writeSettings(aSettingsObj) {
+ // only write settings that have changed
+ let newSettings = new Map();
+ for (const [setting, value] of aSettingsObj) {
+ let saveSetting = false;
+
+ // make sure we have valid data here
+ this._assertValidSetting(setting, value);
+
+ if (!this._settingsCache.has(setting)) {
+ // no cached setting, so write
+ saveSetting = true;
+ } else {
+ const cachedValue = this._settingsCache.get(setting);
+ if (value != cachedValue) {
+ // compare arrays member-wise
+ if (Array.isArray(value) && Array.isArray(cachedValue)) {
+ if (value.length != cachedValue.length) {
+ saveSetting = true;
+ } else {
+ const arrayLength = value.length;
+ for (let i = 0; i < arrayLength; ++i) {
+ if (value[i] != cachedValue[i]) {
+ saveSetting = true;
+ break;
+ }
+ }
+ }
+ } else {
+ // some other different values
+ saveSetting = true;
+ }
+ }
+ }
+
+ if (saveSetting) {
+ newSettings.set(setting, value);
+ }
+ }
+
+ // only write if new setting to save
+ if (newSettings.size > 0) {
+ // convert settingsObject map to js object for torlauncher-protocol-service
+ let settingsObject = {};
+ for (const [setting, value] of newSettings) {
+ settingsObject[setting] = value;
+ }
+
+ let errorObject = {};
+ if (!this._tlps.TorSetConfWithReply(settingsObject, errorObject)) {
+ throw new Error(errorObject.details);
+ }
+
+ // save settings to cache after successfully writing to Tor
+ for (const [setting, value] of newSettings) {
+ this._settingsCache.set(setting, value);
+ }
+ }
+ },
+
+ _readSetting(aSetting) {
+ this._assertValidSettingKey(aSetting);
+ let reply = this._tlps.TorGetConf(aSetting);
+ if (this._tlps.TorCommandSucceeded(reply)) {
+ return reply.lineArray;
+ }
+ throw new Error(reply.lineArray.join("\n"));
+ },
+
+ _readBoolSetting(aSetting) {
+ let lineArray = this._readSetting(aSetting);
+ if (lineArray.length != 1) {
+ throw new Error(
+ `Expected an array with length 1 but received array of length ${
+ lineArray.length
+ }`
+ );
+ }
+
+ let retval = lineArray[0];
+ switch (retval) {
+ case "0":
+ return false;
+ case "1":
+ return true;
+ default:
+ throw new Error(`Expected boolean (1 or 0) but received '${retval}'`);
+ }
+ },
+
+ _readStringSetting(aSetting) {
+ let lineArray = this._readSetting(aSetting);
+ if (lineArray.length != 1) {
+ throw new Error(
+ `Expected an array with length 1 but received array of length ${
+ lineArray.length
+ }`
+ );
+ }
+ return lineArray[0];
+ },
+
+ _readStringArraySetting(aSetting) {
+ let lineArray = this._readSetting(aSetting);
+ return lineArray;
+ },
+
+ readBoolSetting(aSetting) {
+ let value = this._readBoolSetting(aSetting);
+ this._settingsCache.set(aSetting, value);
+ return value;
+ },
+
+ readStringSetting(aSetting) {
+ let value = this._readStringSetting(aSetting);
+ this._settingsCache.set(aSetting, value);
+ return value;
+ },
+
+ readStringArraySetting(aSetting) {
+ let value = this._readStringArraySetting(aSetting);
+ this._settingsCache.set(aSetting, value);
+ return value;
+ },
+
+ // writes current tor settings to disk
+ flushSettings() {
+ this._tlps.TorSendCommand("SAVECONF");
+ },
+
+ getLog() {
+ let countObj = { value: 0 };
+ let torLog = this._tlps.TorGetLog(countObj);
+ return torLog;
+ },
+
+ // true if we launched and control tor, false if using system tor
+ get ownsTorDaemon() {
+ return TorLauncherUtil.shouldStartAndOwnTor;
+ },
+};
diff --git a/browser/modules/moz.build b/browser/modules/moz.build
index 3774c12f4ef0..1f7c6bc4c67e 100644
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -128,6 +128,7 @@ EXTRA_JS_MODULES += [
"AboutNewTab.jsm",
"AppUpdater.jsm",
"AsyncTabSwitcher.jsm",
+ "BridgeDB.jsm",
"BrowserUIUtils.jsm",
"BrowserUsageTelemetry.jsm",
"BrowserWindowTracker.jsm",
@@ -152,6 +153,7 @@ EXTRA_JS_MODULES += [
"TabsList.jsm",
"TabUnloader.jsm",
"ThemeVariableMap.jsm",
+ "TorProtocolService.jsm",
"TorStrings.jsm",
"TransientPrefs.jsm",
"webrtcUI.jsm",
1
0

21 Apr '21
commit 2d12f1087ea0cc0640c880bcb6c897408e8aabcd
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Apr 21 02:44:41 2021 +0000
Release preparations for 10.5a15
Versions bump and Changelog update
---
projects/android-components/config | 2 +-
.../gradle-dependencies-list.txt | 8 +-
projects/fenix/config | 2 +-
projects/fenix/gradle-dependencies-list.txt | 366 ++++++++++-----------
projects/firefox/config | 4 +-
projects/geckoview/config | 4 +-
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 15 +
projects/tor/config | 2 +-
rbm.conf | 4 +-
9 files changed, 210 insertions(+), 197 deletions(-)
diff --git a/projects/android-components/config b/projects/android-components/config
index 5284ce7..e5ddfe0 100644
--- a/projects/android-components/config
+++ b/projects/android-components/config
@@ -8,7 +8,7 @@ gpg_keyring: torbutton.gpg
variant: '[% IF c("var/release") %]Release[% ELSE %]Beta[% END %]'
var:
- android_components_version: 74.0.6
+ android_components_version: 74.0.10
torbrowser_branch: 10.5
container:
use_container: 1
diff --git a/projects/android-components/gradle-dependencies-list.txt b/projects/android-components/gradle-dependencies-list.txt
index ab3da10..93f040d 100644
--- a/projects/android-components/gradle-dependencies-list.txt
+++ b/projects/android-components/gradle-dependencies-list.txt
@@ -385,12 +385,12 @@ d1741144ed2ea215a84f5d94d779cafcfaf778cce8cc7224437a2884cb1101bc | https://maven
7b0a3bd6d32c8002f785db8fdbf3b08e3541366e784cac1304cb3f49642b916a | https://maven.mozilla.org/maven2/org/mozilla/components/support-ktx/71.0.0/…
f7bf27270904abd8639b543151b6eaf268b821b8e6235c8decf8031e02ec8648 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/71.0.…
0b80acf7d1dd0d9484b0e82cd1a04ae57270d7f7e6b339ce39424554d48798e3 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/71.0.…
-4c496ab63c3900ebbd9bde50d520c28c29ddd594ae3958f161f41a5810ba60fa | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
-e55a5d7ebdd6cae43d2a820c16f771ad8d87f25b181828ebd10c721f8ad445dc | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
+cd7d0e09420351e9e69277083b263c8f0aad75a4bac3153776caf1424efae653 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
+e1913ae393cae4186dd8603fbbf11f7b76720a216ce3132319a13d57d575f558 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
d622b92149ed8477aca47dabe0fd53de75191a29ff4d79a0cfc718736bb4aa2a | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-nightly/89…
8d6bc0c248af8f3d1f4f45abd4e04bf76044fbce518ca3c384ff83fe9acb38b4 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-nightly/89…
-418b2052928c75f4071b533cf864baaf22d0f134f6418200b8ab807c93428161 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/87.0.20210…
-9c4b5dd3e37936890909a0795be552664dd861f9f28a9815a72a4abc7660c700 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/87.0.20210…
+891bddc531733128099868a0c5b735bdf8a9248279e73c800cdbfe663a011071 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/88.0.20210…
+7b04e436f5f8f16565f245b451e7929a0ba907726efa371dde93e2c8e6c74f04 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/88.0.20210…
1eb5321d64bdd07865bd8599b6b981193b54661f25bbb8e3ccdc6f8210c9ae38 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-forUnitTests/3…
f62de54f66aa4086100f26884927dbff06a1cbea7fb17010312d10d71cea3f01 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-forUnitTests/3…
624e642862770feb72c22cd80cd96f0e5d53340ded862987b3ec9c537c8bed29 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-gradle-plugin/…
diff --git a/projects/fenix/config b/projects/fenix/config
index ff87d4b..415c8fb 100644
--- a/projects/fenix/config
+++ b/projects/fenix/config
@@ -8,7 +8,7 @@ gpg_keyring: torbutton.gpg
variant: Beta
var:
- fenix_version: 88.0.0b4
+ fenix_version: 88.1.0
torbrowser_branch: 10.5
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
container:
diff --git a/projects/fenix/gradle-dependencies-list.txt b/projects/fenix/gradle-dependencies-list.txt
index 1cbaeee..b49ce56 100644
--- a/projects/fenix/gradle-dependencies-list.txt
+++ b/projects/fenix/gradle-dependencies-list.txt
@@ -383,190 +383,188 @@ ea871f7d5fab5a4315f41402de15f94e13481d03366396ea1bf3880f4f242c1a | https://maven
cc7f7850bc9e5fecd8c699d0464e96bdb6765778e6463bcfc1c1efed08ba6ceb | https://maven.mozilla.org/maven2/org/mozilla/appservices/syncmanager/74.0.1…
4ecc86b606e1713faa7b75b01fbcd52d7d521f0c5c99784f07d87188cd73ea9c | https://maven.mozilla.org/maven2/org/mozilla/appservices/tabs/74.0.1/tabs-7…
c93fe881fec0df7da21f151b05652ea79157f08ad680d674d9591f6bd9843cea | https://maven.mozilla.org/maven2/org/mozilla/appservices/tabs/74.0.1/tabs-7…
-fe1e719d3e6f67da989ec022648f044e828dd2743b20b4ab75ae3668321cc559 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-awesomebar/…
-3052024c9cd7e93c912dbb79ab0922e282c266e2abb00488fc649a88dc958d22 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-awesomebar/…
-c404ac90f6d24d17099ed1bbee57057f11ddf012356da0132901c2fd56c4a48d | https://maven.mozilla.org/maven2/org/mozilla/components/browser-domains/74.…
-f7d172219ec271e133876c588fb178546738d8370a70fa905cb2e8712b7e6231 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-domains/74.…
-542d01c36d6a210d11870e0f45f0d4315730309e49b6f0923679644795686e7f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-284f8334776bae99a6bae81f51a81e3493579387fb4ba0303147ed2f4b4d82be | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-36e2db414e4da8b7a393d050bb83bc5338060ee38ea42ee50165060dd8a76a30 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-faa9e3d9128cfa319864b3bfd57e5c45b0b7e34bd4577c61e2f5ecc8a94efcdf | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-3dae363ce6471bac82619a8026d351a9eff52dc68a0e653ffea5fe1cb43b7623 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-ccc0cb52a61bedc6cd0947063b254bfd19c14fb6b2bad798cae50a1457351482 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
-7f86a7743824290a4c29058cb3c7db1ca38973c2b3b10c5c1f11a1b200b76577 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-errorpages/…
-8aaee820665cb79334fb8fd0f1566c34e65162891602e103814ce23b82cd2c51 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-errorpages/…
-914c93db7a7e8160e42faa31d5c780272b54d823b0b1cff57f3c3942b161d911 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-icons/74.0.…
-360f6c685f86b45d53ebe5f764f65d1c55c21e2cd477e4f48c7a43e68a02688e | https://maven.mozilla.org/maven2/org/mozilla/components/browser-icons/74.0.…
-8aa60b548d44f8045fa5dcfe57668c37be4aed9f89d4ec7a726ef358f2f4477d | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu/74.0.6…
-d0d5c9ecf53496171c93dd6e570799b58d13540f5d4323f583696e38f8b3644c | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu/74.0.6…
-72fd22d37e91937532e2dcb7bc020f9550935a1756c568d43dfd79b285747af6 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu2/74.0.…
-b620c2b4c4f92c7ae3bc611fff60270fafd5de47e450bed08f3b7b3f481431a5 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu2/74.0.…
-2a0b963ea60daa25c7a16cbdb9dc50c4c96515637fed871f8c51a4cf3ccb6e90 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-search/74.0…
-27ccf086a3aa15d7f74d915280e4bad2b691c70bc9536cef5665d7294a6563a6 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-search/74.0…
-be331d858094dcef92f81dc8f33186431e0a773a717207602b8f57eef78ed934 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session-sto…
-a50da79d6a5f2dc007ab8536da9f2d30cb88edbb049cdf7a0eddc232c54d8f93 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session-sto…
-2e4d468011b1fc4669369f2f57b79400762f974ee9b9df24c5138e54d9eaa380 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session/74.…
-f92153ebfc80f08fb43b1ed9b70d184dfa8aeafb2d2bc0be150d4c030027dbbf | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session/74.…
-52e95df94d3b06a623e32c84e2f758f25bd401ddd9c423eec2a7a61c6561b4b8 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-state/74.0.…
-ede870618f5b88b0ef077355d9cb3d057c3629d05c2937adfe982612b4568c5f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-state/74.0.…
-131e793b28048b74b263e670f0709522a5fd4e862424b68c7b7d905fd116a6fa | https://maven.mozilla.org/maven2/org/mozilla/components/browser-storage-syn…
-e9bf6891352eaf4670d9f73e4dd5617d12b56b20161c710c0fa8b5b86174cbf3 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-storage-syn…
-7ca8e20ed29a82e8e315e75b081c42fde4c57a4f55f9ca2eed0c86ca64143b11 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-tabstray/74…
-aedd88b79115ff6d624153fdd74633cd247bccddd29c37d04ee415d4beabb097 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-tabstray/74…
-936a7ca6a767cf38a1c35923212da29c617069e89dea7c4cd170abf028568ba3 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-thumbnails/…
-7f3619432f6c3f3c3b175d8e889580f11d7a5e4c7fd3ef734cb18a0467f9b670 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-thumbnails/…
-a3fde0838584d7fed341c137c866b2ff1d0682ead0004c58d713719f6e0f5203 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-toolbar/74.…
-0aeb6e48056fe340d627b50550b9487f0be677ed97e1af8120ecd79840414416 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-toolbar/74.…
-7113fbe6f7d25eeeb3429d6894042466887bc47f3e2a7de1e55dcfb43ec36054 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-awesomebar/…
-324290f86c4af76d7a50e5d3716003d6db563e67f1b68341e5597d3950add367 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-awesomebar/…
-0e2bfd55aab6b16c979a2475a4b68fecc6cef25493927a1cf3915ad17ae3585c | https://maven.mozilla.org/maven2/org/mozilla/components/concept-base/74.0.6…
-9191898038cfde89df3aff01da3b27d02bfff0673ee543f7939d337577af0fed | https://maven.mozilla.org/maven2/org/mozilla/components/concept-base/74.0.6…
-5c5dd6f7365535d51d5a5896606e2810c67232ed97c8e51d7721c6318cde525d | https://maven.mozilla.org/maven2/org/mozilla/components/concept-engine/74.0…
-56c8ba56874cc37461b9075c996cae699ea7d77670022962366b983517039850 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-engine/74.0…
-b3d266d989c919633be1b86c5470c5850669debcb7c0cd5243a0712299f41eb9 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-fetch/74.0.…
-5aa455421948ff9b82eceadd7550190be2fa61abd3baa47849ec4c9aad8be86c | https://maven.mozilla.org/maven2/org/mozilla/components/concept-fetch/74.0.…
-b6ded745da1c7f9f50d7f54fc1bbc05ec8bcebc6a63b34e486af7860ff104aec | https://maven.mozilla.org/maven2/org/mozilla/components/concept-menu/74.0.6…
-835b2d73b97efe6df414e75a29b992280e9b2e29ad4b1ed1a0628e734f9203ff | https://maven.mozilla.org/maven2/org/mozilla/components/concept-menu/74.0.6…
-5abdb97bb2a93439b0704d314370368f54e7dbfaddf9a14b5f0e1090854e458a | https://maven.mozilla.org/maven2/org/mozilla/components/concept-push/74.0.6…
-ca106a9dfb6cbf4e4f14e1a483f48818af243f9c23c0afa9903922c19d952618 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-push/74.0.6…
-613fca00692258d3f2716d614ea7d780d73e75918e536734b953ec3ca7f0d9c1 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-storage/74.…
-91755d537157780e37cd42ed94162c13bb1a2ebc2501a7673d301a7c9629444a | https://maven.mozilla.org/maven2/org/mozilla/components/concept-storage/74.…
-2b029b130b16efcb9e35b933fd697c35c3070869f61af7787d85994b61ee245c | https://maven.mozilla.org/maven2/org/mozilla/components/concept-sync/74.0.6…
-904368510520103d6253f1bc9b0a6e0a0de854af12deb005828eb7ffcf1e17b3 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-sync/74.0.6…
-70bfaf3bead6e66dd8ee7a8c107460292bf2cf4d99bf6688f136661b5653a9ec | https://maven.mozilla.org/maven2/org/mozilla/components/concept-tabstray/74…
-2d2e96d8a6f1d6812b038f5ade1dd87d984e3d66368d63cf0c5f3b03f43518c0 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-tabstray/74…
-ca06c09c285c8242388752889832fecc880ccbaa5382fa3a5af031dce695105f | https://maven.mozilla.org/maven2/org/mozilla/components/concept-toolbar/74.…
-c4c3dc06472ca89007665785da83be702dbde967e6de0e11e2d52926b309ea49 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-toolbar/74.…
-a11c8fa8dbdeeb71d3391746a1d1da64f5e36b2176bc5c67ee6c634601f326b4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts-pu…
-ffc7c97a784b834817f64df199c4f195c0622999469685f42fb8078f6f3725be | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts-pu…
-a4e0cdd659ce77cd4f569a208d937b8f9d9c8e359b60ab96886e9b265decfde4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts/74…
-bdc7dc3837527154e092940ddf5e98efb863d63bfd9746761c9b74646ce5fb7a | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts/74…
-f7a305b9bd0dbf2c4d6ac5a718813e58ab9556d61770d7373bc15c4c05c23550 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-addons/74.0…
-7ba82739848724e3ebdd6e5f7e1435d96ce26d91d99dc957e92067d18a4264a7 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-addons/74.0…
-41d8b04339dbafc26479cc39638d5aa88f363efaa10c3188213feede5c5c5cd6 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-app-links/7…
-71d725deda68d950275eaf70de15900071d8bd34f3ca0cb485d4183ab046da89 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-app-links/7…
-c110f65b18fe350f2f6c25dc3dbc9cada683351fccc0d3b48ceb036588226590 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-autofill/74…
-1bf7f6a2514d73b3ed6a432e5bb4dbbeff0db3bed0d9849ca8c1f6f5a79e6988 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-autofill/74…
-a01b988fc3a0f467d0b2ea46f419b6f5908862093afc6128b2271d3786452ca2 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-awesomebar/…
-f861ca0322ee096027de6604ae6d36581efa36878ac44bdde92fe3e9fa3ae190 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-awesomebar/…
-a44903fdfaf763d39090e70765b112148e36b0008237d0225cb02bd2ea203cf7 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-contextmenu…
-94c15f0f8322cc0999584f157af93e9a385e1f636eefdea6ce78174122a6c580 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-contextmenu…
-47d3178458da48bbab21dc5a2338c62661855ae7a6a7e2f875a56b67e0e67980 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-customtabs/…
-7cf4ffeebdf72a1127232ce3ee91041a3bf63ae778b6db13bb18c486ff791214 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-customtabs/…
-8fd2c45a46c3814d612cb312e963a277f94ebf84b60b3da884825354b129360f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-downloads/7…
-9d84569630948659a5278ebdfb5b8463e32c6282113e581c568c039847d1f31b | https://maven.mozilla.org/maven2/org/mozilla/components/feature-downloads/7…
-134078e44e2bb5b0da67f33799baafdd3308723ae8a93365084b3179f7aaa28f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-findinpage/…
-8ae23ce03d57df8923d06458e394c2f508e6d1c5f980a78dc2d66f97f911959c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-findinpage/…
-22c957b283609f62e3d3c7c43e04120096bbe3cd85e97be72d234c9ba8173e09 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-intent/74.0…
-7965f18b31eab9ab7909db4147ed7a967acb4aa7c5ec19b3d9a89a13d5b5786f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-intent/74.0…
-d426e4fe4cbe9cc1a8981096bef2918a9a87172e48d043e844b9a3a38835cc14 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-logins/74.0…
-bf7bd8f88277f327f98946ffe174820f3d49c561529e01e4ac0bc754c45311ea | https://maven.mozilla.org/maven2/org/mozilla/components/feature-logins/74.0…
-87984b9488bce21f59dd7d5ca8e0eb78106aed43013243a1453186b63c361984 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-media/74.0.…
-cf16058f8e49b9a00f52518460f359f17f0d63a5ae01d37fa11a67e9b461479d | https://maven.mozilla.org/maven2/org/mozilla/components/feature-media/74.0.…
-caaf0af18e8912ec794a22ca645a4c2e3f48ec7d633a041661a9e13b2591abc0 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-privatemode…
-7f8b55c74e16b5aa420a289c678285926fdab48529d1113b3ebc7c6cf13531a8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-privatemode…
-cbe78d0082e6d7d0808af8d376e71b5f4ee9c93294682918613326f44c0cd3d2 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-prompts/74.…
-c1b2083af1eec35d43eec4129bce56652a402bd44c35564d8f73b9b0d5b18e9f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-prompts/74.…
-0263280ee86a8be16b764649b9d5b942eb2d0d688145c69a23affadf39b1216c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-push/74.0.6…
-f97cc9ab41a5c1edf8d2b27815b838c029278cd65852afe042c531a2e508c218 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-push/74.0.6…
-165c91ac35da27fd05d606509bda0921dba2113d0df4fea4e696fcc4571ba006 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-pwa/74.0.6/…
-16d2a78a1c316d242ce8bdb1e371387c549b55c2728f2a3d72ad64db611bcd77 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-pwa/74.0.6/…
-f09ece651c3dd4f6322363e896236ea7256bb959b0a6a3f657b8ffe9f22ad8e2 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-qr/74.0.6/f…
-e70c41044ff003182f208548e3188be1a37101276343ec8aae63e5135ae9fd00 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-qr/74.0.6/f…
-130a84d1d763535cdb397dd442702cef7183337c71644efd3a0178dd959d1388 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-readerview/…
-d944e905ea766fe05a11f583a6548aab92215c31846b1f53e222963f95aecb1c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-readerview/…
-3aba091bef4dd68d8830a5d67d8a3e846830b2a2d0a0e4d82a02b0d714294083 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-recentlyclo…
-29687b737ab570a32508a6e7066f7b4b94a55d43849742fa61e4ac20dd968065 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-recentlyclo…
-f1e74848c9231e48b71222d07ae5304bf6b434b8b0ea44e61a7e240b10124f94 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-search/74.0…
-864ace86a007c6cef6cce201dfda76db95cf0bae34d7f1dd85d3ad4bca10035c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-search/74.0…
-9f294e19172e6b5ff8f3a9cec07899e9b58d2f9c28c15363ff8a6b3cdbc0a532 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-session/74.…
-195594b4bc2d7fe669052801f87315e40947791879e7ff3a5a57424a118e56e7 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-session/74.…
-90c13017b92a18bac0e232439b9f3ff42e044b9a95c3c1ed59e7cb97c50e53ed | https://maven.mozilla.org/maven2/org/mozilla/components/feature-share/74.0.…
-2b069241fb17fe87b9feaf60093ec79cb97e630f0d1899421e8381ea9be67c28 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-share/74.0.…
-6b7861bcfc25554efbd0c22b9a56b96524d73884dc3a6cf4c722ac14c61ae943 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-sitepermiss…
-0838a30ba4f8a70f3bc07fe527d48c9cb3bca07ceef872e661dbe72f0b1db4a9 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-sitepermiss…
-6dccc97e4ebef46f5b19778b573a866b54b2b5c942e0cd5ca9ed74e747661d68 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-syncedtabs/…
-fd7c7aea716595cd09e4c1eb581cf6a873c27c0abe4981442ab8a522ff242b94 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-syncedtabs/…
-4d1dfec02cdba1362fca06cd248eb9523fa25b9c4a95c6d20e8ed9fd17502955 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tab-collect…
-fcdc50588cb7c827f70b0c6eae5f446dc0cec0edd02825e42ae2fb28b6061185 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tab-collect…
-63e88cb2a29709df2fce934db92750a804c319ae9c8ee4589fdf5e828b83c6ec | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tabs/74.0.6…
-3f601c619aa2cf2da029e3e303dfbe8ebd84f31842691db3a9d08e88d06ed858 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tabs/74.0.6…
-29223b574a1906769fc2103a04d59088a421d2fdeba5d97e0f88e35b2ffb1f87 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-toolbar/74.…
-bf5ea7e99b1326db116a07361e19e1d0f59075c259a48c9386671f759462ed21 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-toolbar/74.…
-04868ff39208030d8b80b27f6c808986f2c177a9595526d0b0bc66c683422135 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-top-sites/7…
-7e624b60853cd5b3c3142628e67f0b62c5c029cefa9397e0e808e25250379815 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-top-sites/7…
-60d7babe2f55c3a83bf6c34c8bbbac9feb8ece7bcb1775a89b06f165110591a8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webauthn/74…
-2234c9c8fde00e987120fcbc667d43df941a28bc2bee74c8f411310315aecfa1 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webauthn/74…
-5a3589efba2218ad0856d642c8beab46c6b61b4f125f902a13bbbb7a035aa995 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat-r…
-8f49df4e3d6a541303badb0e360e5c2839ed854dedfc59dafb94fa881728101e | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat-r…
-22c4cec3ddc3c3a65d81c9e58a72e0d544b9def12e371706a3a34405bf48a8d8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat/7…
-ae21972ac805c01b7b2975a16c02d2afaa2b96445d35f46b16ab25571041b670 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat/7…
-163be0e49e266d6ba97621a830c6acfba760e79293fb6ad16e0eab8a07889a6c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webnotifica…
-afefe5259bf4630b1e26e93a77ac7fe327d3da26254b6f6af1291980fa70596c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webnotifica…
-cd044ed7be200c8ea8733b920e335f3b51e33fb38ddb39cc425eed82859584fe | https://maven.mozilla.org/maven2/org/mozilla/components/lib-crash/74.0.6/li…
-70096fb52edcd596cf01b9ac6fde438ef03bd79dd744c41cd6d026e01d9e7f98 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-crash/74.0.6/li…
-ea0870b0930f2fa33b49cb6bd03a2fb0bfb83c5389c6792bc6a1d15915d22d9d | https://maven.mozilla.org/maven2/org/mozilla/components/lib-dataprotect/74.…
-4c57acd1a1e95a17c00e3bc525a6d236625fcb2e63919b6cdc0de0fbbc11b81a | https://maven.mozilla.org/maven2/org/mozilla/components/lib-dataprotect/74.…
-d09c7c1f51dade8103f510c24e2c0b9ef1fe12848c5934b7de5fc74cd81d1055 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-publicsuffixlis…
-4efe6b346499a7b7433e82fd30fc91f9e607727e82158610a6cb7c26c2328e69 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-publicsuffixlis…
-55d53cf3950b767813c555d42020f8f2240bcd85e2f0e9adb2bf0ca4325ee4aa | https://maven.mozilla.org/maven2/org/mozilla/components/lib-push-firebase/7…
-157fdf33f5acad1ef7ee1e82ab7419b93fdc38e4bea46e45767d73e0201849df | https://maven.mozilla.org/maven2/org/mozilla/components/lib-push-firebase/7…
-53ff9a64082922b68e3a0f5fb2c1598f48ba2e07c28ff0376972dd3215cba5b7 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-state/74.0.6/li…
-5b2b208d8f1987bd7375b8eb0a366c7fa5081b2a27a01910e3928577f1f66406 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-state/74.0.6/li…
-26c2eac42e6a5bebf417d1aa2ea0524a34a073a8e021c96505162b033959e549 | https://maven.mozilla.org/maven2/org/mozilla/components/service-digitalasse…
-1fb1296b12d05efb445136e868c8e11cb792a74c1376b89cf12cd29a1b2b04ff | https://maven.mozilla.org/maven2/org/mozilla/components/service-digitalasse…
-1e2a8112e2bcb07c8bd95cd16a397c421d4c0a1e555a349668875323b94fc714 | https://maven.mozilla.org/maven2/org/mozilla/components/service-firefox-acc…
-e9a3b3176cd8e94947494d56d605b3c11ebf29233dde0df974484af2a607c901 | https://maven.mozilla.org/maven2/org/mozilla/components/service-firefox-acc…
-32820376d60504d2740ec710257646a8d3e60954d1cae856519375029d9c2dd4 | https://maven.mozilla.org/maven2/org/mozilla/components/service-glean/74.0.…
-c7526e68869cd82aaafca955f9787b8b6bf3358e48bd1965958cdf76ec46c454 | https://maven.mozilla.org/maven2/org/mozilla/components/service-glean/74.0.…
-44cf79e99f09034377b7173c8734478d848c0e75727ac9d63c1429cfccd181d3 | https://maven.mozilla.org/maven2/org/mozilla/components/service-location/74…
-9c919fdb9821b7a5b2a34ea45b2dd06113e3707b58d937046ed55271177415e5 | https://maven.mozilla.org/maven2/org/mozilla/components/service-location/74…
-86b0370451f7b520e7d7f4f2001e1a270e5b6d575be556188b21f62a75a0d1ae | https://maven.mozilla.org/maven2/org/mozilla/components/service-nimbus/74.0…
-4ffb2f8f0b557359005fc40678cbd9019143191eafe97f91418bcc38309e176a | https://maven.mozilla.org/maven2/org/mozilla/components/service-nimbus/74.0…
-93fc9cf55a878b6af1d17fef5e95a213b6208be6e98195f0432bc886a89069aa | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-autofi…
-be64bb1c461fabd8ab98e97f4a670700611353d701688fe01ef4e19c64d4bba0 | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-autofi…
-4edb9b8fb7cccf80875761a9713fe21dd26a40424304d3580f88155af1d338c6 | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-logins…
-5831b29898d32fb28b0e250c13fc43c6671a05f4b0698e4a2d3b38e681ae59af | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-logins…
-3f7925e839bc9b1a3ca9ba8026de0eee3ac8d0a40f97cc3cf662884dcbd90aa9 | https://maven.mozilla.org/maven2/org/mozilla/components/support-base/74.0.6…
-61e1d9f9741f7c34ede17477cf43f1e26e76b6f00b3b8304a7625a0feb0c11ef | https://maven.mozilla.org/maven2/org/mozilla/components/support-base/74.0.6…
-1dd3d5b63227e03ec66a737249a69a7c9e086a318d0bcbb732a9ba16ebf68d81 | https://maven.mozilla.org/maven2/org/mozilla/components/support-images/74.0…
-3285299076b3b4f608b859ea827211020559a53394b389373d1fccb1e4fdac29 | https://maven.mozilla.org/maven2/org/mozilla/components/support-images/74.0…
-d5a3e32eeee210ed51976d15b477c64c26a9a661d17ecacd4a7027e2f6903054 | https://maven.mozilla.org/maven2/org/mozilla/components/support-ktx/74.0.6/…
-14fe7e1d7c44bbe74bdac6ea7525267c1764c013fc650808aeac51f5d66b6c61 | https://maven.mozilla.org/maven2/org/mozilla/components/support-ktx/74.0.6/…
-dc6f218467dcde954e63dd3530d5f16fe95a66ed4126ca1cba423137bab3a9e3 | https://maven.mozilla.org/maven2/org/mozilla/components/support-locale/74.0…
-3c466254f805494ddc23e05d3a01bb33beaf4b4ea2f17122333c9b845616bc81 | https://maven.mozilla.org/maven2/org/mozilla/components/support-locale/74.0…
-358d74e5fa4226119eb88002bb2006851995ca5a85b4c96aab7b4ac4cbfb513d | https://maven.mozilla.org/maven2/org/mozilla/components/support-migration/7…
-87089e42f15a5ee1cdc6b29f158b6bc626ed1baeac448648c94be030e745c4f0 | https://maven.mozilla.org/maven2/org/mozilla/components/support-migration/7…
-c9a04732c9a7e37f61284b5e5a917a33db63ad97fc8fc01a2d85abbf65a88a95 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rusthttp/74…
-3b05493515192b3150c727acec2434f5fd47f9de3d079a476489ba9a25ed24f2 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rusthttp/74…
-fb718c510fe5403549fe98f698d1fc6aefc652934d0e691a03e3b76d5c9e9711 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rustlog/74.…
-d06ab1a930a5ed2d0e4b09da61e8af0ea52dd12673879e34a53dea0946816f75 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rustlog/74.…
-662e118a95c2d72aea8373e966163da6ba925a6abeb9163b69883d642dff2a18 | https://maven.mozilla.org/maven2/org/mozilla/components/support-sync-teleme…
-d0eb9b70d2d192d5f86a0499f122a2d6101aac570fb8a3c6b1ffffacda1db1ce | https://maven.mozilla.org/maven2/org/mozilla/components/support-sync-teleme…
-8468a81c26469afb1e1cec6ad846d6526b9e0a94be3f7f9a5c2099f4a41e6392 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test-libsta…
-4aa2fec5b64a87ef4b66f72d8600cfdeb6a94068d47240cdad882d76e01e4f37 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test-libsta…
-027b737998baf285d61a31c1a8e1b0bec207c54f3fdbeb29324d0a7b6bc70d19 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test/74.0.6…
-18ebdd0eea1ee700ce694f156146f5ceebd412d14a782b674699578c27863881 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test/74.0.6…
-47c2bae8c0f030310bb8e1b9614f2f066e28fdb313b2697d9ad716b1bca5f472 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/74.0.…
-0e4e8c00b68f38efa6ce479bc546648c4ab51834dee9500d3dbc7e47d6cb4ae4 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/74.0.…
-ae397fe3dc1ce4abdd956cc0c53d794a99dc390f91c43393ed6ac2528960e227 | https://maven.mozilla.org/maven2/org/mozilla/components/support-webextensio…
-38712d035306fcb2bf9512c08f6562f8b106370e5d419676d2509daebf4cbfcc | https://maven.mozilla.org/maven2/org/mozilla/components/support-webextensio…
-ee83c353d2de305d191033e818d3cb6070ed27d69a651471a3402dca3c57c7c6 | https://maven.mozilla.org/maven2/org/mozilla/components/tooling-glean-gradl…
-42b25810a4f1d769f7140d8cc11e9b63077a6e6f678e814fabcfab2fd447f012 | https://maven.mozilla.org/maven2/org/mozilla/components/tooling-glean-gradl…
-f3b4815166f0176a17c9d0e4061752ebb554626b08144671142ec393cf238183 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-autocomplete/74.…
-116562177219a949d178ce91dbf60041559a699cbfd4fbfde40b72723905118c | https://maven.mozilla.org/maven2/org/mozilla/components/ui-autocomplete/74.…
-3e0e38eed080c2b10f56db91c6e0380b4c9730f440da239ee85c7a125d398f2b | https://maven.mozilla.org/maven2/org/mozilla/components/ui-colors/74.0.6/ui…
-f755f891871ada458c70dcb5819af845819525bdb119337914a0283695f2f9d0 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-colors/74.0.6/ui…
-bf092c353816ea029b579a63e3d3db2dfd08706bbabe4ddd67727551a5d5adaf | https://maven.mozilla.org/maven2/org/mozilla/components/ui-icons/74.0.6/ui-…
-b0e77ca12374820e4aae44300c827b9b7605451bf7b1b4d4b5ced8730fe65f37 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-icons/74.0.6/ui-…
-68f2d6a7519c47cb9c7ab41223b391c30247233958b7785f966753bbb4a64c79 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-tabcounter/74.0.…
-43a558dbc5e511d875b78acebac4d218647cd9f38603e6155a6a9c3e652d7649 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-tabcounter/74.0.…
-f590de90365c4d2a7575582f89f6390b90599988e75601881e26d85c0aab48a1 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-widgets/74.0.6/u…
-f59f0463227d7ed8d62a99e9e3f4d9a16a244744dc4e63173bbecb4f921a7edc | https://maven.mozilla.org/maven2/org/mozilla/components/ui-widgets/74.0.6/u…
-4c496ab63c3900ebbd9bde50d520c28c29ddd594ae3958f161f41a5810ba60fa | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
-e55a5d7ebdd6cae43d2a820c16f771ad8d87f25b181828ebd10c721f8ad445dc | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
-418b2052928c75f4071b533cf864baaf22d0f134f6418200b8ab807c93428161 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/87.0.20210…
-9c4b5dd3e37936890909a0795be552664dd861f9f28a9815a72a4abc7660c700 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/87.0.20210…
+91d28649b8d92040e48b2b8b40257b9f25f6914884de9068f72cd4e0824d30e2 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-awesomebar/…
+e2dce2185ed3f1a213e89f84e5468288b8c7b5cc488b767fe76a703ddbb343bc | https://maven.mozilla.org/maven2/org/mozilla/components/browser-awesomebar/…
+c404ac90f6d24d17099ed1bbee57057f11ddf012356da0132901c2fd56c4a48d | https://maven.mozilla.org/maven2/org/mozilla/components/browser-domains/74.…
+4a8a4e30ab87ed6d390322eb426a3454283cb7b25e597ef942690acd7b791ee6 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-domains/74.…
+542d01c36d6a210d11870e0f45f0d4315730309e49b6f0923679644795686e7f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
+1f22578fa13238b8a00c6d7c9dd5c038cd385f44861d3763d48e0f624d620837 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
+cb8e472d120ff88c30788aa2996ef03af8c2149ddbb3693cae0406bb1db49b32 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
+455d5b5d2388c1d74aa0e97ae0efac9954224b339523afc4a025d19e978ba58f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-engine-geck…
+1a56b6ab25aac1fa57c109201a1fd5a7580b5a9c8bcbbba5bf34fbb204d9f5a4 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-errorpages/…
+300c6215ca589696e4e9c780adb0e27076cb91a297e87a6387a4ea29a0bec5a6 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-errorpages/…
+f752507543ad3c687465e216dc618fad8ec44e34989228b391b2cc21e4cd1e34 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-icons/74.0.…
+8c5d3308c3e4f4c3419d89a7f40c1b1d97dec67095625511acffbd160a405051 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-icons/74.0.…
+60361967261a6a2ada30043e6316b50e49f862f00a36e9854130c38266dc969f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu/74.0.1…
+db6d44e083a76348cd4c2bbb933782a2984aae44988edaf315747fd3fd48558c | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu/74.0.1…
+c241700d2620e6e662af61f705af8a76420387e265f68327a6ac9e4d813076a7 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu2/74.0.…
+6bdbdda22c64905af779d8203792fb4093067fff9f36e157be0491df4553ffbe | https://maven.mozilla.org/maven2/org/mozilla/components/browser-menu2/74.0.…
+2a0b963ea60daa25c7a16cbdb9dc50c4c96515637fed871f8c51a4cf3ccb6e90 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-search/74.0…
+e892daa467a753c198df694ee82b60a373286d5b9c148ca02762f9b394768390 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-search/74.0…
+be331d858094dcef92f81dc8f33186431e0a773a717207602b8f57eef78ed934 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session-sto…
+b84b7dfe475fc95698b9a76a6dd873ecbcef42951ef60c3b04ec62c6f200723c | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session-sto…
+2e4d468011b1fc4669369f2f57b79400762f974ee9b9df24c5138e54d9eaa380 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session/74.…
+45e035424486c0844f7b869e9906d3182406821ed9aeb34a87b97ffd6e51800b | https://maven.mozilla.org/maven2/org/mozilla/components/browser-session/74.…
+52e95df94d3b06a623e32c84e2f758f25bd401ddd9c423eec2a7a61c6561b4b8 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-state/74.0.…
+e414100a5ebc8d94967025fc6e0b824b00cf7b8d986621df9c6b34a059a10ebe | https://maven.mozilla.org/maven2/org/mozilla/components/browser-state/74.0.…
+131e793b28048b74b263e670f0709522a5fd4e862424b68c7b7d905fd116a6fa | https://maven.mozilla.org/maven2/org/mozilla/components/browser-storage-syn…
+67424dab6caec1c418b5312a8372dfd353e3f713789cb1e08a9188ad53930711 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-storage-syn…
+7ca8e20ed29a82e8e315e75b081c42fde4c57a4f55f9ca2eed0c86ca64143b11 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-tabstray/74…
+00257079d9d4a1e3de19bc21759a7077bc927e551dd4bf4ce7ccb59b03257974 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-tabstray/74…
+936a7ca6a767cf38a1c35923212da29c617069e89dea7c4cd170abf028568ba3 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-thumbnails/…
+b5952af01f2850abe65f65c34f86e1053023df5f341d6e316ce1e63313a68443 | https://maven.mozilla.org/maven2/org/mozilla/components/browser-thumbnails/…
+c9bf71e6bad7d1e09b581beee0d8cf294ae98acff2cf2744240cddb0843ed63f | https://maven.mozilla.org/maven2/org/mozilla/components/browser-toolbar/74.…
+0d8361c41bab0bd13d8706191188bb401b69e4e423bbdd6b3d48be9221db3b7d | https://maven.mozilla.org/maven2/org/mozilla/components/browser-toolbar/74.…
+7113fbe6f7d25eeeb3429d6894042466887bc47f3e2a7de1e55dcfb43ec36054 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-awesomebar/…
+5fe66c1dd4477f1d264a78ea01c3fa324a2eff1e4449d8722b480daaa0e85b7e | https://maven.mozilla.org/maven2/org/mozilla/components/concept-awesomebar/…
+aaa0cbfaa748bf3081525c59977bfdb4515ea230346d91d6cdd32034ba701aa8 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-base/74.0.1…
+f3f873a64f95a2ef437e9e6ed6f8f34d762d707a5aeaeb0525b94484ca3ac142 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-base/74.0.1…
+5c5dd6f7365535d51d5a5896606e2810c67232ed97c8e51d7721c6318cde525d | https://maven.mozilla.org/maven2/org/mozilla/components/concept-engine/74.0…
+f1ccd789cd2fc6bcad4dcb1ffc4501bfdd932e73e8b5e18c20e9ef8a0b302b0d | https://maven.mozilla.org/maven2/org/mozilla/components/concept-engine/74.0…
+3e03add3fdc8fd05a5049854c34538f39e293137e2ab40d8b8f031d53438a61b | https://maven.mozilla.org/maven2/org/mozilla/components/concept-fetch/74.0.…
+82b62b0e0bef0960b5cf510e453a500fa024b5417c71d3376629a7e09a6562da | https://maven.mozilla.org/maven2/org/mozilla/components/concept-fetch/74.0.…
+b6ded745da1c7f9f50d7f54fc1bbc05ec8bcebc6a63b34e486af7860ff104aec | https://maven.mozilla.org/maven2/org/mozilla/components/concept-menu/74.0.1…
+fe7a7551523564b2f7d7b8fae6e1492d10d4855b5dd64da2d947bd62a8699077 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-menu/74.0.1…
+5abdb97bb2a93439b0704d314370368f54e7dbfaddf9a14b5f0e1090854e458a | https://maven.mozilla.org/maven2/org/mozilla/components/concept-push/74.0.1…
+9e1283a70995a3b25265d303c1084675ea4d454fac92fa4cd051442477e2e7d4 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-push/74.0.1…
+613fca00692258d3f2716d614ea7d780d73e75918e536734b953ec3ca7f0d9c1 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-storage/74.…
+d4edf4cd1a04e47cbb71375663431526fea41ed00bea52b6e74fe44dd81446e9 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-storage/74.…
+2b029b130b16efcb9e35b933fd697c35c3070869f61af7787d85994b61ee245c | https://maven.mozilla.org/maven2/org/mozilla/components/concept-sync/74.0.1…
+5931d0245ccb88c52d8af1ff69a7aed0fa3472efd8d344534b6633eb1416d1a3 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-sync/74.0.1…
+70bfaf3bead6e66dd8ee7a8c107460292bf2cf4d99bf6688f136661b5653a9ec | https://maven.mozilla.org/maven2/org/mozilla/components/concept-tabstray/74…
+65a37b4a1016842d6b220e0ee0bd578665b61bd96e6ecf998b1170bceafcac88 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-tabstray/74…
+ca06c09c285c8242388752889832fecc880ccbaa5382fa3a5af031dce695105f | https://maven.mozilla.org/maven2/org/mozilla/components/concept-toolbar/74.…
+a8254d0a75dd999a894ec009a1ed267dfcd6a01e95fbd8b4c70ca6feaab09078 | https://maven.mozilla.org/maven2/org/mozilla/components/concept-toolbar/74.…
+a11c8fa8dbdeeb71d3391746a1d1da64f5e36b2176bc5c67ee6c634601f326b4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts-pu…
+ec5913dd86d2354c2635fd7c2a9095a5372aee311918e58e9d3998baa6131288 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts-pu…
+5ffb8c7853524f7622b9fd3114e4c1c80702a4c6c0b3de384b1ce9e04cedae7f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts/74…
+844cf7104ece941a327b671a4bd1c970fa0b9b53f5a5462ff8bcbd6812323d8c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-accounts/74…
+ac8838358a0c3bbad9c03b229a3af976f2ce6ccdabea5c0e08275b9e5f487baf | https://maven.mozilla.org/maven2/org/mozilla/components/feature-addons/74.0…
+19b3ac5f0a6a5e3a95e69c4466ef2bb4270d4676fdc7b903ece3a117a7234754 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-addons/74.0…
+5d9820b47a408763eea6db7af95cd59c399ca1e17ae6374ad8f5bc9c9ae97962 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-app-links/7…
+2190801be88acc1bcec46bdfd1e7043a340765a8745e354c8a77b6e55216bbc1 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-app-links/7…
+940cb2c8a288b03ec9cac317707361307d9e2e00983f5aa8c550c5d4d7c24b0b | https://maven.mozilla.org/maven2/org/mozilla/components/feature-autofill/74…
+54ea078d2a7faa61731ed735c07711a95b398552cdb35e22f9567d5d09544bfa | https://maven.mozilla.org/maven2/org/mozilla/components/feature-autofill/74…
+33eb2befdfe8d4126badfd18c374f8b391c0987a3b4d14278826543525265d89 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-awesomebar/…
+243c5add881342cb7bdd9338626f08ae63e443f57f05f627e49ece7415a9ad10 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-awesomebar/…
+77db3de124ca6ee35ed471682e172dff6ecec1a24278e451534431740273f4e4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-contextmenu…
+c740d87aeb6861432e3f3caf19e3c8f8a6b80e29b9e7894c3c42a1940f4bf8bb | https://maven.mozilla.org/maven2/org/mozilla/components/feature-contextmenu…
+9af10991dc1745a41e69965fc27f7a63395d5767296939f1ec14ea8ffff1c0f4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-customtabs/…
+08d2eddd0cd0833ff5b7bc85235c19ae89e8bf01a4a1c0d21ed29c5c51128264 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-customtabs/…
+0507e4dec84215f6eeb7579cfe7f6956a984866c7f031d1aa3c7f4c2aa041f5e | https://maven.mozilla.org/maven2/org/mozilla/components/feature-downloads/7…
+db756ee968c7555bc42c7c89c589d788fefaa02f260860d0823ef02409bb31bc | https://maven.mozilla.org/maven2/org/mozilla/components/feature-downloads/7…
+d2f0640683b9b2efd6969ae14f0c513e95f1ae672aafaaec6d38d8e9466be9b2 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-findinpage/…
+9852e5ac8b5994350fe66352dc3bd7ebf2598909800c78896f9a0adc16abcda9 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-findinpage/…
+22c957b283609f62e3d3c7c43e04120096bbe3cd85e97be72d234c9ba8173e09 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-intent/74.0…
+347b7443357ad4afa5c4251446ef6a27027a8737748a0b63b3e00c0a77cd2522 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-intent/74.0…
+d426e4fe4cbe9cc1a8981096bef2918a9a87172e48d043e844b9a3a38835cc14 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-logins/74.0…
+af81d30ea345da6c8230c9ad51f29679f8c3e7e67402d24c8238434e5f392999 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-logins/74.0…
+aee34111361503f8765e9efdf3e243acae9cb5ec6a0d3228dd5b8b329180bcf4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-media/74.0.…
+8a10a47e6e43914020ce99abf23352180a5dfb4095c909898cab7c7dd1da3c3e | https://maven.mozilla.org/maven2/org/mozilla/components/feature-media/74.0.…
+caef0e284488c94c2475512e68b9dac28a704457869a83cc91076ab1a068686a | https://maven.mozilla.org/maven2/org/mozilla/components/feature-privatemode…
+caca878efd61638a2c26889e46aa5769740ee1b19ed208edb36f9e3e6ac7080e | https://maven.mozilla.org/maven2/org/mozilla/components/feature-privatemode…
+63ce0e37bbd147ab4d6bff02f658043cc5b81bf4281254c49b144194efc1771b | https://maven.mozilla.org/maven2/org/mozilla/components/feature-prompts/74.…
+11462cf041f9ca2add0817d2d23ad3b6681be1ee8623469de5be4992c96ec7c1 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-prompts/74.…
+0263280ee86a8be16b764649b9d5b942eb2d0d688145c69a23affadf39b1216c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-push/74.0.1…
+89241ca0efb0f68db72cd169766d7c98e349940ed4822d1dcfe3a5a42b54218f | https://maven.mozilla.org/maven2/org/mozilla/components/feature-push/74.0.1…
+7d1bcc1fc351733a747bea4585489cda9d5c69efddbafee0f37437fc61ca2a50 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-pwa/74.0.10…
+878e3bb4524e056a3f6ba2b5e47c16d53ba1a6d72200a161ddce8cb0da50ed30 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-pwa/74.0.10…
+975c837c308362d2df6b4672bd2dbdd930e12a03c269b1bda94e171ca40bb4ba | https://maven.mozilla.org/maven2/org/mozilla/components/feature-qr/74.0.10/…
+0a56c4cf6a0dd8be49b3677113a14f2b138aebb919ce6cc6b707aae8881507d5 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-qr/74.0.10/…
+bc2c4a82d58057577765fffc357134bf9a7b73251f78e9fc0fdcb35036a76f8c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-readerview/…
+597fe194d119b62a2cf3e2e67a2bdd784d56686d2872d776488f741dd41f8d69 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-readerview/…
+3aba091bef4dd68d8830a5d67d8a3e846830b2a2d0a0e4d82a02b0d714294083 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-recentlyclo…
+bc5241ddc5396a934aa9d5b21c538a983b9abb2b27c29c7253e856f153eeeaef | https://maven.mozilla.org/maven2/org/mozilla/components/feature-recentlyclo…
+f1e74848c9231e48b71222d07ae5304bf6b434b8b0ea44e61a7e240b10124f94 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-search/74.0…
+6476d58218c58b12847ebb3b001c7f423564fc7fa2484e9ed6dc197e6005d9d3 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-search/74.0…
+9f294e19172e6b5ff8f3a9cec07899e9b58d2f9c28c15363ff8a6b3cdbc0a532 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-session/74.…
+501a161a8612742fa18dccae2977dcedb67c89e4a31429ac5ba03c574be05921 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-session/74.…
+90c13017b92a18bac0e232439b9f3ff42e044b9a95c3c1ed59e7cb97c50e53ed | https://maven.mozilla.org/maven2/org/mozilla/components/feature-share/74.0.…
+2f6371549870fa87e897134bd1a46a6afbe55fc9f470cfaec0d7805ed0b479fe | https://maven.mozilla.org/maven2/org/mozilla/components/feature-share/74.0.…
+f6a839e55b7b18912e77833ebf1db17fbf39f38ca8036cc3aa4caff842fcc208 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-sitepermiss…
+d1394b4603b9a76fae2e4467e2247071179f03b44d00627373f1eb4260915f4c | https://maven.mozilla.org/maven2/org/mozilla/components/feature-sitepermiss…
+6dccc97e4ebef46f5b19778b573a866b54b2b5c942e0cd5ca9ed74e747661d68 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-syncedtabs/…
+1a41165ce20cb75461e709a70a2bcdefcab2436a4aec13d0b174bd7ee7727dbf | https://maven.mozilla.org/maven2/org/mozilla/components/feature-syncedtabs/…
+4d1dfec02cdba1362fca06cd248eb9523fa25b9c4a95c6d20e8ed9fd17502955 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tab-collect…
+c73a0a3f4ad1464dc09ee05a449643689b8cc764e9a7f3428ecd5144d3b4a666 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tab-collect…
+9e2b40772412ed13f71fab9af601a869309311c65b52a61ad79156a3b6a95277 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tabs/74.0.1…
+a7e273835ad981a707e7d18c47b08174dd74874cd7e10b6184a582ff3d5e51e8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-tabs/74.0.1…
+29223b574a1906769fc2103a04d59088a421d2fdeba5d97e0f88e35b2ffb1f87 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-toolbar/74.…
+ed39479f96379ee6314d5a065abae8e81ea660d9822d1ae822c6bbf9473b7cf2 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-toolbar/74.…
+04868ff39208030d8b80b27f6c808986f2c177a9595526d0b0bc66c683422135 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-top-sites/7…
+06d16544c5be44b227a93ca2df2b391d8a1dbd64331663b11124d4808dcb0150 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-top-sites/7…
+60d7babe2f55c3a83bf6c34c8bbbac9feb8ece7bcb1775a89b06f165110591a8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webauthn/74…
+2674ad053a89d00af04f5a01b08201cdf244aabe92e60672c586839d12f7b954 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webauthn/74…
+5a3589efba2218ad0856d642c8beab46c6b61b4f125f902a13bbbb7a035aa995 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat-r…
+ad9c832bc9482a0e38bc66d3e99009e5b8f9df2bbbe27cb757e77aa041d7a7e8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat-r…
+22c4cec3ddc3c3a65d81c9e58a72e0d544b9def12e371706a3a34405bf48a8d8 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat/7…
+00939e4faa513f8e873e1f42a3c77aec2cb7def5aca70ff8f29886feb925f9f4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webcompat/7…
+4b98bce9c7a002e154785432b60b3a258c962018bf44f3c0435b6b39c3478bd4 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webnotifica…
+874801a325fcdcfdd883eccffdf13c52f6768770d399e7ac28bebe8c3a7b2223 | https://maven.mozilla.org/maven2/org/mozilla/components/feature-webnotifica…
+dfc95c9ca351d7b70e88a878d4fd475ae159ee88262ffefae02ea38996b238d6 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-crash/74.0.10/l…
+35553adb026a51a89bf8e96d794f92f0442003c44e0625a3629b116d937ea352 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-crash/74.0.10/l…
+ea0870b0930f2fa33b49cb6bd03a2fb0bfb83c5389c6792bc6a1d15915d22d9d | https://maven.mozilla.org/maven2/org/mozilla/components/lib-dataprotect/74.…
+29def66d6fe5bfe20bc091a06414630210c50ea602073c3a02985408835332be | https://maven.mozilla.org/maven2/org/mozilla/components/lib-dataprotect/74.…
+d09c7c1f51dade8103f510c24e2c0b9ef1fe12848c5934b7de5fc74cd81d1055 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-publicsuffixlis…
+b5cb0c6a1d18d5ea059cdeae278fa34bcdf7fd074d4e0f471abb02b74a88628d | https://maven.mozilla.org/maven2/org/mozilla/components/lib-publicsuffixlis…
+55d53cf3950b767813c555d42020f8f2240bcd85e2f0e9adb2bf0ca4325ee4aa | https://maven.mozilla.org/maven2/org/mozilla/components/lib-push-firebase/7…
+babeb491f6ed5cfbd5441d42aa2cb2914bfe1ddba3f8c0c79ed3cd70b0aace68 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-push-firebase/7…
+53ff9a64082922b68e3a0f5fb2c1598f48ba2e07c28ff0376972dd3215cba5b7 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-state/74.0.10/l…
+6a0fcc0437ab89161fa71508e34101c1809ddb253fa67ed941e073f70e241c08 | https://maven.mozilla.org/maven2/org/mozilla/components/lib-state/74.0.10/l…
+26c2eac42e6a5bebf417d1aa2ea0524a34a073a8e021c96505162b033959e549 | https://maven.mozilla.org/maven2/org/mozilla/components/service-digitalasse…
+fd045d72e17aef3218bee88c497d9f0c057f65ec1b4c0b06e1774724effec5ad | https://maven.mozilla.org/maven2/org/mozilla/components/service-digitalasse…
+1e2a8112e2bcb07c8bd95cd16a397c421d4c0a1e555a349668875323b94fc714 | https://maven.mozilla.org/maven2/org/mozilla/components/service-firefox-acc…
+eec1575f2a4f3f28150bd165bf35770e70f9989491023722469bfa9ca98978df | https://maven.mozilla.org/maven2/org/mozilla/components/service-firefox-acc…
+32820376d60504d2740ec710257646a8d3e60954d1cae856519375029d9c2dd4 | https://maven.mozilla.org/maven2/org/mozilla/components/service-glean/74.0.…
+87e48435c51f1b8ba6c3f8222f462a3812e310bb664a0d0cf7d78c835242af3f | https://maven.mozilla.org/maven2/org/mozilla/components/service-glean/74.0.…
+4cb09cadf1ae0d657a35f03a011690ec0d4a304c0fcdef0d290a797df1191376 | https://maven.mozilla.org/maven2/org/mozilla/components/service-location/74…
+f1719ce7b59efec50c9d1541d1b341bad7550829268f72d03797905b1a14a104 | https://maven.mozilla.org/maven2/org/mozilla/components/service-location/74…
+1ebc5982297301c6c514639617b90c474f683618fb3fc8259d9ee5f24d7e9d3d | https://maven.mozilla.org/maven2/org/mozilla/components/service-nimbus/74.0…
+d41646abdd247ff3e751bd88ec87b16330a8755414477df925f374bfed2e35b3 | https://maven.mozilla.org/maven2/org/mozilla/components/service-nimbus/74.0…
+93fc9cf55a878b6af1d17fef5e95a213b6208be6e98195f0432bc886a89069aa | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-autofi…
+961e790cde1bd166a87bc73e5e2391699e976c4b0b4955bec0df930c882371c3 | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-autofi…
+4edb9b8fb7cccf80875761a9713fe21dd26a40424304d3580f88155af1d338c6 | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-logins…
+b1909944448b883424b1213323d1d4704bcefcbe18c2fd68a4d03f0810600baf | https://maven.mozilla.org/maven2/org/mozilla/components/service-sync-logins…
+5bc7e4f64dc9933689320b8c83101ead66e6ed1732a5869afe78a13634fd33b2 | https://maven.mozilla.org/maven2/org/mozilla/components/support-base/74.0.1…
+99c2f17e4f08eb1af93839b44ab6270a2dc4c88aad6d89603bb51645ebdc9e5a | https://maven.mozilla.org/maven2/org/mozilla/components/support-base/74.0.1…
+1dd3d5b63227e03ec66a737249a69a7c9e086a318d0bcbb732a9ba16ebf68d81 | https://maven.mozilla.org/maven2/org/mozilla/components/support-images/74.0…
+cd3fb91e9917b07a2426cf5d4cb6281a1ca24cbf0e90cca9d18dd98f19a748b0 | https://maven.mozilla.org/maven2/org/mozilla/components/support-images/74.0…
+fe9440cfbcc6f59c206b8d58dd49c7abdcab1348578f0981cd678e2e38f6ed46 | https://maven.mozilla.org/maven2/org/mozilla/components/support-ktx/74.0.10…
+d5d832cfe05a8b83ee7b11c72ba24c0b4ca25cd22dc31cee8451bba2bc5a82ea | https://maven.mozilla.org/maven2/org/mozilla/components/support-ktx/74.0.10…
+dc6f218467dcde954e63dd3530d5f16fe95a66ed4126ca1cba423137bab3a9e3 | https://maven.mozilla.org/maven2/org/mozilla/components/support-locale/74.0…
+08f159ceb1e47fa096bc2a082a048e9149740dfad02b08496d0743f42c1d1f79 | https://maven.mozilla.org/maven2/org/mozilla/components/support-locale/74.0…
+ec48cd5fa2897191f7082ec8e5c4a1cacfb86c581983dd5c5f0c2361c8f4f896 | https://maven.mozilla.org/maven2/org/mozilla/components/support-migration/7…
+29f801e31f1491388c214e5690424613bc23ee22e725da59646aef0e2ddba073 | https://maven.mozilla.org/maven2/org/mozilla/components/support-migration/7…
+c9a04732c9a7e37f61284b5e5a917a33db63ad97fc8fc01a2d85abbf65a88a95 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rusthttp/74…
+1074642a7aff9d06eba0b04e5f78cfd0402b94a32f21980f1fabad63dc25debd | https://maven.mozilla.org/maven2/org/mozilla/components/support-rusthttp/74…
+fb718c510fe5403549fe98f698d1fc6aefc652934d0e691a03e3b76d5c9e9711 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rustlog/74.…
+994ea64e1dc6b22fd2fb4e4568d4cb5ab917a9807d6b0fa5fd5df09595c3a698 | https://maven.mozilla.org/maven2/org/mozilla/components/support-rustlog/74.…
+662e118a95c2d72aea8373e966163da6ba925a6abeb9163b69883d642dff2a18 | https://maven.mozilla.org/maven2/org/mozilla/components/support-sync-teleme…
+691af7ef7f21d76826c0de946537e02af569e4c3497086164859a0791f237c36 | https://maven.mozilla.org/maven2/org/mozilla/components/support-sync-teleme…
+8468a81c26469afb1e1cec6ad846d6526b9e0a94be3f7f9a5c2099f4a41e6392 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test-libsta…
+b351c4e34ed3ac1baf6ad197a3fd0a0cc7a8c0303134e7c1049ceaf76c965555 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test-libsta…
+027b737998baf285d61a31c1a8e1b0bec207c54f3fdbeb29324d0a7b6bc70d19 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test/74.0.1…
+d5d7f186dddcaf1bc985745f23ba4477a62744b297780775381a2b7064564998 | https://maven.mozilla.org/maven2/org/mozilla/components/support-test/74.0.1…
+47c2bae8c0f030310bb8e1b9614f2f066e28fdb313b2697d9ad716b1bca5f472 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/74.0.…
+94dfdb89e05c9060dc49c1409fa1f4cc6f7e770fb1590c5c755bf06d09e01151 | https://maven.mozilla.org/maven2/org/mozilla/components/support-utils/74.0.…
+ae397fe3dc1ce4abdd956cc0c53d794a99dc390f91c43393ed6ac2528960e227 | https://maven.mozilla.org/maven2/org/mozilla/components/support-webextensio…
+df74803ec725ed67a0c6cfe182c5493c7e611b36ff8239de426c1829660294fa | https://maven.mozilla.org/maven2/org/mozilla/components/support-webextensio…
+1b0f4f8c754fa81297624a184531ad427b521048128063599f951cb6638bac27 | https://maven.mozilla.org/maven2/org/mozilla/components/tooling-glean-gradl…
+6b24e196fc623617c0212543ba1137d0a6eebed5fa5040ea56c2c3e2297e6be7 | https://maven.mozilla.org/maven2/org/mozilla/components/tooling-glean-gradl…
+f3b4815166f0176a17c9d0e4061752ebb554626b08144671142ec393cf238183 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-autocomplete/74.…
+72380808aaf6c0dfd4a0d6600aece66edbaf6b884044dd794cf2b715a4102d15 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-autocomplete/74.…
+3e0e38eed080c2b10f56db91c6e0380b4c9730f440da239ee85c7a125d398f2b | https://maven.mozilla.org/maven2/org/mozilla/components/ui-colors/74.0.10/u…
+a4e33bd4f3af1adf273ead1333a368501104362c10300c88e585a85a1fd99b4d | https://maven.mozilla.org/maven2/org/mozilla/components/ui-colors/74.0.10/u…
+bf092c353816ea029b579a63e3d3db2dfd08706bbabe4ddd67727551a5d5adaf | https://maven.mozilla.org/maven2/org/mozilla/components/ui-icons/74.0.10/ui…
+64551199d4040a32883c7b4aa4720b2ac618895f64a0c5f052a487fc04c34cd4 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-icons/74.0.10/ui…
+b9e2605937c5cd47ae5e0ba93c31dda48b8e210345f862ebf14890ae58be6ed7 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-tabcounter/74.0.…
+5fbe5cb8e1cbfd24567f322101a6b0063b9b6a96de22c13762944ef7eab94519 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-tabcounter/74.0.…
+f590de90365c4d2a7575582f89f6390b90599988e75601881e26d85c0aab48a1 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-widgets/74.0.10/…
+e431de1da486e630ce235501e825595d495d6ac05fa09952e2418a76cd9a2ba0 | https://maven.mozilla.org/maven2/org/mozilla/components/ui-widgets/74.0.10/…
+cd7d0e09420351e9e69277083b263c8f0aad75a4bac3153776caf1424efae653 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
+e1913ae393cae4186dd8603fbbf11f7b76720a216ce3132319a13d57d575f558 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview-beta/88.0.…
+891bddc531733128099868a0c5b735bdf8a9248279e73c800cdbfe663a011071 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/88.0.20210…
+7b04e436f5f8f16565f245b451e7929a0ba907726efa371dde93e2c8e6c74f04 | https://maven.mozilla.org/maven2/org/mozilla/geckoview/geckoview/88.0.20210…
1eb5321d64bdd07865bd8599b6b981193b54661f25bbb8e3ccdc6f8210c9ae38 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-forUnitTests/3…
f62de54f66aa4086100f26884927dbff06a1cbea7fb17010312d10d71cea3f01 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-forUnitTests/3…
624e642862770feb72c22cd80cd96f0e5d53340ded862987b3ec9c537c8bed29 | https://maven.mozilla.org/maven2/org/mozilla/telemetry/glean-gradle-plugin/…
diff --git a/projects/firefox/config b/projects/firefox/config
index 1abd993..d12ae9a 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,14 +1,14 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 78.9.0
+ firefox_platform_version: 78.10.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 10.5
branding_directory: 'browser/branding/alpha'
diff --git a/projects/geckoview/config b/projects/geckoview/config
index d3964dc..78e8858 100644
--- a/projects/geckoview/config
+++ b/projects/geckoview/config
@@ -1,14 +1,14 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'geckoview-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
-git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
+git_hash: 'tor-browser-[% c("var/geckoview_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- geckoview_version: 88.0b4
+ geckoview_version: 88.0
torbrowser_branch: 10.5
copyright_year: '[% exec("git show -s --format=%ci").remove("-.*") %]'
deps:
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index f1a094a..e58d1ea 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,18 @@
+Tor Browser 10.5a15 -- April 23 2021
+ * All Platforms
+ * Update Tor to 0.4.6.2-alpha
+ * Windows + OS X + Linux
+ * Update Firefox to 78.10.0esr
+ * Bug 40408: Disallow SVG Context Paint in all web content [tor-browser]
+ * Android
+ * Update Fenix to 88.1.0
+ * Bug 40050: Rebase android-components patches for Fenix 88 [android-components]
+ * Bug 40157: Rebase Fenix patches to Fenix 88.1.0 [fenix]
+ * Bug 40399: Rebase 10.5 patches on 88.0 [tor-browser]
+ * Build System
+ * Windows + OS X + Linux
+ * Bug 40259: Update components for mozilla88-based Fenix [tor-browser-build]
+
Tor Browser 10.5a14 -- April 11 2021
* All Platforms
* Update NoScript to 11.2.4
diff --git a/projects/tor/config b/projects/tor/config
index ca3f100..05d5c6d 100644
--- a/projects/tor/config
+++ b/projects/tor/config
@@ -1,6 +1,6 @@
# vim: filetype=yaml sw=2
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-version: 0.4.6.1-alpha
+version: 0.4.6.2-alpha
git_hash: 'tor-[% c("version") %]'
git_url: https://git.torproject.org/tor.git
git_submodule: 1
diff --git a/rbm.conf b/rbm.conf
index 814b21f..a7023f2 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -27,10 +27,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '10.5a14'
+ torbrowser_version: '10.5a15'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 10.5a13
+ - 10.5a14
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0

[translation/tails-misc] https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
by translation@torproject.org 21 Apr '21
by translation@torproject.org 21 Apr '21
21 Apr '21
commit 82ca4ea685f674808ce41157ed5e61a19a2abd7d
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Apr 21 00:45:46 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
---
en_GB.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/en_GB.po b/en_GB.po
index 34a3e1c8af..e3bb61212e 100644
--- a/en_GB.po
+++ b/en_GB.po
@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-19 08:20+0200\n"
-"PO-Revision-Date: 2021-04-19 09:15+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-04-21 00:15+0000\n"
+"Last-Translator: Andi Chandler <andi(a)gowling.com>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/otf/torproject/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -199,7 +199,7 @@ msgstr "<b>An error occured while updating the signing key.</b>\\n\\n<b>This pre
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Frontend.pm:304
msgid "Error while downloading the signing key"
-msgstr ""
+msgstr "Error while downloading the signing key"
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Frontend.pm:316
msgid "Error while updating the signing key"
1
0

[translation/tails-misc_release] https://gitweb.torproject.org/translation.git/commit/?h=tails-misc_release
by translation@torproject.org 21 Apr '21
by translation@torproject.org 21 Apr '21
21 Apr '21
commit 7e2e142947f8ede3af38d4d1579ef5543f53fc3c
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Apr 21 00:16:25 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tails-misc_release
---
en_GB.po | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/en_GB.po b/en_GB.po
index 1a0116da37..fe98266e90 100644
--- a/en_GB.po
+++ b/en_GB.po
@@ -12,8 +12,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-19 08:20+0200\n"
-"PO-Revision-Date: 2021-04-19 09:15+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-04-21 00:15+0000\n"
+"Last-Translator: Andi Chandler <andi(a)gowling.com>\n"
"Language-Team: English (United Kingdom) (http://www.transifex.com/otf/torproject/language/en_GB/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
1
0

[translation/abouttor-homepage] https://gitweb.torproject.org/translation.git/commit/?h=abouttor-homepage
by translation@torproject.org 20 Apr '21
by translation@torproject.org 20 Apr '21
20 Apr '21
commit c9b493f7405559ece62ccb484dcd4d83366044bc
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Apr 20 23:15:02 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=abouttor-homepage
---
my/aboutTor.dtd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/my/aboutTor.dtd b/my/aboutTor.dtd
index bdde5b280f..06bc341034 100644
--- a/my/aboutTor.dtd
+++ b/my/aboutTor.dtd
@@ -19,7 +19,7 @@
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "မေးစရာများ ရှိဦးမလား?">
<!ENTITY aboutTor.torbrowser_user_manual_link.label "ကျွန်ုပ်တို့ Tor ဘရောင်ဇာ လက်စွဲစာအုပ်အား ကြည့်ကြည့်ပါ »">
<!-- The next two entities are used within the browser's Help menu. -->
-<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
+<!ENTITY aboutTor.torbrowser_user_manual.accesskey "လ">
<!ENTITY aboutTor.torbrowser_user_manual.label "Tor ဘရောင်ဇာ လက်စွဲစာအုပ်">
<!ENTITY aboutTor.tor_mission.label "Tor Project သည် လူ့အခွင့်အရေးနှင့် လွတ်လပ်ရေးခွင့်များကို တိုးတက်စေရန် အမေရိကန် အကျိုးအမြတ်မယူသော ၅၀၁(ဂ)(၃) အဖွဲ့အစည်းတစ်ခု ဖြစ်ပါသည်။ လွတ်လပ်၍ အမည်ဝှက်ကာ အများသုံးနိုင်ပြီး ပုဂ္ဂိုလ်လုံခြုံရေးစောင့်ရှောက်သော နည်းပညာများ အသုံးပြုပါသည်။ ၎င်းနည်းပညာများကို အကန့်အသတ်မရှိစွာ သုံးစွဲနိုင်ခြင်းနှင့် သိပ္ပံဆိုင်ရာနှင့် ပြည်သူများနားလည်နိုင်စေရန် ပံ့
ပိုးထောက်ပံ့ပါသည်။">
1
0

[Git][tpo/applications/android-components] Pushed new branch android-components-74.0.10-10.5-1
by Matthew Finkel 20 Apr '21
by Matthew Finkel 20 Apr '21
20 Apr '21
Matthew Finkel pushed new branch android-components-74.0.10-10.5-1 at The Tor Project / Applications / android-components
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/tree/an…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[translation/tails-misc_release] https://gitweb.torproject.org/translation.git/commit/?h=tails-misc_release
by translation@torproject.org 20 Apr '21
by translation@torproject.org 20 Apr '21
20 Apr '21
commit abdef7f634b325a6b00d63d939bcc849d275dedf
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Apr 20 21:16:39 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tails-misc_release
---
sv.po | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/sv.po b/sv.po
index 241303ce40..f3112d088c 100644
--- a/sv.po
+++ b/sv.po
@@ -25,8 +25,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-19 08:20+0200\n"
-"PO-Revision-Date: 2021-04-19 09:15+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-04-20 20:57+0000\n"
+"Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl(a)gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/otf/torproject/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
1
0

[translation/tails-misc] https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
by translation@torproject.org 20 Apr '21
by translation@torproject.org 20 Apr '21
20 Apr '21
commit 0eb29dee70298e396ff229a6642d0ed2c9b92f8a
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Apr 20 21:15:48 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
---
sv.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/sv.po b/sv.po
index f828d73fe2..d5e0d87b91 100644
--- a/sv.po
+++ b/sv.po
@@ -25,8 +25,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-04-19 08:20+0200\n"
-"PO-Revision-Date: 2021-04-19 09:15+0000\n"
-"Last-Translator: Transifex Bot <>\n"
+"PO-Revision-Date: 2021-04-20 20:57+0000\n"
+"Last-Translator: Jonatan Nyberg <jonatan.nyberg.karl(a)gmail.com>\n"
"Language-Team: Swedish (http://www.transifex.com/otf/torproject/language/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -212,7 +212,7 @@ msgstr "<b>Ett fel uppstod vid uppdatering av signeringsnyckeln.</b>\\n\\n<b>Det
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Frontend.pm:304
msgid "Error while downloading the signing key"
-msgstr ""
+msgstr "Fel vid hämtning av signeringsnyckeln"
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Frontend.pm:316
msgid "Error while updating the signing key"
1
0

[Git][tpo/applications/fenix] Pushed new branch tor-browser-88.1.0-10.5-1
by Matthew Finkel 20 Apr '21
by Matthew Finkel 20 Apr '21
20 Apr '21
Matthew Finkel pushed new branch tor-browser-88.1.0-10.5-1 at The Tor Project / Applications / fenix
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/tree/tor-browser-88.…
You're receiving this email because of your account on gitlab.torproject.org.
1
0