tbb-commits
Threads by month
- ----- 2025 -----
- July
- 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
- 1 participants
- 18705 discussions

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 32092: Fix Tor Browser Support link in preferences
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit c78d3654827dccf355c59ded494bc028945f07e0
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Oct 15 22:54:10 2019 +0200
Bug 32092: Fix Tor Browser Support link in preferences
---
browser/components/preferences/preferences.js | 5 +----
1 file changed, 1 insertion(+), 4 deletions(-)
diff --git a/browser/components/preferences/preferences.js b/browser/components/preferences/preferences.js
index a89fddd0306d..ce338584142e 100644
--- a/browser/components/preferences/preferences.js
+++ b/browser/components/preferences/preferences.js
@@ -166,10 +166,7 @@ function init_all() {
gotoPref().then(() => {
let helpButton = document.getElementById("helpButton");
- let helpUrl =
- Services.urlFormatter.formatURLPref("app.support.baseURL") +
- "preferences";
- helpButton.setAttribute("href", helpUrl);
+ helpButton.setAttribute("href", "https://support.torproject.org/tbb");
document.getElementById("addonsButton").addEventListener("click", e => {
if (e.button >= 2) {
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 27604: Fix addon issues when moving TB directory
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 77d39691648e26c32685e6b887c6f801074c4bc2
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Oct 30 10:44:48 2019 +0100
Bug 27604: Fix addon issues when moving TB directory
---
toolkit/mozapps/extensions/internal/XPIProvider.jsm | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index a6e020ecd4c9..939dd6a70b24 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -475,7 +475,7 @@ class XPIState {
// Builds prior to be 1512436 did not include the rootURI property.
// If we're updating from such a build, add that property now.
- if (!("rootURI" in this) && this.file) {
+ if (this.file) {
this.rootURI = getURIForResourceInFile(this.file, "").spec;
}
@@ -488,7 +488,10 @@ class XPIState {
saved.currentModifiedTime != this.lastModifiedTime
) {
this.lastModifiedTime = saved.currentModifiedTime;
- } else if (saved.currentModifiedTime === null) {
+ } else if (
+ saved.currentModifiedTime === null &&
+ (!this.file || !this.file.exists())
+ ) {
this.missing = true;
}
}
@@ -1449,6 +1452,7 @@ var XPIStates = {
if (shouldRestoreLocationData && oldState[loc.name]) {
loc.restore(oldState[loc.name]);
+ changed = changed || loc.path != oldState[loc.name].path;
}
changed = changed || loc.changed;
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 32220: Improve the letterboxing experience
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit d914307fbf7cb1d3578a915eb9fbf7bda0503746
Author: Richard Pospesel <richard(a)torproject.org>
Date: Mon Oct 28 17:42:17 2019 -0700
Bug 32220: Improve the letterboxing experience
CSS and JS changes to alter the UX surrounding letterboxing. The
browser element containing page content is now anchored to the bottom
of the toolbar, and the remaining letterbox margin is the same color
as the firefox chrome. The letterbox margin and border are tied to
the currently selected theme.
Also adds a 'needsLetterbox' property to tabbrowser.xml to fix a race
condition present when using the 'isEmpty' property. Using 'isEmpty'
as a proxy for 'needsLetterbox' resulted in over-zealous/unnecessary
letterboxing of about:blank tabs.
---
browser/base/content/browser.css | 8 ++
browser/base/content/tabbrowser-tab.js | 9 +++
browser/themes/shared/tabs.inc.css | 6 ++
.../components/resistfingerprinting/RFPHelper.jsm | 94 +++++++++++++++++++---
4 files changed, 105 insertions(+), 12 deletions(-)
diff --git a/browser/base/content/browser.css b/browser/base/content/browser.css
index ee7a87ea3b9d..c4ce845235de 100644
--- a/browser/base/content/browser.css
+++ b/browser/base/content/browser.css
@@ -99,6 +99,14 @@ body {
display: none;
}
+
+.browserStack > browser.letterboxing {
+ border-color: var(--chrome-content-separator-color);
+ border-style: solid;
+ border-width : 1px;
+ border-top: none;
+}
+
%ifdef MENUBAR_CAN_AUTOHIDE
#toolbar-menubar[autohide="true"] {
overflow: hidden;
diff --git a/browser/base/content/tabbrowser-tab.js b/browser/base/content/tabbrowser-tab.js
index 09b088d59a90..d8d124439cc4 100644
--- a/browser/base/content/tabbrowser-tab.js
+++ b/browser/base/content/tabbrowser-tab.js
@@ -258,6 +258,15 @@
return true;
}
+ get needsLetterbox() {
+ let browser = this.linkedBrowser;
+ if (isBlankPageURL(browser.currentURI.spec)) {
+ return false;
+ }
+
+ return true;
+ }
+
get lastAccessed() {
return this._lastAccessed == Infinity ? Date.now() : this._lastAccessed;
}
diff --git a/browser/themes/shared/tabs.inc.css b/browser/themes/shared/tabs.inc.css
index 644d8d5fc97c..1732787434a0 100644
--- a/browser/themes/shared/tabs.inc.css
+++ b/browser/themes/shared/tabs.inc.css
@@ -70,6 +70,12 @@
background-color: var(--tabpanel-background-color);
}
+/* extend down the toolbar's colors when letterboxing is enabled*/
+#tabbrowser-tabpanels.letterboxing {
+ background-color: var(--toolbar-bgcolor);
+ background-image: var(--toolbar-bgimage);
+}
+
#tabbrowser-tabs,
#tabbrowser-arrowscrollbox,
#tabbrowser-tabs[positionpinnedtabs] > #tabbrowser-arrowscrollbox > .tabbrowser-tab[pinned] {
diff --git a/toolkit/components/resistfingerprinting/RFPHelper.jsm b/toolkit/components/resistfingerprinting/RFPHelper.jsm
index 166ad21e9013..9520d8720631 100644
--- a/toolkit/components/resistfingerprinting/RFPHelper.jsm
+++ b/toolkit/components/resistfingerprinting/RFPHelper.jsm
@@ -40,6 +40,7 @@ class _RFPHelper {
// ============================================================================
constructor() {
this._initialized = false;
+ this._borderDimensions = null;
}
init() {
@@ -361,6 +362,24 @@ class _RFPHelper {
});
}
+ getBorderDimensions(aBrowser) {
+ if (this._borderDimensions) {
+ return this._borderDimensions;
+ }
+
+ const win = aBrowser.ownerGlobal;
+ const browserStyle = win.getComputedStyle(aBrowser);
+
+ this._borderDimensions = {
+ top : parseInt(browserStyle.borderTopWidth),
+ right: parseInt(browserStyle.borderRightWidth),
+ bottom : parseInt(browserStyle.borderBottomWidth),
+ left : parseInt(browserStyle.borderLeftWidth),
+ };
+
+ return this._borderDimensions;
+ }
+
_addOrClearContentMargin(aBrowser) {
let tab = aBrowser.getTabBrowser().getTabForBrowser(aBrowser);
@@ -369,9 +388,13 @@ class _RFPHelper {
return;
}
+ // we add the letterboxing class even if the content does not need letterboxing
+ // in which case margins are set such that the borders are hidden
+ aBrowser.classList.add("letterboxing");
+
// We should apply no margin around an empty tab or a tab with system
// principal.
- if (tab.isEmpty || aBrowser.contentPrincipal.isSystemPrincipal) {
+ if (!tab.needsLetterbox || aBrowser.contentPrincipal.isSystemPrincipal) {
this._clearContentViewMargin(aBrowser);
} else {
this._roundContentView(aBrowser);
@@ -539,10 +562,29 @@ class _RFPHelper {
// Calculating the margins around the browser element in order to round the
// content viewport. We will use a 200x100 stepping if the dimension set
// is not given.
- let margins = calcMargins(containerWidth, containerHeight);
+
+ const borderDimensions = this.getBorderDimensions(aBrowser);
+ const marginDims = calcMargins(containerWidth, containerHeight - borderDimensions.top);
+
+ let margins = {
+ top : 0,
+ right : 0,
+ bottom : 0,
+ left : 0,
+ };
+
+ // snap browser element to top
+ margins.top = 0;
+ // and leave 'double' margin at the bottom
+ margins.bottom = 2 * marginDims.height - borderDimensions.bottom;
+ // identical margins left and right
+ margins.right = marginDims.width - borderDimensions.right;
+ margins.left = marginDims.width - borderDimensions.left;
+
+ const marginStyleString = `${margins.top}px ${margins.right}px ${margins.bottom}px ${margins.left}px`;
// If the size of the content is already quantized, we do nothing.
- if (aBrowser.style.margin == `${margins.height}px ${margins.width}px`) {
+ if (aBrowser.style.margin === marginStyleString) {
log("_roundContentView[" + logId + "] is_rounded == true");
if (this._isLetterboxingTesting) {
log(
@@ -563,19 +605,35 @@ class _RFPHelper {
"_roundContentView[" +
logId +
"] setting margins to " +
- margins.width +
- " x " +
- margins.height
+ marginStyleString
);
- // One cannot (easily) control the color of a margin unfortunately.
- // An initial attempt to use a border instead of a margin resulted
- // in offset event dispatching; so for now we use a colorless margin.
- aBrowser.style.margin = `${margins.height}px ${margins.width}px`;
+
+ // The margin background color is determined by the background color of the
+ // window's tabpanels#tabbrowser-tabpanels element
+ aBrowser.style.margin = marginStyleString;
});
}
_clearContentViewMargin(aBrowser) {
+ const borderDimensions = this.getBorderDimensions(aBrowser);
+ // set the margins such that the browser elements border is visible up top, but
+ // are rendered off-screen on the remaining sides
+ let margins = {
+ top : 0,
+ right : -borderDimensions.right,
+ bottom : -borderDimensions.bottom,
+ left : -borderDimensions.left,
+ };
+ const marginStyleString = `${margins.top}px ${margins.right}px ${margins.bottom}px ${margins.left}px`;
+
+ aBrowser.ownerGlobal.requestAnimationFrame(() => {
+ aBrowser.style.margin = marginStyleString;
+ });
+ }
+
+ _removeLetterboxing(aBrowser) {
aBrowser.ownerGlobal.requestAnimationFrame(() => {
+ aBrowser.classList.remove("letterboxing");
aBrowser.style.margin = "";
});
}
@@ -593,6 +651,11 @@ class _RFPHelper {
aWindow.gBrowser.addTabsProgressListener(this);
aWindow.addEventListener("TabOpen", this);
+ const tabPanel = aWindow.document.getElementById("tabbrowser-tabpanels");
+ if (tabPanel) {
+ tabPanel.classList.add("letterboxing");
+ }
+
// Rounding the content viewport.
this._updateMarginsForTabsInWindow(aWindow);
}
@@ -616,10 +679,17 @@ class _RFPHelper {
tabBrowser.removeTabsProgressListener(this);
aWindow.removeEventListener("TabOpen", this);
- // Clear all margins and tooltip for all browsers.
+ // revert tabpanel's background colors to default
+ const tabPanel = aWindow.document.getElementById("tabbrowser-tabpanels");
+ if (tabPanel) {
+ tabPanel.classList.remove("letterboxing");
+ }
+
+ // and revert each browser element to default,
+ // restore default margins and remove letterboxing class
for (let tab of tabBrowser.tabs) {
let browser = tab.linkedBrowser;
- this._clearContentViewMargin(browser);
+ this._removeLetterboxing(browser);
}
}
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 30237: Add v3 onion services client authentication prompt
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 9965c7c74a5f906b682488178d623a7fa92a6a3a
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Nov 12 16:11:05 2019 -0500
Bug 30237: Add v3 onion services client authentication prompt
When Tor informs the browser that client authentication is needed,
temporarily load about:blank instead of about:neterror and prompt
for the user's key.
If a correctly formatted key is entered, use Tor's ONION_CLIENT_AUTH_ADD
control port command to add the key (via Torbutton's control port
module) and reload the page.
If the user cancels the prompt, display the standard about:neterror
"Unable to connect" page. This requires a small change to
browser/actors/NetErrorChild.jsm to account for the fact that the
docShell no longer has the failedChannel information. The failedChannel
is used to extract TLS-related error info, which is not applicable
in the case of a canceled .onion authentication prompt.
Add a leaveOpen option to PopupNotifications.show so we can display
error messages within the popup notification doorhanger without
closing the prompt.
Add support for onion services strings to the TorStrings module.
Add support for Tor extended SOCKS errors (Tor proposal 304) to the
socket transport and SOCKS layers. Improved display of all of these
errors will be implemented as part of bug 30025.
Also fixes bug 19757:
Add a "Remember this key" checkbox to the client auth prompt.
Add an "Onion Services Authentication" section within the
about:preferences "Privacy & Security section" to allow
viewing and removal of v3 onion client auth keys that have
been stored on disk.
Also fixes bug 19251: use enhanced error pages for onion service errors.
---
browser/actors/NetErrorChild.jsm | 7 +
browser/base/content/browser.js | 10 +
browser/base/content/browser.xhtml | 3 +
browser/base/content/certerror/aboutNetError.js | 10 +-
browser/base/content/certerror/aboutNetError.xhtml | 1 +
browser/base/content/tab-content.js | 6 +
browser/components/moz.build | 1 +
.../content/authNotificationIcon.inc.xhtml | 6 +
.../onionservices/content/authPopup.inc.xhtml | 16 ++
.../onionservices/content/authPreferences.css | 20 ++
.../content/authPreferences.inc.xhtml | 19 ++
.../onionservices/content/authPreferences.js | 66 +++++
.../components/onionservices/content/authPrompt.js | 316 +++++++++++++++++++++
.../components/onionservices/content/authUtil.jsm | 47 +++
.../onionservices/content/netError/browser.svg | 3 +
.../onionservices/content/netError/network.svg | 3 +
.../content/netError/onionNetError.css | 65 +++++
.../content/netError/onionNetError.js | 244 ++++++++++++++++
.../onionservices/content/netError/onionsite.svg | 7 +
.../onionservices/content/onionservices.css | 69 +++++
.../onionservices/content/savedKeysDialog.js | 259 +++++++++++++++++
.../onionservices/content/savedKeysDialog.xhtml | 42 +++
browser/components/onionservices/jar.mn | 9 +
browser/components/onionservices/moz.build | 1 +
browser/components/preferences/preferences.xhtml | 1 +
browser/components/preferences/privacy.inc.xhtml | 2 +
browser/components/preferences/privacy.js | 7 +
browser/themes/shared/notification-icons.inc.css | 3 +
docshell/base/nsDocShell.cpp | 81 +++++-
dom/ipc/BrowserParent.cpp | 21 ++
dom/ipc/BrowserParent.h | 3 +
dom/ipc/PBrowser.ipdl | 9 +
js/xpconnect/src/xpc.msg | 10 +
netwerk/base/nsSocketTransport2.cpp | 6 +
netwerk/socket/nsSOCKSIOLayer.cpp | 49 ++++
toolkit/modules/PopupNotifications.jsm | 6 +
toolkit/modules/RemotePageAccessManager.jsm | 1 +
.../lib/environments/frame-script.js | 1 +
xpcom/base/ErrorList.py | 22 ++
39 files changed, 1450 insertions(+), 2 deletions(-)
diff --git a/browser/actors/NetErrorChild.jsm b/browser/actors/NetErrorChild.jsm
index 82978412fe24..164fb7c95cd1 100644
--- a/browser/actors/NetErrorChild.jsm
+++ b/browser/actors/NetErrorChild.jsm
@@ -13,6 +13,8 @@ const { RemotePageChild } = ChromeUtils.import(
"resource://gre/actors/RemotePageChild.jsm"
);
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
XPCOMUtils.defineLazyServiceGetter(
this,
"gSerializationHelper",
@@ -33,6 +35,7 @@ class NetErrorChild extends RemotePageChild {
"RPMAddToHistogram",
"RPMRecordTelemetryEvent",
"RPMGetHttpResponseHeader",
+ "RPMGetTorStrings",
];
this.exportFunctions(exportableFunctions);
}
@@ -115,4 +118,8 @@ class NetErrorChild extends RemotePageChild {
return "";
}
+
+ RPMGetTorStrings() {
+ return Cu.cloneInto(TorStrings.onionServices, this.contentWindow);
+ }
}
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 32a35dd3dddc..501519db864e 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -230,6 +230,11 @@ XPCOMUtils.defineLazyScriptGetter(
["SecurityLevelButton"],
"chrome://browser/content/securitylevel/securityLevel.js"
);
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["OnionAuthPrompt"],
+ "chrome://browser/content/onionservices/authPrompt.js"
+);
XPCOMUtils.defineLazyScriptGetter(
this,
"gEditItemOverlay",
@@ -1804,6 +1809,9 @@ var gBrowserInit = {
// Init the SecuritySettingsButton
SecurityLevelButton.init();
+ // Init the OnionAuthPrompt
+ OnionAuthPrompt.init();
+
// Certain kinds of automigration rely on this notification to complete
// their tasks BEFORE the browser window is shown. SessionStore uses it to
// restore tabs into windows AFTER important parts like gMultiProcessBrowser
@@ -2530,6 +2538,8 @@ var gBrowserInit = {
SecurityLevelButton.uninit();
+ OnionAuthPrompt.uninit();
+
gAccessibilityServiceIndicator.uninit();
if (gToolbarKeyNavEnabled) {
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 6b4120b34b4b..e4f3363e2180 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -33,6 +33,7 @@
<?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
<?xml-stylesheet href="chrome://torbutton/skin/tor-circuit-display.css" type="text/css"?>
<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/onionservices/onionservices.css" type="text/css"?>
# All DTD information is stored in a separate file so that it can be shared by
# hiddenWindowMac.xhtml.
@@ -654,6 +655,7 @@
#include ../../components/downloads/content/downloadsPanel.inc.xhtml
#include ../../../devtools/startup/enableDevToolsPopup.inc.xhtml
#include ../../components/securitylevel/content/securityLevelPanel.inc.xhtml
+#include ../../components/onionservices/content/authPopup.inc.xhtml
#include browser-allTabsMenu.inc.xhtml
<tooltip id="dynamic-shortcut-tooltip"
@@ -1947,6 +1949,7 @@
data-l10n-id="urlbar-indexed-db-notification-anchor"/>
<image id="password-notification-icon" class="notification-anchor-icon login-icon" role="button"
data-l10n-id="urlbar-password-notification-anchor"/>
+#include ../../components/onionservices/content/authNotificationIcon.inc.xhtml
<stack id="plugins-notification-icon" class="notification-anchor-icon" role="button" align="center" data-l10n-id="urlbar-plugins-notification-anchor">
<image class="plugin-icon" />
<image id="plugin-icon-badge" />
diff --git a/browser/base/content/certerror/aboutNetError.js b/browser/base/content/certerror/aboutNetError.js
index 31c4838a053d..e5b223025a8b 100644
--- a/browser/base/content/certerror/aboutNetError.js
+++ b/browser/base/content/certerror/aboutNetError.js
@@ -3,6 +3,7 @@
* You can obtain one at http://mozilla.org/MPL/2.0/. */
/* eslint-env mozilla/frame-script */
+/* import-globals-from ../../components/onionservices/content/netError/onionNetError.js */
import "chrome://global/content/certviewer/pvutils_bundle.js";
import "chrome://global/content/certviewer/asn1js_bundle.js";
@@ -307,7 +308,10 @@ function initPage() {
errDesc = document.getElementById("ed_generic");
}
- setErrorPageStrings(err);
+ const isOnionError = err.startsWith("onionServices.");
+ if (!isOnionError) {
+ setErrorPageStrings(err);
+ }
var sd = document.getElementById("errorShortDescText");
if (sd) {
@@ -459,6 +463,10 @@ function initPage() {
span.textContent = HOST_NAME;
}
}
+
+ if (isOnionError) {
+ OnionServicesAboutNetError.initPage(document);
+ }
}
function setupBlockingReportingUI() {
diff --git a/browser/base/content/certerror/aboutNetError.xhtml b/browser/base/content/certerror/aboutNetError.xhtml
index c645a2f2cc77..bf9a8fd58347 100644
--- a/browser/base/content/certerror/aboutNetError.xhtml
+++ b/browser/base/content/certerror/aboutNetError.xhtml
@@ -209,5 +209,6 @@
</div>
</body>
<script src="chrome://browser/content/certerror/aboutNetErrorCodes.js"/>
+ <script src="chrome://browser/content/onionservices/netError/onionNetError.js"/>
<script type="module" src="chrome://browser/content/certerror/aboutNetError.js"/>
</html>
diff --git a/browser/base/content/tab-content.js b/browser/base/content/tab-content.js
index 83e55cf5ed87..96360a4307d2 100644
--- a/browser/base/content/tab-content.js
+++ b/browser/base/content/tab-content.js
@@ -7,4 +7,10 @@
var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+var { OnionAuthUtil } = ChromeUtils.import(
+ "chrome://browser/content/onionservices/authUtil.jsm"
+);
+
Services.obs.notifyObservers(this, "tab-content-frameloader-created");
+
+OnionAuthUtil.addCancelMessageListener(this, docShell);
diff --git a/browser/components/moz.build b/browser/components/moz.build
index e99fa19d896a..277d9ba42f3b 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -39,6 +39,7 @@ DIRS += [
"fxmonitor",
"migration",
"newtab",
+ "onionservices",
"originattributes",
"ion",
"places",
diff --git a/browser/components/onionservices/content/authNotificationIcon.inc.xhtml b/browser/components/onionservices/content/authNotificationIcon.inc.xhtml
new file mode 100644
index 000000000000..91274d612739
--- /dev/null
+++ b/browser/components/onionservices/content/authNotificationIcon.inc.xhtml
@@ -0,0 +1,6 @@
+# Copyright (c) 2020, The Tor Project, Inc.
+
+<image id="tor-clientauth-notification-icon"
+ class="notification-anchor-icon tor-clientauth-icon"
+ role="button"
+ tooltiptext="&torbutton.onionServices.authPrompt.tooltip;"/>
diff --git a/browser/components/onionservices/content/authPopup.inc.xhtml b/browser/components/onionservices/content/authPopup.inc.xhtml
new file mode 100644
index 000000000000..bd0ec3aa0b00
--- /dev/null
+++ b/browser/components/onionservices/content/authPopup.inc.xhtml
@@ -0,0 +1,16 @@
+# Copyright (c) 2020, The Tor Project, Inc.
+
+<popupnotification id="tor-clientauth-notification" hidden="true">
+ <popupnotificationcontent orient="vertical">
+ <description id="tor-clientauth-notification-desc"/>
+ <label id="tor-clientauth-notification-learnmore"
+ class="text-link popup-notification-learnmore-link"
+ is="text-link"/>
+ <html:div>
+ <html:input id="tor-clientauth-notification-key" type="password"/>
+ <html:div id="tor-clientauth-warning"/>
+ <checkbox id="tor-clientauth-persistkey-checkbox"
+ label="&torbutton.onionServices.authPrompt.persistCheckboxLabel;"/>
+ </html:div>
+ </popupnotificationcontent>
+</popupnotification>
diff --git a/browser/components/onionservices/content/authPreferences.css b/browser/components/onionservices/content/authPreferences.css
new file mode 100644
index 000000000000..b3fb79b26ddc
--- /dev/null
+++ b/browser/components/onionservices/content/authPreferences.css
@@ -0,0 +1,20 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+
+#torOnionServiceKeys-overview-container {
+ margin-right: 30px;
+}
+
+#onionservices-savedkeys-tree treechildren::-moz-tree-cell-text {
+ font-size: 80%;
+}
+
+#onionservices-savedkeys-errorContainer {
+ margin-top: 4px;
+ min-height: 3em;
+}
+
+#onionservices-savedkeys-errorIcon {
+ margin-right: 4px;
+ list-style-image: url("chrome://browser/skin/warning.svg");
+ visibility: hidden;
+}
diff --git a/browser/components/onionservices/content/authPreferences.inc.xhtml b/browser/components/onionservices/content/authPreferences.inc.xhtml
new file mode 100644
index 000000000000..f69c9dde66a2
--- /dev/null
+++ b/browser/components/onionservices/content/authPreferences.inc.xhtml
@@ -0,0 +1,19 @@
+# Copyright (c) 2020, The Tor Project, Inc.
+
+<groupbox id="torOnionServiceKeys" orient="vertical"
+ data-category="panePrivacy" hidden="true">
+ <label><html:h2 id="torOnionServiceKeys-header"/></label>
+ <hbox>
+ <description id="torOnionServiceKeys-overview-container" flex="1">
+ <html:span id="torOnionServiceKeys-overview"
+ class="tail-with-learn-more"/>
+ <label id="torOnionServiceKeys-learnMore" class="learnMore text-link"
+ is="text-link"/>
+ </description>
+ <vbox align="end">
+ <button id="torOnionServiceKeys-savedKeys"
+ is="highlightable-button"
+ class="accessory-button"/>
+ </vbox>
+ </hbox>
+</groupbox>
diff --git a/browser/components/onionservices/content/authPreferences.js b/browser/components/onionservices/content/authPreferences.js
new file mode 100644
index 000000000000..52f8272020cc
--- /dev/null
+++ b/browser/components/onionservices/content/authPreferences.js
@@ -0,0 +1,66 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+/*
+ Onion Services Client Authentication Preferences Code
+
+ Code to handle init and update of onion services authentication section
+ in about:preferences#privacy
+*/
+
+const OnionServicesAuthPreferences = {
+ selector: {
+ groupBox: "#torOnionServiceKeys",
+ header: "#torOnionServiceKeys-header",
+ overview: "#torOnionServiceKeys-overview",
+ learnMore: "#torOnionServiceKeys-learnMore",
+ savedKeysButton: "#torOnionServiceKeys-savedKeys",
+ },
+
+ init() {
+ // populate XUL with localized strings
+ this._populateXUL();
+ },
+
+ _populateXUL() {
+ const groupbox = document.querySelector(this.selector.groupBox);
+
+ let elem = groupbox.querySelector(this.selector.header);
+ elem.textContent = TorStrings.onionServices.authPreferences.header;
+
+ elem = groupbox.querySelector(this.selector.overview);
+ elem.textContent = TorStrings.onionServices.authPreferences.overview;
+
+ elem = groupbox.querySelector(this.selector.learnMore);
+ elem.setAttribute("value", TorStrings.onionServices.learnMore);
+ elem.setAttribute("href", TorStrings.onionServices.learnMoreURL);
+
+ elem = groupbox.querySelector(this.selector.savedKeysButton);
+ elem.setAttribute(
+ "label",
+ TorStrings.onionServices.authPreferences.savedKeys
+ );
+ elem.addEventListener("command", () =>
+ OnionServicesAuthPreferences.onViewSavedKeys()
+ );
+ },
+
+ onViewSavedKeys() {
+ gSubDialog.open(
+ "chrome://browser/content/onionservices/savedKeysDialog.xhtml"
+ );
+ },
+}; // OnionServicesAuthPreferences
+
+Object.defineProperty(this, "OnionServicesAuthPreferences", {
+ value: OnionServicesAuthPreferences,
+ enumerable: true,
+ writable: false,
+});
diff --git a/browser/components/onionservices/content/authPrompt.js b/browser/components/onionservices/content/authPrompt.js
new file mode 100644
index 000000000000..d4a59ac46487
--- /dev/null
+++ b/browser/components/onionservices/content/authPrompt.js
@@ -0,0 +1,316 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ OnionAuthUtil: "chrome://browser/content/onionservices/authUtil.jsm",
+ CommonUtils: "resource://services-common/utils.js",
+ TorStrings: "resource:///modules/TorStrings.jsm",
+});
+
+const OnionAuthPrompt = (function() {
+ // OnionServicesAuthPrompt objects run within the main/chrome process.
+ // aReason is the topic passed within the observer notification that is
+ // causing this auth prompt to be displayed.
+ function OnionServicesAuthPrompt(aBrowser, aFailedURI, aReason, aOnionName) {
+ this._browser = aBrowser;
+ this._failedURI = aFailedURI;
+ this._reasonForPrompt = aReason;
+ this._onionName = aOnionName;
+ }
+
+ OnionServicesAuthPrompt.prototype = {
+ show(aWarningMessage) {
+ let mainAction = {
+ label: TorStrings.onionServices.authPrompt.done,
+ accessKey: TorStrings.onionServices.authPrompt.doneAccessKey,
+ leaveOpen: true, // Callback is responsible for closing the notification.
+ callback: this._onDone.bind(this),
+ };
+
+ let dialogBundle = Services.strings.createBundle(
+ "chrome://global/locale/dialog.properties");
+
+ let cancelAccessKey = dialogBundle.GetStringFromName("accesskey-cancel");
+ if (!cancelAccessKey)
+ cancelAccessKey = "c"; // required by PopupNotifications.show()
+
+ let cancelAction = {
+ label: dialogBundle.GetStringFromName("button-cancel"),
+ accessKey: cancelAccessKey,
+ callback: this._onCancel.bind(this),
+ };
+
+ let _this = this;
+ let options = {
+ autofocus: true,
+ hideClose: true,
+ persistent: true,
+ removeOnDismissal: false,
+ eventCallback(aTopic) {
+ if (aTopic === "showing") {
+ _this._onPromptShowing(aWarningMessage);
+ } else if (aTopic === "shown") {
+ _this._onPromptShown();
+ } else if (aTopic === "removed") {
+ _this._onPromptRemoved();
+ }
+ }
+ };
+
+ this._prompt = PopupNotifications.show(this._browser,
+ OnionAuthUtil.domid.notification, "",
+ OnionAuthUtil.domid.anchor,
+ mainAction, [cancelAction], options);
+ },
+
+ _onPromptShowing(aWarningMessage) {
+ let xulDoc = this._browser.ownerDocument;
+ let descElem = xulDoc.getElementById(OnionAuthUtil.domid.description);
+ if (descElem) {
+ // Handle replacement of the onion name within the localized
+ // string ourselves so we can show the onion name as bold text.
+ // We do this by splitting the localized string and creating
+ // several HTML <span> elements.
+ while (descElem.firstChild)
+ descElem.removeChild(descElem.firstChild);
+
+ let fmtString = TorStrings.onionServices.authPrompt.description;
+ let prefix = "";
+ let suffix = "";
+ const kToReplace = "%S";
+ let idx = fmtString.indexOf(kToReplace);
+ if (idx < 0) {
+ prefix = fmtString;
+ } else {
+ prefix = fmtString.substring(0, idx);
+ suffix = fmtString.substring(idx + kToReplace.length);
+ }
+
+ const kHTMLNS = "http://www.w3.org/1999/xhtml";
+ let span = xulDoc.createElementNS(kHTMLNS, "span");
+ span.textContent = prefix;
+ descElem.appendChild(span);
+ span = xulDoc.createElementNS(kHTMLNS, "span");
+ span.id = OnionAuthUtil.domid.onionNameSpan;
+ span.textContent = this._onionName;
+ descElem.appendChild(span);
+ span = xulDoc.createElementNS(kHTMLNS, "span");
+ span.textContent = suffix;
+ descElem.appendChild(span);
+ }
+
+ // Set "Learn More" label and href.
+ let learnMoreElem = xulDoc.getElementById(OnionAuthUtil.domid.learnMore);
+ if (learnMoreElem) {
+ learnMoreElem.setAttribute("value", TorStrings.onionServices.learnMore);
+ learnMoreElem.setAttribute("href", TorStrings.onionServices.learnMoreURL);
+ }
+
+ this._showWarning(aWarningMessage);
+ let checkboxElem = this._getCheckboxElement();
+ if (checkboxElem) {
+ checkboxElem.checked = false;
+ }
+ },
+
+ _onPromptShown() {
+ let keyElem = this._getKeyElement();
+ if (keyElem) {
+ keyElem.setAttribute("placeholder",
+ TorStrings.onionServices.authPrompt.keyPlaceholder);
+ this._boundOnKeyFieldKeyPress = this._onKeyFieldKeyPress.bind(this);
+ this._boundOnKeyFieldInput = this._onKeyFieldInput.bind(this);
+ keyElem.addEventListener("keypress", this._boundOnKeyFieldKeyPress);
+ keyElem.addEventListener("input", this._boundOnKeyFieldInput);
+ keyElem.focus();
+ }
+ },
+
+ _onPromptRemoved() {
+ if (this._boundOnKeyFieldKeyPress) {
+ let keyElem = this._getKeyElement();
+ if (keyElem) {
+ keyElem.value = "";
+ keyElem.removeEventListener("keypress",
+ this._boundOnKeyFieldKeyPress);
+ this._boundOnKeyFieldKeyPress = undefined;
+ keyElem.removeEventListener("input", this._boundOnKeyFieldInput);
+ this._boundOnKeyFieldInput = undefined;
+ }
+ }
+ },
+
+ _onKeyFieldKeyPress(aEvent) {
+ if (aEvent.keyCode == aEvent.DOM_VK_RETURN) {
+ this._onDone();
+ } else if (aEvent.keyCode == aEvent.DOM_VK_ESCAPE) {
+ this._prompt.remove();
+ this._onCancel();
+ }
+ },
+
+ _onKeyFieldInput(aEvent) {
+ this._showWarning(undefined); // Remove the warning.
+ },
+
+ _onDone() {
+ let keyElem = this._getKeyElement();
+ if (!keyElem)
+ return;
+
+ let base64key = this._keyToBase64(keyElem.value);
+ if (!base64key) {
+ this._showWarning(TorStrings.onionServices.authPrompt.invalidKey);
+ return;
+ }
+
+ this._prompt.remove();
+
+ // Use Torbutton's controller module to add the private key to Tor.
+ let controllerFailureMsg =
+ TorStrings.onionServices.authPrompt.failedToSetKey;
+ try {
+ let { controller } =
+ Cu.import("resource://torbutton/modules/tor-control-port.js", {});
+ let torController = controller(aError => {
+ this.show(controllerFailureMsg);
+ });
+ let onionAddr = this._onionName.toLowerCase().replace(/\.onion$/, "");
+ let checkboxElem = this._getCheckboxElement();
+ let isPermanent = (checkboxElem && checkboxElem.checked);
+ torController.onionAuthAdd(onionAddr, base64key, isPermanent)
+ .then(aResponse => {
+ // Success! Reload the page.
+ this._browser.sendMessageToActor(
+ "Browser:Reload",
+ {},
+ "BrowserTab"
+ );
+ })
+ .catch(aError => {
+ if (aError.torMessage)
+ this.show(aError.torMessage);
+ else
+ this.show(controllerFailureMsg);
+ });
+ } catch (e) {
+ this.show(controllerFailureMsg);
+ }
+ },
+
+ _onCancel() {
+ // Arrange for an error page to be displayed.
+ this._browser.messageManager.sendAsyncMessage(
+ OnionAuthUtil.message.authPromptCanceled,
+ {failedURI: this._failedURI.spec,
+ reasonForPrompt: this._reasonForPrompt});
+ },
+
+ _getKeyElement() {
+ let xulDoc = this._browser.ownerDocument;
+ return xulDoc.getElementById(OnionAuthUtil.domid.keyElement);
+ },
+
+ _getCheckboxElement() {
+ let xulDoc = this._browser.ownerDocument;
+ return xulDoc.getElementById(OnionAuthUtil.domid.checkboxElement);
+ },
+
+ _showWarning(aWarningMessage) {
+ let xulDoc = this._browser.ownerDocument;
+ let warningElem =
+ xulDoc.getElementById(OnionAuthUtil.domid.warningElement);
+ let keyElem = this._getKeyElement();
+ if (warningElem) {
+ if (aWarningMessage) {
+ warningElem.textContent = aWarningMessage;
+ warningElem.removeAttribute("hidden");
+ if (keyElem)
+ keyElem.className = "invalid";
+ } else {
+ warningElem.setAttribute("hidden", "true");
+ if (keyElem)
+ keyElem.className = "";
+ }
+ }
+ },
+
+ // Returns undefined if the key is the wrong length or format.
+ _keyToBase64(aKeyString) {
+ if (!aKeyString)
+ return undefined;
+
+ let base64key;
+ if (aKeyString.length == 52) {
+ // The key is probably base32-encoded. Attempt to decode.
+ // Although base32 specifies uppercase letters, we accept lowercase
+ // as well because users may type in lowercase or copy a key out of
+ // a tor onion-auth file (which uses lowercase).
+ let rawKey;
+ try {
+ rawKey = CommonUtils.decodeBase32(aKeyString.toUpperCase());
+ } catch (e) {}
+
+ if (rawKey) try {
+ base64key = btoa(rawKey);
+ } catch (e) {}
+ } else if ((aKeyString.length == 44) &&
+ /^[a-zA-Z0-9+/]*=*$/.test(aKeyString)) {
+ // The key appears to be a correctly formatted base64 value. If not,
+ // tor will return an error when we try to add the key via the
+ // control port.
+ base64key = aKeyString;
+ }
+
+ return base64key;
+ },
+ };
+
+ let retval = {
+ init() {
+ Services.obs.addObserver(this, OnionAuthUtil.topic.clientAuthMissing);
+ Services.obs.addObserver(this, OnionAuthUtil.topic.clientAuthIncorrect);
+ },
+
+ uninit() {
+ Services.obs.removeObserver(this, OnionAuthUtil.topic.clientAuthMissing);
+ Services.obs.removeObserver(this, OnionAuthUtil.topic.clientAuthIncorrect);
+ },
+
+ // aSubject is the DOM Window or browser where the prompt should be shown.
+ // aData contains the .onion name.
+ observe(aSubject, aTopic, aData) {
+ if ((aTopic != OnionAuthUtil.topic.clientAuthMissing) &&
+ (aTopic != OnionAuthUtil.topic.clientAuthIncorrect)) {
+ return;
+ }
+
+ let browser;
+ if (aSubject instanceof Ci.nsIDOMWindow) {
+ let contentWindow = aSubject.QueryInterface(Ci.nsIDOMWindow);
+ browser = contentWindow.docShell.chromeEventHandler;
+ } else {
+ browser = aSubject.QueryInterface(Ci.nsIBrowser);
+ }
+
+ if (!gBrowser.browsers.some(aBrowser => aBrowser == browser)) {
+ return; // This window does not contain the subject browser; ignore.
+ }
+
+ let failedURI = browser.currentURI;
+ let authPrompt = new OnionServicesAuthPrompt(browser, failedURI,
+ aTopic, aData);
+ authPrompt.show(undefined);
+ }
+ };
+
+ return retval;
+})(); /* OnionAuthPrompt */
+
+
+Object.defineProperty(this, "OnionAuthPrompt", {
+ value: OnionAuthPrompt,
+ enumerable: true,
+ writable: false
+});
diff --git a/browser/components/onionservices/content/authUtil.jsm b/browser/components/onionservices/content/authUtil.jsm
new file mode 100644
index 000000000000..c9d83774da1f
--- /dev/null
+++ b/browser/components/onionservices/content/authUtil.jsm
@@ -0,0 +1,47 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+var EXPORTED_SYMBOLS = [
+ "OnionAuthUtil",
+];
+
+var { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+const OnionAuthUtil = {
+ topic: {
+ clientAuthMissing: "tor-onion-services-clientauth-missing",
+ clientAuthIncorrect: "tor-onion-services-clientauth-incorrect",
+ },
+ message: {
+ authPromptCanceled: "Tor:OnionServicesAuthPromptCanceled",
+ },
+ domid: {
+ anchor: "tor-clientauth-notification-icon",
+ notification: "tor-clientauth",
+ description: "tor-clientauth-notification-desc",
+ learnMore: "tor-clientauth-notification-learnmore",
+ onionNameSpan: "tor-clientauth-notification-onionname",
+ keyElement: "tor-clientauth-notification-key",
+ warningElement: "tor-clientauth-warning",
+ checkboxElement: "tor-clientauth-persistkey-checkbox",
+ },
+
+ addCancelMessageListener(aTabContent, aDocShell) {
+ aTabContent.addMessageListener(this.message.authPromptCanceled,
+ (aMessage) => {
+ // Upon cancellation of the client authentication prompt, display
+ // the appropriate error page. When calling the docShell
+ // displayLoadError() function, we pass undefined for the failed
+ // channel so that displayLoadError() can determine that it should
+ // not display the client authentication prompt a second time.
+ let failedURI = Services.io.newURI(aMessage.data.failedURI);
+ let reasonForPrompt = aMessage.data.reasonForPrompt;
+ let errorCode =
+ (reasonForPrompt === this.topic.clientAuthMissing) ?
+ Cr.NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH :
+ Cr.NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH;
+ aDocShell.displayLoadError(errorCode, failedURI, undefined, undefined);
+ });
+ },
+};
diff --git a/browser/components/onionservices/content/netError/browser.svg b/browser/components/onionservices/content/netError/browser.svg
new file mode 100644
index 000000000000..b4c433b37bbb
--- /dev/null
+++ b/browser/components/onionservices/content/netError/browser.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="72" height="65" viewBox="0 0 72 65">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="M0.0 0.0C0.0 0.0 0.0 65.0 0.0 65.0C0.0 65.0 72.0 65.0 72.0 65.0C72.0 65.0 72.0 0.0 72.0 0.0C72.0 0.0 52.9019692 0.0 52.9019692 0.0C52.9019692 0.0 0.0 0.0 0.0 0.0C0.0 0.0 0.0 0.0 0.0 0.0M65.0 58.0C65.0 58.0 6.0 58.0 6.0 58.0C6.0 58.0 6.0 25.0 6.0 25.0C6.0 25.0 65.0 25.0 65.0 25.0C65.0 25.0 65.0 58.0 65.0 58.0C65.0 58.0 65.0 58.0 65.0 58.0M6.0 10.0C6.0 10.0 10.0 10.0 10.0 10.0C10.0 10.0 10.0 14.0 10.0 14.0C10.0 14.0 6.0 14.0 6.0 14.0C6.0 14.0 6.0 10.0 6.0 10.0C6.0 10.0 6.0 10.0 6.0 10.0M14.0 10.0C14.0 10.0 18.0 10.0 18.0 10.0C18.0 10.0 18.0 14.0 18.0 14.0C18.0 14.0 14.0 14.0 14.0 14.0C14.0 14.0 14.0 10.0 14.0 10.0C14.0 10.0 14.0 10.0 14.0 10.0M22.0 10.0C22.0 10.0 26.0 10.0 26.0 10.0C26.0 10.0 26.0 14.0 26.0 14.0C26.0 14.0 22.0 14.0 22.0 14.0C22.0 14.0 22.0 10.0 22.0 10.0C22.0 10.0 22.0 10.0 22.0 10.0" />
+</svg>
diff --git a/browser/components/onionservices/content/netError/network.svg b/browser/components/onionservices/content/netError/network.svg
new file mode 100644
index 000000000000..808c53dedd09
--- /dev/null
+++ b/browser/components/onionservices/content/netError/network.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="72" height="54" viewBox="0 0 72 54">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="M14.0487805 54.0C6.28990244 54.0 0.0 47.3306322 0.0 39.1034585C0.0 32.0105634 4.68716488 26.0867675 10.9481707 24.585103C10.6902 23.574652 10.5365854 22.5107596 10.5365854 21.4138156C10.5365854 14.7292347 15.6471278 9.3103384 21.9512195 9.3103384C24.8076351 9.3103384 27.4126741 10.4393194 29.4146341 12.2780088C32.1344254 5.0777841 38.77452 0.0 46.5365854 0.0C56.7201249 0.0 64.9756098 8.7536733 64.9756098 19.5517479C64.9756098 20.7691677 64.8471688 21.9453428 64.6463415 23.1013144C69.0576849 26.0679606 72.0 31.2693674 72.0 37.2413909C72.0 46.5256603 64.9510244 54.0 56.195122 54.0C56.195122 54.0 14.0487805 54.0 14.0487805 54.0C14.0487805 54.0 14.0487805 54.0 14.0487805 54.0" />
+</svg>
diff --git a/browser/components/onionservices/content/netError/onionNetError.css b/browser/components/onionservices/content/netError/onionNetError.css
new file mode 100644
index 000000000000..58117ab93223
--- /dev/null
+++ b/browser/components/onionservices/content/netError/onionNetError.css
@@ -0,0 +1,65 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+
+:root {
+ --grey-70: #38383d;
+}
+
+#onionErrorDiagramContainer {
+ margin: 60px auto;
+ width: 460px; /* 3 columns @ 140px plus 2 column gaps @ 20px */
+ display: grid;
+ grid-row-gap: 15px;
+ grid-column-gap: 20px;
+ grid-template-columns: 1fr 1fr 1fr;
+}
+
+#onionErrorDiagramContainer > div {
+ margin: auto;
+ position: relative; /* needed to allow overlay of the ok or error icon */
+}
+
+.onionErrorImage {
+ width: 72px;
+ height: 72px;
+ background-position: center;
+ background-repeat: no-repeat;
+ -moz-context-properties: fill;
+ fill: var(--grey-70);
+}
+
+#onionErrorBrowserImage {
+ background-image: url("browser.svg");
+}
+
+#onionErrorNetworkImage {
+ background-image: url("network.svg");
+}
+
+#onionErrorOnionSiteImage {
+ background-image: url("onionsite.svg");
+}
+
+/* rules to support overlay of the ok or error icon */
+.onionErrorImage[status]::after {
+ content: " ";
+ position: absolute;
+ left: -18px;
+ top: 18px;
+ width: 36px;
+ height: 36px;
+ -moz-context-properties: fill;
+ fill: var(--in-content-page-background);
+ background-color: var(--grey-70);
+ background-repeat: no-repeat;
+ background-position: center;
+ border: 3px solid var(--in-content-page-background);
+ border-radius: 50%;
+}
+
+.onionErrorImage[status="ok"]::after {
+ background-image: url("chrome://global/skin/icons/check.svg");
+}
+
+.onionErrorImage[status="error"]::after {
+ background-image: url("chrome://browser/skin/stop.svg");
+}
diff --git a/browser/components/onionservices/content/netError/onionNetError.js b/browser/components/onionservices/content/netError/onionNetError.js
new file mode 100644
index 000000000000..8fabb3f38eb7
--- /dev/null
+++ b/browser/components/onionservices/content/netError/onionNetError.js
@@ -0,0 +1,244 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+/* eslint-env mozilla/frame-script */
+
+var OnionServicesAboutNetError = {
+ _selector: {
+ header: ".title-text",
+ longDesc: "#errorLongDesc",
+ learnMoreContainer: "#learnMoreContainer",
+ learnMoreLink: "#learnMoreLink",
+ contentContainer: "#errorLongContent",
+ tryAgainButtonContainer: "#netErrorButtonContainer",
+ },
+ _status: {
+ ok: "ok",
+ error: "error",
+ },
+
+ _diagramInfoMap: undefined,
+
+ // Public functions (called from outside this file).
+ //
+ // This initPage() function may need to be updated if the structure of
+ // browser/base/content/aboutNetError.xhtml changes. Specifically, it
+ // references the following elements:
+ // query string parameter e
+ // class title-text
+ // id errorLongDesc
+ // id learnMoreContainer
+ // id learnMoreLink
+ // id errorLongContent
+ initPage(aDoc) {
+ const searchParams = new URLSearchParams(aDoc.documentURI.split("?")[1]);
+ const err = searchParams.get("e");
+
+ const errPrefix = "onionServices.";
+ const errName = err.substring(errPrefix.length);
+
+ this._strings = RPMGetTorStrings();
+
+ const stringsObj = this._strings[errName];
+ if (!stringsObj) {
+ return;
+ }
+
+ this._insertStylesheet(aDoc);
+
+ const pageTitle = stringsObj.pageTitle;
+ const header = stringsObj.header;
+ const longDescription = stringsObj.longDescription; // optional
+ const learnMoreURL = stringsObj.learnMoreURL;
+
+ if (pageTitle) {
+ aDoc.title = pageTitle;
+ }
+
+ if (header) {
+ const headerElem = aDoc.querySelector(this._selector.header);
+ if (headerElem) {
+ headerElem.textContent = header;
+ }
+ }
+
+ const ld = aDoc.querySelector(this._selector.longDesc);
+ if (ld) {
+ if (longDescription) {
+ const hexErr = this._hexErrorFromName(errName);
+ ld.textContent = longDescription.replace("%S", hexErr);
+ } else {
+ // This onion service error does not have a long description. Since
+ // it is set to a generic error string by the code in
+ // browser/base/content/aboutNetError.js, hide it here.
+ ld.style.display = "none";
+ }
+ }
+
+ if (learnMoreURL) {
+ const lmContainer = aDoc.querySelector(this._selector.learnMoreContainer);
+ if (lmContainer) {
+ lmContainer.style.display = "block";
+ }
+ const lmLink = lmContainer.querySelector(this._selector.learnMoreLink);
+ if (lmLink) {
+ lmLink.setAttribute("href", learnMoreURL);
+ }
+ }
+
+ // Remove the "Try Again" button if the user made a typo in the .onion
+ // address since it is not useful in that case.
+ if (errName === "badAddress") {
+ const tryAgainButton = aDoc.querySelector(
+ this._selector.tryAgainButtonContainer
+ );
+ if (tryAgainButton) {
+ tryAgainButton.style.display = "none";
+ }
+ }
+
+ this._insertDiagram(aDoc, errName);
+ }, // initPage()
+
+ _insertStylesheet(aDoc) {
+ const url =
+ "chrome://browser/content/onionservices/netError/onionNetError.css";
+ let linkElem = aDoc.createElement("link");
+ linkElem.rel = "stylesheet";
+ linkElem.href = url;
+ linkElem.type = "text/css";
+ aDoc.head.appendChild(linkElem);
+ },
+
+ _insertDiagram(aDoc, aErrorName) {
+ // The onion error diagram consists of a grid of div elements.
+ // The first row contains three images (Browser, Network, Onionsite) and
+ // the second row contains labels for the images that are in the first row.
+ // The _diagramInfoMap describes for each type of onion service error
+ // whether a small ok or error status icon is overlaid on top of the main
+ // Browser/Network/Onionsite images.
+ if (!this._diagramInfoMap) {
+ this._diagramInfoMap = new Map();
+ this._diagramInfoMap.set("descNotFound", {
+ browser: this._status.ok,
+ network: this._status.ok,
+ onionSite: this._status.error,
+ });
+ this._diagramInfoMap.set("descInvalid", {
+ browser: this._status.ok,
+ network: this._status.error,
+ });
+ this._diagramInfoMap.set("introFailed", {
+ browser: this._status.ok,
+ network: this._status.error,
+ });
+ this._diagramInfoMap.set("rendezvousFailed", {
+ browser: this._status.ok,
+ network: this._status.error,
+ });
+ this._diagramInfoMap.set("clientAuthMissing", {
+ browser: this._status.error,
+ });
+ this._diagramInfoMap.set("clientAuthIncorrect", {
+ browser: this._status.error,
+ });
+ this._diagramInfoMap.set("badAddress", {
+ browser: this._status.error,
+ });
+ this._diagramInfoMap.set("introTimedOut", {
+ browser: this._status.ok,
+ network: this._status.error,
+ });
+ }
+
+ const diagramInfo = this._diagramInfoMap.get(aErrorName);
+
+ const container = this._createDiv(aDoc, "onionErrorDiagramContainer");
+ const imageClass = "onionErrorImage";
+
+ const browserImage = this._createDiv(
+ aDoc,
+ "onionErrorBrowserImage",
+ imageClass,
+ container
+ );
+ if (diagramInfo && diagramInfo.browser) {
+ browserImage.setAttribute("status", diagramInfo.browser);
+ }
+
+ const networkImage = this._createDiv(
+ aDoc,
+ "onionErrorNetworkImage",
+ imageClass,
+ container
+ );
+ if (diagramInfo && diagramInfo.network) {
+ networkImage.setAttribute("status", diagramInfo.network);
+ }
+
+ const onionSiteImage = this._createDiv(
+ aDoc,
+ "onionErrorOnionSiteImage",
+ imageClass,
+ container
+ );
+ if (diagramInfo && diagramInfo.onionSite) {
+ onionSiteImage.setAttribute("status", diagramInfo.onionSite);
+ }
+
+ let labelDiv = this._createDiv(aDoc, undefined, undefined, container);
+ labelDiv.textContent = this._strings.errorPage.browser;
+ labelDiv = this._createDiv(aDoc, undefined, undefined, container);
+ labelDiv.textContent = this._strings.errorPage.network;
+ labelDiv = this._createDiv(aDoc, undefined, undefined, container);
+ labelDiv.textContent = this._strings.errorPage.onionSite;
+
+ const contentContainer = aDoc.querySelector(
+ this._selector.contentContainer
+ );
+ if (contentContainer) {
+ contentContainer.insertBefore(container, contentContainer.firstChild);
+ }
+ }, // _insertDiagram()
+
+ _createDiv(aDoc, aID, aClass, aParentElem) {
+ const div = aDoc.createElement("div");
+ if (aID) {
+ div.id = aID;
+ }
+ if (aClass) {
+ div.setAttribute("class", aClass);
+ }
+ if (aParentElem) {
+ aParentElem.appendChild(div);
+ }
+
+ return div;
+ },
+
+ _hexErrorFromName(aErrorName) {
+ // We do not have access to the original Tor SOCKS error code here, so
+ // perform a reverse mapping from the error name.
+ switch (aErrorName) {
+ case "descNotFound":
+ return "0xF0";
+ case "descInvalid":
+ return "0xF1";
+ case "introFailed":
+ return "0xF2";
+ case "rendezvousFailed":
+ return "0xF3";
+ case "clientAuthMissing":
+ return "0xF4";
+ case "clientAuthIncorrect":
+ return "0xF5";
+ case "badAddress":
+ return "0xF6";
+ case "introTimedOut":
+ return "0xF7";
+ }
+
+ return "";
+ },
+};
diff --git a/browser/components/onionservices/content/netError/onionsite.svg b/browser/components/onionservices/content/netError/onionsite.svg
new file mode 100644
index 000000000000..1f2777e6acc7
--- /dev/null
+++ b/browser/components/onionservices/content/netError/onionsite.svg
@@ -0,0 +1,7 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="70" height="63" viewBox="0 0 70 63">
+ <g fill="context-fill" fill-opacity="context-fill-opacity">
+ <path d="M64.0 2.0C64.0 2.0 4.0 2.0 4.0 2.0C2.8954305 2.0 2.0 2.81148389 2.0 3.8125C2.0 3.8125 2.0 58.1875 2.0 58.1875C2.0 59.1885161 2.8954305 60.0 4.0 60.0C4.0 60.0 36.0 60.0 36.0 60.0C36.0 60.0 36.0 56.375 36.0 56.375C36.0 56.375 6.0 56.375 6.0 56.375C6.0 56.375 6.0 41.875 6.0 41.875C6.0 41.875 38.0 41.875 38.0 41.875C38.0 41.875 38.0 38.25 38.0 38.25C38.0 38.25 6.0 38.25 6.0 38.25C6.0 38.25 6.0 23.75 6.0 23.75C6.0 23.75 62.0 23.75 62.0 23.75C62.0 23.75 62.0 36.4375 62.0 36.4375C62.0 36.4375 66.0 36.4375 66.0 36.4375C66.0 36.4375 66.0 3.8125 66.0 3.8125C66.0 2.81148389 65.1045695 2.0 64.0 2.0C64.0 2.0 64.0 2.0 64.0 2.0M62.0 20.125C62.0 20.125 6.0 20.125 6.0 20.125C6.0 20.125 6.0 5.625 6.0 5.625C6.0 5.625 62.0 5.625 62.0 5.625C62.0 5.625 62.0 20.125 62.0 20.125C62.0 20.125 62.0 20.125 62.0 20.125" />
+ <path d="M24.0 47.0C24.0 47.0 24.0 51.0 24.0 51.0C24.0 51.0 20.0 51.0 20.0 51.0C20.0 51.0 20.0 47.0 20.0 47.0C20.0 47.0 24.0 47.0 24.0 47.0C24.0 47.0 24.0 47.0 24.0 47.0M16.0 47.0C16.0 47.0 16.0 51.0 16.0 51.0C16.0 51.0 12.0 51.0 12.0 51.0C12.0 51.0 12.0 47.0 12.0 47.0C12.0 47.0 16.0 47.0 16.0 47.0C16.0 47.0 16.0 47.0 16.0 47.0M56.0 29.0C56.0 29.0 56.0 33.0 56.0 33.0C56.0 33.0 52.0 33.0 52.0 33.0C52.0 33.0 52.0 29.0 52.0 29.0C52.0 29.0 56.0 29.0 56.0 29.0C56.0 29.0 56.0 29.0 56.0 29.0M48.0 29.0C48.0 29.0 48.0 33.0 48.0 33.0C48.0 33.0 12.0 33.0 12.0 33.0C12.0 33.0 12.0 29.0 12.0 29.0C12.0 29.0 48.0 29.0 48.0 29.0C48.0 29.0 48.0 29.0 48.0 29.0M22.0 11.0C22.0 11.0 22.0 15.0 22.0 15.0C22.0 15.0 10.0 15.0 10.0 15.0C10.0 15.0 10.0 11.0 10.0 11.0C10.0 11.0 22.0 11.0 22.0 11.0C22.0 11.0 22.0 11.0 22.0 11.0M70.0 0.0C70.0 0.0 70.0 36.5 70.0 36.5C70.0 36.5 65.0 36.5 65.0 36.5C65.0 36.5 65.0 4.5 65.0 4.5C65.0 4.5 5.0 4.5 5.0 4.5C5.0 4.5 5.0 58.5 5.0 58.5C5.0 58.5 36.0 58.5 36.0 58.5C36.0 58
.5 36.0 63.0 36.0 63.0C36.0 63.0 0.0 63.0 0.0 63.0C0.0 63.0 0.0 0.0 0.0 0.0C0.0 0.0 70.0 0.0 70.0 0.0C70.0 0.0 70.0 0.0 70.0 0.0M32.0 47.0C32.0 47.0 32.0 51.0 32.0 51.0C32.0 51.0 28.0 51.0 28.0 51.0C28.0 51.0 28.0 47.0 28.0 47.0C28.0 47.0 32.0 47.0 32.0 47.0C32.0 47.0 32.0 47.0 32.0 47.0M54.0 11.0C54.0 11.0 54.0 15.0 54.0 15.0C54.0 15.0 50.0 15.0 50.0 15.0C50.0 15.0 50.0 11.0 50.0 11.0C50.0 11.0 54.0 11.0 54.0 11.0C54.0 11.0 54.0 11.0 54.0 11.0M46.0 11.0C46.0 11.0 46.0 15.0 46.0 15.0C46.0 15.0 42.0 15.0 42.0 15.0C42.0 15.0 42.0 11.0 42.0 11.0C42.0 11.0 46.0 11.0 46.0 11.0C46.0 11.0 46.0 11.0 46.0 11.0M38.0 11.0C38.0 11.0 38.0 15.0 38.0 15.0C38.0 15.0 34.0 15.0 34.0 15.0C34.0 15.0 34.0 11.0 34.0 11.0C34.0 11.0 38.0 11.0 38.0 11.0C38.0 11.0 38.0 11.0 38.0 11.0M30.0 11.0C30.0 11.0 30.0 15.0 30.0 15.0C30.0 15.0 26.0 15.0 26.0 15.0C26.0 15.0 26.0 11.0 26.0 11.0C26.0 11.0 30.0 11.0 30.0 11.0C30.0 11.0 30.0 11.0 30.0 11.0" />
+ <path d="M61.0 46.0C61.0 46.0 59.0 46.0 59.0 46.0C59.0 46.0 59.0 40.0 59.0 40.0C59.0 38.8954305 58.1045695 38.0 57.0 38.0C57.0 38.0 49.0 38.0 49.0 38.0C47.8954305 38.0 47.0 38.8954305 47.0 40.0C47.0 40.0 47.0 46.0 47.0 46.0C47.0 46.0 45.0 46.0 45.0 46.0C43.8954305 46.0 43.0 46.8954305 43.0 48.0C43.0 48.0 43.0 60.0 43.0 60.0C43.0 61.1045695 43.8954305 62.0 45.0 62.0C45.0 62.0 61.0 62.0 61.0 62.0C62.1045695 62.0 63.0 61.1045695 63.0 60.0C63.0 60.0 63.0 48.0 63.0 48.0C63.0 46.8954305 62.1045695 46.0 61.0 46.0C61.0 46.0 61.0 46.0 61.0 46.0M51.0 42.0C51.0 42.0 55.0 42.0 55.0 42.0C55.0 42.0 55.0 46.0 55.0 46.0C55.0 46.0 51.0 46.0 51.0 46.0C51.0 46.0 51.0 42.0 51.0 42.0C51.0 42.0 51.0 42.0 51.0 42.0M59.0 58.0C59.0 58.0 47.0 58.0 47.0 58.0C47.0 58.0 47.0 50.0 47.0 50.0C47.0 50.0 59.0 50.0 59.0 50.0C59.0 50.0 59.0 58.0 59.0 58.0C59.0 58.0 59.0 58.0 59.0 58.0" />
+ </g>
+</svg>
diff --git a/browser/components/onionservices/content/onionservices.css b/browser/components/onionservices/content/onionservices.css
new file mode 100644
index 000000000000..e2621ec8266d
--- /dev/null
+++ b/browser/components/onionservices/content/onionservices.css
@@ -0,0 +1,69 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+
+@namespace html url("http://www.w3.org/1999/xhtml");
+
+html|*#tor-clientauth-notification-onionname {
+ font-weight: bold;
+}
+
+html|*#tor-clientauth-notification-key {
+ box-sizing: border-box;
+ width: 100%;
+ margin-top: 15px;
+ padding: 6px;
+}
+
+/* Start of rules adapted from
+ * browser/components/newtab/css/activity-stream-mac.css (linux and windows
+ * use the same rules).
+ */
+html|*#tor-clientauth-notification-key.invalid {
+ border: 1px solid #D70022;
+ box-shadow: 0 0 0 1px #D70022, 0 0 0 4px rgba(215, 0, 34, 0.3);
+}
+
+html|*#tor-clientauth-warning {
+ display: inline-block;
+ animation: fade-up-tt 450ms;
+ background: #D70022;
+ border-radius: 2px;
+ color: #FFF;
+ inset-inline-start: 3px;
+ padding: 5px 12px;
+ position: relative;
+ top: 6px;
+ z-index: 1;
+}
+
+html|*#tor-clientauth-warning[hidden] {
+ display: none;
+}
+
+html|*#tor-clientauth-warning::before {
+ background: #D70022;
+ bottom: -8px;
+ content: '.';
+ height: 16px;
+ inset-inline-start: 12px;
+ position: absolute;
+ text-indent: -999px;
+ top: -7px;
+ transform: rotate(45deg);
+ white-space: nowrap;
+ width: 16px;
+ z-index: -1;
+}
+
+@keyframes fade-up-tt {
+ 0% {
+ opacity: 0;
+ transform: translateY(15px);
+ }
+ 100% {
+ opacity: 1;
+ transform: translateY(0);
+ }
+}
+/* End of rules adapted from
+ * browser/components/newtab/css/activity-stream-mac.css
+ */
diff --git a/browser/components/onionservices/content/savedKeysDialog.js b/browser/components/onionservices/content/savedKeysDialog.js
new file mode 100644
index 000000000000..b1376bbabe85
--- /dev/null
+++ b/browser/components/onionservices/content/savedKeysDialog.js
@@ -0,0 +1,259 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "controller",
+ "resource://torbutton/modules/tor-control-port.js"
+);
+
+var gOnionServicesSavedKeysDialog = {
+ selector: {
+ dialog: "#onionservices-savedkeys-dialog",
+ intro: "#onionservices-savedkeys-intro",
+ tree: "#onionservices-savedkeys-tree",
+ onionSiteCol: "#onionservices-savedkeys-siteCol",
+ onionKeyCol: "#onionservices-savedkeys-keyCol",
+ errorIcon: "#onionservices-savedkeys-errorIcon",
+ errorMessage: "#onionservices-savedkeys-errorMessage",
+ removeButton: "#onionservices-savedkeys-remove",
+ removeAllButton: "#onionservices-savedkeys-removeall",
+ },
+
+ _tree: undefined,
+ _isBusy: false, // true when loading data, deleting a key, etc.
+
+ // Public functions (called from outside this file).
+ async deleteSelectedKeys() {
+ this._setBusyState(true);
+
+ const indexesToDelete = [];
+ const count = this._tree.view.selection.getRangeCount();
+ for (let i = 0; i < count; ++i) {
+ const minObj = {};
+ const maxObj = {};
+ this._tree.view.selection.getRangeAt(i, minObj, maxObj);
+ for (let idx = minObj.value; idx <= maxObj.value; ++idx) {
+ indexesToDelete.push(idx);
+ }
+ }
+
+ if (indexesToDelete.length > 0) {
+ const controllerFailureMsg =
+ TorStrings.onionServices.authPreferences.failedToRemoveKey;
+ try {
+ const torController = controller(aError => {
+ this._showError(controllerFailureMsg);
+ });
+
+ // Remove in reverse index order to avoid issues caused by index changes.
+ for (let i = indexesToDelete.length - 1; i >= 0; --i) {
+ await this._deleteOneKey(torController, indexesToDelete[i]);
+ }
+ } catch (e) {
+ if (e.torMessage) {
+ this._showError(e.torMessage);
+ } else {
+ this._showError(controllerFailureMsg);
+ }
+ }
+ }
+
+ this._setBusyState(false);
+ },
+
+ async deleteAllKeys() {
+ this._tree.view.selection.selectAll();
+ await this.deleteSelectedKeys();
+ },
+
+ updateButtonsState() {
+ const haveSelection = this._tree.view.selection.getRangeCount() > 0;
+ const dialog = document.querySelector(this.selector.dialog);
+ const removeSelectedBtn = dialog.querySelector(this.selector.removeButton);
+ removeSelectedBtn.disabled = this._isBusy || !haveSelection;
+ const removeAllBtn = dialog.querySelector(this.selector.removeAllButton);
+ removeAllBtn.disabled = this._isBusy || this.rowCount === 0;
+ },
+
+ // Private functions.
+ _onLoad() {
+ document.mozSubdialogReady = this._init();
+ },
+
+ async _init() {
+ await this._populateXUL();
+
+ window.addEventListener("keypress", this._onWindowKeyPress.bind(this));
+
+ // We don't use await here because we want _loadSavedKeys() to run
+ // in the background and not block loading of this dialog.
+ this._loadSavedKeys();
+ },
+
+ async _populateXUL() {
+ const dialog = document.querySelector(this.selector.dialog);
+ const authPrefStrings = TorStrings.onionServices.authPreferences;
+ dialog.setAttribute("title", authPrefStrings.dialogTitle);
+
+ let elem = dialog.querySelector(this.selector.intro);
+ elem.textContent = authPrefStrings.dialogIntro;
+
+ elem = dialog.querySelector(this.selector.onionSiteCol);
+ elem.setAttribute("label", authPrefStrings.onionSite);
+
+ elem = dialog.querySelector(this.selector.onionKeyCol);
+ elem.setAttribute("label", authPrefStrings.onionKey);
+
+ elem = dialog.querySelector(this.selector.removeButton);
+ elem.setAttribute("label", authPrefStrings.remove);
+
+ elem = dialog.querySelector(this.selector.removeAllButton);
+ elem.setAttribute("label", authPrefStrings.removeAll);
+
+ this._tree = dialog.querySelector(this.selector.tree);
+ },
+
+ async _loadSavedKeys() {
+ const controllerFailureMsg =
+ TorStrings.onionServices.authPreferences.failedToGetKeys;
+ this._setBusyState(true);
+
+ try {
+ this._tree.view = this;
+
+ const torController = controller(aError => {
+ this._showError(controllerFailureMsg);
+ });
+
+ const keyInfoList = await torController.onionAuthViewKeys();
+ if (keyInfoList) {
+ // Filter out temporary keys.
+ this._keyInfoList = keyInfoList.filter(aKeyInfo => {
+ if (!aKeyInfo.Flags) {
+ return false;
+ }
+
+ const flags = aKeyInfo.Flags.split(",");
+ return flags.includes("Permanent");
+ });
+
+ // Sort by the .onion address.
+ this._keyInfoList.sort((aObj1, aObj2) => {
+ const hsAddr1 = aObj1.hsAddress.toLowerCase();
+ const hsAddr2 = aObj2.hsAddress.toLowerCase();
+ if (hsAddr1 < hsAddr2) {
+ return -1;
+ }
+ return hsAddr1 > hsAddr2 ? 1 : 0;
+ });
+ }
+
+ // Render the tree content.
+ this._tree.rowCountChanged(0, this.rowCount);
+ } catch (e) {
+ if (e.torMessage) {
+ this._showError(e.torMessage);
+ } else {
+ this._showError(controllerFailureMsg);
+ }
+ }
+
+ this._setBusyState(false);
+ },
+
+ // This method may throw; callers should catch errors.
+ async _deleteOneKey(aTorController, aIndex) {
+ const keyInfoObj = this._keyInfoList[aIndex];
+ await aTorController.onionAuthRemove(keyInfoObj.hsAddress);
+ this._tree.view.selection.clearRange(aIndex, aIndex);
+ this._keyInfoList.splice(aIndex, 1);
+ this._tree.rowCountChanged(aIndex + 1, -1);
+ },
+
+ _setBusyState(aIsBusy) {
+ this._isBusy = aIsBusy;
+ this.updateButtonsState();
+ },
+
+ _onWindowKeyPress(event) {
+ if (event.keyCode === KeyEvent.DOM_VK_ESCAPE) {
+ window.close();
+ } else if (event.keyCode === KeyEvent.DOM_VK_DELETE) {
+ this.deleteSelectedKeys();
+ }
+ },
+
+ _showError(aMessage) {
+ const dialog = document.querySelector(this.selector.dialog);
+ const errorIcon = dialog.querySelector(this.selector.errorIcon);
+ errorIcon.style.visibility = aMessage ? "visible" : "hidden";
+ const errorDesc = dialog.querySelector(this.selector.errorMessage);
+ errorDesc.textContent = aMessage ? aMessage : "";
+ },
+
+ // XUL tree widget view implementation.
+ get rowCount() {
+ return this._keyInfoList ? this._keyInfoList.length : 0;
+ },
+
+ getCellText(aRow, aCol) {
+ let val = "";
+ if (this._keyInfoList && aRow < this._keyInfoList.length) {
+ const keyInfo = this._keyInfoList[aRow];
+ if (aCol.id.endsWith("-siteCol")) {
+ val = keyInfo.hsAddress;
+ } else if (aCol.id.endsWith("-keyCol")) {
+ val = keyInfo.typeAndKey;
+ // Omit keyType because it is always "x25519".
+ const idx = val.indexOf(":");
+ if (idx > 0) {
+ val = val.substring(idx + 1);
+ }
+ }
+ }
+
+ return val;
+ },
+
+ isSeparator(index) {
+ return false;
+ },
+
+ isSorted() {
+ return false;
+ },
+
+ isContainer(index) {
+ return false;
+ },
+
+ setTree(tree) {},
+
+ getImageSrc(row, column) {},
+
+ getCellValue(row, column) {},
+
+ cycleHeader(column) {},
+
+ getRowProperties(row) {
+ return "";
+ },
+
+ getColumnProperties(column) {
+ return "";
+ },
+
+ getCellProperties(row, column) {
+ return "";
+ },
+};
+
+window.addEventListener("load", () => gOnionServicesSavedKeysDialog._onLoad());
diff --git a/browser/components/onionservices/content/savedKeysDialog.xhtml b/browser/components/onionservices/content/savedKeysDialog.xhtml
new file mode 100644
index 000000000000..3db9bb05ea82
--- /dev/null
+++ b/browser/components/onionservices/content/savedKeysDialog.xhtml
@@ -0,0 +1,42 @@
+<?xml version="1.0"?>
+<!-- Copyright (c) 2020, The Tor Project, Inc. -->
+
+<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/skin/preferences/preferences.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/onionservices/authPreferences.css" type="text/css"?>
+
+<window id="onionservices-savedkeys-dialog"
+ windowtype="OnionServices:SavedKeys"
+ xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"
+ style="width: 45em;">
+
+ <script src="chrome://browser/content/onionservices/savedKeysDialog.js"/>
+
+ <vbox id="onionservices-savedkeys" class="contentPane" flex="1">
+ <label id="onionservices-savedkeys-intro"
+ control="onionservices-savedkeys-tree"/>
+ <separator class="thin"/>
+ <tree id="onionservices-savedkeys-tree" flex="1" hidecolumnpicker="true"
+ width="750"
+ style="height: 20em;"
+ onselect="gOnionServicesSavedKeysDialog.updateButtonsState();">
+ <treecols>
+ <treecol id="onionservices-savedkeys-siteCol" flex="1" persist="width"/>
+ <splitter class="tree-splitter"/>
+ <treecol id="onionservices-savedkeys-keyCol" flex="1" persist="width"/>
+ </treecols>
+ <treechildren/>
+ </tree>
+ <hbox id="onionservices-savedkeys-errorContainer" align="baseline" flex="1">
+ <image id="onionservices-savedkeys-errorIcon"/>
+ <description id="onionservices-savedkeys-errorMessage" flex="1"/>
+ </hbox>
+ <separator class="thin"/>
+ <hbox id="onionservices-savedkeys-buttons">
+ <button id="onionservices-savedkeys-remove" disabled="true"
+ oncommand="gOnionServicesSavedKeysDialog.deleteSelectedKeys();"/>
+ <button id="onionservices-savedkeys-removeall"
+ oncommand="gOnionServicesSavedKeysDialog.deleteAllKeys();"/>
+ </hbox>
+ </vbox>
+</window>
diff --git a/browser/components/onionservices/jar.mn b/browser/components/onionservices/jar.mn
new file mode 100644
index 000000000000..9d6ce88d1841
--- /dev/null
+++ b/browser/components/onionservices/jar.mn
@@ -0,0 +1,9 @@
+browser.jar:
+ content/browser/onionservices/authPreferences.css (content/authPreferences.css)
+ content/browser/onionservices/authPreferences.js (content/authPreferences.js)
+ content/browser/onionservices/authPrompt.js (content/authPrompt.js)
+ content/browser/onionservices/authUtil.jsm (content/authUtil.jsm)
+ content/browser/onionservices/netError/ (content/netError/*)
+ content/browser/onionservices/onionservices.css (content/onionservices.css)
+ content/browser/onionservices/savedKeysDialog.js (content/savedKeysDialog.js)
+ content/browser/onionservices/savedKeysDialog.xhtml (content/savedKeysDialog.xhtml)
diff --git a/browser/components/onionservices/moz.build b/browser/components/onionservices/moz.build
new file mode 100644
index 000000000000..2661ad7cb9f3
--- /dev/null
+++ b/browser/components/onionservices/moz.build
@@ -0,0 +1 @@
+JAR_MANIFESTS += ["jar.mn"]
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index 0139abf95cbd..07ab5cc7b626 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -12,6 +12,7 @@
<?xml-stylesheet href="chrome://browser/skin/preferences/search.css"?>
<?xml-stylesheet href="chrome://browser/skin/preferences/containers.css"?>
<?xml-stylesheet href="chrome://browser/skin/preferences/privacy.css"?>
+<?xml-stylesheet href="chrome://browser/content/onionservices/authPreferences.css"?>
<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPreferences.css"?>
<?xml-stylesheet href="chrome://browser/content/torpreferences/torPreferences.css"?>
diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
index 29179473aadd..eb410c13a8cc 100644
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -493,6 +493,8 @@
<label id="fips-desc" hidden="true" data-l10n-id="forms-master-pw-fips-desc"></label>
</groupbox>
+#include ../onionservices/content/authPreferences.inc.xhtml
+
<!-- The form autofill section is inserted in to this box
after the form autofill extension has initialized. -->
<groupbox id="formAutofillGroupBox"
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index 36259321dd06..0b1e28dfac92 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -80,6 +80,12 @@ XPCOMUtils.defineLazyGetter(this, "AlertsServiceDND", function() {
}
});
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["OnionServicesAuthPreferences"],
+ "chrome://browser/content/onionservices/authPreferences.js"
+);
+
// TODO: module import via ChromeUtils.defineModuleGetter
XPCOMUtils.defineLazyScriptGetter(
this,
@@ -529,6 +535,7 @@ var gPrivacyPane = {
this.trackingProtectionReadPrefs();
this.networkCookieBehaviorReadPrefs();
this._initTrackingProtectionExtensionControl();
+ OnionServicesAuthPreferences.init();
this._initSecurityLevel();
Services.telemetry.setEventRecordingEnabled("pwmgr", true);
diff --git a/browser/themes/shared/notification-icons.inc.css b/browser/themes/shared/notification-icons.inc.css
index f93db99f22bd..39eb59a04964 100644
--- a/browser/themes/shared/notification-icons.inc.css
+++ b/browser/themes/shared/notification-icons.inc.css
@@ -146,6 +146,9 @@
list-style-image: url(chrome://browser/skin/notification-icons/indexedDB.svg);
}
+/* Reuse Firefox's login (key) icon for the Tor onion services auth. prompt */
+.popup-notification-icon[popupid="tor-clientauth"],
+.tor-clientauth-icon,
.popup-notification-icon[popupid="password"],
.login-icon {
list-style-image: url(chrome://browser/skin/login.svg);
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index f1119393898d..94ceeb67f301 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -3814,6 +3814,7 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
}
} else {
// Errors requiring simple formatting
+ bool isOnionAuthError = false;
switch (aError) {
case NS_ERROR_MALFORMED_URI:
// URI is malformed
@@ -3896,10 +3897,44 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
// HTTP/2 or HTTP/3 stack detected a protocol error
error = "networkProtocolError";
break;
-
+ case NS_ERROR_TOR_ONION_SVC_NOT_FOUND:
+ error = "onionServices.descNotFound";
+ break;
+ case NS_ERROR_TOR_ONION_SVC_IS_INVALID:
+ error = "onionServices.descInvalid";
+ break;
+ case NS_ERROR_TOR_ONION_SVC_INTRO_FAILED:
+ error = "onionServices.introFailed";
+ break;
+ case NS_ERROR_TOR_ONION_SVC_REND_FAILED:
+ error = "onionServices.rendezvousFailed";
+ break;
+ case NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH:
+ error = "onionServices.clientAuthMissing";
+ isOnionAuthError = true;
+ break;
+ case NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH:
+ error = "onionServices.clientAuthIncorrect";
+ isOnionAuthError = true;
+ break;
+ case NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS:
+ error = "onionServices.badAddress";
+ break;
+ case NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT:
+ error = "onionServices.introTimedOut";
+ break;
default:
break;
}
+
+ // The presence of aFailedChannel indicates that we arrived here due to a
+ // failed connection attempt. Note that we will arrive here a second time
+ // if the user cancels the Tor client auth prompt, but in that case we
+ // will not have a failed channel and therefore we will not prompt again.
+ if (isOnionAuthError && aFailedChannel) {
+ // Display about:blank while the Tor client auth prompt is open.
+ errorPage.AssignLiteral("blank");
+ }
}
// If the HTTPS-Only Mode upgraded this request and the upgrade might have
@@ -3982,6 +4017,20 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
nsAutoString str;
rv =
stringBundle->FormatStringFromName(errorDescriptionID, formatStrs, str);
+ if (NS_FAILED(rv)) {
+ // As a fallback, check torbutton.properties for the error string.
+ const char bundleURL[] = "chrome://torbutton/locale/torbutton.properties";
+ nsCOMPtr<nsIStringBundleService> stringBundleService =
+ mozilla::services::GetStringBundleService();
+ if (stringBundleService) {
+ nsCOMPtr<nsIStringBundle> tbStringBundle;
+ if (NS_SUCCEEDED(stringBundleService->CreateBundle(
+ bundleURL, getter_AddRefs(tbStringBundle)))) {
+ rv = tbStringBundle->FormatStringFromName(errorDescriptionID,
+ formatStrs, str);
+ }
+ }
+ }
NS_ENSURE_SUCCESS(rv, rv);
messageStr.Assign(str);
}
@@ -6402,6 +6451,7 @@ nsresult nsDocShell::FilterStatusForErrorPage(
aStatus == NS_ERROR_FILE_ACCESS_DENIED ||
aStatus == NS_ERROR_CORRUPTED_CONTENT ||
aStatus == NS_ERROR_INVALID_CONTENT_ENCODING ||
+ NS_ERROR_GET_MODULE(aStatus) == NS_ERROR_MODULE_TOR ||
NS_ERROR_GET_MODULE(aStatus) == NS_ERROR_MODULE_SECURITY) {
// Errors to be shown for any frame
return aStatus;
@@ -8187,6 +8237,35 @@ nsresult nsDocShell::CreateContentViewer(const nsACString& aContentType,
FireOnLocationChange(this, aRequest, mCurrentURI, locationFlags);
}
+ // Arrange to show a Tor onion service client authentication prompt if
+ // appropriate.
+ if ((mLoadType == LOAD_ERROR_PAGE) && failedChannel) {
+ nsresult status = NS_OK;
+ if (NS_SUCCEEDED(failedChannel->GetStatus(&status)) &&
+ ((status == NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH) ||
+ (status == NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH))) {
+ nsAutoCString onionHost;
+ failedURI->GetHost(onionHost);
+ const char* topic = (status == NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH)
+ ? "tor-onion-services-clientauth-missing"
+ : "tor-onion-services-clientauth-incorrect";
+ if (XRE_IsContentProcess()) {
+ nsCOMPtr<nsIBrowserChild> browserChild = GetBrowserChild();
+ if (browserChild) {
+ static_cast<BrowserChild*>(browserChild.get())
+ ->SendShowOnionServicesAuthPrompt(onionHost, nsCString(topic));
+ }
+ } else {
+ nsCOMPtr<nsPIDOMWindowOuter> browserWin = GetWindow();
+ nsCOMPtr<nsIObserverService> obsSvc = services::GetObserverService();
+ if (browserWin && obsSvc) {
+ obsSvc->NotifyObservers(browserWin, topic,
+ NS_ConvertUTF8toUTF16(onionHost).get());
+ }
+ }
+ }
+ }
+
return NS_OK;
}
diff --git a/dom/ipc/BrowserParent.cpp b/dom/ipc/BrowserParent.cpp
index 378211d237a0..240b386f6dde 100644
--- a/dom/ipc/BrowserParent.cpp
+++ b/dom/ipc/BrowserParent.cpp
@@ -3805,6 +3805,27 @@ mozilla::ipc::IPCResult BrowserParent::RecvShowCanvasPermissionPrompt(
return IPC_OK();
}
+mozilla::ipc::IPCResult BrowserParent::RecvShowOnionServicesAuthPrompt(
+ const nsCString& aOnionName, const nsCString& aTopic) {
+ nsCOMPtr<nsIBrowser> browser =
+ mFrameElement ? mFrameElement->AsBrowser() : nullptr;
+ if (!browser) {
+ // If the tab is being closed, the browser may not be available.
+ // In this case we can ignore the request.
+ return IPC_OK();
+ }
+ nsCOMPtr<nsIObserverService> os = services::GetObserverService();
+ if (!os) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ nsresult rv = os->NotifyObservers(browser, aTopic.get(),
+ NS_ConvertUTF8toUTF16(aOnionName).get());
+ if (NS_FAILED(rv)) {
+ return IPC_FAIL_NO_REASON(this);
+ }
+ return IPC_OK();
+}
+
mozilla::ipc::IPCResult BrowserParent::RecvVisitURI(nsIURI* aURI,
nsIURI* aLastVisitedURI,
const uint32_t& aFlags) {
diff --git a/dom/ipc/BrowserParent.h b/dom/ipc/BrowserParent.h
index 0d4e3e1c9c8a..a37271da9544 100644
--- a/dom/ipc/BrowserParent.h
+++ b/dom/ipc/BrowserParent.h
@@ -740,6 +740,9 @@ class BrowserParent final : public PBrowserParent,
mozilla::ipc::IPCResult RecvShowCanvasPermissionPrompt(
const nsCString& aOrigin, const bool& aHideDoorHanger);
+ mozilla::ipc::IPCResult RecvShowOnionServicesAuthPrompt(
+ const nsCString& aOnionName, const nsCString& aTopic);
+
mozilla::ipc::IPCResult RecvSetSystemFont(const nsCString& aFontName);
mozilla::ipc::IPCResult RecvGetSystemFont(nsCString* aFontName);
diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl
index df77d19287bd..29433edcde78 100644
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -580,6 +580,15 @@ parent:
async RequestPointerCapture(uint32_t aPointerId) returns (bool aSuccess);
async ReleasePointerCapture(uint32_t aPointerId);
+ /**
+ * This function is used to notify the parent that it should display a
+ * onion services client authentication prompt.
+ *
+ * @param aOnionHost The hostname of the .onion that needs authentication.
+ * @param aTopic The reason for the prompt.
+ */
+ async ShowOnionServicesAuthPrompt(nsCString aOnionHost, nsCString aTopic);
+
child:
async NativeSynthesisResponse(uint64_t aObserverId, nsCString aResponse);
async UpdateEpoch(uint32_t aEpoch);
diff --git a/js/xpconnect/src/xpc.msg b/js/xpconnect/src/xpc.msg
index c7fbdd23f378..07f529957bd0 100644
--- a/js/xpconnect/src/xpc.msg
+++ b/js/xpconnect/src/xpc.msg
@@ -248,5 +248,15 @@ XPC_MSG_DEF(NS_ERROR_FINGERPRINTING_URI , "The URI is fingerprinti
XPC_MSG_DEF(NS_ERROR_CRYPTOMINING_URI , "The URI is cryptomining")
XPC_MSG_DEF(NS_ERROR_SOCIALTRACKING_URI , "The URI is social tracking")
+/* Codes related to Tor */
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_NOT_FOUND , "Tor onion service descriptor cannot be found")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_IS_INVALID , "Tor onion service descriptor is invalid")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_INTRO_FAILED , "Tor onion service introduction failed")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_REND_FAILED , "Tor onion service rendezvous failed")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH, "Tor onion service missing client authorization")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH , "Tor onion service wrong client authorization")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS , "Tor onion service bad address")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT , "Tor onion service introduction timed out")
+
/* Profile manager error codes */
XPC_MSG_DEF(NS_ERROR_DATABASE_CHANGED , "Flushing the profiles to disk would have overwritten changes made elsewhere.")
diff --git a/netwerk/base/nsSocketTransport2.cpp b/netwerk/base/nsSocketTransport2.cpp
index 551fa4d50997..0cbc65e43c99 100644
--- a/netwerk/base/nsSocketTransport2.cpp
+++ b/netwerk/base/nsSocketTransport2.cpp
@@ -216,6 +216,12 @@ nsresult ErrorAccordingToNSPR(PRErrorCode errorCode) {
default:
if (psm::IsNSSErrorCode(errorCode)) {
rv = psm::GetXPCOMFromNSSError(errorCode);
+ } else {
+ // If we received a Tor extended error code via SOCKS, pass it through.
+ nsresult res = nsresult(errorCode);
+ if (NS_ERROR_GET_MODULE(res) == NS_ERROR_MODULE_TOR) {
+ rv = res;
+ }
}
break;
diff --git a/netwerk/socket/nsSOCKSIOLayer.cpp b/netwerk/socket/nsSOCKSIOLayer.cpp
index 0a16d6c7236f..c2bf0e951dda 100644
--- a/netwerk/socket/nsSOCKSIOLayer.cpp
+++ b/netwerk/socket/nsSOCKSIOLayer.cpp
@@ -1007,6 +1007,55 @@ PRStatus nsSOCKSSocketInfo::ReadV5ConnectResponseTop() {
"08, Address type not supported."));
c = PR_BAD_ADDRESS_ERROR;
break;
+ case 0xF0: // Tor SOCKS5_HS_NOT_FOUND
+ LOGERROR(
+ ("socks5: connect failed: F0,"
+ " Tor onion service descriptor can not be found."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_NOT_FOUND);
+ break;
+ case 0xF1: // Tor SOCKS5_HS_IS_INVALID
+ LOGERROR(
+ ("socks5: connect failed: F1,"
+ " Tor onion service descriptor is invalid."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_IS_INVALID);
+ break;
+ case 0xF2: // Tor SOCKS5_HS_INTRO_FAILED
+ LOGERROR(
+ ("socks5: connect failed: F2,"
+ " Tor onion service introduction failed."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_INTRO_FAILED);
+ break;
+ case 0xF3: // Tor SOCKS5_HS_REND_FAILED
+ LOGERROR(
+ ("socks5: connect failed: F3,"
+ " Tor onion service rendezvous failed."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_REND_FAILED);
+ break;
+ case 0xF4: // Tor SOCKS5_HS_MISSING_CLIENT_AUTH
+ LOGERROR(
+ ("socks5: connect failed: F4,"
+ " Tor onion service missing client authorization."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH);
+ break;
+ case 0xF5: // Tor SOCKS5_HS_BAD_CLIENT_AUTH
+ LOGERROR(
+ ("socks5: connect failed: F5,"
+ " Tor onion service wrong client authorization."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH);
+ break;
+ case 0xF6: // Tor SOCKS5_HS_BAD_ADDRESS
+ LOGERROR(
+ ("socks5: connect failed: F6,"
+ " Tor onion service bad address."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS);
+ break;
+ case 0xF7: // Tor SOCKS5_HS_INTRO_TIMEDOUT
+ LOGERROR(
+ ("socks5: connect failed: F7,"
+ " Tor onion service introduction timed out."));
+ c = static_cast<uint32_t>(NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT);
+ break;
+
default:
LOGERROR(("socks5: connect failed."));
break;
diff --git a/toolkit/modules/PopupNotifications.jsm b/toolkit/modules/PopupNotifications.jsm
index d6518723afab..9764cfd496c3 100644
--- a/toolkit/modules/PopupNotifications.jsm
+++ b/toolkit/modules/PopupNotifications.jsm
@@ -410,6 +410,8 @@ PopupNotifications.prototype = {
* will be dismissed instead of removed after running the callback.
* - [optional] disabled (boolean): If this is true, the button
* will be disabled.
+ * - [optional] leaveOpen (boolean): If this is true, the notification
+ * will not be removed after running the callback.
* - [optional] disableHighlight (boolean): If this is true, the button
* will not apply the default highlight style.
* If null, the notification will have a default "OK" action button
@@ -1916,6 +1918,10 @@ PopupNotifications.prototype = {
this._dismiss();
return;
}
+
+ if (action.leaveOpen) {
+ return;
+ }
}
this._remove(notification);
diff --git a/toolkit/modules/RemotePageAccessManager.jsm b/toolkit/modules/RemotePageAccessManager.jsm
index e5111ff83782..c12e71ac4d42 100644
--- a/toolkit/modules/RemotePageAccessManager.jsm
+++ b/toolkit/modules/RemotePageAccessManager.jsm
@@ -102,6 +102,7 @@ let RemotePageAccessManager = {
RPMAddToHistogram: ["*"],
RPMGetInnerMostURI: ["*"],
RPMGetHttpResponseHeader: ["*"],
+ RPMGetTorStrings: ["*"],
},
"about:plugins": {
RPMSendQuery: ["RequestPlugins"],
diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/frame-script.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/frame-script.js
index 15c15615ad97..57458ba0bf5e 100644
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/frame-script.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/frame-script.js
@@ -41,5 +41,6 @@ module.exports = {
RPMGetHttpResponseHeader: false,
RPMTryPingSecureWWWLink: false,
RPMOpenSecureWWWLink: false,
+ RPMGetTorStrings: false,
},
};
diff --git a/xpcom/base/ErrorList.py b/xpcom/base/ErrorList.py
index 9b9ce1a4acc5..7f860b127b8b 100755
--- a/xpcom/base/ErrorList.py
+++ b/xpcom/base/ErrorList.py
@@ -89,6 +89,7 @@ modules["ERRORRESULT"] = Mod(43)
# Win32 system error codes, which are not mapped to a specific other value,
# see Bug 1686041.
modules["WIN32"] = Mod(44)
+modules["TOR"] = Mod(45)
# NS_ERROR_MODULE_GENERAL should be used by modules that do not
# care if return code values overlap. Callers of methods that
@@ -1206,6 +1207,27 @@ with modules["ERRORRESULT"]:
errors["NS_ERROR_INTERNAL_ERRORRESULT_RANGEERROR"] = FAILURE(5)
+# =======================================================================
+# 45: Tor-specific error codes.
+# =======================================================================
+with modules["TOR"]:
+ # Tor onion service descriptor can not be found.
+ errors["NS_ERROR_TOR_ONION_SVC_NOT_FOUND"] = FAILURE(1)
+ # Tor onion service descriptor is invalid.
+ errors["NS_ERROR_TOR_ONION_SVC_IS_INVALID"] = FAILURE(2)
+ # Tor onion service introduction failed.
+ errors["NS_ERROR_TOR_ONION_SVC_INTRO_FAILED"] = FAILURE(3)
+ # Tor onion service rendezvous failed.
+ errors["NS_ERROR_TOR_ONION_SVC_REND_FAILED"] = FAILURE(4)
+ # Tor onion service missing client authorization.
+ errors["NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH"] = FAILURE(5)
+ # Tor onion service wrong client authorization.
+ errors["NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH"] = FAILURE(6)
+ # Tor onion service bad address.
+ errors["NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS"] = FAILURE(7)
+ # Tor onion service introduction timed out.
+ errors["NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT"] = FAILURE(8)
+
# =======================================================================
# 51: NS_ERROR_MODULE_GENERAL
# =======================================================================
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 24796 - Comment out excess permissions from GeckoView
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit ec9dee6984f0b76d6352241579d8dd9b55a01e6d
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Wed Apr 11 17:52:59 2018 +0000
Bug 24796 - Comment out excess permissions from GeckoView
The GeckoView AndroidManifest.xml is not preprocessed unlike Fennec's
manifest, so we can't use the ifdef preprocessor guards around the
permissions we do not want. Commenting the permissions is the
next-best-thing.
---
.../android/geckoview/src/main/AndroidManifest.xml | 20 +++++++++++++++++---
1 file changed, 17 insertions(+), 3 deletions(-)
diff --git a/mobile/android/geckoview/src/main/AndroidManifest.xml b/mobile/android/geckoview/src/main/AndroidManifest.xml
index a76b6a4754b6..7a2f30708fc3 100644
--- a/mobile/android/geckoview/src/main/AndroidManifest.xml
+++ b/mobile/android/geckoview/src/main/AndroidManifest.xml
@@ -6,20 +6,32 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="org.mozilla.geckoview">
+<!--#ifdef MOZ_ANDROID_NETWORK_STATE-->
+ <!--
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
+ -->
+<!--#endif-->
<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
+<!--#ifdef MOZ_ANDROID_LOCATION-->
+ <!--
<uses-feature
android:name="android.hardware.location"
android:required="false"/>
<uses-feature
android:name="android.hardware.location.gps"
android:required="false"/>
+ -->
+<!--#endif-->
<uses-feature
android:name="android.hardware.touchscreen"
android:required="false"/>
+<!--#ifdef MOZ_WEBRTC-->
+ <!-- TODO preprocess AndroidManifest.xml so that we can
+ conditionally include WebRTC permissions based on MOZ_WEBRTC. -->
+ <!--
<uses-feature
android:name="android.hardware.camera"
android:required="false"/>
@@ -28,14 +40,16 @@
android:required="false"/>
<uses-feature
- android:name="android.hardware.audio.low_latency"
+ android:name="android.hardware.camera.any"
android:required="false"/>
<uses-feature
- android:name="android.hardware.microphone"
+ android:name="android.hardware.audio.low_latency"
android:required="false"/>
<uses-feature
- android:name="android.hardware.camera.any"
+ android:name="android.hardware.microphone"
android:required="false"/>
+ -->
+<!--#endif-->
<!-- GeckoView requires OpenGL ES 2.0 -->
<uses-feature
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 32658: Create a new MAR signing key
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 3952f59e10ed95ba8c904dcdda8462cf65013001
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Jan 17 12:54:31 2020 +0000
Bug 32658: Create a new MAR signing key
It's time for our rotation again: Move the backup key in the front
position and add a new backup key.
Bug 33803: Move our primary nightly MAR signing key to tor-browser
Bug 33803: Add a secondary nightly MAR signing key
---
.../update/updater/nightly_aurora_level3_primary.der | Bin 1225 -> 1245 bytes
.../updater/nightly_aurora_level3_secondary.der | Bin 1225 -> 1245 bytes
toolkit/mozapps/update/updater/release_primary.der | Bin 1225 -> 1229 bytes
toolkit/mozapps/update/updater/release_secondary.der | Bin 1225 -> 1229 bytes
4 files changed, 0 insertions(+), 0 deletions(-)
diff --git a/toolkit/mozapps/update/updater/nightly_aurora_level3_primary.der b/toolkit/mozapps/update/updater/nightly_aurora_level3_primary.der
index 44fd95dcff89..d579cf801e1a 100644
Binary files a/toolkit/mozapps/update/updater/nightly_aurora_level3_primary.der and b/toolkit/mozapps/update/updater/nightly_aurora_level3_primary.der differ
diff --git a/toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der b/toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der
index 90f8e6e82c63..7cbfa77d06e7 100644
Binary files a/toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der and b/toolkit/mozapps/update/updater/nightly_aurora_level3_secondary.der differ
diff --git a/toolkit/mozapps/update/updater/release_primary.der b/toolkit/mozapps/update/updater/release_primary.der
index 1d94f88ad73b..0103a171de88 100644
Binary files a/toolkit/mozapps/update/updater/release_primary.der and b/toolkit/mozapps/update/updater/release_primary.der differ
diff --git a/toolkit/mozapps/update/updater/release_secondary.der b/toolkit/mozapps/update/updater/release_secondary.der
index 474706c4b73c..fcee3944e9b7 100644
Binary files a/toolkit/mozapps/update/updater/release_secondary.der and b/toolkit/mozapps/update/updater/release_secondary.der differ
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 25741 - TBA: Disable GeckoNetworkManager
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 710a52a3d3c4f72ef1f7efae088c1fd6c3839414
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Apr 26 22:22:51 2018 +0000
Bug 25741 - TBA: Disable GeckoNetworkManager
The browser should not need information related to the network
interface or network state, tor should take care of that.
---
.../src/main/java/org/mozilla/geckoview/GeckoRuntime.java | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
index f084b522ad53..b94d8e803b6b 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntime.java
@@ -122,7 +122,9 @@ public final class GeckoRuntime implements Parcelable {
mPaused = false;
// Monitor network status and send change notifications to Gecko
// while active.
- GeckoNetworkManager.getInstance().start(GeckoAppShell.getApplicationContext());
+ if (BuildConfig.TOR_BROWSER_VERSION == "") {
+ GeckoNetworkManager.getInstance().start(GeckoAppShell.getApplicationContext());
+ }
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
@@ -130,7 +132,9 @@ public final class GeckoRuntime implements Parcelable {
Log.d(LOGTAG, "Lifecycle: onPause");
mPaused = true;
// Stop monitoring network status while inactive.
- GeckoNetworkManager.getInstance().stop();
+ if (BuildConfig.TOR_BROWSER_VERSION == "") {
+ GeckoNetworkManager.getInstance().stop();
+ }
GeckoThread.onPause();
}
}
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 28125 - Prevent non-Necko network connections
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit f8a05f64224583244f0a574c1586995fb7c282c2
Author: Matthew Finkel <Matthew.Finkel(a)gmail.com>
Date: Thu Oct 25 19:17:09 2018 +0000
Bug 28125 - Prevent non-Necko network connections
---
.../gecko/media/GeckoMediaDrmBridgeV21.java | 49 +---------------------
.../exoplayer2/upstream/DefaultHttpDataSource.java | 47 ++-------------------
2 files changed, 4 insertions(+), 92 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
index 6e75e6fb4dd5..7faa9bc2821d 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/media/GeckoMediaDrmBridgeV21.java
@@ -490,54 +490,7 @@ public class GeckoMediaDrmBridgeV21 implements GeckoMediaDrm {
@Override
protected Void doInBackground(final Void... params) {
- HttpURLConnection urlConnection = null;
- BufferedReader in = null;
- try {
- final URI finalURI = new URI(mURL + "&signedRequest=" + URLEncoder.encode(new String(mDrmRequest), "UTF-8"));
- urlConnection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(finalURI);
- urlConnection.setRequestMethod("POST");
- if (DEBUG) Log.d(LOGTAG, "Provisioning, posting url =" + finalURI.toString());
-
- // Add data
- urlConnection.setRequestProperty("Accept", "*/*");
- urlConnection.setRequestProperty("User-Agent", getCDMUserAgent());
- urlConnection.setRequestProperty("Content-Type", "application/json");
-
- // Execute HTTP Post Request
- urlConnection.connect();
-
- final int responseCode = urlConnection.getResponseCode();
- if (responseCode == HttpURLConnection.HTTP_OK) {
- in = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), UTF_8));
- String inputLine;
- final StringBuffer response = new StringBuffer();
-
- while ((inputLine = in.readLine()) != null) {
- response.append(inputLine);
- }
- in.close();
- mResponseBody = String.valueOf(response).getBytes(UTF_8);
- if (DEBUG) Log.d(LOGTAG, "Provisioning, response received.");
- if (mResponseBody != null) Log.d(LOGTAG, "response length=" + mResponseBody.length);
- } else {
- Log.d(LOGTAG, "Provisioning, server returned HTTP error code :" + responseCode);
- }
- } catch (final IOException e) {
- Log.e(LOGTAG, "Got exception during posting provisioning request ...", e);
- } catch (final URISyntaxException e) {
- Log.e(LOGTAG, "Got exception during creating uri ...", e);
- } finally {
- if (urlConnection != null) {
- urlConnection.disconnect();
- }
- try {
- if (in != null) {
- in.close();
- }
- } catch (final IOException e) {
- Log.e(LOGTAG, "Exception during closing in ...", e);
- }
- }
+ Log.i(LOGTAG, "This is Tor Browser. Skipping.");
return null;
}
diff --git a/mobile/android/geckoview/src/thirdparty/java/org/mozilla/thirdparty/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java b/mobile/android/geckoview/src/thirdparty/java/org/mozilla/thirdparty/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
index 6e5095b0a4c9..a585e283ed4e 100644
--- a/mobile/android/geckoview/src/thirdparty/java/org/mozilla/thirdparty/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
+++ b/mobile/android/geckoview/src/thirdparty/java/org/mozilla/thirdparty/com/google/android/exoplayer2/upstream/DefaultHttpDataSource.java
@@ -46,6 +46,7 @@ import java.util.regex.Pattern;
import java.util.zip.GZIPInputStream;
import org.mozilla.gecko.util.ProxySelector;
+
/**
* An {@link HttpDataSource} that uses Android's {@link HttpURLConnection}.
*
@@ -516,50 +517,8 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
boolean followRedirects,
Map<String, String> requestParameters)
throws IOException, URISyntaxException {
- /**
- * Tor Project modified the way the connection object was created. For the sake of
- * simplicity, instead of duplicating the whole file we changed the connection object
- * to use the ProxySelector.
- */
- HttpURLConnection connection = (HttpURLConnection) ProxySelector.openConnectionWithProxy(url.toURI());
-
- connection.setConnectTimeout(connectTimeoutMillis);
- connection.setReadTimeout(readTimeoutMillis);
-
- Map<String, String> requestHeaders = new HashMap<>();
- if (defaultRequestProperties != null) {
- requestHeaders.putAll(defaultRequestProperties.getSnapshot());
- }
- requestHeaders.putAll(requestProperties.getSnapshot());
- requestHeaders.putAll(requestParameters);
-
- for (Map.Entry<String, String> property : requestHeaders.entrySet()) {
- connection.setRequestProperty(property.getKey(), property.getValue());
- }
-
- if (!(position == 0 && length == C.LENGTH_UNSET)) {
- String rangeRequest = "bytes=" + position + "-";
- if (length != C.LENGTH_UNSET) {
- rangeRequest += (position + length - 1);
- }
- connection.setRequestProperty("Range", rangeRequest);
- }
- connection.setRequestProperty("User-Agent", userAgent);
- connection.setRequestProperty("Accept-Encoding", allowGzip ? "gzip" : "identity");
- connection.setInstanceFollowRedirects(followRedirects);
- connection.setDoOutput(httpBody != null);
- connection.setRequestMethod(DataSpec.getStringForHttpMethod(httpMethod));
-
- if (httpBody != null) {
- connection.setFixedLengthStreamingMode(httpBody.length);
- connection.connect();
- OutputStream os = connection.getOutputStream();
- os.write(httpBody);
- os.close();
- } else {
- connection.connect();
- }
- return connection;
+ Log.i(TAG, "This is Tor Browser. Skipping.");
+ throw new IOException();
}
/** Creates an {@link HttpURLConnection} that is connected with the {@code url}. */
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 7354cfaccd8cabba9daa93126ece4543d03247cb
Author: Amogh Pradeep <amoghbl1(a)gmail.com>
Date: Fri Jun 12 02:07:45 2015 -0400
Orfox: Centralized proxy applied to AbstractCommunicator and BaseResources.
See Bug 1357997 for partial uplift.
Also:
Bug 28051 - Use our Orbot for proxying our connections
Bug 31144 - ESR68 Network Code Review
---
.../java/org/mozilla/gecko/util/ProxySelector.java | 25 +++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
index dbd07a069de1..800c7cf96de8 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/gecko/util/ProxySelector.java
@@ -29,6 +29,10 @@ import java.net.URLConnection;
import java.util.List;
public class ProxySelector {
+ private static final String TOR_PROXY_ADDRESS = "127.0.0.1";
+ private static final int TOR_SOCKS_PROXY_PORT = 9150;
+ private static final int TOR_HTTP_PROXY_PORT = 8218;
+
public static URLConnection openConnectionWithProxy(final URI uri) throws IOException {
final java.net.ProxySelector ps = java.net.ProxySelector.getDefault();
Proxy proxy = Proxy.NO_PROXY;
@@ -39,7 +43,26 @@ public class ProxySelector {
}
}
- return uri.toURL().openConnection(proxy);
+ /* Ignore the proxy we found from the VM, only use Tor. We can probably
+ * safely use the logic in this class in the future. */
+ return uri.toURL().openConnection(getProxy());
+ }
+
+ public static Proxy getProxy() {
+ // TODO make configurable
+ return new Proxy(Proxy.Type.SOCKS, new InetSocketAddress(TOR_PROXY_ADDRESS, TOR_SOCKS_PROXY_PORT));
+ }
+
+ public static String getProxyHostAddress() {
+ return TOR_PROXY_ADDRESS;
+ }
+
+ public static int getSocksProxyPort() {
+ return TOR_SOCKS_PROXY_PORT;
+ }
+
+ public static int getHttpProxyPort() {
+ return TOR_HTTP_PROXY_PORT;
}
public ProxySelector() {
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 33342: Avoid disconnect search addon error after removal.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 83bb34ac32b22bf60f65a1a09994edc01829e811
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Mar 13 18:19:30 2020 +0100
Bug 33342: Avoid disconnect search addon error after removal.
We removed the addon in #32767, but it was still being loaded
from addonStartup.json.lz4 and throwing an error on startup
because its resource: location is not available anymore.
---
toolkit/mozapps/extensions/internal/XPIProvider.jsm | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index 939dd6a70b24..ddf6f0049054 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -959,6 +959,12 @@ var BuiltInLocation = new (class _BuiltInLocation extends XPIStateLocation {
isLinkedAddon(/* aId */) {
return false;
}
+
+ restore(saved) {
+ super.restore(saved);
+ // Bug 33342: avoid restoring disconnect addon from addonStartup.json.lz4.
+ this.removeAddon("disconnect(a)search.mozilla.org");
+ }
})();
/**
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 28005: Implement .onion alias urlbar rewrites
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit e7238b08ea167aab89b335c1f775690df02daaf6
Author: Alex Catarineu <acat(a)torproject.org>
Date: Thu Feb 13 13:24:33 2020 +0100
Bug 28005: Implement .onion alias urlbar rewrites
A custom HTTPS Everywhere update channel is installed,
which provides rules for locally redirecting some memorable
.tor.onion URLs to non-memorable .onion URLs.
When these redirects occur, we also rewrite the URL in the urlbar
to display the human-memorable hostname instead of the actual
.onion.
Bug 34196: Update site info URL with the onion name
---
browser/actors/ClickHandlerChild.jsm | 20 ++
browser/actors/ClickHandlerParent.jsm | 1 +
browser/actors/ContextMenuChild.jsm | 4 +
browser/base/content/browser-places.js | 12 +-
browser/base/content/browser-siteIdentity.js | 12 +-
browser/base/content/browser.js | 43 ++++-
browser/base/content/nsContextMenu.js | 18 ++
browser/base/content/pageinfo/pageInfo.js | 2 +-
browser/base/content/pageinfo/pageInfo.xhtml | 10 +
browser/base/content/pageinfo/security.js | 17 +-
browser/base/content/tabbrowser.js | 7 +
browser/base/content/utilityOverlay.js | 12 ++
browser/components/BrowserGlue.jsm | 8 +
.../onionservices/ExtensionMessaging.jsm | 77 ++++++++
.../onionservices/HttpsEverywhereControl.jsm | 119 ++++++++++++
.../components/onionservices/OnionAliasStore.jsm | 201 +++++++++++++++++++++
browser/components/onionservices/moz.build | 6 +
browser/components/urlbar/UrlbarInput.jsm | 13 +-
docshell/base/nsDocShell.cpp | 52 ++++++
docshell/base/nsDocShell.h | 6 +
docshell/base/nsDocShellLoadState.cpp | 8 +
docshell/base/nsIDocShell.idl | 5 +
docshell/base/nsIWebNavigation.idl | 5 +
docshell/shistory/SessionHistoryEntry.cpp | 14 ++
docshell/shistory/SessionHistoryEntry.h | 1 +
docshell/shistory/nsISHEntry.idl | 5 +
docshell/shistory/nsSHEntry.cpp | 22 ++-
docshell/shistory/nsSHEntry.h | 1 +
dom/interfaces/base/nsIBrowser.idl | 3 +-
dom/ipc/BrowserChild.cpp | 2 +
dom/ipc/BrowserParent.cpp | 3 +-
dom/ipc/PBrowser.ipdl | 1 +
modules/libpref/init/StaticPrefList.yaml | 6 +
netwerk/dns/effective_tld_names.dat | 2 +
netwerk/ipc/DocumentLoadListener.cpp | 10 +
toolkit/content/widgets/browser-custom-element.js | 13 +-
toolkit/modules/sessionstore/SessionHistory.jsm | 5 +
xpcom/reflect/xptinfo/xptinfo.h | 3 +-
38 files changed, 726 insertions(+), 23 deletions(-)
diff --git a/browser/actors/ClickHandlerChild.jsm b/browser/actors/ClickHandlerChild.jsm
index 4f5c2b0b7ea1..3ba2f11bf362 100644
--- a/browser/actors/ClickHandlerChild.jsm
+++ b/browser/actors/ClickHandlerChild.jsm
@@ -114,6 +114,26 @@ class ClickHandlerChild extends JSWindowActorChild {
json.originStoragePrincipal = ownerDoc.effectiveStoragePrincipal;
json.triggeringPrincipal = ownerDoc.nodePrincipal;
+ // Check if the link needs to be opened with .tor.onion urlbar rewrites
+ // allowed. Only when the owner doc has onionUrlbarRewritesAllowed = true
+ // and the same origin we should allow this.
+ json.onionUrlbarRewritesAllowed = false;
+ if (this.docShell.onionUrlbarRewritesAllowed) {
+ const sm = Services.scriptSecurityManager;
+ try {
+ let targetURI = Services.io.newURI(href);
+ let isPrivateWin =
+ ownerDoc.nodePrincipal.originAttributes.privateBrowsingId > 0;
+ sm.checkSameOriginURI(
+ docshell.currentDocumentChannel.URI,
+ targetURI,
+ false,
+ isPrivateWin
+ );
+ json.onionUrlbarRewritesAllowed = true;
+ } catch (e) {}
+ }
+
// If a link element is clicked with middle button, user wants to open
// the link somewhere rather than pasting clipboard content. Therefore,
// when it's clicked with middle button, we should prevent multiple
diff --git a/browser/actors/ClickHandlerParent.jsm b/browser/actors/ClickHandlerParent.jsm
index 0f658fccf7b8..ad8f6c2a27e2 100644
--- a/browser/actors/ClickHandlerParent.jsm
+++ b/browser/actors/ClickHandlerParent.jsm
@@ -98,6 +98,7 @@ class ClickHandlerParent extends JSWindowActorParent {
let params = {
charset: browser.characterSet,
referrerInfo: E10SUtils.deserializeReferrerInfo(data.referrerInfo),
+ onionUrlbarRewritesAllowed: data.onionUrlbarRewritesAllowed,
isContentWindowPrivate: data.isContentWindowPrivate,
originPrincipal: data.originPrincipal,
originStoragePrincipal: data.originStoragePrincipal,
diff --git a/browser/actors/ContextMenuChild.jsm b/browser/actors/ContextMenuChild.jsm
index a286eafe0f6d..d332cb41acc8 100644
--- a/browser/actors/ContextMenuChild.jsm
+++ b/browser/actors/ContextMenuChild.jsm
@@ -545,6 +545,9 @@ class ContextMenuChild extends JSWindowActorChild {
doc.defaultView
).getFieldContext(aEvent.composedTarget);
+ let parentAllowsOnionUrlbarRewrites = this.docShell
+ .onionUrlbarRewritesAllowed;
+
let disableSetDesktopBackground = null;
// Media related cache info parent needs for saving
@@ -656,6 +659,7 @@ class ContextMenuChild extends JSWindowActorChild {
frameID,
frameBrowsingContextID,
disableSetDesktopBackground,
+ parentAllowsOnionUrlbarRewrites,
};
if (context.inFrame && !context.inSrcdocFrame) {
diff --git a/browser/base/content/browser-places.js b/browser/base/content/browser-places.js
index a73e2090bbee..cb8fbeab9bf4 100644
--- a/browser/base/content/browser-places.js
+++ b/browser/base/content/browser-places.js
@@ -470,7 +470,8 @@ var PlacesCommandHook = {
*/
async bookmarkPage() {
let browser = gBrowser.selectedBrowser;
- let url = new URL(browser.currentURI.spec);
+ const uri = browser.currentOnionAliasURI || browser.currentURI;
+ let url = new URL(uri.spec);
let info = await PlacesUtils.bookmarks.fetch({ url });
let isNewBookmark = !info;
let showEditUI = !isNewBookmark || StarUI.showForNewBookmarks;
@@ -581,7 +582,7 @@ var PlacesCommandHook = {
tabs.forEach(tab => {
let browser = tab.linkedBrowser;
- let uri = browser.currentURI;
+ let uri = browser.currentOnionAliasURI || browser.currentURI;
let title = browser.contentTitle || tab.label;
let spec = uri.spec;
if (!(spec in uniquePages)) {
@@ -1828,14 +1829,17 @@ var BookmarkingUI = {
},
onLocationChange: function BUI_onLocationChange() {
- if (this._uri && gBrowser.currentURI.equals(this._uri)) {
+ const uri =
+ gBrowser.selectedBrowser.currentOnionAliasURI || gBrowser.currentURI;
+ if (this._uri && uri.equals(this._uri)) {
return;
}
this.updateStarState();
},
updateStarState: function BUI_updateStarState() {
- this._uri = gBrowser.currentURI;
+ this._uri =
+ gBrowser.selectedBrowser.currentOnionAliasURI || gBrowser.currentURI;
this._itemGuids.clear();
let guids = new Set();
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 7c9a91ed5af1..7c132668f6b4 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -658,13 +658,13 @@ var gIdentityHandler = {
* nsIURI for which the identity UI should be displayed, already
* processed by createExposableURI.
*/
- updateIdentity(state, uri) {
+ updateIdentity(state, uri, onionAliasURI) {
let shouldHidePopup = this._uri && this._uri.spec != uri.spec;
this._state = state;
// Firstly, populate the state properties required to display the UI. See
// the documentation of the individual properties for details.
- this.setURI(uri);
+ this.setURI(uri, onionAliasURI);
this._secInfo = gBrowser.securityUI.secInfo;
this._isSecureContext = gBrowser.securityUI.isSecureContext;
@@ -687,17 +687,18 @@ var gIdentityHandler = {
* Attempt to provide proper IDN treatment for host names
*/
getEffectiveHost() {
+ let uri = this._onionAliasURI || this._uri;
if (!this._IDNService) {
this._IDNService = Cc["@mozilla.org/network/idn-service;1"].getService(
Ci.nsIIDNService
);
}
try {
- return this._IDNService.convertToDisplayIDN(this._uri.host, {});
+ return this._IDNService.convertToDisplayIDN(uri.host, {});
} catch (e) {
// If something goes wrong (e.g. host is an IP address) just fail back
// to the full domain.
- return this._uri.host;
+ return uri.host;
}
},
@@ -1140,11 +1141,12 @@ var gIdentityHandler = {
this._identityPopupContentVerif.textContent = verifier;
},
- setURI(uri) {
+ setURI(uri, onionAliasURI) {
if (uri.schemeIs("view-source")) {
uri = Services.io.newURI(uri.spec.replace(/^view-source:/i, ""));
}
this._uri = uri;
+ this._onionAliasURI = onionAliasURI;
try {
// Account for file: urls and catch when "" is the value
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 501519db864e..7103cd2c374b 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -82,6 +82,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
TabCrashHandler: "resource:///modules/ContentCrashHandlers.jsm",
TelemetryEnvironment: "resource://gre/modules/TelemetryEnvironment.jsm",
Translation: "resource:///modules/translation/TranslationParent.jsm",
+ OnionAliasStore: "resource:///modules/OnionAliasStore.jsm",
UITour: "resource:///modules/UITour.jsm",
UpdateUtils: "resource://gre/modules/UpdateUtils.jsm",
UrlbarInput: "resource:///modules/UrlbarInput.jsm",
@@ -2286,6 +2287,7 @@ var gBrowserInit = {
// [9]: allowInheritPrincipal (bool)
// [10]: csp (nsIContentSecurityPolicy)
// [11]: nsOpenWindowInfo
+ // [12]: onionUrlbarRewritesAllowed (bool)
let userContextId =
window.arguments[5] != undefined
? window.arguments[5]
@@ -2305,7 +2307,8 @@ var gBrowserInit = {
// TODO fix allowInheritPrincipal to default to false.
// Default to true unless explicitly set to false because of bug 1475201.
window.arguments[9] !== false,
- window.arguments[10]
+ window.arguments[10],
+ window.arguments[12]
);
window.focus();
} else {
@@ -3085,7 +3088,8 @@ function loadURI(
forceAboutBlankViewerInCurrent,
triggeringPrincipal,
allowInheritPrincipal = false,
- csp = null
+ csp = null,
+ onionUrlbarRewritesAllowed = false
) {
if (!triggeringPrincipal) {
throw new Error("Must load with a triggering Principal");
@@ -3103,6 +3107,7 @@ function loadURI(
csp,
forceAboutBlankViewerInCurrent,
allowInheritPrincipal,
+ onionUrlbarRewritesAllowed,
});
} catch (e) {
Cu.reportError(e);
@@ -5227,11 +5232,24 @@ var XULBrowserWindow = {
this.reloadCommand.removeAttribute("disabled");
}
+ // The onion memorable alias needs to be used in gURLBar.setURI, but also in
+ // other parts of the code (like the bookmarks UI), so we save it.
+ if (gBrowser.selectedBrowser.onionUrlbarRewritesAllowed) {
+ gBrowser.selectedBrowser.currentOnionAliasURI = OnionAliasStore.getShortURI(
+ aLocationURI
+ );
+ } else {
+ gBrowser.selectedBrowser.currentOnionAliasURI = null;
+ }
+
// We want to update the popup visibility if we received this notification
// via simulated locationchange events such as switching between tabs, however
// if this is a document navigation then PopupNotifications will be updated
// via TabsProgressListener.onLocationChange and we do not want it called twice
- gURLBar.setURI(aLocationURI, aIsSimulated);
+ gURLBar.setURI(
+ gBrowser.selectedBrowser.currentOnionAliasURI || aLocationURI,
+ aIsSimulated
+ );
BookmarkingUI.onLocationChange();
// If we've actually changed document, update the toolbar visibility.
@@ -5426,6 +5444,7 @@ var XULBrowserWindow = {
// Don't need to do anything if the data we use to update the UI hasn't
// changed
let uri = gBrowser.currentURI;
+ let onionAliasURI = gBrowser.selectedBrowser.currentOnionAliasURI;
let spec = uri.spec;
let isSecureContext = gBrowser.securityUI.isSecureContext;
if (
@@ -5449,7 +5468,7 @@ var XULBrowserWindow = {
try {
uri = Services.io.createExposableURI(uri);
} catch (e) {}
- gIdentityHandler.updateIdentity(this._state, uri);
+ gIdentityHandler.updateIdentity(this._state, uri, onionAliasURI);
},
// simulate all change notifications after switching tabs
@@ -6956,6 +6975,21 @@ function handleLinkClick(event, href, linkNode) {
return true;
}
+ // Check if the link needs to be opened with .tor.onion urlbar rewrites
+ // allowed. Only when the owner doc has onionUrlbarRewritesAllowed = true
+ // and the same origin we should allow this.
+ let persistOnionUrlbarRewritesAllowedInChildTab = false;
+ if (where == "tab" && gBrowser.docShell.onionUrlbarRewritesAllowed) {
+ const sm = Services.scriptSecurityManager;
+ try {
+ let tURI = makeURI(href);
+ let isPrivateWin =
+ doc.nodePrincipal.originAttributes.privateBrowsingId > 0;
+ sm.checkSameOriginURI(doc.documentURIObject, tURI, false, isPrivateWin);
+ persistOnionUrlbarRewritesAllowedInChildTab = true;
+ } catch (e) {}
+ }
+
let frameID = WebNavigationFrames.getFrameId(doc.defaultView);
urlSecurityCheck(href, doc.nodePrincipal);
@@ -6967,6 +7001,7 @@ function handleLinkClick(event, href, linkNode) {
triggeringPrincipal: doc.nodePrincipal,
csp: doc.csp,
frameID,
+ onionUrlbarRewritesAllowed: persistOnionUrlbarRewritesAllowedInChildTab,
};
// The new tab/window must use the same userContextId
diff --git a/browser/base/content/nsContextMenu.js b/browser/base/content/nsContextMenu.js
index f84f5fb7d028..c6b1257e45be 100644
--- a/browser/base/content/nsContextMenu.js
+++ b/browser/base/content/nsContextMenu.js
@@ -57,6 +57,7 @@ function openContextMenu(aMessage, aBrowser, aActor) {
selectionInfo: data.selectionInfo,
disableSetDesktopBackground: data.disableSetDesktopBackground,
loginFillInfo: data.loginFillInfo,
+ parentAllowsOnionUrlbarRewrites: data.parentAllowsOnionUrlbarRewrites,
userContextId: data.userContextId,
webExtContextData: data.webExtContextData,
cookieJarSettings: E10SUtils.deserializeCookieJarSettings(
@@ -1195,6 +1196,7 @@ class nsContextMenu {
triggeringPrincipal: this.principal,
csp: this.csp,
frameID: this.contentData.frameID,
+ onionUrlbarRewritesAllowed: false,
};
for (let p in extra) {
params[p] = extra[p];
@@ -1218,6 +1220,22 @@ class nsContextMenu {
}
params.referrerInfo = referrerInfo;
+
+ // Check if the link needs to be opened with .tor.onion urlbar rewrites
+ // allowed. Only when parent has onionUrlbarRewritesAllowed = true
+ // and the same origin we should allow this.
+ if (this.contentData.parentAllowsOnionUrlbarRewrites) {
+ let referrerURI = this.contentData.documentURIObject;
+ const sm = Services.scriptSecurityManager;
+ try {
+ let targetURI = this.linkURI;
+ let isPrivateWin =
+ this.browser.contentPrincipal.originAttributes.privateBrowsingId > 0;
+ sm.checkSameOriginURI(referrerURI, targetURI, false, isPrivateWin);
+ params.onionUrlbarRewritesAllowed = true;
+ } catch (e) {}
+ }
+
return params;
}
diff --git a/browser/base/content/pageinfo/pageInfo.js b/browser/base/content/pageinfo/pageInfo.js
index f63ee0a457e1..ae152f97f7b3 100644
--- a/browser/base/content/pageinfo/pageInfo.js
+++ b/browser/base/content/pageinfo/pageInfo.js
@@ -398,7 +398,7 @@ async function onNonMediaPageInfoLoad(browser, pageInfoData, imageInfo) {
);
}
onLoadPermission(uri, principal);
- securityOnLoad(uri, windowInfo);
+ securityOnLoad(uri, windowInfo, browser.currentOnionAliasURI);
}
function resetPageInfo(args) {
diff --git a/browser/base/content/pageinfo/pageInfo.xhtml b/browser/base/content/pageinfo/pageInfo.xhtml
index f40ffd3778d8..a23f2bb5748c 100644
--- a/browser/base/content/pageinfo/pageInfo.xhtml
+++ b/browser/base/content/pageinfo/pageInfo.xhtml
@@ -312,6 +312,16 @@
<input id="security-identity-domain-value" readonly="readonly"/>
</td>
</tr>
+ <!-- Onion Alias -->
+ <tr id="security-view-identity-onionalias-row">
+ <th>
+ <xul:label id="security-view-identity-onionalias"
+ control="security-view-identity-onionalias-value"/>
+ </th>
+ <td>
+ <input id="security-view-identity-onionalias-value" readonly="true"/>
+ </td>
+ </tr>
<!-- Owner -->
<tr>
<th>
diff --git a/browser/base/content/pageinfo/security.js b/browser/base/content/pageinfo/security.js
index 192e9f763700..7693a0304823 100644
--- a/browser/base/content/pageinfo/security.js
+++ b/browser/base/content/pageinfo/security.js
@@ -249,7 +249,7 @@ var security = {
},
};
-async function securityOnLoad(uri, windowInfo) {
+async function securityOnLoad(uri, windowInfo, onionAliasURI) {
await security.init(uri, windowInfo);
let info = security.securityInfo;
@@ -262,6 +262,21 @@ async function securityOnLoad(uri, windowInfo) {
}
document.getElementById("securityTab").hidden = false;
+ if (onionAliasURI) {
+ setText(
+ "security-view-identity-onionalias",
+ gTorButtonBundle.GetStringFromName("pageInfo_OnionName")
+ );
+ setText("security-view-identity-onionalias-value", onionAliasURI.host);
+ document.getElementById(
+ "security-view-identity-onionalias-row"
+ ).hidden = false;
+ } else {
+ document.getElementById(
+ "security-view-identity-onionalias-row"
+ ).hidden = true;
+ }
+
/* Set Identity section text */
setText("security-identity-domain-value", windowInfo.hostName);
diff --git a/browser/base/content/tabbrowser.js b/browser/base/content/tabbrowser.js
index 0081810bd43e..d1457a6638b7 100644
--- a/browser/base/content/tabbrowser.js
+++ b/browser/base/content/tabbrowser.js
@@ -1647,6 +1647,7 @@
var aFromExternal;
var aRelatedToCurrent;
var aAllowInheritPrincipal;
+ var aOnionUrlbarRewritesAllowed;
var aSkipAnimation;
var aForceNotRemote;
var aPreferredRemoteType;
@@ -1676,6 +1677,7 @@
aFromExternal = params.fromExternal;
aRelatedToCurrent = params.relatedToCurrent;
aAllowInheritPrincipal = !!params.allowInheritPrincipal;
+ aOnionUrlbarRewritesAllowed = params.onionUrlbarRewritesAllowed;
aSkipAnimation = params.skipAnimation;
aForceNotRemote = params.forceNotRemote;
aPreferredRemoteType = params.preferredRemoteType;
@@ -1716,6 +1718,7 @@
fromExternal: aFromExternal,
relatedToCurrent: aRelatedToCurrent,
skipAnimation: aSkipAnimation,
+ onionUrlbarRewritesAllowed: aOnionUrlbarRewritesAllowed,
forceNotRemote: aForceNotRemote,
createLazyBrowser: aCreateLazyBrowser,
preferredRemoteType: aPreferredRemoteType,
@@ -2548,6 +2551,7 @@
aURI,
{
allowInheritPrincipal,
+ onionUrlbarRewritesAllowed,
allowThirdPartyFixup,
bulkOrderedOpen,
charset,
@@ -2888,6 +2892,9 @@
// lands.
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_FIRST_LOAD;
}
+ if (onionUrlbarRewritesAllowed) {
+ flags |= Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES;
+ }
if (!allowInheritPrincipal) {
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_DISALLOW_INHERIT_PRINCIPAL;
}
diff --git a/browser/base/content/utilityOverlay.js b/browser/base/content/utilityOverlay.js
index 78eb18a203fd..342a92a766a4 100644
--- a/browser/base/content/utilityOverlay.js
+++ b/browser/base/content/utilityOverlay.js
@@ -367,6 +367,7 @@ function openLinkIn(url, where, params) {
: new ReferrerInfo(Ci.nsIReferrerInfo.EMPTY, true, null);
var aRelatedToCurrent = params.relatedToCurrent;
var aAllowInheritPrincipal = !!params.allowInheritPrincipal;
+ var aOnionUrlbarRewritesAllowed = params.onionUrlbarRewritesAllowed;
var aForceAllowDataURI = params.forceAllowDataURI;
var aInBackground = params.inBackground;
var aInitiatingDoc = params.initiatingDoc;
@@ -483,6 +484,11 @@ function openLinkIn(url, where, params) {
].createInstance(Ci.nsISupportsPRBool);
allowThirdPartyFixupSupports.data = aAllowThirdPartyFixup;
+ var onionUrlbarRewritesAllowed = Cc[
+ "@mozilla.org/supports-PRBool;1"
+ ].createInstance(Ci.nsISupportsPRBool);
+ onionUrlbarRewritesAllowed.data = aOnionUrlbarRewritesAllowed;
+
var userContextIdSupports = Cc[
"@mozilla.org/supports-PRUint32;1"
].createInstance(Ci.nsISupportsPRUint32);
@@ -499,6 +505,8 @@ function openLinkIn(url, where, params) {
sa.appendElement(aTriggeringPrincipal);
sa.appendElement(null); // allowInheritPrincipal
sa.appendElement(aCsp);
+ sa.appendElement(null); // nsOpenWindowInfo
+ sa.appendElement(onionUrlbarRewritesAllowed);
const sourceWindow = w || window;
let win;
@@ -616,6 +624,9 @@ function openLinkIn(url, where, params) {
if (aForceAllowDataURI) {
flags |= Ci.nsIWebNavigation.LOAD_FLAGS_FORCE_ALLOW_DATA_URI;
}
+ if (aOnionUrlbarRewritesAllowed) {
+ flags |= Ci.nsIWebNavigation.LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES;
+ }
let { URI_INHERITS_SECURITY_CONTEXT } = Ci.nsIProtocolHandler;
if (
@@ -662,6 +673,7 @@ function openLinkIn(url, where, params) {
allowThirdPartyFixup: aAllowThirdPartyFixup,
relatedToCurrent: aRelatedToCurrent,
skipAnimation: aSkipTabAnimation,
+ onionUrlbarRewritesAllowed: aOnionUrlbarRewritesAllowed,
userContextId: aUserContextId,
originPrincipal: aPrincipal,
originStoragePrincipal: aStoragePrincipal,
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 6186479ac306..5b320bd989f0 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -86,6 +86,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
TabUnloader: "resource:///modules/TabUnloader.jsm",
TelemetryUtils: "resource://gre/modules/TelemetryUtils.jsm",
TRRRacer: "resource:///modules/TRRPerformance.jsm",
+ OnionAliasStore: "resource:///modules/OnionAliasStore.jsm",
UIState: "resource://services-sync/UIState.jsm",
UrlbarQuickSuggest: "resource:///modules/UrlbarQuickSuggest.jsm",
UrlbarPrefs: "resource:///modules/UrlbarPrefs.jsm",
@@ -1933,6 +1934,7 @@ BrowserGlue.prototype = {
Normandy.uninit();
RFPHelper.uninit();
ASRouterNewTabHook.destroy();
+ OnionAliasStore.uninit();
},
// Set up a listener to enable/disable the screenshots extension
@@ -2422,6 +2424,12 @@ BrowserGlue.prototype = {
},
},
+ {
+ task: () => {
+ OnionAliasStore.init();
+ },
+ },
+
{
task: () => {
Blocklist.loadBlocklistAsync();
diff --git a/browser/components/onionservices/ExtensionMessaging.jsm b/browser/components/onionservices/ExtensionMessaging.jsm
new file mode 100644
index 000000000000..c93b8c6edf85
--- /dev/null
+++ b/browser/components/onionservices/ExtensionMessaging.jsm
@@ -0,0 +1,77 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+const EXPORTED_SYMBOLS = ["ExtensionMessaging"];
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { ExtensionUtils } = ChromeUtils.import(
+ "resource://gre/modules/ExtensionUtils.jsm"
+);
+const { MessageChannel } = ChromeUtils.import(
+ "resource://gre/modules/MessageChannel.jsm"
+);
+const { AddonManager } = ChromeUtils.import(
+ "resource://gre/modules/AddonManager.jsm"
+);
+
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ ExtensionParent: "resource://gre/modules/ExtensionParent.jsm",
+});
+
+class ExtensionMessaging {
+ constructor() {
+ this._callback = null;
+ this._handlers = new Map();
+ this._messageManager = Services.cpmm;
+ }
+
+ async sendMessage(message, extensionId) {
+ const addon = await AddonManager.getAddonByID(extensionId);
+ if (!addon) {
+ throw new Error(`extension '${extensionId} does not exist`);
+ }
+ await addon.startupPromise;
+
+ const { torSendExtensionMessage } = ExtensionParent;
+ return torSendExtensionMessage(extensionId, message);
+ }
+
+ unload() {
+ if (this._callback) {
+ this._handlers.clear();
+ this._messageManager.removeMessageListener(
+ "MessageChannel:Response",
+ this._callback
+ );
+ this._callback = null;
+ }
+ }
+
+ _onMessage({ data }) {
+ const channelId = data.messageName;
+ if (this._handlers.has(channelId)) {
+ const { resolve, reject } = this._handlers.get(channelId);
+ this._handlers.delete(channelId);
+ if (data.error) {
+ reject(new Error(data.error.message));
+ } else {
+ resolve(data.value);
+ }
+ }
+ }
+
+ _init() {
+ if (this._callback === null) {
+ this._callback = this._onMessage.bind(this);
+ this._messageManager.addMessageListener(
+ "MessageChannel:Response",
+ this._callback
+ );
+ }
+ }
+}
diff --git a/browser/components/onionservices/HttpsEverywhereControl.jsm b/browser/components/onionservices/HttpsEverywhereControl.jsm
new file mode 100644
index 000000000000..60c3b5fca282
--- /dev/null
+++ b/browser/components/onionservices/HttpsEverywhereControl.jsm
@@ -0,0 +1,119 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+const EXPORTED_SYMBOLS = ["HttpsEverywhereControl"];
+
+const { ExtensionMessaging } = ChromeUtils.import(
+ "resource:///modules/ExtensionMessaging.jsm"
+);
+const { setTimeout } = ChromeUtils.import("resource://gre/modules/Timer.jsm");
+
+const EXTENSION_ID = "https-everywhere-eff(a)eff.org";
+const SECUREDROP_TOR_ONION_CHANNEL = {
+ name: "SecureDropTorOnion",
+ jwk: {
+ kty: "RSA",
+ e: "AQAB",
+ n:
+ "p10BbUVc5Xj2S_-MH3bACNBaISo_r9e3PVPyTTjsGsdg2qSXvqUO42fBtpFAy0zUzIGS83v4JjiRdvKJaZTIvbC8AcpymzdsTqujMm8RPTSy3hO_8mXzGa4DEsIB1uNLnUWRBKXvSGCmT9kFyxhTpkYqokNBzafVihTU34tN2Md1xFHnmZGqfYtPtbJLWAa5Z1M11EyR4lIyUxIiPTV9t1XstDbWr3iS83REJrGEFmjG1-BAgx8_lDUTa41799N2yYEhgZud7bL0M3ei8s5OERjiion5uANkUV3-s2QqUZjiVA-XR_HizXjciaUWNd683KqekpNOZ_0STh_UGwpcwU-KwG07QyiCrLrRpz8S_vH8CqGrrcWY3GSzYe9dp34jJdO65oA-G8tK6fMXtvTCFDZI6oNNaXJH71F5J0YbqO2ZqwKYc2WSi0gKVl2wd9roOVjaBmkJqvocntYuNM7t38fDEWHn5KUkmrTbiG68Cy56tDUfpKl3D9Uj4LaMvxJ1tKGvzQ4k_60odT7gIxu6DqYjXUHZpwPsSGBq3njaD7boe4CUXF2K7ViOc87BsKxRNCzDD8OklRjjXzOTOBH3PqFJ93CJ-4ECE5t9STU20aZ8E-2zKB8vjKyCySE4-kcIvBBsnkwVaJTPy9Ft1qYybo-soXEWVEZATANNWklBt8k",
+ },
+ update_path_prefix: "https://securedrop.org/https-everywhere/",
+ scope:
+ "^https?:\\/\\/[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.securedrop\\.tor\\.onion\\/",
+ replaces_default_rulesets: false,
+};
+
+class HttpsEverywhereControl {
+ constructor() {
+ this._extensionMessaging = null;
+ }
+
+ async _sendMessage(type, object) {
+ return this._extensionMessaging.sendMessage(
+ {
+ type,
+ object,
+ },
+ EXTENSION_ID
+ );
+ }
+
+ static async wait(seconds = 1) {
+ return new Promise(resolve => setTimeout(resolve, seconds * 1000));
+ }
+
+ /**
+ * Installs the .tor.onion update channel in https-everywhere
+ */
+ async installTorOnionUpdateChannel(retries = 5) {
+ this._init();
+
+ // TODO: https-everywhere store is initialized asynchronously, so sending a message
+ // immediately results in a `store.get is undefined` error.
+ // For now, let's wait a bit and retry a few times if there is an error, but perhaps
+ // we could suggest https-everywhere to send a message when that happens and listen
+ // for that here.
+ await HttpsEverywhereControl.wait();
+
+ try {
+ // TODO: we may want a way to "lock" this update channel, so that it cannot be modified
+ // by the user via UI, but I think this is not possible at the time of writing via
+ // the existing messages in https-everywhere.
+ await this._sendMessage(
+ "create_update_channel",
+ SECUREDROP_TOR_ONION_CHANNEL.name
+ );
+ } catch (e) {
+ if (retries <= 0) {
+ throw new Error("Could not install SecureDropTorOnion update channel");
+ }
+ await this.installTorOnionUpdateChannel(retries - 1);
+ return;
+ }
+
+ await this._sendMessage(
+ "update_update_channel",
+ SECUREDROP_TOR_ONION_CHANNEL
+ );
+ }
+
+ /**
+ * Returns the .tor.onion rulesets available in https-everywhere
+ */
+ async getTorOnionRules() {
+ return this._sendMessage("get_simple_rules_ending_with", ".tor.onion");
+ }
+
+ /**
+ * Returns the timestamp of the last .tor.onion update channel update.
+ */
+ async getRulesetTimestamp() {
+ const rulesets = await this._sendMessage("get_ruleset_timestamps");
+ const securedrop =
+ rulesets &&
+ rulesets.find(([{ name }]) => name === SECUREDROP_TOR_ONION_CHANNEL.name);
+ if (securedrop) {
+ const [
+ updateChannel, // This has the same structure as SECUREDROP_TOR_ONION_CHANNEL
+ lastUpdatedTimestamp, // An integer, 0 if the update channel was never updated
+ ] = securedrop;
+ void updateChannel; // Ignore eslint unused warning for ruleset
+ return lastUpdatedTimestamp;
+ }
+ return null;
+ }
+
+ unload() {
+ if (this._extensionMessaging) {
+ this._extensionMessaging.unload();
+ this._extensionMessaging = null;
+ }
+ }
+
+ _init() {
+ if (!this._extensionMessaging) {
+ this._extensionMessaging = new ExtensionMessaging();
+ }
+ }
+}
diff --git a/browser/components/onionservices/OnionAliasStore.jsm b/browser/components/onionservices/OnionAliasStore.jsm
new file mode 100644
index 000000000000..66cf569227bf
--- /dev/null
+++ b/browser/components/onionservices/OnionAliasStore.jsm
@@ -0,0 +1,201 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+const EXPORTED_SYMBOLS = ["OnionAliasStore"];
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
+const { setTimeout, clearTimeout } = ChromeUtils.import(
+ "resource://gre/modules/Timer.jsm"
+);
+const { HttpsEverywhereControl } = ChromeUtils.import(
+ "resource:///modules/HttpsEverywhereControl.jsm"
+);
+
+// Logger adapted from CustomizableUI.jsm
+const kPrefOnionAliasDebug = "browser.onionalias.debug";
+XPCOMUtils.defineLazyPreferenceGetter(
+ this,
+ "gDebuggingEnabled",
+ kPrefOnionAliasDebug,
+ false,
+ (pref, oldVal, newVal) => {
+ if (typeof log != "undefined") {
+ log.maxLogLevel = newVal ? "all" : "log";
+ }
+ }
+);
+XPCOMUtils.defineLazyGetter(this, "log", () => {
+ let scope = {};
+ ChromeUtils.import("resource://gre/modules/Console.jsm", scope);
+ let consoleOptions = {
+ maxLogLevel: gDebuggingEnabled ? "all" : "log",
+ prefix: "OnionAlias",
+ };
+ return new scope.ConsoleAPI(consoleOptions);
+});
+
+function observe(topic, callback) {
+ let observer = {
+ observe(aSubject, aTopic, aData) {
+ if (topic === aTopic) {
+ callback(aSubject, aData);
+ }
+ },
+ };
+ Services.obs.addObserver(observer, topic);
+ return () => Services.obs.removeObserver(observer, topic);
+}
+
+class _OnionAliasStore {
+ static get RULESET_CHECK_INTERVAL() {
+ return 1000 * 60; // 1 minute
+ }
+
+ static get RULESET_CHECK_INTERVAL_FAST() {
+ return 1000 * 5; // 5 seconds
+ }
+
+ constructor() {
+ this._onionMap = new Map();
+ this._rulesetTimeout = null;
+ this._removeObserver = () => {};
+ this._canLoadRules = false;
+ this._rulesetTimestamp = null;
+ this._updateChannelInstalled = false;
+ }
+
+ async _periodicRulesetCheck() {
+ // TODO: it would probably be preferable to listen to some message broadcasted by
+ // the https-everywhere extension when some update channel is updated, instead of
+ // polling every N seconds.
+ log.debug("Checking for new rules");
+ const ts = await this.httpsEverywhereControl.getRulesetTimestamp();
+ log.debug(
+ `Found ruleset timestamp ${ts}, current is ${this._rulesetTimestamp}`
+ );
+ if (ts !== this._rulesetTimestamp) {
+ this._rulesetTimestamp = ts;
+ log.debug("New rules found, updating");
+ // We clear the mappings even if we cannot load the rules from https-everywhere,
+ // since we cannot be sure if the stored mappings are correct anymore.
+ this._clear();
+ if (this._canLoadRules) {
+ await this._loadRules();
+ }
+ }
+ // If the timestamp is 0, that means the update channel was not yet updated, so
+ // we schedule a check soon.
+ this._rulesetTimeout = setTimeout(
+ () => this._periodicRulesetCheck(),
+ ts === 0
+ ? _OnionAliasStore.RULESET_CHECK_INTERVAL_FAST
+ : _OnionAliasStore.RULESET_CHECK_INTERVAL
+ );
+ }
+
+ async init() {
+ this.httpsEverywhereControl = new HttpsEverywhereControl();
+
+ // Setup .tor.onion rule loading.
+ // The http observer is a fallback, and is removed in _loadRules() as soon as we are able
+ // to load some rules from HTTPS Everywhere.
+ this._loadHttpObserver();
+ try {
+ await this.httpsEverywhereControl.installTorOnionUpdateChannel();
+ this._updateChannelInstalled = true;
+ await this.httpsEverywhereControl.getTorOnionRules();
+ this._canLoadRules = true;
+ } catch (e) {
+ // Loading rules did not work, probably because "get_simple_rules_ending_with" is not yet
+ // working in https-everywhere. Use an http observer as a fallback for learning the rules.
+ log.debug(`Could not load rules: ${e.message}`);
+ }
+
+ // Setup checker for https-everywhere ruleset updates
+ if (this._updateChannelInstalled) {
+ this._periodicRulesetCheck();
+ }
+ }
+
+ /**
+ * Loads the .tor.onion mappings from https-everywhere.
+ */
+ async _loadRules() {
+ const rules = await this.httpsEverywhereControl.getTorOnionRules();
+ // Remove http observer if we are able to load some rules directly.
+ if (rules.length) {
+ this._removeObserver();
+ this._removeObserver = () => {};
+ }
+ this._clear();
+ log.debug(`Loading ${rules.length} rules`, rules);
+ for (const rule of rules) {
+ // Here we are trusting that the securedrop ruleset follows some conventions so that we can
+ // assume there is a host mapping from `rule.host` to the hostname of the URL in `rule.to`.
+ try {
+ const url = new URL(rule.to);
+ const shortHost = rule.host;
+ const longHost = url.hostname;
+ this._addMapping(shortHost, longHost);
+ } catch (e) {
+ log.error("Could not process rule:", rule);
+ }
+ }
+ }
+
+ /**
+ * Loads a http observer to listen for local redirects for populating
+ * the .tor.onion -> .onion mappings. Should only be used if we cannot ask https-everywhere
+ * directly for the mappings.
+ */
+ _loadHttpObserver() {
+ this._removeObserver = observe("http-on-before-connect", channel => {
+ if (
+ channel.isMainDocumentChannel &&
+ channel.originalURI.host.endsWith(".tor.onion")
+ ) {
+ this._addMapping(channel.originalURI.host, channel.URI.host);
+ }
+ });
+ }
+
+ uninit() {
+ this._clear();
+ this._removeObserver();
+ this._removeObserver = () => {};
+ if (this.httpsEverywhereControl) {
+ this.httpsEverywhereControl.unload();
+ delete this.httpsEverywhereControl;
+ }
+ clearTimeout(this._rulesetTimeout);
+ this._rulesetTimeout = null;
+ this._rulesetTimestamp = null;
+ }
+
+ _clear() {
+ this._onionMap.clear();
+ }
+
+ _addMapping(shortOnionHost, longOnionHost) {
+ this._onionMap.set(longOnionHost, shortOnionHost);
+ }
+
+ getShortURI(onionURI) {
+ if (
+ (onionURI.schemeIs("http") || onionURI.schemeIs("https")) &&
+ this._onionMap.has(onionURI.host)
+ ) {
+ return onionURI
+ .mutate()
+ .setHost(this._onionMap.get(onionURI.host))
+ .finalize();
+ }
+ return null;
+ }
+}
+
+let OnionAliasStore = new _OnionAliasStore();
diff --git a/browser/components/onionservices/moz.build b/browser/components/onionservices/moz.build
index 2661ad7cb9f3..815685322024 100644
--- a/browser/components/onionservices/moz.build
+++ b/browser/components/onionservices/moz.build
@@ -1 +1,7 @@
JAR_MANIFESTS += ["jar.mn"]
+
+EXTRA_JS_MODULES += [
+ "ExtensionMessaging.jsm",
+ "HttpsEverywhereControl.jsm",
+ "OnionAliasStore.jsm",
+]
diff --git a/browser/components/urlbar/UrlbarInput.jsm b/browser/components/urlbar/UrlbarInput.jsm
index e448f6f7ba83..827ea6f19128 100644
--- a/browser/components/urlbar/UrlbarInput.jsm
+++ b/browser/components/urlbar/UrlbarInput.jsm
@@ -330,7 +330,10 @@ class UrlbarInput {
// bar if the user has deleted the URL and we'd just put the same URL
// back. See bug 304198.
if (value === null) {
- uri = uri || this.window.gBrowser.currentURI;
+ uri =
+ uri ||
+ this.window.gBrowser.selectedBrowser.currentOnionAliasURI ||
+ this.window.gBrowser.currentURI;
// Strip off usernames and passwords for the location bar
try {
uri = Services.io.createExposableURI(uri);
@@ -2100,7 +2103,13 @@ class UrlbarInput {
}
let uri;
- if (this.getAttribute("pageproxystate") == "valid") {
+ // When we rewrite .onion to an alias, gBrowser.currentURI will be different than
+ // the URI displayed in the urlbar. We need to use the urlbar value to copy the
+ // alias instead of the actual .onion URI that is loaded.
+ if (
+ this.getAttribute("pageproxystate") == "valid" &&
+ !this.window.gBrowser.selectedBrowser.currentOnionAliasURI
+ ) {
uri = this.window.gBrowser.currentURI;
} else {
// The value could be:
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index 94ceeb67f301..3f5c8eab97b3 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -5993,6 +5993,10 @@ void nsDocShell::OnRedirectStateChange(nsIChannel* aOldChannel,
return;
}
+ if (!mOnionUrlbarRewritesAllowed && IsTorOnionRedirect(oldURI, newURI)) {
+ mOnionUrlbarRewritesAllowed = true;
+ }
+
// DocumentChannel adds redirect chain to global history in the parent
// process. The redirect chain can't be queried from the content process, so
// there's no need to update global history here.
@@ -9405,6 +9409,20 @@ static bool NavigationShouldTakeFocus(nsDocShell* aDocShell,
return !Preferences::GetBool("browser.tabs.loadDivertedInBackground", false);
}
+/* static */
+bool nsDocShell::IsTorOnionRedirect(nsIURI* aOldURI, nsIURI* aNewURI) {
+ nsAutoCString oldHost;
+ nsAutoCString newHost;
+ if (aOldURI && aNewURI && NS_SUCCEEDED(aOldURI->GetHost(oldHost)) &&
+ StringEndsWith(oldHost, ".tor.onion"_ns) &&
+ NS_SUCCEEDED(aNewURI->GetHost(newHost)) &&
+ StringEndsWith(newHost, ".onion"_ns) &&
+ !StringEndsWith(newHost, ".tor.onion"_ns)) {
+ return true;
+ }
+ return false;
+}
+
nsresult nsDocShell::InternalLoad(nsDocShellLoadState* aLoadState,
Maybe<uint32_t> aCacheKey) {
MOZ_ASSERT(aLoadState, "need a load state!");
@@ -9558,6 +9576,30 @@ nsresult nsDocShell::InternalLoad(nsDocShellLoadState* aLoadState,
mAllowKeywordFixup = aLoadState->HasInternalLoadFlags(
INTERNAL_LOAD_FLAGS_ALLOW_THIRD_PARTY_FIXUP);
+
+ if (mOnionUrlbarRewritesAllowed) {
+ mOnionUrlbarRewritesAllowed = false;
+ nsCOMPtr<nsIURI> referrer;
+ nsIReferrerInfo* referrerInfo = aLoadState->GetReferrerInfo();
+ if (referrerInfo) {
+ referrerInfo->GetOriginalReferrer(getter_AddRefs(referrer));
+ bool isPrivateWin = false;
+ Document* doc = GetDocument();
+ if (doc) {
+ isPrivateWin =
+ doc->NodePrincipal()->OriginAttributesRef().mPrivateBrowsingId > 0;
+ nsCOMPtr<nsIScriptSecurityManager> secMan =
+ do_GetService(NS_SCRIPTSECURITYMANAGER_CONTRACTID);
+ mOnionUrlbarRewritesAllowed =
+ secMan && NS_SUCCEEDED(secMan->CheckSameOriginURI(
+ aLoadState->URI(), referrer, false, isPrivateWin));
+ }
+ }
+ }
+ mOnionUrlbarRewritesAllowed =
+ mOnionUrlbarRewritesAllowed ||
+ aLoadState->HasInternalLoadFlags(INTERNAL_LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES);
+
mURIResultedInDocument = false; // reset the clock...
// See if this is actually a load between two history entries for the same
@@ -11916,6 +11958,7 @@ nsresult nsDocShell::AddToSessionHistory(
HistoryID(), GetCreatedDynamically(), originalURI,
resultPrincipalURI, loadReplace, referrerInfo, srcdoc,
srcdocEntry, baseURI, saveLayoutState, expired, userActivation);
+ entry->SetOnionUrlbarRewritesAllowed(mOnionUrlbarRewritesAllowed);
if (mBrowsingContext->IsTop() && GetSessionHistory()) {
bool shouldPersist = ShouldAddToSessionHistory(aURI, aChannel);
@@ -13815,3 +13858,12 @@ void nsDocShell::MaybeDisconnectChildListenersOnPageHide() {
mChannelToDisconnectOnPageHide = 0;
}
}
+
+NS_IMETHODIMP
+nsDocShell::GetOnionUrlbarRewritesAllowed(bool* aOnionUrlbarRewritesAllowed) {
+ NS_ENSURE_ARG(aOnionUrlbarRewritesAllowed);
+ *aOnionUrlbarRewritesAllowed =
+ StaticPrefs::browser_urlbar_onionRewrites_enabled() &&
+ mOnionUrlbarRewritesAllowed;
+ return NS_OK;
+}
diff --git a/docshell/base/nsDocShell.h b/docshell/base/nsDocShell.h
index fe61eda9267d..30f7fcfe1bbd 100644
--- a/docshell/base/nsDocShell.h
+++ b/docshell/base/nsDocShell.h
@@ -134,6 +134,9 @@ class nsDocShell final : public nsDocLoader,
// Whether the load should go through LoadURIDelegate.
INTERNAL_LOAD_FLAGS_BYPASS_LOAD_URI_DELEGATE = 0x2000,
+
+ // Whether rewriting the urlbar to a short .onion alias is allowed.
+ INTERNAL_LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES = 0x4000,
};
// Event type dispatched by RestorePresentation
@@ -563,6 +566,8 @@ class nsDocShell final : public nsDocLoader,
virtual void DestroyChildren() override;
+ static bool IsTorOnionRedirect(nsIURI* aOldURI, nsIURI* aNewURI);
+
// Overridden from nsDocLoader, this provides more information than the
// normal OnStateChange with flags STATE_REDIRECTING
virtual void OnRedirectStateChange(nsIChannel* aOldChannel,
@@ -1254,6 +1259,7 @@ class nsDocShell final : public nsDocLoader,
bool mCSSErrorReportingEnabled : 1;
bool mAllowAuth : 1;
bool mAllowKeywordFixup : 1;
+ bool mOnionUrlbarRewritesAllowed : 1;
bool mDisableMetaRefreshWhenInactive : 1;
bool mIsAppTab : 1;
bool mDeviceSizeIsPageSize : 1;
diff --git a/docshell/base/nsDocShellLoadState.cpp b/docshell/base/nsDocShellLoadState.cpp
index 7122c2769119..5fb9f4aab2b5 100644
--- a/docshell/base/nsDocShellLoadState.cpp
+++ b/docshell/base/nsDocShellLoadState.cpp
@@ -847,6 +847,14 @@ void nsDocShellLoadState::CalculateLoadURIFlags() {
mInternalLoadFlags |= nsDocShell::INTERNAL_LOAD_FLAGS_FIRST_LOAD;
}
+ if (mLoadFlags & nsIWebNavigation::LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES) {
+ mInternalLoadFlags |= nsDocShell::INTERNAL_LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES;
+ }
+
+ if (mLoadFlags & nsIWebNavigation::LOAD_FLAGS_FIRST_LOAD) {
+ mInternalLoadFlags |= nsDocShell::INTERNAL_LOAD_FLAGS_FIRST_LOAD;
+ }
+
if (mLoadFlags & nsIWebNavigation::LOAD_FLAGS_BYPASS_CLASSIFIER) {
mInternalLoadFlags |= nsDocShell::INTERNAL_LOAD_FLAGS_BYPASS_CLASSIFIER;
}
diff --git a/docshell/base/nsIDocShell.idl b/docshell/base/nsIDocShell.idl
index dcf0b8c00d70..15887de5cbda 100644
--- a/docshell/base/nsIDocShell.idl
+++ b/docshell/base/nsIDocShell.idl
@@ -864,4 +864,9 @@ interface nsIDocShell : nsIDocShellTreeItem
* until session history state is moved into the parent process.
*/
void persistLayoutHistoryState();
+
+ /**
+ * Whether rewriting the urlbar to a short .onion alias is allowed.
+ */
+ [infallible] readonly attribute boolean onionUrlbarRewritesAllowed;
};
diff --git a/docshell/base/nsIWebNavigation.idl b/docshell/base/nsIWebNavigation.idl
index bec4f13d8b2b..fa00e155cba7 100644
--- a/docshell/base/nsIWebNavigation.idl
+++ b/docshell/base/nsIWebNavigation.idl
@@ -268,6 +268,11 @@ interface nsIWebNavigation : nsISupports
*/
const unsigned long LOAD_FLAGS_USER_ACTIVATION = 0x8000000;
+ /**
+ * Allow rewriting the urlbar to a short .onion alias.
+ */
+ const unsigned long LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES = 0x8000000;
+
/**
* Loads a given URI. This will give priority to loading the requested URI
* in the object implementing this interface. If it can't be loaded here
diff --git a/docshell/shistory/SessionHistoryEntry.cpp b/docshell/shistory/SessionHistoryEntry.cpp
index 61ec28bbb9be..9890c99b22dc 100644
--- a/docshell/shistory/SessionHistoryEntry.cpp
+++ b/docshell/shistory/SessionHistoryEntry.cpp
@@ -926,6 +926,20 @@ SessionHistoryEntry::SetPersist(bool aPersist) {
return NS_OK;
}
+NS_IMETHODIMP
+SessionHistoryEntry::GetOnionUrlbarRewritesAllowed(
+ bool* aOnionUrlbarRewritesAllowed) {
+ *aOnionUrlbarRewritesAllowed = mInfo->mOnionUrlbarRewritesAllowed;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+SessionHistoryEntry::SetOnionUrlbarRewritesAllowed(
+ bool aOnionUrlbarRewritesAllowed) {
+ mInfo->mOnionUrlbarRewritesAllowed = aOnionUrlbarRewritesAllowed;
+ return NS_OK;
+}
+
NS_IMETHODIMP
SessionHistoryEntry::GetScrollPosition(int32_t* aX, int32_t* aY) {
*aX = mInfo->mScrollPositionX;
diff --git a/docshell/shistory/SessionHistoryEntry.h b/docshell/shistory/SessionHistoryEntry.h
index e74311578368..aa4c86f2a368 100644
--- a/docshell/shistory/SessionHistoryEntry.h
+++ b/docshell/shistory/SessionHistoryEntry.h
@@ -170,6 +170,7 @@ class SessionHistoryInfo {
bool mPersist = true;
bool mHasUserInteraction = false;
bool mHasUserActivation = false;
+ bool mOnionUrlbarRewritesAllowed = false;
union SharedState {
SharedState();
diff --git a/docshell/shistory/nsISHEntry.idl b/docshell/shistory/nsISHEntry.idl
index 73ac40551d4e..622402456d07 100644
--- a/docshell/shistory/nsISHEntry.idl
+++ b/docshell/shistory/nsISHEntry.idl
@@ -260,6 +260,11 @@ interface nsISHEntry : nsISupports
*/
[infallible] attribute boolean persist;
+ /**
+ * Whether rewriting the urlbar to a short .onion alias is allowed.
+ */
+ [infallible] attribute boolean onionUrlbarRewritesAllowed;
+
/**
* Set/Get the visual viewport scroll position if session history is
* changed through anchor navigation or pushState.
diff --git a/docshell/shistory/nsSHEntry.cpp b/docshell/shistory/nsSHEntry.cpp
index 1e4000eacd2b..41ea6086df8b 100644
--- a/docshell/shistory/nsSHEntry.cpp
+++ b/docshell/shistory/nsSHEntry.cpp
@@ -44,7 +44,8 @@ nsSHEntry::nsSHEntry()
mLoadedInThisProcess(false),
mPersist(true),
mHasUserInteraction(false),
- mHasUserActivation(false) {}
+ mHasUserActivation(false),
+ mOnionUrlbarRewritesAllowed(false) {}
nsSHEntry::nsSHEntry(const nsSHEntry& aOther)
: mShared(aOther.mShared),
@@ -72,7 +73,8 @@ nsSHEntry::nsSHEntry(const nsSHEntry& aOther)
mLoadedInThisProcess(aOther.mLoadedInThisProcess),
mPersist(aOther.mPersist),
mHasUserInteraction(false),
- mHasUserActivation(aOther.mHasUserActivation) {}
+ mHasUserActivation(aOther.mHasUserActivation),
+ mOnionUrlbarRewritesAllowed(aOther.mOnionUrlbarRewritesAllowed) {}
nsSHEntry::~nsSHEntry() {
// Null out the mParent pointers on all our kids.
@@ -880,6 +882,18 @@ nsSHEntry::SetPersist(bool aPersist) {
return NS_OK;
}
+NS_IMETHODIMP
+nsSHEntry::GetOnionUrlbarRewritesAllowed(bool* aOnionUrlbarRewritesAllowed) {
+ *aOnionUrlbarRewritesAllowed = mOnionUrlbarRewritesAllowed;
+ return NS_OK;
+}
+
+NS_IMETHODIMP
+nsSHEntry::SetOnionUrlbarRewritesAllowed(bool aOnionUrlbarRewritesAllowed) {
+ mOnionUrlbarRewritesAllowed = aOnionUrlbarRewritesAllowed;
+ return NS_OK;
+}
+
NS_IMETHODIMP
nsSHEntry::CreateLoadInfo(nsDocShellLoadState** aLoadState) {
nsCOMPtr<nsIURI> uri = GetURI();
@@ -929,6 +943,10 @@ nsSHEntry::CreateLoadInfo(nsDocShellLoadState** aLoadState) {
} else {
srcdoc = VoidString();
}
+ if (GetOnionUrlbarRewritesAllowed()) {
+ flags |= nsDocShell::InternalLoad::
+ INTERNAL_LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES;
+ }
loadState->SetSrcdocData(srcdoc);
loadState->SetBaseURI(baseURI);
loadState->SetInternalLoadFlags(flags);
diff --git a/docshell/shistory/nsSHEntry.h b/docshell/shistory/nsSHEntry.h
index 326b0092cf94..76be0ac65050 100644
--- a/docshell/shistory/nsSHEntry.h
+++ b/docshell/shistory/nsSHEntry.h
@@ -66,6 +66,7 @@ class nsSHEntry : public nsISHEntry {
bool mPersist;
bool mHasUserInteraction;
bool mHasUserActivation;
+ bool mOnionUrlbarRewritesAllowed;
};
#endif /* nsSHEntry_h */
diff --git a/dom/interfaces/base/nsIBrowser.idl b/dom/interfaces/base/nsIBrowser.idl
index 1a05957dba83..1c42486da87c 100644
--- a/dom/interfaces/base/nsIBrowser.idl
+++ b/dom/interfaces/base/nsIBrowser.idl
@@ -130,7 +130,8 @@ interface nsIBrowser : nsISupports
in boolean aIsSynthetic,
in boolean aHasRequestContextID,
in uint64_t aRequestContextID,
- in AString aContentType);
+ in AString aContentType,
+ in boolean aOnionUrlbarRewritesAllowed);
/**
* Determine what process switching behavior this browser element should have.
diff --git a/dom/ipc/BrowserChild.cpp b/dom/ipc/BrowserChild.cpp
index ce5e1ff14890..0830c22d0b5c 100644
--- a/dom/ipc/BrowserChild.cpp
+++ b/dom/ipc/BrowserChild.cpp
@@ -3621,6 +3621,8 @@ NS_IMETHODIMP BrowserChild::OnLocationChange(nsIWebProgress* aWebProgress,
docShell->GetMayEnableCharacterEncodingMenu();
locationChangeData->charsetAutodetected() =
docShell->GetCharsetAutodetected();
+ locationChangeData->onionUrlbarRewritesAllowed() =
+ docShell->GetOnionUrlbarRewritesAllowed();
locationChangeData->contentPrincipal() = document->NodePrincipal();
locationChangeData->contentPartitionedPrincipal() =
diff --git a/dom/ipc/BrowserParent.cpp b/dom/ipc/BrowserParent.cpp
index 240b386f6dde..fd14908abc85 100644
--- a/dom/ipc/BrowserParent.cpp
+++ b/dom/ipc/BrowserParent.cpp
@@ -2794,7 +2794,8 @@ mozilla::ipc::IPCResult BrowserParent::RecvOnLocationChange(
aLocationChangeData->isSyntheticDocument(),
aLocationChangeData->requestContextID().isSome(),
aLocationChangeData->requestContextID().valueOr(0),
- aLocationChangeData->contentType());
+ aLocationChangeData->contentType(),
+ aLocationChangeData->onionUrlbarRewritesAllowed());
}
}
diff --git a/dom/ipc/PBrowser.ipdl b/dom/ipc/PBrowser.ipdl
index 29433edcde78..4a0086a98c50 100644
--- a/dom/ipc/PBrowser.ipdl
+++ b/dom/ipc/PBrowser.ipdl
@@ -145,6 +145,7 @@ struct WebProgressLocationChangeData
bool isSyntheticDocument;
bool mayEnableCharacterEncodingMenu;
bool charsetAutodetected;
+ bool onionUrlbarRewritesAllowed;
nsString contentType;
nsString title;
nsString charset;
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index cc155b47b645..238177c47894 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -1329,6 +1329,12 @@
value: true
mirror: always
+ # Whether rewriting the urlbar to a short .onion alias is allowed.
+- name: browser.urlbar.onionRewrites.enabled
+ type: RelaxedAtomicBool
+ value: true
+ mirror: always
+
- name: browser.viewport.desktopWidth
type: RelaxedAtomicInt32
value: 980
diff --git a/netwerk/dns/effective_tld_names.dat b/netwerk/dns/effective_tld_names.dat
index 9502869c2443..100cb4817dfe 100644
--- a/netwerk/dns/effective_tld_names.dat
+++ b/netwerk/dns/effective_tld_names.dat
@@ -5518,6 +5518,8 @@ pro.om
// onion : https://tools.ietf.org/html/rfc7686
onion
+tor.onion
+securedrop.tor.onion
// org : https://en.wikipedia.org/wiki/.org
org
diff --git a/netwerk/ipc/DocumentLoadListener.cpp b/netwerk/ipc/DocumentLoadListener.cpp
index 27cc9939dc5f..7a6fddedd411 100644
--- a/netwerk/ipc/DocumentLoadListener.cpp
+++ b/netwerk/ipc/DocumentLoadListener.cpp
@@ -2522,6 +2522,16 @@ DocumentLoadListener::AsyncOnChannelRedirect(
"mHaveVisibleRedirect=%c",
this, mHaveVisibleRedirect ? 'T' : 'F'));
+ // Like the code above for allowing mixed content, we need to check this here
+ // in case the redirect is not handled in the docshell.
+ nsCOMPtr<nsIURI> oldURI, newURI;
+ aOldChannel->GetURI(getter_AddRefs(oldURI));
+ aNewChannel->GetURI(getter_AddRefs(newURI));
+ if (nsDocShell::IsTorOnionRedirect(oldURI, newURI)) {
+ mLoadStateInternalLoadFlags |=
+ nsDocShell::INTERNAL_LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES;
+ }
+
// We need the original URI of the current channel to use to open the real
// channel in the content process. Unfortunately we overwrite the original
// uri of the new channel with the original pre-redirect URI, so grab
diff --git a/toolkit/content/widgets/browser-custom-element.js b/toolkit/content/widgets/browser-custom-element.js
index 778cadd6b810..bcf622e70c65 100644
--- a/toolkit/content/widgets/browser-custom-element.js
+++ b/toolkit/content/widgets/browser-custom-element.js
@@ -255,6 +255,8 @@
this._mayEnableCharacterEncodingMenu = null;
+ this._onionUrlbarRewritesAllowed = false;
+
this._charsetAutodetected = false;
this._contentPrincipal = null;
@@ -615,6 +617,12 @@
}
}
+ get onionUrlbarRewritesAllowed() {
+ return this.isRemoteBrowser
+ ? this._onionUrlbarRewritesAllowed
+ : this.docShell.onionUrlbarRewritesAllowed;
+ }
+
get charsetAutodetected() {
return this.isRemoteBrowser
? this._charsetAutodetected
@@ -1157,7 +1165,8 @@
aIsSynthetic,
aHaveRequestContextID,
aRequestContextID,
- aContentType
+ aContentType,
+ aOnionUrlbarRewritesAllowed
) {
if (this.isRemoteBrowser && this.messageManager) {
if (aCharset != null) {
@@ -1180,6 +1189,7 @@
this._contentRequestContextID = aHaveRequestContextID
? aRequestContextID
: null;
+ this._onionUrlbarRewritesAllowed = aOnionUrlbarRewritesAllowed;
}
}
@@ -1582,6 +1592,7 @@
"_contentPrincipal",
"_contentPartitionedPrincipal",
"_isSyntheticDocument",
+ "_onionUrlbarRewritesAllowed",
]
);
}
diff --git a/toolkit/modules/sessionstore/SessionHistory.jsm b/toolkit/modules/sessionstore/SessionHistory.jsm
index 87af372acb79..a03eb85b938b 100644
--- a/toolkit/modules/sessionstore/SessionHistory.jsm
+++ b/toolkit/modules/sessionstore/SessionHistory.jsm
@@ -313,6 +313,7 @@ var SessionHistoryInternal = {
}
entry.persist = shEntry.persist;
+ entry.onionUrlbarRewritesAllowed = shEntry.onionUrlbarRewritesAllowed;
return entry;
},
@@ -607,6 +608,10 @@ var SessionHistoryInternal = {
}
}
+ if (entry.onionUrlbarRewritesAllowed) {
+ shEntry.onionUrlbarRewritesAllowed = entry.onionUrlbarRewritesAllowed;
+ }
+
return shEntry;
},
diff --git a/xpcom/reflect/xptinfo/xptinfo.h b/xpcom/reflect/xptinfo/xptinfo.h
index efee881c1421..4295efb39f1f 100644
--- a/xpcom/reflect/xptinfo/xptinfo.h
+++ b/xpcom/reflect/xptinfo/xptinfo.h
@@ -514,7 +514,8 @@ static_assert(sizeof(nsXPTMethodInfo) == 8, "wrong size");
#if defined(MOZ_THUNDERBIRD) || defined(MOZ_SUITE)
# define PARAM_BUFFER_COUNT 18
#else
-# define PARAM_BUFFER_COUNT 14
+// The max is currently updateForLocationChange in nsIBrowser.idl
+# define PARAM_BUFFER_COUNT 15
#endif
/**
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 21952: Implement Onion-Location
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit b89a990a1a84d51f62e7bb72598608b88f458de8
Author: Alex Catarineu <acat(a)torproject.org>
Date: Thu Mar 5 22:16:39 2020 +0100
Bug 21952: Implement Onion-Location
Whenever a valid Onion-Location HTTP header (or corresponding HTML
<meta> http-equiv attribute) is found in a document load, we either
redirect to it (if the user opted-in via preference) or notify the
presence of an onionsite alternative with a badge in the urlbar.
---
browser/base/content/browser.js | 12 ++
browser/base/content/browser.xhtml | 3 +
browser/components/BrowserGlue.jsm | 13 ++
.../onionservices/OnionLocationChild.jsm | 39 +++++
.../onionservices/OnionLocationParent.jsm | 168 +++++++++++++++++++++
.../content/onionlocation-notification-icons.css | 5 +
.../onionservices/content/onionlocation-urlbar.css | 27 ++++
.../content/onionlocation-urlbar.inc.xhtml | 10 ++
.../onionservices/content/onionlocation.svg | 3 +
.../content/onionlocationPreferences.inc.xhtml | 11 ++
.../content/onionlocationPreferences.js | 31 ++++
browser/components/onionservices/jar.mn | 2 +
browser/components/onionservices/moz.build | 2 +
browser/components/preferences/privacy.inc.xhtml | 2 +
browser/components/preferences/privacy.js | 17 +++
browser/themes/shared/notification-icons.inc.css | 2 +
browser/themes/shared/urlbar-searchbar.inc.css | 2 +
dom/base/Document.cpp | 34 ++++-
dom/base/Document.h | 2 +
dom/webidl/Document.webidl | 8 +
modules/libpref/init/StaticPrefList.yaml | 5 +
xpcom/ds/StaticAtoms.py | 1 +
22 files changed, 398 insertions(+), 1 deletion(-)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 7103cd2c374b..a443220ba6e8 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -50,6 +50,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
NetUtil: "resource://gre/modules/NetUtil.jsm",
NewTabUtils: "resource://gre/modules/NewTabUtils.jsm",
OpenInTabsUtils: "resource:///modules/OpenInTabsUtils.jsm",
+ OnionLocationParent: "resource:///modules/OnionLocationParent.jsm",
PageActions: "resource:///modules/PageActions.jsm",
PageThumbs: "resource://gre/modules/PageThumbs.jsm",
PanelMultiView: "resource:///modules/PanelMultiView.jsm",
@@ -5310,6 +5311,7 @@ var XULBrowserWindow = {
CFRPageActions.updatePageActions(gBrowser.selectedBrowser);
AboutReaderParent.updateReaderButton(gBrowser.selectedBrowser);
+ OnionLocationParent.updateOnionLocationBadge(gBrowser.selectedBrowser);
if (!gMultiProcessBrowser) {
// Bug 1108553 - Cannot rotate images with e10s
@@ -5800,6 +5802,16 @@ var CombinedStopReload = {
var TabsProgressListener = {
onStateChange(aBrowser, aWebProgress, aRequest, aStateFlags, aStatus) {
+ // Clear OnionLocation UI
+ if (
+ aStateFlags & Ci.nsIWebProgressListener.STATE_START &&
+ aStateFlags & Ci.nsIWebProgressListener.STATE_IS_NETWORK &&
+ aRequest &&
+ aWebProgress.isTopLevel
+ ) {
+ OnionLocationParent.onStateChange(aBrowser);
+ }
+
// Collect telemetry data about tab load times.
if (
aWebProgress.isTopLevel &&
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index e4f3363e2180..5b64d914d414 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -2039,6 +2039,9 @@
onclick="FullZoom.reset(); FullZoom.resetScalingZoom();"
tooltip="dynamic-shortcut-tooltip"
hidden="true"/>
+
+#include ../../components/onionservices/content/onionlocation-urlbar.inc.xhtml
+
<hbox id="pageActionButton"
class="urlbar-page-action urlbar-icon-wrapper"
role="button"
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 5b320bd989f0..c23f926a2de2 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -546,6 +546,19 @@ let JSWINDOWACTORS = {
allFrames: true,
},
+ OnionLocation: {
+ parent: {
+ moduleURI: "resource:///modules/OnionLocationParent.jsm",
+ },
+ child: {
+ moduleURI: "resource:///modules/OnionLocationChild.jsm",
+ events: {
+ pageshow: { mozSystemGroup: true },
+ },
+ },
+ messageManagerGroups: ["browsers"],
+ },
+
PageInfo: {
child: {
moduleURI: "resource:///actors/PageInfoChild.jsm",
diff --git a/browser/components/onionservices/OnionLocationChild.jsm b/browser/components/onionservices/OnionLocationChild.jsm
new file mode 100644
index 000000000000..9e00054ac56c
--- /dev/null
+++ b/browser/components/onionservices/OnionLocationChild.jsm
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+var EXPORTED_SYMBOLS = ["OnionLocationChild"];
+
+class OnionLocationChild extends JSWindowActorChild {
+ handleEvent(event) {
+ this.onPageShow(event);
+ }
+
+ onPageShow(event) {
+ if (event.target != this.document) {
+ return;
+ }
+ const onionLocationURI = this.document.onionLocationURI;
+ if (onionLocationURI) {
+ this.sendAsyncMessage("OnionLocation:Set");
+ }
+ }
+
+ receiveMessage(aMessage) {
+ if (aMessage.name == "OnionLocation:Refresh") {
+ const doc = this.document;
+ const docShell = this.docShell;
+ const onionLocationURI = doc.onionLocationURI;
+ const refreshURI = docShell.QueryInterface(Ci.nsIRefreshURI);
+ if (onionLocationURI && refreshURI) {
+ refreshURI.refreshURI(
+ onionLocationURI,
+ doc.nodePrincipal,
+ 0,
+ false,
+ true
+ );
+ }
+ }
+ }
+}
diff --git a/browser/components/onionservices/OnionLocationParent.jsm b/browser/components/onionservices/OnionLocationParent.jsm
new file mode 100644
index 000000000000..f6250e554862
--- /dev/null
+++ b/browser/components/onionservices/OnionLocationParent.jsm
@@ -0,0 +1,168 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+var EXPORTED_SYMBOLS = ["OnionLocationParent"];
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { TorStrings } = ChromeUtils.import("resource:///modules/TorStrings.jsm");
+
+// Prefs
+const NOTIFICATION_PREF = "privacy.prioritizeonions.showNotification";
+const PRIORITIZE_ONIONS_PREF = "privacy.prioritizeonions.enabled";
+
+// Element IDs
+const ONIONLOCATION_BOX_ID = "onion-location-box";
+const ONIONLOCATION_BUTTON_ID = "onion-location-button";
+const ONIONLOCATION_LABEL_ID = "onion-label";
+
+// Notification IDs
+const NOTIFICATION_ID = "onion-location";
+const NOTIFICATION_ANCHOR_ID = "onionlocation";
+
+// Strings
+const STRING_ONION_AVAILABLE = TorStrings.onionLocation.onionAvailable;
+const NOTIFICATION_CANCEL_LABEL = TorStrings.onionLocation.notNow;
+const NOTIFICATION_CANCEL_ACCESSKEY = TorStrings.onionLocation.notNowAccessKey;
+const NOTIFICATION_OK_LABEL = TorStrings.onionLocation.alwaysPrioritize;
+const NOTIFICATION_OK_ACCESSKEY =
+ TorStrings.onionLocation.alwaysPrioritizeAccessKey;
+const NOTIFICATION_TITLE = TorStrings.onionLocation.tryThis;
+const NOTIFICATION_DESCRIPTION = TorStrings.onionLocation.description;
+const NOTIFICATION_LEARN_MORE_URL = TorStrings.onionLocation.learnMoreURL;
+
+class OnionLocationParent extends JSWindowActorParent {
+ // Listeners are added in BrowserGlue.jsm
+ receiveMessage(aMsg) {
+ switch (aMsg.name) {
+ case "OnionLocation:Set":
+ let browser = this.browsingContext.embedderElement;
+ OnionLocationParent.setOnionLocation(browser);
+ break;
+ }
+ }
+
+ static buttonClick(event) {
+ if (event.button !== 0) {
+ return;
+ }
+ const win = event.target.ownerGlobal;
+ if (win.gBrowser) {
+ const browser = win.gBrowser.selectedBrowser;
+ OnionLocationParent.redirect(browser);
+ }
+ }
+
+ static redirect(browser) {
+ let windowGlobal = browser.browsingContext.currentWindowGlobal;
+ let actor = windowGlobal.getActor("OnionLocation");
+ if (actor) {
+ actor.sendAsyncMessage("OnionLocation:Refresh", {});
+ OnionLocationParent.setDisabled(browser);
+ }
+ }
+
+ static onStateChange(browser) {
+ delete browser._onionLocation;
+ OnionLocationParent.hideNotification(browser);
+ }
+
+ static setOnionLocation(browser) {
+ browser._onionLocation = true;
+ let tabBrowser = browser.getTabBrowser();
+ if (tabBrowser && browser === tabBrowser.selectedBrowser) {
+ OnionLocationParent.updateOnionLocationBadge(browser);
+ }
+ }
+
+ static hideNotification(browser) {
+ const win = browser.ownerGlobal;
+ if (browser._onionLocationPrompt) {
+ win.PopupNotifications.remove(browser._onionLocationPrompt);
+ }
+ }
+
+ static showNotification(browser) {
+ const mustShow = Services.prefs.getBoolPref(NOTIFICATION_PREF, true);
+ if (!mustShow) {
+ return;
+ }
+
+ const win = browser.ownerGlobal;
+ Services.prefs.setBoolPref(NOTIFICATION_PREF, false);
+
+ const mainAction = {
+ label: NOTIFICATION_OK_LABEL,
+ accessKey: NOTIFICATION_OK_ACCESSKEY,
+ callback() {
+ Services.prefs.setBoolPref(PRIORITIZE_ONIONS_PREF, true);
+ OnionLocationParent.redirect(browser);
+ win.openPreferences("privacy-onionservices");
+ },
+ };
+
+ const cancelAction = {
+ label: NOTIFICATION_CANCEL_LABEL,
+ accessKey: NOTIFICATION_CANCEL_ACCESSKEY,
+ callback: () => {},
+ };
+
+ const options = {
+ autofocus: true,
+ persistent: true,
+ removeOnDismissal: false,
+ eventCallback(aTopic) {
+ if (aTopic === "removed") {
+ delete browser._onionLocationPrompt;
+ delete browser.onionpopupnotificationanchor;
+ }
+ },
+ learnMoreURL: NOTIFICATION_LEARN_MORE_URL,
+ displayURI: {
+ hostPort: NOTIFICATION_TITLE, // This is hacky, but allows us to have a title without extra markup/css.
+ },
+ hideClose: true,
+ popupIconClass: "onionlocation-notification-icon",
+ };
+
+ // A hacky way of setting the popup anchor outside the usual url bar icon box
+ // onionlocationpopupnotificationanchor comes from `${ANCHOR_ID}popupnotificationanchor`
+ // From https://searchfox.org/mozilla-esr68/rev/080f9ed47742644d2ff84f7aa0b10aea5c4…
+ browser.onionlocationpopupnotificationanchor = win.document.getElementById(
+ ONIONLOCATION_BUTTON_ID
+ );
+
+ browser._onionLocationPrompt = win.PopupNotifications.show(
+ browser,
+ NOTIFICATION_ID,
+ NOTIFICATION_DESCRIPTION,
+ NOTIFICATION_ANCHOR_ID,
+ mainAction,
+ [cancelAction],
+ options
+ );
+ }
+
+ static setEnabled(browser) {
+ const win = browser.ownerGlobal;
+ const label = win.document.getElementById(ONIONLOCATION_LABEL_ID);
+ label.textContent = STRING_ONION_AVAILABLE;
+ const elem = win.document.getElementById(ONIONLOCATION_BOX_ID);
+ elem.removeAttribute("hidden");
+ }
+
+ static setDisabled(browser) {
+ const win = browser.ownerGlobal;
+ const elem = win.document.getElementById(ONIONLOCATION_BOX_ID);
+ elem.setAttribute("hidden", true);
+ }
+
+ static updateOnionLocationBadge(browser) {
+ if (browser._onionLocation) {
+ OnionLocationParent.setEnabled(browser);
+ OnionLocationParent.showNotification(browser);
+ } else {
+ OnionLocationParent.setDisabled(browser);
+ }
+ }
+}
diff --git a/browser/components/onionservices/content/onionlocation-notification-icons.css b/browser/components/onionservices/content/onionlocation-notification-icons.css
new file mode 100644
index 000000000000..7c8a6d892c6f
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocation-notification-icons.css
@@ -0,0 +1,5 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+
+.onionlocation-notification-icon {
+ display: none;
+}
\ No newline at end of file
diff --git a/browser/components/onionservices/content/onionlocation-urlbar.css b/browser/components/onionservices/content/onionlocation-urlbar.css
new file mode 100644
index 000000000000..91cad5f178d1
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocation-urlbar.css
@@ -0,0 +1,27 @@
+/* Copyright (c) 2020, The Tor Project, Inc. */
+
+#onion-location-button {
+ list-style-image: url(chrome://browser/content/onionservices/onionlocation.svg);
+}
+
+#onion-location-box {
+ border-radius: 3px;
+ background-color: #6200A4;
+ padding-left: 5px;
+ padding-right: 5px;
+ color: white;
+ -moz-context-properties: fill;
+ fill: white;
+}
+
+#onion-location-box:hover {
+ background-color: #0060DF !important;
+}
+
+toolbar[brighttext] #onion-location-box {
+ background-color: #9400ff;
+}
+
+toolbar[brighttext] #onion-location-box:hover {
+ background-color: #0060DF !important;
+}
diff --git a/browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml b/browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml
new file mode 100644
index 000000000000..b612a4236f3c
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocation-urlbar.inc.xhtml
@@ -0,0 +1,10 @@
+# Copyright (c) 2020, The Tor Project, Inc.
+
+<hbox id="onion-location-box"
+ class="urlbar-icon-wrapper urlbar-page-action"
+ role="button"
+ hidden="true"
+ onclick="OnionLocationParent.buttonClick(event);">
+ <image id="onion-location-button" role="presentation"/>
+ <hbox id="onion-label-container"><label id="onion-label"/></hbox>
+</hbox>
diff --git a/browser/components/onionservices/content/onionlocation.svg b/browser/components/onionservices/content/onionlocation.svg
new file mode 100644
index 000000000000..37f40ac1812f
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocation.svg
@@ -0,0 +1,3 @@
+<svg width="16" height="16" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <path fill="context-fill" fill-opacity="context-fill-opacity" d="m8.016411 14.54499v-0.969784c3.071908-0.0089 5.559239-2.501304 5.559239-5.575429 0-3.073903-2.487331-5.566336-5.559239-5.575206v-0.9697843c3.607473 0.00909 6.528802 2.935521 6.528802 6.544991 0 3.609691-2.921329 6.536342-6.528802 6.545213zm0-3.394356c1.732661-0.0091 3.135111-1.415756 3.135111-3.150857 0-1.734878-1.402451-3.141542-3.135111-3.150634v-0.9695626c2.268448 0.00887 4.104895 1.849753 4.104895 4.120197 0 2.270666-1.836447 4.111549-4.104895 4.120419zm0-4.846926c0.9294227 0.00887 1.680545 0.7644289 1.680545 1.696069 0 0.9318627-0.7511226 1.687421-1.680545 1.696291zm-8.016411 1.696069c0 4.418473 3.581527 8.000222 8 8.000222 4.418251 0 8-3.581749 8-8.000222 0-4.418251-3.581749-7.999778-8-7.999778-4.418473 0-8 3.581527-8 7.999778z" />
+</svg>
\ No newline at end of file
diff --git a/browser/components/onionservices/content/onionlocationPreferences.inc.xhtml b/browser/components/onionservices/content/onionlocationPreferences.inc.xhtml
new file mode 100644
index 000000000000..c285f403f99b
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocationPreferences.inc.xhtml
@@ -0,0 +1,11 @@
+# Copyright (c) 2020, The Tor Project, Inc.
+
+<groupbox id="onionServicesGroup" data-category="panePrivacy" data-subcategory="onionservices" hidden="true">
+ <label><html:h2 id="onionServicesTitle"></html:h2></label>
+ <label><label class="tail-with-learn-more" id="prioritizeOnionsDesc"></label><label
+ class="learnMore" is="text-link" id="onionServicesLearnMore"></label></label>
+ <radiogroup id="prioritizeOnionsRadioGroup" aria-labelledby="prioritizeOnionsDesc" preference="privacy.prioritizeonions.enabled">
+ <radio id="onionServicesRadioAlways" value="true"/>
+ <radio id="onionServicesRadioAsk" value="false"/>
+ </radiogroup>
+</groupbox>
diff --git a/browser/components/onionservices/content/onionlocationPreferences.js b/browser/components/onionservices/content/onionlocationPreferences.js
new file mode 100644
index 000000000000..aa569b54721c
--- /dev/null
+++ b/browser/components/onionservices/content/onionlocationPreferences.js
@@ -0,0 +1,31 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+
+"use strict";
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+const OnionLocationPreferences = {
+ init() {
+ document.getElementById("onionServicesTitle").textContent =
+ TorStrings.onionLocation.onionServicesTitle;
+ document.getElementById("prioritizeOnionsDesc").textContent =
+ TorStrings.onionLocation.prioritizeOnionsDescription;
+ const learnMore = document.getElementById("onionServicesLearnMore");
+ learnMore.textContent = TorStrings.onionLocation.learnMore;
+ learnMore.href = TorStrings.onionLocation.learnMoreURL;
+ document.getElementById("onionServicesRadioAlways").label =
+ TorStrings.onionLocation.always;
+ document.getElementById("onionServicesRadioAsk").label =
+ TorStrings.onionLocation.askEverytime;
+ },
+};
+
+Object.defineProperty(this, "OnionLocationPreferences", {
+ value: OnionLocationPreferences,
+ enumerable: true,
+ writable: false,
+});
diff --git a/browser/components/onionservices/jar.mn b/browser/components/onionservices/jar.mn
index 9d6ce88d1841..f45b16dc5d29 100644
--- a/browser/components/onionservices/jar.mn
+++ b/browser/components/onionservices/jar.mn
@@ -7,3 +7,5 @@ browser.jar:
content/browser/onionservices/onionservices.css (content/onionservices.css)
content/browser/onionservices/savedKeysDialog.js (content/savedKeysDialog.js)
content/browser/onionservices/savedKeysDialog.xhtml (content/savedKeysDialog.xhtml)
+ content/browser/onionservices/onionlocationPreferences.js (content/onionlocationPreferences.js)
+ content/browser/onionservices/onionlocation.svg (content/onionlocation.svg)
diff --git a/browser/components/onionservices/moz.build b/browser/components/onionservices/moz.build
index 815685322024..8027233d65a6 100644
--- a/browser/components/onionservices/moz.build
+++ b/browser/components/onionservices/moz.build
@@ -4,4 +4,6 @@ EXTRA_JS_MODULES += [
"ExtensionMessaging.jsm",
"HttpsEverywhereControl.jsm",
"OnionAliasStore.jsm",
+ "OnionLocationChild.jsm",
+ "OnionLocationParent.jsm",
]
diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
index eb410c13a8cc..be629399bdb9 100644
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -14,6 +14,8 @@
<html:h1 data-l10n-id="privacy-header"/>
</hbox>
+#include ../onionservices/content/onionlocationPreferences.inc.xhtml
+
<!-- Tracking / Content Blocking -->
<groupbox id="trackingGroup" data-category="panePrivacy" hidden="true" aria-describedby="contentBlockingDescription">
<label id="contentBlockingHeader"><html:h2 data-l10n-id="content-blocking-enhanced-tracking-protection"/></label>
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index 0b1e28dfac92..290b22271807 100644
--- a/browser/components/preferences/privacy.js
+++ b/browser/components/preferences/privacy.js
@@ -93,6 +93,12 @@ XPCOMUtils.defineLazyScriptGetter(
"chrome://browser/content/securitylevel/securityLevel.js"
);
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["OnionLocationPreferences"],
+ "chrome://browser/content/onionservices/onionlocationPreferences.js"
+);
+
XPCOMUtils.defineLazyServiceGetter(
this,
"listManager",
@@ -169,6 +175,9 @@ Preferences.addAll([
// Do not track
{ id: "privacy.donottrackheader.enabled", type: "bool" },
+ // Onion Location
+ { id: "privacy.prioritizeonions.enabled", type: "bool" },
+
// Media
{ id: "media.autoplay.default", type: "int" },
@@ -330,6 +339,13 @@ var gPrivacyPane = {
window.addEventListener("unload", unload);
},
+ /**
+ * Show the OnionLocation preferences UI
+ */
+ _initOnionLocation() {
+ OnionLocationPreferences.init();
+ },
+
/**
* Whether the prompt to restart Firefox should appear when changing the autostart pref.
*/
@@ -537,6 +553,7 @@ var gPrivacyPane = {
this._initTrackingProtectionExtensionControl();
OnionServicesAuthPreferences.init();
this._initSecurityLevel();
+ this._initOnionLocation();
Services.telemetry.setEventRecordingEnabled("pwmgr", true);
diff --git a/browser/themes/shared/notification-icons.inc.css b/browser/themes/shared/notification-icons.inc.css
index 39eb59a04964..0312654b6bcf 100644
--- a/browser/themes/shared/notification-icons.inc.css
+++ b/browser/themes/shared/notification-icons.inc.css
@@ -536,3 +536,5 @@
border-radius: 50%;
}
} /** END not Proton **/
+
+%include ../../components/onionservices/content/onionlocation-notification-icons.css
diff --git a/browser/themes/shared/urlbar-searchbar.inc.css b/browser/themes/shared/urlbar-searchbar.inc.css
index 89e77b8ce90a..dc608af4b7fa 100644
--- a/browser/themes/shared/urlbar-searchbar.inc.css
+++ b/browser/themes/shared/urlbar-searchbar.inc.css
@@ -904,3 +904,5 @@ moz-input-box > menupopup .context-menu-add-engine > .menu-iconic-left::after {
opacity: 0.69;
}
} /*** END !proton ***/
+
+%include ../../components/onionservices/content/onionlocation-urlbar.css
diff --git a/dom/base/Document.cpp b/dom/base/Document.cpp
index c0494f7ccc74..c5592ec6bcbd 100644
--- a/dom/base/Document.cpp
+++ b/dom/base/Document.cpp
@@ -2781,6 +2781,7 @@ void Document::ResetToURI(nsIURI* aURI, nsILoadGroup* aLoadGroup,
// mDocumentURI.
mDocumentBaseURI = nullptr;
mChromeXHRDocBaseURI = nullptr;
+ mOnionLocationURI = nullptr;
// Check if the current document is the top-level DevTools document.
// For inner DevTools frames, mIsDevToolsDocument will be set when
@@ -6498,6 +6499,22 @@ void Document::GetHeaderData(nsAtom* aHeaderField, nsAString& aData) const {
}
}
+static bool IsValidOnionLocation(nsIURI* aDocumentURI,
+ nsIURI* aOnionLocationURI) {
+ bool isHttpish;
+ nsAutoCString host;
+ return aDocumentURI && aOnionLocationURI &&
+ NS_SUCCEEDED(aDocumentURI->SchemeIs("https", &isHttpish)) &&
+ isHttpish && NS_SUCCEEDED(aDocumentURI->GetAsciiHost(host)) &&
+ !StringEndsWith(host, ".onion"_ns) &&
+ ((NS_SUCCEEDED(aOnionLocationURI->SchemeIs("http", &isHttpish)) &&
+ isHttpish) ||
+ (NS_SUCCEEDED(aOnionLocationURI->SchemeIs("https", &isHttpish)) &&
+ isHttpish)) &&
+ NS_SUCCEEDED(aOnionLocationURI->GetAsciiHost(host)) &&
+ StringEndsWith(host, ".onion"_ns);
+}
+
void Document::SetHeaderData(nsAtom* aHeaderField, const nsAString& aData) {
if (!aHeaderField) {
NS_ERROR("null headerField");
@@ -6572,6 +6589,21 @@ void Document::SetHeaderData(nsAtom* aHeaderField, const nsAString& aData) {
aHeaderField == nsGkAtoms::handheldFriendly) {
mViewportType = Unknown;
}
+
+ if (aHeaderField == nsGkAtoms::headerOnionLocation && !aData.IsEmpty()) {
+ nsCOMPtr<nsIURI> onionURI;
+ if (NS_SUCCEEDED(NS_NewURI(getter_AddRefs(onionURI), aData)) &&
+ IsValidOnionLocation(Document::GetDocumentURI(), onionURI)) {
+ if (StaticPrefs::privacy_prioritizeonions_enabled()) {
+ nsCOMPtr<nsIRefreshURI> refresher(mDocumentContainer);
+ if (refresher) {
+ refresher->RefreshURI(onionURI, NodePrincipal(), 0, false, true);
+ }
+ } else {
+ mOnionLocationURI = onionURI;
+ }
+ }
+ }
}
void Document::TryChannelCharset(nsIChannel* aChannel, int32_t& aCharsetSource,
@@ -10681,7 +10713,7 @@ void Document::RetrieveRelevantHeaders(nsIChannel* aChannel) {
static const char* const headers[] = {
"default-style", "content-style-type", "content-language",
"content-disposition", "refresh", "x-dns-prefetch-control",
- "x-frame-options",
+ "x-frame-options", "onion-location",
// add more http headers if you need
// XXXbz don't add content-location support without reading bug
// 238654 and its dependencies/dups first.
diff --git a/dom/base/Document.h b/dom/base/Document.h
index 619484ceb2d0..18c28e40ed76 100644
--- a/dom/base/Document.h
+++ b/dom/base/Document.h
@@ -3374,6 +3374,7 @@ class Document : public nsINode,
void ReleaseCapture() const;
void MozSetImageElement(const nsAString& aImageElementId, Element* aElement);
nsIURI* GetDocumentURIObject() const;
+ nsIURI* GetOnionLocationURI() const { return mOnionLocationURI; }
// Not const because all the fullscreen goop is not const
const char* GetFullscreenError(CallerType);
bool FullscreenEnabled(CallerType aCallerType) {
@@ -4360,6 +4361,7 @@ class Document : public nsINode,
nsCOMPtr<nsIURI> mChromeXHRDocURI;
nsCOMPtr<nsIURI> mDocumentBaseURI;
nsCOMPtr<nsIURI> mChromeXHRDocBaseURI;
+ nsCOMPtr<nsIURI> mOnionLocationURI;
// The base domain of the document for third-party checks.
nsCString mBaseDomain;
diff --git a/dom/webidl/Document.webidl b/dom/webidl/Document.webidl
index 23a8f6a038b2..a3d06fb8e4be 100644
--- a/dom/webidl/Document.webidl
+++ b/dom/webidl/Document.webidl
@@ -717,3 +717,11 @@ partial interface Document {
[ChromeOnly]
void setNotifyFormOrPasswordRemoved(boolean aShouldNotify);
};
+
+/**
+ * Extension to allows chrome JS to know whether the document has a valid
+ * Onion-Location that we could redirect to.
+ */
+partial interface Document {
+ [ChromeOnly] readonly attribute URI? onionLocationURI;
+};
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index 238177c47894..0c8ea070ed45 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -10296,6 +10296,11 @@
value: ""
mirror: never
+- name: privacy.prioritizeonions.enabled
+ type: RelaxedAtomicBool
+ value: false
+ mirror: always
+
#---------------------------------------------------------------------------
# Prefs starting with "prompts."
#---------------------------------------------------------------------------
diff --git a/xpcom/ds/StaticAtoms.py b/xpcom/ds/StaticAtoms.py
index 0cc7799d4370..09a91aee3f2a 100644
--- a/xpcom/ds/StaticAtoms.py
+++ b/xpcom/ds/StaticAtoms.py
@@ -818,6 +818,7 @@ STATIC_ATOMS = [
Atom("oninputsourceschange", "oninputsourceschange"),
Atom("oninstall", "oninstall"),
Atom("oninvalid", "oninvalid"),
+ Atom("headerOnionLocation", "onion-location"),
Atom("onkeydown", "onkeydown"),
Atom("onkeypress", "onkeypress"),
Atom("onkeyup", "onkeyup"),
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 32418: Allow updates to be disabled via an enterprise policy.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 6d965bc1af6a1231e3c6181e348c125f2e16009a
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Apr 16 17:07:09 2020 -0400
Bug 32418: Allow updates to be disabled via an enterprise policy.
Restrict the Enterprise Policies mechanism to only consult a
policies.json file (avoiding the Windows Registry and macOS's
file system attributes).
Add a few disabledByPolicy() checks to the update service to
avoid extraneous (and potentially confusing) log messages when
updates are disabled by policy.
Sample content for distribution/policies.json:
{
"policies": {
"DisableAppUpdate": true
}
}
On Linux, avoid reading policies from /etc/firefox/policies/policies.json
---
.../enterprisepolicies/EnterprisePoliciesParent.jsm | 14 ++++++++++++--
toolkit/components/enterprisepolicies/moz.build | 3 +++
2 files changed, 15 insertions(+), 2 deletions(-)
diff --git a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
index 775144e8a649..9fe916236cbc 100644
--- a/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
+++ b/toolkit/components/enterprisepolicies/EnterprisePoliciesParent.jsm
@@ -4,6 +4,10 @@
var EXPORTED_SYMBOLS = ["EnterprisePoliciesManager"];
+// To ensure that policies intended for Firefox or another browser will not
+// be used, Tor Browser only looks for policies in ${InstallDir}/distribution
+#define AVOID_SYSTEM_POLICIES MOZ_PROXY_BYPASS_PROTECTION
+
const { XPCOMUtils } = ChromeUtils.import(
"resource://gre/modules/XPCOMUtils.jsm"
);
@@ -13,9 +17,11 @@ const { AppConstants } = ChromeUtils.import(
);
XPCOMUtils.defineLazyModuleGetters(this, {
+#ifndef AVOID_SYSTEM_POLICIES
WindowsGPOParser: "resource://gre/modules/policies/WindowsGPOParser.jsm",
macOSPoliciesParser:
"resource://gre/modules/policies/macOSPoliciesParser.jsm",
+#endif
Policies: "resource:///modules/policies/Policies.jsm",
JsonSchemaValidator:
"resource://gre/modules/components-utils/JsonSchemaValidator.jsm",
@@ -140,11 +146,13 @@ EnterprisePoliciesManager.prototype = {
_chooseProvider() {
let platformProvider = null;
+#ifndef AVOID_SYSTEM_POLICIES
if (AppConstants.platform == "win") {
platformProvider = new WindowsGPOPoliciesProvider();
} else if (AppConstants.platform == "macosx") {
platformProvider = new macOSPoliciesProvider();
}
+#endif
let jsonProvider = new JSONPoliciesProvider();
if (platformProvider && platformProvider.hasPolicies) {
if (jsonProvider.hasPolicies) {
@@ -491,7 +499,7 @@ class JSONPoliciesProvider {
_getConfigurationFile() {
let configFile = null;
-
+#ifndef AVOID_SYSTEM_POLICIES
if (AppConstants.platform == "linux") {
let systemConfigFile = Cc["@mozilla.org/file/local;1"].createInstance(
Ci.nsIFile
@@ -504,7 +512,7 @@ class JSONPoliciesProvider {
return systemConfigFile;
}
}
-
+#endif
try {
let perUserPath = Services.prefs.getBoolPref(PREF_PER_USER_DIR, false);
if (perUserPath) {
@@ -585,6 +593,7 @@ class JSONPoliciesProvider {
}
}
+#ifndef AVOID_SYSTEM_POLICIES
class WindowsGPOPoliciesProvider {
constructor() {
this._policies = null;
@@ -686,3 +695,4 @@ class CombinedProvider {
return false;
}
}
+#endif
diff --git a/toolkit/components/enterprisepolicies/moz.build b/toolkit/components/enterprisepolicies/moz.build
index 09d2046e1bd7..3f685d3fbbd6 100644
--- a/toolkit/components/enterprisepolicies/moz.build
+++ b/toolkit/components/enterprisepolicies/moz.build
@@ -19,6 +19,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] != "android":
EXTRA_JS_MODULES += [
"EnterprisePolicies.jsm",
"EnterprisePoliciesContent.jsm",
+ ]
+
+ EXTRA_PP_JS_MODULES += [
"EnterprisePoliciesParent.jsm",
]
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 30605: Honor privacy.spoof_english in Android
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 7017ce4bf730f179e1a0fd8191cff26e6abef1da
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Oct 16 10:45:17 2020 +0200
Bug 30605: Honor privacy.spoof_english in Android
This checks `privacy.spoof_english` whenever `setLocales` is
called from Fenix side and sets `intl.accept_languages`
accordingly.
---
mobile/android/components/geckoview/GeckoViewStartup.jsm | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/mobile/android/components/geckoview/GeckoViewStartup.jsm b/mobile/android/components/geckoview/GeckoViewStartup.jsm
index 3603c3743fa1..b73a5f4f0978 100644
--- a/mobile/android/components/geckoview/GeckoViewStartup.jsm
+++ b/mobile/android/components/geckoview/GeckoViewStartup.jsm
@@ -17,6 +17,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
EventDispatcher: "resource://gre/modules/Messaging.jsm",
Preferences: "resource://gre/modules/Preferences.jsm",
Services: "resource://gre/modules/Services.jsm",
+ RFPHelper: "resource://gre/modules/RFPHelper.jsm",
});
const { debug, warn } = GeckoViewUtils.initLogging("Startup");
@@ -252,6 +253,10 @@ class GeckoViewStartup {
if (aData.requestedLocales) {
Services.locale.requestedLocales = aData.requestedLocales;
}
+ RFPHelper._handleSpoofEnglishChanged();
+ if (Services.prefs.getIntPref("privacy.spoof_english", 0) === 2) {
+ break;
+ }
const pls = Cc["@mozilla.org/pref-localizedstring;1"].createInstance(
Ci.nsIPrefLocalizedString
);
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit eb7df091bdd8a2899982187d1286aa307f3e2444
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Jul 14 11:15:07 2020 -0400
Bug 33852: Clean up about:logins (LockWise) to avoid mentioning sync, etc.
Hide elements on about:logins that mention sync, "Firefox LockWise", and
Mozilla's LockWise mobile apps.
Disable the "Create New Login" button when security.nocertdb is true.
---
browser/components/aboutlogins/AboutLoginsParent.jsm | 2 ++
browser/components/aboutlogins/content/aboutLogins.css | 8 +++++++-
browser/components/aboutlogins/content/aboutLogins.js | 6 ++++++
.../aboutlogins/content/components/fxaccounts-button.css | 5 +++++
.../components/aboutlogins/content/components/menu-button.css | 10 ++++++++++
5 files changed, 30 insertions(+), 1 deletion(-)
diff --git a/browser/components/aboutlogins/AboutLoginsParent.jsm b/browser/components/aboutlogins/AboutLoginsParent.jsm
index db0b55d26abc..39fd2356ce99 100644
--- a/browser/components/aboutlogins/AboutLoginsParent.jsm
+++ b/browser/components/aboutlogins/AboutLoginsParent.jsm
@@ -61,6 +61,7 @@ XPCOMUtils.defineLazyGetter(this, "AboutLoginsL10n", () => {
const ABOUT_LOGINS_ORIGIN = "about:logins";
const MASTER_PASSWORD_NOTIFICATION_ID = "master-password-login-required";
+const NOCERTDB_PREF = "security.nocertdb";
// about:logins will always use the privileged content process,
// even if it is disabled for other consumers such as about:newtab.
@@ -273,6 +274,7 @@ class AboutLoginsParent extends JSWindowActorParent {
importVisible:
Services.policies.isAllowed("profileImport") &&
AppConstants.platform != "linux",
+ canCreateLogins: !Services.prefs.getBoolPref(NOCERTDB_PREF, false),
});
await AboutLogins._sendAllLoginRelatedObjects(
diff --git a/browser/components/aboutlogins/content/aboutLogins.css b/browser/components/aboutlogins/content/aboutLogins.css
index e3528ca49b84..eaa224178487 100644
--- a/browser/components/aboutlogins/content/aboutLogins.css
+++ b/browser/components/aboutlogins/content/aboutLogins.css
@@ -69,6 +69,11 @@ login-item {
grid-area: login;
}
+/* Do not promote Mozilla Sync in Tor Browser. */
+login-intro {
+ display: none !important;
+}
+
#branding-logo {
flex-basis: var(--sidebar-width);
flex-shrink: 0;
@@ -83,7 +88,8 @@ login-item {
}
}
-:root:not(.official-branding) #branding-logo {
+/* Hide "Firefox LockWise" branding in Tor Browser. */
+#branding-logo {
visibility: hidden;
}
diff --git a/browser/components/aboutlogins/content/aboutLogins.js b/browser/components/aboutlogins/content/aboutLogins.js
index a7449f8343b3..f288fb6988fb 100644
--- a/browser/components/aboutlogins/content/aboutLogins.js
+++ b/browser/components/aboutlogins/content/aboutLogins.js
@@ -22,6 +22,9 @@ const gElements = {
".menuitem-remove-all-logins"
);
},
+ get createNewLoginButton() {
+ return this.loginList.shadowRoot.querySelector(".create-login-button");
+ },
};
let numberOfLogins = 0;
@@ -111,6 +114,9 @@ window.addEventListener("AboutLoginsChromeToContent", event => {
gElements.loginList.setSortDirection(event.detail.value.selectedSort);
document.documentElement.classList.add("initialized");
gElements.loginList.classList.add("initialized");
+ if (!event.detail.value.canCreateLogins) {
+ gElements.createNewLoginButton.disabled = true;
+ }
break;
}
case "ShowLoginItemError": {
diff --git a/browser/components/aboutlogins/content/components/fxaccounts-button.css b/browser/components/aboutlogins/content/components/fxaccounts-button.css
index c8925f6fc75d..55c2a8810fa1 100644
--- a/browser/components/aboutlogins/content/components/fxaccounts-button.css
+++ b/browser/components/aboutlogins/content/components/fxaccounts-button.css
@@ -8,6 +8,11 @@
align-items: center;
}
+/* Do not promote Mozilla Sync in Tor Browser. */
+.logged-out-view {
+ display: none !important;
+}
+
.fxaccounts-extra-text {
/* Only show at most 3 lines of text to limit the
text from overflowing the header. */
diff --git a/browser/components/aboutlogins/content/components/menu-button.css b/browser/components/aboutlogins/content/components/menu-button.css
index 6bc14f7892fa..22a06e3727ed 100644
--- a/browser/components/aboutlogins/content/components/menu-button.css
+++ b/browser/components/aboutlogins/content/components/menu-button.css
@@ -91,3 +91,13 @@
.menuitem-preferences {
background-image: url("chrome://global/skin/icons/settings.svg");
}
+
+/*
+ * Do not promote LockWise mobile apps in Tor Browser: hide the menu items
+ * and the separator line that precedes them.
+ */
+.menuitem-mobile-android,
+.menuitem-mobile-ios,
+button[data-event-name="AboutLoginsGetHelp"] + hr {
+ display: none !important;
+}
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40002: Remove about:ion
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 134d6fa567dd0a99a11bbd913d0c4bcafb067237
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Aug 14 09:06:33 2020 -0400
Bug 40002: Remove about:ion
Firefox Ion (previously Firefox Pioneer) is an opt-in program in which people
volunteer to participate in studies that collect detailed, sensitive data about
how they use their browser.
---
browser/components/about/AboutRedirector.cpp | 2 --
browser/components/about/components.conf | 1 -
2 files changed, 3 deletions(-)
diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp
index e6cf3fe0ef9f..323c1b6fb653 100644
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -122,8 +122,6 @@ static const RedirEntry kRedirMap[] = {
nsIAboutModule::HIDE_FROM_ABOUTABOUT},
{"restartrequired", "chrome://browser/content/aboutRestartRequired.xhtml",
nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT},
- {"ion", "chrome://browser/content/ion.html",
- nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT},
#ifdef TOR_BROWSER_UPDATE
{"tbupdate", "chrome://browser/content/abouttbupdate/aboutTBUpdate.xhtml",
nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
diff --git a/browser/components/about/components.conf b/browser/components/about/components.conf
index faf6107d6fa6..67f178ee23ff 100644
--- a/browser/components/about/components.conf
+++ b/browser/components/about/components.conf
@@ -13,7 +13,6 @@ pages = [
'logins',
'loginsimportreport',
'newtab',
- 'ion',
'pocket-home',
'pocket-saved',
'pocket-signup',
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40025: Remove Mozilla add-on install permissions
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 8a1de16d05039fd5f4709a76ba09638ff2ea8411
Author: Alex Catarineu <acat(a)torproject.org>
Date: Mon Jul 27 18:12:55 2020 +0200
Bug 40025: Remove Mozilla add-on install permissions
---
browser/app/permissions | 5 -----
1 file changed, 5 deletions(-)
diff --git a/browser/app/permissions b/browser/app/permissions
index 79b6aa6505bd..2cae334be9b4 100644
--- a/browser/app/permissions
+++ b/browser/app/permissions
@@ -12,11 +12,6 @@
origin uitour 1 https://3g2upl4pq6kufc4m.onion
origin uitour 1 about:tor
-# XPInstall
-origin install 1 https://addons.mozilla.org
-
# Remote troubleshooting
origin remote-troubleshooting 1 https://support.mozilla.org
-# addon install
-origin install 1 https://fpn.firefox.com
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 4f9148b0b768e48b12a3b7f864cba02109698069
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Nov 4 15:58:22 2020 +0100
Bug 40171: Make WebRequest and GeckoWebExecutor First-Party aware
---
.../main/java/org/mozilla/geckoview/WebRequest.java | 18 ++++++++++++++++++
widget/android/WebExecutorSupport.cpp | 10 ++++++++++
2 files changed, 28 insertions(+)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebRequest.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebRequest.java
index d1d6e06b7396..4e17bc034edb 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebRequest.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/WebRequest.java
@@ -51,6 +51,11 @@ public class WebRequest extends WebMessage {
*/
public final @Nullable String referrer;
+ /**
+ * The value of the origin of this request.
+ */
+ public final @Nullable String origin;
+
@Retention(RetentionPolicy.SOURCE)
@IntDef({CACHE_MODE_DEFAULT, CACHE_MODE_NO_STORE,
CACHE_MODE_RELOAD, CACHE_MODE_NO_CACHE,
@@ -112,6 +117,7 @@ public class WebRequest extends WebMessage {
method = builder.mMethod;
cacheMode = builder.mCacheMode;
referrer = builder.mReferrer;
+ origin = builder.mOrigin;
if (builder.mBody != null) {
body = builder.mBody.asReadOnlyBuffer();
@@ -128,6 +134,7 @@ public class WebRequest extends WebMessage {
/* package */ String mMethod = "GET";
/* package */ int mCacheMode = CACHE_MODE_DEFAULT;
/* package */ String mReferrer;
+ /* package */ String mOrigin;
/**
* Construct a Builder instance with the specified URI.
@@ -226,6 +233,17 @@ public class WebRequest extends WebMessage {
return this;
}
+ /**
+ * Set the origin URI.
+ *
+ * @param origin A URI String
+ * @return This Builder instance.
+ */
+ public @NonNull Builder origin(final @Nullable String origin) {
+ mOrigin = origin;
+ return this;
+ }
+
/**
* @return A {@link WebRequest} constructed with the values from this Builder instance.
*/
diff --git a/widget/android/WebExecutorSupport.cpp b/widget/android/WebExecutorSupport.cpp
index 99e7de95a0fb..bbdcc8f36bd6 100644
--- a/widget/android/WebExecutorSupport.cpp
+++ b/widget/android/WebExecutorSupport.cpp
@@ -393,6 +393,16 @@ nsresult WebExecutorSupport::CreateStreamLoader(
MOZ_ASSERT(cookieJarSettings);
nsCOMPtr<nsILoadInfo> loadInfo = channel->LoadInfo();
+
+ RefPtr<nsIURI> originUri;
+ const auto origin = req->Origin();
+ if (origin) {
+ rv = NS_NewURI(getter_AddRefs(originUri), origin->ToString());
+ NS_ENSURE_SUCCESS(rv, NS_ERROR_MALFORMED_URI);
+ OriginAttributes attrs = loadInfo->GetOriginAttributes();
+ attrs.SetFirstPartyDomain(true, originUri);
+ loadInfo->SetOriginAttributes(attrs);
+ }
loadInfo->SetCookieJarSettings(cookieJarSettings);
// setup http/https specific things
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 0e4639264b2f291553fadf52441071d9e03bfc3d
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Oct 20 17:44:36 2020 +0200
Bug 40199: Avoid using system locale for intl.accept_languages in GeckoView
---
.../mozilla/geckoview/GeckoRuntimeSettings.java | 28 +++++++++++++---------
1 file changed, 17 insertions(+), 11 deletions(-)
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
index c573ee7688f3..d88e296d554a 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
@@ -821,19 +821,25 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
private String computeAcceptLanguages() {
final ArrayList<String> locales = new ArrayList<String>();
- // Explicitly-set app prefs come first:
- if (mRequestedLocales != null) {
- for (final String locale : mRequestedLocales) {
- locales.add(locale.toLowerCase(Locale.ROOT));
- }
- }
- // OS prefs come second:
- for (final String locale : getDefaultLocales()) {
- final String localeLowerCase = locale.toLowerCase(Locale.ROOT);
- if (!locales.contains(localeLowerCase)) {
- locales.add(localeLowerCase);
+ // In Desktop, these are defined in the `intl.accept_languages` localized property.
+ // At some point we should probably use the same values here, but for now we use a simple
+ // strategy which will hopefully result in reasonable acceptLanguage values.
+ if (mRequestedLocales != null && mRequestedLocales.length > 0) {
+ String locale = mRequestedLocales[0].toLowerCase(Locale.ROOT);
+ // No need to include `en-us` twice.
+ if (!locale.equals("en-us")) {
+ locales.add(locale);
+ if (locale.contains("-")) {
+ String lang = locale.split("-")[0];
+ // No need to include `en` twice.
+ if (!lang.equals("en")) {
+ locales.add(lang);
+ }
+ }
}
}
+ locales.add("en-us");
+ locales.add("en");
return TextUtils.join(",", locales);
}
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40309: Avoid using regional OS locales
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 5185914be8bb658278ddf9eed5687cfc10be56ea
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Jan 27 11:28:05 2021 +0100
Bug 40309: Avoid using regional OS locales
Only use regional OS locales if the pref
`intl.regional_prefs.use_os_locales` is set to true.
---
intl/locale/LocaleService.cpp | 25 -------------------------
1 file changed, 25 deletions(-)
diff --git a/intl/locale/LocaleService.cpp b/intl/locale/LocaleService.cpp
index 022d41cab2e2..ac001ee98991 100644
--- a/intl/locale/LocaleService.cpp
+++ b/intl/locale/LocaleService.cpp
@@ -452,31 +452,6 @@ LocaleService::GetRegionalPrefsLocales(nsTArray<nsCString>& aRetVal) {
OSPreferences::GetInstance()->GetRegionalPrefsLocales(aRetVal))) {
return NS_OK;
}
-
- // If we fail to retrieve them, return the app locales.
- GetAppLocalesAsBCP47(aRetVal);
- return NS_OK;
- }
-
- // Otherwise, fetch OS Regional Preferences locales and compare the first one
- // to the app locale. If the language subtag matches, we can safely use
- // the OS Regional Preferences locale.
- //
- // This facilitates scenarios such as Firefox in "en-US" and User sets
- // regional prefs to "en-GB".
- nsAutoCString appLocale;
- AutoTArray<nsCString, 10> regionalPrefsLocales;
- LocaleService::GetInstance()->GetAppLocaleAsBCP47(appLocale);
-
- if (NS_FAILED(OSPreferences::GetInstance()->GetRegionalPrefsLocales(
- regionalPrefsLocales))) {
- GetAppLocalesAsBCP47(aRetVal);
- return NS_OK;
- }
-
- if (LocaleService::LanguagesMatch(appLocale, regionalPrefsLocales[0])) {
- aRetVal = regionalPrefsLocales.Clone();
- return NS_OK;
}
// Otherwise use the app locales.
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40073: Disable remote Public Suffix List fetching
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 4edeff4ab9b89dcffcabd5076c8bab2c9282f371
Author: Alex Catarineu <acat(a)torproject.org>
Date: Thu Aug 13 11:05:03 2020 +0200
Bug 40073: Disable remote Public Suffix List fetching
In https://bugzilla.mozilla.org/show_bug.cgi?id=1563246 Firefox implemented
fetching the Public Suffix List via RemoteSettings and replacing the default
one at runtime, which we do not want.
---
browser/components/BrowserGlue.jsm | 5 -----
1 file changed, 5 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index c23f926a2de2..e2e710237f47 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -71,7 +71,6 @@ XPCOMUtils.defineLazyModuleGetters(this, {
PluralForm: "resource://gre/modules/PluralForm.jsm",
PrivateBrowsingUtils: "resource://gre/modules/PrivateBrowsingUtils.jsm",
ProcessHangMonitor: "resource:///modules/ProcessHangMonitor.jsm",
- PublicSuffixList: "resource://gre/modules/netwerk-dns/PublicSuffixList.jsm",
RemoteSettings: "resource://services-settings/remote-settings.js",
RemoteSecuritySettings:
"resource://gre/modules/psm/RemoteSecuritySettings.jsm",
@@ -2650,10 +2649,6 @@ BrowserGlue.prototype = {
this._addBreachesSyncHandler();
},
- () => {
- PublicSuffixList.init();
- },
-
() => {
RemoteSecuritySettings.init();
},
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40198: Expose privacy.spoof_english pref in GeckoView
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 79a71e4f41679f187cc644dc300db86c4055468d
Author: Alex Catarineu <acat(a)torproject.org>
Date: Sun Oct 18 17:06:04 2020 +0200
Bug 40198: Expose privacy.spoof_english pref in GeckoView
---
mobile/android/geckoview/api.txt | 3 ++
.../mozilla/geckoview/GeckoRuntimeSettings.java | 33 ++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/mobile/android/geckoview/api.txt b/mobile/android/geckoview/api.txt
index b6c570b55c9d..6aeadc75f363 100644
--- a/mobile/android/geckoview/api.txt
+++ b/mobile/android/geckoview/api.txt
@@ -685,6 +685,7 @@ package org.mozilla.geckoview {
method public boolean getRemoteDebuggingEnabled();
method @Nullable public GeckoRuntime getRuntime();
method @Nullable public Rect getScreenSizeOverride();
+ method public boolean getSpoofEnglish();
method @Nullable public RuntimeTelemetry.Delegate getTelemetryDelegate();
method public int getTorSecurityLevel();
method public boolean getUseMaxScreenDepth();
@@ -707,6 +708,7 @@ package org.mozilla.geckoview {
method @NonNull public GeckoRuntimeSettings setLoginAutofillEnabled(boolean);
method @NonNull public GeckoRuntimeSettings setPreferredColorScheme(int);
method @NonNull public GeckoRuntimeSettings setRemoteDebuggingEnabled(boolean);
+ method @NonNull public GeckoRuntimeSettings setSpoofEnglish(boolean);
method @NonNull public GeckoRuntimeSettings setTorSecurityLevel(int);
method @NonNull public GeckoRuntimeSettings setWebFontsEnabled(boolean);
method @NonNull public GeckoRuntimeSettings setWebManifestEnabled(boolean);
@@ -747,6 +749,7 @@ package org.mozilla.geckoview {
method @NonNull public GeckoRuntimeSettings.Builder preferredColorScheme(int);
method @NonNull public GeckoRuntimeSettings.Builder remoteDebuggingEnabled(boolean);
method @NonNull public GeckoRuntimeSettings.Builder screenSizeOverride(int, int);
+ method @NonNull public GeckoRuntimeSettings.Builder spoofEnglish(boolean);
method @NonNull public GeckoRuntimeSettings.Builder telemetryDelegate(@NonNull RuntimeTelemetry.Delegate);
method @NonNull public GeckoRuntimeSettings.Builder torSecurityLevel(int);
method @NonNull public GeckoRuntimeSettings.Builder useMaxScreenDepth(boolean);
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
index d88e296d554a..5b54447cb6e6 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
@@ -483,6 +483,17 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
getSettings().mTorSecurityLevel.set(level);
return this;
}
+
+ /**
+ * Sets whether we should spoof locale to English for webpages.
+ *
+ * @param flag True if we should spoof locale to English for webpages, false otherwise.
+ * @return This Builder instance.
+ */
+ public @NonNull Builder spoofEnglish(final boolean flag) {
+ getSettings().mSpoofEnglish.set(flag ? 2 : 1);
+ return this;
+ }
}
private GeckoRuntime mRuntime;
@@ -541,6 +552,8 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
"dom.ipc.processCount", 2);
/* package */ final Pref<Integer> mTorSecurityLevel = new Pref<>(
"extensions.torbutton.security_slider", 4);
+ /* package */ final Pref<Integer> mSpoofEnglish = new Pref<>(
+ "privacy.spoof_english", 0);
/* package */ int mPreferredColorScheme = COLOR_SCHEME_SYSTEM;
@@ -1319,6 +1332,26 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
return this;
}
+ /**
+ * Get whether we should spoof locale to English for webpages.
+ *
+ * @return Whether we should spoof locale to English for webpages.
+ */
+ public boolean getSpoofEnglish() {
+ return mSpoofEnglish.get() == 2;
+ }
+
+ /**
+ * Set whether we should spoof locale to English for webpages.
+ *
+ * @param flag A flag determining whether we should locale to English for webpages.
+ * @return This GeckoRuntimeSettings instance.
+ */
+ public @NonNull GeckoRuntimeSettings setSpoofEnglish(final boolean flag) {
+ mSpoofEnglish.commit(flag ? 2 : 1);
+ return this;
+ }
+
@Override // Parcelable
public void writeToParcel(final Parcel out, final int flags) {
super.writeToParcel(out, flags);
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit b12d28e5767d735ad04929b3f745aa11ec2f9d65
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Oct 9 12:55:35 2020 +0200
Bug 40166: Disable security.certerrors.mitm.auto_enable_enterprise_roots
---
browser/app/profile/000-tor-browser.js | 3 +++
browser/components/BrowserGlue.jsm | 14 ++++++++++++++
2 files changed, 17 insertions(+)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 0200e68b5ce1..ea1aaa704e8b 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -319,6 +319,9 @@ pref("security.enterprise_roots.enabled", false);
// Don't ping Mozilla for MitM detection, see bug 32321
pref("security.certerrors.mitm.priming.enabled", false);
+// Don't automatically enable enterprise roots, see bug 40166
+pref("security.certerrors.mitm.auto_enable_enterprise_roots", false);
+
// Disable the language pack signing check for now on macOS, see #31942
#ifdef XP_MACOSX
pref("extensions.langpacks.signatures.required", false);
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index dd4ba916313d..5fccd7f0596b 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -1366,6 +1366,20 @@ BrowserGlue.prototype = {
// handle any UI migration
this._migrateUI();
+ // Clear possibly auto enabled enterprise_roots prefs (see bug 40166)
+ if (
+ !Services.prefs.getBoolPref(
+ "security.certerrors.mitm.auto_enable_enterprise_roots"
+ ) &&
+ Services.prefs.getBoolPref(
+ "security.enterprise_roots.auto-enabled",
+ false
+ )
+ ) {
+ Services.prefs.clearUserPref("security.enterprise_roots.enabled");
+ Services.prefs.clearUserPref("security.enterprise_roots.auto-enabled");
+ }
+
if (!Services.prefs.prefHasUserValue(PREF_PDFJS_ISDEFAULT_CACHE_STATE)) {
PdfJs.checkIsDefault(this._isNewProfile);
}
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] fixup! Bug 28005: Implement .onion alias urlbar rewrites
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit f0c50915c461440d7f9aade333293c3d4ae08923
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Fri Jul 2 15:42:05 2021 +0200
fixup! Bug 28005: Implement .onion alias urlbar rewrites
---
docshell/base/nsIWebNavigation.idl | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/docshell/base/nsIWebNavigation.idl b/docshell/base/nsIWebNavigation.idl
index fa00e155cba7..98f3b6a2f9a3 100644
--- a/docshell/base/nsIWebNavigation.idl
+++ b/docshell/base/nsIWebNavigation.idl
@@ -271,7 +271,7 @@ interface nsIWebNavigation : nsISupports
/**
* Allow rewriting the urlbar to a short .onion alias.
*/
- const unsigned long LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES = 0x8000000;
+ const unsigned long LOAD_FLAGS_ALLOW_ONION_URLBAR_REWRITES = 0x9000000;
/**
* Loads a given URI. This will give priority to loading the requested URI
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40432: Prevent probing installed applications
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 7b8a3a3854907ffb6d95ed9b9d7a65b50cc7a893
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon May 17 18:09:09 2021 +0000
Bug 40432: Prevent probing installed applications
---
.../exthandler/nsExternalHelperAppService.cpp | 30 ++++++++++++++++++----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp
index 12e08843da20..3d60ab37b9f6 100644
--- a/uriloader/exthandler/nsExternalHelperAppService.cpp
+++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
@@ -1050,8 +1050,33 @@ nsresult nsExternalHelperAppService::GetFileTokenForPath(
//////////////////////////////////////////////////////////////////////////////////////////////////////
// begin external protocol service default implementation...
//////////////////////////////////////////////////////////////////////////////////////////////////////
+
+static const char kExternalProtocolPrefPrefix[] =
+ "network.protocol-handler.external.";
+static const char kExternalProtocolDefaultPref[] =
+ "network.protocol-handler.external-default";
+
NS_IMETHODIMP nsExternalHelperAppService::ExternalProtocolHandlerExists(
const char* aProtocolScheme, bool* aHandlerExists) {
+
+ // Replicate the same check performed in LoadURI.
+ // Deny load if the prefs say to do so
+ nsAutoCString externalPref(kExternalProtocolPrefPrefix);
+ externalPref += aProtocolScheme;
+ bool allowLoad = false;
+ *aHandlerExists = false;
+ if (NS_FAILED(Preferences::GetBool(externalPref.get(), &allowLoad))) {
+ // no scheme-specific value, check the default
+ if (NS_FAILED(
+ Preferences::GetBool(kExternalProtocolDefaultPref, &allowLoad))) {
+ return NS_OK; // missing default pref
+ }
+ }
+
+ if (!allowLoad) {
+ return NS_OK; // explicitly denied
+ }
+
nsCOMPtr<nsIHandlerInfo> handlerInfo;
nsresult rv = GetProtocolHandlerInfo(nsDependentCString(aProtocolScheme),
getter_AddRefs(handlerInfo));
@@ -1094,11 +1119,6 @@ NS_IMETHODIMP nsExternalHelperAppService::IsExposedProtocol(
return NS_OK;
}
-static const char kExternalProtocolPrefPrefix[] =
- "network.protocol-handler.external.";
-static const char kExternalProtocolDefaultPref[] =
- "network.protocol-handler.external-default";
-
NS_IMETHODIMP
nsExternalHelperAppService::LoadURI(nsIURI* aURI,
nsIPrincipal* aTriggeringPrincipal,
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40125: Expose Security Level pref in GeckoView
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 8f2083157d843b9a86fc3b060df06125214a5e0b
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Sep 14 02:52:28 2020 +0000
Bug 40125: Expose Security Level pref in GeckoView
---
mobile/android/geckoview/api.txt | 3 ++
.../mozilla/geckoview/GeckoRuntimeSettings.java | 33 ++++++++++++++++++++++
2 files changed, 36 insertions(+)
diff --git a/mobile/android/geckoview/api.txt b/mobile/android/geckoview/api.txt
index a40a351c3aa6..b6c570b55c9d 100644
--- a/mobile/android/geckoview/api.txt
+++ b/mobile/android/geckoview/api.txt
@@ -686,6 +686,7 @@ package org.mozilla.geckoview {
method @Nullable public GeckoRuntime getRuntime();
method @Nullable public Rect getScreenSizeOverride();
method @Nullable public RuntimeTelemetry.Delegate getTelemetryDelegate();
+ method public int getTorSecurityLevel();
method public boolean getUseMaxScreenDepth();
method public boolean getWebFontsEnabled();
method public boolean getWebManifestEnabled();
@@ -706,6 +707,7 @@ package org.mozilla.geckoview {
method @NonNull public GeckoRuntimeSettings setLoginAutofillEnabled(boolean);
method @NonNull public GeckoRuntimeSettings setPreferredColorScheme(int);
method @NonNull public GeckoRuntimeSettings setRemoteDebuggingEnabled(boolean);
+ method @NonNull public GeckoRuntimeSettings setTorSecurityLevel(int);
method @NonNull public GeckoRuntimeSettings setWebFontsEnabled(boolean);
method @NonNull public GeckoRuntimeSettings setWebManifestEnabled(boolean);
field public static final int ALLOW_ALL = 0;
@@ -746,6 +748,7 @@ package org.mozilla.geckoview {
method @NonNull public GeckoRuntimeSettings.Builder remoteDebuggingEnabled(boolean);
method @NonNull public GeckoRuntimeSettings.Builder screenSizeOverride(int, int);
method @NonNull public GeckoRuntimeSettings.Builder telemetryDelegate(@NonNull RuntimeTelemetry.Delegate);
+ method @NonNull public GeckoRuntimeSettings.Builder torSecurityLevel(int);
method @NonNull public GeckoRuntimeSettings.Builder useMaxScreenDepth(boolean);
method @NonNull public GeckoRuntimeSettings.Builder webFontsEnabled(boolean);
method @NonNull public GeckoRuntimeSettings.Builder webManifest(boolean);
diff --git a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
index 5de0b00f7a0c..c573ee7688f3 100644
--- a/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
+++ b/mobile/android/geckoview/src/main/java/org/mozilla/geckoview/GeckoRuntimeSettings.java
@@ -472,6 +472,17 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
getSettings().setAllowInsecureConnections(level);
return this;
}
+
+ /**
+ * Set security level.
+ *
+ * @param level A value determining the security level. Default is 0.
+ * @return This Builder instance.
+ */
+ public @NonNull Builder torSecurityLevel(final int level) {
+ getSettings().mTorSecurityLevel.set(level);
+ return this;
+ }
}
private GeckoRuntime mRuntime;
@@ -528,6 +539,8 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
"dom.security.https_only_mode_pbm", false);
/* package */ final Pref<Integer> mProcessCount = new Pref<>(
"dom.ipc.processCount", 2);
+ /* package */ final Pref<Integer> mTorSecurityLevel = new Pref<>(
+ "extensions.torbutton.security_slider", 4);
/* package */ int mPreferredColorScheme = COLOR_SCHEME_SYSTEM;
@@ -1280,6 +1293,26 @@ public final class GeckoRuntimeSettings extends RuntimeSettings {
return this;
}
+ /**
+ * Gets the current security level.
+ *
+ * @return current security protection level
+ */
+ public int getTorSecurityLevel() {
+ return mTorSecurityLevel.get();
+ }
+
+ /**
+ * Sets the Tor Security Level.
+ *
+ * @param level security protection level
+ * @return This GeckoRuntimeSettings instance.
+ */
+ public @NonNull GeckoRuntimeSettings setTorSecurityLevel(final int level) {
+ mTorSecurityLevel.commit(level);
+ return this;
+ }
+
@Override // Parcelable
public void writeToParcel(final Parcel out, final int flags) {
super.writeToParcel(out, flags);
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40091: Load HTTPS Everywhere as a builtin addon in desktop
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit da950b7045e49c749ed0aeae911dc8446536fa79
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Sep 4 12:34:35 2020 +0200
Bug 40091: Load HTTPS Everywhere as a builtin addon in desktop
This loads HTTPS Everywhere as a builtin addon from a hardcoded
resource:// URI in desktop. It also ensures that the non-builtin
HTTPS Everywhere addon is always uninstalled on browser startup.
The reason of making this desktop-only is that there are some issues
when installing a builtin extension from geckoview side, making
the extension not available on first startup. So, at least for
now we handle the Fenix case separately. See #40118 for a followup
for investigating these.
---
browser/components/BrowserGlue.jsm | 37 ++++++++++++++++++++++
toolkit/components/extensions/Extension.jsm | 10 ++++--
.../mozapps/extensions/internal/XPIProvider.jsm | 13 ++++++++
3 files changed, 57 insertions(+), 3 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index e2e710237f47..dd4ba916313d 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -45,6 +45,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
DownloadsViewableInternally:
"resource:///modules/DownloadsViewableInternally.jsm",
E10SUtils: "resource://gre/modules/E10SUtils.jsm",
+ ExtensionData: "resource://gre/modules/Extension.jsm",
ExtensionsUI: "resource:///modules/ExtensionsUI.jsm",
FeatureGate: "resource://featuregates/FeatureGate.jsm",
FirefoxMonitor: "resource:///modules/FirefoxMonitor.jsm",
@@ -121,6 +122,13 @@ XPCOMUtils.defineLazyServiceGetters(this, {
PushService: ["@mozilla.org/push/Service;1", "nsIPushService"],
});
+XPCOMUtils.defineLazyServiceGetters(this, {
+ resProto: [
+ "@mozilla.org/network/protocol;1?name=resource",
+ "nsISubstitutingProtocolHandler",
+ ],
+});
+
const PREF_PDFJS_ISDEFAULT_CACHE_STATE = "pdfjs.enabledCache.state";
/**
@@ -1383,6 +1391,35 @@ BrowserGlue.prototype = {
"resource://builtin-themes/alpenglow/"
);
+ // Install https-everywhere builtin addon if needed.
+ (async () => {
+ const HTTPS_EVERYWHERE_ID = "https-everywhere-eff(a)eff.org";
+ const HTTPS_EVERYWHERE_BUILTIN_URL =
+ "resource://torbutton/content/extensions/https-everywhere/";
+ // This does something similar as GeckoViewWebExtension.jsm: it tries
+ // to load the manifest to retrieve the version of the builtin and
+ // compares it to the currently installed one to see whether we need
+ // to install or not. Here we delegate that to
+ // AddonManager.maybeInstallBuiltinAddon.
+ try {
+ const resolvedURI = Services.io.newURI(
+ resProto.resolveURI(Services.io.newURI(HTTPS_EVERYWHERE_BUILTIN_URL))
+ );
+ const extensionData = new ExtensionData(resolvedURI);
+ const manifest = await extensionData.loadManifest();
+
+ await AddonManager.maybeInstallBuiltinAddon(
+ HTTPS_EVERYWHERE_ID,
+ manifest.version,
+ HTTPS_EVERYWHERE_BUILTIN_URL
+ );
+ } catch (e) {
+ const log = Log.repository.getLogger("HttpsEverywhereBuiltinLoader");
+ log.addAppender(new Log.ConsoleAppender(new Log.BasicFormatter()));
+ log.error("Could not install https-everywhere extension", e);
+ }
+ })();
+
if (AppConstants.MOZ_NORMANDY) {
Normandy.init();
}
diff --git a/toolkit/components/extensions/Extension.jsm b/toolkit/components/extensions/Extension.jsm
index 96054179fc3f..eb85fcf0390a 100644
--- a/toolkit/components/extensions/Extension.jsm
+++ b/toolkit/components/extensions/Extension.jsm
@@ -226,6 +226,7 @@ const LOGGER_ID_BASE = "addons.webextension.";
const UUID_MAP_PREF = "extensions.webextensions.uuids";
const LEAVE_STORAGE_PREF = "extensions.webextensions.keepStorageOnUninstall";
const LEAVE_UUID_PREF = "extensions.webextensions.keepUuidOnUninstall";
+const PERSISTENT_EXTENSIONS = new Set(["https-everywhere-eff(a)eff.org"]);
const COMMENT_REGEXP = new RegExp(
String.raw`
@@ -372,7 +373,8 @@ var ExtensionAddonObserver = {
);
}
- if (!Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false)) {
+ if (!Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false) &&
+ !PERSISTENT_EXTENSIONS.has(addon.id)) {
// Clear browser.storage.local backends.
AsyncShutdown.profileChangeTeardown.addBlocker(
`Clear Extension Storage ${addon.id} (File Backend)`,
@@ -420,7 +422,8 @@ var ExtensionAddonObserver = {
ExtensionPermissions.removeAll(addon.id);
- if (!Services.prefs.getBoolPref(LEAVE_UUID_PREF, false)) {
+ if (!Services.prefs.getBoolPref(LEAVE_UUID_PREF, false) &&
+ !PERSISTENT_EXTENSIONS.has(addon.id)) {
// Clear the entry in the UUID map
UUIDMap.remove(addon.id);
}
@@ -2637,7 +2640,8 @@ class Extension extends ExtensionData {
);
} else if (
this.startupReason === "ADDON_INSTALL" &&
- !Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false)
+ !Services.prefs.getBoolPref(LEAVE_STORAGE_PREF, false) &&
+ !PERSISTENT_EXTENSIONS.has(this.id)
) {
// If the extension has been just installed, set it as migrated,
// because there will not be any data to migrate.
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index ddf6f0049054..d4858412e486 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -1501,6 +1501,19 @@ var XPIStates = {
continue;
}
+ // Uninstall HTTPS Everywhere if it is installed in the user profile.
+ if (
+ id === "https-everywhere-eff(a)eff.org" &&
+ loc.name === KEY_APP_PROFILE
+ ) {
+ logger.debug(
+ "Uninstalling the HTTPS Everywhere extension from user profile."
+ );
+ loc.installer.uninstallAddon(id);
+ changed = true;
+ continue;
+ }
+
let xpiState = loc.get(id);
if (!xpiState) {
// If the location is not supported for sideloading, skip new
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 12620: TorBrowser regression tests
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 80ac4ba7bef524e82136dec16a9ff9f069969ca1
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Aug 27 16:25:00 2014 -0700
Bug 12620: TorBrowser regression tests
Regression tests for Bug #2950: Make Permissions Manager memory-only
Regression tests for TB4: Tor Browser's Firefox preference overrides.
Note: many more functional tests could be made here
Regression tests for #2874: Block Components.interfaces from content
Bug 18923: Add a script to run all Tor Browser specific tests
Regression tests for Bug #16441: Suppress "Reset Tor Browser" prompt.
---
run-tbb-tests | 66 +++++++++++++++++++++++++++++++++++
tbb-tests-ignore.txt | 13 +++++++
tbb-tests/browser.ini | 5 +++
tbb-tests/browser_tor_TB4.js | 35 +++++++++++++++++++
tbb-tests/browser_tor_bug2950.js | 74 ++++++++++++++++++++++++++++++++++++++++
tbb-tests/mochitest.ini | 3 ++
tbb-tests/moz.build | 9 +++++
tbb-tests/test_tor_bug2874.html | 25 ++++++++++++++
toolkit/toolkit.mozbuild | 3 +-
9 files changed, 232 insertions(+), 1 deletion(-)
diff --git a/run-tbb-tests b/run-tbb-tests
new file mode 100755
index 000000000000..bc09839f9f05
--- /dev/null
+++ b/run-tbb-tests
@@ -0,0 +1,66 @@
+#!/bin/bash
+
+# This script runs all the Mochitest tests that have been added or
+# modified since the last ffxbld commit.
+#
+# It does not currently run XPCShell tests. We should change this if we
+# start using this type or other types of tests.
+#
+# The logs of the tests are stored in the tbb-tests.log file.
+# Ignored tests are listed in the tbb-tests-ignore.txt file.
+#
+# https://trac.torproject.org/projects/tor/ticket/18923
+
+IFS=$'\n'
+
+if [ -n "$USE_TESTS_LIST" ] && [ -f tbb-tests-list.txt ]
+then
+ echo "Using tests list from file tbb-tests-list.txt"
+ tests=($(cat tbb-tests-list.txt))
+else
+ ffxbld_commit=$(git log -500 --format='oneline' | grep "TB3: Tor Browser's official .mozconfigs." \
+ | head -1 | cut -d ' ' -f 1)
+
+ tests=($(git diff --name-status "$ffxbld_commit" HEAD | \
+ grep -e '^[AM].*/test_[^/]\+\.\(html\|xul\)$' \
+ -e '^[AM].*/browser_[^/]\+\.js$' \
+ | sed 's/^[AM]\s\+//'))
+fi
+
+echo 'The following tests will be run:'
+for i in "${!tests[@]}"
+do
+ if [ -z "$USE_TESTS_LIST" ] \
+ && grep -q "^${tests[$i]}$" tbb-tests-ignore.txt
+ then
+ unset "tests[$i]"
+ continue
+ fi
+ echo "- ${tests[$i]}"
+done
+
+if [ -n "$WRITE_TESTS_LIST" ]
+then
+ rm -f tbb-tests-list.txt
+ for i in "${!tests[@]}"
+ do
+ echo "${tests[$i]}" >> tbb-tests-list.txt
+ done
+ exit 0
+fi
+
+rm -f tbb-tests.log
+echo $'\n''Starting tests'
+# We need `security.nocertdb = false` because of #18087. That pref is
+# forced to have the same value as `browser.privatebrowsing.autostart` in
+# torbutton, so we just set `browser.privatebrowsing.autostart=false` here.
+./mach mochitest --log-tbpl tbb-tests.log \
+ --setpref network.file.path_blacklist='' \
+ --setpref extensions.torbutton.use_nontor_proxy=true \
+ --setpref browser.privatebrowsing.autostart=false \
+ "${tests[@]}"
+
+echo "*************************"
+echo "*************************"
+echo "Summary of failed tests:"
+grep --color=never TEST-UNEXPECTED-FAIL tbb-tests.log
diff --git a/tbb-tests-ignore.txt b/tbb-tests-ignore.txt
new file mode 100644
index 000000000000..ee3927a9e7c4
--- /dev/null
+++ b/tbb-tests-ignore.txt
@@ -0,0 +1,13 @@
+browser/extensions/onboarding/test/browser/browser_onboarding_accessibility.js
+browser/extensions/onboarding/test/browser/browser_onboarding_keyboard.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification_2.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification_3.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification_4.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification_5.js
+browser/extensions/onboarding/test/browser/browser_onboarding_notification_click_auto_complete_tour.js
+browser/extensions/onboarding/test/browser/browser_onboarding_select_default_tour.js
+browser/extensions/onboarding/test/browser/browser_onboarding_skip_tour.js
+browser/extensions/onboarding/test/browser/browser_onboarding_tours.js
+browser/extensions/onboarding/test/browser/browser_onboarding_tourset.js
+browser/extensions/onboarding/test/browser/browser_onboarding_uitour.js
diff --git a/tbb-tests/browser.ini b/tbb-tests/browser.ini
new file mode 100644
index 000000000000..f481660f1417
--- /dev/null
+++ b/tbb-tests/browser.ini
@@ -0,0 +1,5 @@
+[DEFAULT]
+
+[browser_tor_bug2950.js]
+[browser_tor_omnibox.js]
+[browser_tor_TB4.js]
diff --git a/tbb-tests/browser_tor_TB4.js b/tbb-tests/browser_tor_TB4.js
new file mode 100644
index 000000000000..8bb12f360e5e
--- /dev/null
+++ b/tbb-tests/browser_tor_TB4.js
@@ -0,0 +1,35 @@
+// # Test for TB4: Tor Browser's Firefox preference overrides
+// This is a minimal test to check whether the 000-tor-browser.js
+// pref overrides are being used at all or not. More comprehensive
+// pref tests are maintained in the tor-browser-bundle-testsuite project.
+
+function test() {
+
+let expectedPrefs = [
+ // Homepage
+ ["browser.startup.homepage", "about:tor"],
+
+ // Disable the "Refresh" prompt that is displayed for stale profiles.
+ ["browser.disableResetPrompt", true],
+
+ // Version placeholder
+ ["torbrowser.version", "dev-build"],
+ ];
+
+let getPref = function (prefName) {
+ let type = Services.prefs.getPrefType(prefName);
+ if (type === Services.prefs.PREF_INT) return Services.prefs.getIntPref(prefName);
+ if (type === Services.prefs.PREF_BOOL) return Services.prefs.getBoolPref(prefName);
+ if (type === Services.prefs.PREF_STRING) return Services.prefs.getCharPref(prefName);
+ // Something went wrong.
+ throw new Error("Can't access pref " + prefName);
+};
+
+let testPref = function([key, expectedValue]) {
+ let foundValue = getPref(key);
+ is(foundValue, expectedValue, "Pref '" + key + "' should be '" + expectedValue +"'.");
+};
+
+expectedPrefs.map(testPref);
+
+} // end function test()
diff --git a/tbb-tests/browser_tor_bug2950.js b/tbb-tests/browser_tor_bug2950.js
new file mode 100644
index 000000000000..16e41344a3c4
--- /dev/null
+++ b/tbb-tests/browser_tor_bug2950.js
@@ -0,0 +1,74 @@
+// # Regression tests for tor Bug #2950, Make Permissions Manager memory-only
+// Ensures that permissions.sqlite file in profile directory is not written to,
+// even when we write a value to Firefox's permissions database.
+
+// The requisite test() function.
+function test() {
+
+// Needed because of asynchronous part later in the test.
+waitForExplicitFinish();
+
+// Shortcut
+let Ci = Components.interfaces;
+
+// ## utility functions
+
+// __principal(spec)__.
+// Creates a principal instance from a spec
+// (string address such as "https://www.torproject.org").
+let principal = spec => Services.scriptSecurityManager.createContentPrincipalFromOrigin(spec);
+
+// __setPermission(spec, key, value)__.
+// Sets the site permission of type key to value, for the site located at address spec.
+let setPermission = (spec, key, value) => SitePermissions.setForPrincipal(principal(spec), key, value);
+
+// __getPermission(spec, key)__.
+// Reads the site permission value for permission type key, for the site
+// located at address spec.
+let getPermission = (spec, key) => SitePermissions.getForPrincipal(principal(spec), key);
+
+// __profileDirPath__.
+// The Firefox Profile directory. Expected location of various persistent files.
+let profileDirPath = Services.dirsvc.get("ProfD", Components.interfaces.nsIFile).path;
+
+// __fileInProfile(fileName)__.
+// Returns an nsIFile instance corresponding to a file in the Profile directory.
+let fileInProfile = fileName => FileUtils.File(profileDirPath + "/" + fileName);
+
+// ## Now let's run the test.
+
+let SITE = "https://www.torproject.org",
+ KEY = "popup";
+
+let permissionsFile = fileInProfile("permissions.sqlite"),
+ lastModifiedTime = null,
+ newModifiedTime = null;
+if (permissionsFile.exists()) {
+ lastModifiedTime = permissionsFile.lastModifiedTime;
+}
+// Read the original value of the permission.
+let originalValue = getPermission(SITE, KEY);
+
+// We need to delay by at least 1000 ms, because that's the granularity
+// of file time stamps, it seems.
+window.setTimeout(
+ function () {
+ // Set the permission to a new value.
+ setPermission(SITE, KEY, SitePermissions.BLOCK);
+ // Now read back the permission value again.
+ let newReadValue = getPermission(SITE, KEY);
+ // Compare to confirm that the permission
+ // value was successfully changed.
+ Assert.notDeepEqual(originalValue, newReadValue, "Set a value in permissions db (perhaps in memory).");
+ // If file existed or now exists, get the current time stamp.
+ if (permissionsFile.exists()) {
+ newModifiedTime = permissionsFile.lastModifiedTime;
+ }
+ // If file was created or modified since we began this test,
+ // then permissions db is not memory only. Complain!
+ is(lastModifiedTime, newModifiedTime, "Don't write to permissions.sqlite file on disk.");
+ // We are done with the test.
+ finish();
+ }, 1100);
+
+} // test()
diff --git a/tbb-tests/mochitest.ini b/tbb-tests/mochitest.ini
new file mode 100644
index 000000000000..cc5172733bbe
--- /dev/null
+++ b/tbb-tests/mochitest.ini
@@ -0,0 +1,3 @@
+[DEFAULT]
+
+[test_tor_bug2874.html]
diff --git a/tbb-tests/moz.build b/tbb-tests/moz.build
new file mode 100644
index 000000000000..01db60b9c28a
--- /dev/null
+++ b/tbb-tests/moz.build
@@ -0,0 +1,9 @@
+# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+MOCHITEST_MANIFESTS += ["mochitest.ini"]
+
+BROWSER_CHROME_MANIFESTS += ["browser.ini"]
diff --git a/tbb-tests/test_tor_bug2874.html b/tbb-tests/test_tor_bug2874.html
new file mode 100644
index 000000000000..c0a956e9f687
--- /dev/null
+++ b/tbb-tests/test_tor_bug2874.html
@@ -0,0 +1,25 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+Tor bug
+https://trac.torproject.org/projects/tor/ticket/2874
+-->
+<head>
+ <meta charset="utf-8">
+ <title>Test for Tor Bug 2874</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+ <script type="application/javascript">
+ is(typeof Components, 'undefined', "The global window object should not expose a Components property to untrusted content.");
+ </script>
+</head>
+<body>
+<a target="_blank" href="https://trac.torproject.org/projects/tor/ticket/2874">Tor Bug 2874</a>
+<p id="display"></p>
+<div id="content" style="display: none">
+
+</div>
+<pre id="test">
+</pre>
+</body>
+</html>
diff --git a/toolkit/toolkit.mozbuild b/toolkit/toolkit.mozbuild
index 729e88c55aa9..fa6ee457e9da 100644
--- a/toolkit/toolkit.mozbuild
+++ b/toolkit/toolkit.mozbuild
@@ -96,7 +96,8 @@ if CONFIG['MOZ_WEBRTC'] and CONFIG['COMPILE_ENVIRONMENT']:
]
if CONFIG['ENABLE_TESTS']:
- DIRS += ['/testing/specialpowers']
+ DIRS += ['/testing/specialpowers',
+ '/tbb-tests']
DIRS += [
'/testing/gtest',
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] TB3: Tor Browser's official .mozconfigs.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 0e073bf1c24817983bd377e3e6df1fad4e48fcaf
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Mon May 6 15:51:06 2013 -0700
TB3: Tor Browser's official .mozconfigs.
Also:
Bug #9829.1: new .mozconfig file for the new cross-compiler and ESR24
Changes needed to build Mac in 64bit
Bug 10715: Enable Webgl for mingw-w64 again.
Disable ICU when cross-compiling; clean-up.
Bug 15773: Enable ICU on OS X
Bug 15990: Don't build the sandbox with mingw-w64
Bug 12761: Switch to ESR 38 for OS X
Updating .mozconfig-asan
Bug 12516: Compile hardenend Tor Browser with -fwrapv
Bug 18331: Switch to Mozilla's toolchain for building Tor Browser for OS X
Bug 17858: Cannot create incremental MARs for hardened builds.
Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
(which is part of mar-tools and is not distributed to end-users) with
ASan.
Bug 13419: Add back ICU for Windows
Bug 21239: Use GTK2 for ESR52 Linux builds
Bug 23025: Add hardening flags for macOS
Bug 24478: Enable debug assertions and tests in our ASan builds
--enable-proxy-bypass-protection
Bug 27597: ASan build option in tor-browser-build is broken
Bug 27623 - Export MOZILLA_OFFICIAL during desktop builds
This fixes a problem where some preferences had the wrong default value.
Also see bug 27472 where we made a similar fix for Android.
Bug 30463: Explicitly disable MOZ_TELEMETRY_REPORTING
Bug 31450: Set proper BINDGEN_CFLAGS for ASan builds
Add an --enable-tor-browser-data-outside-app-dir configure option
Add --with-tor-browser-version configure option
Bug 21849: Don't allow SSL key logging.
Bug 31457: disable per-installation profiles
The dedicated profiles (per-installation) feature does not interact
well with our bundled profiles on Linux and Windows, and it also causes
multiple profiles to be created on macOS under TorBrowser-Data.
Bug 31935: Disable profile downgrade protection.
Since Tor Browser does not support more than one profile, disable
the prompt and associated code that offers to create one when a
version downgrade situation is detected.
Bug 32493: Disable MOZ_SERVICES_HEALTHREPORT
Bug 25741 - TBA: Disable features at compile-time
MOZ_NATIVE_DEVICES for casting and the media player
MOZ_TELEMETRY_REPORTING for telemetry
MOZ_DATA_REPORTING for all data reporting preferences (crashreport, telemetry, geo)
Bug 25741 - TBA: Add default configure options in dedicated file
Define MOZ_ANDROID_NETWORK_STATE and MOZ_ANDROID_LOCATION
Bug 29859: Disable HLS support for now
Add --disable-tor-launcher build option
Add --enable-tor-browser-update build option
Bug 33734: Set MOZ_NORMANDY to False
Bug 33851: Omit Parental Controls.
Bug 40061: Omit the Windows default browser agent from the build
Bug 40252: Add --enable-rust-simd to our tor-browser mozconfig files
---
.mozconfig | 39 ++++++++++++++++++++++++
.mozconfig-android | 36 ++++++++++++++++++++++
.mozconfig-asan | 44 +++++++++++++++++++++++++++
.mozconfig-mac | 56 +++++++++++++++++++++++++++++++++++
.mozconfig-mingw | 31 +++++++++++++++++++
browser/base/moz.build | 3 ++
browser/installer/Makefile.in | 8 +++++
browser/moz.configure | 8 ++---
build/moz.configure/old.configure | 5 ++++
mobile/android/confvars.sh | 9 ++++++
mobile/android/geckoview/build.gradle | 1 +
mobile/android/moz.configure | 22 ++++++++++++--
mobile/android/torbrowser.configure | 30 +++++++++++++++++++
old-configure.in | 49 ++++++++++++++++++++++++++++++
security/moz.build | 2 +-
security/nss/lib/ssl/Makefile | 2 +-
toolkit/modules/AppConstants.jsm | 15 ++++++++++
toolkit/modules/moz.build | 3 ++
18 files changed, 355 insertions(+), 8 deletions(-)
diff --git a/.mozconfig b/.mozconfig
new file mode 100755
index 000000000000..18cd1f9b6487
--- /dev/null
+++ b/.mozconfig
@@ -0,0 +1,39 @@
+. $topsrcdir/browser/config/mozconfig
+
+# This mozconfig file is not used in official Tor Browser builds.
+# It is only intended to be used when doing incremental Linux builds
+# during development. The platform-specific mozconfig configuration
+# files used in official Tor Browser releases can be found in the
+# tor-browser-build repo:
+# https://gitweb.torproject.org/builders/tor-browser-build.git/
+# under:
+# tor-browser-build/projects/firefox/mozconfig-$OS-$ARCH
+
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-@CONFIG_GUESS@
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+
+ac_add_options --enable-optimize
+ac_add_options --enable-rust-simd
+ac_add_options --enable-official-branding
+
+# Let's support GTK3 for ESR60
+ac_add_options --enable-default-toolkit=cairo-gtk3
+
+ac_add_options --disable-strip
+ac_add_options --disable-install-strip
+ac_add_options --disable-tests
+ac_add_options --disable-debug
+ac_add_options --disable-crashreporter
+ac_add_options --disable-webrtc
+ac_add_options --disable-parental-controls
+# Let's make sure no preference is enabling either Adobe's or Google's CDM.
+ac_add_options --disable-eme
+ac_add_options --enable-proxy-bypass-protection
+
+# Disable telemetry
+ac_add_options MOZ_TELEMETRY_REPORTING=
+
+ac_add_options --disable-tor-launcher
+ac_add_options --with-tor-browser-version=dev-build
+ac_add_options --disable-tor-browser-update
diff --git a/.mozconfig-android b/.mozconfig-android
new file mode 100755
index 000000000000..50015ec615ef
--- /dev/null
+++ b/.mozconfig-android
@@ -0,0 +1,36 @@
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-arm-linux-androideabi
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+
+ac_add_options --enable-optimize
+ac_add_options --enable-rust-simd
+ac_add_options --enable-official-branding
+
+# Android
+ac_add_options --enable-application=mobile/android
+ac_add_options --target=arm-linux-androideabi
+ac_add_options --with-android-ndk="$NDK_BASE" #Enter the android ndk location(ndk r17b)
+ac_add_options --with-android-sdk="$SDK_BASE" #Enter the android sdk location
+ac_add_options --with-branding=mobile/android/branding/alpha
+
+# Use Mozilla's Clang blobs
+CC="$HOME/.mozbuild/clang/bin/clang"
+CXX="$HOME/.mozbuild/clang/bin/clang++"
+
+#enable ccache to set amount of cache assigned for build.
+ac_add_options --with-ccache
+
+ac_add_options --enable-strip
+ac_add_options --disable-tests
+ac_add_options --disable-debug
+ac_add_options --disable-rust-debug
+
+ac_add_options --disable-updater
+ac_add_options --disable-crashreporter
+ac_add_options --disable-webrtc
+ac_add_options --disable-parental-controls
+
+ac_add_options --enable-proxy-bypass-protection
+
+# Disable telemetry
+ac_add_options MOZ_TELEMETRY_REPORTING=
diff --git a/.mozconfig-asan b/.mozconfig-asan
new file mode 100644
index 000000000000..bad7ea022c9f
--- /dev/null
+++ b/.mozconfig-asan
@@ -0,0 +1,44 @@
+. $topsrcdir/browser/config/mozconfig
+
+export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc"
+export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc"
+# We need to add -ldl explicitely due to bug 1213698
+export LDFLAGS="-fsanitize=address -ldl"
+
+# Define HOST_CFLAGS, etc. to avoid compiling programs such as mbsdiff
+# (which is part of mar-tools and is not distributed to end-users) with
+# ASan. See bug 17858.
+export HOST_CFLAGS=""
+export HOST_CXXFLAGS=""
+export HOST_LDFLAGS="-ldl"
+
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-@CONFIG_GUESS@
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+export BINDGEN_CFLAGS='--gcc-toolchain=/var/tmp/dist/gcc'
+
+ac_add_options --enable-address-sanitizer
+ac_add_options --disable-jemalloc
+ac_add_options --disable-elf-hack
+
+ac_add_options --enable-optimize
+ac_add_options --enable-rust-simd
+ac_add_options --enable-official-branding
+
+# Let's support GTK3 for ESR60
+ac_add_options --enable-default-toolkit=cairo-gtk3
+
+ac_add_options --enable-tor-browser-update
+
+ac_add_options --disable-strip
+ac_add_options --disable-install-strip
+ac_add_options --enable-tests
+ac_add_options --enable-debug
+ac_add_options --disable-crashreporter
+ac_add_options --disable-webrtc
+ac_add_options --disable-parental-controls
+ac_add_options --disable-eme
+ac_add_options --enable-proxy-bypass-protection
+
+# Disable telemetry
+ac_add_options MOZ_TELEMETRY_REPORTING=
diff --git a/.mozconfig-mac b/.mozconfig-mac
new file mode 100644
index 000000000000..26e2b6b92fdb
--- /dev/null
+++ b/.mozconfig-mac
@@ -0,0 +1,56 @@
+# ld needs libLTO.so from llvm
+mk_add_options "export LD_LIBRARY_PATH=$topsrcdir/clang/lib"
+
+CROSS_CCTOOLS_PATH=$topsrcdir/cctools
+CROSS_SYSROOT=$topsrcdir/MacOSX10.7.sdk
+CROSS_PRIVATE_FRAMEWORKS=$CROSS_SYSROOT/System/Library/PrivateFrameworks
+HARDENING_FLAGS="-Werror=format -Werror=format-security -fstack-protector-strong -D_FORTIFY_SOURCE=2"
+FLAGS="-target x86_64-apple-darwin10 -mlinker-version=136 -B $CROSS_CCTOOLS_PATH/bin -isysroot $CROSS_SYSROOT $HARDENING_FLAGS"
+
+export CC="$topsrcdir/clang/bin/clang $FLAGS"
+export CXX="$topsrcdir/clang/bin/clang++ $FLAGS"
+export CPP="$topsrcdir/clang/bin/clang $FLAGS -E"
+export LLVMCONFIG=$topsrcdir/clang/bin/llvm-config
+export LDFLAGS="-Wl,-syslibroot,$CROSS_SYSROOT -Wl,-dead_strip -Wl,-pie"
+export TOOLCHAIN_PREFIX=$CROSS_CCTOOLS_PATH/bin/x86_64-apple-darwin10-
+#TODO: bug 1184202 - would be nice if these could be detected with TOOLCHAIN_PREFIX automatically
+export AR=${TOOLCHAIN_PREFIX}ar
+export RANLIB=${TOOLCHAIN_PREFIX}ranlib
+export STRIP=${TOOLCHAIN_PREFIX}strip
+export OTOOL=${TOOLCHAIN_PREFIX}otool
+export DSYMUTIL=$topsrcdir/clang/bin/llvm-dsymutil
+
+export HOST_CC="$topsrcdir/clang/bin/clang"
+export HOST_CXX="$topsrcdir/clang/bin/clang++"
+export HOST_CPP="$topsrcdir/clang/bin/clang -E"
+export HOST_CFLAGS="-g"
+export HOST_CXXFLAGS="-g"
+export HOST_LDFLAGS="-g"
+
+ac_add_options --target=x86_64-apple-darwin
+ac_add_options --with-macos-private-frameworks=$CROSS_PRIVATE_FRAMEWORKS
+
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-macos
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+
+ac_add_options --enable-application=browser
+ac_add_options --enable-strip
+ac_add_options --enable-official-branding
+ac_add_options --enable-optimize
+ac_add_options --enable-rust-simd
+ac_add_options --disable-debug
+
+ac_add_options --enable-tor-browser-data-outside-app-dir
+ac_add_options --enable-tor-browser-update
+
+ac_add_options --disable-crashreporter
+ac_add_options --disable-webrtc
+ac_add_options --disable-parental-controls
+ac_add_options --disable-tests
+# Let's make sure no preference is enabling either Adobe's or Google's CDM.
+ac_add_options --disable-eme
+ac_add_options --enable-proxy-bypass-protection
+
+# Disable telemetry
+ac_add_options MOZ_TELEMETRY_REPORTING=
diff --git a/.mozconfig-mingw b/.mozconfig-mingw
new file mode 100644
index 000000000000..3ec6ff18a3e9
--- /dev/null
+++ b/.mozconfig-mingw
@@ -0,0 +1,31 @@
+CROSS_COMPILE=1
+
+ac_add_options --enable-application=browser
+ac_add_options --target=i686-w64-mingw32
+ac_add_options --with-toolchain-prefix=i686-w64-mingw32-
+ac_add_options --enable-default-toolkit=cairo-windows
+mk_add_options MOZ_OBJDIR=@TOPSRCDIR@/obj-mingw
+mk_add_options MOZ_APP_DISPLAYNAME="Tor Browser"
+export MOZILLA_OFFICIAL=1
+
+ac_add_options --disable-debug
+ac_add_options --enable-optimize
+ac_add_options --enable-rust-simd
+ac_add_options --enable-strip
+ac_add_options --enable-official-branding
+
+ac_add_options --enable-tor-browser-update
+ac_add_options --disable-bits-download
+
+# Let's make sure no preference is enabling either Adobe's or Google's CDM.
+ac_add_options --disable-eme
+ac_add_options --disable-crashreporter
+ac_add_options --disable-maintenance-service
+ac_add_options --disable-webrtc
+ac_add_options --disable-parental-controls
+ac_add_options --disable-tests
+ac_add_options --enable-proxy-bypass-protection
+
+# Disable telemetry
+ac_add_options MOZ_TELEMETRY_REPORTING=
+ac_add_options --disable-default-browser-agent
diff --git a/browser/base/moz.build b/browser/base/moz.build
index 4058d6d86fea..ee3bc8028b9e 100644
--- a/browser/base/moz.build
+++ b/browser/base/moz.build
@@ -81,6 +81,9 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("windows", "gtk", "cocoa"):
if CONFIG["MOZ_WIDGET_TOOLKIT"] in ("windows", "gtk"):
DEFINES["MENUBAR_CAN_AUTOHIDE"] = 1
+if CONFIG["TOR_BROWSER_UPDATE"]:
+ DEFINES["TOR_BROWSER_UPDATE"] = 1
+
JAR_MANIFESTS += ["jar.mn"]
GeneratedFile(
diff --git a/browser/installer/Makefile.in b/browser/installer/Makefile.in
index f98964d8a9eb..d55b373ff488 100644
--- a/browser/installer/Makefile.in
+++ b/browser/installer/Makefile.in
@@ -82,6 +82,14 @@ endif
endif
endif
+ifdef TOR_BROWSER_DISABLE_TOR_LAUNCHER
+DEFINES += -DTOR_BROWSER_DISABLE_TOR_LAUNCHER
+endif
+
+ifdef TOR_BROWSER_UPDATE
+DEFINES += -DTOR_BROWSER_UPDATE
+endif
+
ifneq (,$(filter WINNT Darwin Android,$(OS_TARGET)))
DEFINES += -DMOZ_SHARED_MOZGLUE=1
endif
diff --git a/browser/moz.configure b/browser/moz.configure
index 8653bcbb165d..5a0b722b915e 100644
--- a/browser/moz.configure
+++ b/browser/moz.configure
@@ -5,11 +5,11 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
imply_option("MOZ_PLACES", True)
-imply_option("MOZ_SERVICES_HEALTHREPORT", True)
+imply_option("MOZ_SERVICES_HEALTHREPORT", False)
imply_option("MOZ_SERVICES_SYNC", True)
-imply_option("MOZ_DEDICATED_PROFILES", True)
-imply_option("MOZ_BLOCK_PROFILE_DOWNGRADE", True)
-imply_option("MOZ_NORMANDY", True)
+imply_option("MOZ_DEDICATED_PROFILES", False)
+imply_option("MOZ_BLOCK_PROFILE_DOWNGRADE", False)
+imply_option("MOZ_NORMANDY", False)
with only_when(target_is_linux & compile_environment):
option(env="MOZ_NO_PIE_COMPAT", help="Enable non-PIE wrapper")
diff --git a/build/moz.configure/old.configure b/build/moz.configure/old.configure
index 35ab75df3a14..95f4200d0973 100644
--- a/build/moz.configure/old.configure
+++ b/build/moz.configure/old.configure
@@ -119,6 +119,11 @@ def old_configure_options(*options):
"--with-user-appdir",
"--x-includes",
"--x-libraries",
+ # Tor additions.
+ "--with-tor-browser-version",
+ "--enable-tor-browser-update",
+ "--enable-tor-browser-data-outside-app-dir",
+ "--enable-tor-launcher",
)
def prepare_configure_options(host, target, all_options, *options):
# old-configure only supports the options listed in @old_configure_options
diff --git a/mobile/android/confvars.sh b/mobile/android/confvars.sh
index 70e13c85b258..b2670451ed91 100644
--- a/mobile/android/confvars.sh
+++ b/mobile/android/confvars.sh
@@ -29,6 +29,15 @@ MOZ_ANDROID_BROWSER_INTENT_CLASS=org.mozilla.gecko.BrowserApp
MOZ_NO_SMART_CARDS=1
+# Adds MIME-type support for raw video
MOZ_RAW=1
MOZ_APP_ID={aa3c5121-dab2-40e2-81ca-7ea25febc110}
+
+### Tor Browser for Android ###
+
+# Disable telemetry at compile-time
+unset MOZ_TELEMETRY_REPORTING
+
+# Disable data reporting at compile-time
+unset MOZ_DATA_REPORTING
diff --git a/mobile/android/geckoview/build.gradle b/mobile/android/geckoview/build.gradle
index f60ea1730d5c..bdee206175db 100644
--- a/mobile/android/geckoview/build.gradle
+++ b/mobile/android/geckoview/build.gradle
@@ -93,6 +93,7 @@ android {
buildConfigField 'String', "MOZ_APP_DISPLAYNAME", "\"${mozconfig.substs.MOZ_APP_DISPLAYNAME}\"";
buildConfigField 'String', "MOZ_APP_UA_NAME", "\"${mozconfig.substs.MOZ_APP_UA_NAME}\"";
buildConfigField 'String', "MOZ_UPDATE_CHANNEL", "\"${mozconfig.substs.MOZ_UPDATE_CHANNEL}\"";
+ buildConfigField 'String', "TOR_BROWSER_VERSION", "\"${mozconfig.substs.TOR_BROWSER_VERSION}\"";
// MOZILLA_VERSION is oddly quoted from autoconf, but we don't have to handle it specially in Gradle.
buildConfigField 'String', "MOZILLA_VERSION", "\"${mozconfig.substs.MOZILLA_VERSION}\"";
diff --git a/mobile/android/moz.configure b/mobile/android/moz.configure
index 106f6c816814..531eec31475e 100644
--- a/mobile/android/moz.configure
+++ b/mobile/android/moz.configure
@@ -13,7 +13,7 @@ project_flag(
project_flag(
"MOZ_ANDROID_HLS_SUPPORT",
help="Enable HLS (HTTP Live Streaming) support (currently using the ExoPlayer library)",
- default=True,
+ default=False,
)
option(
@@ -51,10 +51,14 @@ set_config(
)
imply_option("MOZ_NORMANDY", False)
-imply_option("MOZ_SERVICES_HEALTHREPORT", True)
imply_option("MOZ_ANDROID_HISTORY", True)
imply_option("--enable-small-chunk-size", True)
+# Comment this so we can imply |False| in torbrowser.configure
+# The Build system doesn't allow multiple imply_option()
+# calls with the same key.
+# imply_option("MOZ_SERVICES_HEALTHREPORT", True)
+
@depends(target)
def check_target(target):
@@ -70,6 +74,8 @@ def check_target(target):
)
+include("torbrowser.configure")
+
include("../../toolkit/moz.configure")
include("../../build/moz.configure/android-sdk.configure")
include("../../build/moz.configure/java.configure")
@@ -87,3 +93,15 @@ set_config(
"MOZ_ANDROID_FAT_AAR_ARCHITECTURES",
depends("MOZ_ANDROID_FAT_AAR_ARCHITECTURES")(lambda x: x),
)
+
+project_flag(
+ "MOZ_ANDROID_NETWORK_STATE",
+ help="Include permission for accessing WiFi/network state on Android",
+ default=False,
+)
+
+project_flag(
+ "MOZ_ANDROID_LOCATION",
+ help="Include permission for accessing fine and course-grain Location on Android",
+ default=False,
+)
diff --git a/mobile/android/torbrowser.configure b/mobile/android/torbrowser.configure
new file mode 100644
index 000000000000..bcb725cae121
--- /dev/null
+++ b/mobile/android/torbrowser.configure
@@ -0,0 +1,30 @@
+# -*- Mode: python; indent-tabs-mode: nil; tab-width: 40 -*-
+# vim: set filetype=python:
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+# Set Tor Browser default config
+
+imply_option("MOZ_ANDROID_EXCLUDE_FONTS", False)
+
+# Disable uploading crash reports and dump files to an external server
+# This is still configured in old-configure. Uncomment when this moves
+# to the python config
+# imply_option("MOZ_CRASHREPORTER", False)
+
+# Disable uploading information about the browser configuration and
+# performance to an external server
+imply_option("MOZ_SERVICES_HEALTHREPORT", False)
+
+# Disable creating telemetry and data reports that are uploaded to an
+# external server
+# These aren't actually configure options. These are disabled in
+# confvars.sh, but they look like configure options so we'll document
+# them here, as well.
+# XXX: no confvars.sh here
+# imply_option("MOZ_TELEMETRY_REPORTING", False)
+# imply_option("MOZ_DATA_REPORTING", False)
+
+imply_option("MOZ_ANDROID_NETWORK_STATE", False)
+imply_option("MOZ_ANDROID_LOCATION", False)
diff --git a/old-configure.in b/old-configure.in
index de2642f71d0f..84e7a31f52fb 100644
--- a/old-configure.in
+++ b/old-configure.in
@@ -1881,6 +1881,55 @@ if test -n "$MOZ_UPDATER"; then
AC_DEFINE(MOZ_UPDATER)
fi
+dnl ========================================================
+dnl Tor additions
+dnl ========================================================
+MOZ_ARG_WITH_STRING(tor-browser-version,
+[ --with-tor-browser-version=VERSION
+ Set Tor Browser version, e.g., 7.0a1],
+ TOR_BROWSER_VERSION="$withval")
+
+if test -z "$TOR_BROWSER_VERSION"; then
+ AC_MSG_ERROR([--with-tor-browser-version is required for Tor Browser.])
+fi
+
+MOZ_ARG_ENABLE_BOOL(tor-browser-update,
+[ --enable-tor-browser-update
+ Enable Tor Browser update],
+ TOR_BROWSER_UPDATE=1,
+ TOR_BROWSER_UPDATE= )
+
+if test -n "$TOR_BROWSER_UPDATE"; then
+ AC_DEFINE(TOR_BROWSER_UPDATE)
+fi
+
+MOZ_ARG_ENABLE_BOOL(tor-browser-data-outside-app-dir,
+[ --enable-tor-browser-data-outside-app-dir
+ Enable Tor Browser data outside of app directory],
+ TOR_BROWSER_DATA_OUTSIDE_APP_DIR=1,
+ TOR_BROWSER_DATA_OUTSIDE_APP_DIR= )
+
+if test -n "$TOR_BROWSER_DATA_OUTSIDE_APP_DIR"; then
+ AC_DEFINE(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+fi
+
+AC_DEFINE_UNQUOTED(TOR_BROWSER_VERSION,$TOR_BROWSER_VERSION)
+AC_DEFINE_UNQUOTED(TOR_BROWSER_VERSION_QUOTED,"$TOR_BROWSER_VERSION")
+AC_SUBST(TOR_BROWSER_UPDATE)
+AC_SUBST(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+
+MOZ_ARG_DISABLE_BOOL(tor-launcher,
+[ --disable-tor-launcher
+ Do not include Tor Launcher],
+ TOR_BROWSER_DISABLE_TOR_LAUNCHER=1,
+ TOR_BROWSER_DISABLE_TOR_LAUNCHER=)
+
+if test -n "$TOR_BROWSER_DISABLE_TOR_LAUNCHER"; then
+ AC_DEFINE(TOR_BROWSER_DISABLE_TOR_LAUNCHER)
+fi
+
+AC_SUBST(TOR_BROWSER_DISABLE_TOR_LAUNCHER)
+
dnl ========================================================
dnl parental controls (for Windows Vista)
dnl ========================================================
diff --git a/security/moz.build b/security/moz.build
index 18e50f9dcc37..8d0427525487 100644
--- a/security/moz.build
+++ b/security/moz.build
@@ -85,7 +85,7 @@ gyp_vars["nss_dist_obj_dir"] = "$PRODUCT_DIR/dist/bin"
gyp_vars["disable_tests"] = 1
gyp_vars["disable_dbm"] = 1
gyp_vars["disable_libpkix"] = 1
-gyp_vars["enable_sslkeylogfile"] = 1
+gyp_vars["enable_sslkeylogfile"] = 0
# pkg-config won't reliably find zlib on our builders, so just force it.
# System zlib is only used for modutil and signtool unless
# SSL zlib is enabled, which we are disabling immediately below this.
diff --git a/security/nss/lib/ssl/Makefile b/security/nss/lib/ssl/Makefile
index 8a8b06f4b508..90571bb3e256 100644
--- a/security/nss/lib/ssl/Makefile
+++ b/security/nss/lib/ssl/Makefile
@@ -41,7 +41,7 @@ endif
# Enable key logging by default in debug builds, but not opt builds.
# Logging still needs to be enabled at runtime through env vars.
-NSS_ALLOW_SSLKEYLOGFILE ?= $(if $(BUILD_OPT),0,1)
+NSS_ALLOW_SSLKEYLOGFILE ?= 0
ifeq (1,$(NSS_ALLOW_SSLKEYLOGFILE))
DEFINES += -DNSS_ALLOW_SSLKEYLOGFILE=1
endif
diff --git a/toolkit/modules/AppConstants.jsm b/toolkit/modules/AppConstants.jsm
index 50dff5ecc283..955f7952af11 100644
--- a/toolkit/modules/AppConstants.jsm
+++ b/toolkit/modules/AppConstants.jsm
@@ -340,6 +340,14 @@ this.AppConstants = Object.freeze({
MOZ_WIDGET_TOOLKIT: "@MOZ_WIDGET_TOOLKIT@",
ANDROID_PACKAGE_NAME: "@ANDROID_PACKAGE_NAME@",
+ TOR_BROWSER_VERSION: "@TOR_BROWSER_VERSION@",
+ TOR_BROWSER_DATA_OUTSIDE_APP_DIR:
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ true,
+#else
+ false,
+#endif
+
DEBUG_JS_MODULES: "@DEBUG_JS_MODULES@",
MOZ_BING_API_CLIENTID: "@MOZ_BING_API_CLIENTID@",
@@ -424,4 +432,11 @@ this.AppConstants = Object.freeze({
#else
false,
#endif
+
+ TOR_BROWSER_UPDATE:
+#ifdef TOR_BROWSER_UPDATE
+ true,
+#else
+ false,
+#endif
});
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
index 19fd20d5aa6c..3c2ef3bfb8d7 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
@@ -304,6 +304,9 @@ for var in (
if CONFIG[var]:
DEFINES[var] = True
+if CONFIG["TOR_BROWSER_UPDATE"]:
+ DEFINES["TOR_BROWSER_UPDATE"] = 1
+
JAR_MANIFESTS += ["jar.mn"]
DEFINES["TOPOBJDIR"] = TOPOBJDIR
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 28044: Integrate Tor Launcher into tor-browser
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 952a2332a79d02b31dd21f93687c8dbfcd6b96a4
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Feb 26 10:07:17 2019 -0500
Bug 28044: Integrate Tor Launcher into tor-browser
Build and package Tor Launcher as part of the browser (similar to
how pdfjs is handled).
If a Tor Launcher extension is present in the user's profile, it is
removed.
---
browser/extensions/moz.build | 3 +++
browser/installer/package-manifest.in | 5 +++++
toolkit/mozapps/extensions/internal/XPIProvider.jsm | 10 ++++++++++
3 files changed, 18 insertions(+)
diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build
index 1ab9167d870a..fa60184daea8 100644
--- a/browser/extensions/moz.build
+++ b/browser/extensions/moz.build
@@ -17,3 +17,6 @@ if CONFIG["NIGHTLY_BUILD"]:
DIRS += [
"translations",
]
+
+if not CONFIG["TOR_BROWSER_DISABLE_TOR_LAUNCHER"]:
+ DIRS += ["tor-launcher"]
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 7d8d79347de7..df579eb538c4 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -247,6 +247,11 @@
@RESPATH@/browser/chrome/browser.manifest
@RESPATH@/chrome/pdfjs.manifest
@RESPATH@/chrome/pdfjs/*
+#ifndef TOR_BROWSER_DISABLE_TOR_LAUNCHER
+@RESPATH@/browser/chrome/torlauncher.manifest
+@RESPATH@/browser/chrome/torlauncher/*
+@RESPATH@/browser/@PREF_DIR@/torlauncher-prefs.js
+#endif
@RESPATH@/chrome/toolkit@JAREXT@
@RESPATH@/chrome/toolkit.manifest
@RESPATH@/chrome/recording.manifest
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index 0599e221ed1e..bec6e27388ac 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -1472,6 +1472,16 @@ var XPIStates = {
for (let [id, file] of loc.readAddons()) {
knownIds.delete(id);
+ // Since it is now part of the browser, uninstall the Tor Launcher
+ // extension. This will remove the Tor Launcher .xpi from user
+ // profiles on macOS.
+ if (id === "tor-launcher(a)torproject.org") {
+ logger.debug("Uninstalling the Tor Launcher extension.");
+ loc.installer.uninstallAddon(id);
+ changed = true;
+ continue;
+ }
+
let xpiState = loc.get(id);
if (!xpiState) {
// If the location is not supported for sideloading, skip new
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 40069: Add helpers for message passing with extensions
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit e946eed181b40c4616c7ca40f8a6fb48ca7512df
Author: Alex Catarineu <acat(a)torproject.org>
Date: Sun Aug 2 19:12:25 2020 +0200
Bug 40069: Add helpers for message passing with extensions
---
toolkit/components/extensions/ExtensionParent.jsm | 47 +++++++++++++++++++++++
1 file changed, 47 insertions(+)
diff --git a/toolkit/components/extensions/ExtensionParent.jsm b/toolkit/components/extensions/ExtensionParent.jsm
index 39ce6d608b86..32d264ed6a4f 100644
--- a/toolkit/components/extensions/ExtensionParent.jsm
+++ b/toolkit/components/extensions/ExtensionParent.jsm
@@ -263,6 +263,8 @@ const ProxyMessenger = {
/** @type Map<number, ParentPort> */
ports: new Map(),
+ _torRuntimeMessageListeners: [],
+
init() {
this.conduit = new BroadcastConduit(ProxyMessenger, {
id: "ProxyMessenger",
@@ -328,6 +330,10 @@ const ProxyMessenger = {
},
async recvRuntimeMessage(arg, { sender }) {
+ // We need to listen to some extension messages in Tor Browser
+ for (const listener of this._torRuntimeMessageListeners) {
+ listener(arg);
+ }
arg.firstResponse = true;
let kind = await this.normalizeArgs(arg, sender);
let result = await this.conduit.castRuntimeMessage(kind, arg);
@@ -1881,6 +1887,45 @@ for (let name of StartupCache.STORE_NAMES) {
StartupCache[name] = new CacheStore(name);
}
+async function torSendExtensionMessage(extensionId, message) {
+ // This should broadcast the message to all children "conduits"
+ // listening for a "RuntimeMessage". Those children conduits
+ // will either be extension background pages or other extension
+ // pages listening to browser.runtime.onMessage.
+ const result = await ProxyMessenger.conduit.castRuntimeMessage("messenger", {
+ extensionId,
+ holder: new StructuredCloneHolder(message),
+ firstResponse: true,
+ sender: {
+ id: extensionId,
+ envType: "addon_child",
+ },
+ });
+ return result
+ ? result.value
+ : Promise.reject({ message: ERROR_NO_RECEIVERS });
+}
+
+async function torWaitForExtensionMessage(extensionId, checker) {
+ return new Promise(resolve => {
+ const msgListener = msg => {
+ try {
+ if (msg && msg.extensionId === extensionId) {
+ const deserialized = msg.holder.deserialize({});
+ if (checker(deserialized)) {
+ const idx = ProxyMessenger._torRuntimeMessageListeners.indexOf(
+ msgListener
+ );
+ ProxyMessenger._torRuntimeMessageListeners.splice(idx, 1);
+ resolve(deserialized);
+ }
+ }
+ } catch (e) {}
+ };
+ ProxyMessenger._torRuntimeMessageListeners.push(msgListener);
+ });
+}
+
var ExtensionParent = {
GlobalManager,
HiddenExtensionPage,
@@ -1892,6 +1937,8 @@ var ExtensionParent = {
promiseExtensionViewLoaded,
watchExtensionProxyContextLoad,
DebugUtils,
+ torSendExtensionMessage,
+ torWaitForExtensionMessage,
};
// browserPaintedPromise and browserStartupPromise are promises that
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 12974: Disable NTLM and Negotiate HTTP Auth
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 039eefa05e6c12e5dfb1fea8d3f045dba5f91c82
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Wed Aug 27 15:19:10 2014 -0700
Bug 12974: Disable NTLM and Negotiate HTTP Auth
This is technically an embargoed Mozilla bug, so I probably shouldn't provide
too many details.
Suffice to say that NTLM and Negotiate auth are bad for Tor users, and I doubt
very many (or any of them) actually need it.
The Mozilla bug is https://bugzilla.mozilla.org/show_bug.cgi?id=1046421
---
extensions/auth/nsHttpNegotiateAuth.cpp | 4 ++++
netwerk/protocol/http/nsHttpNTLMAuth.cpp | 3 +++
2 files changed, 7 insertions(+)
diff --git a/extensions/auth/nsHttpNegotiateAuth.cpp b/extensions/auth/nsHttpNegotiateAuth.cpp
index fde44d6ce9ef..a3b3422e2c42 100644
--- a/extensions/auth/nsHttpNegotiateAuth.cpp
+++ b/extensions/auth/nsHttpNegotiateAuth.cpp
@@ -155,6 +155,10 @@ nsHttpNegotiateAuth::ChallengeReceived(nsIHttpAuthenticableChannel* authChannel,
nsIAuthModule* rawModule = (nsIAuthModule*)*continuationState;
*identityInvalid = false;
+
+ /* Always fail Negotiate auth for Tor Browser. We don't need it. */
+ return NS_ERROR_ABORT;
+
if (rawModule) {
return NS_OK;
}
diff --git a/netwerk/protocol/http/nsHttpNTLMAuth.cpp b/netwerk/protocol/http/nsHttpNTLMAuth.cpp
index b2c78dd5951b..ac981c7c0129 100644
--- a/netwerk/protocol/http/nsHttpNTLMAuth.cpp
+++ b/netwerk/protocol/http/nsHttpNTLMAuth.cpp
@@ -168,6 +168,9 @@ nsHttpNTLMAuth::ChallengeReceived(nsIHttpAuthenticableChannel* channel,
*identityInvalid = false;
+ /* Always fail Negotiate auth for Tor Browser. We don't need it. */
+ return NS_ERROR_ABORT;
+
// Start a new auth sequence if the challenge is exactly "NTLM".
// If native NTLM auth apis are available and enabled through prefs,
// try to use them.
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 10760: Integrate TorButton to TorBrowser core
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 365be743496e55d53b91de15ee19fe8c18e42f16
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Feb 19 23:05:08 2020 +0100
Bug 10760: Integrate TorButton to TorBrowser core
Because of the non-restartless nature of Torbutton, it required
a two-stage installation process. On mobile, it was a problem,
because it was not loading when the user opened the browser for
the first time.
Moving it to tor-browser and making it a system extension allows it
to load when the user opens the browser for first time.
Additionally, this patch also fixes Bug 27611.
Bug 26321: New Circuit and New Identity menu items
Bug 14392: Make about:tor behave like other initial pages.
Bug 25013: Add torbutton as a tor-browser submodule
---
.gitmodules | 3 ++
browser/base/content/aboutDialog.xhtml | 38 +++++++++++------
browser/base/content/browser-doctype.inc | 6 +++
browser/base/content/browser-menubar.inc | 47 ++++++++++++++++++----
browser/base/content/browser-sets.inc | 2 +
browser/base/content/browser.js | 1 +
browser/base/content/browser.xhtml | 26 +++++++++++-
.../controlcenter/content/identityPanel.inc.xhtml | 44 ++++++++++++++++++++
browser/installer/package-manifest.in | 2 +
docshell/base/nsAboutRedirector.cpp | 6 ++-
docshell/build/components.conf | 1 +
mobile/android/installer/package-manifest.in | 4 ++
toolkit/moz.build | 1 +
.../mozapps/extensions/internal/XPIProvider.jsm | 9 +++++
toolkit/torproject/torbutton | 1 +
.../lib/environments/browser-window.js | 6 ++-
16 files changed, 172 insertions(+), 25 deletions(-)
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 000000000000..2f03bd8e22df
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "toolkit/torproject/torbutton"]
+ path = toolkit/torproject/torbutton
+ url = https://git.torproject.org/torbutton.git
diff --git a/browser/base/content/aboutDialog.xhtml b/browser/base/content/aboutDialog.xhtml
index 55c8b1c2c5f7..4eb122b0b2d8 100644
--- a/browser/base/content/aboutDialog.xhtml
+++ b/browser/base/content/aboutDialog.xhtml
@@ -7,11 +7,11 @@
<?xml-stylesheet href="chrome://global/skin/global.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/aboutDialog.css" type="text/css"?>
<?xml-stylesheet href="chrome://branding/content/aboutDialog.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/aboutDialog.css" type="text/css"?>
+<!-- We need to include the localization DTDs until we migrate to Fluent -->
<!DOCTYPE window [
-#ifdef XP_MACOSX
#include browser-doctype.inc
-#endif
]>
<window xmlns:html="http://www.w3.org/1999/xhtml"
@@ -28,7 +28,7 @@
data-l10n-id="aboutDialog-title"
#endif
role="dialog"
- aria-describedby="version distribution distributionId communityDesc contributeDesc trademark"
+ aria-describedby="version distribution distributionId projectDesc helpDesc trademark trademarkTor"
>
#ifdef XP_MACOSX
#include macWindow.inc.xhtml
@@ -146,24 +146,36 @@
<label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-exp-creditsLink"/>
</description>
</vbox>
- <description class="text-blurb" id="communityDesc" data-l10n-id="community-2">
- <label is="text-link" href="https://www.mozilla.org/?utm_source=firefox-browser&utm_medium=firefox-…" data-l10n-name="community-mozillaLink"/>
- <label is="text-link" useoriginprincipal="true" href="about:credits" data-l10n-name="community-creditsLink"/>
+ <!-- Keep communityDesc and contributeDesc to avoid JS errors trying to hide them -->
+ <description class="text-blurb" id="communityDesc" data-l10n-id="community-2" hidden="true"></description>
+ <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus" hidden="true"></description>
+ <description class="text-blurb" id="projectDesc">
+ &project.start;
+ <label is="text-link" href="https://www.torproject.org/">
+ &project.tpoLink;
+ </label>&project.end;
</description>
- <description class="text-blurb" id="contributeDesc" data-l10n-id="helpus">
- <label is="text-link" href="https://donate.mozilla.org/?utm_source=firefox&utm_medium=referral&…" data-l10n-name="helpus-donateLink"/>
- <label is="text-link" href="https://www.mozilla.org/contribute/?utm_source=firefox-browser&utm_medi…" data-l10n-name="helpus-getInvolvedLink"/>
+ <description class="text-blurb" id="helpDesc">
+ &help.start;
+ <label is="text-link" href="https://donate.torproject.org/">
+ &help.donateLink;
+ </label>
+ &help.or;
+ <label is="text-link" href="https://community.torproject.org/">
+ &help.getInvolvedLink;
+ </label>&help.end;
</description>
</vbox>
</vbox>
</hbox>
<vbox id="bottomBox">
- <hbox pack="center">
- <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license" data-l10n-id="bottomLinks-license"/>
- <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:rights" data-l10n-id="bottomLinks-rights"/>
- <label is="text-link" class="bottom-link" href="https://www.mozilla.org/privacy/?utm_source=firefox-browser&utm_medium=…" data-l10n-id="bottomLinks-privacy"/>
+ <hbox id="newBottom" pack="center" position="1">
+ <label is="text-link" class="bottom-link" href="https://support.torproject.org/">&bottomLinks.questions;</label>
+ <label is="text-link" class="bottom-link" href="https://community.torproject.org/relay/">&bottomLinks.grow;</label>
+ <label is="text-link" class="bottom-link" useoriginprincipal="true" href="about:license">&bottomLinks.license;</label>
</hbox>
<description id="trademark" data-l10n-id="trademarkInfo"></description>
+ <description id="trademarkTor">&tor.TrademarkStatement;</description>
</vbox>
</vbox>
diff --git a/browser/base/content/browser-doctype.inc b/browser/base/content/browser-doctype.inc
index a4c665087607..16108ba8b28c 100644
--- a/browser/base/content/browser-doctype.inc
+++ b/browser/base/content/browser-doctype.inc
@@ -8,3 +8,9 @@
%textcontextDTD;
<!ENTITY % placesDTD SYSTEM "chrome://browser/locale/places/places.dtd">
%placesDTD;
+<!ENTITY % torbuttonDTD SYSTEM "chrome://torbutton/locale/torbutton.dtd">
+%torbuttonDTD;
+<!ENTITY % aboutTorDTD SYSTEM "chrome://torbutton/locale/aboutTor.dtd">
+%aboutTorDTD;
+<!ENTITY % aboutDialogDTD SYSTEM "chrome://torbutton/locale/aboutDialog.dtd">
+%aboutDialogDTD;
diff --git a/browser/base/content/browser-menubar.inc b/browser/base/content/browser-menubar.inc
index a7189c2feab9..edc0314926bd 100644
--- a/browser/base/content/browser-menubar.inc
+++ b/browser/base/content/browser-menubar.inc
@@ -38,6 +38,18 @@
command="Tools:NonFissionWindow"
accesskey="s" label="New Non-Fission Window"/>
#endif
+ <menuseparator/>
+ <menuitem id="menu_newIdentity"
+ accesskey="&torbutton.context_menu.new_identity_key;"
+ key="torbutton-new-identity-key"
+ label="&torbutton.context_menu.new_identity;"
+ oncommand="torbutton_new_identity();"/>
+ <menuitem id="menu_newCircuit"
+ accesskey="&torbutton.context_menu.new_circuit_key;"
+ key="torbutton-new-circuit-key"
+ label="&torbutton.context_menu.new_circuit;"
+ oncommand="torbutton_new_circuit();"/>
+ <menuseparator/>
<menuitem id="menu_openLocation"
hidden="true"
command="Browser:OpenLocation"
@@ -466,19 +478,37 @@
<menupopup id="menu_HelpPopup" onpopupshowing="buildHelpMenu();">
<!-- Note: Items under here are cloned to the AppMenu Help submenu. The cloned items
have their strings defined by appmenu-data-l10n-id. -->
- <menuitem id="menu_openHelp"
+#ifdef MOZ_UPDATER
+ <menuitem id="checkForUpdates"
+ data-l10n-id="menu-help-check-for-update"
+ appmenu-data-l10n-id="appmenu-help-check-for-update"
+ class="menuitem-iconic"
+ oncommand="openAboutDialog();"/>
+#endif
+ <!-- dummy elements to avoid 'getElementById' errors -->
+ <box id="feedbackPage"/>
+ <box id="helpSafeMode"/>
+ <box id="menu_HelpPopup_reportPhishingtoolmenu"/>
+ <box id="menu_HelpPopup_reportPhishingErrortoolmenu"/>
+ <!-- Add Tor Browser manual link -->
+ <menuitem id="torBrowserUserManual"
+ oncommand="gBrowser.selectedTab = gBrowser.addTab('https://tb-manual.torproject.org/' + Services.locale.requestedLocale, {triggeringPrincipal: Services.scriptSecurityManager.getSystemPrincipal()});"
+ label="&aboutTor.torbrowser_user_manual.label;"
+ accesskey="&aboutTor.torbrowser_user_manual.accesskey;"/>
+ <!-- Bug 18905: Hide unused help menu items -->
+ <!-- <menuitem id="menu_openHelp"
oncommand="openHelpLink('firefox-help')"
data-l10n-id="menu-get-help"
appmenu-data-l10n-id="appmenu-get-help"
#ifdef XP_MACOSX
- key="key_openHelpMac"/>
+ key="key_openHelpMac"/> -->
#else
- />
+ /> -->
#endif
- <menuitem id="feedbackPage"
+ <!-- <menuitem id="feedbackPage"
oncommand="openFeedbackPage()"
data-l10n-id="menu-help-feedback-page"
- appmenu-data-l10n-id="appmenu-help-feedback-page"/>
+ appmenu-data-l10n-id="appmenu-help-feedback-page"/> -->
<menuitem id="helpSafeMode"
oncommand="safeModeRestart();"
data-l10n-id="menu-help-enter-troubleshoot-mode2"
@@ -493,17 +523,18 @@
appmenu-data-l10n-id="appmenu-help-report-site-issue"
hidden="true"/>
<menuitem id="menu_HelpPopup_reportPhishingtoolmenu"
+ <!-- <menuitem id="menu_HelpPopup_reportPhishingtoolmenu"
disabled="true"
oncommand="openUILink(gSafeBrowsing.getReportURL('Phish'), event, {triggeringPrincipal: Services.scriptSecurityManager.createNullPrincipal({})});"
hidden="true"
data-l10n-id="menu-help-report-deceptive-site"
- appmenu-data-l10n-id="appmenu-help-report-deceptive-site"/>
- <menuitem id="menu_HelpPopup_reportPhishingErrortoolmenu"
+ appmenu-data-l10n-id="appmenu-help-report-deceptive-site"/> -->
+ <!-- <menuitem id="menu_HelpPopup_reportPhishingErrortoolmenu"
disabled="true"
oncommand="ReportFalseDeceptiveSite();"
data-l10n-id="menu-help-not-deceptive"
appmenu-data-l10n-id="appmenu-help-not-deceptive"
- hidden="true"/>
+ hidden="true"/> -->
<menuseparator id="aboutSeparator"/>
<menuitem id="aboutName"
oncommand="openAboutDialog();"
diff --git a/browser/base/content/browser-sets.inc b/browser/base/content/browser-sets.inc
index fdd83f64896e..c3129d6aae07 100644
--- a/browser/base/content/browser-sets.inc
+++ b/browser/base/content/browser-sets.inc
@@ -383,4 +383,6 @@
data-l10n-id="hide-other-apps-shortcut"
modifiers="accel,alt"/>
#endif
+ <key id="torbutton-new-identity-key" modifiers="accel shift" key="U" oncommand="torbutton_new_identity()"/>
+ <key id="torbutton-new-circuit-key" modifiers="accel shift" key="L" oncommand="torbutton_new_circuit()"/>
</keyset>
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index bd4269e23261..3c6757b71af2 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -669,6 +669,7 @@ var gPageIcons = {
};
var gInitialPages = [
+ "about:tor",
"about:blank",
"about:newtab",
"about:home",
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 178cb69eef9c..2a92da47f1aa 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -29,6 +29,8 @@
<?xml-stylesheet href="chrome://browser/skin/searchbar.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/places/tree-icons.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/places/editBookmark.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/tor-circuit-display.css" type="text/css"?>
+<?xml-stylesheet href="chrome://torbutton/skin/torbutton.css" type="text/css"?>
# All DTD information is stored in a separate file so that it can be shared by
# hiddenWindowMac.xhtml.
@@ -106,11 +108,18 @@
Services.scriptloader.loadSubScript("chrome://browser/content/places/places-menupopup.js", this);
Services.scriptloader.loadSubScript("chrome://browser/content/search/autocomplete-popup.js", this);
Services.scriptloader.loadSubScript("chrome://browser/content/search/searchbar.js", this);
+ Services.scriptloader.loadSubScript("chrome://torbutton/content/tor-circuit-display.js", this);
+ Services.scriptloader.loadSubScript("chrome://torbutton/content/torbutton.js", this);
window.onload = gBrowserInit.onLoad.bind(gBrowserInit);
window.onunload = gBrowserInit.onUnload.bind(gBrowserInit);
window.onclose = WindowIsClosing;
+ //onLoad Handler
+ try {
+ window.addEventListener("load", torbutton_init, false);
+ } catch (e) {}
+
window.addEventListener("MozBeforeInitialXULLayout",
gBrowserInit.onBeforeInitialXULLayout.bind(gBrowserInit), { once: true });
@@ -780,7 +789,8 @@
class="subviewbutton subviewbutton-iconic"
label="&newPrivateWindow.label;"
key="key_privatebrowsing"
- command="Tools:PrivateBrowsing"/>
+ command="Tools:PrivateBrowsing"
+ hidden="true"/>
#ifdef NIGHTLY_BUILD
<toolbarbutton id="appMenu-fission-window-button"
class="subviewbutton subviewbutton-iconic"
@@ -796,7 +806,19 @@
<toolbarbutton id="appMenuRestoreLastSession"
label="&appMenuHistory.restoreSession.label;"
class="subviewbutton subviewbutton-iconic"
- command="Browser:RestoreLastSession"/>
+ command="Browser:RestoreLastSession"
+ hidden="true"/>
+ <toolbarseparator/>
+ <toolbarbutton id="appMenuNewIdentity"
+ class="subviewbutton subviewbutton-iconic"
+ key="torbutton-new-identity-key"
+ label="&torbutton.context_menu.new_identity;"
+ oncommand="torbutton_new_identity();"/>
+ <toolbarbutton id="appMenuNewCircuit"
+ class="subviewbutton subviewbutton-iconic"
+ key="torbutton-new-circuit-key"
+ label="&torbutton.context_menu.new_circuit;"
+ oncommand="torbutton_new_circuit();"/>
<toolbarseparator/>
<toolbaritem id="appMenu-zoom-controls" class="toolbaritem-combined-buttons" closemenu="none">
<!-- Use a spacer, because panel sizing code gets confused when using CSS methods. -->
diff --git a/browser/components/controlcenter/content/identityPanel.inc.xhtml b/browser/components/controlcenter/content/identityPanel.inc.xhtml
index ab40e6913f8b..9746c7090b5e 100644
--- a/browser/components/controlcenter/content/identityPanel.inc.xhtml
+++ b/browser/components/controlcenter/content/identityPanel.inc.xhtml
@@ -92,6 +92,50 @@
</vbox>
</hbox>
+ <!-- Circuit display section -->
+ <hbox id="circuit-display-container" class="identity-popup-section">
+ <vbox id="circuit-display-content" flex="1" role="group"
+ aria-labelledby="circuit-display-headline">
+ <hbox id="circuit-display-header" align="center">
+ <label id="circuit-display-headline"
+ role="heading" aria-level="2">&torbutton.circuit_display.title;</label>
+ </hbox>
+ <html:ul id="circuit-display-nodes" dir="auto"/>
+ </vbox>
+ <vbox id="circuit-reload-content" flex="1">
+ <html:button id="circuit-reload-button"
+ onclick="torbutton_new_circuit()">&torbutton.circuit_display.new_circuit;</html:button>
+ <hbox id="circuit-guard-note-container"/>
+ </vbox>
+ </hbox>
+
+ <!-- Permissions Section -->
+ <hbox class="identity-popup-section"
+ when-connection="not-secure secure secure-ev secure-cert-user-overridden file extension cert-error-page https-only-error-page">
+ <vbox id="identity-popup-permissions-content" flex="1" role="group"
+ aria-labelledby="identity-popup-permissions-headline">
+ <hbox id="identity-popup-permissions-header" align="center">
+ <label id="identity-popup-permissions-headline"
+ role="heading" aria-level="2"
+ data-l10n-id="identity-permissions"/>
+ </hbox>
+ <vbox id="identity-popup-permission-list">
+ <vbox id="identity-popup-permission-list-default-anchor" class="identity-popup-permission-list-anchor"/>
+ <vbox class="identity-popup-permission-list-anchor" anchorfor="3rdPartyStorage">
+ <vbox id="identity-popup-storage-access-permission-list-header">
+ <hbox align="center" role="group">
+ <image class="identity-popup-permission-icon storage-access-icon"/>
+ <label data-l10n-id="identity-permissions-storage-access-header" class="identity-popup-permission-header-label"/>
+ </hbox>
+ <description id="identity-popup-storage-access-permission-list-hint" data-l10n-id="identity-permissions-storage-access-hint"></description>
+ </vbox>
+ </vbox>
+ </vbox>
+ <description id="identity-popup-permission-reload-hint" data-l10n-id="identity-permissions-reload-hint"></description>
+ <description id="identity-popup-permission-empty-hint" data-l10n-id="identity-permissions-empty"></description>
+ </vbox>
+ </hbox>
+
<!-- Clear Site Data Button -->
<vbox hidden="true"
id="identity-popup-clear-sitedata-footer"
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index df579eb538c4..13e4df002734 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -252,6 +252,8 @@
@RESPATH@/browser/chrome/torlauncher/*
@RESPATH@/browser/@PREF_DIR@/torlauncher-prefs.js
#endif
+@RESPATH@/chrome/torbutton.manifest
+@RESPATH@/chrome/torbutton/*
@RESPATH@/chrome/toolkit@JAREXT@
@RESPATH@/chrome/toolkit.manifest
@RESPATH@/chrome/recording.manifest
diff --git a/docshell/base/nsAboutRedirector.cpp b/docshell/base/nsAboutRedirector.cpp
index d8add0b6fb11..74517923b750 100644
--- a/docshell/base/nsAboutRedirector.cpp
+++ b/docshell/base/nsAboutRedirector.cpp
@@ -159,7 +159,11 @@ static const RedirEntry kRedirMap[] = {
{"crashcontent", "about:blank",
nsIAboutModule::HIDE_FROM_ABOUTABOUT |
nsIAboutModule::URI_CAN_LOAD_IN_CHILD |
- nsIAboutModule::URI_MUST_LOAD_IN_CHILD}};
+ nsIAboutModule::URI_MUST_LOAD_IN_CHILD},
+ {"tor", "chrome://torbutton/content/aboutTor/aboutTor.xhtml",
+ nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
+ nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
+ nsIAboutModule::ALLOW_SCRIPT}};
static const int kRedirTotal = mozilla::ArrayLength(kRedirMap);
NS_IMETHODIMP
diff --git a/docshell/build/components.conf b/docshell/build/components.conf
index 9987b60fa2ec..475546757fd4 100644
--- a/docshell/build/components.conf
+++ b/docshell/build/components.conf
@@ -29,6 +29,7 @@ about_pages = [
'srcdoc',
'support',
'telemetry',
+ 'tor',
'url-classifier',
'webrtc',
]
diff --git a/mobile/android/installer/package-manifest.in b/mobile/android/installer/package-manifest.in
index 3e7736f71200..f19b2dace3d6 100644
--- a/mobile/android/installer/package-manifest.in
+++ b/mobile/android/installer/package-manifest.in
@@ -131,6 +131,10 @@
@BINPATH@/chrome/devtools@JAREXT@
@BINPATH@/chrome/devtools.manifest
+; Torbutton
+@BINPATH@/chrome/torbutton@JAREXT@
+@BINPATH@/chrome/torbutton.manifest
+
; [Default Preferences]
; All the pref files must be part of base to prevent migration bugs
#ifndef MOZ_ANDROID_FAT_AAR_ARCHITECTURES
diff --git a/toolkit/moz.build b/toolkit/moz.build
index 14f4638b693e..4edccfac6d62 100644
--- a/toolkit/moz.build
+++ b/toolkit/moz.build
@@ -22,6 +22,7 @@ DIRS += [
"mozapps/preferences",
"profile",
"themes",
+ "torproject/torbutton",
]
if CONFIG["OS_ARCH"] == "WINNT" and CONFIG["MOZ_DEFAULT_BROWSER_AGENT"]:
diff --git a/toolkit/mozapps/extensions/internal/XPIProvider.jsm b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
index bec6e27388ac..a6e020ecd4c9 100644
--- a/toolkit/mozapps/extensions/internal/XPIProvider.jsm
+++ b/toolkit/mozapps/extensions/internal/XPIProvider.jsm
@@ -1472,6 +1472,15 @@ var XPIStates = {
for (let [id, file] of loc.readAddons()) {
knownIds.delete(id);
+ // Uninstall torbutton if it is installed in the user profile
+ if (id === "torbutton(a)torproject.org" &&
+ loc.name === KEY_APP_PROFILE) {
+ logger.debug("Uninstalling torbutton from user profile.");
+ loc.installer.uninstallAddon(id);
+ changed = true;
+ continue;
+ }
+
// Since it is now part of the browser, uninstall the Tor Launcher
// extension. This will remove the Tor Launcher .xpi from user
// profiles on macOS.
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
new file mode 160000
index 000000000000..5264bddf8bc7
--- /dev/null
+++ b/toolkit/torproject/torbutton
@@ -0,0 +1 @@
+Subproject commit 5264bddf8bc71cbb4e88921b55e7b95fa4522b69
diff --git a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
index 76e03f2d49bb..2ff107b553b2 100644
--- a/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
+++ b/tools/lint/eslint/eslint-plugin-mozilla/lib/environments/browser-window.js
@@ -75,7 +75,11 @@ function getGlobalScriptIncludes(scriptPath) {
"browser/components/search/content/"
)
.replace("chrome://browser/content/", "browser/base/content/")
- .replace("chrome://global/content/", "toolkit/content/");
+ .replace("chrome://global/content/", "toolkit/content/")
+ .replace(
+ "chrome://torbutton/content/",
+ "toolkit/torproject/torbutton/chrome/content/"
+ );
for (let mapping of Object.getOwnPropertyNames(MAPPINGS)) {
if (sourceFile.includes(mapping)) {
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 13028: Prevent potential proxy bypass cases.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit f7dc10561208d6e484fba0a9140fc53e9d34d9c8
Author: Mike Perry <mikeperry-git(a)torproject.org>
Date: Mon Sep 29 14:30:19 2014 -0700
Bug 13028: Prevent potential proxy bypass cases.
It looks like these cases should only be invoked in the NSS command line
tools, and not the browser, but I decided to patch them anyway because there
literally is a maze of network function pointers being passed around, and it's
very hard to tell if some random code might not pass in the proper proxied
versions of the networking code here by accident.
---
security/nss/lib/certhigh/ocsp.c | 8 ++++++++
.../lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c | 21 +++++++++++++++++++++
2 files changed, 29 insertions(+)
diff --git a/security/nss/lib/certhigh/ocsp.c b/security/nss/lib/certhigh/ocsp.c
index cea8456606bf..86fa971cfbef 100644
--- a/security/nss/lib/certhigh/ocsp.c
+++ b/security/nss/lib/certhigh/ocsp.c
@@ -2932,6 +2932,14 @@ ocsp_ConnectToHost(const char *host, PRUint16 port)
PRNetAddr addr;
char *netdbbuf = NULL;
+ // XXX: Do we need a unittest ifdef here? We don't want to break the tests, but
+ // we want to ensure nothing can ever hit this code in production.
+#if 1
+ printf("Tor Browser BUG: Attempted OSCP direct connect to %s, port %u\n", host,
+ port);
+ goto loser;
+#endif
+
sock = PR_NewTCPSocket();
if (sock == NULL)
goto loser;
diff --git a/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c b/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c
index e8698376b5be..85791d84a932 100644
--- a/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c
+++ b/security/nss/lib/libpkix/pkix_pl_nss/module/pkix_pl_socket.c
@@ -1334,6 +1334,13 @@ pkix_pl_Socket_Create(
plContext),
PKIX_COULDNOTCREATESOCKETOBJECT);
+ // XXX: Do we need a unittest ifdef here? We don't want to break the tests, but
+ // we want to ensure nothing can ever hit this code in production.
+#if 1
+ printf("Tor Browser BUG: Attempted pkix direct socket connect\n");
+ PKIX_ERROR(PKIX_PRNEWTCPSOCKETFAILED);
+#endif
+
socket->isServer = isServer;
socket->timeout = timeout;
socket->clientSock = NULL;
@@ -1433,6 +1440,13 @@ pkix_pl_Socket_CreateByName(
localCopyName = PL_strdup(serverName);
+ // XXX: Do we need a unittest ifdef here? We don't want to break the tests, but
+ // we want to ensure nothing can ever hit this code in production.
+#if 1
+ printf("Tor Browser BUG: Attempted pkix direct connect to %s\n", serverName);
+ PKIX_ERROR(PKIX_PRNEWTCPSOCKETFAILED);
+#endif
+
sepPtr = strchr(localCopyName, ':');
/* First strip off the portnum, if present, from the end of the name */
if (sepPtr) {
@@ -1582,6 +1596,13 @@ pkix_pl_Socket_CreateByHostAndPort(
PKIX_ENTER(SOCKET, "pkix_pl_Socket_CreateByHostAndPort");
PKIX_NULLCHECK_THREE(hostname, pStatus, pSocket);
+ // XXX: Do we need a unittest ifdef here? We don't want to break the tests, but
+ // we want to ensure nothing can ever hit this code in production.
+#if 1
+ printf("Tor Browser BUG: Attempted pkix direct connect to %s, port %u\n", hostname,
+ portnum);
+ PKIX_ERROR(PKIX_PRNEWTCPSOCKETFAILED);
+#endif
prstatus = PR_GetHostByName(hostname, buf, sizeof(buf), &hostent);
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 16439: Remove screencasting code
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 66e87b4d1e7dbf164a1774e1846473201eabe87c
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Jun 24 11:01:11 2015 -0400
Bug 16439: Remove screencasting code
We avoid including the screencasting code on mobile (it got ripped out
for desktop in bug 1393582) by simply excluding the related JS modules
from Tor Browser.
---
toolkit/modules/moz.build | 9 +++++----
1 file changed, 5 insertions(+), 4 deletions(-)
diff --git a/toolkit/modules/moz.build b/toolkit/modules/moz.build
index 3c2ef3bfb8d7..bf1f00e4eaec 100644
--- a/toolkit/modules/moz.build
+++ b/toolkit/modules/moz.build
@@ -259,10 +259,11 @@ if "Android" != CONFIG["OS_TARGET"]:
]
else:
DEFINES["ANDROID"] = True
- EXTRA_JS_MODULES += [
- "secondscreen/RokuApp.jsm",
- "secondscreen/SimpleServiceDiscovery.jsm",
- ]
+ if not CONFIG["TOR_BROWSER_VERSION"]:
+ EXTRA_JS_MODULES += [
+ "secondscreen/RokuApp.jsm",
+ "secondscreen/SimpleServiceDiscovery.jsm",
+ ]
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "windows":
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Add TorStrings module for localization
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit f0ba757504d66df4764a429207b2247c35fd9d79
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Jul 24 21:15:20 2020 +0200
Add TorStrings module for localization
---
browser/modules/TorStrings.jsm | 490 +++++++++++++++++++++++++++++++++++++++++
browser/modules/moz.build | 1 +
2 files changed, 491 insertions(+)
diff --git a/browser/modules/TorStrings.jsm b/browser/modules/TorStrings.jsm
new file mode 100644
index 000000000000..e8a8d37ae373
--- /dev/null
+++ b/browser/modules/TorStrings.jsm
@@ -0,0 +1,490 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["TorStrings"];
+
+const { XPCOMUtils } = ChromeUtils.import(
+ "resource://gre/modules/XPCOMUtils.jsm"
+);
+const { Services } = ChromeUtils.import(
+ "resource://gre/modules/Services.jsm"
+);
+const { getLocale } = ChromeUtils.import(
+ "resource://torbutton/modules/utils.js"
+);
+
+XPCOMUtils.defineLazyGlobalGetters(this, ["DOMParser"]);
+XPCOMUtils.defineLazyGetter(this, "domParser", () => {
+ const parser = new DOMParser();
+ parser.forceEnableDTD();
+ return parser;
+});
+
+/*
+ Tor DTD String Bundle
+
+ DTD strings loaded from torbutton/tor-launcher, but provide a fallback in case they aren't available
+*/
+class TorDTDStringBundle {
+ constructor(aBundleURLs, aPrefix) {
+ let locations = [];
+ for (const [index, url] of aBundleURLs.entries()) {
+ locations.push(`<!ENTITY % dtd_${index} SYSTEM "${url}">%dtd_${index};`);
+ }
+ this._locations = locations;
+ this._prefix = aPrefix;
+ }
+
+ // copied from testing/marionette/l10n.js
+ localizeEntity(urls, id) {
+ // Use the DOM parser to resolve the entity and extract its real value
+ let header = `<?xml version="1.0"?><!DOCTYPE elem [${this._locations.join(
+ ""
+ )}]>`;
+ let elem = `<elem id="elementID">&${id};</elem>`;
+ let doc = domParser.parseFromString(header + elem, "text/xml");
+ let element = doc.querySelector("elem[id='elementID']");
+
+ if (element === null) {
+ throw new Error(`Entity with id='${id}' hasn't been found`);
+ }
+
+ return element.textContent;
+ }
+
+ getString(key, fallback) {
+ if (key) {
+ try {
+ return this.localizeEntity(this._bundleURLs, `${this._prefix}${key}`);
+ } catch (e) {}
+ }
+
+ // on failure, assign the fallback if it exists
+ if (fallback) {
+ return fallback;
+ }
+ // otherwise return string key
+ return `$(${key})`;
+ }
+}
+
+/*
+ Tor Property String Bundle
+
+ Property strings loaded from torbutton/tor-launcher, but provide a fallback in case they aren't available
+*/
+class TorPropertyStringBundle {
+ constructor(aBundleURL, aPrefix) {
+ try {
+ this._bundle = Services.strings.createBundle(aBundleURL);
+ } catch (e) {}
+
+ this._prefix = aPrefix;
+ }
+
+ getString(key, fallback) {
+ if (key) {
+ try {
+ return this._bundle.GetStringFromName(`${this._prefix}${key}`);
+ } catch (e) {}
+ }
+
+ // on failure, assign the fallback if it exists
+ if (fallback) {
+ return fallback;
+ }
+ // otherwise return string key
+ return `$(${key})`;
+ }
+}
+
+/*
+ Security Level Strings
+*/
+var TorStrings = {
+ /*
+ Tor Browser Security Level Strings
+ */
+ securityLevel: (function() {
+ let tsb = new TorDTDStringBundle(
+ ["chrome://torbutton/locale/torbutton.dtd"],
+ "torbutton.prefs.sec_"
+ );
+ let getString = function(key, fallback) {
+ return tsb.getString(key, fallback);
+ };
+
+ // read localized strings from torbutton; but use hard-coded en-US strings as fallbacks in case of error
+ let retval = {
+ securityLevel: getString("caption", "Security Level"),
+ customWarning: getString("custom_warning", "Custom"),
+ overview: getString(
+ "overview",
+ "Disable certain web features that can be used to attack your security and anonymity."
+ ),
+ standard: {
+ level: getString("standard_label", "Standard"),
+ tooltip: getString("standard_tooltip", "Security Level : Standard"),
+ summary: getString(
+ "standard_description",
+ "All Tor Browser and website features are enabled."
+ ),
+ },
+ safer: {
+ level: getString("safer_label", "Safer"),
+ tooltip: getString("safer_tooltip", "Security Level : Safer"),
+ summary: getString(
+ "safer_description",
+ "Disables website features that are often dangerous, causing some sites to lose functionality."
+ ),
+ description1: getString(
+ "js_on_https_sites_only",
+ "JavaScript is disabled on non-HTTPS sites."
+ ),
+ description2: getString(
+ "limit_typography",
+ "Some fonts and math symbols are disabled."
+ ),
+ description3: getString(
+ "click_to_play_media",
+ "Audio and video (HTML5 media), and WebGL are click-to-play."
+ ),
+ },
+ safest: {
+ level: getString("safest_label", "Safest"),
+ tooltip: getString("safest_tooltip", "Security Level : Safest"),
+ summary: getString(
+ "safest_description",
+ "Only allows website features required for static sites and basic services. These changes affect images, media, and scripts."
+ ),
+ description1: getString(
+ "js_disabled",
+ "JavaScript is disabled by default on all sites."
+ ),
+ description2: getString(
+ "limit_graphics_and_typography",
+ "Some fonts, icons, math symbols, and images are disabled."
+ ),
+ description3: getString(
+ "click_to_play_media",
+ "Audio and video (HTML5 media), and WebGL are click-to-play."
+ ),
+ },
+ custom: {
+ summary: getString(
+ "custom_summary",
+ "Your custom browser preferences have resulted in unusual security settings. For security and privacy reasons, we recommend you choose one of the default security levels."
+ ),
+ },
+ learnMore: getString("learn_more_label", "Learn more"),
+ learnMoreURL: `https://tb-manual.torproject.org/${getLocale()}/security-settings/`,
+ restoreDefaults: getString("restore_defaults", "Restore Defaults"),
+ advancedSecuritySettings: getString(
+ "advanced_security_settings",
+ "Advanced Security Settings\u2026"
+ ),
+ };
+ return retval;
+ })() /* Security Level Strings */,
+
+ /*
+ Tor about:preferences#tor Strings
+ */
+ settings: (function() {
+ let tsb = new TorDTDStringBundle(
+ ["chrome://torlauncher/locale/network-settings.dtd"],
+ ""
+ );
+ let getString = function(key, fallback) {
+ return tsb.getString(key, fallback);
+ };
+
+ let retval = {
+ categoryTitle: getString("torPreferences.categoryTitle", "Tor"),
+ torPreferencesHeading: getString(
+ "torPreferences.torSettings",
+ "Tor Settings"
+ ),
+ torPreferencesDescription: getString(
+ "torPreferences.torSettingsDescription",
+ "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world."
+ ),
+ learnMore: getString("torPreferences.learnMore", "Learn More"),
+ bridgesHeading: getString("torPreferences.bridges", "Bridges"),
+ bridgesDescription: getString(
+ "torPreferences.bridgesDescription",
+ "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another."
+ ),
+ useBridge: getString("torPreferences.useBridge", "Use a bridge"),
+ selectBridge: getString(
+ "torsettings.useBridges.default",
+ "Select a bridge"
+ ),
+ requestBridgeFromTorProject: getString(
+ "torsettings.useBridges.bridgeDB",
+ "Request a bridge from torproject.org"
+ ),
+ requestNewBridge: getString(
+ "torPreferences.requestNewBridge",
+ "Request a New Bridge\u2026"
+ ),
+ provideBridge: getString(
+ "torPreferences.provideBridge",
+ "Provide a bridge"
+ ),
+ provideBridgeDirections: getString(
+ "torsettings.useBridges.label",
+ "Enter bridge information from a trusted source."
+ ),
+ provideBridgePlaceholder: getString(
+ "torsettings.useBridges.placeholder",
+ "type address:port (one per line)"
+ ),
+ advancedHeading: getString("torPreferences.advanced", "Advanced"),
+ advancedDescription: getString(
+ "torPreferences.advancedDescription",
+ "Configure how Tor Browser connects to the internet."
+ ),
+ useLocalProxy: getString("torsettings.useProxy.checkbox", "I use a proxy to connect to the Internet"),
+ proxyType: getString("torsettings.useProxy.type", "Proxy Type"),
+ proxyTypeSOCKS4: getString("torsettings.useProxy.type.socks4", "SOCKS4"),
+ proxyTypeSOCKS5: getString("torsettings.useProxy.type.socks5", "SOCKS5"),
+ proxyTypeHTTP: getString("torsettings.useProxy.type.http", "HTTP/HTTPS"),
+ proxyAddress: getString("torsettings.useProxy.address", "Address"),
+ proxyAddressPlaceholder: getString(
+ "torsettings.useProxy.address.placeholder",
+ "IP address or hostname"
+ ),
+ proxyPort: getString("torsettings.useProxy.port", "Port"),
+ proxyUsername: getString("torsettings.useProxy.username", "Username"),
+ proxyPassword: getString("torsettings.useProxy.password", "Password"),
+ proxyUsernamePasswordPlaceholder: getString(
+ "torsettings.optional",
+ "Optional"
+ ),
+ useFirewall: getString(
+ "torsettings.firewall.checkbox",
+ "This computer goes through a firewall that only allows connections to certain ports"
+ ),
+ allowedPorts: getString(
+ "torsettings.firewall.allowedPorts",
+ "Allowed Ports"
+ ),
+ allowedPortsPlaceholder: getString(
+ "torPreferences.firewallPortsPlaceholder",
+ "Comma-seperated values"
+ ),
+ requestBridgeDialogTitle: getString(
+ "torPreferences.requestBridgeDialogTitle",
+ "Request Bridge"
+ ),
+ submitCaptcha: getString(
+ "torsettings.useBridges.captchaSubmit",
+ "Submit"
+ ),
+ contactingBridgeDB: getString(
+ "torPreferences.requestBridgeDialogWaitPrompt",
+ "Contacting BridgeDB. Please Wait."
+ ),
+ solveTheCaptcha: getString(
+ "torPreferences.requestBridgeDialogSolvePrompt",
+ "Solve the CAPTCHA to request a bridge."
+ ),
+ captchaTextboxPlaceholder: getString(
+ "torsettings.useBridges.captchaSolution.placeholder",
+ "Enter the characters from the image"
+ ),
+ incorrectCaptcha: getString(
+ "torPreferences.requestBridgeErrorBadSolution",
+ "The solution is not correct. Please try again."
+ ),
+ showTorDaemonLogs: getString(
+ "torPreferences.viewTorLogs",
+ "View the Tor logs."
+ ),
+ showLogs: getString("torPreferences.viewLogs", "View Logs\u2026"),
+ torLogDialogTitle: getString(
+ "torPreferences.torLogsDialogTitle",
+ "Tor Logs"
+ ),
+ copyLog: getString("torsettings.copyLog", "Copy Tor Log to Clipboard"),
+
+ learnMoreTorBrowserURL: `https://tb-manual.torproject.org/${getLocale()}/about/`,
+ learnMoreBridgesURL: `https://tb-manual.torproject.org/${getLocale()}/bridges/`,
+ learnMoreNetworkSettingsURL: `about:blank`,
+ };
+
+ return retval;
+ })() /* Tor Network Settings Strings */,
+
+ /*
+ Tor Onion Services Strings, e.g., for the authentication prompt.
+ */
+ onionServices: (function() {
+ let tsb = new TorPropertyStringBundle(
+ "chrome://torbutton/locale/torbutton.properties",
+ "onionServices."
+ );
+ let getString = function(key, fallback) {
+ return tsb.getString(key, fallback);
+ };
+
+ const kProblemLoadingSiteFallback = "Problem Loading Onionsite";
+ const kLongDescFallback = "Details: %S";
+
+ let retval = {
+ learnMore: getString("learnMore", "Learn more"),
+ learnMoreURL: `https://support.torproject.org/${getLocale()}/onionservices/client-auth/`,
+ errorPage: {
+ browser: getString("errorPage.browser", "Browser"),
+ network: getString("errorPage.network", "Network"),
+ onionSite: getString("errorPage.onionSite", "Onionsite"),
+ },
+ descNotFound: { // Tor SOCKS error 0xF0
+ pageTitle: getString("descNotFound.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("descNotFound.header", "Onionsite Not Found"),
+ longDescription: getString("descNotFound.longDescription", kLongDescFallback),
+ },
+ descInvalid: { // Tor SOCKS error 0xF1
+ pageTitle: getString("descInvalid.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("descInvalid.header", "Onionsite Cannot Be Reached"),
+ longDescription: getString("descInvalid.longDescription", kLongDescFallback),
+ },
+ introFailed: { // Tor SOCKS error 0xF2
+ pageTitle: getString("introFailed.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("introFailed.header", "Onionsite Has Disconnected"),
+ longDescription: getString("introFailed.longDescription", kLongDescFallback),
+ },
+ rendezvousFailed: { // Tor SOCKS error 0xF3
+ pageTitle: getString("rendezvousFailed.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("rendezvousFailed.header", "Unable to Connect to Onionsite"),
+ longDescription: getString("rendezvousFailed.longDescription", kLongDescFallback),
+ },
+ clientAuthMissing: { // Tor SOCKS error 0xF4
+ pageTitle: getString("clientAuthMissing.pageTitle", "Authorization Required"),
+ header: getString("clientAuthMissing.header", "Onionsite Requires Authentication"),
+ longDescription: getString("clientAuthMissing.longDescription", kLongDescFallback),
+ },
+ clientAuthIncorrect: { // Tor SOCKS error 0xF5
+ pageTitle: getString("clientAuthIncorrect.pageTitle", "Authorization Failed"),
+ header: getString("clientAuthIncorrect.header", "Onionsite Authentication Failed"),
+ longDescription: getString("clientAuthIncorrect.longDescription", kLongDescFallback),
+ },
+ badAddress: { // Tor SOCKS error 0xF6
+ pageTitle: getString("badAddress.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("badAddress.header", "Invalid Onionsite Address"),
+ longDescription: getString("badAddress.longDescription", kLongDescFallback),
+ },
+ introTimedOut: { // Tor SOCKS error 0xF7
+ pageTitle: getString("introTimedOut.pageTitle", kProblemLoadingSiteFallback),
+ header: getString("introTimedOut.header", "Onionsite Circuit Creation Timed Out"),
+ longDescription: getString("introTimedOut.longDescription", kLongDescFallback),
+ },
+ authPrompt: {
+ description:
+ getString("authPrompt.description2", "%S is requesting that you authenticate."),
+ keyPlaceholder: getString("authPrompt.keyPlaceholder", "Enter your key"),
+ done: getString("authPrompt.done", "Done"),
+ doneAccessKey: getString("authPrompt.doneAccessKey", "d"),
+ invalidKey: getString("authPrompt.invalidKey", "Invalid key"),
+ failedToSetKey:
+ getString("authPrompt.failedToSetKey", "Failed to set key"),
+ },
+ authPreferences: {
+ header: getString("authPreferences.header", "Onion Services Authentication"),
+ overview: getString("authPreferences.overview", "Some onion services require that you identify yourself with a key"),
+ savedKeys: getString("authPreferences.savedKeys", "Saved Keys"),
+ dialogTitle: getString("authPreferences.dialogTitle", "Onion Services Keys"),
+ dialogIntro: getString("authPreferences.dialogIntro", "Keys for the following onionsites are stored on your computer"),
+ onionSite: getString("authPreferences.onionSite", "Onionsite"),
+ onionKey: getString("authPreferences.onionKey", "Key"),
+ remove: getString("authPreferences.remove", "Remove"),
+ removeAll: getString("authPreferences.removeAll", "Remove All"),
+ failedToGetKeys: getString("authPreferences.failedToGetKeys", "Failed to get keys"),
+ failedToRemoveKey: getString("authPreferences.failedToRemoveKey", "Failed to remove key"),
+ },
+ };
+
+ return retval;
+ })() /* Tor Onion Services Strings */,
+
+ /*
+ OnionLocation
+ */
+ onionLocation: (function() {
+ const tsb = new TorPropertyStringBundle(
+ ["chrome://torbutton/locale/torbutton.properties"],
+ "onionLocation."
+ );
+ const getString = function(key, fallback) {
+ return tsb.getString(key, fallback);
+ };
+
+ const retval = {
+ alwaysPrioritize: getString(
+ "alwaysPrioritize",
+ "Always Prioritize Onionsites"
+ ),
+ alwaysPrioritizeAccessKey: getString("alwaysPrioritizeAccessKey", "a"),
+ notNow: getString("notNow", "Not Now"),
+ notNowAccessKey: getString("notNowAccessKey", "n"),
+ description: getString(
+ "description",
+ "Website publishers can protect users by adding a security layer. This prevents eavesdroppers from knowing that you are the one visiting that website."
+ ),
+ tryThis: getString("tryThis", "Try this: Onionsite"),
+ onionAvailable: getString("onionAvailable", "Onionsite available"),
+ learnMore: getString("learnMore", "Learn more"),
+ learnMoreURL: `https://tb-manual.torproject.org/${getLocale()}/onion-services/`,
+ always: getString("always", "Always"),
+ askEverytime: getString("askEverytime", "Ask you every time"),
+ prioritizeOnionsDescription: getString(
+ "prioritizeOnionsDescription",
+ "Prioritize onionsites when they are available."
+ ),
+ onionServicesTitle: getString("onionServicesTitle", "Onion Services"),
+ };
+
+ return retval;
+ })() /* OnionLocation */,
+
+ /*
+ Tor Deamon Configuration Key Strings
+ */
+
+ // TODO: proper camel case
+ configKeys: {
+ /* Bridge Conf Settings */
+ useBridges: "UseBridges",
+ bridgeList: "Bridge",
+ /* Proxy Conf Strings */
+ socks4Proxy: "Socks4Proxy",
+ socks5Proxy: "Socks5Proxy",
+ socks5ProxyUsername: "Socks5ProxyUsername",
+ socks5ProxyPassword: "Socks5ProxyPassword",
+ httpsProxy: "HTTPSProxy",
+ httpsProxyAuthenticator: "HTTPSProxyAuthenticator",
+ /* Firewall Conf Strings */
+ reachableAddresses: "ReachableAddresses",
+
+ /* BridgeDB Strings */
+ clientTransportPlugin: "ClientTransportPlugin",
+ },
+
+ /*
+ about:config preference keys
+ */
+
+ preferenceKeys: {
+ defaultBridgeType: "extensions.torlauncher.default_bridge_type",
+ recommendedBridgeType:
+ "extensions.torlauncher.default_bridge_recommended_type",
+ },
+
+ /*
+ about:config preference branches
+ */
+ preferenceBranches: {
+ defaultBridge: "extensions.torlauncher.default_bridge.",
+ bridgeDBBridges: "extensions.torlauncher.bridgedb_bridge.",
+ },
+};
diff --git a/browser/modules/moz.build b/browser/modules/moz.build
index b069f1b641f7..3774c12f4ef0 100644
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -152,6 +152,7 @@ EXTRA_JS_MODULES += [
"TabsList.jsm",
"TabUnloader.jsm",
"ThemeVariableMap.jsm",
+ "TorStrings.jsm",
"TransientPrefs.jsm",
"webrtcUI.jsm",
"ZoomUI.jsm",
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 14631: Improve profile access error messages.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 13dc313415f5dcb149550b4473b013b3720678af
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Feb 24 13:50:23 2015 -0500
Bug 14631: Improve profile access error messages.
Instead of always reporting that the profile is locked, display specific
messages for "access denied" and "read-only file system".
To allow for localization, get profile-related error strings from Torbutton.
Use app display name ("Tor Browser") in profile-related error alerts.
---
.../mozapps/profile/profileSelection.properties | 5 +
toolkit/profile/nsToolkitProfileService.cpp | 57 +++++++-
toolkit/profile/nsToolkitProfileService.h | 13 +-
toolkit/xre/nsAppRunner.cpp | 157 ++++++++++++++++++---
4 files changed, 208 insertions(+), 24 deletions(-)
diff --git a/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties b/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
index d326083202b2..aa38bda24347 100644
--- a/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
+++ b/toolkit/locales/en-US/chrome/mozapps/profile/profileSelection.properties
@@ -12,6 +12,11 @@ restartMessageUnlocker=%S is already running, but is not responding. The old %S
restartMessageNoUnlockerMac=A copy of %S is already open. Only one copy of %S can be open at a time.
restartMessageUnlockerMac=A copy of %S is already open. The running copy of %S will quit in order to open this one.
+# LOCALIZATION NOTE (profileProblemTitle, profileReadOnly, profileReadOnlyMac, profileAccessDenied): Messages displayed when the browser profile cannot be accessed or written to. %S is the application name.
+profileProblemTitle=%S Profile Problem
+profileReadOnly=You cannot run %S from a read-only file system. Please copy %S to another location before trying to use it.
+profileReadOnlyMac=You cannot run %S from a read-only file system. Please copy %S to your Desktop or Applications folder before trying to use it.
+profileAccessDenied=%S does not have permission to access the profile. Please adjust your file system permissions and try again.
# Profile manager
# LOCALIZATION NOTE (profileTooltip): First %S is the profile name, second %S is the path to the profile folder.
profileTooltip=Profile: ‘%S’ — Path: ‘%S’
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
index 8f8851446c0f..50b77209e614 100644
--- a/toolkit/profile/nsToolkitProfileService.cpp
+++ b/toolkit/profile/nsToolkitProfileService.cpp
@@ -1152,9 +1152,10 @@ nsToolkitProfileService::SelectStartupProfile(
}
bool wasDefault;
+ ProfileStatus profileStatus;
nsresult rv =
SelectStartupProfile(&argc, argv.get(), aIsResetting, aRootDir, aLocalDir,
- aProfile, aDidCreate, &wasDefault);
+ aProfile, aDidCreate, &wasDefault, profileStatus);
// Since we were called outside of the normal startup path complete any
// startup tasks.
@@ -1187,7 +1188,8 @@ nsToolkitProfileService::SelectStartupProfile(
nsresult nsToolkitProfileService::SelectStartupProfile(
int* aArgc, char* aArgv[], bool aIsResetting, nsIFile** aRootDir,
nsIFile** aLocalDir, nsIToolkitProfile** aProfile, bool* aDidCreate,
- bool* aWasDefaultSelection) {
+ bool* aWasDefaultSelection, ProfileStatus& aProfileStatus) {
+ aProfileStatus = PROFILE_STATUS_OK;
if (mStartupProfileSelected) {
return NS_ERROR_ALREADY_INITIALIZED;
}
@@ -1280,6 +1282,13 @@ nsresult nsToolkitProfileService::SelectStartupProfile(
rv = XRE_GetFileFromPath(arg, getter_AddRefs(lf));
NS_ENSURE_SUCCESS(rv, rv);
+ aProfileStatus = CheckProfileWriteAccess(lf);
+ if (PROFILE_STATUS_OK != aProfileStatus) {
+ NS_ADDREF(*aRootDir = lf);
+ NS_ADDREF(*aLocalDir = lf);
+ return NS_ERROR_FAILURE;
+ }
+
// Make sure that the profile path exists and it's a directory.
bool exists;
rv = lf->Exists(&exists);
@@ -2073,3 +2082,47 @@ nsresult XRE_GetFileFromPath(const char* aPath, nsIFile** aResult) {
# error Platform-specific logic needed here.
#endif
}
+
+// Check for write permission to the profile directory by trying to create a
+// new file (after ensuring that no file with the same name exists).
+ProfileStatus nsToolkitProfileService::CheckProfileWriteAccess(
+ nsIFile* aProfileDir) {
+#if defined(XP_UNIX)
+ constexpr auto writeTestFileName = u".parentwritetest"_ns;
+#else
+ constexpr auto writeTestFileName = u"parent.writetest"_ns;
+#endif
+
+ nsCOMPtr<nsIFile> writeTestFile;
+ nsresult rv = aProfileDir->Clone(getter_AddRefs(writeTestFile));
+ if (NS_SUCCEEDED(rv)) rv = writeTestFile->Append(writeTestFileName);
+
+ if (NS_SUCCEEDED(rv)) {
+ bool doesExist = false;
+ rv = writeTestFile->Exists(&doesExist);
+ if (NS_SUCCEEDED(rv) && doesExist) rv = writeTestFile->Remove(true);
+ }
+
+ if (NS_SUCCEEDED(rv)) {
+ rv = writeTestFile->Create(nsIFile::NORMAL_FILE_TYPE, 0666);
+ (void)writeTestFile->Remove(true);
+ }
+
+ ProfileStatus status =
+ NS_SUCCEEDED(rv) ? PROFILE_STATUS_OK : PROFILE_STATUS_OTHER_ERROR;
+ if (NS_ERROR_FILE_ACCESS_DENIED == rv)
+ status = PROFILE_STATUS_ACCESS_DENIED;
+ else if (NS_ERROR_FILE_READ_ONLY == rv)
+ status = PROFILE_STATUS_READ_ONLY;
+
+ return status;
+}
+
+ProfileStatus nsToolkitProfileService::CheckProfileWriteAccess(
+ nsIToolkitProfile* aProfile) {
+ nsCOMPtr<nsIFile> profileDir;
+ nsresult rv = aProfile->GetRootDir(getter_AddRefs(profileDir));
+ if (NS_FAILED(rv)) return PROFILE_STATUS_OTHER_ERROR;
+
+ return CheckProfileWriteAccess(profileDir);
+}
diff --git a/toolkit/profile/nsToolkitProfileService.h b/toolkit/profile/nsToolkitProfileService.h
index d281d39ebe59..5c97c906df49 100644
--- a/toolkit/profile/nsToolkitProfileService.h
+++ b/toolkit/profile/nsToolkitProfileService.h
@@ -16,6 +16,14 @@
#include "nsProfileLock.h"
#include "nsINIParser.h"
+enum ProfileStatus {
+ PROFILE_STATUS_OK,
+ PROFILE_STATUS_ACCESS_DENIED,
+ PROFILE_STATUS_READ_ONLY,
+ PROFILE_STATUS_IS_LOCKED,
+ PROFILE_STATUS_OTHER_ERROR
+};
+
class nsToolkitProfile final
: public nsIToolkitProfile,
public mozilla::LinkedListElement<RefPtr<nsToolkitProfile>> {
@@ -80,10 +88,13 @@ class nsToolkitProfileService final : public nsIToolkitProfileService {
nsresult SelectStartupProfile(int* aArgc, char* aArgv[], bool aIsResetting,
nsIFile** aRootDir, nsIFile** aLocalDir,
nsIToolkitProfile** aProfile, bool* aDidCreate,
- bool* aWasDefaultSelection);
+ bool* aWasDefaultSelection,
+ ProfileStatus& aProfileStatus);
nsresult CreateResetProfile(nsIToolkitProfile** aNewProfile);
nsresult ApplyResetProfile(nsIToolkitProfile* aOldProfile);
void CompleteStartup();
+ static ProfileStatus CheckProfileWriteAccess(nsIToolkitProfile* aProfile);
+ static ProfileStatus CheckProfileWriteAccess(nsIFile* aProfileDir);
private:
friend class nsToolkitProfile;
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 49b79fa9a1ab..f444b6f1e22c 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2272,6 +2272,91 @@ nsresult LaunchChild(bool aBlankCommandLine, bool aTryExec) {
return NS_ERROR_LAUNCHED_CHILD_PROCESS;
}
+static nsresult GetOverrideStringBundleForLocale(nsIStringBundleService* aSBS,
+ const char* aTorbuttonURI,
+ const char* aLocale,
+ nsIStringBundle** aResult) {
+ NS_ENSURE_ARG(aSBS);
+ NS_ENSURE_ARG(aTorbuttonURI);
+ NS_ENSURE_ARG(aLocale);
+ NS_ENSURE_ARG(aResult);
+
+ const char* kFormatStr =
+ "jar:%s!/chrome/torbutton/locale/%s/torbutton.properties";
+ nsPrintfCString strBundleURL(kFormatStr, aTorbuttonURI, aLocale);
+ nsresult rv = aSBS->CreateBundle(strBundleURL.get(), aResult);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ // To ensure that we have a valid string bundle, try to retrieve a string
+ // that we know exists.
+ nsAutoString val;
+ rv = (*aResult)->GetStringFromName("profileProblemTitle", val);
+ if (!NS_SUCCEEDED(rv)) *aResult = nullptr; // No good. Discard it.
+
+ return rv;
+}
+
+static void GetOverrideStringBundle(nsIStringBundleService* aSBS,
+ nsIStringBundle** aResult) {
+ if (!aSBS || !aResult) return;
+
+ *aResult = nullptr;
+
+ // Build Torbutton file URI string by starting from GREDir.
+ RefPtr<nsXREDirProvider> dirProvider = nsXREDirProvider::GetSingleton();
+ if (!dirProvider) return;
+
+ nsCOMPtr<nsIFile> greDir = dirProvider->GetGREDir();
+ if (!greDir) return;
+
+ // Create file URI, extract as string, and append omni.ja relative path.
+ nsCOMPtr<nsIURI> uri;
+ nsAutoCString uriString;
+ if (NS_FAILED(NS_NewFileURI(getter_AddRefs(uri), greDir)) ||
+ NS_FAILED(uri->GetSpec(uriString))) {
+ return;
+ }
+
+ uriString.Append("omni.ja");
+
+ nsAutoCString userAgentLocale;
+ if (!NS_SUCCEEDED(
+ Preferences::GetCString("intl.locale.requested", userAgentLocale))) {
+ return;
+ }
+
+ nsresult rv = GetOverrideStringBundleForLocale(
+ aSBS, uriString.get(), userAgentLocale.get(), aResult);
+ if (NS_FAILED(rv)) {
+ // Try again using base locale, e.g., "en" vs. "en-US".
+ int16_t offset = userAgentLocale.FindChar('-', 1);
+ if (offset > 0) {
+ nsAutoCString shortLocale(Substring(userAgentLocale, 0, offset));
+ rv = GetOverrideStringBundleForLocale(aSBS, uriString.get(),
+ shortLocale.get(), aResult);
+ }
+ }
+}
+
+static nsresult GetFormattedString(nsIStringBundle* aOverrideBundle,
+ nsIStringBundle* aMainBundle,
+ const char* aName,
+ const nsTArray<nsString>& aParams,
+ nsAString& aResult) {
+ NS_ENSURE_ARG(aName);
+
+ nsresult rv = NS_ERROR_FAILURE;
+ if (aOverrideBundle) {
+ rv = aOverrideBundle->FormatStringFromName(aName, aParams, aResult);
+ }
+
+ // If string was not found in override bundle, use main (browser) bundle.
+ if (NS_FAILED(rv) && aMainBundle)
+ rv = aMainBundle->FormatStringFromName(aName, aParams, aResult);
+
+ return rv;
+}
+
static const char kProfileProperties[] =
"chrome://mozapps/locale/profile/profileSelection.properties";
@@ -2337,7 +2422,7 @@ static nsresult ProfileMissingDialog(nsINativeAppSupport* aNative) {
sbs->CreateBundle(kProfileProperties, getter_AddRefs(sb));
NS_ENSURE_TRUE_LOG(sbs, NS_ERROR_FAILURE);
- NS_ConvertUTF8toUTF16 appName(gAppData->name);
+ NS_ConvertUTF8toUTF16 appName(MOZ_APP_DISPLAYNAME);
AutoTArray<nsString, 2> params = {appName, appName};
// profileMissing
@@ -2359,11 +2444,12 @@ static nsresult ProfileMissingDialog(nsINativeAppSupport* aNative) {
}
}
-static ReturnAbortOnError ProfileLockedDialog(nsIFile* aProfileDir,
- nsIFile* aProfileLocalDir,
- nsIProfileUnlocker* aUnlocker,
- nsINativeAppSupport* aNative,
- nsIProfileLock** aResult) {
+static ReturnAbortOnError ProfileErrorDialog(nsIFile* aProfileDir,
+ nsIFile* aProfileLocalDir,
+ ProfileStatus aStatus,
+ nsIProfileUnlocker* aUnlocker,
+ nsINativeAppSupport* aNative,
+ nsIProfileLock** aResult) {
nsresult rv;
bool exists;
@@ -2391,24 +2477,39 @@ static ReturnAbortOnError ProfileLockedDialog(nsIFile* aProfileDir,
sbs->CreateBundle(kProfileProperties, getter_AddRefs(sb));
NS_ENSURE_TRUE_LOG(sbs, NS_ERROR_FAILURE);
- NS_ConvertUTF8toUTF16 appName(gAppData->name);
+ nsCOMPtr<nsIStringBundle> overrideSB;
+ GetOverrideStringBundle(sbs, getter_AddRefs(overrideSB));
+
+ NS_ConvertUTF8toUTF16 appName(MOZ_APP_DISPLAYNAME);
AutoTArray<nsString, 3> params = {appName, appName, appName};
nsAutoString killMessage;
#ifndef XP_MACOSX
- rv = sb->FormatStringFromName(
- aUnlocker ? "restartMessageUnlocker" : "restartMessageNoUnlocker2",
- params, killMessage);
+ static const char kRestartUnlocker[] = "restartMessageUnlocker";
+ static const char kRestartNoUnlocker[] = "restartMessageNoUnlocker2";
+ static const char kReadOnly[] = "profileReadOnly";
#else
- rv = sb->FormatStringFromName(
- aUnlocker ? "restartMessageUnlockerMac" : "restartMessageNoUnlockerMac",
- params, killMessage);
-#endif
+ static const char kRestartUnlocker[] = "restartMessageUnlockerMac";
+ static const char kRestartNoUnlocker[] = "restartMessageNoUnlockerMac";
+ static const char kReadOnly[] = "profileReadOnlyMac";
+#endif
+ static const char kAccessDenied[] = "profileAccessDenied";
+
+ const char* errorKey = aUnlocker ? kRestartUnlocker : kRestartNoUnlocker;
+ if (PROFILE_STATUS_READ_ONLY == aStatus)
+ errorKey = kReadOnly;
+ else if (PROFILE_STATUS_ACCESS_DENIED == aStatus)
+ errorKey = kAccessDenied;
+ rv = GetFormattedString(overrideSB, sb, errorKey, params, killMessage);
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
+ const char* titleKey = ((PROFILE_STATUS_READ_ONLY == aStatus) ||
+ (PROFILE_STATUS_ACCESS_DENIED == aStatus))
+ ? "profileProblemTitle"
+ : "restartTitle";
params.SetLength(1);
nsAutoString killTitle;
- rv = sb->FormatStringFromName("restartTitle", params, killTitle);
+ rv = sb->FormatStringFromName(titleKey, params, killTitle);
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
#ifdef MOZ_BACKGROUNDTASKS
@@ -2579,6 +2680,13 @@ static nsCOMPtr<nsIToolkitProfile> gResetOldProfile;
static nsresult LockProfile(nsINativeAppSupport* aNative, nsIFile* aRootDir,
nsIFile* aLocalDir, nsIToolkitProfile* aProfile,
nsIProfileLock** aResult) {
+ ProfileStatus status =
+ (aProfile ? nsToolkitProfileService::CheckProfileWriteAccess(aProfile)
+ : nsToolkitProfileService::CheckProfileWriteAccess(aRootDir));
+ if (PROFILE_STATUS_OK != status)
+ return ProfileErrorDialog(aRootDir, aLocalDir, status, nullptr, aNative,
+ aResult);
+
// If you close Firefox and very quickly reopen it, the old Firefox may
// still be closing down. Rather than immediately showing the
// "Firefox is running but is not responding" message, we spend a few
@@ -2605,7 +2713,8 @@ static nsresult LockProfile(nsINativeAppSupport* aNative, nsIFile* aRootDir,
} while (TimeStamp::Now() - start <
TimeDuration::FromSeconds(kLockRetrySeconds));
- return ProfileLockedDialog(aRootDir, aLocalDir, unlocker, aNative, aResult);
+ return ProfileErrorDialog(aRootDir, aLocalDir, PROFILE_STATUS_IS_LOCKED,
+ unlocker, aNative, aResult);
}
// Pick a profile. We need to end up with a profile root dir, local dir and
@@ -2620,7 +2729,8 @@ static nsresult LockProfile(nsINativeAppSupport* aNative, nsIFile* aRootDir,
static nsresult SelectProfile(nsToolkitProfileService* aProfileSvc,
nsINativeAppSupport* aNative, nsIFile** aRootDir,
nsIFile** aLocalDir, nsIToolkitProfile** aProfile,
- bool* aWasDefaultSelection) {
+ bool* aWasDefaultSelection,
+ nsIProfileLock** aResult) {
StartupTimeline::Record(StartupTimeline::SELECT_PROFILE);
nsresult rv;
@@ -2666,9 +2776,14 @@ static nsresult SelectProfile(nsToolkitProfileService* aProfileSvc,
// Ask the profile manager to select the profile directories to use.
bool didCreate = false;
- rv = aProfileSvc->SelectStartupProfile(&gArgc, gArgv, gDoProfileReset,
- aRootDir, aLocalDir, aProfile,
- &didCreate, aWasDefaultSelection);
+ ProfileStatus profileStatus = PROFILE_STATUS_OK;
+ rv = aProfileSvc->SelectStartupProfile(
+ &gArgc, gArgv, gDoProfileReset, aRootDir, aLocalDir, aProfile, &didCreate,
+ aWasDefaultSelection, profileStatus);
+ if (PROFILE_STATUS_OK != profileStatus) {
+ return ProfileErrorDialog(*aRootDir, *aLocalDir, profileStatus, nullptr,
+ aNative, aResult);
+ }
if (rv == NS_ERROR_SHOW_PROFILE_MANAGER) {
return ShowProfileManager(aProfileSvc, aNative);
@@ -4453,7 +4568,7 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
nsCOMPtr<nsIToolkitProfile> profile;
rv = SelectProfile(mProfileSvc, mNativeApp, getter_AddRefs(mProfD),
getter_AddRefs(mProfLD), getter_AddRefs(profile),
- &wasDefaultSelection);
+ &wasDefaultSelection, getter_AddRefs(mProfileLock));
if (rv == NS_ERROR_LAUNCHED_CHILD_PROCESS || rv == NS_ERROR_ABORT) {
*aExitFlag = true;
return 0;
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 16620: Clear window.name when no referrer sent
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 4cdf20c8d31cce90024f9d27750e20fb9376106e
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Oct 30 14:28:13 2015 -0400
Bug 16620: Clear window.name when no referrer sent
Convert JS implementation (within Torbutton) to a C++ browser patch.
---
docshell/base/nsDocShell.cpp | 60 +++++++
docshell/test/mochitest/mochitest.ini | 5 +
docshell/test/mochitest/test_tor_bug16620.html | 211 +++++++++++++++++++++++++
docshell/test/mochitest/tor_bug16620.html | 51 ++++++
docshell/test/mochitest/tor_bug16620_form.html | 51 ++++++
modules/libpref/init/StaticPrefList.yaml | 2 +-
6 files changed, 379 insertions(+), 1 deletion(-)
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index 5e6dd8ef2906..f1119393898d 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -7903,11 +7903,71 @@ nsresult nsDocShell::CreateContentViewer(const nsACString& aContentType,
aOpenedChannel->GetURI(getter_AddRefs(mLoadingURI));
}
FirePageHideNotification(!mSavingOldViewer);
+
if (mIsBeingDestroyed) {
// Force to stop the newly created orphaned viewer.
viewer->Stop();
return NS_ERROR_DOCSHELL_DYING;
}
+
+ // Tor bug 16620: Clear window.name of top-level documents if
+ // there is no referrer. We make an exception for new windows,
+ // e.g., window.open(url, "MyName").
+ bool isNewWindowTarget = false;
+ nsCOMPtr<nsIPropertyBag2> props(do_QueryInterface(aRequest, &rv));
+ if (props) {
+ props->GetPropertyAsBool(u"docshell.newWindowTarget"_ns,
+ &isNewWindowTarget);
+ }
+
+ if (!isNewWindowTarget) {
+ nsCOMPtr<nsIHttpChannel> httpChannel(do_QueryInterface(aOpenedChannel));
+ nsCOMPtr<nsIURI> httpReferrer;
+ if (httpChannel) {
+ nsCOMPtr<nsIReferrerInfo> referrerInfo;
+ rv = httpChannel->GetReferrerInfo(getter_AddRefs(referrerInfo));
+ NS_ENSURE_SUCCESS(rv, rv);
+ if (referrerInfo) {
+ // We want GetComputedReferrer() instead of GetOriginalReferrer(), since
+ // the former takes into consideration referrer policy, protocol
+ // whitelisting...
+ httpReferrer = referrerInfo->GetComputedReferrer();
+ }
+ }
+
+ bool isTopFrame = mBrowsingContext->IsTop();
+
+#ifdef DEBUG_WINDOW_NAME
+ printf("DOCSHELL %p CreateContentViewer - possibly clearing window.name:\n",
+ this);
+ printf(" current window.name: \"%s\"\n",
+ NS_ConvertUTF16toUTF8(mName).get());
+
+ nsAutoCString curSpec, loadingSpec;
+ if (this->mCurrentURI) mCurrentURI->GetSpec(curSpec);
+ if (mLoadingURI) mLoadingURI->GetSpec(loadingSpec);
+ printf(" current URI: %s\n", curSpec.get());
+ printf(" loading URI: %s\n", loadingSpec.get());
+ printf(" is top document: %s\n", isTopFrame ? "Yes" : "No");
+
+ if (!httpReferrer) {
+ printf(" referrer: None\n");
+ } else {
+ nsAutoCString refSpec;
+ httpReferrer->GetSpec(refSpec);
+ printf(" referrer: %s\n", refSpec.get());
+ }
+#endif
+
+ bool clearName = isTopFrame && !httpReferrer;
+ if (clearName) SetName(u""_ns);
+
+#ifdef DEBUG_WINDOW_NAME
+ printf(" action taken: %s window.name\n",
+ clearName ? "Cleared" : "Preserved");
+#endif
+ }
+
mLoadingURI = nullptr;
// Set mFiredUnloadEvent = false so that the unload handler for the
diff --git a/docshell/test/mochitest/mochitest.ini b/docshell/test/mochitest/mochitest.ini
index cea63f080117..efc991ef1eee 100644
--- a/docshell/test/mochitest/mochitest.ini
+++ b/docshell/test/mochitest/mochitest.ini
@@ -53,6 +53,10 @@ support-files =
start_historyframe.html
url1_historyframe.html
url2_historyframe.html
+ tor_bug16620.html
+ tor_bug16620_form.html
+prefs =
+ gfx.font_rendering.fallback.async=false
[test_anchor_scroll_after_document_open.html]
[test_bfcache_plus_hash.html]
@@ -120,6 +124,7 @@ support-files =
[test_framedhistoryframes.html]
support-files = file_framedhistoryframes.html
[test_pushState_after_document_open.html]
+[test_tor_bug16620.html]
[test_navigate_after_pagehide.html]
[test_redirect_history.html]
support-files =
diff --git a/docshell/test/mochitest/test_tor_bug16620.html b/docshell/test/mochitest/test_tor_bug16620.html
new file mode 100644
index 000000000000..46fff5a04711
--- /dev/null
+++ b/docshell/test/mochitest/test_tor_bug16620.html
@@ -0,0 +1,211 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+ Tor Bug 16620: Clear window.name when no referrer sent.
+ https://trac.torproject.org/projects/tor/ticket/16620
+-->
+<meta charset="utf-8">
+<head>
+ <title>Test for Tor Bug 16620 - Clear window.name when no referrer sent</title>
+ <script type="application/javascript"
+ src="/tests/SimpleTest/SimpleTest.js"></script>
+ <link rel="stylesheet" type="text/css" href="/tests/SimpleTest/test.css"/>
+</head>
+<body>
+<a target="_blank" href="https://trac.torproject.org/projects/tor/ticket/16620">Tor Bug 16620</a>
+<script>
+// ## Test constants
+const kTestPath = "/tests/docshell/test/mochitest/";
+const kLinkFile = "tor_bug16620.html";
+const kFormFile = "tor_bug16620_form.html";
+const kBaseURL1 = "http://example.com";
+const kBaseURL1_https = "https://example.com";
+const kBaseURL2 = "http://example.net";
+const kSendReferrerPref = "network.http.sendRefererHeader";
+const kSendReferrerNever = 0;
+const kSendReferrerForUserAction = 1;
+const kSendReferrerAlways = 2;
+
+let gTests = [
+ // Test #1: Same domain; never send referrer.
+ { startURL: kBaseURL1, destURL: kBaseURL1,
+ referrerPref: kSendReferrerNever,
+ expectIsolation: true },
+
+ // Test #2: Same domain; send referrer upon user action.
+ { startURL: kBaseURL1, destURL: kBaseURL1,
+ referrerPref: kSendReferrerForUserAction,
+ expectIsolation: false },
+
+ // Test #3: Same domain; always send referrer.
+ { startURL: kBaseURL1, destURL: kBaseURL1,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: false },
+
+ // Test #4: Different top-level domains; never send referrer.
+ { startURL: kBaseURL1, destURL: kBaseURL2,
+ referrerPref: kSendReferrerNever,
+ expectIsolation: true },
+
+ // Test #5: Different top-level domains; send referrer upon user action.
+ { startURL: kBaseURL1, destURL: kBaseURL2,
+ referrerPref: kSendReferrerForUserAction,
+ expectIsolation: false },
+
+ // Test #6: Different top-level domains; always send referrer.
+ { startURL: kBaseURL1, destURL: kBaseURL2,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: false },
+
+ // Test #7: https -> http transition.
+ { startURL: kBaseURL1_https, destURL: kBaseURL1,
+ referrerPref: kSendReferrerForUserAction,
+ expectIsolation: true },
+
+ // Test #8: Same domain, rel="noreferrer" on link.
+ { startURL: kBaseURL1, destURL: kBaseURL1, noReferrerOnLink: true,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: true },
+
+ // Test #9: Same domain, "no-referrer" meta tag in document.
+ { startURL: kBaseURL1, destURL: kBaseURL1, noReferrerInMetaTag: true,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: true },
+
+ // Test #10: Like test #9, but reset window.name during unload.
+ // (similar to http://www.thomasfrank.se/sessvarsTestPage1.html)
+ { startURL: kBaseURL1, destURL: kBaseURL1, noReferrerInMetaTag: true,
+ resetInUnload: true,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: true },
+
+ // Test #11: Data URL as destination (no referrer).
+ { startURL: kBaseURL1,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: true },
+
+ // Test #12: Ensure that window.name is preserved when a dynamically loaded
+ // iframe is used to perform a form post (regression test for Tor bug 18168).
+ { startURL: kBaseURL1,
+ isFormTest: true,
+ referrerPref: kSendReferrerAlways,
+ expectIsolation: false },
+];
+
+let gCurTest = 0;
+let gCurWinName, gChildWin, gDataURL;
+
+// ## Utility functions
+function generateRandomName()
+{
+ // Generate a random 6 character string using 0-9 and a-z.
+ return ((1 + Math.random()).toString(36) + '000000').substr(2, 6);
+}
+
+function startNextTest() {
+ ++gCurTest;
+ if (gCurTest > gTests.length) {
+ SimpleTest.finish();
+ } else {
+ let curTest = gTests[gCurTest - 1];
+ if ("referrerPref" in curTest)
+ SpecialPowers.setIntPref(kSendReferrerPref, curTest.referrerPref);
+ else
+ SpecialPowers.setIntPref(kSendReferrerPref, kSendReferrerForUserAction);
+ gCurWinName = generateRandomName();
+ let url = curTest.startURL + kTestPath;
+ if (curTest.isFormTest === true) {
+ url += kFormFile + "?" + gCurWinName;
+ gChildWin = window.open(url, undefined);
+ } else {
+ url += kLinkFile + "?firstDocLoaded";
+ gChildWin = window.open(url, gCurWinName);
+ }
+ }
+}
+
+// ## Add a message event listener.
+window.addEventListener("message", function(aEvent) {
+ if (aEvent.source !== gChildWin)
+ return;
+
+// console.log("parent received message:" + JSON.stringify(aEvent.data));
+
+ let proceedToNextTest = false;
+ let curTest = gTests[gCurTest - 1];
+ let state = aEvent.data.state;
+ let winName = aEvent.data.winName;
+ if ("firstDocLoaded" == state) {
+ // Process response from step one of the link-based tests.
+ let step1Passed = (winName === gCurWinName);
+ if (!step1Passed) {
+ ok(step1Passed, "Test #" + gCurTest +
+ " - first document's name matches window.open parameter");
+ proceedToNextTest = true;
+ }
+
+ // Send an "openURL" message to the loaded document.
+ let url2 = (curTest.destURL)
+ ? curTest.destURL + kTestPath + kLinkFile + "?secondDocLoaded"
+ : gDataURL;
+ let noReferrerOnLink = (curTest.noReferrerOnLink === true);
+ let noReferrerInMetaTag = (curTest.noReferrerInMetaTag === true);
+ let resetInUnload = (curTest.resetInUnload === true);
+ aEvent.source.postMessage({ action: "openURL", url: url2,
+ noReferrerOnLink: noReferrerOnLink,
+ noReferrerInMetaTag: noReferrerInMetaTag,
+ resetInUnload: resetInUnload },
+ "*");
+ } else if ("secondDocLoaded" == state) {
+ // Process response from step two of the link-based tests.
+ if (curTest.expectIsolation) {
+ ok(winName === "",
+ "Test #" + gCurTest + " - second document: name was cleared");
+ } else {
+ ok(winName === gCurWinName,
+ "Test #" + gCurTest + " - second document: name was preserved");
+ }
+ proceedToNextTest = true;
+ } else if ("formPostDone" == state) {
+ // Process response from the form post tests.
+ if (curTest.expectIsolation) {
+ ok(winName === "",
+ "Test #" + gCurTest + " - iframe form post: name was cleared");
+ } else {
+ ok(winName === gCurWinName,
+ "Test #" + gCurTest + " - iframe form post: name was preserved");
+ }
+ proceedToNextTest = true;
+
+ }
+
+ if (proceedToNextTest) {
+ gChildWin.close();
+ startNextTest();
+ }
+ }, false);
+
+ SimpleTest.waitForExplicitFinish();
+
+ if (SpecialPowers.getBoolPref("security.nocertdb")) {
+ // Mochitests don't simulate https correctly with "security.nocertdb"
+ // enabled. See https://bugs.torproject.org/18087
+ ok(false, "Please disable the pref `security.nocertdb` before running this test.");
+ SimpleTest.finish();
+ } else {
+
+ // Read file contents, construct a data URL (used by some tests), and
+ // then start the first test.
+ let url = kTestPath + kLinkFile;
+ let xhr = new XMLHttpRequest();
+ xhr.open("GET", url);
+ xhr.onload = function() {
+ gDataURL = "data:text/html;charset=utf-8,"
+ + encodeURIComponent(this.responseText);
+ startNextTest();
+ }
+ xhr.send();
+ }
+</script>
+</body>
+</html>
diff --git a/docshell/test/mochitest/tor_bug16620.html b/docshell/test/mochitest/tor_bug16620.html
new file mode 100644
index 000000000000..26b8e406bbff
--- /dev/null
+++ b/docshell/test/mochitest/tor_bug16620.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+ Tor Bug 16620: Clear window.name when no referrer sent.
+ https://trac.torproject.org/projects/tor/ticket/16620
+-->
+<head>
+ <meta charset="UTF-8">
+ <title>Supporting Doc for Tor Bug 16620 Tests</title>
+</head>
+<body>
+<a id="link" href="">secondDoc</a>
+
+<script>
+// Extract test state from our query string, defaulting to
+// "secondDocLoaded" to support use of this HTML content within
+// a data URI (where query strings are not supported).
+let state = (location.search.length > 0) ? location.search.substr(1)
+ : "secondDocLoaded";
+
+// Notify the test driver.
+opener.postMessage({ state: state, winName: window.name }, "*");
+
+// Add a message event listener to process "openURL" actions.
+window.addEventListener("message", function(aEvent) {
+ if (aEvent.data.action == "openURL") {
+ if (aEvent.data.noReferrerInMetaTag) {
+ let metaElem = document.createElement("meta");
+ metaElem.name = "referrer";
+ metaElem.content = "no-referrer";
+ document.head.appendChild(metaElem);
+ }
+
+ let linkElem = document.getElementById("link");
+ linkElem.href = aEvent.data.url;
+ if (aEvent.data.noReferrerOnLink)
+ linkElem.rel = "noreferrer";
+
+ if (aEvent.data.resetInUnload) {
+ let tmpName = window.name;
+ window.addEventListener("unload", function() {
+ window.name = tmpName;
+ }, false);
+ }
+
+ linkElem.click();
+ }
+}, false);
+</script>
+</body>
+</html>
diff --git a/docshell/test/mochitest/tor_bug16620_form.html b/docshell/test/mochitest/tor_bug16620_form.html
new file mode 100644
index 000000000000..279f62e63fab
--- /dev/null
+++ b/docshell/test/mochitest/tor_bug16620_form.html
@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+<!--
+ Tor Bug 16620: Clear window.name when no referrer sent.
+ https://trac.torproject.org/projects/tor/ticket/16620
+
+ Regression test for bug 18168: iframe-based AJAX call opening in new tab
+-->
+<head>
+ <meta charset="UTF-8">
+ <title>Supporting Form-based Doc for Tor Bug 16620 Tests</title>
+</head>
+<body>
+
+<script>
+document.addEventListener("DOMContentLoaded", function () {
+ addPostTarget();
+}, false);
+
+
+function addPostTarget()
+{
+ let frameName = location.search.substr(1);
+ let form = document.getElementById("postform");
+ let iframe = document.createElement("iframe");
+ iframe.style.border = "1px solid red";
+ iframe.src = "about:blank";
+ form.target = iframe.name = iframe.id = frameName;
+ document.body.appendChild(iframe);
+
+ let didSubmit = false;
+ iframe.onload = function() {
+ if (!didSubmit) {
+ didSubmit = true;
+ let submitButton = document.getElementById("submitButton");
+ submitButton.click();
+ } else {
+ // Form submission complete. Report iframe's name to test driver.
+ opener.postMessage({ state: "formPostDone", winName: iframe.name }, "*");
+ }
+ };
+}
+
+</script>
+<form name="postform" id="postform"
+ action="data:text/plain;charset=utf-8,Hello%20world"
+ method="POST" enctype="multipart/form-data">
+ <input type="hidden" name="field1" value="value1"><br>
+ <input id="submitButton" type="submit" value="Post It">
+</body>
+</html>
diff --git a/modules/libpref/init/StaticPrefList.yaml b/modules/libpref/init/StaticPrefList.yaml
index 57421e34aace..cc155b47b645 100644
--- a/modules/libpref/init/StaticPrefList.yaml
+++ b/modules/libpref/init/StaticPrefList.yaml
@@ -10254,7 +10254,7 @@
- name: privacy.window.name.update.enabled
type: bool
- value: true
+ value: false
mirror: always
# By default, the network state isolation is not active when there is a proxy
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 13252: Do not store data in the app bundle
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 36250c9620f3f5e015b86d1c7912fd314ec29160
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Mar 18 14:20:02 2016 -0400
Bug 13252: Do not store data in the app bundle
When --enable-tor-browser-data-outside-app-dir is enabled,
all user data is stored in a directory named
TorBrowser-Data which is located next to the application directory.
Display an informative error message if the TorBrowser-Data
directory cannot be created due to an "access denied" or a
"read only volume" error.
On Mac OS, add support for the --invisible command line option which
is used by the meek-http-helper to avoid showing an icon for the
helper browser on the dock.
---
toolkit/xre/nsAppRunner.cpp | 73 +++++++++++++++---
toolkit/xre/nsXREDirProvider.cpp | 43 +++++------
toolkit/xre/nsXREDirProvider.h | 6 ++
xpcom/io/TorFileUtils.cpp | 133 +++++++++++++++++++++++++++++++++
xpcom/io/TorFileUtils.h | 32 ++++++++
xpcom/io/moz.build | 5 ++
xpcom/io/nsAppFileLocationProvider.cpp | 53 ++++++-------
7 files changed, 278 insertions(+), 67 deletions(-)
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index f444b6f1e22c..cbd4f2c238e9 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2444,6 +2444,8 @@ static nsresult ProfileMissingDialog(nsINativeAppSupport* aNative) {
}
}
+// If aUnlocker is NULL, it is also OK for the following arguments to be NULL:
+// aProfileDir, aProfileLocalDir, aResult.
static ReturnAbortOnError ProfileErrorDialog(nsIFile* aProfileDir,
nsIFile* aProfileLocalDir,
ProfileStatus aStatus,
@@ -2452,17 +2454,19 @@ static ReturnAbortOnError ProfileErrorDialog(nsIFile* aProfileDir,
nsIProfileLock** aResult) {
nsresult rv;
- bool exists;
- aProfileDir->Exists(&exists);
- if (!exists) {
- return ProfileMissingDialog(aNative);
+ if (aProfileDir) {
+ bool exists;
+ aProfileDir->Exists(&exists);
+ if (!exists) {
+ return ProfileMissingDialog(aNative);
+ }
}
ScopedXPCOMStartup xpcom;
rv = xpcom.Initialize();
NS_ENSURE_SUCCESS(rv, rv);
- mozilla::Telemetry::WriteFailedProfileLock(aProfileDir);
+ if (aProfileDir) mozilla::Telemetry::WriteFailedProfileLock(aProfileDir);
rv = xpcom.SetWindowCreator(aNative);
NS_ENSURE_SUCCESS(rv, NS_ERROR_FAILURE);
@@ -2673,6 +2677,23 @@ static ReturnAbortOnError ShowProfileManager(
return LaunchChild(false, true);
}
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+static ProfileStatus CheckTorBrowserDataWriteAccess(nsIFile* aAppDir) {
+ // Check whether we can write to the directory that will contain
+ // TorBrowser-Data.
+ nsCOMPtr<nsIFile> tbDataDir;
+ RefPtr<nsXREDirProvider> dirProvider = nsXREDirProvider::GetSingleton();
+ if (!dirProvider) return PROFILE_STATUS_OTHER_ERROR;
+ nsresult rv =
+ dirProvider->GetTorBrowserUserDataDir(getter_AddRefs(tbDataDir));
+ NS_ENSURE_SUCCESS(rv, PROFILE_STATUS_OTHER_ERROR);
+ nsCOMPtr<nsIFile> tbDataDirParent;
+ rv = tbDataDir->GetParent(getter_AddRefs(tbDataDirParent));
+ NS_ENSURE_SUCCESS(rv, PROFILE_STATUS_OTHER_ERROR);
+ return nsToolkitProfileService::CheckProfileWriteAccess(tbDataDirParent);
+}
+#endif
+
static bool gDoMigration = false;
static bool gDoProfileReset = false;
static nsCOMPtr<nsIToolkitProfile> gResetOldProfile;
@@ -3716,6 +3737,14 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
if (PR_GetEnv("XRE_MAIN_BREAK")) NS_BREAK();
#endif
+#if defined(XP_MACOSX) && defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+ bool hideDockIcon = (CheckArg("invisible") == ARG_FOUND);
+ if (hideDockIcon) {
+ ProcessSerialNumber psn = {0, kCurrentProcess};
+ TransformProcessType(&psn, kProcessTransformToBackgroundApplication);
+ }
+#endif
+
IncreaseDescriptorLimits();
#ifdef USE_GLX_TEST
@@ -4552,7 +4581,34 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
}
#endif
+#if (defined(MOZ_UPDATER) && !defined(MOZ_WIDGET_ANDROID)) || \
+ defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+ nsCOMPtr<nsIFile> exeFile, exeDir;
+ bool persistent;
+ rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
+ getter_AddRefs(exeFile));
+ NS_ENSURE_SUCCESS(rv, 1);
+ rv = exeFile->GetParent(getter_AddRefs(exeDir));
+ NS_ENSURE_SUCCESS(rv, 1);
+#endif
+
rv = NS_NewToolkitProfileService(getter_AddRefs(mProfileSvc));
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ if (NS_FAILED(rv)) {
+ // NS_NewToolkitProfileService() returns a generic NS_ERROR_FAILURE error
+ // if creation of the TorBrowser-Data directory fails due to access denied
+ // or because of a read-only disk volume. Do an extra check here to detect
+ // these errors so we can display an informative error message.
+ ProfileStatus status = CheckTorBrowserDataWriteAccess(exeDir);
+ if ((PROFILE_STATUS_ACCESS_DENIED == status) ||
+ (PROFILE_STATUS_READ_ONLY == status)) {
+ ProfileErrorDialog(nullptr, nullptr, status, nullptr, mNativeApp,
+ nullptr);
+ return 1;
+ }
+ }
+#endif
+
if (rv == NS_ERROR_FILE_ACCESS_DENIED) {
PR_fprintf(PR_STDERR,
"Error: Access was denied while trying to open files in "
@@ -4622,7 +4678,6 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
if (ShouldProcessUpdates(mDirProvider)) {
// Check for and process any available updates
nsCOMPtr<nsIFile> updRoot;
- bool persistent;
rv = mDirProvider.GetFile(XRE_UPDATE_ROOT_DIR, &persistent,
getter_AddRefs(updRoot));
// XRE_UPDATE_ROOT_DIR may fail. Fallback to appDir if failed
@@ -4658,12 +4713,6 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
if (CheckArg("test-process-updates")) {
SaveToEnv("MOZ_TEST_PROCESS_UPDATES=1");
}
- nsCOMPtr<nsIFile> exeFile, exeDir;
- rv = mDirProvider.GetFile(XRE_EXECUTABLE_FILE, &persistent,
- getter_AddRefs(exeFile));
- NS_ENSURE_SUCCESS(rv, 1);
- rv = exeFile->GetParent(getter_AddRefs(exeDir));
- NS_ENSURE_SUCCESS(rv, 1);
ProcessUpdates(mDirProvider.GetGREDir(), exeDir, updRoot, gRestartArgc,
gRestartArgv, mAppData->version);
if (EnvHasValue("MOZ_TEST_PROCESS_UPDATES")) {
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index fc5b9bc3b25d..a29e909a0bd9 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -57,6 +57,8 @@
# include "nsIPK11Token.h"
#endif
+#include "TorFileUtils.h"
+
#include <stdlib.h>
#ifdef XP_WIN
@@ -1389,34 +1391,18 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
return gDataDirHome->Clone(aFile);
}
- nsresult rv = GetAppDir()->Clone(getter_AddRefs(localDir));
+ nsresult rv = GetTorBrowserUserDataDir(getter_AddRefs(localDir));
NS_ENSURE_SUCCESS(rv, rv);
- int levelsToRemove = 1; // In FF21+, appDir points to browser subdirectory.
-#if defined(XP_MACOSX)
- levelsToRemove += 2;
-#endif
- while (localDir && (levelsToRemove > 0)) {
- // When crawling up the hierarchy, components named "." do not count.
- nsAutoCString removedName;
- rv = localDir->GetNativeLeafName(removedName);
- NS_ENSURE_SUCCESS(rv, rv);
- bool didRemove = !removedName.Equals(".");
-
- // Remove a directory component.
- nsCOMPtr<nsIFile> parentDir;
- rv = localDir->GetParent(getter_AddRefs(parentDir));
- NS_ENSURE_SUCCESS(rv, rv);
- localDir = parentDir;
- if (didRemove) --levelsToRemove;
- }
-
- if (!localDir) return NS_ERROR_FAILURE;
-
- rv = localDir->AppendRelativeNativePath("TorBrowser" XPCOM_FILE_PATH_SEPARATOR
- "Data" XPCOM_FILE_PATH_SEPARATOR
+#if !defined(ANDROID)
+# ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ rv = localDir->AppendNative("Browser"_ns);
+# else
+ rv = localDir->AppendRelativeNativePath("Data" XPCOM_FILE_PATH_SEPARATOR
"Browser"_ns);
+# endif
NS_ENSURE_SUCCESS(rv, rv);
+#endif
if (aLocal) {
rv = localDir->AppendNative("Caches"_ns);
@@ -1522,6 +1508,15 @@ nsresult nsXREDirProvider::GetUserDataDirectory(nsIFile** aFile, bool aLocal) {
return NS_OK;
}
+nsresult nsXREDirProvider::GetTorBrowserUserDataDir(nsIFile** aFile) {
+ NS_ENSURE_ARG_POINTER(aFile);
+ nsCOMPtr<nsIFile> exeFile;
+ bool per = false;
+ nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(exeFile));
+ NS_ENSURE_SUCCESS(rv, rv);
+ return TorBrowser_GetUserDataDir(exeFile, aFile);
+}
+
nsresult nsXREDirProvider::EnsureDirectoryExists(nsIFile* aDirectory) {
nsresult rv = aDirectory->Create(nsIFile::DIRECTORY_TYPE, 0700);
diff --git a/toolkit/xre/nsXREDirProvider.h b/toolkit/xre/nsXREDirProvider.h
index acea2e689821..98ef4ad770ea 100644
--- a/toolkit/xre/nsXREDirProvider.h
+++ b/toolkit/xre/nsXREDirProvider.h
@@ -113,6 +113,12 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
*/
nsresult GetProfileDir(nsIFile** aResult);
+ /**
+ * Get the TorBrowser user data directory by calling the
+ * TorBrowser_GetUserDataDir() utility function.
+ */
+ nsresult GetTorBrowserUserDataDir(nsIFile** aFile);
+
protected:
nsresult GetFilesInternal(const char* aProperty,
nsISimpleEnumerator** aResult);
diff --git a/xpcom/io/TorFileUtils.cpp b/xpcom/io/TorFileUtils.cpp
new file mode 100644
index 000000000000..6bd03f1f7fed
--- /dev/null
+++ b/xpcom/io/TorFileUtils.cpp
@@ -0,0 +1,133 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#include "TorFileUtils.h"
+#include "nsString.h"
+#ifdef MOZ_WIDGET_COCOA
+# include <Carbon/Carbon.h>
+# include "nsILocalFileMac.h"
+#endif
+
+static nsresult GetAppRootDir(nsIFile* aExeFile, nsIFile** aFile);
+
+//-----------------------------------------------------------------------------
+nsresult TorBrowser_GetUserDataDir(nsIFile* aExeFile, nsIFile** aFile) {
+ NS_ENSURE_ARG_POINTER(aFile);
+ nsCOMPtr<nsIFile> tbDataDir;
+
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ nsAutoCString tbDataLeafName("TorBrowser-Data"_ns);
+ nsCOMPtr<nsIFile> appRootDir;
+ nsresult rv = GetAppRootDir(aExeFile, getter_AddRefs(appRootDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+# ifndef XP_MACOSX
+ // On all platforms except Mac OS, we always operate in a "portable" mode
+ // where the TorBrowser-Data directory is located next to the application.
+ rv = appRootDir->GetParent(getter_AddRefs(tbDataDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = tbDataDir->AppendNative(tbDataLeafName);
+ NS_ENSURE_SUCCESS(rv, rv);
+# else
+ // For Mac OS, determine whether we should store user data in the OS's
+ // standard location (i.e., under ~/Library/Application Support). We use
+ // the OS location if (1) the application is installed in a directory whose
+ // path contains "/Applications" or (2) the TorBrowser-Data directory does
+ // not exist and cannot be created (which probably means we lack write
+ // permission to the directory that contains the application).
+ nsAutoString appRootPath;
+ rv = appRootDir->GetPath(appRootPath);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool useOSLocation =
+ (appRootPath.Find("/Applications", true /* ignore case */) >= 0);
+ if (!useOSLocation) {
+ // We hope to use the portable (aka side-by-side) approach, but before we
+ // commit to that, let's ensure that we can create the TorBrowser-Data
+ // directory. If it already exists, we will try to use it; if not and we
+ // fail to create it, we will switch to ~/Library/Application Support.
+ rv = appRootDir->GetParent(getter_AddRefs(tbDataDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = tbDataDir->AppendNative(tbDataLeafName);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool exists = false;
+ rv = tbDataDir->Exists(&exists);
+ if (NS_SUCCEEDED(rv) && !exists)
+ rv = tbDataDir->Create(nsIFile::DIRECTORY_TYPE, 0700);
+ useOSLocation = NS_FAILED(rv);
+ }
+
+ if (useOSLocation) {
+ // We are using ~/Library/Application Support/TorBrowser-Data. We do not
+ // need to create that directory here because the code in nsXREDirProvider
+ // will do so (and the user should always have write permission for
+ // ~/Library/Application Support; if they do not we have no more options).
+ FSRef fsRef;
+ OSErr err = ::FSFindFolder(kUserDomain, kApplicationSupportFolderType,
+ kCreateFolder, &fsRef);
+ NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
+ // To convert the FSRef returned by FSFindFolder() into an nsIFile that
+ // points to ~/Library/Application Support, we first create an empty
+ // nsIFile object (no path) and then use InitWithFSRef() to set the
+ // path.
+ rv = NS_NewNativeLocalFile(""_ns, true, getter_AddRefs(tbDataDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<nsILocalFileMac> dirFileMac = do_QueryInterface(tbDataDir);
+ if (!dirFileMac) return NS_ERROR_UNEXPECTED;
+ rv = dirFileMac->InitWithFSRef(&fsRef);
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = tbDataDir->AppendNative(tbDataLeafName);
+ NS_ENSURE_SUCCESS(rv, rv);
+ }
+# endif
+
+#elif defined(ANDROID)
+ // Tor Browser Android stores data in the app home directory.
+ const char* homeDir = getenv("HOME");
+ if (!homeDir || !*homeDir) return NS_ERROR_FAILURE;
+ nsresult rv = NS_NewNativeLocalFile(nsDependentCString(homeDir), true,
+ getter_AddRefs(tbDataDir));
+#else
+ // User data is embedded within the application directory (i.e.,
+ // TOR_BROWSER_DATA_OUTSIDE_APP_DIR is not defined).
+ nsresult rv = GetAppRootDir(aExeFile, getter_AddRefs(tbDataDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = tbDataDir->AppendNative("TorBrowser"_ns);
+ NS_ENSURE_SUCCESS(rv, rv);
+#endif
+
+ tbDataDir.forget(aFile);
+ return NS_OK;
+}
+
+static nsresult GetAppRootDir(nsIFile* aExeFile, nsIFile** aFile) {
+ NS_ENSURE_ARG_POINTER(aExeFile);
+ NS_ENSURE_ARG_POINTER(aFile);
+ nsCOMPtr<nsIFile> appRootDir = aExeFile;
+
+ int levelsToRemove = 1; // Remove firefox (the executable file).
+#if defined(XP_MACOSX)
+ levelsToRemove += 2; // On Mac OS, we must also remove Contents/MacOS.
+#endif
+ while (appRootDir && (levelsToRemove > 0)) {
+ // When crawling up the hierarchy, components named "." do not count.
+ nsAutoCString removedName;
+ nsresult rv = appRootDir->GetNativeLeafName(removedName);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool didRemove = !removedName.Equals(".");
+
+ // Remove a directory component.
+ nsCOMPtr<nsIFile> parentDir;
+ rv = appRootDir->GetParent(getter_AddRefs(parentDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ appRootDir = parentDir;
+
+ if (didRemove) --levelsToRemove;
+ }
+
+ if (!appRootDir) return NS_ERROR_FAILURE;
+
+ appRootDir.forget(aFile);
+ return NS_OK;
+}
diff --git a/xpcom/io/TorFileUtils.h b/xpcom/io/TorFileUtils.h
new file mode 100644
index 000000000000..31e70a7e0d3a
--- /dev/null
+++ b/xpcom/io/TorFileUtils.h
@@ -0,0 +1,32 @@
+/* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/* vim: set ts=8 sts=2 et sw=2 tw=80: */
+/* This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
+
+#ifndef TorFileUtils_h__
+#define TorFileUtils_h__
+
+#include "nsIFile.h"
+
+/**
+ * TorBrowser_GetUserDataDir
+ *
+ * Retrieve the Tor Browser user data directory.
+ * When built with --enable-tor-browser-data-outside-app-dir, the directory
+ * is next to the application directory, except on Mac OS where it may be
+ * there or it may be at ~/Library/Application Support/TorBrowser-Data (the
+ * latter location is used if the .app bundle is in a directory whose path
+ * contains /Applications or if we lack write access to the directory that
+ * contains the .app).
+ * When built without --enable-tor-browser-data-outside-app-dir, this
+ * directory is TorBrowser.app/TorBrowser.
+ *
+ * @param aExeFile The firefox executable.
+ * @param aFile Out parameter that is set to the Tor Browser user data
+ * directory.
+ * @return NS_OK on success. Error otherwise.
+ */
+extern nsresult TorBrowser_GetUserDataDir(nsIFile* aExeFile, nsIFile** aFile);
+
+#endif // !TorFileUtils_h__
diff --git a/xpcom/io/moz.build b/xpcom/io/moz.build
index d28c426e7bd7..af7b5be04f6e 100644
--- a/xpcom/io/moz.build
+++ b/xpcom/io/moz.build
@@ -86,6 +86,7 @@ EXPORTS += [
"nsUnicharInputStream.h",
"nsWildCard.h",
"SpecialSystemDirectory.h",
+ "TorFileUtils.h",
]
EXPORTS.mozilla += [
@@ -137,6 +138,10 @@ UNIFIED_SOURCES += [
"SpecialSystemDirectory.cpp",
]
+SOURCES += [
+ "TorFileUtils.cpp",
+]
+
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
SOURCES += [
"CocoaFileUtils.mm",
diff --git a/xpcom/io/nsAppFileLocationProvider.cpp b/xpcom/io/nsAppFileLocationProvider.cpp
index 2bbcee92aedb..66f6940beff6 100644
--- a/xpcom/io/nsAppFileLocationProvider.cpp
+++ b/xpcom/io/nsAppFileLocationProvider.cpp
@@ -28,6 +28,8 @@
# include <sys/param.h>
#endif
+#include "TorFileUtils.h"
+
// WARNING: These hard coded names need to go away. They need to
// come from localizable resources
@@ -234,8 +236,14 @@ nsresult nsAppFileLocationProvider::CloneMozBinDirectory(nsIFile** aLocalFile) {
// GetProductDirectory - Gets the directory which contains the application data
// folder
//
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+// UNIX and WIN : <App Folder>/../TorBrowser-Data/Browser
+// Mac : <App Folder>/../../../TorBrowser-Data/Browser OR
+// ~/Library/Application Support/TorBrowser-Data/Browser
+#else
// UNIX and WIN : <App Folder>/TorBrowser/Data/Browser
// Mac : <App Folder>/../../TorBrowser/Data/Browser
+#endif
//----------------------------------------------------------------------------------------
nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
bool aLocal) {
@@ -243,42 +251,25 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
return NS_ERROR_INVALID_ARG;
}
- nsresult rv;
+ nsresult rv = NS_ERROR_UNEXPECTED;
bool exists;
- nsCOMPtr<nsIFile> localDir;
+ nsCOMPtr<nsIFile> localDir, exeFile;
- rv = CloneMozBinDirectory(getter_AddRefs(localDir));
+ nsCOMPtr<nsIProperties> directoryService(
+ do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = directoryService->Get(XRE_EXECUTABLE_FILE, NS_GET_IID(nsIFile),
+ getter_AddRefs(exeFile));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = TorBrowser_GetUserDataDir(exeFile, getter_AddRefs(localDir));
NS_ENSURE_SUCCESS(rv, rv);
- int levelsToRemove = 1; // In FF21+, bin dir points to browser subdirectory.
-#if defined(XP_MACOSX)
- levelsToRemove += 2;
-#endif
- while (localDir && (levelsToRemove > 0)) {
- // When crawling up the hierarchy, components named "." do not count.
- nsAutoCString removedName;
- rv = localDir->GetNativeLeafName(removedName);
- NS_ENSURE_SUCCESS(rv, rv);
- bool didRemove = !removedName.Equals(".");
-
- // Remove a directory component.
- nsCOMPtr<nsIFile> parentDir;
- rv = localDir->GetParent(getter_AddRefs(parentDir));
- NS_ENSURE_SUCCESS(rv, rv);
- localDir = parentDir;
-
- if (didRemove) {
- --levelsToRemove;
- }
- }
-
- if (!localDir) {
- return NS_ERROR_FAILURE;
- }
-
- rv = localDir->AppendRelativeNativePath("TorBrowser" XPCOM_FILE_PATH_SEPARATOR
- "Data" XPCOM_FILE_PATH_SEPARATOR
+#ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ rv = localDir->AppendNative("Browser"_ns);
+#else
+ rv = localDir->AppendRelativeNativePath("Data" XPCOM_FILE_PATH_SEPARATOR
"Browser"_ns);
+#endif
NS_ENSURE_SUCCESS(rv, rv);
if (aLocal) {
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 9173: Change the default Firefox profile directory to be TBB-relative.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit b8ec76f3d7e7ef283992492f2f64cd2c3795d539
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Oct 18 15:20:06 2013 -0400
Bug 9173: Change the default Firefox profile directory to be TBB-relative.
This should eliminate our need to rely on a wrapper script that
sets /Users/arthur and launches Firefox with -profile.
---
toolkit/profile/nsToolkitProfileService.cpp | 5 +-
toolkit/xre/nsAppRunner.cpp | 2 +-
toolkit/xre/nsConsoleWriter.cpp | 2 +-
toolkit/xre/nsXREDirProvider.cpp | 149 ++++++----------------------
toolkit/xre/nsXREDirProvider.h | 16 +--
xpcom/io/nsAppFileLocationProvider.cpp | 97 +++++++-----------
6 files changed, 84 insertions(+), 187 deletions(-)
diff --git a/toolkit/profile/nsToolkitProfileService.cpp b/toolkit/profile/nsToolkitProfileService.cpp
index c6f0fd536132..8f8851446c0f 100644
--- a/toolkit/profile/nsToolkitProfileService.cpp
+++ b/toolkit/profile/nsToolkitProfileService.cpp
@@ -723,10 +723,11 @@ nsresult nsToolkitProfileService::Init() {
NS_ASSERTION(gDirServiceProvider, "No dirserviceprovider!");
nsresult rv;
- rv = nsXREDirProvider::GetUserAppDataDirectory(getter_AddRefs(mAppData));
+ rv = gDirServiceProvider->GetUserAppDataDirectory(getter_AddRefs(mAppData));
NS_ENSURE_SUCCESS(rv, rv);
- rv = nsXREDirProvider::GetUserLocalDataDirectory(getter_AddRefs(mTempData));
+ rv =
+ gDirServiceProvider->GetUserLocalDataDirectory(getter_AddRefs(mTempData));
NS_ENSURE_SUCCESS(rv, rv);
rv = mAppData->Clone(getter_AddRefs(mProfileDBFile));
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 3ec33c9b4541..49b79fa9a1ab 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -3720,7 +3720,7 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
if ((mAppData->flags & NS_XRE_ENABLE_CRASH_REPORTER) &&
NS_SUCCEEDED(CrashReporter::SetExceptionHandler(xreBinDirectory))) {
nsCOMPtr<nsIFile> file;
- rv = nsXREDirProvider::GetUserAppDataDirectory(getter_AddRefs(file));
+ rv = mDirProvider.GetUserAppDataDirectory(getter_AddRefs(file));
if (NS_SUCCEEDED(rv)) {
CrashReporter::SetUserAppDataDirectory(file);
}
diff --git a/toolkit/xre/nsConsoleWriter.cpp b/toolkit/xre/nsConsoleWriter.cpp
index d89ea3bde31d..4a9a6d28034a 100644
--- a/toolkit/xre/nsConsoleWriter.cpp
+++ b/toolkit/xre/nsConsoleWriter.cpp
@@ -29,7 +29,7 @@ void WriteConsoleLog() {
} else {
if (!gLogConsoleErrors) return;
- rv = nsXREDirProvider::GetUserAppDataDirectory(getter_AddRefs(lfile));
+ rv = gDirServiceProvider->GetUserAppDataDirectory(getter_AddRefs(lfile));
if (NS_FAILED(rv)) return;
lfile->AppendNative("console.log"_ns);
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index 753c4df3422a..fc5b9bc3b25d 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -32,6 +32,7 @@
#include "nsArrayEnumerator.h"
#include "nsEnumeratorUtils.h"
#include "nsReadableUtils.h"
+#include "nsXPCOMPrivate.h" // for XPCOM_FILE_PATH_SEPARATOR
#include "SpecialSystemDirectory.h"
@@ -255,9 +256,6 @@ nsresult nsXREDirProvider::GetUserProfilesRootDir(nsIFile** aResult) {
nsresult rv = GetUserDataDirectory(getter_AddRefs(file), false);
if (NS_SUCCEEDED(rv)) {
-#if !defined(XP_UNIX) || defined(XP_MACOSX)
- rv = file->AppendNative("Profiles"_ns);
-#endif
// We must create the profile directory here if it does not exist.
nsresult tmp = EnsureDirectoryExists(file);
if (NS_FAILED(tmp)) {
@@ -273,9 +271,6 @@ nsresult nsXREDirProvider::GetUserProfilesLocalDir(nsIFile** aResult) {
nsresult rv = GetUserDataDirectory(getter_AddRefs(file), true);
if (NS_SUCCEEDED(rv)) {
-#if !defined(XP_UNIX) || defined(XP_MACOSX)
- rv = file->AppendNative("Profiles"_ns);
-#endif
// We must create the profile directory here if it does not exist.
nsresult tmp = EnsureDirectoryExists(file);
if (NS_FAILED(tmp)) {
@@ -1384,7 +1379,7 @@ nsresult nsXREDirProvider::SetUserDataProfileDirectory(nsCOMPtr<nsIFile>& aFile,
nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
bool aLocal) {
// Copied from nsAppFileLocationProvider (more or less)
- nsresult rv;
+ NS_ENSURE_ARG_POINTER(aFile);
nsCOMPtr<nsIFile> localDir;
if (aLocal && gDataDirHomeLocal) {
@@ -1394,80 +1389,39 @@ nsresult nsXREDirProvider::GetUserDataDirectoryHome(nsIFile** aFile,
return gDataDirHome->Clone(aFile);
}
-#if defined(XP_MACOSX)
- FSRef fsRef;
- OSType folderType;
- if (aLocal) {
- folderType = kCachedDataFolderType;
- } else {
-# ifdef MOZ_THUNDERBIRD
- folderType = kDomainLibraryFolderType;
-# else
- folderType = kApplicationSupportFolderType;
-# endif
- }
- OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
- NS_ENSURE_FALSE(err, NS_ERROR_FAILURE);
-
- rv = NS_NewNativeLocalFile(""_ns, true, getter_AddRefs(localDir));
+ nsresult rv = GetAppDir()->Clone(getter_AddRefs(localDir));
NS_ENSURE_SUCCESS(rv, rv);
- nsCOMPtr<nsILocalFileMac> dirFileMac = do_QueryInterface(localDir);
- NS_ENSURE_TRUE(dirFileMac, NS_ERROR_UNEXPECTED);
-
- rv = dirFileMac->InitWithFSRef(&fsRef);
- NS_ENSURE_SUCCESS(rv, rv);
+ int levelsToRemove = 1; // In FF21+, appDir points to browser subdirectory.
+#if defined(XP_MACOSX)
+ levelsToRemove += 2;
+#endif
+ while (localDir && (levelsToRemove > 0)) {
+ // When crawling up the hierarchy, components named "." do not count.
+ nsAutoCString removedName;
+ rv = localDir->GetNativeLeafName(removedName);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool didRemove = !removedName.Equals(".");
- localDir = dirFileMac;
-#elif defined(XP_IOS)
- nsAutoCString userDir;
- if (GetUIKitDirectory(aLocal, userDir)) {
- rv = NS_NewNativeLocalFile(userDir, true, getter_AddRefs(localDir));
- } else {
- rv = NS_ERROR_FAILURE;
- }
- NS_ENSURE_SUCCESS(rv, rv);
-#elif defined(XP_WIN)
- nsString path;
- if (aLocal) {
- rv = GetShellFolderPath(FOLDERID_LocalAppData, path);
- if (NS_FAILED(rv)) rv = GetRegWindowsAppDataFolder(aLocal, path);
- }
- if (!aLocal || NS_FAILED(rv)) {
- rv = GetShellFolderPath(FOLDERID_RoamingAppData, path);
- if (NS_FAILED(rv)) {
- if (!aLocal) rv = GetRegWindowsAppDataFolder(aLocal, path);
- }
+ // Remove a directory component.
+ nsCOMPtr<nsIFile> parentDir;
+ rv = localDir->GetParent(getter_AddRefs(parentDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ localDir = parentDir;
+ if (didRemove) --levelsToRemove;
}
- NS_ENSURE_SUCCESS(rv, rv);
- rv = NS_NewLocalFile(path, true, getter_AddRefs(localDir));
-#elif defined(XP_UNIX)
- const char* homeDir = getenv("HOME");
- if (!homeDir || !*homeDir) return NS_ERROR_FAILURE;
+ if (!localDir) return NS_ERROR_FAILURE;
-# ifdef ANDROID /* We want (ProfD == ProfLD) on Android. */
- aLocal = false;
-# endif
+ rv = localDir->AppendRelativeNativePath("TorBrowser" XPCOM_FILE_PATH_SEPARATOR
+ "Data" XPCOM_FILE_PATH_SEPARATOR
+ "Browser"_ns);
+ NS_ENSURE_SUCCESS(rv, rv);
if (aLocal) {
- // If $XDG_CACHE_HOME is defined use it, otherwise use $HOME/.cache.
- const char* cacheHome = getenv("XDG_CACHE_HOME");
- if (cacheHome && *cacheHome) {
- rv = NS_NewNativeLocalFile(nsDependentCString(cacheHome), true,
- getter_AddRefs(localDir));
- } else {
- rv = NS_NewNativeLocalFile(nsDependentCString(homeDir), true,
- getter_AddRefs(localDir));
- if (NS_SUCCEEDED(rv)) rv = localDir->AppendNative(".cache"_ns);
- }
- } else {
- rv = NS_NewNativeLocalFile(nsDependentCString(homeDir), true,
- getter_AddRefs(localDir));
+ rv = localDir->AppendNative("Caches"_ns);
+ NS_ENSURE_SUCCESS(rv, rv);
}
-#else
-# error "Don't know how to get product dir on your platform"
-#endif
NS_IF_ADDREF(*aFile = localDir);
return rv;
@@ -1650,39 +1604,23 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
}
nsAutoCString profile;
- nsAutoCString appName;
- nsAutoCString vendor;
if (gAppData->profile) {
profile = gAppData->profile;
- } else {
- appName = gAppData->name;
- vendor = gAppData->vendor;
}
- nsresult rv = NS_OK;
+ nsresult rv = NS_ERROR_FAILURE;
#if defined(XP_MACOSX)
if (!profile.IsEmpty()) {
rv = AppendProfileString(aFile, profile.get());
- } else {
- // Note that MacOS ignores the vendor when creating the profile hierarchy -
- // all application preferences directories live alongside one another in
- // ~/Library/Application Support/
- rv = aFile->AppendNative(appName);
+ NS_ENSURE_SUCCESS(rv, rv);
}
- NS_ENSURE_SUCCESS(rv, rv);
#elif defined(XP_WIN)
if (!profile.IsEmpty()) {
rv = AppendProfileString(aFile, profile.get());
- } else {
- if (!vendor.IsEmpty()) {
- rv = aFile->AppendNative(vendor);
- NS_ENSURE_SUCCESS(rv, rv);
- }
- rv = aFile->AppendNative(appName);
+ NS_ENSURE_SUCCESS(rv, rv);
}
- NS_ENSURE_SUCCESS(rv, rv);
#elif defined(ANDROID)
// The directory used for storing profiles
@@ -1692,11 +1630,6 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
rv = aFile->AppendNative(nsDependentCString("mozilla"));
NS_ENSURE_SUCCESS(rv, rv);
#elif defined(XP_UNIX)
- nsAutoCString folder;
- // Make it hidden (by starting with "."), except when local (the
- // profile is already under ~/.cache or XDG_CACHE_HOME).
- if (!aLocal) folder.Assign('.');
-
if (!profile.IsEmpty()) {
// Skip any leading path characters
const char* profileStart = profile.get();
@@ -1704,32 +1637,16 @@ nsresult nsXREDirProvider::AppendProfilePath(nsIFile* aFile, bool aLocal) {
// On the off chance that someone wanted their folder to be hidden don't
// let it become ".."
- if (*profileStart == '.' && !aLocal) profileStart++;
+ if (*profileStart == '.') profileStart++;
+ // Make it hidden (by starting with ".").
+ nsAutoCString folder(".");
folder.Append(profileStart);
ToLowerCase(folder);
rv = AppendProfileString(aFile, folder.BeginReading());
- } else {
- if (!vendor.IsEmpty()) {
- folder.Append(vendor);
- ToLowerCase(folder);
-
- rv = aFile->AppendNative(folder);
- NS_ENSURE_SUCCESS(rv, rv);
-
- folder.Truncate();
- }
-
- // This can be the case in tests.
- if (!appName.IsEmpty()) {
- folder.Append(appName);
- ToLowerCase(folder);
-
- rv = aFile->AppendNative(folder);
- }
+ NS_ENSURE_SUCCESS(rv, rv);
}
- NS_ENSURE_SUCCESS(rv, rv);
#else
# error "Don't know how to get profile path on your platform"
diff --git a/toolkit/xre/nsXREDirProvider.h b/toolkit/xre/nsXREDirProvider.h
index e28a4fef5bc6..acea2e689821 100644
--- a/toolkit/xre/nsXREDirProvider.h
+++ b/toolkit/xre/nsXREDirProvider.h
@@ -63,15 +63,19 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
void DoShutdown();
- static nsresult GetUserAppDataDirectory(nsIFile** aFile) {
+ nsresult GetUserAppDataDirectory(nsIFile** aFile) {
return GetUserDataDirectory(aFile, false);
}
- static nsresult GetUserLocalDataDirectory(nsIFile** aFile) {
+ nsresult GetUserLocalDataDirectory(nsIFile** aFile) {
return GetUserDataDirectory(aFile, true);
}
// GetUserDataDirectory gets the profile path from gAppData.
- static nsresult GetUserDataDirectory(nsIFile** aFile, bool aLocal);
+
+ // This function now calls GetAppDir(), so it cannot be static anymore.
+ // The same happens with all the functions (in)directly calling this one (the
+ // rest of Get*Directory functions in this file)
+ nsresult GetUserDataDirectory(nsIFile** aFile, bool aLocal);
/* make sure you clone it, if you need to do stuff to it */
nsIFile* GetGREDir() { return mGREDir; }
@@ -112,9 +116,9 @@ class nsXREDirProvider final : public nsIDirectoryServiceProvider2,
protected:
nsresult GetFilesInternal(const char* aProperty,
nsISimpleEnumerator** aResult);
- static nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal);
- static nsresult GetSysUserExtensionsDirectory(nsIFile** aFile);
- static nsresult GetSysUserExtensionsDevDirectory(nsIFile** aFile);
+ nsresult GetUserDataDirectoryHome(nsIFile** aFile, bool aLocal);
+ nsresult GetSysUserExtensionsDirectory(nsIFile** aFile);
+ nsresult GetSysUserExtensionsDevDirectory(nsIFile** aFile);
#if defined(XP_UNIX) || defined(XP_MACOSX)
static nsresult GetSystemExtensionsDirectory(nsIFile** aFile);
#endif
diff --git a/xpcom/io/nsAppFileLocationProvider.cpp b/xpcom/io/nsAppFileLocationProvider.cpp
index ef974f99048f..2bbcee92aedb 100644
--- a/xpcom/io/nsAppFileLocationProvider.cpp
+++ b/xpcom/io/nsAppFileLocationProvider.cpp
@@ -15,6 +15,7 @@
#include "nsSimpleEnumerator.h"
#include "prenv.h"
#include "nsCRT.h"
+#include "nsXPCOMPrivate.h" // for XPCOM_FILE_PATH_SEPARATOR
#if defined(MOZ_WIDGET_COCOA)
# include <Carbon/Carbon.h>
# include "nsILocalFileMac.h"
@@ -233,9 +234,8 @@ nsresult nsAppFileLocationProvider::CloneMozBinDirectory(nsIFile** aLocalFile) {
// GetProductDirectory - Gets the directory which contains the application data
// folder
//
-// UNIX : ~/.mozilla/
-// WIN : <Application Data folder on user's machine>\Mozilla
-// Mac : :Documents:Mozilla:
+// UNIX and WIN : <App Folder>/TorBrowser/Data/Browser
+// Mac : <App Folder>/../../TorBrowser/Data/Browser
//----------------------------------------------------------------------------------------
nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
bool aLocal) {
@@ -247,49 +247,45 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
bool exists;
nsCOMPtr<nsIFile> localDir;
-#if defined(MOZ_WIDGET_COCOA)
- FSRef fsRef;
- OSType folderType =
- aLocal ? (OSType)kCachedDataFolderType : (OSType)kDomainLibraryFolderType;
- OSErr err = ::FSFindFolder(kUserDomain, folderType, kCreateFolder, &fsRef);
- if (err) {
- return NS_ERROR_FAILURE;
+ rv = CloneMozBinDirectory(getter_AddRefs(localDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ int levelsToRemove = 1; // In FF21+, bin dir points to browser subdirectory.
+#if defined(XP_MACOSX)
+ levelsToRemove += 2;
+#endif
+ while (localDir && (levelsToRemove > 0)) {
+ // When crawling up the hierarchy, components named "." do not count.
+ nsAutoCString removedName;
+ rv = localDir->GetNativeLeafName(removedName);
+ NS_ENSURE_SUCCESS(rv, rv);
+ bool didRemove = !removedName.Equals(".");
+
+ // Remove a directory component.
+ nsCOMPtr<nsIFile> parentDir;
+ rv = localDir->GetParent(getter_AddRefs(parentDir));
+ NS_ENSURE_SUCCESS(rv, rv);
+ localDir = parentDir;
+
+ if (didRemove) {
+ --levelsToRemove;
+ }
}
- NS_NewLocalFile(u""_ns, true, getter_AddRefs(localDir));
+
if (!localDir) {
return NS_ERROR_FAILURE;
}
- nsCOMPtr<nsILocalFileMac> localDirMac(do_QueryInterface(localDir));
- rv = localDirMac->InitWithFSRef(&fsRef);
- if (NS_FAILED(rv)) {
- return rv;
- }
-#elif defined(XP_WIN)
- nsCOMPtr<nsIProperties> directoryService =
- do_GetService(NS_DIRECTORY_SERVICE_CONTRACTID, &rv);
- if (NS_FAILED(rv)) {
- return rv;
- }
- const char* prop = aLocal ? NS_WIN_LOCAL_APPDATA_DIR : NS_WIN_APPDATA_DIR;
- rv = directoryService->Get(prop, NS_GET_IID(nsIFile),
- getter_AddRefs(localDir));
- if (NS_FAILED(rv)) {
- return rv;
- }
-#elif defined(XP_UNIX)
- rv = NS_NewNativeLocalFile(nsDependentCString(PR_GetEnv("HOME")), true,
- getter_AddRefs(localDir));
- if (NS_FAILED(rv)) {
- return rv;
- }
-#else
-# error dont_know_how_to_get_product_dir_on_your_platform
-#endif
- rv = localDir->AppendRelativeNativePath(DEFAULT_PRODUCT_DIR);
- if (NS_FAILED(rv)) {
- return rv;
+ rv = localDir->AppendRelativeNativePath("TorBrowser" XPCOM_FILE_PATH_SEPARATOR
+ "Data" XPCOM_FILE_PATH_SEPARATOR
+ "Browser"_ns);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ if (aLocal) {
+ rv = localDir->AppendNative("Caches"_ns);
+ NS_ENSURE_SUCCESS(rv, rv);
}
+
rv = localDir->Exists(&exists);
if (NS_SUCCEEDED(rv) && !exists) {
@@ -308,10 +304,6 @@ nsresult nsAppFileLocationProvider::GetProductDirectory(nsIFile** aLocalFile,
//----------------------------------------------------------------------------------------
// GetDefaultUserProfileRoot - Gets the directory which contains each user
// profile dir
-//
-// UNIX : ~/.mozilla/
-// WIN : <Application Data folder on user's machine>\Mozilla\Profiles
-// Mac : :Documents:Mozilla:Profiles:
//----------------------------------------------------------------------------------------
nsresult nsAppFileLocationProvider::GetDefaultUserProfileRoot(
nsIFile** aLocalFile, bool aLocal) {
@@ -327,23 +319,6 @@ nsresult nsAppFileLocationProvider::GetDefaultUserProfileRoot(
return rv;
}
-#if defined(MOZ_WIDGET_COCOA) || defined(XP_WIN)
- // These 3 platforms share this part of the path - do them as one
- rv = localDir->AppendRelativeNativePath("Profiles"_ns);
- if (NS_FAILED(rv)) {
- return rv;
- }
-
- bool exists;
- rv = localDir->Exists(&exists);
- if (NS_SUCCEEDED(rv) && !exists) {
- rv = localDir->Create(nsIFile::DIRECTORY_TYPE, 0775);
- }
- if (NS_FAILED(rv)) {
- return rv;
- }
-#endif
-
localDir.forget(aLocalFile);
return rv;
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 18800: Remove localhost DNS lookup in nsProfileLock.cpp
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 03340f79a356cd76d9829f1c199204a1ec02ca87
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Apr 21 10:40:26 2016 -0400
Bug 18800: Remove localhost DNS lookup in nsProfileLock.cpp
Instead of using the local computer's IP address within
symlink-based profile lock signatures, always use 127.0.0.1.
---
toolkit/profile/nsProfileLock.cpp | 17 ++++++++---------
1 file changed, 8 insertions(+), 9 deletions(-)
diff --git a/toolkit/profile/nsProfileLock.cpp b/toolkit/profile/nsProfileLock.cpp
index 8cbb67deb5d8..dee8b4c75b46 100644
--- a/toolkit/profile/nsProfileLock.cpp
+++ b/toolkit/profile/nsProfileLock.cpp
@@ -304,18 +304,17 @@ nsresult nsProfileLock::LockWithSymlink(nsIFile* aLockFile,
if (!mReplacedLockTime)
aLockFile->GetLastModifiedTimeOfLink(&mReplacedLockTime);
+ // For Tor Browser, avoid a DNS lookup here so the Tor network is not
+ // bypassed. Instead, always use 127.0.0.1 for the IP address portion
+ // of the lock signature, which may cause the browser to refuse to
+ // start in the rare event that all of the following conditions are met:
+ // 1. The browser profile is on a network file system.
+ // 2. The file system does not support fcntl() locking.
+ // 3. Tor Browser is run from two different computers at the same time.
+
struct in_addr inaddr;
inaddr.s_addr = htonl(INADDR_LOOPBACK);
- char hostname[256];
- PRStatus status = PR_GetSystemInfo(PR_SI_HOSTNAME, hostname, sizeof hostname);
- if (status == PR_SUCCESS) {
- char netdbbuf[PR_NETDB_BUF_SIZE];
- PRHostEnt hostent;
- status = PR_GetHostByName(hostname, netdbbuf, sizeof netdbbuf, &hostent);
- if (status == PR_SUCCESS) memcpy(&inaddr, hostent.h_addr, sizeof inaddr);
- }
-
mozilla::SmprintfPointer signature =
mozilla::Smprintf("%s:%s%lu", inet_ntoa(inaddr),
aHaveFcntlLock ? "+" : "", (unsigned long)getpid());
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 18821: Disable libmdns for Android and Desktop
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 1cb210662215afeda3a9bd0e8066d8dfd0873513
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Apr 20 14:34:50 2016 +0000
Bug 18821: Disable libmdns for Android and Desktop
There should be no need to remove the OS X support introduced in
https://bugzilla.mozilla.org/show_bug.cgi?id=1225726 as enabling this
is governed by a preference (which is actually set to `false`). However,
we remove it at build time as well (defense in depth).
This is basically a backout of the relevant passages of
https://hg.mozilla.org/mozilla-central/rev/6bfb430de85d,
https://hg.mozilla.org/mozilla-central/rev/609b337bf7ab and
https://hg.mozilla.org/mozilla-central/rev/8e092ec5fbbd.
Fixed bug 21861 (Disable additional mDNS code to avoid proxy bypasses)
as well.
Mozilla removed the Presentation API piece of this patch in Bug 1697680.
---
netwerk/dns/mdns/libmdns/components.conf | 15 ---------------
netwerk/dns/mdns/libmdns/moz.build | 28 ----------------------------
2 files changed, 43 deletions(-)
diff --git a/netwerk/dns/mdns/libmdns/components.conf b/netwerk/dns/mdns/libmdns/components.conf
index 6e64140c820e..1b50dbf673a4 100644
--- a/netwerk/dns/mdns/libmdns/components.conf
+++ b/netwerk/dns/mdns/libmdns/components.conf
@@ -5,20 +5,5 @@
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
Classes = [
- {
- 'cid': '{14a50f2b-7ff6-48a5-88e3-615fd111f5d3}',
- 'contract_ids': ['@mozilla.org/toolkit/components/mdnsresponder/dns-info;1'],
- 'type': 'mozilla::net::nsDNSServiceInfo',
- 'headers': ['/netwerk/dns/mdns/libmdns/nsDNSServiceInfo.h'],
- },
]
-if buildconfig.substs['MOZ_WIDGET_TOOLKIT'] != 'cocoa':
- Classes += [
- {
- 'cid': '{f9346d98-f27a-4e89-b744-493843416480}',
- 'contract_ids': ['@mozilla.org/toolkit/components/mdnsresponder/dns-sd;1'],
- 'jsm': 'resource://gre/modules/DNSServiceDiscovery.jsm',
- 'constructor': 'nsDNSServiceDiscovery',
- },
- ]
diff --git a/netwerk/dns/mdns/libmdns/moz.build b/netwerk/dns/mdns/libmdns/moz.build
index f9c025fa823e..e6e70a6d803c 100644
--- a/netwerk/dns/mdns/libmdns/moz.build
+++ b/netwerk/dns/mdns/libmdns/moz.build
@@ -4,34 +4,6 @@
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
-if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
- UNIFIED_SOURCES += [
- "MDNSResponderOperator.cpp",
- "MDNSResponderReply.cpp",
- "nsDNSServiceDiscovery.cpp",
- ]
-
- LOCAL_INCLUDES += [
- "/netwerk/base",
- ]
-
-else:
- EXTRA_JS_MODULES += [
- "DNSServiceDiscovery.jsm",
- "fallback/DataReader.jsm",
- "fallback/DataWriter.jsm",
- "fallback/DNSPacket.jsm",
- "fallback/DNSRecord.jsm",
- "fallback/DNSResourceRecord.jsm",
- "fallback/DNSTypes.jsm",
- "fallback/MulticastDNS.jsm",
- ]
-
- if CONFIG["MOZ_WIDGET_TOOLKIT"] == "android":
- EXTRA_JS_MODULES += [
- "MulticastDNSAndroid.jsm",
- ]
-
UNIFIED_SOURCES += [
"nsDNSServiceInfo.cpp",
]
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 19273: Avoid JavaScript patching of the external app helper dialog.
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 8d9da02661ec254e80a01ac3c7d7bddb7ecb4f95
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Jun 28 15:13:05 2016 -0400
Bug 19273: Avoid JavaScript patching of the external app helper dialog.
When handling an external URI or downloading a file, invoke Torbutton's
external app blocker component (which will present a download warning
dialog unless the user has checked the "Automatically download files
from now on" box).
For e10s compatibility, avoid using a modal dialog and instead use
a callback interface (nsIHelperAppWarningLauncher) to allow Torbutton
to indicate the user's desire to cancel or continue each request.
Other bugs fixed:
Bug 21766: Crash with e10s enabled while trying to download a file
Bug 21886: Download is stalled in non-e10s mode
Bug 22471: Downloading files via the PDF viewer download button is broken
Bug 22472: Fix FTP downloads when external helper app dialog is shown
Bug 22610: Avoid crashes when canceling external helper app downloads
Bug 22618: Downloading pdf file via file:/// is stalling
---
.../exthandler/nsExternalHelperAppService.cpp | 178 ++++++++++++++++++---
uriloader/exthandler/nsExternalHelperAppService.h | 3 +
.../exthandler/nsIExternalHelperAppService.idl | 47 ++++++
3 files changed, 210 insertions(+), 18 deletions(-)
diff --git a/uriloader/exthandler/nsExternalHelperAppService.cpp b/uriloader/exthandler/nsExternalHelperAppService.cpp
index 5ce5aec08d51..12e08843da20 100644
--- a/uriloader/exthandler/nsExternalHelperAppService.cpp
+++ b/uriloader/exthandler/nsExternalHelperAppService.cpp
@@ -133,6 +133,9 @@ static const char NEVER_ASK_FOR_SAVE_TO_DISK_PREF[] =
static const char NEVER_ASK_FOR_OPEN_FILE_PREF[] =
"browser.helperApps.neverAsk.openFile";
+static const char WARNING_DIALOG_CONTRACT_ID[] =
+ "@torproject.org/torbutton-extAppBlocker;1";
+
// Helper functions for Content-Disposition headers
/**
@@ -405,6 +408,22 @@ static nsresult GetDownloadDirectory(nsIFile** _directory,
return NS_OK;
}
+static already_AddRefed<nsIInterfaceRequestor> GetDialogParentAux(
+ BrowsingContext* aBrowsingContext, nsIInterfaceRequestor* aWindowContext) {
+ nsCOMPtr<nsIInterfaceRequestor> dialogParent = aWindowContext;
+
+ if (!dialogParent && aBrowsingContext) {
+ dialogParent = do_QueryInterface(aBrowsingContext->GetDOMWindow());
+ }
+ if (!dialogParent && aBrowsingContext && XRE_IsParentProcess()) {
+ RefPtr<Element> element = aBrowsingContext->Top()->GetEmbedderElement();
+ if (element) {
+ dialogParent = do_QueryInterface(element->OwnerDoc()->GetWindow());
+ }
+ }
+ return dialogParent.forget();
+}
+
/**
* Structure for storing extension->type mappings.
* @see defaultMimeEntries
@@ -609,6 +628,96 @@ static const char* descriptionOverwriteExtensions[] = {
"avif", "jxl", "pdf", "svg", "webp", "xml",
};
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+// begin nsExternalLoadURIHandler class definition and implementation
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+class nsExternalLoadURIHandler final : public nsIHelperAppWarningLauncher {
+ public:
+ NS_DECL_THREADSAFE_ISUPPORTS
+ NS_DECL_NSIHELPERAPPWARNINGLAUNCHER
+
+ nsExternalLoadURIHandler(nsIHandlerInfo* aHandlerInfo, nsIURI* aURI,
+ nsIPrincipal* aTriggeringPrincipal,
+ BrowsingContext* aBrowsingContext,
+ bool aTriggeredExternally);
+
+ protected:
+ ~nsExternalLoadURIHandler();
+
+ nsCOMPtr<nsIHandlerInfo> mHandlerInfo;
+ nsCOMPtr<nsIURI> mURI;
+ nsCOMPtr<nsIPrincipal> mTriggeringPrincipal;
+ RefPtr<BrowsingContext> mBrowsingContext;
+ bool mTriggeredExternally;
+ nsCOMPtr<nsIHelperAppWarningDialog> mWarningDialog;
+};
+
+NS_IMPL_ADDREF(nsExternalLoadURIHandler)
+NS_IMPL_RELEASE(nsExternalLoadURIHandler)
+
+NS_INTERFACE_MAP_BEGIN(nsExternalLoadURIHandler)
+ NS_INTERFACE_MAP_ENTRY_AMBIGUOUS(nsISupports, nsIHelperAppWarningLauncher)
+ NS_INTERFACE_MAP_ENTRY(nsIHelperAppWarningLauncher)
+NS_INTERFACE_MAP_END
+
+nsExternalLoadURIHandler::nsExternalLoadURIHandler(
+ nsIHandlerInfo* aHandlerInfo, nsIURI* aURI,
+ nsIPrincipal* aTriggeringPrincipal, BrowsingContext* aBrowsingContext,
+ bool aTriggeredExternally)
+ : mHandlerInfo(aHandlerInfo),
+ mURI(aURI),
+ mTriggeringPrincipal(aTriggeringPrincipal),
+ mBrowsingContext(aBrowsingContext),
+ mTriggeredExternally(aTriggeredExternally)
+
+{
+ nsresult rv = NS_OK;
+ mWarningDialog = do_CreateInstance(WARNING_DIALOG_CONTRACT_ID, &rv);
+ if (NS_SUCCEEDED(rv) && mWarningDialog) {
+ // This will create a reference cycle (the dialog holds a reference to us
+ // as nsIHelperAppWarningLauncher), which will be broken in ContinueRequest
+ // or CancelRequest.
+ nsCOMPtr<nsIInterfaceRequestor> dialogParent =
+ GetDialogParentAux(aBrowsingContext, nullptr);
+ rv = mWarningDialog->MaybeShow(this, dialogParent);
+ }
+
+ if (NS_FAILED(rv)) {
+ // If for some reason we could not open the download warning prompt,
+ // continue with the request.
+ ContinueRequest();
+ }
+}
+
+nsExternalLoadURIHandler::~nsExternalLoadURIHandler() {}
+
+NS_IMETHODIMP nsExternalLoadURIHandler::ContinueRequest() {
+ MOZ_ASSERT(mURI);
+ MOZ_ASSERT(mHandlerInfo);
+
+ // Break our reference cycle with the download warning dialog (set up in
+ // LoadURI).
+ mWarningDialog = nullptr;
+
+ nsresult rv = NS_OK;
+ nsCOMPtr<nsIContentDispatchChooser> chooser =
+ do_CreateInstance("@mozilla.org/content-dispatch-chooser;1", &rv);
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ return chooser->HandleURI(mHandlerInfo, mURI, mTriggeringPrincipal,
+ mBrowsingContext, mTriggeredExternally);
+}
+
+NS_IMETHODIMP nsExternalLoadURIHandler::CancelRequest(nsresult aReason) {
+ NS_ENSURE_ARG(NS_FAILED(aReason));
+
+ // Break our reference cycle with the download warning dialog (set up in
+ // LoadURI).
+ mWarningDialog = nullptr;
+
+ return NS_OK;
+}
+
static StaticRefPtr<nsExternalHelperAppService> sExtHelperAppSvcSingleton;
/**
@@ -635,6 +744,9 @@ nsExternalHelperAppService::GetSingleton() {
return do_AddRef(sExtHelperAppSvcSingleton);
}
+//////////////////////////////////////////////////////////////////////////////////////////////////////
+// nsExternalHelperAppService definition and implementation
+//////////////////////////////////////////////////////////////////////////////////////////////////////
NS_IMPL_ISUPPORTS(nsExternalHelperAppService, nsIExternalHelperAppService,
nsPIExternalAppLauncher, nsIExternalProtocolService,
nsIMIMEService, nsIObserver, nsISupportsWeakReference)
@@ -1093,12 +1205,14 @@ nsExternalHelperAppService::LoadURI(nsIURI* aURI,
rv = GetProtocolHandlerInfo(scheme, getter_AddRefs(handler));
NS_ENSURE_SUCCESS(rv, rv);
- nsCOMPtr<nsIContentDispatchChooser> chooser =
- do_CreateInstance("@mozilla.org/content-dispatch-chooser;1", &rv);
- NS_ENSURE_SUCCESS(rv, rv);
+ RefPtr<nsExternalLoadURIHandler> h = new nsExternalLoadURIHandler(
+ handler, uri, aTriggeringPrincipal, aBrowsingContext,
+ aTriggeredExternally);
+ if (!h) {
+ return NS_ERROR_OUT_OF_MEMORY;
+ }
- return chooser->HandleURI(handler, uri, aTriggeringPrincipal,
- aBrowsingContext, aTriggeredExternally);
+ return NS_OK;
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
@@ -1243,6 +1357,7 @@ NS_INTERFACE_MAP_BEGIN(nsExternalAppHandler)
NS_INTERFACE_MAP_ENTRY(nsIStreamListener)
NS_INTERFACE_MAP_ENTRY(nsIRequestObserver)
NS_INTERFACE_MAP_ENTRY(nsIHelperAppLauncher)
+ NS_INTERFACE_MAP_ENTRY(nsIHelperAppWarningLauncher)
NS_INTERFACE_MAP_ENTRY(nsICancelable)
NS_INTERFACE_MAP_ENTRY(nsIBackgroundFileSaverObserver)
NS_INTERFACE_MAP_ENTRY(nsINamed)
@@ -1641,18 +1756,7 @@ void nsExternalAppHandler::MaybeApplyDecodingForExtension(
already_AddRefed<nsIInterfaceRequestor>
nsExternalAppHandler::GetDialogParent() {
- nsCOMPtr<nsIInterfaceRequestor> dialogParent = mWindowContext;
-
- if (!dialogParent && mBrowsingContext) {
- dialogParent = do_QueryInterface(mBrowsingContext->GetDOMWindow());
- }
- if (!dialogParent && mBrowsingContext && XRE_IsParentProcess()) {
- RefPtr<Element> element = mBrowsingContext->Top()->GetEmbedderElement();
- if (element) {
- dialogParent = do_QueryInterface(element->OwnerDoc()->GetWindow());
- }
- }
- return dialogParent.forget();
+ return GetDialogParentAux(mBrowsingContext, mWindowContext);
}
NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
@@ -1780,6 +1884,34 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
loadInfo->SetForceAllowDataURI(true);
}
+ mWarningDialog = do_CreateInstance(WARNING_DIALOG_CONTRACT_ID, &rv);
+ if (NS_SUCCEEDED(rv) && mWarningDialog) {
+ // This will create a reference cycle (the dialog holds a reference to us
+ // as nsIHelperAppWarningLauncher), which will be broken in ContinueRequest
+ // or CancelRequest.
+ nsCOMPtr<nsIInterfaceRequestor> dialogParent = GetDialogParent();
+ rv = mWarningDialog->MaybeShow(this, dialogParent);
+ }
+
+ if (NS_FAILED(rv)) {
+ // If for some reason we could not open the download warning prompt,
+ // continue with the request.
+ ContinueRequest();
+ }
+
+ return NS_OK;
+}
+
+NS_IMETHODIMP nsExternalAppHandler::ContinueRequest() {
+ nsAutoCString MIMEType;
+ if (mMimeInfo) {
+ mMimeInfo->GetMIMEType(MIMEType);
+ }
+
+ // Break our reference cycle with the download warning dialog (set up in
+ // OnStartRequest).
+ mWarningDialog = nullptr;
+
// now that the temp file is set up, find out if we need to invoke a dialog
// asking the user what they want us to do with this content...
@@ -1869,6 +2001,8 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
action == nsIMIMEInfo::saveToDisk) {
alwaysAsk = true;
}
+
+ nsresult rv = NS_OK;
if (alwaysAsk) {
// Display the dialog
mDialog = do_CreateInstance(NS_HELPERAPPLAUNCHERDLG_CONTRACTID, &rv);
@@ -1925,6 +2059,14 @@ NS_IMETHODIMP nsExternalAppHandler::OnStartRequest(nsIRequest* request) {
return NS_OK;
}
+NS_IMETHODIMP nsExternalAppHandler::CancelRequest(nsresult aReason) {
+ // Break our reference cycle with the download warning dialog (set up in
+ // OnStartRequest).
+ mWarningDialog = nullptr;
+
+ return Cancel(aReason);
+}
+
// Convert error info into proper message text and send OnStatusChange
// notification to the dialog progress listener or nsITransfer implementation.
void nsExternalAppHandler::SendStatusChange(ErrorType type, nsresult rv,
@@ -2607,7 +2749,7 @@ NS_IMETHODIMP nsExternalAppHandler::Cancel(nsresult aReason) {
}
// Break our reference cycle with the helper app dialog (set up in
- // OnStartRequest)
+ // ContinueRequest)
mDialog = nullptr;
mRequest = nullptr;
diff --git a/uriloader/exthandler/nsExternalHelperAppService.h b/uriloader/exthandler/nsExternalHelperAppService.h
index 5735e73bcde7..6615b5388048 100644
--- a/uriloader/exthandler/nsExternalHelperAppService.h
+++ b/uriloader/exthandler/nsExternalHelperAppService.h
@@ -219,6 +219,7 @@ class nsExternalHelperAppService : public nsIExternalHelperAppService,
*/
class nsExternalAppHandler final : public nsIStreamListener,
public nsIHelperAppLauncher,
+ public nsIHelperAppWarningLauncher,
public nsIBackgroundFileSaverObserver,
public nsINamed {
public:
@@ -226,6 +227,7 @@ class nsExternalAppHandler final : public nsIStreamListener,
NS_DECL_NSISTREAMLISTENER
NS_DECL_NSIREQUESTOBSERVER
NS_DECL_NSIHELPERAPPLAUNCHER
+ NS_DECL_NSIHELPERAPPWARNINGLAUNCHER
NS_DECL_NSICANCELABLE
NS_DECL_NSIBACKGROUNDFILESAVEROBSERVER
NS_DECL_NSINAMED
@@ -497,6 +499,7 @@ class nsExternalAppHandler final : public nsIStreamListener,
nsCOMPtr<nsITransfer> mTransfer;
nsCOMPtr<nsIHelperAppLauncherDialog> mDialog;
+ nsCOMPtr<nsIHelperAppWarningDialog> mWarningDialog;
/**
diff --git a/uriloader/exthandler/nsIExternalHelperAppService.idl b/uriloader/exthandler/nsIExternalHelperAppService.idl
index 657e15bc0742..ebdb1cdacf78 100644
--- a/uriloader/exthandler/nsIExternalHelperAppService.idl
+++ b/uriloader/exthandler/nsIExternalHelperAppService.idl
@@ -177,3 +177,50 @@ interface nsIHelperAppLauncher : nsICancelable
*/
readonly attribute uint64_t browsingContextId;
};
+
+/**
+ * nsIHelperAppWarningLauncher is implemented by two classes:
+ * nsExternalLoadURIHandler
+ * nsExternalAppHandler
+ */
+[scriptable, uuid(cffd508b-4aaf-43ad-99c6-671d35cbc558)]
+interface nsIHelperAppWarningLauncher : nsISupports
+{
+ /**
+ * Callback invoked by the external app warning dialog to continue the
+ * request.
+ * NOTE: This will release the reference to the nsIHelperAppWarningDialog.
+ */
+ void continueRequest();
+
+ /**
+ * Callback invoked by the external app warning dialog to cancel the request.
+ * NOTE: This will release the reference to the nsIHelperAppWarningDialog.
+ *
+ * @param aReason
+ * Pass a failure code to indicate the reason why this operation is
+ * being canceled. It is an error to pass a success code.
+ */
+ void cancelRequest(in nsresult aReason);
+};
+
+/**
+ * nsIHelperAppWarningDialog is implemented by Torbutton's external app
+ * blocker (src/components/external-app-blocker.js).
+ */
+[scriptable, uuid(f4899a3f-0df3-42cc-9db8-bdf599e5a208)]
+interface nsIHelperAppWarningDialog : nsISupports
+{
+ /**
+ * Possibly show a launch warning dialog (it will not be shown if the user
+ * has chosen to not see the warning again).
+ *
+ * @param aLauncher
+ * A nsIHelperAppWarningLauncher to be invoked after the user confirms
+ * or cancels the download.
+ * @param aWindowContext
+ * The window associated with the download.
+ */
+ void maybeShow(in nsIHelperAppWarningLauncher aLauncher,
+ in nsISupports aWindowContext);
+};
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 21724: Make Firefox and Tor Browser distinct macOS apps
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit dac9d1efcc2469602cbaccc0609049a505e628c5
Author: teor <teor2345(a)gmail.com>
Date: Mon Mar 13 23:06:23 2017 +1100
Bug 21724: Make Firefox and Tor Browser distinct macOS apps
When macOS opens a document or selects a default browser, it sometimes
uses the CFBundleSignature. Changing from the Firefox MOZB signature to
a different signature TORB allows macOS to distinguish between Firefox
and Tor Browser.
---
browser/app/Makefile.in | 2 +-
browser/app/macbuild/Contents/Info.plist.in | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/browser/app/Makefile.in b/browser/app/Makefile.in
index 54d6b43fe126..8dd3a9a65661 100644
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -102,5 +102,5 @@ ifdef MOZ_UPDATER
mv -f '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater' '$(dist_dest)/Contents/Library/LaunchServices'
ln -s ../../../../Library/LaunchServices/org.mozilla.updater '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater'
endif
- printf APPLMOZB > '$(dist_dest)/Contents/PkgInfo'
+ printf APPLTORB > '$(dist_dest)/Contents/PkgInfo'
endif
diff --git a/browser/app/macbuild/Contents/Info.plist.in b/browser/app/macbuild/Contents/Info.plist.in
index 0de109988e5e..07d914158563 100644
--- a/browser/app/macbuild/Contents/Info.plist.in
+++ b/browser/app/macbuild/Contents/Info.plist.in
@@ -179,7 +179,7 @@
<key>CFBundleShortVersionString</key>
<string>@APP_VERSION@</string>
<key>CFBundleSignature</key>
- <string>MOZB</string>
+ <string>TORB</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
1
0

[tor-browser/tor-browser-90.0b12-10.5-1] Bug 11641: change TBB directory structure to be more like Firefox's
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 6760b116cbb34fe87b0043844db6afd3387b06f1
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue Apr 29 13:08:24 2014 -0400
Bug 11641: change TBB directory structure to be more like Firefox's
Unless the -osint command line flag is used, the browser now defaults
to the equivalent of -no-remote. There is a new -allow-remote flag that
may be used to restore the original (Firefox-like) default behavior.
---
toolkit/xre/nsAppRunner.cpp | 21 ++++++++++++++++-----
1 file changed, 16 insertions(+), 5 deletions(-)
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index cbd4f2c238e9..a14ab7c1965d 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -1828,8 +1828,10 @@ static void DumpHelp() {
" --migration Start with migration wizard.\n"
" --ProfileManager Start with ProfileManager.\n"
#ifdef MOZ_HAS_REMOTE
- " --no-remote Do not accept or send remote commands; implies\n"
+ " --no-remote (default) Do not accept or send remote commands; "
+ "implies\n"
" --new-instance.\n"
+ " --allow-remote Accept and send remote commands.\n"
" --new-instance Open new instance, not a new window in running "
"instance.\n"
#endif
@@ -4091,16 +4093,25 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
gSafeMode);
#if defined(MOZ_HAS_REMOTE)
+ // In Tor Browser, remoting is disabled by default unless -osint is used.
+ bool allowRemote = (CheckArg("allow-remote") == ARG_FOUND);
+ bool isOsint = (CheckArg("osint", nullptr, CheckArgFlag::None) == ARG_FOUND);
+ if (!allowRemote && !isOsint) {
+ SaveToEnv("MOZ_NO_REMOTE=1");
+ }
// Handle --no-remote and --new-instance command line arguments. Setup
// the environment to better accommodate other components and various
// restart scenarios.
ar = CheckArg("no-remote");
- if (ar == ARG_FOUND || EnvHasValue("MOZ_NO_REMOTE")) {
+ if ((ar == ARG_FOUND) && allowRemote) {
+ PR_fprintf(PR_STDERR,
+ "Error: argument --no-remote is invalid when argument "
+ "--allow-remote is specified\n");
+ return 1;
+ }
+ if (EnvHasValue("MOZ_NO_REMOTE")) {
mDisableRemoteClient = true;
mDisableRemoteServer = true;
- if (!EnvHasValue("MOZ_NO_REMOTE")) {
- SaveToEnv("MOZ_NO_REMOTE=1");
- }
}
ar = CheckArg("new-instance");
1
0

[tor-browser-build/maint-10.5] fixup! Tor Browser 10.5 release preparations
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit c87e6088e78d49de50e172b4d61c045d4bf60be8
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Fri Jul 2 03:00:21 2021 +0000
fixup! Tor Browser 10.5 release preparations
---
projects/fenix/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/fenix/config b/projects/fenix/config
index 296ab7c..adb633f 100644
--- a/projects/fenix/config
+++ b/projects/fenix/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'fenix-[% c("version") %]-[% c("var/build_id") %].tar.gz'
-git_hash: 'tor-browser-[% c("var/fenix_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
+git_hash: 'tor-browser-[% c("var/fenix_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
git_url: https://gitlab.torproject.org/tpo/applications/fenix.git
tag_gpg_id: 1
gpg_keyring: torbutton.gpg
1
0

[Git][tpo/applications/fenix] Pushed new tag tor-browser-89.1.1-10.5-1-build2
by Matthew Finkel (@sysrqb) 02 Jul '21
by Matthew Finkel (@sysrqb) 02 Jul '21
02 Jul '21
Matthew Finkel pushed new tag tor-browser-89.1.1-10.5-1-build2 at The Tor Project / Applications / fenix
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/tree/tor-browser-89.…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[tor-browser-build/maint-10.5] Tor Browser 10.5 release preparations
by sysrqb@torproject.org 02 Jul '21
by sysrqb@torproject.org 02 Jul '21
02 Jul '21
commit 196038d20c439bb9544fce0d937b0a3d5209e069
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Tue Jun 29 18:49:08 2021 +0000
Tor Browser 10.5 release preparations
Version bumps and Changelog update
---
projects/firefox/config | 2 +-
projects/tba-translation/config | 2 +-
...01-Revert-Bug-30318-Add-snowflake-support.patch | 78 ----------------------
projects/tor-android-service/build | 3 -
projects/tor-android-service/config | 2 -
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 65 ++++++++++++++++++
projects/tor-browser/build | 11 +--
projects/tor-browser/config | 2 +-
projects/tor-launcher/config | 2 +-
projects/tor-onion-proxy-library/build | 28 +++-----
projects/tor-onion-proxy-library/config | 5 --
projects/tor/config | 2 +-
rbm.conf | 18 +----
13 files changed, 83 insertions(+), 137 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 564e374..a2c667e 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# 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-build3'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
diff --git a/projects/tba-translation/config b/projects/tba-translation/config
index 73b5369..9913dad 100644
--- a/projects/tba-translation/config
+++ b/projects/tba-translation/config
@@ -3,5 +3,5 @@ filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
git_url: https://git.torproject.org/translation.git
# We need to bump the commit before releasing but just pointing to a branch
# might cause too much rebuidling of the Firefox part.
-git_hash: 0480d9e3ada42bfb02a77be59a54682ce2179cff
+git_hash: 91ff9c1637358b8e31c63796e837af4a91f1680b
version: '[% c("abbrev") %]'
diff --git a/projects/tor-android-service/0001-Revert-Bug-30318-Add-snowflake-support.patch b/projects/tor-android-service/0001-Revert-Bug-30318-Add-snowflake-support.patch
deleted file mode 100644
index b7be2ae..0000000
--- a/projects/tor-android-service/0001-Revert-Bug-30318-Add-snowflake-support.patch
+++ /dev/null
@@ -1,78 +0,0 @@
-From f3cf622e537a1283b821b3f3ce8e396a01bcb84b Mon Sep 17 00:00:00 2001
-From: Georg Koppen <gk(a)torproject.org>
-Date: Sat, 16 Jan 2021 20:56:30 +0000
-Subject: [PATCH] Revert "Bug 30318: Add snowflake support"
-
-This reverts commit ecc251d0a73f7e2034a271efd28036a0108b8688.
-
-diff --git a/service/src/main/assets/common/bridges.txt b/service/src/main/assets/common/bridges.txt
-index 1525eba..fe37735 100644
---- a/service/src/main/assets/common/bridges.txt
-+++ b/service/src/main/assets/common/bridges.txt
-@@ -13,5 +13,3 @@ obfs4 45.145.95.6:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0
- obfs4 [2a0c:4d80:42:702::1]:27015 C5B7CD6946FF10C5B3E89691A7D3F2C122D2117C cert=TD7PbUO0/0k6xYHMPW3vJxICfkMZNdkRrb63Zhl5j9dW3iRGiCx0A7mPhe5T2EDzQ35+Zw iat-mode=0
- obfs4 51.222.13.177:80 5EDAC3B810E12B01F6FD8050D2FD3E277B289A08 cert=2uplIpLQ0q9+0qMFrK5pkaYRDOe460LL9WHBvatgkuRr/SL31wBOEupaMMJ6koRE6Ld0ew iat-mode=0
- meek_lite 0.0.2.0:2 97700DFE9F483596DDA6264C4D7DF7641E1E39CE url=https://meek.azureedge.net/ front=ajax.aspnetcdn.com
--
--snowflake 0.0.3.0:1 2B280B23E1107BB62ABFC40DDCC8824814F80A72
-diff --git a/service/src/main/java/org/torproject/android/service/CustomTorInstaller.java b/service/src/main/java/org/torproject/android/service/CustomTorInstaller.java
-index 52bc4fe..198c981 100644
---- a/service/src/main/java/org/torproject/android/service/CustomTorInstaller.java
-+++ b/service/src/main/java/org/torproject/android/service/CustomTorInstaller.java
-@@ -40,17 +40,14 @@ public class CustomTorInstaller extends TorInstaller {
- @Override
- public InputStream openBridgesStream() throws IOException {
- /*
-- BridgesList is an overloaded field, which can cause some confusion.
-- The list can be:
-- 1) a filter like obfs4, meek, or snowflake OR
-- 2) it can be a custom bridge
-- For (1), we just pass back all bridges, the filter will occur
-- elsewhere in the library.
-- For (2) we return the bridge list as a raw stream.
-- If length is greater than 9, then we know this is a custom bridge
-+ BridgesList is an overloaded field, which can cause some confusion. The list can be:
-+ 1) a filter like obfs4 or meek OR 2) it can be a custom bridge
-+ For (1), we just pass back all bridges, the filter will occur elsewhere in the library.
-+ For (2) we return the bridge list as a raw stream
-+ If length is greater than 5, then we know this is a custom bridge
- */
- String userDefinedBridgeList = Prefs.getBridgesList();
-- byte bridgeType = (byte) (userDefinedBridgeList.length() > 9 ? 1 : 0);
-+ byte bridgeType = (byte) (userDefinedBridgeList.length() > 5 ? 1 : 0);
- // Terrible hack. Must keep in sync with topl::addBridgesFromResources.
- if (bridgeType == 0) {
- switch (userDefinedBridgeList) {
-@@ -60,9 +57,6 @@ public class CustomTorInstaller extends TorInstaller {
- case "meek":
- bridgeType = 3;
- break;
-- case "snowflake":
-- bridgeType = 4;
-- break;
- }
- }
-
-diff --git a/service/src/main/java/org/torproject/android/service/TorService.java b/service/src/main/java/org/torproject/android/service/TorService.java
-index f1ddcda..32d7f30 100644
---- a/service/src/main/java/org/torproject/android/service/TorService.java
-+++ b/service/src/main/java/org/torproject/android/service/TorService.java
-@@ -365,12 +365,10 @@ public final class TorService extends Service implements TorServiceConstants, Or
-
- //Check bridges to see if we need this
- File nativeDir = new File(getApplicationInfo().nativeLibraryDir);
-- File pluggableTransportObfs = new File(nativeDir, "libObfs4proxy.so");
-- if(!pluggableTransportObfs.canExecute()) pluggableTransportObfs.setExecutable(true);
-- File pluggableTransportSnow = new File(nativeDir, "libSnowflake.so");
-- if(!pluggableTransportSnow.canExecute()) pluggableTransportSnow.setExecutable(true);
-+ File pluggableTransport = new File(nativeDir, "libObfs4proxy.so");
-+ if(!pluggableTransport.canExecute()) pluggableTransport.setExecutable(true);
-
-- builder.configurePluggableTransportsFromSettings(pluggableTransportObfs, pluggableTransportSnow);
-+ builder.configurePluggableTransportsFromSettings(pluggableTransport);
- mDataService.updateConfigBuilder(builder);
- onionProxyManager.getTorInstaller().updateTorConfigCustom
- (builder.asString());
---
-2.30.0
-
diff --git a/projects/tor-android-service/build b/projects/tor-android-service/build
index 68d63cd..797d5c2 100644
--- a/projects/tor-android-service/build
+++ b/projects/tor-android-service/build
@@ -14,9 +14,6 @@ tar -C $GRADLE_HOME -xf $rootdir/[% c('input_files_by_name/gradle') %]
tar -C /var/tmp/build -xf [% project %]-[% c('version') %].tar.gz
cd /var/tmp/build/[% project %]-[% c('version') %]
-[% IF ! c("var/snowflake") %]
- patch -p1 < $rootdir/0001-Revert-Bug-30318-Add-snowflake-support.patch
-[% END %]
# Replace pre-packaged tor library with the latest build
rm -fR service/src/main/jniLibs/*
[% FOREACH arch = ['armv7', 'aarch64', 'x86', 'x86_64'] -%]
diff --git a/projects/tor-android-service/config b/projects/tor-android-service/config
index 171f4a9..c1ccb7d 100644
--- a/projects/tor-android-service/config
+++ b/projects/tor-android-service/config
@@ -25,8 +25,6 @@ input_files:
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
- project: tor-onion-proxy-library
name: topl
- - filename: 0001-Revert-Bug-30318-Add-snowflake-support.patch
- enable: '[% ! c("var/snowflake") %]'
- project: tor
name: tor-armv7
target_prepend:
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index cdbeba9..454d32d 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,68 @@
+Tor Browser 10.5 -- July 6 2021
+ * All Platforms
+ * Update NoScript to 11.2.9
+ * Update Tor Launcher to 0.2.29
+ * Translations update
+ * Bug 25483: Provide Snowflake based on Pion for Windows, macOS, and Linux
+ * Bug 33761: Remove unnecessary snowflake dependencies
+ * Bug 40064: Bump libevent to 2.1.12 [tor-browser-build]
+ * Bug 40137: Migrate https-everywhere storage to idb [tor-browser]
+ * Bug 40261: Bump versions of snowflake and webrtc [tor-browser-build]
+ * Bug 40263: Update domain front for Snowflake [tor-browser-build]
+ * Bug 40302: Update version of snowflake [tor-browser-build]
+ * Bug 40030: DuckDuckGo redirect to html doesn't work [torbutton]
+ * Windows + OS X + Linux
+ * Bug 27476: Implement about:torconnect captive portal within Tor Browser [tor-browser]
+ * Bug 32228: Bookmark TPO support domains in Tor Browser
+ * Bug 33803: Add a secondary nightly MAR signing key [tor-browser]
+ * Bug 33954: Consider different approach for Bug 2176
+ * Bug 34345: "Don't Bootstrap" Startup Mode
+ * Bug 40011: Rename tor-browser-brand.ftl to brand.ftl [torbutton]
+ * Bug 40012: Fix about:tor not loading some images in 82 [torbutton]
+ * Bug 40138: Move our primary nightly MAR signing key to tor-browser [tor-browser-build]
+ * Bug 40428: Correct minor Cryptocurrency warning string typo [tor-browser]
+ * Bug 40429: Update Onboarding for 10.5 [tor-browser]
+ * Bug 40455: Block or recover background requests after bootstrap [tor-browser]
+ * Bug 40456: Update the SecureDrop HTTPS-Everywhere update channel [tor-browser]
+ * Bug 40475: Include clearing CORS preflight cache [tor-browser]
+ * Bug 40478: Onion alias url rewrite is broken [tor-browser]
+ * Bug 40484: Bootstrapping page show Quickstart text [tor-browser]
+ * Bug 40490: BridgeDB bridge captcha selection is broken in alpha [tor-browser]
+ * Bug 40495: Onion pattern is focusable by click on about:torconnect [tor-browser]
+ * Bug 40499: Onion Alias doesn't work with TOR_SKIP_LAUNCH [tor-browser]
+ * Android
+ * Bug 30318: Integrate snowflake into mobile Tor Browser
+ * Bug 40206: Disable the /etc/hosts parser [tor-browser]
+ * Linux
+ * Bug 40089: Remove CentOS 6 support for Tor Browser 10.5 [tor-browser]
+ * Build System
+ * All Platforms
+ * Update Go to 1.15.13
+ * Bug 23631: Use rootless containers [tor-browser-build]
+ * Bug 33693: Change snowflake and meek dummy address [tor-browser]
+ * Bug 40016: getfpaths is not setting origin_project [rbm]
+ * Bug 40169: Update apt package cache after calling pre_pkginst, too [tor-browser-build]
+ * Bug 40194: Remove osname part in cbindgen filename [tor-browser-build]
+ * Windows + OS X + Linux
+ * Bug 40081: Build Mozilla code with --enable-rust-simd [tor-browser-build]
+ * Bug 40104: Use our TMPDIR when creating our .mar files [tor-browser-build]
+ * Bug 40133: Bump Rust version for ESR 78 to 1.43.0 [tor-browser-build]
+ * Bug 40166: Update apt cache before calling pre_pkginst in container-image config [tor-browser-build]
+ * Android
+ * Bug 28672: Android reproducible build of Snowflake
+ * Bug 40313: Use apt-get to install openjdk-8 .deb files with their dependencies [tor-browser-build]
+ * Windows
+ * Bug 34360: Bump binutils to 2.35.1
+ * Bug 40131: Remove unused binutils patches [tor-browser-build]
+ * Linux
+ * Bug 26238: Move to Debian Jessie for our Linux builds
+ * Bug 31729: Support Wayland
+ * Bug 40041: Remove CentOS 6 support for 10.5 series [tor-browser-build]
+ * Bug 40103: Add i386 pkg-config path for linux-i686 [tor-browser-build]
+ * Bug 40112: Strip libstdc++ we ship [tor-browser-build]
+ * Bug 40118: Add missing libdrm dev package to firefox container [tor-browser-build]
+ * Bug 40235: Bump apt for Jessie containers [tor-browser-build]
+
Tor Browser 10.5a17 -- June 27 2021
* All Platforms
* Update NoScript to 11.2.9
diff --git a/projects/tor-browser/build b/projects/tor-browser/build
index 1d2e35b..d2b8482 100644
--- a/projects/tor-browser/build
+++ b/projects/tor-browser/build
@@ -48,9 +48,7 @@ MARTOOLS=$rootdir/mar-tools
mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
tar -C "$TBDIR" -xf [% c('input_files_by_name/obfs4') %]
-[% IF c("var/snowflake") %]
- tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
-[% END -%]
+tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
tar -C "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]" -xf [% c('input_files_by_name/fonts') %]
@@ -135,12 +133,7 @@ cp -a Bundle-Data/Docs/* "$TBDIR/$DOCSPATH"
tar -C Bundle-Data/[% bundledata_osname %] [% IF ! c("var/namecoin") %]--exclude=*Electrum-NMC* --exclude=*ncprop279*[% END %] -c . | tar -C "$TBDIR[% IF ! c("var/osx") %]/TorBrowser[% END %]" -x
cat Bundle-Data/PTConfigs/[% bundledata_osname %]/torrc-defaults-appendix >> "$TBDIR/$TORCONFIGPATH/torrc-defaults"
-[% IF ! c("var/snowflake") %]
- grep -v 'default_bridge\.snowflake' Bundle-Data/PTConfigs/bridge_prefs.js \
- >> "$GENERATEDPREFSPATH"
-[% ELSE %]
- cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
-[% END %]
+cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
[% IF ! c("var/multi_lingual") %]
echo 'pref("extensions.torlauncher.prompt_for_locale", false);' >> "$GENERATEDPREFSPATH"
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index f98062e..1045d90 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -75,7 +75,7 @@ input_files:
enable: '[% ! c("var/android") %]'
- project: snowflake
name: snowflake
- enable: '[% c("var/snowflake") && ! c("var/android") %]'
+ enable: '[% ! c("var/android") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
diff --git a/projects/tor-launcher/config b/projects/tor-launcher/config
index e349026..7a4a55d 100644
--- a/projects/tor-launcher/config
+++ b/projects/tor-launcher/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 0.2.29
+version: 0.2.30
git_url: https://git.torproject.org/tor-launcher.git
git_hash: '[% c("version") %]'
gpg_keyring: torbutton.gpg
diff --git a/projects/tor-onion-proxy-library/build b/projects/tor-onion-proxy-library/build
index d4950f6..452d7e4 100644
--- a/projects/tor-onion-proxy-library/build
+++ b/projects/tor-onion-proxy-library/build
@@ -21,42 +21,30 @@ cd /var/tmp/build/[% project %]-[% c('version') %]
# build will pull down the correct android tool versions
patch -p1 < $rootdir/gradle.patch
patch -p1 < $rootdir/0001-Bug-33931-Filter-bridges-in-stream-by-type.patch
-[% IF c("var/snowflake") %]
- patch -p1 < $rootdir/0001-Bug-30318-Add-snowflake-support.patch
-[% END %]
+patch -p1 < $rootdir/0001-Bug-30318-Add-snowflake-support.patch
[% FOREACH arch = ['armv7', 'aarch64', 'x86', 'x86_64'] -%]
# Extract obfs4proxy from TorBrowser/Tor/PluggableTransports/obfs4proxy
tar --strip-components=4 -xf $rootdir/[% c('input_files_by_name/obfs4-' _ arch) %]
- [% IF c("var/snowflake") %]
- # Extract snowflake from TorBrowser/Tor/PluggableTransports/snowflake
- tar --strip-components=4 -xf $rootdir/[% c('input_files_by_name/snowflake-' _ arch) %]
- [% END %]
+ # Extract snowflake from TorBrowser/Tor/PluggableTransports/snowflake
+ tar --strip-components=4 -xf $rootdir/[% c('input_files_by_name/snowflake-' _ arch) %]
# Overwrite the obfs4proxy binary provided by Pluto and add Snowflake
[% IF arch == "armv7" -%]
cp obfs4proxy external/pluto/bin/armeabi-v7a/
cp obfs4proxy external/pluto/bin/armeabi/
- [% IF c("var/snowflake") %]
- cp snowflake-client external/pluto/bin/armeabi-v7a/
- cp snowflake-client external/pluto/bin/armeabi/
- [% END %]
+ cp snowflake-client external/pluto/bin/armeabi-v7a/
+ cp snowflake-client external/pluto/bin/armeabi/
[% ELSIF arch == "aarch64" -%]
cp obfs4proxy external/pluto/bin/arm64-v8a/
- [% IF c("var/snowflake") %]
- cp snowflake-client external/pluto/bin/arm64-v8a/
- [% END %]
+ cp snowflake-client external/pluto/bin/arm64-v8a/
[% ELSE -%]
cp obfs4proxy external/pluto/bin/[% arch %]/
- [% IF c("var/snowflake") %]
- cp snowflake-client external/pluto/bin/[% arch %]/
- [% END %]
+ cp snowflake-client external/pluto/bin/[% arch %]/
[% END -%]
rm obfs4proxy
- [% IF c("var/snowflake") %]
- rm snowflake-client
- [% END %]
+ rm snowflake-client
[% END -%]
# Build Android Libraries and Apps
diff --git a/projects/tor-onion-proxy-library/config b/projects/tor-onion-proxy-library/config
index f4a5c24..09f1bc7 100644
--- a/projects/tor-onion-proxy-library/config
+++ b/projects/tor-onion-proxy-library/config
@@ -42,26 +42,21 @@ input_files:
name: snowflake-armv7
target_prepend:
- android-armv7
- enable: '[% c("var/snowflake") %]'
- project: snowflake
name: snowflake-aarch64
target_prepend:
- android-aarch64
- enable: '[% c("var/snowflake") %]'
- project: snowflake
name: snowflake-x86
target_prepend:
- android-x86
- enable: '[% c("var/snowflake") %]'
- project: snowflake
name: snowflake-x86_64
target_prepend:
- android-x86_64
- enable: '[% c("var/snowflake") %]'
- filename: 'gradle-dependencies-[% c("var/gradle_dependencies_version") %]'
name: gradle-dependencies
exec: '[% INCLUDE "fetch-gradle-dependencies" %]'
- filename: gradle.patch
- filename: 0001-Bug-33931-Filter-bridges-in-stream-by-type.patch
- filename: 0001-Bug-30318-Add-snowflake-support.patch
- enable: '[% c("var/snowflake") %]'
diff --git a/projects/tor/config b/projects/tor/config
index 9d0c625..5d692bd 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.5
+version: 0.4.5.9
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 3a7cc8e..2ea7bac 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -57,10 +57,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '10.5a17'
- torbrowser_build: 'build2'
+ torbrowser_version: '10.5'
+ torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 10.5a16
+ - 10.0.18
project_name: tor-browser
multi_lingual: 0
build_mar: 1
@@ -323,9 +323,6 @@ targets:
android_min_api_aarch64: 21
# This is needed to get the offline build part for Glean right.
glean_parser: 1.29.0
- # We only build snowflake on the alpha and nightly
- # channels for now.
- snowflake: '[% c("var/alpha") || c("var/nightly") %]'
container:
suite: buster
arch: amd64
@@ -380,9 +377,6 @@ targets:
linux: 1
compiler: gcc
configure_opt: '[% c("var/configure_opt_project") %]'
- # We only build snowflake on the alpha and nightly
- # channels for now.
- snowflake: '[% c("var/alpha") || c("var/nightly") %]'
# Only build Namecoin for linux on nightly
namecoin: '[% c("var/nightly") %]'
container:
@@ -442,9 +436,6 @@ targets:
flag_mwindows: '-mwindows'
compiler: mingw-w64
faketime_path: /usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1
- # We only build snowflake on the alpha and nightly
- # channels for now.
- snowflake: '[% c("var/alpha") || c("var/nightly") %]'
deps:
- build-essential
- python
@@ -472,9 +463,6 @@ targets:
locale_ja: ja-JP-mac
# We only support RLBox on the nightly channel for now
rlbox: '[% c("var/nightly") %]'
- # We only build snowflake on the alpha and nightly
- # channels for now.
- snowflake: '[% c("var/alpha") || c("var/nightly") %]'
deps:
- build-essential
- python
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 01 Jul '21
by sysrqb@torproject.org 01 Jul '21
01 Jul '21
commit 152563c8869ec07b7e8e6e18161992934d935b11
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 19:36:46 2021 +0000
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/components/BrowserGlue.jsm | 5 +++--
toolkit/mozapps/update/UpdateService.jsm | 6 ++++--
2 files changed, 7 insertions(+), 4 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 7c832f62386e..914b782afdb1 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -2514,8 +2514,9 @@ BrowserGlue.prototype = {
{
task: () => {
- if (TorProtocolService.isBootstrapDone()) {
- // we will take this path when the user is using the legacy tor launcher
+ if (TorProtocolService.isBootstrapDone() || !TorProtocolService.ownsTorDaemon) {
+ // we will take this path when the user is using the legacy tor launcher or
+ // when Tor Browser didn't launch its own tor.
OnionAliasStore.init();
} else {
// this path is taken when using about:torconnect, we wait to init
diff --git a/toolkit/mozapps/update/UpdateService.jsm b/toolkit/mozapps/update/UpdateService.jsm
index 5bd778ce47e2..6d0c79222577 100644
--- a/toolkit/mozapps/update/UpdateService.jsm
+++ b/toolkit/mozapps/update/UpdateService.jsm
@@ -2698,8 +2698,10 @@ UpdateService.prototype = {
}
return;
} else if (update.errorCode == PROXY_SERVER_CONNECTION_REFUSED &&
- !TorProtocolService.isBootstrapDone()) {
- // Register boostrap observer to try again
+ !TorProtocolService.isBootstrapDone() &&
+ TorProtocolService.ownsTorDaemon) {
+ // Register boostrap observer to try again, but only when we own the
+ // tor process.
this._registerBootstrapObserver();
return;
}
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge branch 'bug_40499_00' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 01 Jul '21
by sysrqb@torproject.org 01 Jul '21
01 Jul '21
commit 90888c0908db001a50e53da97e6cf0f3e9ebda71
Merge: 36f2bff7dd1e 152563c8869e
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jul 1 14:29:31 2021 +0000
Merge branch 'bug_40499_00' into tor-browser-78.11.0esr-10.5-1
browser/components/BrowserGlue.jsm | 5 +++--
toolkit/mozapps/update/UpdateService.jsm | 6 ++++--
2 files changed, 7 insertions(+), 4 deletions(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40416_rev' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit f9a497c455fecc7a6dcb3591c8cbec9c7a8dfd2f
Merge: 85ca6e359d6b 3aee9ca1bb25
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 22:10:35 2021 +0000
Merge remote-tracking branch 'richardgl/40416_rev' into tor-browser-78.11.0esr-10.5-1
browser/base/content/aboutNetError.xhtml | 3 ++
browser/base/content/browser-siteIdentity.js | 12 +++++
browser/base/jar.mn | 2 +-
.../content/netError/onionNetError.js | 6 +++
.../content/netError/v2Deprecated.css | 25 +++++++++
.../onionservices/content/netError/v2Deprecated.js | 50 ++++++++++++++++++
browser/components/onionservices/jar.mn | 8 ++-
browser/modules/TorStrings.jsm | 8 +++
.../shared/identity-block/identity-block.inc.css | 3 +-
browser/themes/shared/onionPattern.inc.xhtml | 4 +-
docshell/base/nsDocShell.cpp | 61 ++++++++++++++++++++++
dom/ipc/ContentParent.cpp | 11 ++++
dom/ipc/ContentParent.h | 2 +
dom/ipc/PContent.ipdl | 3 ++
ipc/ipdl/sync-messages.ini | 3 ++
js/xpconnect/src/xpc.msg | 1 +
xpcom/base/ErrorList.py | 2 +
17 files changed, 200 insertions(+), 4 deletions(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Bug 40416: Add v2 Onion deprecation warnings
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 3aee9ca1bb25121d1914670959f1528ea9f95fdc
Author: Richard Pospesel <richard(a)torproject.org>
Date: Fri May 21 22:18:23 2021 +0200
Bug 40416: Add v2 Onion deprecation warnings
- adds new v2 deprecated warning page (js and styling) that piggy-backs
off of the existing added onion service errors
- updates identity-icon to onionWarning.svg when visiting a v2 onion site adds
warning tooltip; this warning supersedes all other identity states (including
mixed-content error)
- we determine whether to show the warning page in nsDocShell::DoURILoad()
- a new synchonous IPC method is added to ContentChild/ContentParent to determine
if the session has loaded the warning page already; worst case scenario, each
child process will need to wait on this method to return only once when visiting
a v2 onion; nothing is permanently cached with regards to this change
- an exception for the new sync method is added to sync-messages.ini (generally,
in practice adding new blocking methods is probably bad, but the minimial
overhead and frequency this method is called is worth the simpler code)
---
browser/base/content/aboutNetError.xhtml | 3 ++
browser/base/content/browser-siteIdentity.js | 12 +++++
browser/base/jar.mn | 2 +-
.../content/netError/onionNetError.js | 6 +++
.../content/netError/v2Deprecated.css | 25 +++++++++
.../onionservices/content/netError/v2Deprecated.js | 50 ++++++++++++++++++
browser/components/onionservices/jar.mn | 8 ++-
browser/modules/TorStrings.jsm | 8 +++
.../shared/identity-block/identity-block.inc.css | 3 +-
browser/themes/shared/onionPattern.inc.xhtml | 4 +-
docshell/base/nsDocShell.cpp | 61 ++++++++++++++++++++++
dom/ipc/ContentParent.cpp | 11 ++++
dom/ipc/ContentParent.h | 2 +
dom/ipc/PContent.ipdl | 3 ++
ipc/ipdl/sync-messages.ini | 3 ++
js/xpconnect/src/xpc.msg | 1 +
xpcom/base/ErrorList.py | 2 +
17 files changed, 200 insertions(+), 4 deletions(-)
diff --git a/browser/base/content/aboutNetError.xhtml b/browser/base/content/aboutNetError.xhtml
index 957b6f15a0be..4572eb2024f1 100644
--- a/browser/base/content/aboutNetError.xhtml
+++ b/browser/base/content/aboutNetError.xhtml
@@ -207,7 +207,10 @@
</div>
</div>
</div>
+<!-- The onion pattern is disabled by default unless the onionPattern.css is also included; we include onionPattern.css programmatically in the v2Deprecation error page, so the onion pattern will not be visible in all error pages -->
+#include ../../themes/shared/onionPattern.inc.xhtml
</body>
+ <script src="chrome://browser/content/onionservices/netError/v2Deprecated.js"/>
<script src="chrome://browser/content/onionservices/netError/onionNetError.js"/>
<script src="chrome://browser/content/aboutNetError.js"/>
</html>
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 2a3431172886..27fee74cba5b 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -135,6 +135,15 @@ var gIdentityHandler = {
return this._uriHasHost ? this._uri.host.toLowerCase().endsWith(".onion") : false;
},
+ get _uriIsDeprecatedOnionHost() {
+ const hostIsV2Onion = function(host) {
+ // matches on v2 onion domains with any number of subdomains
+ const pattern = /^(.*\.)*[a-z2-7]{16}\.onion/i;
+ return pattern.test(host);
+ };
+
+ return this._uriHasHost ? hostIsV2Onion(this._uri.host) : false;
+ },
// smart getters
get _identityPopup() {
delete this._identityPopup;
@@ -685,6 +694,9 @@ var gIdentityHandler = {
"identity.extension.label",
[extensionName]
);
+ } else if (this._uriIsDeprecatedOnionHost) {
+ this._identityBox.className = "onionServiceDeprecated";
+ tooltip = TorStrings.onionServices.v2Deprecated.tooltip;
} else if (this._uriHasHost && this._isSecureConnection && this._secInfo) {
// This is a secure connection.
// _isSecureConnection implicitly includes onion services, which may not have an SSL certificate
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
index df65349796b5..21b07ad9511b 100644
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -22,7 +22,7 @@ browser.jar:
content/browser/logos/send.svg (content/logos/send.svg)
content/browser/logos/tracking-protection.svg (content/logos/tracking-protection.svg)
content/browser/logos/tracking-protection-dark-theme.svg (content/logos/tracking-protection-dark-theme.svg)
- content/browser/aboutNetError.xhtml (content/aboutNetError.xhtml)
+* content/browser/aboutNetError.xhtml (content/aboutNetError.xhtml)
content/browser/aboutNetError.js (content/aboutNetError.js)
content/browser/aboutRobots-icon.png (content/aboutRobots-icon.png)
content/browser/aboutFrameCrashed.html (content/aboutFrameCrashed.html)
diff --git a/browser/components/onionservices/content/netError/onionNetError.js b/browser/components/onionservices/content/netError/onionNetError.js
index 8fabb3f38eb7..254e50bab4a3 100644
--- a/browser/components/onionservices/content/netError/onionNetError.js
+++ b/browser/components/onionservices/content/netError/onionNetError.js
@@ -38,6 +38,12 @@ var OnionServicesAboutNetError = {
const errPrefix = "onionServices.";
const errName = err.substring(errPrefix.length);
+ // tor-browser#40416 - remove this page and updated onionNetErrors with new error once v2 no longer works at all
+ if (errName === "v2Deprecated") {
+ V2DeprecatedAboutNetError.initPage(aDoc);
+ return;
+ }
+
this._strings = RPMGetTorStrings();
const stringsObj = this._strings[errName];
diff --git a/browser/components/onionservices/content/netError/v2Deprecated.css b/browser/components/onionservices/content/netError/v2Deprecated.css
new file mode 100644
index 000000000000..890468d09761
--- /dev/null
+++ b/browser/components/onionservices/content/netError/v2Deprecated.css
@@ -0,0 +1,25 @@
+%include ../../../../themes/shared/onionPattern.css
+
+:root {
+ --onion-opacity: 1;
+ --onion-color: var(--card-outline-color);
+ --onion-radius: 50px;
+}
+
+body {
+ border: 1.5em solid #FED916;
+ justify-content: space-between;
+}
+
+div.title {
+ background-image: url("chrome://browser/skin/onion-warning.svg");
+}
+
+div#errorPageContainer {
+ padding-top: 20vh;
+ width: 66%;
+}
+
+div#learnMoreContainer {
+ display: block;
+}
\ No newline at end of file
diff --git a/browser/components/onionservices/content/netError/v2Deprecated.js b/browser/components/onionservices/content/netError/v2Deprecated.js
new file mode 100644
index 000000000000..195bc187791c
--- /dev/null
+++ b/browser/components/onionservices/content/netError/v2Deprecated.js
@@ -0,0 +1,50 @@
+// Copyright (c) 2021, The Tor Project, Inc.
+
+"use strict";
+
+/* eslint-env mozilla/frame-script */
+
+var V2DeprecatedAboutNetError = {
+
+ _selector: {
+ header: ".title-text",
+ longDesc: "#errorLongDesc",
+ learnMoreLink: "#learnMoreLink",
+ contentContainer: "#errorLongContent",
+ tryAgainButton: "div#netErrorButtonContainer button.try-again",
+ },
+
+ initPage(aDoc) {
+ this._insertStylesheet(aDoc);
+ this._populateStrings(aDoc);
+ },
+
+ _populateStrings(aDoc) {
+ // populate strings
+ const TorStrings = RPMGetTorStrings();
+
+ aDoc.title = TorStrings.v2Deprecated.pageTitle;
+
+ let headerElem = aDoc.querySelector(this._selector.header);
+ headerElem.textContent = TorStrings.v2Deprecated.header;
+
+ let longDescriptionElem = aDoc.querySelector(this._selector.longDesc);
+ longDescriptionElem.textContent = TorStrings.v2Deprecated.longDescription;
+
+ let learnMoreElem = aDoc.querySelector(this._selector.learnMoreLink);
+ learnMoreElem.setAttribute("href", TorStrings.v2Deprecated.learnMoreURL);
+
+ let tryAgainElem = aDoc.querySelector(this._selector.tryAgainButton);
+ tryAgainElem.textContent = TorStrings.v2Deprecated.tryAgain;
+ },
+
+ _insertStylesheet(aDoc) {
+ const url =
+ "chrome://browser/content/onionservices/netError/v2Deprecated.css";
+ let linkElem = aDoc.createElement("link");
+ linkElem.rel = "stylesheet";
+ linkElem.href = url;
+ linkElem.type = "text/css";
+ aDoc.head.appendChild(linkElem);
+ },
+};
diff --git a/browser/components/onionservices/jar.mn b/browser/components/onionservices/jar.mn
index f45b16dc5d29..73258bd9c501 100644
--- a/browser/components/onionservices/jar.mn
+++ b/browser/components/onionservices/jar.mn
@@ -3,7 +3,13 @@ browser.jar:
content/browser/onionservices/authPreferences.js (content/authPreferences.js)
content/browser/onionservices/authPrompt.js (content/authPrompt.js)
content/browser/onionservices/authUtil.jsm (content/authUtil.jsm)
- content/browser/onionservices/netError/ (content/netError/*)
+ content/browser/onionservices/netError/browser.svg (content/netError/browser.svg)
+ content/browser/onionservices/netError/network.svg (content/netError/network.svg)
+ content/browser/onionservices/netError/onionNetError.css (content/netError/onionNetError.css)
+ content/browser/onionservices/netError/onionNetError.js (content/netError/onionNetError.js)
+ content/browser/onionservices/netError/onionsite.svg (content/netError/onionsite.svg)
+* content/browser/onionservices/netError/v2Deprecated.css (content/netError/v2Deprecated.css)
+ content/browser/onionservices/netError/v2Deprecated.js (content/netError/v2Deprecated.js)
content/browser/onionservices/onionservices.css (content/onionservices.css)
content/browser/onionservices/savedKeysDialog.js (content/savedKeysDialog.js)
content/browser/onionservices/savedKeysDialog.xhtml (content/savedKeysDialog.xhtml)
diff --git a/browser/modules/TorStrings.jsm b/browser/modules/TorStrings.jsm
index c086d0fe3117..6eeb2ea06a04 100644
--- a/browser/modules/TorStrings.jsm
+++ b/browser/modules/TorStrings.jsm
@@ -502,6 +502,14 @@ var TorStrings = {
header: getString("introTimedOut.header", "Onionsite Circuit Creation Timed Out"),
longDescription: getString("introTimedOut.longDescription", kLongDescFallback),
},
+ v2Deprecated: { // Deprecation page for v2 Onions
+ pageTitle: getString("v2Deprecated.pageTitle", "V2 Onion Site Deprecation Warning"),
+ header: getString("v2Deprecated.header", "Version 2 Onion Sites will be deprecated soon"),
+ longDescription: getString("v2Deprecated.longDescription", "Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon."),
+ learnMoreURL: `https://support.torproject.org/${getLocale()}/onionservices/#v2-deprecation`,
+ tryAgain: getString("v2Deprecated.tryAgain", "Got it"),
+ tooltip: getString("v2Deprecated.tooltip", "This onion site will not be reachable soon"),
+ },
authPrompt: {
description:
getString("authPrompt.description2", "%S is requesting that you authenticate."),
diff --git a/browser/themes/shared/identity-block/identity-block.inc.css b/browser/themes/shared/identity-block/identity-block.inc.css
index 011fb9f3081c..936ab00d2080 100644
--- a/browser/themes/shared/identity-block/identity-block.inc.css
+++ b/browser/themes/shared/identity-block/identity-block.inc.css
@@ -181,7 +181,8 @@ toolbar[brighttext] #identity-box[pageproxystate="valid"].chromeUI > #identity-i
#identity-box[pageproxystate="valid"].onionMixedDisplayContent > #identity-icon,
#identity-box[pageproxystate="valid"].onionMixedDisplayContentLoadedActiveBlocked > #identity-icon,
-#identity-box[pageproxystate="valid"].onionCertUserOverridden > #identity-icon {
+#identity-box[pageproxystate="valid"].onionCertUserOverridden > #identity-icon,
+#identity-box[pageproxystate="valid"].onionServiceDeprecated > #identity-icon {
list-style-image: url(chrome://browser/skin/onion-warning.svg);
visibility: visible;
}
diff --git a/browser/themes/shared/onionPattern.inc.xhtml b/browser/themes/shared/onionPattern.inc.xhtml
index 6bbde93684a2..0b6b8b072f9a 100644
--- a/browser/themes/shared/onionPattern.inc.xhtml
+++ b/browser/themes/shared/onionPattern.inc.xhtml
@@ -9,9 +9,11 @@
- most browser windows, typically the two rows of onions will fill the
- bottom of the page. On really wide pages, the onions are centered at
- the bottom of the page.
+ - The root onion-pattern-container div is hidden by default, and can be
+ - enabled by including onionPattern.css
-->
-<div class="onion-pattern-container">
+<div class="onion-pattern-container" style="display: none">
<!-- for some reason, these two elements are focusable, seems related to
- flex css somehow; disable their tabindex to fix
-->
diff --git a/docshell/base/nsDocShell.cpp b/docshell/base/nsDocShell.cpp
index bf9639c82612..0f315f2f87b4 100644
--- a/docshell/base/nsDocShell.cpp
+++ b/docshell/base/nsDocShell.cpp
@@ -7,6 +7,7 @@
#include "nsDocShell.h"
#include <algorithm>
+#include <regex>
#ifdef XP_WIN
# include <process.h>
@@ -3645,6 +3646,9 @@ nsDocShell::DisplayLoadError(nsresult aError, nsIURI* aURI,
case NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT:
error = "onionServices.introTimedOut";
break;
+ case NS_ERROR_TOR_ONION_SVC_V2_DEPRECATED:
+ error = "onionServices.v2Deprecated";
+ break;
default:
break;
}
@@ -9596,6 +9600,63 @@ nsresult nsDocShell::DoURILoad(nsDocShellLoadState* aLoadState,
return NS_OK;
}
+ // tor-browser#40416
+ // we only ever want to show the warning page once per session
+ const auto shouldShouldShowV2DeprecationPage = []() -> bool {
+ bool retval = false;
+ if (XRE_IsContentProcess()) {
+ auto* cc = ContentChild::GetSingleton();
+ cc->SendShouldShowV2DeprecationPage(&retval);
+ }
+ return retval;
+ };
+
+ const auto uriIsV2Onion = [](nsIURI* uri) -> bool {
+ if (uri) {
+ nsAutoCString hostString;
+ uri->GetHost(hostString);
+
+ const std::string_view host(hostString.BeginReading(), hostString.Length());
+
+ // matches v2 onions with any number of subdomains
+ const static std::regex v2OnionPattern{
+ "^(.*\\.)*[a-z2-7]{16}\\.onion",
+ std::regex::icase | std::regex::optimize
+ };
+
+ // see if the uri refers to v2 onion host
+ return std::regex_match(
+ host.begin(),
+ host.end(),
+ v2OnionPattern);
+ }
+ return false;
+ };
+
+ // only dip in here if this process thinks onion warning page has not been shown
+ static bool v2DeprecationPageShown = false;
+ if (!v2DeprecationPageShown) {
+ // now only advance if the URI we are dealing with
+ // is a v2 onion address
+ auto uri = aLoadState->URI();
+ if (uriIsV2Onion(uri)) {
+ // Ok, so we are dealing with a v2 onion, now make
+ // sure the v2 deprecation page has not been shown in
+ // in another content process
+ //
+ // This is a synchrynous call, so we are blocking until
+ // we hear back from from the parent process. Each child
+ // process will need to perform this wait at most once,
+ // since we are locally caching in v2DeprecationPageShown.
+ v2DeprecationPageShown = true;
+ if (shouldShouldShowV2DeprecationPage()) {
+ DisplayLoadError(NS_ERROR_TOR_ONION_SVC_V2_DEPRECATED, uri, nullptr, nullptr);
+ return NS_ERROR_LOAD_SHOWED_ERRORPAGE;
+ }
+ }
+ }
+
+
nsCOMPtr<nsIURILoader> uriLoader = components::URILoader::Service();
if (NS_WARN_IF(!uriLoader)) {
return NS_ERROR_UNEXPECTED;
diff --git a/dom/ipc/ContentParent.cpp b/dom/ipc/ContentParent.cpp
index 4269016ec5d5..9c1c1fddf9e9 100644
--- a/dom/ipc/ContentParent.cpp
+++ b/dom/ipc/ContentParent.cpp
@@ -6515,6 +6515,17 @@ NS_IMETHODIMP ContentParent::GetActor(const nsACString& aName,
return NS_OK;
}
+mozilla::ipc::IPCResult ContentParent::RecvShouldShowV2DeprecationPage(bool* showPage) {
+ static bool v2DeprecationPageShown = false;
+ if (v2DeprecationPageShown) {
+ *showPage = false;
+ } else {
+ *showPage = true;
+ v2DeprecationPageShown = true;
+ }
+ return IPC_OK();
+}
+
} // namespace dom
} // namespace mozilla
diff --git a/dom/ipc/ContentParent.h b/dom/ipc/ContentParent.h
index 4f10832d8e23..83f9caa1dc6c 100644
--- a/dom/ipc/ContentParent.h
+++ b/dom/ipc/ContentParent.h
@@ -1280,6 +1280,8 @@ class ContentParent final
const MaybeDiscarded<BrowsingContext>& aContext, int32_t aOffset,
HistoryGoResolver&& aResolveRequestedIndex);
+ mozilla::ipc::IPCResult RecvShouldShowV2DeprecationPage(bool* showPage);
+
// Notify the ContentChild to enable the input event prioritization when
// initializing.
void MaybeEnableRemoteInputEventQueue();
diff --git a/dom/ipc/PContent.ipdl b/dom/ipc/PContent.ipdl
index c4dd750e47a4..09d053c69738 100644
--- a/dom/ipc/PContent.ipdl
+++ b/dom/ipc/PContent.ipdl
@@ -1678,6 +1678,9 @@ child:
// WindowContext is managed using the PWindowGlobal actor's lifecycle.
async CreateWindowContext(WindowContextInitializer aInit);
async DiscardWindowContext(uint64_t aContextId) returns (bool unused);
+
+parent:
+ sync ShouldShowV2DeprecationPage() returns (bool showPage);
};
}
diff --git a/ipc/ipdl/sync-messages.ini b/ipc/ipdl/sync-messages.ini
index 88ad49d169e8..df2acb04c750 100644
--- a/ipc/ipdl/sync-messages.ini
+++ b/ipc/ipdl/sync-messages.ini
@@ -1040,6 +1040,9 @@ description = Initialization of WebGL contexts is synchronous by spec.
description = Synchronous RPC to allow WebGL to run graphics commands in compositor process and return results to be used in JS return values.
[PSocketProcess::GetTLSClientCert]
description = Synchronously get client certificate and key from parent process. Once bug 696976 has been fixed, this can be removed.
+[PContent::ShouldShowV2DeprecationPage]
+description = Synchronously determine whether a client process has already displayed the v2 onion deprecation warning page
+
#############################################################
# AVOID ADDING NEW MESSAGES TO THIS FILE #
diff --git a/js/xpconnect/src/xpc.msg b/js/xpconnect/src/xpc.msg
index 31e5e75ba35c..7c8cc9ef181c 100644
--- a/js/xpconnect/src/xpc.msg
+++ b/js/xpconnect/src/xpc.msg
@@ -262,6 +262,7 @@ XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_MISSING_CLIENT_AUTH, "Tor onion service missi
XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_BAD_CLIENT_AUTH , "Tor onion service wrong client authorization")
XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS , "Tor onion service bad address")
XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT , "Tor onion service introduction timed out")
+XPC_MSG_DEF(NS_ERROR_TOR_ONION_SVC_V2_DEPRECATED , "Tor v2 onion services are deprecated")
/* Profile manager error codes */
XPC_MSG_DEF(NS_ERROR_DATABASE_CHANGED , "Flushing the profiles to disk would have overwritten changes made elsewhere.")
diff --git a/xpcom/base/ErrorList.py b/xpcom/base/ErrorList.py
index 5f35cf7771f9..6bcd65f9bca9 100755
--- a/xpcom/base/ErrorList.py
+++ b/xpcom/base/ErrorList.py
@@ -1200,6 +1200,8 @@ with modules["TOR"]:
errors["NS_ERROR_TOR_ONION_SVC_BAD_ADDRESS"] = FAILURE(7)
# Tor onion service introduction timed out.
errors["NS_ERROR_TOR_ONION_SVC_INTRO_TIMEDOUT"] = FAILURE(8)
+ # Tor v2 onion services are deprecated
+ errors["NS_ERROR_TOR_ONION_SVC_V2_DEPRECATED"] = FAILURE(9)
# =======================================================================
# 51: NS_ERROR_MODULE_GENERAL
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 10760: Integrate TorButton to TorBrowser core
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 36f2bff7dd1e291776c2b306c97008528c7ff421
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 22:15:27 2021 +0000
fixup! Bug 10760: Integrate TorButton to TorBrowser core
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index 9b74ffb6c99a..f5a747e06001 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit 9b74ffb6c99adc98094f683340832094c56b4810
+Subproject commit f5a747e06001898e80ef2b0676ed264eb20be349
1
0
commit f5a747e06001898e80ef2b0676ed264eb20be349
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 22:14:10 2021 +0000
Translations update
---
chrome/locale/tr/aboutDialog.dtd | 4 +-
chrome/locale/tr/aboutTBUpdate.dtd | 6 +-
chrome/locale/tr/aboutTor.dtd | 14 ++---
chrome/locale/tr/brand.properties | 2 +-
chrome/locale/tr/browserOnboarding.properties | 46 +++++++--------
chrome/locale/tr/torbutton.dtd | 42 +++++++-------
chrome/locale/tr/torbutton.properties | 80 +++++++++++++--------------
7 files changed, 97 insertions(+), 97 deletions(-)
diff --git a/chrome/locale/tr/aboutDialog.dtd b/chrome/locale/tr/aboutDialog.dtd
index 2e3c7149..fd0df461 100644
--- a/chrome/locale/tr/aboutDialog.dtd
+++ b/chrome/locale/tr/aboutDialog.dtd
@@ -13,7 +13,7 @@
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "Sorularınız mı var?">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
-<!ENTITY bottomLinks.grow "Tor Ağının Büyümesine Yardımcı Olun!">
+<!ENTITY bottomLinks.grow "Tor ağının büyümesine yardımcı olun!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
-<!ENTITY bottomLinks.license "Lisans Bilgileri">
+<!ENTITY bottomLinks.license "Lisans bilgileri">
<!ENTITY tor.TrademarkStatement "'Tor' ve 'Onion Logo' Tor Project, Inc. tarafından tescillenmiş markalardır.">
diff --git a/chrome/locale/tr/aboutTBUpdate.dtd b/chrome/locale/tr/aboutTBUpdate.dtd
index d8e3612f..38d6fc77 100644
--- a/chrome/locale/tr/aboutTBUpdate.dtd
+++ b/chrome/locale/tr/aboutTBUpdate.dtd
@@ -1,8 +1,8 @@
-<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Değişiklik Günlüğü">
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser değişiklik günlüğü">
<!ENTITY aboutTBUpdate.updated "Tor Browser güncellendi.">
<!ENTITY aboutTBUpdate.linkPrefix "Bu sürüm hakkındaki güncel bilgiler ">
<!ENTITY aboutTBUpdate.linkLabel "web sitemizden edinilebilir">
<!ENTITY aboutTBUpdate.linkSuffix ".">
<!ENTITY aboutTBUpdate.version "Sürüm">
-<!ENTITY aboutTBUpdate.releaseDate "Yayım Tarihi">
-<!ENTITY aboutTBUpdate.releaseNotes "Yayım Notları">
+<!ENTITY aboutTBUpdate.releaseDate "Yayım tarihi">
+<!ENTITY aboutTBUpdate.releaseNotes "Yayım notları">
diff --git a/chrome/locale/tr/aboutTor.dtd b/chrome/locale/tr/aboutTor.dtd
index 616aa401..fd8f84cf 100644
--- a/chrome/locale/tr/aboutTor.dtd
+++ b/chrome/locale/tr/aboutTor.dtd
@@ -4,16 +4,16 @@
- vim: set sw=2 sts=2 ts=8 et syntax=xml:
-->
-<!ENTITY aboutTor.title "Tor Hakkında">
+<!ENTITY aboutTor.title "Tor hakkında">
-<!ENTITY aboutTor.viewChangelog.label "Değişiklik Günlüğünü Görüntüle">
+<!ENTITY aboutTor.viewChangelog.label "Değişiklik günlüğünü görüntüle">
<!ENTITY aboutTor.ready.label "Keşfedin. Gizlice.">
<!ENTITY aboutTor.ready2.label "Dünyanın en kişisel web tarama deneyimine hazırsınız.">
-<!ENTITY aboutTor.failure.label "Bir Şeyler Ters Gitti!">
+<!ENTITY aboutTor.failure.label "Bir şeyler ters gitti!">
<!ENTITY aboutTor.failure2.label "Tor bu tarayıcı ile çalışmıyor.">
-<!ENTITY aboutTor.search.label "DuckDuckGo ile Arayın">
+<!ENTITY aboutTor.search.label "DuckDuckGo ile arayın">
<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
<!ENTITY aboutTor.torbrowser_user_manual_questions.label "Sorularınız mı var?">
@@ -23,9 +23,9 @@
<!ENTITY aboutTor.torbrowser_user_manual.label "Tor Browser rehberi">
<!ENTITY aboutTor.tor_mission.label "Tor Projesi, Birleşik Devletler 501(c)(3) vergi muafiyeti maddesi kapsamında, özgür ve açık kaynaklı anonimlik ve kişisel gizlilik teknolojileri geliştirerek insan hakları ve özgürlüklerini ileriye götürmeyi, bu teknolojilerin bilimsel ve kültürel olarak bilinirliğini arttırmayı ve herkes tarafından erişebilmesini sağlamak amacıyla çalışan, kar amacı gütmeyen bir kuruluştur.">
-<!ENTITY aboutTor.getInvolved.label "Katkıda Bulunun »">
+<!ENTITY aboutTor.getInvolved.label "Katkıda bulunun »">
<!ENTITY aboutTor.newsletter.tagline "Tor ile ilgili son gelişmeler doğrudan e-posta kutunuza gelsin.">
-<!ENTITY aboutTor.newsletter.link_text "Tor Duyurularına Abone Olun">
+<!ENTITY aboutTor.newsletter.link_text "Tor duyurularına abone olun">
<!ENTITY aboutTor.donationBanner.freeToUse "Tor sizin gibi insanların bağışları ile desteklendiği için ücretsiz olarak kullanılabilir.">
-<!ENTITY aboutTor.donationBanner.buttonA "Bağış Yapın">
+<!ENTITY aboutTor.donationBanner.buttonA "Bağış yapın">
diff --git a/chrome/locale/tr/brand.properties b/chrome/locale/tr/brand.properties
index 5194d71a..b0b05df7 100644
--- a/chrome/locale/tr/brand.properties
+++ b/chrome/locale/tr/brand.properties
@@ -14,7 +14,7 @@ vendorShortName=Tor Projesi
homePageSingleStartMain=Firefox Start, içinde arama bulunan hızlı açılış sayfası
homePageImport=%S üzerinden açılış sayfanızı içe aktarın.
-homePageMigrationPageTitle=Açılış Sayfası Seçimi
+homePageMigrationPageTitle=Açılış sayfası seçimi
homePageMigrationDescription=Lütfen kullanmak istediğiniz açılış sayfasını seçin:
syncBrandShortName=Eşitleme
diff --git a/chrome/locale/tr/browserOnboarding.properties b/chrome/locale/tr/browserOnboarding.properties
index e2cecd03..9168ba80 100644
--- a/chrome/locale/tr/browserOnboarding.properties
+++ b/chrome/locale/tr/browserOnboarding.properties
@@ -2,70 +2,70 @@
# See LICENSE for licensing information.
# vim: set sw=2 sts=2 ts=8 et:
-onboarding.tour-tor-welcome=Hoş Geldiniz
+onboarding.tour-tor-welcome=Hoş geldiniz
onboarding.tour-tor-welcome.title=Hazırsınız.
onboarding.tour-tor-welcome.description=Tor Browser, web üzerinde gezinirken en yükek standartlarda kişisel gizlilik ve güvelik sağlar. İzleme, gözetleme ve engellemeye karşı koruma sağlar. Nasıl olduğunu buradan hızlıca görebilirsiniz.
onboarding.tour-tor-welcome.next-button=Gizlilik
-onboarding.tour-tor-privacy=Kişisel Gizlilik
+onboarding.tour-tor-privacy=Kişisel gizlilik
onboarding.tour-tor-privacy.title=İzleyenlere ve meraklılara hadlerini bildirin.
onboarding.tour-tor-privacy.description=Tor Browser çerezleri yalıtır ve kapattığınızda web tarayıcı geçmişinizi siler. Bu değişiklikler web tarayıcı üzerinde kişisel gizliliğinizin ve güvenliğinizin korunmasını sağlar. Ağ düzeyinde nasıl koruma sağladığımızı öğrenmek için 'Tor Ağı' üzerine tıklayın.
-onboarding.tour-tor-privacy.button=Tor Ağına Geç
+onboarding.tour-tor-privacy.button=Tor ağına geç
-onboarding.tour-tor-network=Tor Ağı
+onboarding.tour-tor-network=Tor ağı
onboarding.tour-tor-network.title=Tek merkezden yönetilmeyen bir ağda gezinin.
onboarding.tour-tor-network.description=Tor Browser sizi dünyada binlerce gönüllü tarafından işletilen Tor ağına bağlar. VPN bağlantısının aksine, bir güvenlik açığı ya da İnternet üzerinde kişisel gizliliğinizi koruması için güvenmeniz gereken merkezi bir kuruluş yoktur.
onboarding.tour-tor-network.description-para2=YENİ: Tor Ağı Ayarları, Tor ağına erişimin engellendiği yerlerde köprü isteğinde bulunma özelliği artı Ayarlar bölümü altında bulunabilir.
-onboarding.tour-tor-network.action-button=Tor Ağı Ayarlarınızı Yapın
-onboarding.tour-tor-network.button=Devre Görünümüne Geç
+onboarding.tour-tor-network.action-button=Tor ağı ayarlarınızı yapın
+onboarding.tour-tor-network.button=Devre görünümüne geç
-onboarding.tour-tor-circuit-display=Devre Görünümü
+onboarding.tour-tor-circuit-display=Devre görünümü
onboarding.tour-tor-circuit-display.title=Yolunuzu görün.
onboarding.tour-tor-circuit-display.description=Ziyaret ettiğiniz her web sitesi için bağlantınız, dünya üzerindeki üç Tor aktarıcısından oluşan bir devre kurularak şifrelenir ve aktarılır. Hiç bir web sitesi sizin gerçekte nereden bağlandığınızı bilemez. Kullandığınız devreyi değiştirmek için Devre Görünümünde "Bu sitenin Tor devresini yenile" üzerine tıklayın.
-onboarding.tour-tor-circuit-display.button=Yolumu Göster
+onboarding.tour-tor-circuit-display.button=Yolumu göster
onboarding.tour-tor-circuit-display.next-button=Güvenlik
onboarding.tour-tor-security=Güvenlik
onboarding.tour-tor-security.title=Deneyiminizi özelleştirin.
onboarding.tour-tor-security.description=Ek ayarları kullanarak web tarayıcınızın güvenliğini arttırabilirsiniz. Güvenlik Düzeyi Ayarı bilgisayarınıza saldırmak için kullanılabilecek bileşenleri engellemenizi sağlar. Seçeneklerinizi görebilmek için aşağıya tıklayın.
onboarding.tour-tor-security.description-suffix=Not: NoScript ve HTTPS Everywhere varsayılan olarak araç çubuğuna eklenmez. Araç çubuğunu özelleştirerek onları ekleyebilirsiniz.
-onboarding.tour-tor-security-level.button=Güvenlik Düzeyinize Bakın
-onboarding.tour-tor-security-level.next-button=Deneyim İpuçları
+onboarding.tour-tor-security-level.button=Güvenlik düzeyinize bakın
+onboarding.tour-tor-security-level.next-button=Deneyim ipuçları
-onboarding.tour-tor-expect-differences=Deneyim İpuçları
+onboarding.tour-tor-expect-differences=Deneyim puçları
onboarding.tour-tor-expect-differences.title=Bazı farklılıklara açık olun.
onboarding.tour-tor-expect-differences.description=Tor tarafından sağlanan tüm kişisel gizlilik ve güvenlik özellikleri nedeniyle İnternet üzerinde gezinme deneyiminiz biraz farklı olabilir. Sayfalar biraz yavaş olabilir ve kullandığınız güvenlik düzeyine göre bazı bileşenler yüklenmeyebilir ya da çalışmayabilir. Ayrıca bir insan mı robot mu olduğunuzu kanıtlamanız istenebilir.
-onboarding.tour-tor-expect-differences.button=Sık Sorulan Sorulara Bakın
-onboarding.tour-tor-expect-differences.next-button=Onion Hizmetleri
+onboarding.tour-tor-expect-differences.button=Sık sorulan sorulara bakın
+onboarding.tour-tor-expect-differences.next-button=Onion hizmetleri
-onboarding.tour-tor-onion-services=Onion Hizmetleri
+onboarding.tour-tor-onion-services=Onion hizmetleri
onboarding.tour-tor-onion-services.title=Ek koruma sağlayın.
onboarding.tour-tor-onion-services.description=Onion hizmetleri, yayıncılar ile ziyaretçiler için ek güvenlik ve engellemeleri aşmak için koruma sağlayan, sonu .onion uzantısı ile biten web siteleridir. Onion hizmetleri sayesinde isteyen herkes anonim olarak içerik ve hizmet sunabilir. DuckDuckGo onion sitesini ziyaret etmek için aşağıya tıklayabilirsiniz.
-onboarding.tour-tor-onion-services.button=Bir Onion Sitesine Gidin
+onboarding.tour-tor-onion-services.button=Bir Onion sitesine Gidin
onboarding.tour-tor-onion-services.next-button=Bitti
onboarding.overlay-icon-tooltip-updated2=%S\nyeniliklerine bakın
onboarding.tour-tor-update.prefix-new=Yeni
onboarding.tour-tor-update.prefix-updated=Güncellendi
-onboarding.tour-tor-toolbar=Araç Çubuğu
-onboarding.tour-tor-toolbar-update-9.0.title=Soğan Düğmesine Veda Edin.
+onboarding.tour-tor-toolbar=Araç çubuğu
+onboarding.tour-tor-toolbar-update-9.0.title=Soğan düğmesine veda edin.
onboarding.tour-tor-toolbar-update-9.0.description=Tor işlemlerini tamamen Tor Browser ile yapabilmenizi istiyoruz.
onboarding.tour-tor-toolbar-update-9.0.description-para2=Bu nedenle, artık soğan düğmesini kullanmak yerine adres çubuğundaki [i] simgesine tıklayarak Tor Devresini görebilir, araç çubuğu düğmesini ya da [≡] menüsünü kullanarak Yeni Kimlik isteğinde bulunabilirsiniz.
-onboarding.tour-tor-toolbar-update-9.0.button=Nasıl Yeni Kimlik İsteğinde Bulunacaksınız
-onboarding.tour-tor-toolbar-update-9.0.next-button=Tor Ağına Geç
+onboarding.tour-tor-toolbar-update-9.0.button=Nasıl yeni kimlik isteğinde bulunacaksınız
+onboarding.tour-tor-toolbar-update-9.0.next-button=Tor ağına geç
# Circuit Display onboarding.
onboarding.tor-circuit-display.next=Sonraki
onboarding.tor-circuit-display.done=Bitti
-onboarding.tor-circuit-display.one-of-three=1 / 3
-onboarding.tor-circuit-display.two-of-three=2 / 3
-onboarding.tor-circuit-display.three-of-three=3 / 3
+onboarding.tor-circuit-display.one-of-three=1/3
+onboarding.tor-circuit-display.two-of-three=2/3
+onboarding.tor-circuit-display.three-of-three=3/3
onboarding.tor-circuit-display.intro.title=Devreler nasıl çalışır?
onboarding.tor-circuit-display.intro.msg=Devreler, dünya çapında Tor trafiğini aktarmak üzere yapılandırılmış bilgisayarlar olan rastgele atanmış aktarıcılardan oluşur. Devrelerde kişisel gizliliğinizi koruyarak gezinebilir ve onion hizmetleri ile bağlantı kurabilirsiniz.
-onboarding.tor-circuit-display.diagram.title=Devre Görünümü
+onboarding.tor-circuit-display.diagram.title=Devre görünümü
onboarding.tor-circuit-display.diagram.msg=Bu web sitesinin devresinde kullanılan aktarıcılar bu şemada görülebilir. Farklı web siteleri arasında yapılan işlemler arasında bağlantı kurulmasını engellemek için her web sitesinde farklı bir devre kullanılır.
onboarding.tor-circuit-display.new-circuit.title=Yeni bir devre mi gerekli?
diff --git a/chrome/locale/tr/torbutton.dtd b/chrome/locale/tr/torbutton.dtd
index 481b0dca..76ec624e 100644
--- a/chrome/locale/tr/torbutton.dtd
+++ b/chrome/locale/tr/torbutton.dtd
@@ -2,33 +2,33 @@
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Bu sitenin Tor devresini yenile">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
-<!ENTITY torbutton.context_menu.networksettings "Tor Ağı Ayarları...">
+<!ENTITY torbutton.context_menu.networksettings "Tor ağı ayarları...">
<!ENTITY torbutton.context_menu.networksettings.key "N">
-<!ENTITY torbutton.context_menu.downloadUpdate "Tor Browser Güncelleme Denetimi...">
+<!ENTITY torbutton.context_menu.downloadUpdate "Tor Browser güncelleme denetimi...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
-<!ENTITY torbutton.context_menu.cookieProtections "Çerez Koruması...">
+<!ENTITY torbutton.context_menu.cookieProtections "Çerez koruması...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.button.tooltip "Torbutton uygulamasını başlatmak için tıklayın">
-<!ENTITY torbutton.prefs.security_settings "Tor Browser Güvenlik Düzeyi Ayarı">
-<!ENTITY torbutton.cookiedialog.title "Çerez Koruması Yönetimi">
+<!ENTITY torbutton.prefs.security_settings "Tor Browser güvenlik düzeyi ayarı">
+<!ENTITY torbutton.cookiedialog.title "Çerez koruması yönetimi">
<!ENTITY torbutton.cookiedialog.lockCol "Korunmuş">
<!ENTITY torbutton.cookiedialog.domainCol "Sunucu">
<!ENTITY torbutton.cookiedialog.nameCol "Ad">
<!ENTITY torbutton.cookiedialog.pathCol "Yol">
-<!ENTITY torbutton.cookiedialog.protectCookie "Çerezi Koru">
-<!ENTITY torbutton.cookiedialog.removeCookie "Çerezi Sil">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "Çerez Korumasını Kaldır">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Korunanlar Dışında Tümünü Sil">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Yeni Çerezler Korunsun">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Yeni Çerezler Korunmasın">
-<!ENTITY torbutton.prefs.sec_caption "Güvenlik Düzeyi">
+<!ENTITY torbutton.cookiedialog.protectCookie "Çerezi koru">
+<!ENTITY torbutton.cookiedialog.removeCookie "Çerezi sil">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "Çerez korumasını kaldır">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Korunanlar dışında tümünü sil">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Yeni çerezler korunsun">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Yeni çerezler korunmasın">
+<!ENTITY torbutton.prefs.sec_caption "Güvenlik düzeyi">
<!ENTITY torbutton.prefs.sec_caption_tooltip "Güvenlik ayarı ile belirli web tarayıcı özeliklerini kapatabilirsiniz. Ancak bu durumda web tarayıcınız saldırılara karşı daha korumasız olur.">
<!ENTITY torbutton.prefs.sec_standard_label "Standart">
<!ENTITY torbutton.prefs.sec_standard_description "Tüm Tor Browser ve web sitesi özellikleri kullanılabilir.">
-<!ENTITY torbutton.prefs.sec_safer_label "Daha Güvenli">
+<!ENTITY torbutton.prefs.sec_safer_label "Daha güvenli">
<!ENTITY torbutton.prefs.sec_safer_description "Sıklıkla tehlikeli olan web sitesi özellikleri devre dışı bırakılır ve bazı sitelerin işlevlerinde kayıplar olabilir. ">
<!ENTITY torbutton.prefs.sec_safer_list_label "Daha güvenli ayarlar kullanıldığında:">
-<!ENTITY torbutton.prefs.sec_safest_label "En Güvenli">
+<!ENTITY torbutton.prefs.sec_safest_label "En güvenli">
<!ENTITY torbutton.prefs.sec_safest_description "Yalnız durağan siteler ve temel hizmetler için gerekli web sitesi özelliklerine izin verilir. Bu değişiklikler görselleri, ortamları ve betikleri etkiler.">
<!ENTITY torbutton.prefs.sec_safest_list_label "En güvenli ayarlar kullanıldığında:">
<!ENTITY torbutton.prefs.sec_learn_more_label "Ayrıntılı bilgi alın">
@@ -39,14 +39,14 @@
<!ENTITY torbutton.prefs.sec_click_to_play_media "Ses ve görüntü (HTML5 ortamı) ve WebGL tıklayıp oynatılabilir.">
<!ENTITY torbutton.prefs.sec_custom_warning "Özel">
<!ENTITY torbutton.prefs.sec_overview "Güvenlik ve anonimliğinize saldırmak için kullanılacak belirli web özelliklerini devre dışı bırakır.">
-<!ENTITY torbutton.prefs.sec_standard_tooltip "Güvenlik Düzeyi : Standart">
-<!ENTITY torbutton.prefs.sec_safer_tooltip "Güvenlik Düzeyi : Daha Güvenli">
-<!ENTITY torbutton.prefs.sec_safest_tooltip "Güvenlik Düzeyi : En Güvenli">
+<!ENTITY torbutton.prefs.sec_standard_tooltip "Güvenlik düzeyi : Standart">
+<!ENTITY torbutton.prefs.sec_safer_tooltip "Güvenlik düzeyi : Daha güvenli">
+<!ENTITY torbutton.prefs.sec_safest_tooltip "Güvenlik düzeyi : En güvenli">
<!ENTITY torbutton.prefs.sec_custom_summary "Tarayıcınız standart olmayan özel güvenlik düzeyi ayarları kullanıyor. Güvenlik ve gizliliğinizi korumak için aşağıdaki varsayılan güvenlik ayarı düzeylerinden birini seçmeniz önerilir.">
-<!ENTITY torbutton.prefs.sec_restore_defaults "Varsayılanları Yükle">
-<!ENTITY torbutton.prefs.sec_advanced_security_settings "Gelişmiş Güvenlik Düzeyi Ayarları…">
-<!ENTITY torbutton.circuit_display.title "Tor Devresi">
-<!ENTITY torbutton.circuit_display.new_circuit "Bu Sitenin Devresini Yenile">
+<!ENTITY torbutton.prefs.sec_restore_defaults "Varsayılanları yükle">
+<!ENTITY torbutton.prefs.sec_advanced_security_settings "Gelişmiş güvenlik düzeyi ayarları…">
+<!ENTITY torbutton.circuit_display.title "Tor devresi">
+<!ENTITY torbutton.circuit_display.new_circuit "Bu sitenin devresini yenile">
<!-- Onion services strings. Strings are kept here for ease of translation. -->
<!ENTITY torbutton.onionServices.authPrompt.tooltip "Onion hizmeti istemi kimlik doğrulama penceresini aç">
diff --git a/chrome/locale/tr/torbutton.properties b/chrome/locale/tr/torbutton.properties
index 2d2da738..25f4a374 100644
--- a/chrome/locale/tr/torbutton.properties
+++ b/chrome/locale/tr/torbutton.properties
@@ -1,18 +1,18 @@
torbutton.circuit_display.internet = İnternet
-torbutton.circuit_display.ip_unknown = Bilinmeyen IP
+torbutton.circuit_display.ip_unknown = IP bilinmiyor
torbutton.circuit_display.onion_site = Onion sitesi
torbutton.circuit_display.this_browser = Bu tarayıcı
torbutton.circuit_display.relay = Aktarıcı
torbutton.circuit_display.tor_bridge = Köprü
-torbutton.circuit_display.unknown_country = Bilinmeyen Ülke
+torbutton.circuit_display.unknown_country = Ülke bilinmiyor
torbutton.circuit_display.guard = Koruma
-torbutton.circuit_display.guard_note = [Koruma] düğümünüz değiştirilemez.
+torbutton.circuit_display.guard_note = [Koruma] aktarıcısı değiştirilemez.
torbutton.circuit_display.learn_more = Ayrıntılı bilgi alın
torbutton.circuit_display.click_to_copy = Kopyalamak için tıklayın
torbutton.circuit_display.copied = Kopyalandı!
torbutton.content_sizer.margin_tooltip = Tor Browser pencerenizin genişlik ve yüksekliğini daha az ayırt edilebilir duruma getirmek için kenar boşlukları ekleyerek kişilerin sizi çevrim içi olarak izleme yeteneğini azaltır.
extensions.torbutton(a)torproject.org.description = Torbutton, Tor ayarlarını yapabileceğiniz ve kişisel tarama verilerinizi hızla ve kolayca silebileceğiniz bir düğme görüntüler.
-torbutton.popup.external.title = Dış bir dosya türü indirilsin mi?
+torbutton.popup.external.title = Bir dış dosya türü indirilsin mi?
torbutton.popup.external.app = Tor Browser bu dosyayı görüntüleyemiyor. Başka bir uygulamayla açmanız gerekecek.\n
torbutton.popup.external.note = Bazı dosya türleri uygulamaların Tor kullanmadan İnternet bağlantısı kurmasına neden olabilir.\n
torbutton.popup.external.suggest = Güvende olmak için, indirilen dosyaları yalnız çevrimdışı iken açmalı ya da Tails benzeri bir Canlı Tor CD ortamı kullanmalısınız.\n
@@ -20,10 +20,10 @@ torbutton.popup.launch = Dosyayı indir
torbutton.popup.cancel = İptal\n
torbutton.popup.dontask = Bundan sonra dosyalar otomatik indirilsin
torbutton.popup.no_newnym = Torbutton size yeni bir güvenli kimlik sağlayamadı. Tor Denetim Kapısına giriş yapılamıyor.\n\nTor Browser Bundle uygulamasını çalıştırdığınızdan emin olun.
-torbutton.security_settings.menu.title = Güvenlik Düzeyi Ayarı
-torbutton.title.prompt_torbrowser = Önemli Torbutton Bilgisi
+torbutton.security_settings.menu.title = Güvenlik düzeyi ayarı
+torbutton.title.prompt_torbrowser = Önemli Torbutton bilgileri
torbutton.popup.prompt_torbrowser = Torbutton şimdi farklı çalışıyor: artık kapatamıyorsunuz.\n\nBu değişikliği yapmamızın nedeni Tor dışında kullanılan başka bir tarayıcıda Torbutton kullanmanın güvenli olmaması. Başka türlü çözemeyeceğimiz birçok sorun vardı.\n\nFirefox tarayıcısını normal olarak kullanmak istiyorsanız, Torbutton uygulamasını kaldırıp Tor Browser Bundle paketini indirebilirsiniz. Tor Browser kişisel gizliliği koruma özellikleri normal Firefox tarayıcısına, hatta Torbutton ile kullanılan Firefox ikilisine göre çok daha üstündür.\n\nTorbutton uygulamasını kaldırmak için, Araçlar->Eklentiler->Uzantılar bölümüne gidin ve Torbutton uygulamasının yanındaki Kaldır düğmesine tıklayın.
-torbutton.popup.short_torbrowser = Önemli Torbutton Bilgisi!\n\nTorbutton artık kapatılamayacak şekilde etkinleştirildi.\n\nAyrıntılı bilgi almak için Torbutton üzerine tıklayın.
+torbutton.popup.short_torbrowser = Önemli Torbutton Bilgileri!\n\nTorbutton artık kapatılamayacak şekilde etkinleştirildi.\n\nAyrıntılı bilgi almak için Torbutton üzerine tıklayın.
torbutton.popup.confirm_plugins = Flash gibi eklentiler gizliliğinizi ve anonim kimliğinizi zedeleyebilir.\n\nBu eklentiler Tor uygulamasını atlatarak geçerli konum ve IP adresinizi ortaya çıkarabilir.\n\nBu eklentileri etkinleştirmek istediğinize emin misiniz?\n
torbutton.popup.never_ask_again = Bir daha sorma
@@ -33,7 +33,7 @@ torbutton.maximize_warning = Tor Browser görüntüsünün tüm ekranı kaplamas
# Canvas permission prompt. Strings are kept here for ease of translation.
canvas.siteprompt=Bu web sitesi (%S) bilgisayarınızı benzersiz olarak tanımlayabilmek için kullanılabilen HTML5 tuvalindeki görsel verilerine erişmeye çalıştı.\n\nTor Browser bu web sitesine HTML5 tuval, görsel verisini göndersin mi?
-canvas.notNow=Şimdi Değil
+canvas.notNow=Şimdi değil
canvas.notNowAccessKey=N
canvas.allow=İleride izin verilsin
canvas.allowAccessKey=A
@@ -42,7 +42,7 @@ canvas.neverAccessKey=e
# Profile/startup error messages. Strings are kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
-profileProblemTitle=%S Profili Sorunu
+profileProblemTitle=%S profili sorunu
profileReadOnly=%S salt okunur bir dosya sisteminden çalıştırılamaz. Lütfen kullanmadan önce %S uygulamasını farklı bir konuma kopyalayın.
profileReadOnlyMac=%S salt okunur bir dosya sisteminden çalıştırılamaz. Lütfen kullanmadan önce %S uygulamasını Masaüstü veya Uygulamalar klasörüne kopyalayın.
profileAccessDenied=%S, profilinize erişemiyor. Lütfen dosya sistemi izinlerini ayarlayarak yeniden deneyin.
@@ -54,55 +54,55 @@ profileMigrationFailed=Var olan %S profiliniz aktarılamadı.\nYeni ayarlar kull
updateDownloadingPanelUILabel=%S güncellemesi indiriliyor
# .Onion Page Info prompt. Strings are kept here for ease of translation.
-pageInfo_OnionEncryptionWithBitsAndProtocol=Bağlantı Şifreli (Onion Hizmeti, %1$S, %2$S bit anahtarlar, %3$S)
-pageInfo_OnionEncryption=Bağlantı Şifreli (Onion Hizmeti)
-pageInfo_OnionName=Onion Adı:
+pageInfo_OnionEncryptionWithBitsAndProtocol=Bağlantı şifreli (Onion hizmeti, %1$S, %2$S bit anahtarlar, %3$S)
+pageInfo_OnionEncryption=Bağlantı şifreli (Onion hizmeti)
+pageInfo_OnionName=Onion adı:
# Onion services strings. Strings are kept here for ease of translation.
onionServices.learnMore=Ayrıntılı bilgi alın
onionServices.errorPage.browser=Tarayıcı
onionServices.errorPage.network=Ağ
-onionServices.errorPage.onionSite=Onion Sitesi
+onionServices.errorPage.onionSite=Onion sitesi
# LOCALIZATION NOTE: In the longDescription strings, %S will be replaced with
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
-onionServices.descNotFound.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.descNotFound.header=Onion Sitesi Bulunamadı
+onionServices.descNotFound.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.descNotFound.header=Onion sitesi bulunamadı
onionServices.descNotFound=Onion sitesi büyük olasılıkla çevrimdışı. Onion sitesinin yöneticisi ile görüşün.
onionServices.descNotFound.longDescription=Ayrıntılar: %S — İstenilen onion hizmetinin tanımlayıcısı karma kitaplığında bulunamadı. Bu nedenle hizmete istemci tarafından erişlemiyor.
# Tor SOCKS error 0xF1:
-onionServices.descInvalid.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.descInvalid.header=Onion Sitesine Erişilemedi
+onionServices.descInvalid.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.descInvalid.header=Onion sitesine erişilemedi
onionServices.descInvalid=Bir iç hata nedeniyle onion sitesine erişilemiyor.
onionServices.descInvalid.longDescription=Ayrıntılar: %S — İstenilen onion hizmetinin tanımlayıcısı işlenemedi ya da imza doğrulanamadı.
# Tor SOCKS error 0xF2:
-onionServices.introFailed.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.introFailed.header=Onion Sitesinin Bağlantısı Kesildi
+onionServices.introFailed.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.introFailed.header=Onion sitesinin bağlantısı kesildi
onionServices.introFailed=Onion sitesi büyük olasılıkla çevrimdışı. Onion sitesinin yöneticisi ile görüşün.
onionServices.introFailed.longDescription=Ayrıntılar: %S — Giriş tamamlanamadı. Tanımlayıcı bulunmuş olsa da hizmet artık bu giriş noktasına bağlı değil. Büyük olasılıkla hizmet ya tanımlayıcısını değiştirdi ya da şu anda çalışmıyor.
# Tor SOCKS error 0xF3:
-onionServices.rendezvousFailed.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.rendezvousFailed.header=Onion Sitesi ile Bağlantı Kurulamadı
+onionServices.rendezvousFailed.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.rendezvousFailed.header=Onion sitesi ile bağlantı kurulamadı
onionServices.rendezvousFailed=Onion sitesi meşgul ya da Tor ağının yükü fazla. Daha sonra yeniden deneyin.
onionServices.rendezvousFailed.longDescription=Ayrıntılar: %S — İstemci hizmet ile görüşmeyi başlatamadı. Bu durum istemcinin bağlantı kurulumunu tamamlayamadığı anlamına gelir.
# Tor SOCKS error 0xF4:
-onionServices.clientAuthMissing.pageTitle=Kimlik Doğrulaması Gerekli
-onionServices.clientAuthMissing.header=Onion Sitesi Kimlik Doğrulaması İstiyor
+onionServices.clientAuthMissing.pageTitle=Kimlik doğrulaması gerekli
+onionServices.clientAuthMissing.header=Onion sitesi kimlik doğrulaması istiyor
onionServices.clientAuthMissing=Onion sitesine erişmek için bir anahtar gerekiyor ancak herhangi bir anahtar belirtilmemiş..
onionServices.clientAuthMissing.longDescription=Ayrıntılar: %S — İstemci istenilen onion hizmeti tanımlayıcısını indirdi ancak istemci kimlik doğrulama bilgileri eksik olduğundan, içeriğin şifresini çözemedi.
# Tor SOCKS error 0xF5:
-onionServices.clientAuthIncorrect.pageTitle=Kimlik Doğrulanamadı
-onionServices.clientAuthIncorrect.header=Onion Sitesinde Kimlik Doğrulanamadı
+onionServices.clientAuthIncorrect.pageTitle=Kimlik doğrulanamadı
+onionServices.clientAuthIncorrect.header=Onion sitesinde kimlik doğrulanamadı
onionServices.clientAuthIncorrect=Belirtilen anahtar hatalı ya da kullanımdan kaldırılmış. Onion sitesinin yöneticisi ile görüşün.
onionServices.clientAuthIncorrect.longDescription=Ayrıntılar: %S — İstemci istenilen onion hizmeti tanımlayıcısını indirebildi ancak belirtilen kimlik doğrulama bilgisi ile içeriğinin şifresini çözemedi. Bu durum erişimin kaldırıldığı anlamına gelebilir.
# Tor SOCKS error 0xF6:
-onionServices.badAddress.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.badAddress.header=Onion Sitesi Adresi Geçersiz
+onionServices.badAddress.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.badAddress.header=Onion sitesi adresi geçersiz
onionServices.badAddress=Belirtilen onion sitesi adresi geçersiz. Lütfen adresi doğru yazdığından emin olun.
onionServices.badAddress.longDescription=Ayrıntılar: %S — Belirtilen .onion adresi geçersiz. Bu hata şunlardan dolayısıyla görülür: Adres sağlaması doğru değil, ed25519 herkese açık anahtarı geçersiz ya da kodlama geçersiz.
# Tor SOCKS error 0xF7:
-onionServices.introTimedOut.pageTitle=Onion Sitesi Yüklenirken Sorun Çıktı
-onionServices.introTimedOut.header=Onion Sitesi Devresi Oluşturulurken Zaman Aşımı
+onionServices.introTimedOut.pageTitle=Onion sitesi yüklenirken sorun çıktı
+onionServices.introTimedOut.header=Onion sitesi devresi oluşturulurken zaman aşımı
onionServices.introTimedOut=Onion sitesi ile bağlantı kurulamadı. Büyük olasılıkla ağ bağlantısı kötü.
onionServices.introTimedOut.longDescription=Ayrıntılar: %S — İstenilen onion hizmeti ile görüşme devresi kurulurken işlem zaman aşımına uğradı.
#
@@ -113,18 +113,18 @@ onionServices.authPrompt.done=Tamam
onionServices.authPrompt.doneAccessKey=d
onionServices.authPrompt.invalidKey=Lütfen geçerli bir anahtar yazın (52 base32 karakteri ya da 44 base64 karakteri)
onionServices.authPrompt.failedToSetKey=Tor, anahtarınız ile yapılandırılamadı
-onionServices.authPreferences.header=Onion Hizmetleri Kimlik Doğrulaması
+onionServices.authPreferences.header=Onion hizmetleri kimlik doğrulaması
onionServices.authPreferences.overview=Bazı onion hizmetleri ne erişmek için bir anahtar (bir tür parola) kullanarak kimliğinizi belirtmeniz gerekir.
-onionServices.authPreferences.savedKeys=Kaydedilmiş Anahtarlar…
-onionServices.authPreferences.dialogTitle=Onion Hizmeti Anahtarları
+onionServices.authPreferences.savedKeys=Kaydedilmiş anahtarlar…
+onionServices.authPreferences.dialogTitle=Onion hizmeti anahtarları
onionServices.authPreferences.dialogIntro=Bilgisayarınıza şu onion siteleri için kayıtlı anahtarlar var
-onionServices.authPreferences.onionSite=Onion Sitesi
+onionServices.authPreferences.onionSite=Onion sitesi
onionServices.authPreferences.onionKey=Anahtar
onionServices.authPreferences.remove=Sil
-onionServices.authPreferences.removeAll=Tümünü Sil
+onionServices.authPreferences.removeAll=Tümünü sil
onionServices.authPreferences.failedToGetKeys=Anahtarlar Tor üzerinden alınamadı
onionServices.authPreferences.failedToRemoveKey=Anahtar silinemedi
-onionServices.v2Deprecated.pageTitle=V2 Onion Sitelerinin Kullanımdan Kaldırılması Uyarısı
+onionServices.v2Deprecated.pageTitle=2. sürüm Onion sitelerinin kullanımdan kaldırılması uyarısı
onionServices.v2Deprecated.header=2. sürüm Onion siteleri yakında kullanımdan kaldırılacak
onionServices.v2Deprecated=Bu onion sitesine yakında erişilemeyecek. Lütfen site yöneticisine onion hizmetini yükseltmesini bildirin.
onionServices.v2Deprecated.longDescription=Tor, 2021 Temmuz ayından başlayarak onion hizmetlerinin 2. sürümüne destek vermeyi bırakacak. O nedenle bu onion sitesine bu adresten erişilemeyecek. Sitenin yöneticisi iseniz en kısa zamanda onion hizmetini 3. sürüme yükseltin.
@@ -134,23 +134,23 @@ onionServices.v2Deprecated.tooltip=Bu onion sitesine yakında erişilemeyecek
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onion sitelerine öncelik verilsin
onionLocation.alwaysPrioritizeAccessKey=a
-onionLocation.notNow=Şimdi Değil
+onionLocation.notNow=Şimdi değil
onionLocation.notNowAccessKey=n
onionLocation.description=Bu sitenin Tor ağı üzerinde onion hizmetleri ile sunulan daha özel ve güvenli bir sürümü var. Onion hizmetleri web sitesi yayıncıları ve ziyaretçilerinin sansürden ve izlenmekten kaçınmasına yardımcı olur.
-onionLocation.tryThis=Onion Hizmetlerini Deneyin
+onionLocation.tryThis=Onion hizmetlerini deneyin
onionLocation.onionAvailable=.onion sitesi var
onionLocation.learnMore=Ayrıntılı bilgi alın…
onionLocation.always=Her zaman
onionLocation.askEverytime=Her defasında sorulsun
onionLocation.prioritizeOnionsDescription=Bilindiğinde .onion sitelerine öncelik verilsin.
-onionLocation.onionServicesTitle=Onion Hizmetleri
+onionLocation.onionServicesTitle=Onion hizmetleri
# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Güvenli olmayan bir web sitesinden bir kripto para birimi adresi (%S) kopyalandı. Adres değiştirilmiş olabilir.
cryptoSafetyPrompt.whatCanHeading=Bu konuda ne yapabilirsiniz?
cryptoSafetyPrompt.whatCanBody=Güvenli bir bağlantı kurmak için bağlantı devresini yenilemeyi deneyebilir ya da riski kabul ederek bu uyarıyı yok sayabilirsiniz.
cryptoSafetyPrompt.learnMore=Ayrıntılı bilgi alın
-cryptoSafetyPrompt.primaryAction=Sekmenin Devresini Yenile
+cryptoSafetyPrompt.primaryAction=Sekmenin devresini yenile
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Uyarıyı Yok Say
+cryptoSafetyPrompt.secondaryAction=Uyarıyı yok say
cryptoSafetyPrompt.secondaryActionAccessKey=B
1
0
commit ed8c1e70dd8fb1ee90d6b3694e502e3588769b27
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 22:12:44 2021 +0000
Translations update
---
src/chrome/locale/sq/network-settings.dtd | 2 +-
src/chrome/locale/tr/network-settings.dtd | 52 ++++++++++++++---------------
src/chrome/locale/tr/torlauncher.properties | 12 +++----
3 files changed, 33 insertions(+), 33 deletions(-)
diff --git a/src/chrome/locale/sq/network-settings.dtd b/src/chrome/locale/sq/network-settings.dtd
index 98b9041..b96babb 100644
--- a/src/chrome/locale/sq/network-settings.dtd
+++ b/src/chrome/locale/sq/network-settings.dtd
@@ -67,7 +67,7 @@
<!ENTITY torPreferences.torSettingsDescription "Shfletuesi Tor e kalon trafikun tuaj përmes Rrjetit Tor, i mbajtur në këmbë nga mijëra vullnetarë anembanë botës." >
<!ENTITY torPreferences.learnMore "Mësoni Më Tepër">
<!ENTITY torPreferences.quickstart "Nisje e shpejtë">
-<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartDescription "Quickstart-i i lejon Shfletuesit Tor të lidhet automatikisht.">
<!ENTITY torPreferences.quickstartCheckbox "Lidhu përherë automatikisht">
<!ENTITY torPreferences.bridges "Ura">
<!ENTITY torPreferences.bridgesDescription "Urat ju ndihmojnë të përdorni Rrjetin Tor në vende ku Tor-i është i bllokuar. Në varësi të vendit ku ndodheni, një urë mund të punojë më mirë se një tjetër.">
diff --git a/src/chrome/locale/tr/network-settings.dtd b/src/chrome/locale/tr/network-settings.dtd
index f654056..56a6251 100644
--- a/src/chrome/locale/tr/network-settings.dtd
+++ b/src/chrome/locale/tr/network-settings.dtd
@@ -1,43 +1,43 @@
-<!ENTITY torsettings.dialog.title "Tor Ağı Ayarları">
-<!ENTITY torsettings.wizard.title.default "Tor Ağına Bağlan">
-<!ENTITY torsettings.wizard.title.configure "Tor Ağı Ayarları">
+<!ENTITY torsettings.dialog.title "Tor ağı ayarları">
+<!ENTITY torsettings.wizard.title.default "Tor ağı ile bağlantı kur">
+<!ENTITY torsettings.wizard.title.configure "Tor ağı ayarları">
<!ENTITY torsettings.wizard.title.connecting "Bağlantı kuruluyor">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Dili">
+<!ENTITY torlauncher.localePicker.title "Tor Browser dili">
<!ENTITY torlauncher.localePicker.prompt "Lütfen bir dil seçin.">
<!-- For "first run" wizard: -->
-<!ENTITY torSettings.connectPrompt "Tor ağı ile bağlantı kurmak için "Bağlan" üzerine tıklayın.">
+<!ENTITY torSettings.connectPrompt "Tor ağı ile bağlantı kurmak için "Bağlantı kur" üzerine tıklayın.">
<!ENTITY torSettings.configurePrompt "Tor ağı ile bağlantı kurulmasını engelleyen bir ülkede bulunuyorsanız (Çin, İran, Suriye gibi) ya da vekil sunucu kullanılması gereken özel bir ağdan bağlantı kuruyorsanız, ağ ayarlarını yapmak için "Yapılandır" üzerine tıklayın.">
<!ENTITY torSettings.configure "Yapılandır">
-<!ENTITY torSettings.connect "Bağlan">
+<!ENTITY torSettings.connect "Bağlantı kur">
<!-- Other: -->
<!ENTITY torsettings.startingTor "Tor uygulamasının başlaması bekleniyor…">
-<!ENTITY torsettings.restartTor "Tor Uygulamasını Yeniden Başlat">
-<!ENTITY torsettings.reconfigTor "Yeniden Yapılandır">
+<!ENTITY torsettings.restartTor "Tor uygulamasını yeniden başlat">
+<!ENTITY torsettings.reconfigTor "Yeniden yapılandır">
<!ENTITY torsettings.discardSettings.prompt "Tor Köprülerini yapılandırdınız ya da yerel vekil sunucu ayarları girdiniz.  Tor ağı ile doğrudan bağlantı kurmak için bu ayarlar kaldırılmalıdır.">
-<!ENTITY torsettings.discardSettings.proceed "Ayarları Kaldır ve Bağlan">
+<!ENTITY torsettings.discardSettings.proceed "Ayarları kaldır ve bağlantı kur">
<!ENTITY torsettings.optional "İsteğe bağlı">
<!ENTITY torsettings.useProxy.checkbox "İnternet bağlantısı kurmak için bir vekil sunucu kullanıyorum">
-<!ENTITY torsettings.useProxy.type "Vekil Sunucu Türü">
+<!ENTITY torsettings.useProxy.type "Vekil sunucu türü">
<!ENTITY torsettings.useProxy.type.placeholder "vekil sunucu türünü seçin">
<!ENTITY torsettings.useProxy.address "Adres">
<!ENTITY torsettings.useProxy.address.placeholder "IP adresi ya da sunucu adı">
-<!ENTITY torsettings.useProxy.port "Kapı No">
-<!ENTITY torsettings.useProxy.username "Kullanıcı Adı">
+<!ENTITY torsettings.useProxy.port "Kapı no">
+<!ENTITY torsettings.useProxy.username "Kullanıcı adı">
<!ENTITY torsettings.useProxy.password "Parola">
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
<!ENTITY torsettings.firewall.checkbox "Bu bilgisayarda yalnız belirli kapı numaralarından bağlantı kurulmasına izin veren bir güvenlik duvarı bulunuyor">
-<!ENTITY torsettings.firewall.allowedPorts "Kullanılabilecek Kapı Numaraları">
+<!ENTITY torsettings.firewall.allowedPorts "Kullanılabilecek kapı numaraları">
<!ENTITY torsettings.useBridges.checkbox "Bulunduğum ülkede Tor ağı engelleniyor">
<!ENTITY torsettings.useBridges.default "Hazır köprülerden seçilsin">
<!ENTITY torsettings.useBridges.default.placeholder "bir köprü seçin">
@@ -45,16 +45,16 @@
<!ENTITY torsettings.useBridges.captchaSolution.placeholder "Görseldeki karakterleri yazın">
<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "Yeni bir güvenlik kodu isteyin">
<!ENTITY torsettings.useBridges.captchaSubmit "Gönder">
-<!ENTITY torsettings.useBridges.custom "Bildiğim Bir Köprüyü Kullanacağım">
+<!ENTITY torsettings.useBridges.custom "Bildiğim bir köprüyü kullanacağım">
<!ENTITY torsettings.useBridges.label "Güvenli bir kaynaktan aldığınız köprü bilgilerini yazın.">
<!ENTITY torsettings.useBridges.placeholder "adres:kapı numarası şeklinde yazın (her satıra bir tane)">
-<!ENTITY torsettings.copyLog "Tor Günlüğünü Panoya Kopyala">
+<!ENTITY torsettings.copyLog "Tor günlüğünü panoya kopyala">
-<!ENTITY torsettings.proxyHelpTitle "Vekil Sunucu Yardımı">
+<!ENTITY torsettings.proxyHelpTitle "Vekil sunucu yardımı">
<!ENTITY torsettings.proxyHelp1 "Bir kurum, okul ya da üniversite ağı aracılığıyla bağlantı kurarken yerel bir vekil sunucu gereklidir. Bir vekil sunucu kullanıp kullanmamanız gerektiğinden emin değilseniz, bilgisayarınızın ağa bağlantı şeklini anlamak için aynı ağdaki başka bir web tarayıcısının İnternet ayarlarına bakın ya da sisteminizin ağ ayarlarını gözden geçirin.">
-<!ENTITY torsettings.bridgeHelpTitle "Köprü Aktarıcı Yardımı">
+<!ENTITY torsettings.bridgeHelpTitle "Köprü aktarıcı yardımı">
<!ENTITY torsettings.bridgeHelp1 "Köprüler, Tor ağı ile bağlantı kurulmasının engellenmesini zorlaştıran ve herkese açık olarak listelenmeyen aktarıcılardır.  Her köprü türü engellemeden kaçınmak için farklı bir yöntem kullanır.  Obfs köprüleri, ağ trafiğinizi rastgele gürültü gibi gösterir. Meek köprüleri ise, trafiğinizi Tor ağı ile değil o hizmet ile bağlantı kurulmuş gibi gösterir.">
<!ENTITY torsettings.bridgeHelp2 "Bazı ülkelerin Tor ağını engellemeye çalışması nedeniyle bazı köprüler bazı ülkelerde çalışırken başka ülkelerde çalışmayabilir.  Ülkenizde hangi köprülerin çalışacağından emin değilseniz, torproject.org/about/contact.html#support adresine bakabilirsiniz.">
@@ -63,33 +63,33 @@
<!-- #31286 about:preferences strings -->
<!ENTITY torPreferences.categoryTitle "Tor">
-<!ENTITY torPreferences.torSettings "Tor Ayarları">
+<!ENTITY torPreferences.torSettings "Tor ayarları">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser sizi dünyada binlerce gönüllü tarafından işletilen Tor ağına bağlar." >
-<!ENTITY torPreferences.learnMore "Ayrıntılı Bilgi Alın">
+<!ENTITY torPreferences.learnMore "Ayrıntılı bilgi alın">
<!ENTITY torPreferences.quickstart "Hızlı başlatma">
-<!ENTITY torPreferences.quickstartDescription "Hızlı başlatma ile Tor Browser otomatik olarak bağlanır.">
+<!ENTITY torPreferences.quickstartDescription "Hızlı başlatma ile Tor Browser otomatik olarak bağlantı kurar.">
<!ENTITY torPreferences.quickstartCheckbox "Her zaman otomatik olarak bağlantı kurulsun">
<!ENTITY torPreferences.bridges "Köprüler">
<!ENTITY torPreferences.bridgesDescription "Köprüler Tor bağlantısının engellendiği yerlerden Tor ağına erişmek için kullanılır.. Bulunduğunuz konuma göre bir köprü türü diğerinden daha uygun olabilir.">
<!ENTITY torPreferences.useBridge "Bir köprü kullanılsın">
-<!ENTITY torPreferences.requestNewBridge "Yeni Köprü İsteğinde Bulun...">
+<!ENTITY torPreferences.requestNewBridge "Yeni köprü isteğinde bulun...">
<!ENTITY torPreferences.provideBridge "Bir köprü adresi yazın">
<!ENTITY torPreferences.advanced "Gelişmiş">
<!ENTITY torPreferences.advancedDescription "Tor Browser uygulamasının İnternet bağlantısını yapılandırın.">
<!ENTITY torPreferences.firewallPortsPlaceholder "Virgül ile ayrılmış değerler">
-<!ENTITY torPreferences.requestBridgeDialogTitle "Köprü İsteğinde Bulunun">
+<!ENTITY torPreferences.requestBridgeDialogTitle "Köprü isteğinde bulunun">
<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Köprü veritabanı ile bağlantı kuruluyor. Lütfen bekleyin.">
<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Köprü isteğinde bulunmak için güvenlik denetimini geçin.">
<!ENTITY torPreferences.requestBridgeErrorBadSolution "Çözüm doğru değil. Lütfen yeniden deneyin.">
<!ENTITY torPreferences.viewTorLogs "Tor günlüğü kayıtlarına bakın.">
-<!ENTITY torPreferences.viewLogs "Günlüğü Görüntüle…">
-<!ENTITY torPreferences.torLogsDialogTitle "Tor Günlüğü Kayıtları">
+<!ENTITY torPreferences.viewLogs "Günlüğü görüntüle…">
+<!ENTITY torPreferences.torLogsDialogTitle "Tor günlüğü kayıtları">
<!-- #24746 about:torconnect strings -->
-<!ENTITY torConnect.tryAgain "Yeniden Bağlantı Kurmayı Dene">
+<!ENTITY torConnect.tryAgain "Yeniden bağlantı kurmayı dene">
<!ENTITY torConnect.offline "Çevrimdışı">
<!ENTITY torConnect.connectMessage "Tor ağı ile bağlantı kurulana kadar Tor ayarlarında yapılan değişiklikler etkili olmayacak">
<!ENTITY torConnect.tryAgainMessage "Tor Browser, Tor ağı ile bağlantı kuramadı">
<!ENTITY torConnect.connectingConcise "Bağlantı kuruluyor…">
<!ENTITY torConnect.connectedConcise "Bağlantı kuruldu">
-<!ENTITY torConnect.copyLog "Tor Günlüklerini Kopyala">
+<!ENTITY torConnect.copyLog "Tor günlüklerini kopyala">
diff --git a/src/chrome/locale/tr/torlauncher.properties b/src/chrome/locale/tr/torlauncher.properties
index 5dcd0d8..bcf1272 100644
--- a/src/chrome/locale/tr/torlauncher.properties
+++ b/src/chrome/locale/tr/torlauncher.properties
@@ -6,7 +6,7 @@ torlauncher.error_title=Tor Başlatıcı
torlauncher.tor_exited_during_startup=Tor başlatılırken sonlandı. Bu durum torrc dosyasındaki ya da sisteminizdeki başka bir uygulamada bulunan bir hatadan ya da sorunlu bir donanımdan kaynaklanmış olabilir. Sorun çözülene ve Tor uygulaması yeniden başlatılana kadar Tor Browser çalışmayacak.
torlauncher.tor_exited=Tor, beklenmedik şekilde sonlandı. Bu durum Tor içinde ya da sisteminizdeki başka bir uygulamada bulunan bir hatadan ya da sorunlu bir donanımdan kaynaklanmış olabilir. Yeniden başlatılana kadar Tor Browser hiçbir web sitesine erişemeyecek. Sorun devam ederse lütfen Tor Günlüğünün bir kopyasını destek ekibine gönderin.
torlauncher.tor_exited2=Tor uygulaması yeniden başlatıldığında tarayıcı sekmeleriniz kapatılmayacak.
-torlauncher.tor_controlconn_failed=Tor denetim kapısı ile bağlantı kurulamadı.
+torlauncher.tor_controlconn_failed=Tor denetim kapı numarası ile bağlantı kurulamadı.
torlauncher.tor_failed_to_start=Tor başlatılamadı.
torlauncher.tor_control_failed=Tor denetimi alınamadı.
torlauncher.tor_bootstrap_failed=Tor ağı ile bağlantı kurulamadı.
@@ -33,8 +33,8 @@ torlauncher.error_bridge_bad_default_type=Hazır köprüler %S aktarım türü i
torlauncher.bridge_suffix.meek-amazon=(Çin'de çalışır)
torlauncher.bridge_suffix.meek-azure=(Çin'de çalışır)
-torlauncher.request_a_bridge=Köprü İsteğinde Bulun…
-torlauncher.request_a_new_bridge=Yeni Köprü İsteğinde Bulun...
+torlauncher.request_a_bridge=Köprü isteğinde bulun…
+torlauncher.request_a_new_bridge=Yeni köprü isteğinde bulun...
torlauncher.contacting_bridgedb=Köprü veritabanı ile bağlantı kuruluyor. Lütfen bekleyin.
torlauncher.captcha_prompt=Köprü isteğinde bulunmak için güvenlik denetimini geçin.
torlauncher.bad_captcha_solution=Çözüm doğru değil. Lütfen yeniden deneyin.
@@ -42,8 +42,8 @@ torlauncher.unable_to_get_bridge=Köprü veritabanından bir köprü alınamadı
torlauncher.no_meek=Bu tarayıcı, köprüleri katmak için gerekli meek uygulamasını kullanmak üzere yapılandırılmamış.
torlauncher.no_bridges_available=Maalesef şu anda kullanılabilecek bir köprü yok.
-torlauncher.connect=Bağlan
-torlauncher.restart_tor=Tor Uygulamasını Yeniden Başlat
+torlauncher.connect=Bağlantı kur
+torlauncher.restart_tor=Tor uygulamasını yeniden başlat
torlauncher.quit=Çık
torlauncher.quit_win=Çıkış
torlauncher.done=Tamamlandı
@@ -94,4 +94,4 @@ torlauncher.nsresult.NS_ERROR_NET_RESET=Sunucu ile bağlantı kesildi.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Sunucu ile bağlantı kurulamadı.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Vekil sunucu ile bağlantı kurulamadı.
-torlauncher.copiedNLogMessagesShort=%S Günlükleri Kopyalandı
+torlauncher.copiedNLogMessagesShort=%S günlükleri kopyalandı
1
0

[tor-browser-build/maint-10.0-android] Add missing Changelog entries
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 3a1199f4f2bb6d28f210ed6b3a88ee9d2d96c6d1
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 21:51:21 2021 +0000
Add missing Changelog entries
---
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 2 ++
1 file changed, 2 insertions(+)
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 1c59fb2..23c9e2b 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -127,6 +127,8 @@ Tor Browser 10.0.5 -- November 27 2020
* Update Fenix to 83.1.0
* Update Tor to 0.4.4.6
* Translations update
+ * Bug 40152: Top Crash: android.database.sqlite.SQLiteConstraintException [tor-browser-build]
+ * Bug 40205: Replace occurrence of EmptyCString with 0-length _ns literal [tor-browser]
* Bug 40212: Add new default bridge [tor-browser]
* Build System
* Android
1
0

30 Jun '21
commit f78a258e3fc802d0616d5ffbf972dd6e341799d1
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 21:49:41 2021 +0000
Add some missing ChangeLog entries
---
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 3 +++
1 file changed, 3 insertions(+)
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index ee59894..cdbeba9 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -36,6 +36,7 @@ Tor Browser 10.0.18 -- June 16 2021
Tor Browser 10.5a16 -- June 5 2021
* All Platforms
+ * Update HTTPS Everywhere to 2021.4.15
* Update NoScript to 11.2.8
* Update Tor to 0.4.6.4-rc
* Bug 40432: Prevent probing installed applications [tor-browser]
@@ -470,6 +471,8 @@ Tor Browser 10.0.5 -- November 27 2020
* Android
* Update Fenix to 83.1.0
* Translations update
+ * Bug 40152: Top Crash: android.database.sqlite.SQLiteConstraintException [tor-browser-build]
+ * Bug 40205: Replace occurrence of EmptyCString with 0-length _ns literal [tor-browser]
* Build System
* Android
* Bug 40126: Update toolchains for Fenix 83 [tor-browser-build]
1
0

30 Jun '21
commit 0d9cd5c944af6bed6d60d65887d1560686bdb808
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 20:49:31 2021 +0000
Add 10.0 changelog entries
---
.../tor-browser/Bundle-Data/Docs/ChangeLog.txt | 44 ++++++++++++++++++++++
1 file changed, 44 insertions(+)
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 9c94409..ee59894 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -16,6 +16,24 @@ Tor Browser 10.5a17 -- June 27 2021
* Android
* Bug 40313: Use apt-get to install openjdk-8 .deb files with their dependencies [tor-browser-build]
+Tor Browser 10.0.18 -- June 16 2021
+ * All Platforms
+ * Update Tor to 0.4.5.9
+ * Android
+ * Update Fenix to 89.1.1
+ * Update NoScript to 11.2.8
+ * Bug 40055: Rebase android-componets patches on 75.0.22 for Fenix 89 [android-components]
+ * Bug 40165: Announce v2 onion service deprecation on about:tor [fenix]
+ * Bug 40166: Hide "Normal" tab (again) and Sync tab in TabTray [fenix]
+ * Bug 40167: Hide "Save to Collection" in menu [fenix]
+ * Bug 40169: Rebase fenix patches to fenix v89.1.1 [fenix]
+ * Bug 40170: Error building tor-browser-89.1.1-10.5-1 [fenix]
+ * Bug 40432: Prevent probing installed applications [tor-browser]
+ * Bug 40470: Rebase 10.0 patches onto 89.0 [tor-browser]
+ * Build System
+ * Android
+ * Bug 40290: Update components for mozilla89-based Fenix [tor-browser-build]
+
Tor Browser 10.5a16 -- June 5 2021
* All Platforms
* Update NoScript to 11.2.8
@@ -39,6 +57,16 @@ Tor Browser 10.5a16 -- June 5 2021
* Android
* Bug 40290: Update components for mozilla89-based Fenix [tor-browser-build]
+Tor Browser 10.0.17 -- June 1 2021
+ * Windows + OS X + Linux
+ * Update Firefox to 78.11.0esr
+ * Update HTTPS Everywhere to 2021.4.15
+ * Update NoScript to 11.2.8
+ * Update Tor to 0.4.5.8
+ * Bug 27002: (Mozilla 1673237) Always allow SVGs on about: pages [tor-browser]
+ * Bug 40432: Prevent probing installed applications [tor-browser]
+ * Bug 40037: Announce v2 onion service deprecation on about:tor [torbutton]
+
Tor Browser 10.5a15 -- April 23 2021
* All Platforms
* Update Tor to 0.4.6.2-alpha
@@ -56,6 +84,22 @@ Tor Browser 10.5a15 -- April 23 2021
* Android
* Bug 40259: Update components for mozilla88-based Fenix [tor-browser-build]
+Tor Browser 10.0.16 -- May 7 2021
+ * Android
+ * Update Fenix to 88.1.3
+ * Update HTTPS Everywhere to 2021.4.15
+ * Update NoScript to 11.2.6
+ * Translations update
+ * Bug 40052: Rebase android-components patches for Fenix 88 [android-components]
+ * Bug 40162: Disable Numbus experiments [fenix]
+ * Bug 40163: Rebase Fenix patches to Fenix 88.1.3 [fenix]
+ * Bug 40423: Disable http/3 [tor-browser]
+ * Bug 40425: Rebase 10.5 patches on 88.0.1 [tor-browser]
+ * Build System
+ * Android
+ * Bug 40259: Update components for mozilla88-based Fenix [tor-browser-build]
+ * Bug 40293: Patch app-services' vendored uniffi_bindgen [tor-browser-build]
+
Tor Browser 10.0.16 -- April 20 2021
* Windows + OS X + Linux
* Update Firefox to 78.10.0esr
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit b0c9aa0139e57a290b387942c461e2ae1b1a9bec
Author: Richard Pospesel <richard(a)torproject.org>
Date: Tue Jun 29 15:43:36 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/themes/shared/onionPattern.css | 3 +++
1 file changed, 3 insertions(+)
diff --git a/browser/themes/shared/onionPattern.css b/browser/themes/shared/onionPattern.css
index ac1af7b8d65e..c605a4b4f59e 100644
--- a/browser/themes/shared/onionPattern.css
+++ b/browser/themes/shared/onionPattern.css
@@ -19,6 +19,8 @@
display: flex;
justify-content: center;
overflow-x: hidden;
+ pointer-events: none; /* for some reason, elements with overflow-x: hidden set become focusable */
+
margin: 0 auto;
}
@@ -28,6 +30,7 @@
height: calc((2 + var(--sqrt3)) * var(--onion-radius, 50px)); /* room for 2 rows of circles */
flex-shrink: 0;
overflow-x: hidden; /* clip extra circles on the sides */
+ pointer-events: none; /* for some reason, elements with overflow-x: hidden set become focusable */
}
.onion-pattern-row {
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40495' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 85ca6e359d6b8d3eb21d4777359a004aec978ba2
Merge: 5488b6499042 b0c9aa0139e5
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 19:43:16 2021 +0000
Merge remote-tracking branch 'richardgl/40495' into tor-browser-78.11.0esr-10.5-1
browser/themes/shared/onionPattern.css | 3 +++
1 file changed, 3 insertions(+)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit fc22d11226d7be2dfd16f10eb8d7b939ae6cccd1
Author: Richard Pospesel <richard(a)torproject.org>
Date: Tue Jun 29 14:43:22 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/base/content/aboutNetError.js | 5 +--
browser/components/BrowserGlue.jsm | 22 ++++++----
browser/components/torconnect/TorConnectParent.jsm | 11 -----
browser/modules/TorConnect.jsm | 47 ++++++++++++++++++++++
browser/modules/moz.build | 1 +
toolkit/mozapps/update/UpdateService.jsm | 43 ++++++++++++++++++++
toolkit/xre/nsAppRunner.cpp | 7 +---
7 files changed, 108 insertions(+), 28 deletions(-)
diff --git a/browser/base/content/aboutNetError.js b/browser/base/content/aboutNetError.js
index b85ba74217cb..6844154e16e3 100644
--- a/browser/base/content/aboutNetError.js
+++ b/browser/base/content/aboutNetError.js
@@ -198,11 +198,8 @@ async function initPage() {
var err = getErrorCode();
// proxyConnectFailure because no-tor running daemon would return this error
- // netOffline because we do not want to show the offline page (where users can disable offline-mode)
- // when we are 'offline' (offline mode is disabled after successful bootstrapping in
- // TorConnectParent)
if (
- (err === "proxyConnectFailure" || err === "netOffline") &&
+ (err === "proxyConnectFailure") &&
(await RPMSendQuery("ShouldShowTorConnect"))
) {
document.location.replace("about:torconnect");
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index adc8e5edb07a..7c832f62386e 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -17,6 +17,14 @@ const { AppConstants } = ChromeUtils.import(
"resource://gre/modules/AppConstants.jsm"
);
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+
+const { TorConnect } = ChromeUtils.import(
+ "resource:///modules/TorConnect.jsm"
+);
+
ChromeUtils.defineModuleGetter(
this,
"ActorManagerParent",
@@ -2506,23 +2514,23 @@ BrowserGlue.prototype = {
{
task: () => {
- if (Services.io.offline === false) {
+ if (TorProtocolService.isBootstrapDone()) {
// we will take this path when the user is using the legacy tor launcher
OnionAliasStore.init();
} else {
- // this path is taken when using about:torconnect, we start in offline mode
- // and only switch to online after bootstrapping completes
- const topic = "network:offline-status-changed";
- let offlineStatusChangedObserver = {
+ // this path is taken when using about:torconnect, we wait to init
+ // after we are bootstrapped and connected to tor
+ const topic = "torconnect:bootstrap-complete";
+ let bootstrapObserver = {
observe(aSubject, aTopic, aData) {
- if (aTopic === topic && aData === "online") {
+ if (aTopic === topic) {
OnionAliasStore.init();
// we only need to init once, so remove ourselves as an obvserver
Services.obs.removeObserver(this, topic);
}
}
};
- Services.obs.addObserver(offlineStatusChangedObserver, topic);
+ Services.obs.addObserver(bootstrapObserver, topic);
}
},
},
diff --git a/browser/components/torconnect/TorConnectParent.jsm b/browser/components/torconnect/TorConnectParent.jsm
index cd574ada4da1..f775507a744f 100644
--- a/browser/components/torconnect/TorConnectParent.jsm
+++ b/browser/components/torconnect/TorConnectParent.jsm
@@ -45,17 +45,6 @@ class TorConnectParent extends JSWindowActorParent {
obj.handled = true;
}
self.sendAsyncMessage(aTopic, obj);
-
- // we need to tell the IOService that we are not online
- // setting offline to false will make the io service send out
- // 'network:offline-status-changed' message to observers
- // the app updater (among other things) listens for this message
- // and will attempt to check for updates when receiving this message
- // to recover from a previously failed attempt
- if (aTopic === kTorBootstrapStatusTopic &&
- obj.PROGRESS === 100) {
- Services.io.offline = false;
- }
},
};
diff --git a/browser/modules/TorConnect.jsm b/browser/modules/TorConnect.jsm
new file mode 100644
index 000000000000..2b8cd15e3b62
--- /dev/null
+++ b/browser/modules/TorConnect.jsm
@@ -0,0 +1,47 @@
+"use strict";
+
+var EXPORTED_SYMBOLS = ["TorConnect"];
+
+const { Services } = ChromeUtils.import(
+ "resource://gre/modules/Services.jsm"
+);
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+
+// TODO: move the bootstrap state management out of each of the individual
+// about:torconnect pages and stick it here
+var TorConnect = (() => {
+ let retval = {
+ init : function() {
+ let topics = [
+ "TorBootstrapStatus",
+ ];
+
+ for(const topic of topics) {
+ Services.obs.addObserver(this, topic);
+ }
+ },
+
+ observe: function(subject, topic, data) {
+ switch(topic) {
+ case "TorBootstrapStatus":
+ const obj = subject?.wrappedJSObject;
+ if (obj?.PROGRESS === 100) {
+ Services.obs.notifyObservers(null, "torconnect:bootstrap-complete");
+ }
+ break;
+ default:
+ // ignore
+ break;
+ }
+ },
+
+ shouldShowTorConnect : function() {
+ return TorProtocolService.shouldShowTorConnect();
+ },
+ };
+ retval.init();
+ return retval;
+})(); /* TorConnect */
\ No newline at end of file
diff --git a/browser/modules/moz.build b/browser/modules/moz.build
index f2c9dabdddbe..7f091e0e7711 100644
--- a/browser/modules/moz.build
+++ b/browser/modules/moz.build
@@ -155,6 +155,7 @@ EXTRA_JS_MODULES += [
'TabUnloader.jsm',
'ThemeVariableMap.jsm',
'TopSiteAttribution.jsm',
+ 'TorConnect.jsm',
'TorProcessService.jsm',
'TorProtocolService.jsm',
'TorStrings.jsm',
diff --git a/toolkit/mozapps/update/UpdateService.jsm b/toolkit/mozapps/update/UpdateService.jsm
index 1fb397373151..5bd778ce47e2 100644
--- a/toolkit/mozapps/update/UpdateService.jsm
+++ b/toolkit/mozapps/update/UpdateService.jsm
@@ -12,6 +12,11 @@ const { AppConstants } = ChromeUtils.import(
const { AUSTLMY } = ChromeUtils.import(
"resource://gre/modules/UpdateTelemetry.jsm"
);
+
+const { TorProtocolService } = ChromeUtils.import(
+ "resource:///modules/TorProtocolService.jsm"
+);
+
const {
Bits,
BitsRequest,
@@ -201,6 +206,7 @@ const INVALID_UPDATER_STATUS_CODE = 99;
// Custom update error codes
const BACKGROUNDCHECK_MULTIPLE_FAILURES = 110;
const NETWORK_ERROR_OFFLINE = 111;
+const PROXY_SERVER_CONNECTION_REFUSED = 2152398920;
// Error codes should be < 1000. Errors above 1000 represent http status codes
const HTTP_ERROR_OFFSET = 1000;
@@ -2220,6 +2226,9 @@ UpdateService.prototype = {
case "network:offline-status-changed":
this._offlineStatusChanged(data);
break;
+ case "torconnect:bootstrap-complete":
+ this._bootstrapComplete();
+ break;
case "nsPref:changed":
if (data == PREF_APP_UPDATE_LOG || data == PREF_APP_UPDATE_LOG_FILE) {
gLogEnabled; // Assigning this before it is lazy-loaded is an error.
@@ -2640,6 +2649,35 @@ UpdateService.prototype = {
this._attemptResume();
},
+ _registerBootstrapObserver: function AUS__registerBootstrapObserver() {
+ if (this._registeredBootstrapObserver) {
+ LOG(
+ "UpdateService:_registerBootstrapObserver - observer already registered"
+ );
+ return;
+ }
+
+ LOG(
+ "UpdateService:_registerBootstrapObserver - waiting for tor bootstrap to " +
+ "be complete, then forcing another check"
+ );
+
+ Services.obs.addObserver(this, "torconnect:bootstrap-complete");
+ this._registeredBootstrapObserver = true;
+ },
+
+ _bootstrapComplete: function AUS__bootstrapComplete() {
+ Services.obs.removeObserver(this, "torconnect:bootstrap-complete");
+ this._registeredBootstrapObserver = false;
+
+ LOG(
+ "UpdateService:_bootstrapComplete - bootstrapping complete, forcing " +
+ "another background check"
+ );
+
+ this._attemptResume();
+ },
+
onCheckComplete: function AUS_onCheckComplete(request, updates) {
this._selectAndInstallUpdate(updates);
},
@@ -2659,6 +2697,11 @@ UpdateService.prototype = {
AUSTLMY.pingCheckCode(this._pingSuffix, AUSTLMY.CHK_OFFLINE);
}
return;
+ } else if (update.errorCode == PROXY_SERVER_CONNECTION_REFUSED &&
+ !TorProtocolService.isBootstrapDone()) {
+ // Register boostrap observer to try again
+ this._registerBootstrapObserver();
+ return;
}
// Send the error code to telemetry
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 6c8105939fcb..195b3637ca78 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2984,7 +2984,7 @@ bool fire_glxtest_process();
class XREMain {
public:
XREMain()
- : mStartOffline(true),
+ : mStartOffline(false),
mShuttingDown(false)
#ifdef MOZ_HAS_REMOTE
,
@@ -3588,11 +3588,6 @@ int XREMain::XRE_mainInit(bool* aExitFlag) {
CheckArg("new-instance");
#endif
- // revert to start online behaviour when using the legacy tor launcher
- if (EnvHasValue("TOR_USE_LEGACY_LAUNCHER")) {
- mStartOffline = false;
- }
-
ar = CheckArg("offline");
if (ar || EnvHasValue("XRE_START_OFFLINE")) {
mStartOffline = true;
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40490' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 5488b6499042b74a36b7aafec2b4b2e755ef4390
Merge: 19d57bc2c04e fc22d11226d7
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 19:32:53 2021 +0000
Merge remote-tracking branch 'richardgl/40490' into tor-browser-78.11.0esr-10.5-1
browser/base/content/aboutNetError.js | 5 +--
browser/components/BrowserGlue.jsm | 22 ++++++----
browser/components/torconnect/TorConnectParent.jsm | 11 -----
browser/modules/TorConnect.jsm | 47 ++++++++++++++++++++++
browser/modules/moz.build | 1 +
toolkit/mozapps/update/UpdateService.jsm | 43 ++++++++++++++++++++
toolkit/xre/nsAppRunner.cpp | 7 +---
7 files changed, 108 insertions(+), 28 deletions(-)
1
0

[tor-browser-build/master] Revert "fixup! Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal"
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit c7e16bb784a74733549cbcbcedb87b85c550cb9b
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 17:54:15 2021 +0000
Revert "fixup! Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal"
This reverts commit 215c74866903946fa75fe369108562506fcfe5ba.
---
projects/tor-browser/build | 11 +++++++++--
projects/tor-browser/config | 2 +-
2 files changed, 10 insertions(+), 3 deletions(-)
diff --git a/projects/tor-browser/build b/projects/tor-browser/build
index d2b8482..1d2e35b 100644
--- a/projects/tor-browser/build
+++ b/projects/tor-browser/build
@@ -48,7 +48,9 @@ MARTOOLS=$rootdir/mar-tools
mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
tar -C "$TBDIR" -xf [% c('input_files_by_name/obfs4') %]
-tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
+[% IF c("var/snowflake") %]
+ tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
+[% END -%]
tar -C "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]" -xf [% c('input_files_by_name/fonts') %]
@@ -133,7 +135,12 @@ cp -a Bundle-Data/Docs/* "$TBDIR/$DOCSPATH"
tar -C Bundle-Data/[% bundledata_osname %] [% IF ! c("var/namecoin") %]--exclude=*Electrum-NMC* --exclude=*ncprop279*[% END %] -c . | tar -C "$TBDIR[% IF ! c("var/osx") %]/TorBrowser[% END %]" -x
cat Bundle-Data/PTConfigs/[% bundledata_osname %]/torrc-defaults-appendix >> "$TBDIR/$TORCONFIGPATH/torrc-defaults"
-cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
+[% IF ! c("var/snowflake") %]
+ grep -v 'default_bridge\.snowflake' Bundle-Data/PTConfigs/bridge_prefs.js \
+ >> "$GENERATEDPREFSPATH"
+[% ELSE %]
+ cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
+[% END %]
[% IF ! c("var/multi_lingual") %]
echo 'pref("extensions.torlauncher.prompt_for_locale", false);' >> "$GENERATEDPREFSPATH"
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index 1045d90..f98062e 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -75,7 +75,7 @@ input_files:
enable: '[% ! c("var/android") %]'
- project: snowflake
name: snowflake
- enable: '[% ! c("var/android") %]'
+ enable: '[% c("var/snowflake") && ! c("var/android") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] squash! Bug 26961: New user onboarding.
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 19d57bc2c04eed2290354024d9eb4b08779a7b41
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 17:37:11 2021 +0000
squash! Bug 26961: New user onboarding.
Bug 40429: Update Onboarding for 10.5
---
browser/extensions/onboarding/content/Onboarding.jsm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/browser/extensions/onboarding/content/Onboarding.jsm b/browser/extensions/onboarding/content/Onboarding.jsm
index 9f51fb4bd28a..99ec2b45d35f 100644
--- a/browser/extensions/onboarding/content/Onboarding.jsm
+++ b/browser/extensions/onboarding/content/Onboarding.jsm
@@ -909,7 +909,7 @@ class Onboarding {
}
const kOnionURL = "https://3g2upl4pq6kufc4m.onion/"; // DuckDuckGo
- const kLearnMore = "https://www.torproject.org/releases/tor-browser-10-0/";
+ const kLearnMore = "https://www.torproject.org/releases/tor-browser-10-5/";
let handledTourActionClick = false;
switch (id) {
case "onboarding-overlay-button-icon":
1
0

[tor-browser-build/master] fixup! Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit 215c74866903946fa75fe369108562506fcfe5ba
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Jun 30 17:34:12 2021 +0000
fixup! Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal
---
projects/tor-browser/build | 11 ++---------
projects/tor-browser/config | 2 +-
2 files changed, 3 insertions(+), 10 deletions(-)
diff --git a/projects/tor-browser/build b/projects/tor-browser/build
index 1d2e35b..d2b8482 100644
--- a/projects/tor-browser/build
+++ b/projects/tor-browser/build
@@ -48,9 +48,7 @@ MARTOOLS=$rootdir/mar-tools
mv [% c('input_files_by_name/noscript') %] "$TBDIR/$EXTSPATH/{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi"
tar -C "$TBDIR" -xf [% c('input_files_by_name/obfs4') %]
-[% IF c("var/snowflake") %]
- tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
-[% END -%]
+tar -C "$TBDIR" -xf [% c('input_files_by_name/snowflake') -%]
tar -C "$TBDIR[% IF c("var/osx") %]/Contents/Resources[% END %]" -xf [% c('input_files_by_name/fonts') %]
@@ -135,12 +133,7 @@ cp -a Bundle-Data/Docs/* "$TBDIR/$DOCSPATH"
tar -C Bundle-Data/[% bundledata_osname %] [% IF ! c("var/namecoin") %]--exclude=*Electrum-NMC* --exclude=*ncprop279*[% END %] -c . | tar -C "$TBDIR[% IF ! c("var/osx") %]/TorBrowser[% END %]" -x
cat Bundle-Data/PTConfigs/[% bundledata_osname %]/torrc-defaults-appendix >> "$TBDIR/$TORCONFIGPATH/torrc-defaults"
-[% IF ! c("var/snowflake") %]
- grep -v 'default_bridge\.snowflake' Bundle-Data/PTConfigs/bridge_prefs.js \
- >> "$GENERATEDPREFSPATH"
-[% ELSE %]
- cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
-[% END %]
+cat Bundle-Data/PTConfigs/bridge_prefs.js >> "$GENERATEDPREFSPATH"
[% IF ! c("var/multi_lingual") %]
echo 'pref("extensions.torlauncher.prompt_for_locale", false);' >> "$GENERATEDPREFSPATH"
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index f98062e..1045d90 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -75,7 +75,7 @@ input_files:
enable: '[% ! c("var/android") %]'
- project: snowflake
name: snowflake
- enable: '[% c("var/snowflake") && ! c("var/android") %]'
+ enable: '[% ! c("var/android") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
1
0

[tor-browser-build/master] Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal
by sysrqb@torproject.org 30 Jun '21
by sysrqb@torproject.org 30 Jun '21
30 Jun '21
commit f5fa4a2b726475798e988b3f07dbe5dc9bf21afc
Author: gus <gus(a)torproject.org>
Date: Fri Jun 25 20:35:23 2021 -0300
Add Tor Project bookmarks: tb-manual, community portal, donation, bridges db, and support portal
---
.../linux/Data/Browser/profile.default/bookmarks.html | 9 +++++++--
.../mac/TorBrowser/Data/Browser/profile.default/bookmarks.html | 9 +++++++--
.../windows/Data/Browser/profile.default/bookmarks.html | 9 +++++++--
3 files changed, 21 insertions(+), 6 deletions(-)
diff --git a/projects/tor-browser/Bundle-Data/linux/Data/Browser/profile.default/bookmarks.html b/projects/tor-browser/Bundle-Data/linux/Data/Browser/profile.default/bookmarks.html
index 7aa31dd..30e1598 100644
--- a/projects/tor-browser/Bundle-Data/linux/Data/Browser/profile.default/bookmarks.html
+++ b/projects/tor-browser/Bundle-Data/linux/Data/Browser/profile.default/bookmarks.html
@@ -7,11 +7,16 @@
<H1>Bookmarks</H1>
<DL><p>
- <DT><H3 PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$FvPhC3">Bookmarks Toolbar Folder</H3>
-<DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
+ <DT><H3>Tor Project Bookmarks</H3>
+<DD>Helpful bookmarks from the Tor Project
<DL><p>
<DT><A HREF="https://www.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX/
//8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Learn more about Tor</A>
<DT><A HREF="https://blog.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX
///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">The Tor Blog</A>
+ <DT><A HREF="https://support.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Support portal - Get help</A>
+ <DT><A HREF="https://tb-manual.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHz
MAAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Browser Manual</A>
+ <DT><A HREF="https://community.torproject.org" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzM
AAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Community - Get Involved</A>
+ <DT><A HREF="https://donate.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAA
AX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Donate - Keep Tor Strong</A>
+ <DT><A HREF="https://bridges.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Circumvent Censorship, Get Bridges</A>
</DL><p>
<HR>
</DL><p>
diff --git a/projects/tor-browser/Bundle-Data/mac/TorBrowser/Data/Browser/profile.default/bookmarks.html b/projects/tor-browser/Bundle-Data/mac/TorBrowser/Data/Browser/profile.default/bookmarks.html
index 7aa31dd..30e1598 100644
--- a/projects/tor-browser/Bundle-Data/mac/TorBrowser/Data/Browser/profile.default/bookmarks.html
+++ b/projects/tor-browser/Bundle-Data/mac/TorBrowser/Data/Browser/profile.default/bookmarks.html
@@ -7,11 +7,16 @@
<H1>Bookmarks</H1>
<DL><p>
- <DT><H3 PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$FvPhC3">Bookmarks Toolbar Folder</H3>
-<DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
+ <DT><H3>Tor Project Bookmarks</H3>
+<DD>Helpful bookmarks from the Tor Project
<DL><p>
<DT><A HREF="https://www.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX/
//8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Learn more about Tor</A>
<DT><A HREF="https://blog.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX
///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">The Tor Blog</A>
+ <DT><A HREF="https://support.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Support portal - Get help</A>
+ <DT><A HREF="https://tb-manual.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHz
MAAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Browser Manual</A>
+ <DT><A HREF="https://community.torproject.org" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzM
AAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Community - Get Involved</A>
+ <DT><A HREF="https://donate.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAA
AX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Donate - Keep Tor Strong</A>
+ <DT><A HREF="https://bridges.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Circumvent Censorship, Get Bridges</A>
</DL><p>
<HR>
</DL><p>
diff --git a/projects/tor-browser/Bundle-Data/windows/Data/Browser/profile.default/bookmarks.html b/projects/tor-browser/Bundle-Data/windows/Data/Browser/profile.default/bookmarks.html
index 7aa31dd..30e1598 100644
--- a/projects/tor-browser/Bundle-Data/windows/Data/Browser/profile.default/bookmarks.html
+++ b/projects/tor-browser/Bundle-Data/windows/Data/Browser/profile.default/bookmarks.html
@@ -7,11 +7,16 @@
<H1>Bookmarks</H1>
<DL><p>
- <DT><H3 PERSONAL_TOOLBAR_FOLDER="true" ID="rdf:#$FvPhC3">Bookmarks Toolbar Folder</H3>
-<DD>Add bookmarks to this folder to see them displayed on the Bookmarks Toolbar
+ <DT><H3>Tor Project Bookmarks</H3>
+<DD>Helpful bookmarks from the Tor Project
<DL><p>
<DT><A HREF="https://www.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX/
//8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Learn more about Tor</A>
<DT><A HREF="https://blog.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAAAX
///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">The Tor Blog</A>
+ <DT><A HREF="https://support.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Support portal - Get help</A>
+ <DT><A HREF="https://tb-manual.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHz
MAAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Browser Manual</A>
+ <DT><A HREF="https://community.torproject.org" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzM
AAAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Tor Community - Get Involved</A>
+ <DT><A HREF="https://donate.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMAA
AX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Donate - Keep Tor Strong</A>
+ <DT><A HREF="https://bridges.torproject.org/" ICON="data:image/x-icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD///8A////AP///wD///8AOwAUDSQAD2QRAA2ZDQAFyw4ABssjAAuQKAAPZAAcAAn///8A////AP///wD///8A////AP///wD///8AIwAMFmtcZP89NDr/TkRJ/ykhJ/8kIij/KAUV/yoAD/9CHy3/EwAMKf///wD///8A////AP///wD///8AHAAACUw4Qf98cnn//Pz8/9TM1/9dPl3/IBYg/y0fKf9bCzT/NQAX/zoeKP8AAAAE////AP///wD///8A////ACgADSYvJSv/2d/h/+Hd4v9sP17/xsHN/1A3Tf8lGSD/YxM9/2sVRP80DB7/Ty44bv///wD///8A////AP///wAwAAUwSERJ/+jx8v/Xx9P/YDVS/7y+zP9BKEH/LiUs/2ceRf91JFT/Ngke/yYACVj///8A////AP///wD///8ANwAJHFNNUv/h6+z/9PD0/31Zev+GeJL/Rj5X/zAjK/9zL1f/ezFd/y0NGv8mAA42////AP///wD///8A////AFUAAAMVAAqge4GF//v8/P/x7/L/hHCN/1NVbf87KDP/g0Fq/14pSP9PLz3/AAAABP///wD///8A////AP///wD///8AOQAcCQcACpWcoqX/+/39/7PJ0v9oeYn/Ry89/5BVff8+IC//IAANKP///wD///8A////AP///wD///8A////AP///wBGABcLCgAHmXFucv/G4eb/SUhS/109UP9WOkf/WEJIhf///wD///8A////AP///wD///8A////AP///wD///8A////AFUAKgYZAAiGRkNJ/0IyO/9XQkj/KQAIHzMA
AAX///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AMwANFFxMU/9WQEr/PgAMKf///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AD4AFyFWUln/OW5Y/wCobmQAqnEJ////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wCZAGYFQpF3hQteOv8AiVGpGb2BbP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AAD//wMAjF2oB35N8gClYpcAuHEk////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wD///8AANOEHQCvdn8ArGipALJshwC4ezb///8A////AP///wD///8A////AP///wD///8A////AP///wD///8A////AP///wAA/78IANmXNgDFgyMAv4AM////AP///wD///8A//8AAPAPAADgBwAA4AcAAOAHAADgBwAA8AcAAPgPAAD8HwAA/j8AAP5/AAD+fwAA/38AAP//AAD//wAA//8AAA==" LAST_CHARSET="ISO-8859-1" ID="rdf:#$0gnTO1">Circumvent Censorship, Get Bridges</A>
</DL><p>
<HR>
</DL><p>
1
0

[Git][tpo/applications/fenix] Pushed new branch tor-browser-90.0.0b6-10.5-1
by boklm (@boklm) 30 Jun '21
by boklm (@boklm) 30 Jun '21
30 Jun '21
boklm pushed new branch tor-browser-90.0.0b6-10.5-1 at The Tor Project / Applications / fenix
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/tree/tor-browser-90.…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Adding issue template for bugs.
by sysrqb@torproject.org 28 Jun '21
by sysrqb@torproject.org 28 Jun '21
28 Jun '21
commit 9caf8dd94d1f2437abdb0e96be0310a5489e5eb7
Author: Gaba <gaba(a)torproject.org>
Date: Mon Jun 28 11:44:16 2021 -0700
Adding issue template for bugs.
---
.gitlab/issue_templates/UXBug.md | 29 +++++++++++++++++++++++++++++
.gitlab/issue_templates/bug.md | 32 ++++++++++++++++++++++++++++++++
2 files changed, 61 insertions(+)
diff --git a/.gitlab/issue_templates/UXBug.md b/.gitlab/issue_templates/UXBug.md
new file mode 100644
index 000000000000..8e7cb2a5e163
--- /dev/null
+++ b/.gitlab/issue_templates/UXBug.md
@@ -0,0 +1,29 @@
+<!--
+* Use this issue template for reporting a new UX bug.
+-->
+
+### Summary
+**Summarize the bug encountered concisely.**
+
+
+### Steps to reproduce:
+**How one can reproduce the issue - this is very important.**
+
+1. Step 1
+2. Step 2
+3. ...
+
+### What is the current bug behavior?
+**What actually happens.**
+
+
+### What is the expected behavior?
+**What you want to see instead**
+
+
+
+## Relevant logs and/or screenshots
+**Do you have screenshots? Attach them to this ticket please.**
+
+/label ~tor-ux ~needs-investigation ~bug
+/assign @nah
diff --git a/.gitlab/issue_templates/bug.md b/.gitlab/issue_templates/bug.md
new file mode 100644
index 000000000000..6ce85a4864be
--- /dev/null
+++ b/.gitlab/issue_templates/bug.md
@@ -0,0 +1,32 @@
+<!--
+* Use this issue template for reporting a new bug.
+-->
+
+### Summary
+**Summarize the bug encountered concisely.**
+
+
+### Steps to reproduce:
+**How one can reproduce the issue - this is very important.**
+
+1. Step 1
+2. Step 2
+3. ...
+
+### What is the current bug behavior?
+**What actually happens.**
+
+
+### What is the expected behavior?
+**What you want to see instead**
+
+
+
+### Environment
+**Which operating system are you using? For example: Debian GNU/Linux 10.1, Windows 10, Ubuntu Xenial, FreeBSD 12.2, etc.**
+**Which installation method did you use? Distribution package (apt, pkg, homebrew), from source tarball, from Git, etc.**
+
+### Relevant logs and/or screenshots
+
+
+/label ~bug
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 28 Jun '21
by sysrqb@torproject.org 28 Jun '21
28 Jun '21
commit 74739bc2ccf1bb99900ab1b3288aa99c7ef68727
Author: Richard Pospesel <richard(a)torproject.org>
Date: Fri Jun 25 12:03:52 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/components/torconnect/content/aboutTorConnect.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/browser/components/torconnect/content/aboutTorConnect.js b/browser/components/torconnect/content/aboutTorConnect.js
index 1c574a5d07c9..11301fa10cab 100644
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@ -184,10 +184,10 @@ class AboutTorConnect {
}
async connect() {
- // reset the text to original quickstart description
+ // reset the text to original description
// in case we are trying again after an error (clears out error text)
this.elemProgressDesc.textContent =
- this.torStrings.settings.quickstartDescription;
+ this.torStrings.settings.torPreferencesDescription;
this.state = AboutTorConnect.STATE_BOOTSTRAPPING;
const error = await RPMSendQuery("TorConnect");
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40484' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 28 Jun '21
by sysrqb@torproject.org 28 Jun '21
28 Jun '21
commit 533b3100e72d75b8390abe58cd40387192bdb6e1
Merge: c9f997476bba 74739bc2ccf1
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 28 20:06:49 2021 +0000
Merge remote-tracking branch 'richardgl/40484' into tor-browser-78.11.0esr-10.5-1
browser/components/torconnect/content/aboutTorConnect.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
1
0

[Git][tpo/applications/android-components] Pushed new branch android-components-90.0.11-10.5-1
by boklm (@boklm) 27 Jun '21
by boklm (@boklm) 27 Jun '21
27 Jun '21
boklm pushed new branch android-components-90.0.11-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

25 Jun '21
commit a203356d18698e55e157a5f0e64717fc3e3e19ce
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Fri Jun 25 14:19:50 2021 +0000
Update allowed_addons.json, build2.
---
projects/tor-browser/allowed_addons.json | 204 +++++++++++++++----------------
rbm.conf | 2 +-
2 files changed, 103 insertions(+), 103 deletions(-)
diff --git a/projects/tor-browser/allowed_addons.json b/projects/tor-browser/allowed_addons.json
index 9cd6b11..4556886 100644
--- a/projects/tor-browser/allowed_addons.json
+++ b/projects/tor-browser/allowed_addons.json
@@ -17,7 +17,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/13/13299/13299734.png?mo…"
}
],
- "average_daily_users": 609068,
+ "average_daily_users": 626914,
"categories": {
"android": [
"experimental",
@@ -237,10 +237,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.561,
- "bayesian_average": 4.559622274063027,
- "count": 3654,
- "text_count": 1194
+ "average": 4.5638,
+ "bayesian_average": 4.562429320383016,
+ "count": 3705,
+ "text_count": 1201
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/reviews/",
"requires_payment": false,
@@ -337,7 +337,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/darkreader/versions/",
- "weekly_downloads": 21862
+ "weekly_downloads": 23027
},
"notes": null
},
@@ -353,7 +353,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/5/5474/5474073.png?modif…"
}
],
- "average_daily_users": 696905,
+ "average_daily_users": 701105,
"categories": {
"android": [
"security-privacy"
@@ -486,10 +486,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.6659,
- "bayesian_average": 4.663398110551469,
- "count": 2065,
- "text_count": 406
+ "average": 4.6639,
+ "bayesian_average": 4.661394338186861,
+ "count": 2077,
+ "text_count": 409
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/reviews/",
"requires_payment": false,
@@ -523,7 +523,7 @@
"type": "extension",
"url": "https://www.eff.org/https-everywhere",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/https-everywhere/versions/",
- "weekly_downloads": 14011
+ "weekly_downloads": 13589
},
"notes": null
},
@@ -539,7 +539,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/6/6937/6937656.png?modif…"
}
],
- "average_daily_users": 197173,
+ "average_daily_users": 199619,
"categories": {
"android": [
"security-privacy"
@@ -752,9 +752,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.802,
- "bayesian_average": 4.797234472807067,
- "count": 1121,
+ "average": 4.8009,
+ "bayesian_average": 4.796141725881215,
+ "count": 1130,
"text_count": 217
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/reviews/",
@@ -851,7 +851,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/decentraleyes/versions/",
- "weekly_downloads": 4721
+ "weekly_downloads": 4431
},
"notes": null
},
@@ -867,7 +867,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/5/5474/5474073.png?modif…"
}
],
- "average_daily_users": 933634,
+ "average_daily_users": 937932,
"categories": {
"android": [
"security-privacy"
@@ -879,7 +879,7 @@
"contributions_url": "https://www.paypal.me/SupportEFF?utm_content=product-page-contribute&utm_me…",
"created": "2014-05-01T18:23:16Z",
"current_version": {
- "id": 5175365,
+ "id": 5247789,
"compatibility": {
"firefox": {
"min": "52.0",
@@ -890,19 +890,19 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-badger17/versions…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/privacy-badger17/versions…",
"files": [
{
- "id": 3719726,
- "created": "2021-02-02T19:07:00Z",
- "hash": "sha256:a9ab465df193e474416844d968ed36991e855b2bd9d965624045cd73373651a6",
+ "id": 3792149,
+ "created": "2021-06-08T18:48:00Z",
+ "hash": "sha256:72579f77035a5146b7332e39a28063c6bb48ca7284d5b1383cab24dca65372a8",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 1237132,
+ "size": 1379278,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/3719726/privacy_badger-20…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3792149/privacy_badger-20…",
"permissions": [
"tabs",
"http://*/*",
@@ -1338,10 +1338,10 @@
"url": "http://www.gnu.org/licenses/gpl-3.0.html"
},
"release_notes": {
- "en-US": "<ul><li>Added a dark theme. To see it, enable dark mode in operating system or device preferences.</li><li>Added a section to the Widget Replacement tab on the options page to manage the list of widgets that were set to be always allowed on certain sites</li><li>Disabled network prefetching/preloading to improve privacy</li><li>Added replacements for Dailymotion and <a href=\"https://outgoing.prod.mozaws.net/v1/f586f988c08c7656e54a255a11f28fbc10a9ad0…" rel=\"nofollow\">OK.ru</a> video player widgets</li><li>Fixed various site breakages</li><li>Improved translations (Simplified Chinese, Czech, French, Hebrew)</li></ul>"
+ "en-US": "<ul><li>Disabled Google's Federated Learning of Cohorts (FLoC). To learn more, visit <a href=\"https://outgoing.prod.mozaws.net/v1/b53e836b99444d8d9da04dc38e94534a6331295…" rel=\"nofollow\">https://www.eff.org/deeplinks/2021/03/googles-floc-terrible-idea</a></li><li>Improved tracker detection and blocking by looking up known CNAME tracker aliases. Thanks to AdGuard for providing the CNAME DNS data behind this feature.</li><li>You can now see in the popup when first-party protections such as link unwrapping are active on the site you are on</li><li>Fixed various site breakages</li><li>Added Greek and Hungarian translations</li><li>Improved translations (Simplified Chinese, Esperanto, Hebrew, Korean, European Portuguese, Turkish, Swedish)</li></ul>"
},
"reviewed": null,
- "version": "2021.2.2"
+ "version": "2021.6.8"
},
"default_locale": "en-US",
"description": {
@@ -1365,7 +1365,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2021-02-02T19:18:34Z",
+ "last_updated": "2021-06-10T13:59:18Z",
"name": {
"en-US": "Privacy Badger"
},
@@ -1411,10 +1411,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.7917,
- "bayesian_average": 4.788793121051579,
- "count": 1834,
- "text_count": 369
+ "average": 4.7902,
+ "bayesian_average": 4.787290030686736,
+ "count": 1845,
+ "text_count": 370
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/reviews/",
"requires_payment": false,
@@ -1434,7 +1434,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-badger17/versions/",
- "weekly_downloads": 16006
+ "weekly_downloads": 16454
},
"notes": null
},
@@ -1450,7 +1450,7 @@
"picture_url": null
}
],
- "average_daily_users": 4763009,
+ "average_daily_users": 4807454,
"categories": {
"android": [
"security-privacy"
@@ -1462,7 +1462,7 @@
"contributions_url": "",
"created": "2015-04-25T07:26:22Z",
"current_version": {
- "id": 5224615,
+ "id": 5254372,
"compatibility": {
"firefox": {
"min": "57.0",
@@ -1473,19 +1473,19 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/versions/52…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/ublock-origin/versions/52…",
"files": [
{
- "id": 3768975,
- "created": "2021-04-30T14:01:04Z",
- "hash": "sha256:8eccfa436bc5852b91ddb9628dca4bfd0ff5d2a302f2e9e595d801fa228c3975",
+ "id": 3798731,
+ "created": "2021-06-19T15:31:09Z",
+ "hash": "sha256:384f3e5241f87e90c376fb6964842ce204743feed554b8b7dabe09f119ea7d66",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 2781722,
+ "size": 2820672,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/3768975/ublock_origin-1.3…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3798731/ublock_origin-1.3…",
"permissions": [
"dns",
"menus",
@@ -1541,10 +1541,10 @@
"url": "http://www.gnu.org/licenses/gpl-3.0.html"
},
"release_notes": {
- "en-US": "<a href=\"https://outgoing.prod.mozaws.net/v1/e3f0fb79aad48d24933c2312664d2c2ddb9b6c9…" rel=\"nofollow\">Complete release notes</a>.\n\n<b>Closed as fixed:</b>\n\n<b>Firefox 66.0 and earlier.</b>\n\n<ul><li><a href=\"https://outgoing.prod.mozaws.net/v1/ce7103184888b46bb9b994eecefc040917aaa32…" rel=\"nofollow\">Element picker, zapper and procedural filtering not working on facebook.com</a></li></ul>\n<b>Notable commits without en entry in the issue tracker</b>\n\n<ul><li><a href=\"https://outgoing.prod.mozaws.net/v1/623f9bb88e2f9638897e90afb8cd8eb70a0b34e…" rel=\"nofollow\">Better handle network error when fetching sublist</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/7acf95901ef3
82bdab66819d1ce18c42036757d26ee197910e6a094c607c1435/https%3A//github.com/g…" rel=\"nofollow\">Stop autoplay for unset media source with no-large-media-elements</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/d9b8bc963e9aedba4390a9304d27b62e143f601…" rel=\"nofollow\">Use CDN URLs as fall back URLs</a></li></ul>\n<a href=\"https://outgoing.prod.mozaws.net/v1/8de3be3247bb7a5cf133ee29a4eafa70a585262…" rel=\"nofollow\">Commits history since 1.35.0</a>."
+ "en-US": "<a href=\"https://outgoing.prod.mozaws.net/v1/9f806d450f0bb51f8c3a680f27169e335ad8c02…" rel=\"nofollow\">Complete release notes</a>.\n\n<b>Closed as fixed</b>\n\n<ul><li><a href=\"https://outgoing.prod.mozaws.net/v1/00a8778da7c67adfa5cc3bbdc4af6f843f3596f…" rel=\"nofollow\">Bizarre perf drain when ajaxing in 90,000 DOM nodes in a react component</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/976d8b716147c39299242ece7c89c9fe63ce812…" rel=\"nofollow\">Google Tag Manager eventCallback in a populated dataLayer not called</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/e336839918e89ae2b22dce75f2eee4024a6a1b1…" rel=\
"nofollow\">Countering a removeparam filter causes page-redirect problem</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/43e1c2ed2a0c66cac32ae5e137ae885e034369f…" rel=\"nofollow\">Asset viewer shows no space between !#endif and a comment line in uBlock's list</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/55294c2ace343eeb9f6ed323b6464dfd84b4173…" rel=\"nofollow\">Text in Manage Extension Shortcuts includes escaped <code>&shy;</code></a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/73eb512082e3d16e39b466a3099eda65c7e9a20…" rel=\"nofollow\">In popup, the Reload button becomes immediately hidden if re-enabling the large power button too quickly</a></li></ul>\n<b>Notable commits without en entry in the
issue tracker</b>\n\n<ul><li><a href=\"https://outgoing.prod.mozaws.net/v1/a2d4db0757726512fa2da34780b0a274fe4688c…" rel=\"nofollow\">Add ability to linger for <code>remove-class</code> scriptlet</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/05a4025f4e850a5d4150433e8bf515073b7f0c0…" rel=\"nofollow\">Add empty array, object to set-constant scriptlet</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/a99edd7e6e4f330ef91b436b23b8f9401af4fc6…" rel=\"nofollow\">Fix potential exception when casting to string</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/7b3ebbbc13833b075dc0ab0af114ba88c8e1d5a…
/gorhill/uBlock/commit/8cd2a1d263a96421487b39040c1d23eb01169484\" rel=\"nofollow\">Make googletagmanager<em>gtm.js an alias of google-analytics</em>analytics.js</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/e60e518a96d998c94124bb450b8c8f8632f94d3…" rel=\"nofollow\">Ensure getter/setter are called with proper context</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/6645b98ed2caac0283509afccfcadd17182f587…" rel=\"nofollow\">Allow filter list subscription through context menu</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/ec7cc511dc5622187fd057c2e3f9cd8d7579652…" rel=\"nofollow\">Keep reporting last time \"out of date\" lists were up
dated</a></li><li><a href=\"https://outgoing.prod.mozaws.net/v1/4ccf11b8bcfbd1383eda2148f1d038898465774…" rel=\"nofollow\">Fix improper hashing of rules in classic popup panel</a></li></ul>\n<a href=\"https://outgoing.prod.mozaws.net/v1/14f36de2dfb16d9b82b8cef8fce11fd0e504e0f…" rel=\"nofollow\">Commits history since last version</a>."
},
"reviewed": null,
- "version": "1.35.2"
+ "version": "1.36.0"
},
"default_locale": "en-US",
"description": {
@@ -1634,7 +1634,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2021-05-28T12:10:25Z",
+ "last_updated": "2021-06-24T15:15:36Z",
"name": {
"ar": "uBlock Origin",
"bg": "uBlock Origin",
@@ -1779,10 +1779,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.766,
- "bayesian_average": 4.765555015579055,
- "count": 11913,
- "text_count": 3263
+ "average": 4.767,
+ "bayesian_average": 4.766555724017786,
+ "count": 12032,
+ "text_count": 3295
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/reviews/",
"requires_payment": false,
@@ -1837,7 +1837,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/ublock-origin/versions/",
- "weekly_downloads": 109534
+ "weekly_downloads": 114937
},
"notes": null
},
@@ -1853,7 +1853,7 @@
"picture_url": null
}
],
- "average_daily_users": 55640,
+ "average_daily_users": 57089,
"categories": {
"android": [
"photos-media"
@@ -1973,10 +1973,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.5161,
- "bayesian_average": 4.5111086978123645,
- "count": 996,
- "text_count": 378
+ "average": 4.5185,
+ "bayesian_average": 4.513490692203433,
+ "count": 1001,
+ "text_count": 380
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/re…",
"requires_payment": false,
@@ -2004,7 +2004,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/video-background-play-fix/ve…",
- "weekly_downloads": 241
+ "weekly_downloads": 300
},
"notes": null
},
@@ -2020,7 +2020,7 @@
"picture_url": null
}
],
- "average_daily_users": 86848,
+ "average_daily_users": 95664,
"categories": {
"android": [
"experimental",
@@ -2159,10 +2159,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.4939,
- "bayesian_average": 4.478785664998499,
- "count": 326,
- "text_count": 90
+ "average": 4.4818,
+ "bayesian_average": 4.46681046808246,
+ "count": 330,
+ "text_count": 92
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/reviews/",
"requires_payment": false,
@@ -2188,7 +2188,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/privacy-possum/versions/",
- "weekly_downloads": 5865
+ "weekly_downloads": 6894
},
"notes": null
},
@@ -2204,7 +2204,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/12/12929/12929064.png?mo…"
}
],
- "average_daily_users": 167502,
+ "average_daily_users": 170577,
"categories": {
"android": [
"photos-media",
@@ -2218,7 +2218,7 @@
"contributions_url": "https://www.paypal.com/donate?hosted_button_id=GLL4UNSNU6SQN&utm_content=pr…",
"created": "2017-06-17T15:23:33Z",
"current_version": {
- "id": 5222866,
+ "id": 5252115,
"compatibility": {
"firefox": {
"min": "68.0",
@@ -2229,19 +2229,19 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/versions/…",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/search_by_image/versions/…",
"files": [
{
- "id": 3767226,
- "created": "2021-04-27T19:37:13Z",
- "hash": "sha256:2419da33e09e330f7f03af1aa3d5725f54324f74f774fa55dc07a088c979ff96",
+ "id": 3796475,
+ "created": "2021-06-15T18:51:08Z",
+ "hash": "sha256:2601cce6b4f8a767fe85c70e18ca18e797c91f57eb053192e92cd23538255f19",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 653389,
+ "size": 653648,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/3767226/search_by_image-3…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3796475/search_by_image-3…",
"permissions": [
"contextMenus",
"storage",
@@ -2292,7 +2292,7 @@
"en-US": "Learn more about this release from the <a href=\"https://outgoing.prod.mozaws.net/v1/034fc31c913b4c441795892fe3d65db9f7edbe6…" rel=\"nofollow\">changelog</a>."
},
"reviewed": null,
- "version": "3.6.2"
+ "version": "3.6.4"
},
"default_locale": "en-US",
"description": {
@@ -2314,7 +2314,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2021-04-28T06:05:03Z",
+ "last_updated": "2021-06-16T06:07:15Z",
"name": {
"en-US": "Search by Image"
},
@@ -2426,9 +2426,9 @@
"category": "recommended"
},
"ratings": {
- "average": 4.6536,
- "bayesian_average": 4.647972991144215,
- "count": 915,
+ "average": 4.657,
+ "bayesian_average": 4.6514359731704635,
+ "count": 933,
"text_count": 181
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/reviews/",
@@ -2465,7 +2465,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/search_by_image/versions/",
- "weekly_downloads": 3289
+ "weekly_downloads": 3494
},
"notes": null
},
@@ -2488,7 +2488,7 @@
"picture_url": null
}
],
- "average_daily_users": 39815,
+ "average_daily_users": 42335,
"categories": {
"android": [
"other"
@@ -2770,10 +2770,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.459,
- "bayesian_average": 4.454167438083744,
- "count": 1013,
- "text_count": 277
+ "average": 4.4574,
+ "bayesian_average": 4.452573414888262,
+ "count": 1021,
+ "text_count": 278
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/reviews/",
"requires_payment": false,
@@ -2793,7 +2793,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/google-search-fixer/versions/",
- "weekly_downloads": 83
+ "weekly_downloads": 28
},
"notes": null
},
@@ -2809,7 +2809,7 @@
"picture_url": "https://addons.cdn.mozilla.net/user-media/userpics/0/0/143.png?modified=150…"
}
],
- "average_daily_users": 358900,
+ "average_daily_users": 354639,
"categories": {
"android": [
"performance",
@@ -2823,7 +2823,7 @@
"contributions_url": "https://www.paypal.me/NoScript?utm_content=product-page-contribute&utm_medi…",
"created": "2005-05-13T10:51:32Z",
"current_version": {
- "id": 5234587,
+ "id": 5256631,
"compatibility": {
"firefox": {
"min": "59.0",
@@ -2834,19 +2834,19 @@
"max": "*"
}
},
- "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/versions/5234587",
+ "edit_url": "https://addons.mozilla.org/en-US/developers/addon/noscript/versions/5256631",
"files": [
{
- "id": 3778947,
- "created": "2021-05-19T22:20:26Z",
- "hash": "sha256:4744f9d99acbe9dec3557765edd9173272b4681c8425228fb6af52493f853467",
+ "id": 3800990,
+ "created": "2021-06-23T21:00:49Z",
+ "hash": "sha256:830a25dad07327ae220b4740ea834b0abe715e9ef3dabc326bf7fef2c5af1efb",
"is_restart_required": false,
"is_webextension": true,
"is_mozilla_signed_extension": false,
"platform": "all",
- "size": 623185,
+ "size": 662868,
"status": "public",
- "url": "https://addons.mozilla.org/firefox/downloads/file/3778947/noscript_security…",
+ "url": "https://addons.mozilla.org/firefox/downloads/file/3800990/noscript_security…",
"permissions": [
"contextMenus",
"storage",
@@ -2893,10 +2893,10 @@
"url": "http://www.gnu.org/licenses/gpl-2.0.html"
},
"release_notes": {
- "en-US": "v 11.2.8\n============================================================\nx Quiet down unnecessary debug logging (issue #191)\nx [L10n] Updated he, de\nx Fix meta refresh sometimes ignored on Firefox 78 ESR\n (issue #192, thanks hackerncoder for report)\nx Chromium-specific build-time customizations"
+ "en-US": "v 11.2.9\n============================================================\nx [L10n] Updated de, mk\nx Replace deprecated extension.getURL() with\n runtime.getURL()\nx REUSE-compliant licensing boilerplate\nx Remove unused/refactored-out files\nx Relicensing as GPL3+\nx [nscl] Fixed infinite recursion issue on window.open\n wrappers\nx Avoid treating JavaScript files as embeddings when opened\n as top-level documents"
},
"reviewed": null,
- "version": "11.2.8"
+ "version": "11.2.9"
},
"default_locale": "en-US",
"description": {
@@ -2946,7 +2946,7 @@
},
"is_disabled": false,
"is_experimental": false,
- "last_updated": "2021-05-20T07:04:43Z",
+ "last_updated": "2021-06-24T07:49:42Z",
"name": {
"de": "NoScript",
"el": "NoScript",
@@ -3034,10 +3034,10 @@
"category": "recommended"
},
"ratings": {
- "average": 4.3668,
- "bayesian_average": 4.364130623453648,
+ "average": 4.3797,
+ "bayesian_average": 4.37700001222646,
"count": 1791,
- "text_count": 726
+ "text_count": 719
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/reviews/",
"requires_payment": false,
@@ -3094,7 +3094,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/noscript/versions/",
- "weekly_downloads": 8095
+ "weekly_downloads": 8264
},
"notes": null
},
@@ -3110,7 +3110,7 @@
"picture_url": null
}
],
- "average_daily_users": 113429,
+ "average_daily_users": 113290,
"categories": {
"android": [
"performance",
@@ -3243,10 +3243,10 @@
"category": "recommended"
},
"ratings": {
- "average": 3.9147,
- "bayesian_average": 3.9103908462043155,
- "count": 973,
- "text_count": 350
+ "average": 3.9036,
+ "bayesian_average": 3.899325383200061,
+ "count": 985,
+ "text_count": 354
},
"ratings_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/revi…",
"requires_payment": false,
@@ -3285,7 +3285,7 @@
"type": "extension",
"url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/",
"versions_url": "https://addons.mozilla.org/en-US/firefox/addon/youtube-high-definition/vers…",
- "weekly_downloads": 1691
+ "weekly_downloads": 1683
},
"notes": null
}
diff --git a/rbm.conf b/rbm.conf
index 5304c0a..3a7cc8e 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -58,7 +58,7 @@ buildconf:
var:
torbrowser_version: '10.5a17'
- torbrowser_build: 'build1'
+ torbrowser_build: 'build2'
torbrowser_incremental_from:
- 10.5a16
project_name: tor-browser
1
0

25 Jun '21
commit f69f3f0f98b63f98a04613f0f1003d88909631cd
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 21:09:36 2021 +0000
Release preparations for 10.5a17
Versions bump and Changelog update
---
projects/firefox/config | 2 +-
projects/go/config | 4 ++--
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 18 ++++++++++++++++++
projects/tor-browser/config | 4 ++--
projects/tor-launcher/config | 2 +-
projects/tor/config | 2 +-
rbm.conf | 4 ++--
7 files changed, 27 insertions(+), 9 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index e5ba431..564e374 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,7 +1,7 @@
# 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-build1'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build2'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
diff --git a/projects/go/config b/projects/go/config
index ec6ed92..8a67ae8 100644
--- a/projects/go/config
+++ b/projects/go/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 1.15.12
+version: 1.15.13
filename: '[% project %]-[% c("version") %]-[% c("var/build_id") %].tar.gz'
var:
@@ -118,7 +118,7 @@ input_files:
enable: '[% ! c("var/linux") %]'
- URL: 'https://golang.org/dl/go[% c("version") %].src.tar.gz'
name: go
- sha256sum: 1c6911937df4a277fa74e7b7efc3d08594498c4c4adc0b6c4ae3566137528091
+ sha256sum: 99069e7223479cce4553f84f874b9345f6f4045f27cf5089489b546da619a244
- URL: 'https://golang.org/dl/go[% c("var/go14_version") %].src.tar.gz'
name: go14
sha256sum: 9947fc705b0b841b5938c48b22dc33e9647ec0752bae66e50278df4f23f64959
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 56f83a7..9c94409 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,21 @@
+Tor Browser 10.5a17 -- June 27 2021
+ * All Platforms
+ * Update NoScript to 11.2.9
+ * Update Tor to 0.4.6.5
+ * Update Tor Launcher to 0.2.29
+ * Windows + OS X + Linux
+ * Bug 34345: "Don't Bootstrap" Startup Mode
+ * Bug 40302: Update version of snowflake [tor-browser-build]
+ * Bug 40455: Block or recover background requests after bootstrap [tor-browser]
+ * Bug 40456: Update the SecureDrop HTTPS-Everywhere update channel [tor-browser]
+ * Bug 40475: Include clearing CORS preflight cache [tor-browser]
+ * Bug 40478: Onion alias url rewrite is broken [tor-browser]
+ * Build System
+ * All Platforms
+ * Update Go to 1.15.13
+ * Android
+ * Bug 40313: Use apt-get to install openjdk-8 .deb files with their dependencies [tor-browser-build]
+
Tor Browser 10.5a16 -- June 5 2021
* All Platforms
* Update NoScript to 11.2.8
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index 65fbc66..f98062e 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -78,9 +78,9 @@ input_files:
enable: '[% c("var/snowflake") && ! c("var/android") %]'
- filename: Bundle-Data
enable: '[% ! c("var/android") %]'
- - URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
+ - URL: https://addons.cdn.mozilla.net/user-media/addons/722/noscript_security_suit…
name: noscript
- sha256sum: 4744f9d99acbe9dec3557765edd9173272b4681c8425228fb6af52493f853467
+ sha256sum: 830a25dad07327ae220b4740ea834b0abe715e9ef3dabc326bf7fef2c5af1efb
- filename: 'RelativeLink/start-tor-browser.desktop'
enable: '[% c("var/linux") %]'
- filename: 'RelativeLink/execdesktop'
diff --git a/projects/tor-launcher/config b/projects/tor-launcher/config
index 1ebf3e1..e349026 100644
--- a/projects/tor-launcher/config
+++ b/projects/tor-launcher/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 0.2.28
+version: 0.2.29
git_url: https://git.torproject.org/tor-launcher.git
git_hash: '[% c("version") %]'
gpg_keyring: torbutton.gpg
diff --git a/projects/tor/config b/projects/tor/config
index c7dd6ef..9d0c625 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.4-rc
+version: 0.4.6.5
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 9a9339f..5304c0a 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -57,10 +57,10 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '10.5a16'
+ torbrowser_version: '10.5a17'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 10.5a15
+ - 10.5a16
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0

24 Jun '21
commit 4e94cad752ea0b7fe57acb4757e61921ea50bfb5
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 21:07:26 2021 +0000
Release preparations for 0.2.29
Translations update and version bump
---
src/chrome/locale/af/network-settings.dtd | 12 ++++++++
src/chrome/locale/af/torlauncher.properties | 2 ++
src/chrome/locale/ar/network-settings.dtd | 12 ++++++++
src/chrome/locale/ar/torlauncher.properties | 2 ++
src/chrome/locale/ast/network-settings.dtd | 12 ++++++++
src/chrome/locale/ast/torlauncher.properties | 2 ++
src/chrome/locale/az/network-settings.dtd | 12 ++++++++
src/chrome/locale/az/torlauncher.properties | 2 ++
src/chrome/locale/be/network-settings.dtd | 12 ++++++++
src/chrome/locale/be/torlauncher.properties | 2 ++
src/chrome/locale/bg/network-settings.dtd | 12 ++++++++
src/chrome/locale/bg/torlauncher.properties | 2 ++
src/chrome/locale/bn-BD/network-settings.dtd | 12 ++++++++
src/chrome/locale/bn-BD/torlauncher.properties | 2 ++
src/chrome/locale/br/network-settings.dtd | 12 ++++++++
src/chrome/locale/br/torlauncher.properties | 2 ++
src/chrome/locale/bs/network-settings.dtd | 12 ++++++++
src/chrome/locale/bs/torlauncher.properties | 2 ++
src/chrome/locale/ca/network-settings.dtd | 12 ++++++++
src/chrome/locale/ca/torlauncher.properties | 2 ++
src/chrome/locale/cs/network-settings.dtd | 12 ++++++++
src/chrome/locale/cs/torlauncher.properties | 2 ++
src/chrome/locale/cy/network-settings.dtd | 12 ++++++++
src/chrome/locale/cy/torlauncher.properties | 2 ++
src/chrome/locale/da/network-settings.dtd | 12 ++++++++
src/chrome/locale/da/torlauncher.properties | 2 ++
src/chrome/locale/de/network-settings.dtd | 12 ++++++++
src/chrome/locale/de/torlauncher.properties | 2 ++
src/chrome/locale/el/network-settings.dtd | 12 ++++++++
src/chrome/locale/el/torlauncher.properties | 14 ++++++----
src/chrome/locale/eo/network-settings.dtd | 12 ++++++++
src/chrome/locale/eo/torlauncher.properties | 2 ++
src/chrome/locale/es-AR/network-settings.dtd | 12 ++++++++
src/chrome/locale/es-AR/torlauncher.properties | 2 ++
src/chrome/locale/es-ES/network-settings.dtd | 12 ++++++++
src/chrome/locale/es-ES/torlauncher.properties | 2 ++
src/chrome/locale/es-MX/network-settings.dtd | 12 ++++++++
src/chrome/locale/es-MX/torlauncher.properties | 2 ++
src/chrome/locale/et/network-settings.dtd | 12 ++++++++
src/chrome/locale/et/torlauncher.properties | 2 ++
src/chrome/locale/eu/network-settings.dtd | 12 ++++++++
src/chrome/locale/eu/torlauncher.properties | 2 ++
src/chrome/locale/fa/network-settings.dtd | 12 ++++++++
src/chrome/locale/fa/torlauncher.properties | 2 ++
src/chrome/locale/fi/network-settings.dtd | 12 ++++++++
src/chrome/locale/fi/torlauncher.properties | 2 ++
src/chrome/locale/fr/network-settings.dtd | 14 +++++++++-
src/chrome/locale/fr/torlauncher.properties | 6 ++--
src/chrome/locale/fy-NL/network-settings.dtd | 12 ++++++++
src/chrome/locale/fy-NL/torlauncher.properties | 2 ++
src/chrome/locale/ga-IE/network-settings.dtd | 12 ++++++++
src/chrome/locale/ga-IE/torlauncher.properties | 2 ++
src/chrome/locale/gl/network-settings.dtd | 12 ++++++++
src/chrome/locale/gl/torlauncher.properties | 2 ++
src/chrome/locale/gu-IN/network-settings.dtd | 12 ++++++++
src/chrome/locale/gu-IN/torlauncher.properties | 2 ++
src/chrome/locale/he/network-settings.dtd | 14 +++++++++-
src/chrome/locale/he/torlauncher.properties | 2 ++
src/chrome/locale/hi-IN/network-settings.dtd | 12 ++++++++
src/chrome/locale/hi-IN/torlauncher.properties | 2 ++
src/chrome/locale/hr/network-settings.dtd | 12 ++++++++
src/chrome/locale/hr/torlauncher.properties | 2 ++
src/chrome/locale/hu/network-settings.dtd | 12 ++++++++
src/chrome/locale/hu/torlauncher.properties | 2 ++
src/chrome/locale/hy-AM/network-settings.dtd | 12 ++++++++
src/chrome/locale/hy-AM/torlauncher.properties | 2 ++
src/chrome/locale/id/network-settings.dtd | 12 ++++++++
src/chrome/locale/id/torlauncher.properties | 2 ++
src/chrome/locale/is/network-settings.dtd | 12 ++++++++
src/chrome/locale/is/torlauncher.properties | 2 ++
src/chrome/locale/it/network-settings.dtd | 12 ++++++++
src/chrome/locale/it/torlauncher.properties | 2 ++
src/chrome/locale/ja/network-settings.dtd | 12 ++++++++
src/chrome/locale/ja/torlauncher.properties | 2 ++
src/chrome/locale/ka/network-settings.dtd | 14 +++++++++-
src/chrome/locale/ka/torlauncher.properties | 2 ++
src/chrome/locale/kk/network-settings.dtd | 12 ++++++++
src/chrome/locale/kk/torlauncher.properties | 2 ++
src/chrome/locale/km/network-settings.dtd | 14 +++++++++-
src/chrome/locale/km/torlauncher.properties | 2 ++
src/chrome/locale/ko/network-settings.dtd | 12 ++++++++
src/chrome/locale/ko/torlauncher.properties | 2 ++
src/chrome/locale/lt/network-settings.dtd | 12 ++++++++
src/chrome/locale/lt/torlauncher.properties | 2 ++
src/chrome/locale/lv/network-settings.dtd | 12 ++++++++
src/chrome/locale/lv/torlauncher.properties | 2 ++
src/chrome/locale/mk/network-settings.dtd | 12 ++++++++
src/chrome/locale/mk/torlauncher.properties | 2 ++
src/chrome/locale/ml/network-settings.dtd | 12 ++++++++
src/chrome/locale/ml/torlauncher.properties | 2 ++
src/chrome/locale/mr/network-settings.dtd | 12 ++++++++
src/chrome/locale/mr/torlauncher.properties | 2 ++
src/chrome/locale/ms/network-settings.dtd | 12 ++++++++
src/chrome/locale/ms/torlauncher.properties | 2 ++
src/chrome/locale/my/network-settings.dtd | 12 ++++++++
src/chrome/locale/my/torlauncher.properties | 2 ++
src/chrome/locale/nb-NO/network-settings.dtd | 12 ++++++++
src/chrome/locale/nb-NO/torlauncher.properties | 2 ++
src/chrome/locale/ne/network-settings.dtd | 12 ++++++++
src/chrome/locale/ne/torlauncher.properties | 2 ++
src/chrome/locale/nl-BE/network-settings.dtd | 12 ++++++++
src/chrome/locale/nl-BE/torlauncher.properties | 2 ++
src/chrome/locale/nl/network-settings.dtd | 12 ++++++++
src/chrome/locale/nl/torlauncher.properties | 2 ++
src/chrome/locale/nn-NO/network-settings.dtd | 38 +++++++++++++++++---------
src/chrome/locale/nn-NO/torlauncher.properties | 4 ++-
src/chrome/locale/oc/network-settings.dtd | 12 ++++++++
src/chrome/locale/oc/torlauncher.properties | 2 ++
src/chrome/locale/pa-IN/network-settings.dtd | 12 ++++++++
src/chrome/locale/pa-IN/torlauncher.properties | 2 ++
src/chrome/locale/pl/network-settings.dtd | 14 +++++++++-
src/chrome/locale/pl/torlauncher.properties | 2 ++
src/chrome/locale/pt-BR/network-settings.dtd | 12 ++++++++
src/chrome/locale/pt-BR/torlauncher.properties | 2 ++
src/chrome/locale/pt-PT/network-settings.dtd | 12 ++++++++
src/chrome/locale/pt-PT/torlauncher.properties | 2 ++
src/chrome/locale/ro/network-settings.dtd | 12 ++++++++
src/chrome/locale/ro/torlauncher.properties | 2 ++
src/chrome/locale/ru/network-settings.dtd | 12 ++++++++
src/chrome/locale/ru/torlauncher.properties | 2 ++
src/chrome/locale/sk/network-settings.dtd | 12 ++++++++
src/chrome/locale/sk/torlauncher.properties | 2 ++
src/chrome/locale/sl/network-settings.dtd | 12 ++++++++
src/chrome/locale/sl/torlauncher.properties | 2 ++
src/chrome/locale/sq/network-settings.dtd | 12 ++++++++
src/chrome/locale/sq/torlauncher.properties | 2 ++
src/chrome/locale/sr/network-settings.dtd | 12 ++++++++
src/chrome/locale/sr/torlauncher.properties | 2 ++
src/chrome/locale/sv-SE/network-settings.dtd | 14 +++++++++-
src/chrome/locale/sv-SE/torlauncher.properties | 4 ++-
src/chrome/locale/sw/network-settings.dtd | 12 ++++++++
src/chrome/locale/sw/torlauncher.properties | 2 ++
src/chrome/locale/ta/network-settings.dtd | 12 ++++++++
src/chrome/locale/ta/torlauncher.properties | 2 ++
src/chrome/locale/te/network-settings.dtd | 12 ++++++++
src/chrome/locale/te/torlauncher.properties | 2 ++
src/chrome/locale/th/network-settings.dtd | 14 +++++++++-
src/chrome/locale/th/torlauncher.properties | 2 ++
src/chrome/locale/tr/network-settings.dtd | 12 ++++++++
src/chrome/locale/tr/torlauncher.properties | 2 ++
src/chrome/locale/uk/network-settings.dtd | 12 ++++++++
src/chrome/locale/uk/torlauncher.properties | 2 ++
src/chrome/locale/ur/network-settings.dtd | 12 ++++++++
src/chrome/locale/ur/torlauncher.properties | 2 ++
src/chrome/locale/uz/network-settings.dtd | 12 ++++++++
src/chrome/locale/uz/torlauncher.properties | 2 ++
src/chrome/locale/vi/network-settings.dtd | 12 ++++++++
src/chrome/locale/vi/torlauncher.properties | 2 ++
src/chrome/locale/zh-CN/network-settings.dtd | 12 ++++++++
src/chrome/locale/zh-CN/torlauncher.properties | 2 ++
src/chrome/locale/zh-HK/network-settings.dtd | 14 +++++++++-
src/chrome/locale/zh-HK/torlauncher.properties | 2 ++
src/chrome/locale/zh-TW/network-settings.dtd | 12 ++++++++
src/chrome/locale/zh-TW/torlauncher.properties | 2 ++
src/install.rdf | 2 +-
155 files changed, 1110 insertions(+), 32 deletions(-)
diff --git a/src/chrome/locale/af/network-settings.dtd b/src/chrome/locale/af/network-settings.dtd
index 01aeeec..cb1ba58 100644
--- a/src/chrome/locale/af/network-settings.dtd
+++ b/src/chrome/locale/af/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/af/torlauncher.properties b/src/chrome/locale/af/torlauncher.properties
index 6ec8c40..e0b07f0 100644
--- a/src/chrome/locale/af/torlauncher.properties
+++ b/src/chrome/locale/af/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ar/network-settings.dtd b/src/chrome/locale/ar/network-settings.dtd
index 27385c2..c59c4a4 100644
--- a/src/chrome/locale/ar/network-settings.dtd
+++ b/src/chrome/locale/ar/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "إعدادات تور Tor">
<!ENTITY torPreferences.torSettingsDescription "متصفح Tor Browser يوجه حركة بياناتك عبر شبكة تور Tor Network, التي يشغلها آلاف المتطوعون حول العالم." >
<!ENTITY torPreferences.learnMore "إعرف/ي أكثر ">
+<!ENTITY torPreferences.quickstart "بداية سريعة">
+<!ENTITY torPreferences.quickstartDescription "ﺎﻠﺑﺩﺎﻳﺓ ﺎﻠﺳﺮﻴﻋﺓ ﺖﺴﻤﺣ ﻞﻤﺘﺼﻔﺣ ﺕﻭﺭ ﺏﺍﻸﺘﺻﺎﻟ ﺐﺸﻜﻟ ﺖﻠﻗﺎﺌﻳ">
+<!ENTITY torPreferences.quickstartCheckbox "اتصل تلقائيا بشكل دائم">
<!ENTITY torPreferences.bridges "الجسور">
<!ENTITY torPreferences.bridgesDescription "تساعدك الجسور على دخول شبكة تور Tor Network في الأماكن التي تحظر تور Tor. وبالاعتماد على مكان تواجدك فإن أحد الجسور قد يعمل بشكل أفضل من غيره. ">
<!ENTITY torPreferences.useBridge "استخدم جِسْر">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "شاهد سجلات تور Tor">
<!ENTITY torPreferences.viewLogs "شاهد السجلات...">
<!ENTITY torPreferences.torLogsDialogTitle "سجلات تور Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "حاول الاتصال مرة أخرى">
+<!ENTITY torConnect.offline "غير متصل">
+<!ENTITY torConnect.connectMessage "لن تسري التغييرات على إعدادات Tor حتى تتصل بشبكة Tor">
+<!ENTITY torConnect.tryAgainMessage "فشل متصفح Tor في إنشاء اتصال بشبكة Tor">
+<!ENTITY torConnect.connectingConcise "جاري الاتصال ...">
+<!ENTITY torConnect.connectedConcise "متصل">
+<!ENTITY torConnect.copyLog "انسخ سجلات Tor">
diff --git a/src/chrome/locale/ar/torlauncher.properties b/src/chrome/locale/ar/torlauncher.properties
index fb0e3c7..a87b22f 100644
--- a/src/chrome/locale/ar/torlauncher.properties
+++ b/src/chrome/locale/ar/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=الناقل المضاف مفقود
torlauncher.nsresult.NS_ERROR_NET_RESET=قُطع الاتصال مع الخادوم.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=فشِل الاتصال بالخادوم.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=فشِل الاتصال بالوسيط.
+
+torlauncher.copiedNLogMessagesShort=نسخ سجلات٪ S
diff --git a/src/chrome/locale/ast/network-settings.dtd b/src/chrome/locale/ast/network-settings.dtd
index a087026..827da52 100644
--- a/src/chrome/locale/ast/network-settings.dtd
+++ b/src/chrome/locale/ast/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Sin conexón">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ast/torlauncher.properties b/src/chrome/locale/ast/torlauncher.properties
index 6ec8c40..e0b07f0 100644
--- a/src/chrome/locale/ast/torlauncher.properties
+++ b/src/chrome/locale/ast/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/az/network-settings.dtd b/src/chrome/locale/az/network-settings.dtd
index 842d0a3..bec7b6b 100644
--- a/src/chrome/locale/az/network-settings.dtd
+++ b/src/chrome/locale/az/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Körpülər">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Qoşulur...">
+<!ENTITY torConnect.connectedConcise "Qoşuldu">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/az/torlauncher.properties b/src/chrome/locale/az/torlauncher.properties
index 6d5f0c6..26cd98f 100644
--- a/src/chrome/locale/az/torlauncher.properties
+++ b/src/chrome/locale/az/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=çatışmayan pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/be/network-settings.dtd b/src/chrome/locale/be/network-settings.dtd
index f5cc27c..0d68396 100644
--- a/src/chrome/locale/be/network-settings.dtd
+++ b/src/chrome/locale/be/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Даведацца больш">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Масты">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Ідзе злучэнне...">
+<!ENTITY torConnect.connectedConcise "Падлучана">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/be/torlauncher.properties b/src/chrome/locale/be/torlauncher.properties
index e16f923..dbd783c 100644
--- a/src/chrome/locale/be/torlauncher.properties
+++ b/src/chrome/locale/be/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/bg/network-settings.dtd b/src/chrome/locale/bg/network-settings.dtd
index 5f5d931..cb455a0 100644
--- a/src/chrome/locale/bg/network-settings.dtd
+++ b/src/chrome/locale/bg/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Бриджове">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Извън линия">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Свързан">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/bg/torlauncher.properties b/src/chrome/locale/bg/torlauncher.properties
index 8307aa0..35914cf 100644
--- a/src/chrome/locale/bg/torlauncher.properties
+++ b/src/chrome/locale/bg/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=липсва лесно свързуем
torlauncher.nsresult.NS_ERROR_NET_RESET=Връзката към сървъра беше прекъсната.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Неуспешна връзка със сървъра.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Не може да се установи връзка към прокси сървър.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/bn-BD/network-settings.dtd b/src/chrome/locale/bn-BD/network-settings.dtd
index 7abd3a8..a0667a0 100644
--- a/src/chrome/locale/bn-BD/network-settings.dtd
+++ b/src/chrome/locale/bn-BD/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "টর সেটিংস">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser আপনার ট্র্যাফিকটি সারা বিশ্বে হাজার হাজার স্বেচ্ছাসেবীর দ্বারা পরিচালিত টর নেটওয়ার্কের পথে নিয়ে যায়।" >
<!ENTITY torPreferences.learnMore "আরও জানুন">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "ব্রিজ">
<!ENTITY torPreferences.bridgesDescription "ব্রিজগুলি যেখানে টরকে অবরুদ্ধ করা হয়েছে সেখানে টর নেটওয়ার্ক অ্যাক্সেস করতে আপনাকে সহায়তা করে। আপনি কোথায় আছেন তার উপর নির্ভর করে একটি সেতু অন্যের চেয়ে ভাল কাজ করতে পারে।">
<!ENTITY torPreferences.useBridge "একটি ব্রিজ ব্যবহার করুন">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "টর লগগুলি দেখুন।">
<!ENTITY torPreferences.viewLogs "লগ দেখুন....">
<!ENTITY torPreferences.torLogsDialogTitle "টর লগ">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "অফলাইন">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "সংযুক্ত হচ্ছে ...">
+<!ENTITY torConnect.connectedConcise "সংযুক্ত">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/bn-BD/torlauncher.properties b/src/chrome/locale/bn-BD/torlauncher.properties
index ad9a6ca..e8f4693 100644
--- a/src/chrome/locale/bn-BD/torlauncher.properties
+++ b/src/chrome/locale/bn-BD/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=অনুপস্থিত প্ল্
torlauncher.nsresult.NS_ERROR_NET_RESET=সার্ভারের সংযোগ হারিয়ে গেছে।
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=সার্ভারের সাথে যুক্ত হতে পারছে না.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=প্রক্সি সাথে সংযোগ করা যায়নি
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/br/network-settings.dtd b/src/chrome/locale/br/network-settings.dtd
index 011ea29..a1cc601 100644
--- a/src/chrome/locale/br/network-settings.dtd
+++ b/src/chrome/locale/br/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Gouzout hiroc'h">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Pontoù">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Ezlinenn">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Kevreet">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/br/torlauncher.properties b/src/chrome/locale/br/torlauncher.properties
index 3a58be4..67f3bbd 100644
--- a/src/chrome/locale/br/torlauncher.properties
+++ b/src/chrome/locale/br/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/bs/network-settings.dtd b/src/chrome/locale/bs/network-settings.dtd
index 97a628f..519f023 100644
--- a/src/chrome/locale/bs/network-settings.dtd
+++ b/src/chrome/locale/bs/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Konektovanje…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/bs/torlauncher.properties b/src/chrome/locale/bs/torlauncher.properties
index 6ec8c40..e0b07f0 100644
--- a/src/chrome/locale/bs/torlauncher.properties
+++ b/src/chrome/locale/bs/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ca/network-settings.dtd b/src/chrome/locale/ca/network-settings.dtd
index dbb28c1..d107b17 100644
--- a/src/chrome/locale/ca/network-settings.dtd
+++ b/src/chrome/locale/ca/network-settings.dtd
@@ -67,6 +67,9 @@
<!ENTITY torPreferences.torSettings "Configuració del Tor">
<!ENTITY torPreferences.torSettingsDescription "El navegador Tor encamina el vostre trànsit cap a la xarxa Tor, gestionada per milers de voluntaris de tot el món." >
<!ENTITY torPreferences.learnMore "Aprèn més">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Ponts">
<!ENTITY torPreferences.bridgesDescription "Els ponts us ajuden a accedir a la xarxa Tor en llocs on Tor està bloquejat. Depenent d'on sigueu, un pont pot funcionar millor que un altre.">
<!ENTITY torPreferences.useBridge "Utilitza un pont">
@@ -82,3 +85,12 @@
<!ENTITY torPreferences.viewTorLogs "Mostra els registres de Tor.">
<!ENTITY torPreferences.viewLogs "Mostra els registres…">
<!ENTITY torPreferences.torLogsDialogTitle "Registres del Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Fora de línia">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "S'està connectant...">
+<!ENTITY torConnect.connectedConcise "Connectat">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ca/torlauncher.properties b/src/chrome/locale/ca/torlauncher.properties
index ad1a2ba..ee69a6f 100644
--- a/src/chrome/locale/ca/torlauncher.properties
+++ b/src/chrome/locale/ca/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=falta de transport afegible
torlauncher.nsresult.NS_ERROR_NET_RESET=S'ha perdut la connexió amb el servidor.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=No s'ha pogut connectar al servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=No s'ha pogut connectar al servidor intermediari.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/cs/network-settings.dtd b/src/chrome/locale/cs/network-settings.dtd
index 2cb39bb..e35291f 100644
--- a/src/chrome/locale/cs/network-settings.dtd
+++ b/src/chrome/locale/cs/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Nastavení sítě Tor">
<!ENTITY torPreferences.torSettingsDescription "Prohlížeč Tor vás připojí k síti Tor, provozované tisíci dobrovolníků po celém světě." >
<!ENTITY torPreferences.learnMore "Zjistit více">
+<!ENTITY torPreferences.quickstart "Rychlý start">
+<!ENTITY torPreferences.quickstartDescription "Rychlý start umožňuje automatické připojení prohlížeče Tor Browser.">
+<!ENTITY torPreferences.quickstartCheckbox "Vždy připojit automaticky">
<!ENTITY torPreferences.bridges "Mosty">
<!ENTITY torPreferences.bridgesDescription "Mosty pomáhají v přístupu k sítě Tor na místech, kde je Tor blokován. Podle toho, kde se nacházíte, mohou některé mosty fungovat lépe než jiné.">
<!ENTITY torPreferences.useBridge "Použít most">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Zobrazit protokol sítě Tor">
<!ENTITY torPreferences.viewLogs "Zobrazit protokol…">
<!ENTITY torPreferences.torLogsDialogTitle "Protokol sítě Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Zkusit se připojit znovu">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Změny v nastavení Tor se neprojeví, dokud se nepřipojíte k síti Tor">
+<!ENTITY torConnect.tryAgainMessage "Tor prohlížeči se nepodařilo navázat spojení se sítí Tor">
+<!ENTITY torConnect.connectingConcise "Spojuji...">
+<!ENTITY torConnect.connectedConcise "Připojeno">
+<!ENTITY torConnect.copyLog "Zkopírovat Tor logy">
diff --git a/src/chrome/locale/cs/torlauncher.properties b/src/chrome/locale/cs/torlauncher.properties
index 27e5743..0e8890a 100644
--- a/src/chrome/locale/cs/torlauncher.properties
+++ b/src/chrome/locale/cs/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=chybějící zásuvný transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Spojení se serverem bylo ztraceno.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Nelze se připojit k serveru.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Nelze se připojit k proxy.
+
+torlauncher.copiedNLogMessagesShort=Logy %S zkopírovány
diff --git a/src/chrome/locale/cy/network-settings.dtd b/src/chrome/locale/cy/network-settings.dtd
index 6dada88..88ae488 100644
--- a/src/chrome/locale/cy/network-settings.dtd
+++ b/src/chrome/locale/cy/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/cy/torlauncher.properties b/src/chrome/locale/cy/torlauncher.properties
index e1b5914..ddd270c 100644
--- a/src/chrome/locale/cy/torlauncher.properties
+++ b/src/chrome/locale/cy/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=trafnyddiaeth plygadwy ar goll
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/da/network-settings.dtd b/src/chrome/locale/da/network-settings.dtd
index 7c46734..79ea0d4 100644
--- a/src/chrome/locale/da/network-settings.dtd
+++ b/src/chrome/locale/da/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor-indstillinger">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser sender din trafik over Tor-netværket som køres af tusindvis af frivillige verden over." >
<!ENTITY torPreferences.learnMore "Læs mere">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Altid forbind automatisk">
<!ENTITY torPreferences.bridges "Broer">
<!ENTITY torPreferences.bridgesDescription "Broer hjælper dig med at tilgå Tor-netværket steder hvor Tor er blokeret. Afhængig af hvor du er, så kan en bro virke bedre end en anden.">
<!ENTITY torPreferences.useBridge "Brug en bro">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Vis Tor-loggene.">
<!ENTITY torPreferences.viewLogs "Vis logge…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-logge">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Prøv at opret forbindelse igen">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Ændringer i Tors indstillinger vil ikke træde i kraft indtil du forbinder til Tor-netværket">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Forbinder...">
+<!ENTITY torConnect.connectedConcise "Forbundet">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/da/torlauncher.properties b/src/chrome/locale/da/torlauncher.properties
index ad2a160..7bc6696 100644
--- a/src/chrome/locale/da/torlauncher.properties
+++ b/src/chrome/locale/da/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=mangler udskiftelig transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Forbindelsen til serveren blev tabt.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Kunne ikke oprette forbindelse til serveren.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Kunne ikke oprette forbindelse til proxyen.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/de/network-settings.dtd b/src/chrome/locale/de/network-settings.dtd
index 47ba13d..3142ec4 100644
--- a/src/chrome/locale/de/network-settings.dtd
+++ b/src/chrome/locale/de/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor-Einstellungen">
<!ENTITY torPreferences.torSettingsDescription "Der Tor Browser leitet deinen Datenverkehr über das Tor-Netzwerk, das von Tausenden von Freiwilligen auf der ganzen Welt betrieben wird." >
<!ENTITY torPreferences.learnMore "Mehr erfahren">
+<!ENTITY torPreferences.quickstart "Schnellstart">
+<!ENTITY torPreferences.quickstartDescription "Der Schnellstart ermöglicht es Tor Browser, sich automatisch zu verbinden.">
+<!ENTITY torPreferences.quickstartCheckbox "Immer automatisch verbinden">
<!ENTITY torPreferences.bridges "Brücken">
<!ENTITY torPreferences.bridgesDescription "Brücken helfen dir beim Zugriff auf das Tor-Netzwerk an Orten, an denen Tor blockiert ist. Je nachdem, wo du dich befindest, kann eine Brücke besser funktionieren als eine andere.">
<!ENTITY torPreferences.useBridge "Eine Brücke verwenden">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor logs ansehen.">
<!ENTITY torPreferences.viewLogs "Logs ansehen …">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Versuche erneut, eine Verbindung herzustellen">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Änderungen an den Tor-Einstellungen werden erst wirksam, wenn du dich mit dem Tor-Netzwerk verbindest">
+<!ENTITY torConnect.tryAgainMessage "Verbindung des Tor Browser mit dem Tor-Netzwerk ist fehlgeschlagen">
+<!ENTITY torConnect.connectingConcise "Verbinde…">
+<!ENTITY torConnect.connectedConcise "Verbunden">
+<!ENTITY torConnect.copyLog "Kopiere Tor Logs">
diff --git a/src/chrome/locale/de/torlauncher.properties b/src/chrome/locale/de/torlauncher.properties
index 15b994a..46b8237 100644
--- a/src/chrome/locale/de/torlauncher.properties
+++ b/src/chrome/locale/de/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Pluggable Transport fehlt
torlauncher.nsresult.NS_ERROR_NET_RESET=Die Verbindung zum Server ist verloren gegangen.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Konnte nicht mit dem Server verbinden.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Konnte nicht mit dem Proxy verbinden.
+
+torlauncher.copiedNLogMessagesShort=%S Logs kopiert
diff --git a/src/chrome/locale/el/network-settings.dtd b/src/chrome/locale/el/network-settings.dtd
index 9d9f0c2..bd6cb9a 100644
--- a/src/chrome/locale/el/network-settings.dtd
+++ b/src/chrome/locale/el/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Ρυθμίσεις Tor">
<!ENTITY torPreferences.torSettingsDescription "Ο Tor Browser δρομολογεί την κίνηση δικτύου σας μέσα από το δίκτυο Tor, που λειτουργεί χάρη σε χιλιάδες εθελοντές σε όλο τον κόσμο." >
<!ENTITY torPreferences.learnMore "Μάθετε περισσότερα">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Γέφυρες">
<!ENTITY torPreferences.bridgesDescription "Οι γέφυρες σας βοηθούν στην πρόσβαση στο δίκτυο Tor σε τοποθεσίες που δεν επιτρέπεται. Εξαρτάται που βρίσκεστε, κάποια γέφυρα μπορεί να λειτουργεί από άλλες.">
<!ENTITY torPreferences.useBridge "Χρήση γέφυρας">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Προβολή αρχείων καταγραφής του Tor.">
<!ENTITY torPreferences.viewLogs "Προβολή αρχείων καταγραφής...">
<!ENTITY torPreferences.torLogsDialogTitle "Αρχεία καταγραφών Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Προσπάθεια επανασύνδεσης">
+<!ENTITY torConnect.offline "Εκτός σύνδεσης">
+<!ENTITY torConnect.connectMessage "Οι αλλαγές των ρυθμίσεων του Tor θα εφαρμοστούν όταν συνδεθείτε με το δίκτυο Tor.">
+<!ENTITY torConnect.tryAgainMessage "Η σύνδεση του Tor Browser με το δίκτυο Tor απέτυχε.">
+<!ENTITY torConnect.connectingConcise "Γίνεται σύνδεση...">
+<!ENTITY torConnect.connectedConcise "Συνδεδεμένος/η">
+<!ENTITY torConnect.copyLog "Αντιγραφή αρχείων καταγραφής του Tor">
diff --git a/src/chrome/locale/el/torlauncher.properties b/src/chrome/locale/el/torlauncher.properties
index dc250a4..809f702 100644
--- a/src/chrome/locale/el/torlauncher.properties
+++ b/src/chrome/locale/el/torlauncher.properties
@@ -3,17 +3,17 @@
torlauncher.error_title=Tor Launcher
-torlauncher.tor_exited_during_startup=Το Tor έκλεισε κατά την εκκίνηση. Αυτό μπορεί να οφείλεται σε σφάλμα στο αρχείο torrc, σε σφάλμα στο Tor, σε κάποιο άλλο πρόγραμμα στο σύστημά σας, ή σε ελαττωματικό υλικό. Ο Tor Browser δεν θα ξεκινήσει μέχρι να διορθώσετε το σφάλμα και να επανεκκινήσετε το Tor.
-torlauncher.tor_exited=Ο Tor έκλεισε απροσδόκητα. Αυτό μπορεί να οφείλεται σε κάποιο σφάλμα του ίδιου του Tor, σε κάποιο άλλο πρόγραμμα στο σύστημά σας, ή σε ελαττωματικό υλικό. Εως ότου επανεκκινήσετε το Tor, ο περιηγητής Tor δεν θα είναι σε θέση να εμφανίσει οποιονδήποτε ιστότοπο. Αν το πρόβλημα παραμείνει, παρακαλώ στείλτε ένα αντίγραφο του αρχείου καταγραφής του Tor στην ομάδα υποστήριξης.
-torlauncher.tor_exited2=Η επανεκκίνηση του Tor δεν θα κλείσει τις καρτέλες browser σας.
-torlauncher.tor_controlconn_failed=Δεν ήταν δυνατή η σύνδεση με την υποδοχη ελέγχου του Tor.
+torlauncher.tor_exited_during_startup=Το Tor έκλεισε κατά την εκκίνηση. Αυτό μπορεί να οφείλεται σε σφάλμα στο αρχείο torrc, σε σφάλμα του Tor, σε κάποιο άλλο πρόγραμμα στο σύστημά σας ή σε ελαττωματικό υλικό. Το Tor Browser δεν θα ξεκινήσει μέχρι να διορθώσετε το σφάλμα και να επανεκκινήσετε το Tor.
+torlauncher.tor_exited=Το Tor έκλεισε απροσδόκητα. Αυτό μπορεί να οφείλεται σε κάποιο σφάλμα του ίδιου του Tor, σε κάποιο άλλο πρόγραμμα στο σύστημά σας ή σε ελαττωματικό υλικό. Έως ότου επανεκκινήσετε το Tor δεν θα είναι σε θέση να εμφανίσει οποιανδήποτε ιστοσελίδα. Αν το πρόβλημα παραμείνει, παρακαλούμε στείλτε ένα αντίγραφο του αρχείου καταγραφής του Tor στην ομάδα υποστήριξης.
+torlauncher.tor_exited2=Η επανεκκίνηση του Tor δεν θα κλείσει τις καρτέλες του περιηγητή σας.
+torlauncher.tor_controlconn_failed=Δεν ήταν δυνατή η σύνδεση με την θύρα ελέγχου του Tor.
torlauncher.tor_failed_to_start=Αδυναμία εκκίνησης του Tor.
torlauncher.tor_control_failed=Απέτυχε να ελέγξει το Tor.
torlauncher.tor_bootstrap_failed=Το Tor απέτυχε να δημιουργήσει μια σύνδεση δικτύου Tor.
torlauncher.tor_bootstrap_failed_details=%1$S απέτυχε (%2$S).
-torlauncher.unable_to_start_tor=Αδυναμία εκκίνησης του Tor.⏎\n⏎\n%S
-torlauncher.tor_missing=Το Tor εκτελέσιμο λείπει.
+torlauncher.unable_to_start_tor=Αδυναμία εκκίνησης του Tor.\n\n%S
+torlauncher.tor_missing=Το εκτελέσιμο αρχείο του Tor απουσιάζει.
torlauncher.torrc_missing=Το αρχείο torrc λείπει και δεν μπορεί να δημιουργηθεί.
torlauncher.datadir_missing=Ο κατάλογος δεδομένων Tor δεν υπάρχει και δεν μπορεί να δημιουργηθεί.
torlauncher.onionauthdir_missing=Ο κατάλογος αυθεντικοποίησης Tor onion δεν υπάρχει και δεν μπορεί να δημιουργηθεί.
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Λείπει το pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Η σύνδεση στον διακομιστή χάθηκε.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Δεν ήταν δυνατή η σύνδεση στον διακομιστή.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Δεν έγινε σύνδεση στον διαμεσολαβητή.
+
+torlauncher.copiedNLogMessagesShort=Αντιγράφηκαν %S αρχεία καταγραφών
diff --git a/src/chrome/locale/eo/network-settings.dtd b/src/chrome/locale/eo/network-settings.dtd
index b71d5db..79d0465 100644
--- a/src/chrome/locale/eo/network-settings.dtd
+++ b/src/chrome/locale/eo/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Pontoj">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/eo/torlauncher.properties b/src/chrome/locale/eo/torlauncher.properties
index 6e500f2..9470c4e 100644
--- a/src/chrome/locale/eo/torlauncher.properties
+++ b/src/chrome/locale/eo/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/es-AR/network-settings.dtd b/src/chrome/locale/es-AR/network-settings.dtd
index 208046a..15fb36b 100644
--- a/src/chrome/locale/es-AR/network-settings.dtd
+++ b/src/chrome/locale/es-AR/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Configuraciones de Tor">
<!ENTITY torPreferences.torSettingsDescription "El navegador Tor enruta tu tráfico a través de la red Tor, mantenida por miles de voluntarios en todo el mundo." >
<!ENTITY torPreferences.learnMore "Aprendé más">
+<!ENTITY torPreferences.quickstart "Arranque rápido">
+<!ENTITY torPreferences.quickstartDescription "El arranque rápido le permite al Navegador Tor conectarse automáticamente.">
+<!ENTITY torPreferences.quickstartCheckbox "Siempre conectar automáticamente">
<!ENTITY torPreferences.bridges "Puentes">
<!ENTITY torPreferences.bridgesDescription "Los puentes te permiten acceder a la red Tor desde lugares donde Tor está bloqueado. Dependiendo de dónde te encuentres, algunos puentes funcionarán mejor que otros.">
<!ENTITY torPreferences.useBridge "Usar un puente">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Ver la bitácora sucesos de Tor.">
<!ENTITY torPreferences.viewLogs "Ver bitácora de sucesos">
<!ENTITY torPreferences.torLogsDialogTitle "Bitácora de eventos de Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Intentá conectar de nuevo">
+<!ENTITY torConnect.offline "Fuera de línea">
+<!ENTITY torConnect.connectMessage "Los cambios en la configuración de Tor no van a tener efecto hasta que te conectes a la red Tor">
+<!ENTITY torConnect.tryAgainMessage "El Navegador Tor ha fallado al establecer una conexión a la red Tor">
+<!ENTITY torConnect.connectingConcise "Conectando...">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copiar registros Tor">
diff --git a/src/chrome/locale/es-AR/torlauncher.properties b/src/chrome/locale/es-AR/torlauncher.properties
index 154120f..353dee0 100644
--- a/src/chrome/locale/es-AR/torlauncher.properties
+++ b/src/chrome/locale/es-AR/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=transporte insertable faltante
torlauncher.nsresult.NS_ERROR_NET_RESET=La conexión al servidor fue perdida.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=No se pudo conectar al servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=No se pudo conectar al proxy.
+
+torlauncher.copiedNLogMessagesShort=%S registros copiados
diff --git a/src/chrome/locale/es-ES/network-settings.dtd b/src/chrome/locale/es-ES/network-settings.dtd
index 5950dca..b04784a 100644
--- a/src/chrome/locale/es-ES/network-settings.dtd
+++ b/src/chrome/locale/es-ES/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Configuración de Tor">
<!ENTITY torPreferences.torSettingsDescription "El Navegador Tor enruta tu tráfico a través de la Red Tor, mantenida por miles de voluntarios alrededor del mundo." >
<!ENTITY torPreferences.learnMore "Más información">
+<!ENTITY torPreferences.quickstart "Inicio rápido">
+<!ENTITY torPreferences.quickstartDescription "El inicio rápido le permite al Navegador Tor conectarse automáticamente.">
+<!ENTITY torPreferences.quickstartCheckbox "Siempre conectar automáticamente">
<!ENTITY torPreferences.bridges "Puentes">
<!ENTITY torPreferences.bridgesDescription "Los puentes te ayudan a acceder a la Red Tor en lugares donde Tor está bloqueado. Dependiendo de dónde te encuentres, un puente puede funcionar mejor que otro.">
<!ENTITY torPreferences.useBridge "Usa un puente">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Ver los registros de Tor.">
<!ENTITY torPreferences.viewLogs "Ver registros…">
<!ENTITY torPreferences.torLogsDialogTitle "Registros de Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Intenta Conectar de Nuevo">
+<!ENTITY torConnect.offline "Desconectado">
+<!ENTITY torConnect.connectMessage "El cambio de Configuración de Tor no tendrá lugar hasta que te conectes a la Red Tor">
+<!ENTITY torConnect.tryAgainMessage "Fallo del Navegador Tor al establecer conexión con la Red Tor.">
+<!ENTITY torConnect.connectingConcise "Conectando...">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copiar registros de Tor">
diff --git a/src/chrome/locale/es-ES/torlauncher.properties b/src/chrome/locale/es-ES/torlauncher.properties
index 6fd0b96..fc0f94f 100644
--- a/src/chrome/locale/es-ES/torlauncher.properties
+++ b/src/chrome/locale/es-ES/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=transporte plugable no encontrado
torlauncher.nsresult.NS_ERROR_NET_RESET=La conexión al servidor se perdió.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=No se pudo conectar al servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=No se pudo conectar al proxy.
+
+torlauncher.copiedNLogMessagesShort=%S registros copiados
diff --git a/src/chrome/locale/es-MX/network-settings.dtd b/src/chrome/locale/es-MX/network-settings.dtd
index 1d3ff9c..96af822 100644
--- a/src/chrome/locale/es-MX/network-settings.dtd
+++ b/src/chrome/locale/es-MX/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Puentes">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Fuera de Linea">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/es-MX/torlauncher.properties b/src/chrome/locale/es-MX/torlauncher.properties
index b596a6e..04707ff 100644
--- a/src/chrome/locale/es-MX/torlauncher.properties
+++ b/src/chrome/locale/es-MX/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Falta un transporte conectable
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/et/network-settings.dtd b/src/chrome/locale/et/network-settings.dtd
index e388f32..a1c7d2b 100644
--- a/src/chrome/locale/et/network-settings.dtd
+++ b/src/chrome/locale/et/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor\'i seaded">
<!ENTITY torPreferences.torSettingsDescription "Tor\'i brauser suunab Teie andmeliikluse üle Tor\'i võrgu, mis koosneb tuhandetest vabatahtlikest üle maailma." >
<!ENTITY torPreferences.learnMore "Loe lähemalt">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Sillad">
<!ENTITY torPreferences.bridgesDescription "Sillad aitavad Teil pääseda Tor\'i võrku kohtades, kus Tor on blokeeritud. Olenevalt Teie asukohast, üks sild võib töötada paremini, kui teine.">
<!ENTITY torPreferences.useBridge "Kasuta silda">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Vaata Tor\'i logisid.">
<!ENTITY torPreferences.viewLogs "Vaata logisid...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor\'i logid">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Võrguühenduseta">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Ühendatud">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/et/torlauncher.properties b/src/chrome/locale/et/torlauncher.properties
index 28f6ea2..eeccd57 100644
--- a/src/chrome/locale/et/torlauncher.properties
+++ b/src/chrome/locale/et/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/eu/network-settings.dtd b/src/chrome/locale/eu/network-settings.dtd
index fb5d418..da67794 100644
--- a/src/chrome/locale/eu/network-settings.dtd
+++ b/src/chrome/locale/eu/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor ezarpenak">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Ikasi gehiago">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Zubiak">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Lineaz kanpo">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Konektatzen...">
+<!ENTITY torConnect.connectedConcise "Konektatuta">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/eu/torlauncher.properties b/src/chrome/locale/eu/torlauncher.properties
index bd29af4..c678bc0 100644
--- a/src/chrome/locale/eu/torlauncher.properties
+++ b/src/chrome/locale/eu/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggable transport falta da
torlauncher.nsresult.NS_ERROR_NET_RESET=Zerbitzarirekiko konexioa galdu da.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Ezin izan da zerbitzariarekin konektatu.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Ezin izan da proxyarekin konektatu.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/fa/network-settings.dtd b/src/chrome/locale/fa/network-settings.dtd
index 4b5b317..6988c4f 100644
--- a/src/chrome/locale/fa/network-settings.dtd
+++ b/src/chrome/locale/fa/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "تنظیمات Tor">
<!ENTITY torPreferences.torSettingsDescription "مرورگر Tor ترافیک شما را از طریق شبکه Tor هدایت میکند، که به واسطه هزاران داوطلب در سراسر جهان به اجرا درآمده است." >
<!ENTITY torPreferences.learnMore "بیشتر بدانید">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "پل ها">
<!ENTITY torPreferences.bridgesDescription "پلها به شما کمک میکنند که در مناطقی که Tor مسدود شده است، به شبکه Tor دسترسی پیدا کنید. وابسته به منطقهای که در آن هستید، ممکن است یک پل بهتر از دیگری عمل کند.">
<!ENTITY torPreferences.useBridge "از یک پل استفاده کن">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "وقایع Tor را مشاهده کنید.">
<!ENTITY torPreferences.viewLogs "مشاهده وقایع...">
<!ENTITY torPreferences.torLogsDialogTitle "وقایع Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "آفلاین">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "در حال اتصال...">
+<!ENTITY torConnect.connectedConcise "متصل">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/fa/torlauncher.properties b/src/chrome/locale/fa/torlauncher.properties
index 0083965..a84f3a2 100644
--- a/src/chrome/locale/fa/torlauncher.properties
+++ b/src/chrome/locale/fa/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=انتقال جایگزین مفقود
torlauncher.nsresult.NS_ERROR_NET_RESET=ارتباط با سرور از دست رفت.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=اتصال به سرور امکان پذیر نمیباشد.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=اتصال به پروکسی امکان پذیر نمیباشد.
+
+torlauncher.copiedNLogMessagesShort=S% لاگ کپی شد
diff --git a/src/chrome/locale/fi/network-settings.dtd b/src/chrome/locale/fi/network-settings.dtd
index 55f3e81..5956030 100644
--- a/src/chrome/locale/fi/network-settings.dtd
+++ b/src/chrome/locale/fi/network-settings.dtd
@@ -67,6 +67,9 @@ Tässä saattaa kestää muutama minuutti.">
<!ENTITY torPreferences.torSettings "Tor-asetukset">
<!ENTITY torPreferences.torSettingsDescription "Tor-selain reitittää liikenteesi Tor-verkon kautta, joka toimii tuhansien ympäri maailmaa olevien vapaaehtoisten ansiosta." >
<!ENTITY torPreferences.learnMore "Opi lisää">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Sillat">
<!ENTITY torPreferences.bridgesDescription "Sillat auttavat pääsemään Tor-verkkoon siellä, missä Tor on estetty. Siltojen toimivuudessa voi olla eroja riippuen siitä, missä olet.">
<!ENTITY torPreferences.useBridge "Käytä siltaa">
@@ -82,3 +85,12 @@ Tässä saattaa kestää muutama minuutti.">
<!ENTITY torPreferences.viewTorLogs "Katsele Tor-lokeja.">
<!ENTITY torPreferences.viewLogs "Näytä lokit…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-lokit">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Yritä yhdistää uudelleen">
+<!ENTITY torConnect.offline "Poissa verkosta">
+<!ENTITY torConnect.connectMessage "Muutokset Tor-asetuksiin tulevat voimaan vasta, kun yhdistät Tor-verkkoon">
+<!ENTITY torConnect.tryAgainMessage "Tor-selain ei pystynyt muodostamaan yhteyttä Tor-verkkoon">
+<!ENTITY torConnect.connectingConcise "Yhdistetään...">
+<!ENTITY torConnect.connectedConcise "Yhdistetty">
+<!ENTITY torConnect.copyLog "Kopioi Tor-lokit">
diff --git a/src/chrome/locale/fi/torlauncher.properties b/src/chrome/locale/fi/torlauncher.properties
index b2aae83..2032368 100644
--- a/src/chrome/locale/fi/torlauncher.properties
+++ b/src/chrome/locale/fi/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=puuttuu kytkettävä liikenne
torlauncher.nsresult.NS_ERROR_NET_RESET=Yhteys palvelimeen menetetty.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Yhteydenotto palvelimeen epäonnistui.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Yhteydenotto välityspalvelimeen epäonnistui.
+
+torlauncher.copiedNLogMessagesShort=Kopioitu %S lokeja
diff --git a/src/chrome/locale/fr/network-settings.dtd b/src/chrome/locale/fr/network-settings.dtd
index ac83978..803774d 100644
--- a/src/chrome/locale/fr/network-settings.dtd
+++ b/src/chrome/locale/fr/network-settings.dtd
@@ -46,7 +46,7 @@
<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "Obtenir un nouveau test">
<!ENTITY torsettings.useBridges.captchaSubmit "Envoyer">
<!ENTITY torsettings.useBridges.custom "Indiquer un pont que je connais">
-<!ENTITY torsettings.useBridges.label "Saisir des renseignements de pont provenant d’une source fiable">
+<!ENTITY torsettings.useBridges.label "Saisir des renseignements de pont provenant d’une source fiable.">
<!ENTITY torsettings.useBridges.placeholder "type adresse:port (un par ligne)">
<!ENTITY torsettings.copyLog "Copier le journal de Tor dans le presse-papiers">
@@ -67,6 +67,9 @@
<!ENTITY torPreferences.torSettingsDescription "Le Navigateur Tor achemine votre trafic par le réseau Tor, exploité par des milliers de bénévoles partout dans le monde.
" >
<!ENTITY torPreferences.learnMore "En apprendre davantage">
+<!ENTITY torPreferences.quickstart "Démarrage rapide">
+<!ENTITY torPreferences.quickstartDescription "Le démarrage rapide permet au Navigateur Tor de se connecter automatiquement.">
+<!ENTITY torPreferences.quickstartCheckbox "Toujours se connecter automatiquement">
<!ENTITY torPreferences.bridges "Ponts">
<!ENTITY torPreferences.bridgesDescription "Les ponts vous aident à accéder au réseau Tor où il est bloqué.
Selon votre position géographique, un pont pourrait fonctionner mieux qu’un autre.">
@@ -83,3 +86,12 @@ Selon votre position géographique, un pont pourrait fonctionner mieux qu’un a
<!ENTITY torPreferences.viewTorLogs "Visualiser les journaux de Tor.">
<!ENTITY torPreferences.viewLogs "Visualiser les journaux…">
<!ENTITY torPreferences.torLogsDialogTitle "Journaux de Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Essayez de vous reconnecter">
+<!ENTITY torConnect.offline "Hors ligne">
+<!ENTITY torConnect.connectMessage "Les changements des paramètres de Tor ne seront appliqués qu’après connexion au réseau Tor">
+<!ENTITY torConnect.tryAgainMessage "Le Navigateur Tor n’a pas réussi à établir une connexion au réseau Tor">
+<!ENTITY torConnect.connectingConcise "Connexion…">
+<!ENTITY torConnect.connectedConcise "Connecté">
+<!ENTITY torConnect.copyLog "Copier les journaux de Tor">
diff --git a/src/chrome/locale/fr/torlauncher.properties b/src/chrome/locale/fr/torlauncher.properties
index 9a4ac9c..4951898 100644
--- a/src/chrome/locale/fr/torlauncher.properties
+++ b/src/chrome/locale/fr/torlauncher.properties
@@ -16,7 +16,7 @@ torlauncher.unable_to_start_tor=Impossible de démarrer Tor.\n\n%S
torlauncher.tor_missing=Il manque l’exécutable de Tor.
torlauncher.torrc_missing=Le fichier torrc manque et n’a pas pu être créé.
torlauncher.datadir_missing=Le répertoire de données de Tor n’existe pas et n’a pas pu être créé.
-torlauncher.onionauthdir_missing=Le répertoire d’authentification onion de Tor n’existe pas et n’a pas pu être créé.
+torlauncher.onionauthdir_missing=Le répertoire d’authentification oignon de Tor n’existe pas et n’a pas pu être créé.
torlauncher.password_hash_missing=Échec d’obtention du mot de passe haché.
torlauncher.failed_to_get_settings=Impossible de récupérer les paramètres de Tor.\n\n%S
@@ -90,6 +90,8 @@ torlauncher.bootstrapWarning.noroute=pas de route vers l’hôte
torlauncher.bootstrapWarning.ioerror=erreur de lecture/écriture
torlauncher.bootstrapWarning.pt_missing=le transport enfichable manque
-torlauncher.nsresult.NS_ERROR_NET_RESET=La connexion au serveur a été perdue
+torlauncher.nsresult.NS_ERROR_NET_RESET=La connexion au serveur a été perdue.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Impossible de se connecter au serveur.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Impossible de se connecter au mandataire.
+
+torlauncher.copiedNLogMessagesShort=Les journaux de %S ont été copiés
diff --git a/src/chrome/locale/fy-NL/network-settings.dtd b/src/chrome/locale/fy-NL/network-settings.dtd
index d4c7def..73d32e0 100644
--- a/src/chrome/locale/fy-NL/network-settings.dtd
+++ b/src/chrome/locale/fy-NL/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/fy-NL/torlauncher.properties b/src/chrome/locale/fy-NL/torlauncher.properties
index 693896b..f9af274 100644
--- a/src/chrome/locale/fy-NL/torlauncher.properties
+++ b/src/chrome/locale/fy-NL/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ga-IE/network-settings.dtd b/src/chrome/locale/ga-IE/network-settings.dtd
index 0250eb0..ddeb12e 100644
--- a/src/chrome/locale/ga-IE/network-settings.dtd
+++ b/src/chrome/locale/ga-IE/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Socruithe Tor">
<!ENTITY torPreferences.torSettingsDescription "Seolann Brabhsálaí Tor do chuid tráchta thar líonra Tor, líonra faoi stiúir na mílte oibrí deonach timpeall an domhain." >
<!ENTITY torPreferences.learnMore "Tuilleadh Eolais">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Droichid">
<!ENTITY torPreferences.bridgesDescription "Cabhraíonn droichid leat teacht ar líonra Tor ó áiteanna ina bhfuil cosc ar Tor. Seans go bhfeidhmeodh droichead amháin níos fearr ná cinn eile, ag brath ar an áit ina bhfuil tú.">
<!ENTITY torPreferences.useBridge "Úsáid droichead">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Féach ar logchomhaid Tor.">
<!ENTITY torPreferences.viewLogs "Féach ar na Logchomhaid...">
<!ENTITY torPreferences.torLogsDialogTitle "Logchomhaid Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "As líne">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ga-IE/torlauncher.properties b/src/chrome/locale/ga-IE/torlauncher.properties
index 0cf1437..8b17d2e 100644
--- a/src/chrome/locale/ga-IE/torlauncher.properties
+++ b/src/chrome/locale/ga-IE/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=córas iompair ionphlugáilte ar iarraid
torlauncher.nsresult.NS_ERROR_NET_RESET=Briseadh an ceangal leis an bhfreastalaí.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Níorbh fhéidir ceangal leis an bhfreastalaí.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Níorbh fhéidir ceangal a bhunú leis an seachfhreastalaí.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/gl/network-settings.dtd b/src/chrome/locale/gl/network-settings.dtd
index 6c08beb..a5467d2 100644
--- a/src/chrome/locale/gl/network-settings.dtd
+++ b/src/chrome/locale/gl/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Configuración do Tor">
<!ENTITY torPreferences.torSettingsDescription "O navegador Tor enruta o seu tráfico sobre a rede Tor, xestionada por milleiros de voluntarios de todo o mundo." >
<!ENTITY torPreferences.learnMore "Saber máis">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Pontes">
<!ENTITY torPreferences.bridgesDescription "As pontes axudan a acceder á rede Tor en lugares onde Tor está bloqueado. Dependendo de onde estea vostede, unha ponte pode funcionar mellor ca outra.">
<!ENTITY torPreferences.useBridge "Utilizar unha ponte">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Ver os rexistros do Tor">
<!ENTITY torPreferences.viewLogs "Ver rexistros...">
<!ENTITY torPreferences.torLogsDialogTitle "Rexistros do Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Desconectado">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Conectando...">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/gl/torlauncher.properties b/src/chrome/locale/gl/torlauncher.properties
index 63032f8..60cdf4b 100644
--- a/src/chrome/locale/gl/torlauncher.properties
+++ b/src/chrome/locale/gl/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=falta un transporte enchufábel
torlauncher.nsresult.NS_ERROR_NET_RESET=Perdeuse a conexión co servidor.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Non se puido conectar co servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Non se puido conectar co servidor intermedio.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/gu-IN/network-settings.dtd b/src/chrome/locale/gu-IN/network-settings.dtd
index 2e013e8..f913160 100644
--- a/src/chrome/locale/gu-IN/network-settings.dtd
+++ b/src/chrome/locale/gu-IN/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "ઑફલાઇન">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/gu-IN/torlauncher.properties b/src/chrome/locale/gu-IN/torlauncher.properties
index cf08643..497a323 100644
--- a/src/chrome/locale/gu-IN/torlauncher.properties
+++ b/src/chrome/locale/gu-IN/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/he/network-settings.dtd b/src/chrome/locale/he/network-settings.dtd
index 7f69d48..7b5c0b7 100644
--- a/src/chrome/locale/he/network-settings.dtd
+++ b/src/chrome/locale/he/network-settings.dtd
@@ -52,7 +52,7 @@
<!ENTITY torsettings.copyLog "העתק את יומן Tor ללוח החיתוך">
<!ENTITY torsettings.proxyHelpTitle "עזרת ייפוי־כוח">
-<!ENTITY torsettings.proxyHelp1 "ייפוי־כוח מקומי נדרש בעת התחברות דרך רשת של חברה, בית ספר או אוניברסיטה. אם אינך בטוח כיצד לענות על שאלה זו, הבט בהגדרות האינטרנט בדפדפן אחר או בדוק בהגדרות הרשת של מערכתך.">
+<!ENTITY torsettings.proxyHelp1 "ייפוי־כוח מקומי נדרש בזמן התחברות דרך רשת של חברה, בית ספר או אוניברסיטה. אם אינך בטוח כיצד לענות על שאלה זו, הבט בהגדרות האינטרנט בדפדפן אחר או בדוק בהגדרות הרשת של מערכתך.">
<!ENTITY torsettings.bridgeHelpTitle "עזרת ממסרי גשר">
<!ENTITY torsettings.bridgeHelp1 "גשרים הם ממסרים לא ברשימה אשר מקשים לחסום חיבורים אל רשת Tor.  כל סוג של גשר משתמש בשיטה שונה כדי למנוע צינזור  ה-obfs גורם לתעבורה שלך להיראות כרעש אקראי, וה-meek גורם לתעבורה שלך להיראות כאילו היא מתחברת אל שירות זה במקום אל Tor.">
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "הגדרות Tor">
<!ENTITY torPreferences.torSettingsDescription "דפדפן Tor מנתב את התעבורה שלך על רשת Tor, המופעלת ע״י אלפי מתנדבים ברחבי העולם." >
<!ENTITY torPreferences.learnMore "למד עוד">
+<!ENTITY torPreferences.quickstart "התחלה זריזה">
+<!ENTITY torPreferences.quickstartDescription " התחלה זריזה מאפשרת אל דפדפן Tor להתחבר באופן אוטומטי.">
+<!ENTITY torPreferences.quickstartCheckbox "התחבר תמיד באופן אוטומטי">
<!ENTITY torPreferences.bridges "גשרים">
<!ENTITY torPreferences.bridgesDescription "גשרים עוזרים לך להשיג גישה אל רשת Tor במקומות בהם Tor חסום. על סמך המקום שאתה נמצא בו, גשר אחד עשוי לעבוד בצורה טובה יותר מאחד אחר.">
<!ENTITY torPreferences.useBridge "השתמש בגשר">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "הצג את יומני Tor.">
<!ENTITY torPreferences.viewLogs "הצג יומנים…">
<!ENTITY torPreferences.torLogsDialogTitle "יומני Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "נסה להתחבר שוב">
+<!ENTITY torConnect.offline "לא מקוון">
+<!ENTITY torConnect.connectMessage "שינויים אל הגדרות Tor לא ייכנסו לתוקף עד שתתחבר אל רשת Tor">
+<!ENTITY torConnect.tryAgainMessage "דפדפן Tor נכשל בהקמת חיבור אל רשת Tor">
+<!ENTITY torConnect.connectingConcise "מתחבר…">
+<!ENTITY torConnect.connectedConcise "מחובר">
+<!ENTITY torConnect.copyLog "העתק יומני Tor">
diff --git a/src/chrome/locale/he/torlauncher.properties b/src/chrome/locale/he/torlauncher.properties
index 15925a4..acfb764 100644
--- a/src/chrome/locale/he/torlauncher.properties
+++ b/src/chrome/locale/he/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=תעבורה נתיקה חסרה
torlauncher.nsresult.NS_ERROR_NET_RESET=החיבור אל השרת אבד.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=לא היה ניתן להתחבר אל השרת.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=לא היה ניתן להתחבר אל ייפוי הכוח.
+
+torlauncher.copiedNLogMessagesShort=%S יומנים הועתקו
diff --git a/src/chrome/locale/hi-IN/network-settings.dtd b/src/chrome/locale/hi-IN/network-settings.dtd
index 4266275..b938066 100644
--- a/src/chrome/locale/hi-IN/network-settings.dtd
+++ b/src/chrome/locale/hi-IN/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "टोर ब्राउजर आपके इंटरनेट यातायात को टोर नेटवर्क के द्वारा भेजता है जो कि हजारों स्वयंसेवकों के द्वारा चलाया जाता है।" >
<!ENTITY torPreferences.learnMore "और अधिक जानें">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "पुल">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "ऑफलाइन">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "कनेक्ट हो रहा है ...">
+<!ENTITY torConnect.connectedConcise "जुड़े हुए">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/hi-IN/torlauncher.properties b/src/chrome/locale/hi-IN/torlauncher.properties
index 60dedca..e946673 100644
--- a/src/chrome/locale/hi-IN/torlauncher.properties
+++ b/src/chrome/locale/hi-IN/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=प्लग करने लायक
torlauncher.nsresult.NS_ERROR_NET_RESET=सर्वर से कनेक्शन खो गया था।
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=सर्वर से संपर्क स्थापित नही हो सका।
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=प्रॉक्सी से कनेक्ट नहीं हो सका।
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/hr/network-settings.dtd b/src/chrome/locale/hr/network-settings.dtd
index 4aaa597..b3b5334 100644
--- a/src/chrome/locale/hr/network-settings.dtd
+++ b/src/chrome/locale/hr/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor postavke">
<!ENTITY torPreferences.torSettingsDescription "Tor preglednik usmjerava tvoj promet na Tor mrežu, koju pokreću tisuće volontera širom svijeta." >
<!ENTITY torPreferences.learnMore "Saznaj više">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Mostovi">
<!ENTITY torPreferences.bridgesDescription "Mostovi pomažu pristupiti Tor-mreži na mjestima gdje je Tor blokiran. Ovisno o tome gdje se nalaziš, neki mostovi rade bolje od drugih.">
<!ENTITY torPreferences.useBridge "Koristi most">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Pogledaj log-zapise Tora.">
<!ENTITY torPreferences.viewLogs "Pogledaj log-zapise …">
<!ENTITY torPreferences.torLogsDialogTitle "Log-zapisi Tora">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Izvanmrežno">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Spajam...">
+<!ENTITY torConnect.connectedConcise "Spojeno">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/hr/torlauncher.properties b/src/chrome/locale/hr/torlauncher.properties
index aff6162..6207f78 100644
--- a/src/chrome/locale/hr/torlauncher.properties
+++ b/src/chrome/locale/hr/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=nedostaje priključni transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Veza s poslužiteljem je izgubljena.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Neuspjelo povezivanje s poslužiteljem.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Neuspjelo povezivanje s proxijem.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/hu/network-settings.dtd b/src/chrome/locale/hu/network-settings.dtd
index f3f84ab..fd872a9 100644
--- a/src/chrome/locale/hu/network-settings.dtd
+++ b/src/chrome/locale/hu/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor beállítások">
<!ENTITY torPreferences.torSettingsDescription "A Tor böngésző átroutolja forgalmát a Tor hálózaton, amit több ezer önkéntes tart fenn, szerte a világon." >
<!ENTITY torPreferences.learnMore "Tudjon meg többet">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Hidak">
<!ENTITY torPreferences.bridgesDescription "A hidak segíthetik a Tor hálózatok elérését olyan helyeken, ahol a Tor blokkolt. Attól függően, hogy hol van egyik híd jobban működhet, mint egy másik.">
<!ENTITY torPreferences.useBridge "Híd használata">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor napló megtekintése.">
<!ENTITY torPreferences.viewLogs "Napló megtekintése...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Napló">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Csatlakozás...">
+<!ENTITY torConnect.connectedConcise "Csatlakozva">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/hu/torlauncher.properties b/src/chrome/locale/hu/torlauncher.properties
index 3ac1c88..1848bd5 100644
--- a/src/chrome/locale/hu/torlauncher.properties
+++ b/src/chrome/locale/hu/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=hiányzó becsatlakoztatható átvitel
torlauncher.nsresult.NS_ERROR_NET_RESET=A kapcsolat a szerverhez elveszett.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Sikertelen a csatlakozás a szerverhez.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Sikertelen a csatlakozás a proxy-hoz.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/hy-AM/network-settings.dtd b/src/chrome/locale/hy-AM/network-settings.dtd
index 1eea1fd..accd492 100644
--- a/src/chrome/locale/hy-AM/network-settings.dtd
+++ b/src/chrome/locale/hy-AM/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor կարգավորումներ">
<!ENTITY torPreferences.torSettingsDescription "Tor դիտարկիչը ուղղորդում է Ձեր երթևեկը Tor ցանցի միջոցով, որը գործարկում են հազարավոր կամավորներ ամբողջ աշխարհում: " >
<!ENTITY torPreferences.learnMore "Իմանալ ավելին">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Կամուրջներ">
<!ENTITY torPreferences.bridgesDescription "Կամուրջներն օգնում են Ձեզ Tor-ը արգելափակված տեղերում Tor ցանցի մատչելիություն ունենսլ: Կախված նրանից թե որտեղ եք, մի կամուրջ կարող է ավելի լավ աշխատել քան մյուսը:">
<!ENTITY torPreferences.useBridge "Օգտագործել կամուրջը">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Տեսնել Tor-ի մատյանները:">
<!ENTITY torPreferences.viewLogs "Տեսնել մատյանները...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-ի մատյաններ">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Անցանց">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Միացվեց">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/hy-AM/torlauncher.properties b/src/chrome/locale/hy-AM/torlauncher.properties
index 8286b70..338f8fd 100644
--- a/src/chrome/locale/hy-AM/torlauncher.properties
+++ b/src/chrome/locale/hy-AM/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/id/network-settings.dtd b/src/chrome/locale/id/network-settings.dtd
index c26f2d4..6807a58 100644
--- a/src/chrome/locale/id/network-settings.dtd
+++ b/src/chrome/locale/id/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Pengaturan Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser mengalihkan lalulintas kamu melalui Jaringan Tor, di jalankan oleh ribuan sukarelawan di seluruh dunia." >
<!ENTITY torPreferences.learnMore "Pelajari lebih lanjut">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Jembatan-jembatan">
<!ENTITY torPreferences.bridgesDescription "Jembatan membantu Anda mengakses Jaringan Tor dimana Tor diblokir. Tergantung pada dimana Anda tinggal, satu jembatan mungkin dapat bekerja lebih baik daripada yang lainnya.">
<!ENTITY torPreferences.useBridge "Gunakan bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Lihat Catatan Tor">
<!ENTITY torPreferences.viewLogs "Lihat Catatan....">
<!ENTITY torPreferences.torLogsDialogTitle "Catatan Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Coba Sambungkan Kembali">
+<!ENTITY torConnect.offline "Luring">
+<!ENTITY torConnect.connectMessage "Perubahan untuk Pengaturan Tor tidak akan berdampak sampai Anda tersambung ke Jaringan Tor">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser telah gagal membuat koneksi ke Jaringan Tor">
+<!ENTITY torConnect.connectingConcise "Menyambung...">
+<!ENTITY torConnect.connectedConcise "Terhubung">
+<!ENTITY torConnect.copyLog "Salin Log Tor">
diff --git a/src/chrome/locale/id/torlauncher.properties b/src/chrome/locale/id/torlauncher.properties
index 7a04da1..f79b718 100644
--- a/src/chrome/locale/id/torlauncher.properties
+++ b/src/chrome/locale/id/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=kehilangan pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Koneksi ke server terputus.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Tidak bisa terhubung dengan server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Tidak bisa tersambung ke proxy:
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/is/network-settings.dtd b/src/chrome/locale/is/network-settings.dtd
index 3d07d1a..f4c6fe6 100644
--- a/src/chrome/locale/is/network-settings.dtd
+++ b/src/chrome/locale/is/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Stillingar Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor-vafrinn beinir umferðinni þinni um Tor-netið, sem rekið er af þúsundum sjálfboðaliða um víða veröld." >
<!ENTITY torPreferences.learnMore "Fræðast frekar">
+<!ENTITY torPreferences.quickstart "Flýtiræsing">
+<!ENTITY torPreferences.quickstartDescription "Flýtiræsing (Quickstart) gerir Tor-vafranum kleift að tengjast sjálfkrafa.">
+<!ENTITY torPreferences.quickstartCheckbox "Alltaf tengjast sjálfkrafa">
<!ENTITY torPreferences.bridges "Brýr">
<!ENTITY torPreferences.bridgesDescription "Brýr hjálpa þér við að fá aðgang að Tor-netkerfinu á stöðum þar sem lokað er á Tor. Það fer eftir því hvar þú ert hvaða brú virkar betur en einhver önnur.">
<!ENTITY torPreferences.useBridge "Nota brú">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Skoða atvikaskrár Tor.">
<!ENTITY torPreferences.viewLogs "Skoða atvikaskrár…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor atvikaskrá (log)">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Prófaðu að tengjast aftur">
+<!ENTITY torConnect.offline "Ónettengt">
+<!ENTITY torConnect.connectMessage "Breytingar á stillingum Tor taka ekki gildi fyrr en þú tengist við Tor-netkerfið">
+<!ENTITY torConnect.tryAgainMessage "Tor-vafranum mistókst að koma á tengingu við Tor-netið">
+<!ENTITY torConnect.connectingConcise "Tengist…">
+<!ENTITY torConnect.connectedConcise "Tengt">
+<!ENTITY torConnect.copyLog "Afrita Tor-atvikaskrár">
diff --git a/src/chrome/locale/is/torlauncher.properties b/src/chrome/locale/is/torlauncher.properties
index 66a49e0..657e784 100644
--- a/src/chrome/locale/is/torlauncher.properties
+++ b/src/chrome/locale/is/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=vantar 'pluggable transport' tengileiði
torlauncher.nsresult.NS_ERROR_NET_RESET=Missti tengingu við þjóninn.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Tókst ekki að tengjast þjóninum.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Tókst ekki að tengjast milliþjóninum.
+
+torlauncher.copiedNLogMessagesShort=Afritaði %S atvikaskrár
diff --git a/src/chrome/locale/it/network-settings.dtd b/src/chrome/locale/it/network-settings.dtd
index 67d5aff..0443c0e 100644
--- a/src/chrome/locale/it/network-settings.dtd
+++ b/src/chrome/locale/it/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Impostazioni di Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser indirizza il tuo traffico nella rete Tor, gestita da migliaia di volontari in tutto il mondo." >
<!ENTITY torPreferences.learnMore "Maggiori informazioni">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "I bridge ti aiutano ad accedere alla rete Tor in luoghi dove Tor viene bloccato. A seconda di dove ti trovi, un bridge può funzionare meglio di un altro.">
<!ENTITY torPreferences.useBridge "Usa un bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Visualizza i log di Tor.">
<!ENTITY torPreferences.viewLogs "Visualizza Log...">
<!ENTITY torPreferences.torLogsDialogTitle "Log di Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Prova a riconnettere">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Le modifiche alle impostazioni di Tor non verranno applicate finché non ti connetti alla rete Tor">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser non è riuscito a stabilire una connessione alla rete Tor">
+<!ENTITY torConnect.connectingConcise "Connessione in corso...">
+<!ENTITY torConnect.connectedConcise "Connesso">
+<!ENTITY torConnect.copyLog "Copia i log di Tor">
diff --git a/src/chrome/locale/it/torlauncher.properties b/src/chrome/locale/it/torlauncher.properties
index 9597d81..6b71e2f 100644
--- a/src/chrome/locale/it/torlauncher.properties
+++ b/src/chrome/locale/it/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggable transport mancante
torlauncher.nsresult.NS_ERROR_NET_RESET=Connessione al server persa.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Connessione al server fallita.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Connessione al proxy fallita.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ja/network-settings.dtd b/src/chrome/locale/ja/network-settings.dtd
index ff83b49..7c2f2c3 100644
--- a/src/chrome/locale/ja/network-settings.dtd
+++ b/src/chrome/locale/ja/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor の設定">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser は通信トラフィックを Tor ネットワークを経由させて送信します。Tor ネットワークは世界中の何千ものボランティアによって運用されています。" >
<!ENTITY torPreferences.learnMore "詳細情報">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridge">
<!ENTITY torPreferences.bridgesDescription "Bridge は Tor がブロックされる地域から Tor ネットワークにアクセスすることを手助けします。地域によって、ある Bridge が他のものよりうまく動作する可能性があります。">
<!ENTITY torPreferences.useBridge "Bridge を使用する">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor のログを表示する。">
<!ENTITY torPreferences.viewLogs "ログを表示…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor ログ">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "再度接続を試す">
+<!ENTITY torConnect.offline "オフライン">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "接続中…">
+<!ENTITY torConnect.connectedConcise "接続済み">
+<!ENTITY torConnect.copyLog "Tor ログをコピー">
diff --git a/src/chrome/locale/ja/torlauncher.properties b/src/chrome/locale/ja/torlauncher.properties
index 0d1eedd..64d57a6 100644
--- a/src/chrome/locale/ja/torlauncher.properties
+++ b/src/chrome/locale/ja/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=プラグ可能な転送が見つかり
torlauncher.nsresult.NS_ERROR_NET_RESET=サーバーへの接続が切断されました。\n
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=サーバーに接続できませんでした。\n
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=プロクシーに接続できませんでした。
+
+torlauncher.copiedNLogMessagesShort=%S ログをコピーしました
diff --git a/src/chrome/locale/ka/network-settings.dtd b/src/chrome/locale/ka/network-settings.dtd
index 7d0e5dc..6298399 100644
--- a/src/chrome/locale/ka/network-settings.dtd
+++ b/src/chrome/locale/ka/network-settings.dtd
@@ -42,7 +42,7 @@
<!ENTITY torsettings.useBridges.default "ჩაშენებული გადამცემი ხიდის მითითება">
<!ENTITY torsettings.useBridges.default.placeholder "ხიდის მითითება">
<!ENTITY torsettings.useBridges.bridgeDB "გადამცემი ხიდის მოთხოვნა საიტიდან torproject.org">
-<!ENTITY torsettings.useBridges.captchaSolution.placeholder "შეიყვანეთ სურათზე მოცემული სიმბოლოები">
+<!ENTITY torsettings.useBridges.captchaSolution.placeholder "შეიყვანეთ სურათიდან სიმბოლოები">
<!ENTITY torsettings.useBridges.reloadCaptcha.tooltip "ახალი კოდის მიღება">
<!ENTITY torsettings.useBridges.captchaSubmit "გაგზავნა">
<!ENTITY torsettings.useBridges.custom "ნაცნობი გადამცემი ხიდის მითითება">
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor-ის პარამეტრები">
<!ENTITY torPreferences.torSettingsDescription "Tor-ბრაუზერი თქვენს კავშირს ატარებს Tor-ქსელის გავლით, რომლის მუშაობასაც უზრუნველყოფს ათასობით მოხალისე მთელი მსოფლიოდან." >
<!ENTITY torPreferences.learnMore "იხილეთ ვრცლად">
+<!ENTITY torPreferences.quickstart "სწაფგაშვება">
+<!ENTITY torPreferences.quickstartDescription "სწრაფგაშვების მეშვეობით, Tor-ბრაუზერი ავტომატურად დაუკავშირდება.">
+<!ENTITY torPreferences.quickstartCheckbox "ყოველთვის თვითდაკავშირება">
<!ENTITY torPreferences.bridges "გადამცემი ხიდები">
<!ENTITY torPreferences.bridgesDescription "გადამცემი ხიდების მეშვეობით შეგიძლიათ დაუკავშირდეთ Tor-ქსელს იქ, სადაც Tor-ს ზღუდავენ. იმისდა მიხედვით, თუ სად იმყოფებით, ზოგმა ხიდმა უკეთ შეიძლება იმუშაოს, ვიდრე სხვამ.">
<!ENTITY torPreferences.useBridge "ხიდის გამოყენება">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "იხილეთ Tor-ის ჩანაწერები.">
<!ENTITY torPreferences.viewLogs "ჩანაწერების ნახვა...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-ის ჩანაწერები">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "კვლავ სცადეთ დაკავშირება">
+<!ENTITY torConnect.offline "კავშირგარეშე">
+<!ENTITY torConnect.connectMessage "ცვლილებები Tor-ის პარამეტრებში არ აისახება, სანამ Tor-ქსელს არ დაუკავშირდებით.">
+<!ENTITY torConnect.tryAgainMessage "Tor-ბრაუზერმა ვერ მოახერხა კავშირის დამყარება Tor-ქსელთან">
+<!ENTITY torConnect.connectingConcise "უკავშირდება...">
+<!ENTITY torConnect.connectedConcise "მიერთებული">
+<!ENTITY torConnect.copyLog "Tor-ის ჩანაწერების ასლი">
diff --git a/src/chrome/locale/ka/torlauncher.properties b/src/chrome/locale/ka/torlauncher.properties
index 473ef6c..c8571c3 100644
--- a/src/chrome/locale/ka/torlauncher.properties
+++ b/src/chrome/locale/ka/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=მისაერთებელი გ
torlauncher.nsresult.NS_ERROR_NET_RESET=სერვერთან კავშირი დაიკარგა.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=სერვერთან დაკავშირება ვერ ხერხდება.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=პროქსისთან დაკავშირება ვერ ხერხდება.
+
+torlauncher.copiedNLogMessagesShort=აღებულია %S ჩანაწერის ასლი
diff --git a/src/chrome/locale/kk/network-settings.dtd b/src/chrome/locale/kk/network-settings.dtd
index b1e0636..c40224f 100644
--- a/src/chrome/locale/kk/network-settings.dtd
+++ b/src/chrome/locale/kk/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Қосылым орнатылуда…">
+<!ENTITY torConnect.connectedConcise "Қосылулы">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/kk/torlauncher.properties b/src/chrome/locale/kk/torlauncher.properties
index d574e5d..bf10c9b 100644
--- a/src/chrome/locale/kk/torlauncher.properties
+++ b/src/chrome/locale/kk/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggable transport қосылмайды
torlauncher.nsresult.NS_ERROR_NET_RESET=Сервермен байланыс жоғалды.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Серверге қосылу мүмкін болмады.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Проксиге қосылу мүмкін болмады.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/km/network-settings.dtd b/src/chrome/locale/km/network-settings.dtd
index 8933fcb..3e77989 100644
--- a/src/chrome/locale/km/network-settings.dtd
+++ b/src/chrome/locale/km/network-settings.dtd
@@ -28,7 +28,7 @@
<!ENTITY torsettings.useProxy.checkbox "I use a proxy to connect to the Internet">
<!ENTITY torsettings.useProxy.type "Proxy Type">
<!ENTITY torsettings.useProxy.type.placeholder "select a proxy type">
-<!ENTITY torsettings.useProxy.address "Address">
+<!ENTITY torsettings.useProxy.address "អាសយដ្ឋាន">
<!ENTITY torsettings.useProxy.address.placeholder "អាសយដ្ឋាន IP ឬឈ្មោះម៉ាស៊ីន">
<!ENTITY torsettings.useProxy.port "Port">
<!ENTITY torsettings.useProxy.username "ឈ្មោះអ្នកប្រើប្រាស់">
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "ស្វែងយល់បន្ថែម">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "ក្រៅបណ្តាញ">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "កំពុងតភ្ជាប់...">
+<!ENTITY torConnect.connectedConcise "បានភ្ជាប់">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/km/torlauncher.properties b/src/chrome/locale/km/torlauncher.properties
index 457fd70..aced1f0 100644
--- a/src/chrome/locale/km/torlauncher.properties
+++ b/src/chrome/locale/km/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=បាត់ការបញ្ជ
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ko/network-settings.dtd b/src/chrome/locale/ko/network-settings.dtd
index f64e05a..8bf3621 100644
--- a/src/chrome/locale/ko/network-settings.dtd
+++ b/src/chrome/locale/ko/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor 설정">
<!ENTITY torPreferences.torSettingsDescription "Tor 브라우저는 전세계 수천명의 자원 봉사자에 의해 운영되는 Tor 네트워크와 당신을 연결합니다." >
<!ENTITY torPreferences.learnMore "더 알아보기">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "브릿지 (중계서버)">
<!ENTITY torPreferences.bridgesDescription "브릿지는 Tor가 차단된 위치에서 Tor 네트워크에 액세스하는 데 도움이 됩니다. 위치에 따라 브릿지 하나가 다른 중계서버보다 더 잘 작동할 수 있습니다.">
<!ENTITY torPreferences.useBridge "브릿지 사용">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor 로그를 봅니다.">
<!ENTITY torPreferences.viewLogs "로그보기 ...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor 로그">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "연결 재시도">
+<!ENTITY torConnect.offline "오프라인">
+<!ENTITY torConnect.connectMessage "Tor 설정 변경 사항은 Tor 네트워크에 연결할 때까지 적용되지 않음">
+<!ENTITY torConnect.tryAgainMessage "Tor 브라우저가 Tor 네트워크에 대한 연결을 설정하지 못했음">
+<!ENTITY torConnect.connectingConcise "접속중...">
+<!ENTITY torConnect.connectedConcise "접속됨">
+<!ENTITY torConnect.copyLog "Tor 로그 복사하기">
diff --git a/src/chrome/locale/ko/torlauncher.properties b/src/chrome/locale/ko/torlauncher.properties
index 9fa00b1..01c84c3 100644
--- a/src/chrome/locale/ko/torlauncher.properties
+++ b/src/chrome/locale/ko/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=플러그가 가능한 전송을 찾을
torlauncher.nsresult.NS_ERROR_NET_RESET=서버와의 연결이 끊어졌습니다.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=서버와 연결할 수 없습니다.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=프록시와 연결할 수 없습니다.
+
+torlauncher.copiedNLogMessagesShort=%S 로그 복사됨
diff --git a/src/chrome/locale/lt/network-settings.dtd b/src/chrome/locale/lt/network-settings.dtd
index 6bac8f7..9db3741 100644
--- a/src/chrome/locale/lt/network-settings.dtd
+++ b/src/chrome/locale/lt/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor nustatymai">
<!ENTITY torPreferences.torSettingsDescription "Tor Naršyklė nukreipia jūsų srautą per Tor tinklą, veikiantį po visą pasaulį išsidėsčiusių tūkstančių savanorių dėka." >
<!ENTITY torPreferences.learnMore "Sužinokite daugiau">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Tinklų tiltai">
<!ENTITY torPreferences.bridgesDescription "Tinklo tiltai padeda jums pasiekti Tor tinklą, vietose kur Tor užblokuotas. Priklausomai nuo to kur esate, vienas tiltas gali veikti geriau nei kitas.">
<!ENTITY torPreferences.useBridge "Naudoti tinklų tiltą">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Rodyti Tor žurnalus.">
<!ENTITY torPreferences.viewLogs "Rodyti žurnalus…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor žurnalai">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Nepasiekiama(-s)">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Jungiamasi…">
+<!ENTITY torConnect.connectedConcise "Prisijungta">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/lt/torlauncher.properties b/src/chrome/locale/lt/torlauncher.properties
index 0518391..59aab79 100644
--- a/src/chrome/locale/lt/torlauncher.properties
+++ b/src/chrome/locale/lt/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=trūksta keičiamojo perdavimo
torlauncher.nsresult.NS_ERROR_NET_RESET=Ryšys su serveriu nutrūko.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Nepavyko prisijungti prie serverio.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Nepavyko prisijungti prie įgaliotojo serverio.
+
+torlauncher.copiedNLogMessagesShort=Nukopijuota %S žurnalų
diff --git a/src/chrome/locale/lv/network-settings.dtd b/src/chrome/locale/lv/network-settings.dtd
index 9e6af6d..7f4beec 100644
--- a/src/chrome/locale/lv/network-settings.dtd
+++ b/src/chrome/locale/lv/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Tilti">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Bezsaistē">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/lv/torlauncher.properties b/src/chrome/locale/lv/torlauncher.properties
index bc22322..2ca1699 100644
--- a/src/chrome/locale/lv/torlauncher.properties
+++ b/src/chrome/locale/lv/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=trūkst spraudņojamu transportu
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/mk/network-settings.dtd b/src/chrome/locale/mk/network-settings.dtd
index 89dfcdc..aad3842 100644
--- a/src/chrome/locale/mk/network-settings.dtd
+++ b/src/chrome/locale/mk/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Поставки">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser го рутира вашиот сообраќај преку Tor мрежата, водена од илјадници волонтери ширум светот." >
<!ENTITY torPreferences.learnMore "Научете повеќе">
+<!ENTITY torPreferences.quickstart "Брз почеток">
+<!ENTITY torPreferences.quickstartDescription "Брз почеток овозможува Tor Browser да се поврзува автоматски.">
+<!ENTITY torPreferences.quickstartCheckbox "Секогаш поврзи автоматски">
<!ENTITY torPreferences.bridges "Мостови">
<!ENTITY torPreferences.bridgesDescription "Мостовите ви помагаат да пристапите на Tor мрежата на места каде Tor е блокиран. Зависно од тоа каде сте, еден мост може да работи подобро од друг.">
<!ENTITY torPreferences.useBridge "Користи мост">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Види ги Tor логовите.">
<!ENTITY torPreferences.viewLogs "Види логови...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Логови">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Повторен обид за поврзување">
+<!ENTITY torConnect.offline "Офлајн / Исклучен">
+<!ENTITY torConnect.connectMessage "Промените во Tor Поставки нема да имаат ефект се додека не се поврзете на Tor мрежата.">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser не успеа да воспостави поврзување со Tor мрежата.">
+<!ENTITY torConnect.connectingConcise "Се поврзува...">
+<!ENTITY torConnect.connectedConcise "Поврзано">
+<!ENTITY torConnect.copyLog "Копирај Tor логови">
diff --git a/src/chrome/locale/mk/torlauncher.properties b/src/chrome/locale/mk/torlauncher.properties
index f707171..a8b1b77 100644
--- a/src/chrome/locale/mk/torlauncher.properties
+++ b/src/chrome/locale/mk/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=недостасува pluggable transpo
torlauncher.nsresult.NS_ERROR_NET_RESET=Поврзувањето со серверот беше изгубено.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Не може да се поврзе со серверот.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Не може да се поврзе со проксито.
+
+torlauncher.copiedNLogMessagesShort=Копирани %S логови
diff --git a/src/chrome/locale/ml/network-settings.dtd b/src/chrome/locale/ml/network-settings.dtd
index f8dbadf..4f95c47 100644
--- a/src/chrome/locale/ml/network-settings.dtd
+++ b/src/chrome/locale/ml/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "ടോർ ക്രമീകരണങ്ങൾ ">
<!ENTITY torPreferences.torSettingsDescription "സ്വയം സഹായിക്കുന്ന ഒരു പറ്റം ആളുകളുടെ സഹായത്തോടെ ടോർ ബ്രൌസർ ടോർ നെറ്വർക്കിലേക്കു നിങ്ങളെ ബന്ധിപ്പിക്കുന്നതാണ് ." >
<!ENTITY torPreferences.learnMore "കൂടുതൽ അറിയു">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "ബ്രിഡ്ജുകൾ ">
<!ENTITY torPreferences.bridgesDescription "ബ്രിഡ്ജുകൾ ടോർ തടഞ്ഞിട്ടുള്ള സ്ഥലങ്ങളിൽ ടോർ നെറ്റർക് ഉപയോഗിക്കാൻ സഹായിക്കുന്നു . ഒരു ബ്രിഡ്ജ് മറ്റ്റൊന്നിനേക്കാൾ നന്നായി പ്രേവര്തിക്കുന്നത് നിങ്ങൾ എവിടെയാണെന്നതിനെ ആശ്രയിച്ചിരിക്കും .">
<!ENTITY torPreferences.useBridge "ഒരു ബ്രിഡ്ജ് ഉപയോഗിക്കുക ">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "ടോർ ലോഗ്സ് കാണുക .">
<!ENTITY torPreferences.viewLogs "ലോഗുകൾ കാണുക…">
<!ENTITY torPreferences.torLogsDialogTitle "ടോർ ലോഗ്സ് ">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "ഓഫ്ലൈൻ">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "കണ്ണെക്റ്റിംഗ് / ബന്ധിപ്പിക്കുന്നു ..">
+<!ENTITY torConnect.connectedConcise "ബന്ധിപ്പിച്ചു">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ml/torlauncher.properties b/src/chrome/locale/ml/torlauncher.properties
index 35f9708..f5d5679 100644
--- a/src/chrome/locale/ml/torlauncher.properties
+++ b/src/chrome/locale/ml/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=പ്ലേഗ്ഗബിൽ ട്
torlauncher.nsresult.NS_ERROR_NET_RESET=സർവരും ആയിട്ടുള്ള ബന്ധം നഷ്ടപ്പെട്ട്
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=സർവറുമായി ബന്ധപ്പെടാൻ കഴിയുന്നില്ല
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=പ്രോക്സിയിലേക്കു ബന്ധപ്പെടുത്താൻ കഴിഞ്ഞില്ല
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/mr/network-settings.dtd b/src/chrome/locale/mr/network-settings.dtd
index 5ede175..597e3a4 100644
--- a/src/chrome/locale/mr/network-settings.dtd
+++ b/src/chrome/locale/mr/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "पूल ">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "कनेक्ट करीत आहे...">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/mr/torlauncher.properties b/src/chrome/locale/mr/torlauncher.properties
index 0c7af5f..08ed0a4 100644
--- a/src/chrome/locale/mr/torlauncher.properties
+++ b/src/chrome/locale/mr/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ms/network-settings.dtd b/src/chrome/locale/ms/network-settings.dtd
index 5984d7a..d26eebb 100644
--- a/src/chrome/locale/ms/network-settings.dtd
+++ b/src/chrome/locale/ms/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tetapan Tor">
<!ENTITY torPreferences.torSettingsDescription "Pelayar Tor menghala trafik anda ke dalam Rangkaian Tor, yang dioperasikan oleh beribu-ribu para sukarelawan di serata dunia." >
<!ENTITY torPreferences.learnMore "Ketahui Lebih Lanjut">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Jambatan, ataupun Bridges">
<!ENTITY torPreferences.bridgesDescription "Titi membantu anda capai Rangkaian Tor di kawasan yang mana Tor telah disekat. Bergantung pada kedudukan atau lokasi anda, titi ini mungkin berfungsi lebih baik berbanding titi-titi yang lain.">
<!ENTITY torPreferences.useBridge "Guna satu titi">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Lihat log Tor.">
<!ENTITY torPreferences.viewLogs "Lihat Log...">
<!ENTITY torPreferences.torLogsDialogTitle "Log Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Luar Talian">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ms/torlauncher.properties b/src/chrome/locale/ms/torlauncher.properties
index ec97f57..b24d154 100644
--- a/src/chrome/locale/ms/torlauncher.properties
+++ b/src/chrome/locale/ms/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=angkutan boleh palam hilang
torlauncher.nsresult.NS_ERROR_NET_RESET=Sambungan dengan pelayan telah terputus.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Tidak dapat bersambung dengan pelayan.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Tidak dapat bersambung dengan proksi.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/my/network-settings.dtd b/src/chrome/locale/my/network-settings.dtd
index 858bb5e..16e44f8 100644
--- a/src/chrome/locale/my/network-settings.dtd
+++ b/src/chrome/locale/my/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor အပြင်အဆင်များ">
<!ENTITY torPreferences.torSettingsDescription "ကမ္ဘာအနှံ့ရှိ လုပ်အားပေးများ လုပ်ဆောင်သော Tor ကွန်ယက်ပေါ်တွင် သင့်အသွားအလာများကို Tor ဘရောင်ဇာမှ လမ်းကြောင်းပေးပါသည်။" >
<!ENTITY torPreferences.learnMore "ထပ်မံလေ့လာမယ်">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "ချိတ်ဆက်တံတားများသည် Tor ကို ပိတ်ပယ်ထားသော နေရာများတွင် Tor ကွန်ယက်နှင့် ချိတ်ဆက်ရန် ကူညီပေးပါသည်။ သင့် တည်နေရာပေါ်မူတည်၍ ချိတ်ဆက်တံတားတစ်ခုသည် နောက်တစ်ခုထက် ပိုကောင်းနိုင်ပါလိမ့်မည်။">
<!ENTITY torPreferences.useBridge "ချိတ်ဆက်တံတား အသုံးပြုမယ်">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor မှတ်တမ်းများ ကိုကြည့်ရှုမယ်">
<!ENTITY torPreferences.viewLogs "မှတ်တမ်းများ ကြည့်ရှုမယ်...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor မှတ်တမ်းများ">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "လိုင်းတက်မနေပါ">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "ချိတ်ဆက်နေသည်…">
+<!ENTITY torConnect.connectedConcise "ချိတ်ဆက်ပြီးပါပြီ">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/my/torlauncher.properties b/src/chrome/locale/my/torlauncher.properties
index fb9e74e..0ee6e40 100644
--- a/src/chrome/locale/my/torlauncher.properties
+++ b/src/chrome/locale/my/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=အသွားအလာအယောင
torlauncher.nsresult.NS_ERROR_NET_RESET=ဆာဗာနှင့် ချိတ်ဆက်မှု ပျောက်ဆုံးခဲ့ပါသည်။
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=ဆာဗာနှင့် မချိတ်ဆက်နိုင်ခဲ့ပါ။
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=ကြားခံ proxy နှင့် မချိတ်ဆက်နိုင်ခဲ့ပါ။
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/nb-NO/network-settings.dtd b/src/chrome/locale/nb-NO/network-settings.dtd
index 97ac494..db51fcd 100644
--- a/src/chrome/locale/nb-NO/network-settings.dtd
+++ b/src/chrome/locale/nb-NO/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor-innstillinger">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser dirigerer trafikken din over Tor-nettverket, drevet av tusenvis av frivillige rundt om i verden." >
<!ENTITY torPreferences.learnMore "Lær mer">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Broer">
<!ENTITY torPreferences.bridgesDescription "Broer hjelper deg med å få tilgang til Tor-nettverket på steder der Tor er blokkert. Avhengig av hvor du er, kan det hende at en bro fungerer bedre enn en annen.">
<!ENTITY torPreferences.useBridge "Bruk en bro">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Se Tor-loggene.">
<!ENTITY torPreferences.viewLogs "Vis logger...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-logger">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Frakoblet">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Kobler til...">
+<!ENTITY torConnect.connectedConcise "Tilkoblet">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/nb-NO/torlauncher.properties b/src/chrome/locale/nb-NO/torlauncher.properties
index 769200e..8dd912a 100644
--- a/src/chrome/locale/nb-NO/torlauncher.properties
+++ b/src/chrome/locale/nb-NO/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggbar transport mangler
torlauncher.nsresult.NS_ERROR_NET_RESET=Tilkoblingen til tjeneren gitt tapt.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Kunne ikke koble til tjeneren.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Kunne ikke koble til mellomtjeneren.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ne/network-settings.dtd b/src/chrome/locale/ne/network-settings.dtd
index 47a7d9a..1b62944 100644
--- a/src/chrome/locale/ne/network-settings.dtd
+++ b/src/chrome/locale/ne/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ne/torlauncher.properties b/src/chrome/locale/ne/torlauncher.properties
index efa6f04..6d8d891 100644
--- a/src/chrome/locale/ne/torlauncher.properties
+++ b/src/chrome/locale/ne/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/nl-BE/network-settings.dtd b/src/chrome/locale/nl-BE/network-settings.dtd
index 8b182bb..9dad209 100644
--- a/src/chrome/locale/nl-BE/network-settings.dtd
+++ b/src/chrome/locale/nl-BE/network-settings.dtd
@@ -67,6 +67,9 @@ Dit kan enkele minuten duren.">
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -82,3 +85,12 @@ Dit kan enkele minuten duren.">
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Verbinden…">
+<!ENTITY torConnect.connectedConcise "Verbonden">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/nl-BE/torlauncher.properties b/src/chrome/locale/nl-BE/torlauncher.properties
index 12da1d9..786b118 100644
--- a/src/chrome/locale/nl-BE/torlauncher.properties
+++ b/src/chrome/locale/nl-BE/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/nl/network-settings.dtd b/src/chrome/locale/nl/network-settings.dtd
index f00fee0..cdc4254 100644
--- a/src/chrome/locale/nl/network-settings.dtd
+++ b/src/chrome/locale/nl/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor-instellingen">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routeert uw verkeer over het Tor-netwerk, mogelijk gemaakt door duizenden vrijwilligers over de hele wereld." >
<!ENTITY torPreferences.learnMore "Meer info">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges helpen u toegang te krijgen tot het Tor-netwerk op plaatsen waar Tor is geblokkeerd. Afhankelijke van waar u zich bevindt, werkt de ene bridge mogelijk beter dan de andere.">
<!ENTITY torPreferences.useBridge "Een bridge gebruiken">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "De Tor-logboeken weergeven">
<!ENTITY torPreferences.viewLogs "Logboeken weergeven…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-logboeken">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Probeer Opnieuw te Verbinden">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Wijzigingen aan Tor Instellingen zullen geen effect hebben totdat je verbind met het Tor Netwerk.">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser kon geen verbinding maken met het Tor Netwerk">
+<!ENTITY torConnect.connectingConcise "Bezig met verbinden...">
+<!ENTITY torConnect.connectedConcise "Verbonden">
+<!ENTITY torConnect.copyLog "Kopieer Tor Logboeken">
diff --git a/src/chrome/locale/nl/torlauncher.properties b/src/chrome/locale/nl/torlauncher.properties
index 3580fa6..c4c6c5a 100644
--- a/src/chrome/locale/nl/torlauncher.properties
+++ b/src/chrome/locale/nl/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggable transport ontbreekt
torlauncher.nsresult.NS_ERROR_NET_RESET=De verbinding met de server is verbroken.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Kon geen verbinding maken met de server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Kon geen verbinding maken met de proxy.
+
+torlauncher.copiedNLogMessagesShort=%S Logboeken Gekopieerd
diff --git a/src/chrome/locale/nn-NO/network-settings.dtd b/src/chrome/locale/nn-NO/network-settings.dtd
index 5c97e38..d9bb4be 100644
--- a/src/chrome/locale/nn-NO/network-settings.dtd
+++ b/src/chrome/locale/nn-NO/network-settings.dtd
@@ -1,5 +1,5 @@
<!ENTITY torsettings.dialog.title "Tor nettverksinnstillingar">
-<!ENTITY torsettings.wizard.title.default "Connect to Tor">
+<!ENTITY torsettings.wizard.title.default "Kople til Tor">
<!ENTITY torsettings.wizard.title.configure "Tor nettverksinnstillingar">
<!ENTITY torsettings.wizard.title.connecting "Establishing a Connection">
@@ -21,14 +21,14 @@
<!ENTITY torsettings.reconfigTor "Konfigurer på nytt.">
<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
+<!ENTITY torsettings.discardSettings.proceed "Fjern innstillingar og kople til">
<!ENTITY torsettings.optional "Valfritt">
-<!ENTITY torsettings.useProxy.checkbox "I use a proxy to connect to the Internet">
-<!ENTITY torsettings.useProxy.type "Proxy Type">
-<!ENTITY torsettings.useProxy.type.placeholder "select a proxy type">
-<!ENTITY torsettings.useProxy.address "Address">
+<!ENTITY torsettings.useProxy.checkbox "Eg brukar ein proxy for å kople til internett">
+<!ENTITY torsettings.useProxy.type "Proxy-type">
+<!ENTITY torsettings.useProxy.type.placeholder "vel ein proxy-type">
+<!ENTITY torsettings.useProxy.address "Addresse">
<!ENTITY torsettings.useProxy.address.placeholder "IP-adresse eller vertsnamn">
<!ENTITY torsettings.useProxy.port "Port">
<!ENTITY torsettings.useProxy.username "Brukarnamn">
@@ -51,7 +51,7 @@
<!ENTITY torsettings.copyLog "Copy Tor Log To Clipboard">
-<!ENTITY torsettings.proxyHelpTitle "Proxy Help">
+<!ENTITY torsettings.proxyHelpTitle "Proxy-hjelp">
<!ENTITY torsettings.proxyHelp1 "A local proxy might be needed when connecting through a company, school, or university network. If you are not sure whether a proxy is needed, look at the Internet settings in another browser or check your system's network settings.">
<!ENTITY torsettings.bridgeHelpTitle "Bridge Relay Help">
@@ -65,19 +65,31 @@
<!ENTITY torPreferences.categoryTitle "Tor">
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
-<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.learnMore "Les meir">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bruer">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
-<!ENTITY torPreferences.useBridge "Use a bridge">
-<!ENTITY torPreferences.requestNewBridge "Request a New Bridge…">
+<!ENTITY torPreferences.useBridge "Bruk ei bru">
+<!ENTITY torPreferences.requestNewBridge "Be om ei ny bru…">
<!ENTITY torPreferences.provideBridge "Provide a bridge">
-<!ENTITY torPreferences.advanced "Advanced">
+<!ENTITY torPreferences.advanced "Avansert">
<!ENTITY torPreferences.advancedDescription "Configure how Tor Browser connects to the internet.">
-<!ENTITY torPreferences.firewallPortsPlaceholder "Comma-separated values">
-<!ENTITY torPreferences.requestBridgeDialogTitle "Request Bridge">
+<!ENTITY torPreferences.firewallPortsPlaceholder "Komma-åtskilde verdiar">
+<!ENTITY torPreferences.requestBridgeDialogTitle "Be om bru">
<!ENTITY torPreferences.requestBridgeDialogWaitPrompt "Contacting BridgeDB. Please Wait.">
<!ENTITY torPreferences.requestBridgeDialogSolvePrompt "Solve the CAPTCHA to request a bridge.">
<!ENTITY torPreferences.requestBridgeErrorBadSolution "The solution is not correct. Please try again.">
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Fråkopla">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/nn-NO/torlauncher.properties b/src/chrome/locale/nn-NO/torlauncher.properties
index 765f48c..32955a7 100644
--- a/src/chrome/locale/nn-NO/torlauncher.properties
+++ b/src/chrome/locale/nn-NO/torlauncher.properties
@@ -34,7 +34,7 @@ torlauncher.bridge_suffix.meek-amazon=(works in China)
torlauncher.bridge_suffix.meek-azure=(works in China)
torlauncher.request_a_bridge=Request a Bridge…
-torlauncher.request_a_new_bridge=Request a New Bridge…
+torlauncher.request_a_new_bridge=Be om ei ny bru…
torlauncher.contacting_bridgedb=Contacting BridgeDB. Please wait.
torlauncher.captcha_prompt=Solve the CAPTCHA to request a bridge.
torlauncher.bad_captcha_solution=The solution is not correct. Please try again.
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/oc/network-settings.dtd b/src/chrome/locale/oc/network-settings.dtd
index 656b834..56f69c1 100644
--- a/src/chrome/locale/oc/network-settings.dtd
+++ b/src/chrome/locale/oc/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Fòra linha">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connexion…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/oc/torlauncher.properties b/src/chrome/locale/oc/torlauncher.properties
index 6ec8c40..e0b07f0 100644
--- a/src/chrome/locale/oc/torlauncher.properties
+++ b/src/chrome/locale/oc/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/pa-IN/network-settings.dtd b/src/chrome/locale/pa-IN/network-settings.dtd
index fe66b63..9ebac7a 100644
--- a/src/chrome/locale/pa-IN/network-settings.dtd
+++ b/src/chrome/locale/pa-IN/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "ਪੁੱਲ ਬਨ੍ਹਨਾ">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/pa-IN/torlauncher.properties b/src/chrome/locale/pa-IN/torlauncher.properties
index 8a8fd7f..37a74ce 100644
--- a/src/chrome/locale/pa-IN/torlauncher.properties
+++ b/src/chrome/locale/pa-IN/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/pl/network-settings.dtd b/src/chrome/locale/pl/network-settings.dtd
index ab3c106..58745fd 100644
--- a/src/chrome/locale/pl/network-settings.dtd
+++ b/src/chrome/locale/pl/network-settings.dtd
@@ -1,6 +1,6 @@
<!ENTITY torsettings.dialog.title "Ustawienia Sieci">
<!ENTITY torsettings.wizard.title.default "Połącz z siecią Tor">
-<!ENTITY torsettings.wizard.title.configure "Ustawienia Sieci Tor">
+<!ENTITY torsettings.wizard.title.configure "Ustawienia sieci Tor">
<!ENTITY torsettings.wizard.title.connecting "Nawiązywanie połączenia">
<!-- For locale picker: -->
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Ustawienia Tor">
<!ENTITY torPreferences.torSettingsDescription "Przeglądarka Tor kieruje Twój ruch przez sieć Tor, utrzymywaną przez tysiące wolontariuszy na całym świecie." >
<!ENTITY torPreferences.learnMore "Dowiedz się więcej">
+<!ENTITY torPreferences.quickstart "Szybki start">
+<!ENTITY torPreferences.quickstartDescription "Szybki start pozwala przeglądarce Tor na automatyczne łączenie.">
+<!ENTITY torPreferences.quickstartCheckbox "Zawsze łącz automatycznie">
<!ENTITY torPreferences.bridges "Mostki">
<!ENTITY torPreferences.bridgesDescription "Mostki ułatwiają dostęp do sieci Tor w miejscach, w których Tor jest zablokowany. W zależności od tego, gdzie jesteś, niektóre mostki mogą działać lepiej niż inne.">
<!ENTITY torPreferences.useBridge "Użyj mostku">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Zobacz dziennik zdarzeń Tor.">
<!ENTITY torPreferences.viewLogs "Wyświetl dziennik...">
<!ENTITY torPreferences.torLogsDialogTitle "Dziennik zdarzeń Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Spróbuj połączyć się ponownie">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Zmiany w ustawieniach Tor nie zaczną obowiązywać, dopóki nie połączysz się z siecią Tor">
+<!ENTITY torConnect.tryAgainMessage "Przeglądarka Tor nie może nawiązać połączenia z siecią Tor">
+<!ENTITY torConnect.connectingConcise "Trwa łączenie...">
+<!ENTITY torConnect.connectedConcise "Połączony">
+<!ENTITY torConnect.copyLog "Skopiuj dziennik zdarzeń Tor">
diff --git a/src/chrome/locale/pl/torlauncher.properties b/src/chrome/locale/pl/torlauncher.properties
index a7cba2a..29699df 100644
--- a/src/chrome/locale/pl/torlauncher.properties
+++ b/src/chrome/locale/pl/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=brak podłączanego transportu
torlauncher.nsresult.NS_ERROR_NET_RESET=Połączenie z serwerem zostało utracone.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Nie można połączyć się z serwerem.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Nie można połączyć się z serwerem proxy.
+
+torlauncher.copiedNLogMessagesShort=Skopiowanych logów %S
diff --git a/src/chrome/locale/pt-BR/network-settings.dtd b/src/chrome/locale/pt-BR/network-settings.dtd
index 0788eda..f04f36f 100644
--- a/src/chrome/locale/pt-BR/network-settings.dtd
+++ b/src/chrome/locale/pt-BR/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Configurações do Tor">
<!ENTITY torPreferences.torSettingsDescription "O Navegador Tor direciona seu tráfego pela Rede Tor, administrada por milhares de voluntários em todo o mundo." >
<!ENTITY torPreferences.learnMore "Saiba Mais">
+<!ENTITY torPreferences.quickstart "Inicio rápido">
+<!ENTITY torPreferences.quickstartDescription "O início rápido permite que o navegador Tor se conecte automaticamente.">
+<!ENTITY torPreferences.quickstartCheckbox "Sempre conectar automaticamente">
<!ENTITY torPreferences.bridges "Pontes">
<!ENTITY torPreferences.bridgesDescription "As pontes ajudam você a acessar a rede Tor em locais onde o Tor está bloqueado. Dependendo de onde você estiver, uma ponte pode funcionar melhor que outra.">
<!ENTITY torPreferences.useBridge "Use uma ponte">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Veja os logs do Tor.">
<!ENTITY torPreferences.viewLogs "Ver registros…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Tente conectar novamente">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "As alterações nas configurações do Tor não terão efeito até que você se conecte à rede Tor">
+<!ENTITY torConnect.tryAgainMessage "O navegador Tor não conseguiu estabelecer uma conexão com a rede Tor">
+<!ENTITY torConnect.connectingConcise "Conectando...">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copiar registros Tor">
diff --git a/src/chrome/locale/pt-BR/torlauncher.properties b/src/chrome/locale/pt-BR/torlauncher.properties
index 7320536..d5d2a02 100644
--- a/src/chrome/locale/pt-BR/torlauncher.properties
+++ b/src/chrome/locale/pt-BR/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=transportador plugável ausente
torlauncher.nsresult.NS_ERROR_NET_RESET=A conexão com o servidor foi perdida.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Não foi possível conectar ao servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Não foi possível se conectar ao proxy.
+
+torlauncher.copiedNLogMessagesShort=Copiado %S registros
diff --git a/src/chrome/locale/pt-PT/network-settings.dtd b/src/chrome/locale/pt-PT/network-settings.dtd
index 2b83f00..bc9c06e 100644
--- a/src/chrome/locale/pt-PT/network-settings.dtd
+++ b/src/chrome/locale/pt-PT/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Definições do Tor">
<!ENTITY torPreferences.torSettingsDescription "O Tor Browse envia o seu tráfego pela Tor Network, operada por milhares de voluntários em todo o mundo." >
<!ENTITY torPreferences.learnMore "Saber Mais">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Pontes">
<!ENTITY torPreferences.bridgesDescription "Pontes ajudam-no a aceder à Tor Network em sítios onde o Tor está bloqueado. Dependendo de onde estiver, uma ponte pode funcionar melhor que outra.">
<!ENTITY torPreferences.useBridge "Use uma ponte">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Ver os registos do Tor.">
<!ENTITY torPreferences.viewLogs "Ver os registos...">
<!ENTITY torPreferences.torLogsDialogTitle "Registos do Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Desligado">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "A conectar…">
+<!ENTITY torConnect.connectedConcise "Conectado">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/pt-PT/torlauncher.properties b/src/chrome/locale/pt-PT/torlauncher.properties
index cd52158..73e16ad 100644
--- a/src/chrome/locale/pt-PT/torlauncher.properties
+++ b/src/chrome/locale/pt-PT/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=transporte ligável em falta
torlauncher.nsresult.NS_ERROR_NET_RESET=A ligação para o servidor foi perdida.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Não foi possível ligar ao servidor.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Não foi possível ligar ao proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ro/network-settings.dtd b/src/chrome/locale/ro/network-settings.dtd
index 4260ea0..075e530 100644
--- a/src/chrome/locale/ro/network-settings.dtd
+++ b/src/chrome/locale/ro/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Setări Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser vă orientează traficul prin rețeaua Tor, condusă de mii de voluntari din întreaga lume." >
<!ENTITY torPreferences.learnMore "Află mai multe">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Punți">
<!ENTITY torPreferences.bridgesDescription "Podurile vă ajută să accesați rețeaua Tor în locurile în care Tor este blocat. În funcție de locul în care vă aflați, un pod poate funcționa mai bine decât altul.">
<!ENTITY torPreferences.useBridge "Folosiți un pod">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Vizualizați jurnalele Tor.">
<!ENTITY torPreferences.viewLogs "Vizualizați jurnalele ...">
<!ENTITY torPreferences.torLogsDialogTitle "Jurnalele Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Deconectat">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Se conectează...">
+<!ENTITY torConnect.connectedConcise "Conectat">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ro/torlauncher.properties b/src/chrome/locale/ro/torlauncher.properties
index ca3c8fa..9e0377c 100644
--- a/src/chrome/locale/ro/torlauncher.properties
+++ b/src/chrome/locale/ro/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=pluggable transport lipsă
torlauncher.nsresult.NS_ERROR_NET_RESET=Conexiunea cu serverul a fost pierdută.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Nu s-a putut conecta la server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Nu s-a putut conecta la proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ru/network-settings.dtd b/src/chrome/locale/ru/network-settings.dtd
index 980b887..d331ed9 100644
--- a/src/chrome/locale/ru/network-settings.dtd
+++ b/src/chrome/locale/ru/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Настройки Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser перенаправляет ваш трафик через сеть Tor. Ее поддерживают тысячи добровольцев по всему миру." >
<!ENTITY torPreferences.learnMore "Подробнее">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Мосты">
<!ENTITY torPreferences.bridgesDescription "Мосты помогают получить доступ к сети Tor там, где он заблокирован. В зависимости от вашего местонахождения один мост может работать лучше другого.">
<!ENTITY torPreferences.useBridge "Использовать мост">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Просмотр журнала Tor">
<!ENTITY torPreferences.viewLogs "Смотреть журнал…">
<!ENTITY torPreferences.torLogsDialogTitle "Журнал Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Переподключение">
+<!ENTITY torConnect.offline "Отключён">
+<!ENTITY torConnect.connectMessage "Изменения в настройках Tor не вступят в силу, пока вы не подключитесь к сети Tor">
+<!ENTITY torConnect.tryAgainMessage "Браузеру Tor не удалось установить соединение с сетью Tor">
+<!ENTITY torConnect.connectingConcise "Соединение...">
+<!ENTITY torConnect.connectedConcise "Подключено">
+<!ENTITY torConnect.copyLog "Копирование журналов Tor">
diff --git a/src/chrome/locale/ru/torlauncher.properties b/src/chrome/locale/ru/torlauncher.properties
index 43f1920..c431ad6 100644
--- a/src/chrome/locale/ru/torlauncher.properties
+++ b/src/chrome/locale/ru/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=отсутствует подключа
torlauncher.nsresult.NS_ERROR_NET_RESET=Соединение с сервером потеряно.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Ошибка подключения к серверу.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Ошибка подключения к прокси.
+
+torlauncher.copiedNLogMessagesShort=Скопировано логов: %S
diff --git a/src/chrome/locale/sk/network-settings.dtd b/src/chrome/locale/sk/network-settings.dtd
index fa1c371..f59858a 100644
--- a/src/chrome/locale/sk/network-settings.dtd
+++ b/src/chrome/locale/sk/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Nastavenia Tor">
<!ENTITY torPreferences.torSettingsDescription "Prehliadač Tor smeruje váš prenos cez sieť Tor, prevádzkovanú tisíckami dobrovoľníkov z celého sveta." >
<!ENTITY torPreferences.learnMore "Zistite viac">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Mosty">
<!ENTITY torPreferences.bridgesDescription "Premostenia vám pomáhajú pripojiť sa k sieti Tor tam, kde je Tor blokovaný. V závislosti od toho, kde sa nachádzate niektoré premostenie môže fungovať lepšie ako iné.">
<!ENTITY torPreferences.useBridge "Použiť premostenie">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Zobraziť záznamy Tor.">
<!ENTITY torPreferences.viewLogs "Zobraziť záznamy...">
<!ENTITY torPreferences.torLogsDialogTitle "Záznamy Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Pripojené">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/sk/torlauncher.properties b/src/chrome/locale/sk/torlauncher.properties
index 4b01fcc..f3a6450 100644
--- a/src/chrome/locale/sk/torlauncher.properties
+++ b/src/chrome/locale/sk/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=chýbajúca zásuvná preprava
torlauncher.nsresult.NS_ERROR_NET_RESET=Spojenie so serverom bolo prerušené
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Nedá sa pripojiť na server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Nedá sa pripojiť s proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/sl/network-settings.dtd b/src/chrome/locale/sl/network-settings.dtd
index f71684b..81ea0a4 100644
--- a/src/chrome/locale/sl/network-settings.dtd
+++ b/src/chrome/locale/sl/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Mostovi">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Povezan">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/sl/torlauncher.properties b/src/chrome/locale/sl/torlauncher.properties
index 0d2c360..e3ec6c8 100644
--- a/src/chrome/locale/sl/torlauncher.properties
+++ b/src/chrome/locale/sl/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=manjka vtični promet
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/sq/network-settings.dtd b/src/chrome/locale/sq/network-settings.dtd
index a9233f7..98b9041 100644
--- a/src/chrome/locale/sq/network-settings.dtd
+++ b/src/chrome/locale/sq/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Rregullime Tor">
<!ENTITY torPreferences.torSettingsDescription "Shfletuesi Tor e kalon trafikun tuaj përmes Rrjetit Tor, i mbajtur në këmbë nga mijëra vullnetarë anembanë botës." >
<!ENTITY torPreferences.learnMore "Mësoni Më Tepër">
+<!ENTITY torPreferences.quickstart "Nisje e shpejtë">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Lidhu përherë automatikisht">
<!ENTITY torPreferences.bridges "Ura">
<!ENTITY torPreferences.bridgesDescription "Urat ju ndihmojnë të përdorni Rrjetin Tor në vende ku Tor-i është i bllokuar. Në varësi të vendit ku ndodheni, një urë mund të punojë më mirë se një tjetër.">
<!ENTITY torPreferences.useBridge "Përdorni një urë">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Shihni regjistrat Tor.">
<!ENTITY torPreferences.viewLogs "Shihni Regjistra…">
<!ENTITY torPreferences.torLogsDialogTitle "Regjistra Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Riprovo Lidhjen">
+<!ENTITY torConnect.offline "I shkëputur">
+<!ENTITY torConnect.connectMessage "Ndryshimet te Rregullimet e Tor-it s’do të hyjnë në fuqi para se të lidheni me Rrjetin Tor">
+<!ENTITY torConnect.tryAgainMessage "Shfletuesi Tor dështoi në vendosjen e një lidhjeje me Rrjetin Tor">
+<!ENTITY torConnect.connectingConcise "Duke u kyqur...">
+<!ENTITY torConnect.connectedConcise "I lidhur">
+<!ENTITY torConnect.copyLog "Kopjo Regjistra Tor-i">
diff --git a/src/chrome/locale/sq/torlauncher.properties b/src/chrome/locale/sq/torlauncher.properties
index 26b3444..344a6c0 100644
--- a/src/chrome/locale/sq/torlauncher.properties
+++ b/src/chrome/locale/sq/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=mungon transport shtojcë
torlauncher.nsresult.NS_ERROR_NET_RESET=Humbi lidhja me shërbyesin.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=S’u bë dot lidhja me shërbyesin.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=S’u lidh dot me ndërmjetësin.
+
+torlauncher.copiedNLogMessagesShort=U kopjuan %S Regjistra
diff --git a/src/chrome/locale/sr/network-settings.dtd b/src/chrome/locale/sr/network-settings.dtd
index 8806a31..9334d0e 100644
--- a/src/chrome/locale/sr/network-settings.dtd
+++ b/src/chrome/locale/sr/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Mostovi">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Офлајн">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "Connected">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/sr/torlauncher.properties b/src/chrome/locale/sr/torlauncher.properties
index bc8f088..764c097 100644
--- a/src/chrome/locale/sr/torlauncher.properties
+++ b/src/chrome/locale/sr/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Недостаје прикључују
torlauncher.nsresult.NS_ERROR_NET_RESET=Veza sa serverom je izgubljena.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Neuspešno povezivanje sa serverom.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Neuspešno povezivanje sa proxy-jem.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/sv-SE/network-settings.dtd b/src/chrome/locale/sv-SE/network-settings.dtd
index 4a65574..448a615 100644
--- a/src/chrome/locale/sv-SE/network-settings.dtd
+++ b/src/chrome/locale/sv-SE/network-settings.dtd
@@ -65,7 +65,10 @@
<!ENTITY torPreferences.categoryTitle "Tor">
<!ENTITY torPreferences.torSettings "Tor-inställningar">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser dirigerar din trafik över Tor-nätverket, som drivs av tusentals volontärer runt om i världen." >
-<!ENTITY torPreferences.learnMore "Läs mer">
+<!ENTITY torPreferences.learnMore "Lär dig mer">
+<!ENTITY torPreferences.quickstart "Snabbstart">
+<!ENTITY torPreferences.quickstartDescription "Snabbstart gör att Tor Browser kan ansluta automatiskt.">
+<!ENTITY torPreferences.quickstartCheckbox "Anslut alltid automatiskt">
<!ENTITY torPreferences.bridges "Broar">
<!ENTITY torPreferences.bridgesDescription "Broar hjälper dig att komma åt Tor-nätverket på platser där Tor är blockerat. Beroende på var du är, kan en bro fungera bättre än en annan.">
<!ENTITY torPreferences.useBridge "Använd en bro">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Visa Tor-loggarna.">
<!ENTITY torPreferences.viewLogs "Visa loggar…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor-loggar">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Försök att ansluta igen">
+<!ENTITY torConnect.offline "Nedkopplad">
+<!ENTITY torConnect.connectMessage "Ändringar av Tor-inställningar träder inte i kraft förrän du ansluter till Tor-nätverket">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser har misslyckats med att upprätta en anslutning till Tor-nätverket">
+<!ENTITY torConnect.connectingConcise "Ansluter...">
+<!ENTITY torConnect.connectedConcise "Ansluten">
+<!ENTITY torConnect.copyLog "Kopiera Tor-loggar">
diff --git a/src/chrome/locale/sv-SE/torlauncher.properties b/src/chrome/locale/sv-SE/torlauncher.properties
index 2e024bd..e86f50b 100644
--- a/src/chrome/locale/sv-SE/torlauncher.properties
+++ b/src/chrome/locale/sv-SE/torlauncher.properties
@@ -23,7 +23,7 @@ torlauncher.failed_to_get_settings=Det går inte att hämta inställningarna fö
torlauncher.failed_to_save_settings=Det går inte att spara inställningarna för Tor.\n\n%S
torlauncher.ensure_tor_is_running=Vänligen försäkra dig om att Tor är startad.
-torlauncher.error_proxy_addr_missing=Du måste ange både en IP-adress eller värdnamn, samt ett port-nummer för att konfigurera Tor till att använda en proxy för att nå Internet.
+torlauncher.error_proxy_addr_missing=Du måste ange både en IP-adress eller värdnamn och ett portnummer för att konfigurera Tor till att använda en proxy för att komma åt internet.
torlauncher.error_proxy_type_missing=Du måste välja proxytyp.
torlauncher.error_bridges_missing=Du måste ange en eller flera broar.
torlauncher.error_default_bridges_type_missing=Du måste välja en transporttyp för de angivna broarna.
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Pluggable Transport saknas
torlauncher.nsresult.NS_ERROR_NET_RESET=Anslutningen till servern förlorades.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Kunde inte ansluta till servern.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Kunde inte ansluta till proxyn.
+
+torlauncher.copiedNLogMessagesShort=Kopierade %S-loggar
diff --git a/src/chrome/locale/sw/network-settings.dtd b/src/chrome/locale/sw/network-settings.dtd
index e2a96ab..c1ea496 100644
--- a/src/chrome/locale/sw/network-settings.dtd
+++ b/src/chrome/locale/sw/network-settings.dtd
@@ -67,6 +67,9 @@ nenosiri">
<!ENTITY torPreferences.torSettings "Mpangilio wa Tor">
<!ENTITY torPreferences.torSettingsDescription "Njia ya kivinjari cha Tor trafiki yako zaidi kwenye mtandao wa Tor, endesha kwa elfumoja kwa kujitolea ulimwenguni kote." >
<!ENTITY torPreferences.learnMore "jifunze zaid">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Madaraja">
<!ENTITY torPreferences.bridgesDescription "Madaraja yanakusaidia kufikia mtandao wa Tor sehemu ambayo Tor imefungiwa. Inategemea kua wapi ulipo, daraja moja linaweza kufanya kazi vizuri kuliko lingine.">
<!ENTITY torPreferences.useBridge "Tumia daraja">
@@ -82,3 +85,12 @@ nenosiri">
<!ENTITY torPreferences.viewTorLogs "Angalia log ya Tor.">
<!ENTITY torPreferences.viewLogs "Angalia Log...">
<!ENTITY torPreferences.torLogsDialogTitle "Log ya Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Nje ya mkondo">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Kuunganishwa...">
+<!ENTITY torConnect.connectedConcise "Kushikamana">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/sw/torlauncher.properties b/src/chrome/locale/sw/torlauncher.properties
index 33085b5..6750f21 100644
--- a/src/chrome/locale/sw/torlauncher.properties
+++ b/src/chrome/locale/sw/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=Kukosa usafiri unaoweza kuziba
torlauncher.nsresult.NS_ERROR_NET_RESET=Uunganisho kwenye seva ulipotea.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Haiwezi kunganishwa kwenye seva.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Haiwezi kuunganishwa na wakala.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ta/network-settings.dtd b/src/chrome/locale/ta/network-settings.dtd
index 671734a..b2d31a1 100644
--- a/src/chrome/locale/ta/network-settings.dtd
+++ b/src/chrome/locale/ta/network-settings.dtd
@@ -67,6 +67,9 @@
<!ENTITY torPreferences.torSettings "Tor அமைப்புகள்">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "மேலும் அறிய">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridgeகள்">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Bridge ஐப் பயன்படுத்துக">
@@ -82,3 +85,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor பதிகைகளைக் காண்க">
<!ENTITY torPreferences.viewLogs "பதிகைகளைக் காண்க...">
<!ENTITY torPreferences.torLogsDialogTitle "Tor பதிகைகள்">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "இணைக்கிறது...">
+<!ENTITY torConnect.connectedConcise "இணைக்கப்பட்டது">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ta/torlauncher.properties b/src/chrome/locale/ta/torlauncher.properties
index 6c5bdaa..8a3d409 100644
--- a/src/chrome/locale/ta/torlauncher.properties
+++ b/src/chrome/locale/ta/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/te/network-settings.dtd b/src/chrome/locale/te/network-settings.dtd
index d4c7def..44faccd 100644
--- a/src/chrome/locale/te/network-settings.dtd
+++ b/src/chrome/locale/te/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "సంబంధిత">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/te/torlauncher.properties b/src/chrome/locale/te/torlauncher.properties
index 2f17d55..2192b2a 100644
--- a/src/chrome/locale/te/torlauncher.properties
+++ b/src/chrome/locale/te/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/th/network-settings.dtd b/src/chrome/locale/th/network-settings.dtd
index bd74348..22a296c 100644
--- a/src/chrome/locale/th/network-settings.dtd
+++ b/src/chrome/locale/th/network-settings.dtd
@@ -64,8 +64,11 @@
<!-- #31286 about:preferences strings -->
<!ENTITY torPreferences.categoryTitle "Tor">
<!ENTITY torPreferences.torSettings "Tor Settings">
-<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
+<!ENTITY torPreferences.torSettingsDescription "Tor Browser จะกำหนดเส้นทางการรับส่งข้อมูลของคุณเข้ากับเครือข่าย Tor ที่ทำงานโดยอาสาสมัครกว่าพันคนทั่วโลก" >
<!ENTITY torPreferences.learnMore "เรียนรู้เพิ่มเติม">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "สะพาน">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "ออฟไลน์">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "กำลังเชื่อมต่อ...">
+<!ENTITY torConnect.connectedConcise "เชื่อมต่อสำเร็จ">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/th/torlauncher.properties b/src/chrome/locale/th/torlauncher.properties
index 30cc6e3..40987d4 100644
--- a/src/chrome/locale/th/torlauncher.properties
+++ b/src/chrome/locale/th/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=ที่เสียบสำหรั
torlauncher.nsresult.NS_ERROR_NET_RESET=การเชื่อมต่อกับเซิร์ฟเวอร์หายไป
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ได้
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=ไม่สามารถเชื่อมต่อกับพร็อกซี
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/tr/network-settings.dtd b/src/chrome/locale/tr/network-settings.dtd
index d0f9917..f654056 100644
--- a/src/chrome/locale/tr/network-settings.dtd
+++ b/src/chrome/locale/tr/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Ayarları">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser sizi dünyada binlerce gönüllü tarafından işletilen Tor ağına bağlar." >
<!ENTITY torPreferences.learnMore "Ayrıntılı Bilgi Alın">
+<!ENTITY torPreferences.quickstart "Hızlı başlatma">
+<!ENTITY torPreferences.quickstartDescription "Hızlı başlatma ile Tor Browser otomatik olarak bağlanır.">
+<!ENTITY torPreferences.quickstartCheckbox "Her zaman otomatik olarak bağlantı kurulsun">
<!ENTITY torPreferences.bridges "Köprüler">
<!ENTITY torPreferences.bridgesDescription "Köprüler Tor bağlantısının engellendiği yerlerden Tor ağına erişmek için kullanılır.. Bulunduğunuz konuma göre bir köprü türü diğerinden daha uygun olabilir.">
<!ENTITY torPreferences.useBridge "Bir köprü kullanılsın">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Tor günlüğü kayıtlarına bakın.">
<!ENTITY torPreferences.viewLogs "Günlüğü Görüntüle…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Günlüğü Kayıtları">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Yeniden Bağlantı Kurmayı Dene">
+<!ENTITY torConnect.offline "Çevrimdışı">
+<!ENTITY torConnect.connectMessage "Tor ağı ile bağlantı kurulana kadar Tor ayarlarında yapılan değişiklikler etkili olmayacak">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser, Tor ağı ile bağlantı kuramadı">
+<!ENTITY torConnect.connectingConcise "Bağlantı kuruluyor…">
+<!ENTITY torConnect.connectedConcise "Bağlantı kuruldu">
+<!ENTITY torConnect.copyLog "Tor Günlüklerini Kopyala">
diff --git a/src/chrome/locale/tr/torlauncher.properties b/src/chrome/locale/tr/torlauncher.properties
index 94a9665..5dcd0d8 100644
--- a/src/chrome/locale/tr/torlauncher.properties
+++ b/src/chrome/locale/tr/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=değiştirilebilir taşıyıcı bulunama
torlauncher.nsresult.NS_ERROR_NET_RESET=Sunucu ile bağlantı kesildi.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Sunucu ile bağlantı kurulamadı.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Vekil sunucu ile bağlantı kurulamadı.
+
+torlauncher.copiedNLogMessagesShort=%S Günlükleri Kopyalandı
diff --git a/src/chrome/locale/uk/network-settings.dtd b/src/chrome/locale/uk/network-settings.dtd
index 5368608..5b40c11 100644
--- a/src/chrome/locale/uk/network-settings.dtd
+++ b/src/chrome/locale/uk/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Налаштування Tor">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser спрямовує ваш трафік через мережу Tor, яка підтримується тисячами добровольців по всьому світу." >
<!ENTITY torPreferences.learnMore "Дізнатися більше">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Мости">
<!ENTITY torPreferences.bridgesDescription "Мости допомагають отримати доступ до мережі Tor у місцях, де Tor заблоковано. Залежно від того, де ви знаходитесь, один міст може працювати краще, ніж інший.">
<!ENTITY torPreferences.useBridge "Використати міст">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Переглянути журнали Tor.">
<!ENTITY torPreferences.viewLogs "Переглянути журнали...">
<!ENTITY torPreferences.torLogsDialogTitle "Журнали Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Поза мережею">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Під'єднання...">
+<!ENTITY torConnect.connectedConcise "Під'єднано">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/uk/torlauncher.properties b/src/chrome/locale/uk/torlauncher.properties
index 951ff04..8bccc25 100644
--- a/src/chrome/locale/uk/torlauncher.properties
+++ b/src/chrome/locale/uk/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=пропущений підключув
torlauncher.nsresult.NS_ERROR_NET_RESET=З'єднання з сервером втрачено.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Не вдалося з'єднатися з сервером.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Не вдалося з'єднатися з проксі-сервером.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/ur/network-settings.dtd b/src/chrome/locale/ur/network-settings.dtd
index cb2a958..3468d9a 100644
--- a/src/chrome/locale/ur/network-settings.dtd
+++ b/src/chrome/locale/ur/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "آف لائن">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "مربوط ہو رہا ہے۔۔۔">
+<!ENTITY torConnect.connectedConcise "منسلک ہو چکا ہے">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/ur/torlauncher.properties b/src/chrome/locale/ur/torlauncher.properties
index 9eb94dd..7fc2a4e 100644
--- a/src/chrome/locale/ur/torlauncher.properties
+++ b/src/chrome/locale/ur/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/uz/network-settings.dtd b/src/chrome/locale/uz/network-settings.dtd
index 439f4b2..35ee5a5 100644
--- a/src/chrome/locale/uz/network-settings.dtd
+++ b/src/chrome/locale/uz/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Offline">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Ulanmoqda…">
+<!ENTITY torConnect.connectedConcise "Ulandi">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/uz/torlauncher.properties b/src/chrome/locale/uz/torlauncher.properties
index e13c6ce..46f45bc 100644
--- a/src/chrome/locale/uz/torlauncher.properties
+++ b/src/chrome/locale/uz/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=missing pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/vi/network-settings.dtd b/src/chrome/locale/vi/network-settings.dtd
index 51e7992..b1deec2 100644
--- a/src/chrome/locale/vi/network-settings.dtd
+++ b/src/chrome/locale/vi/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Cài đặt Tor">
<!ENTITY torPreferences.torSettingsDescription "Trình duyệt Tor dẫn lưu lượng của bạn qua mạng Tor, vận hành bởi hàng ngàn tình nguyện viên khắp thế giới." >
<!ENTITY torPreferences.learnMore "Tìm hiểu thêm">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Cầu Nối">
<!ENTITY torPreferences.bridgesDescription "Cầu nối giúp bạn truy cập mạng Tor ở những nơi mạng Tor bị chặn. Tùy vào vị trí của bạn mà một cầu nối có thể hoạt động tốt hơn cầu nối khác.">
<!ENTITY torPreferences.useBridge "Dùng cầu nối">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "Xem nhật kí Tor.">
<!ENTITY torPreferences.viewLogs "Xem nhật kí...">
<!ENTITY torPreferences.torLogsDialogTitle "Nhật kí Tor">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "Ngoại tuyến">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Đang kết nối...">
+<!ENTITY torConnect.connectedConcise "Đã kết nối">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/vi/torlauncher.properties b/src/chrome/locale/vi/torlauncher.properties
index ed37db1..78c6af8 100644
--- a/src/chrome/locale/vi/torlauncher.properties
+++ b/src/chrome/locale/vi/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=thiếu pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=Mất kết nối tới máy chủ.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Không thể kết nối tới máy chủ.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Không thể kết nối tới proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index c1a1507..4e5d12e 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor 设置">
<!ENTITY torPreferences.torSettingsDescription "Tor 浏览器将你和世界数千名志愿者支持的 Tor 网络相连" >
<!ENTITY torPreferences.learnMore "了解更多">
+<!ENTITY torPreferences.quickstart "快速开始">
+<!ENTITY torPreferences.quickstartDescription "快速入门将使Tor浏览器进行自动连接。">
+<!ENTITY torPreferences.quickstartCheckbox "自动连接">
<!ENTITY torPreferences.bridges "网桥">
<!ENTITY torPreferences.bridgesDescription "网桥帮助你在 Tor 被阻塞的地方连接 Tor 网络。取决于你在哪里,有的网桥的效果可能比另一个要好。">
<!ENTITY torPreferences.useBridge "使用网桥">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "查看 Tor 日志。">
<!ENTITY torPreferences.viewLogs "查看日志">
<!ENTITY torPreferences.torLogsDialogTitle "Tor 日志">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "再次尝试连接">
+<!ENTITY torConnect.offline "脱机">
+<!ENTITY torConnect.connectMessage "在您连接到 Tor 网络之前对 Tor 设置的更改将不会生效">
+<!ENTITY torConnect.tryAgainMessage "Tor 浏览器未能与 Tor 网络建立连接">
+<!ENTITY torConnect.connectingConcise "正在连接…">
+<!ENTITY torConnect.connectedConcise "已连接">
+<!ENTITY torConnect.copyLog "复制 Tor 日志">
diff --git a/src/chrome/locale/zh-CN/torlauncher.properties b/src/chrome/locale/zh-CN/torlauncher.properties
index 54bdfcc..593bdfb 100644
--- a/src/chrome/locale/zh-CN/torlauncher.properties
+++ b/src/chrome/locale/zh-CN/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=缺少可插拔传输类型网桥
torlauncher.nsresult.NS_ERROR_NET_RESET=与服务器的连接已丢失...
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=无法连接到服务器。
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=无法连接到代理。
+
+torlauncher.copiedNLogMessagesShort=已复制 %S 条日志
diff --git a/src/chrome/locale/zh-HK/network-settings.dtd b/src/chrome/locale/zh-HK/network-settings.dtd
index 8de8a27..ce9e790 100644
--- a/src/chrome/locale/zh-HK/network-settings.dtd
+++ b/src/chrome/locale/zh-HK/network-settings.dtd
@@ -28,7 +28,7 @@
<!ENTITY torsettings.useProxy.checkbox "I use a proxy to connect to the Internet">
<!ENTITY torsettings.useProxy.type "Proxy Type">
<!ENTITY torsettings.useProxy.type.placeholder "select a proxy type">
-<!ENTITY torsettings.useProxy.address "Address">
+<!ENTITY torsettings.useProxy.address "地址">
<!ENTITY torsettings.useProxy.address.placeholder "IP位址或主機名稱">
<!ENTITY torsettings.useProxy.port "連接埠">
<!ENTITY torsettings.useProxy.username "用戶名">
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor Settings">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "深入了解">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
<!ENTITY torPreferences.useBridge "Use a bridge">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "View the Tor logs.">
<!ENTITY torPreferences.viewLogs "View Logs…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor Logs">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "離線">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "Connecting…">
+<!ENTITY torConnect.connectedConcise "已連線">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/zh-HK/torlauncher.properties b/src/chrome/locale/zh-HK/torlauncher.properties
index bf53b9f..1207f2a 100644
--- a/src/chrome/locale/zh-HK/torlauncher.properties
+++ b/src/chrome/locale/zh-HK/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=遺失Pluggable transport
torlauncher.nsresult.NS_ERROR_NET_RESET=The connection to the server was lost.
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=Could not connect to the server.
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=Could not connect to the proxy.
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/chrome/locale/zh-TW/network-settings.dtd b/src/chrome/locale/zh-TW/network-settings.dtd
index 9219d25..ba74226 100644
--- a/src/chrome/locale/zh-TW/network-settings.dtd
+++ b/src/chrome/locale/zh-TW/network-settings.dtd
@@ -66,6 +66,9 @@
<!ENTITY torPreferences.torSettings "Tor 設定">
<!ENTITY torPreferences.torSettingsDescription "Tor Browser 透過 Tor 網路將您的流量進行路由,而 Tor 網路是由世界上數千名志願者所支持。" >
<!ENTITY torPreferences.learnMore "了解更多">
+<!ENTITY torPreferences.quickstart "Quickstart">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "橋接器">
<!ENTITY torPreferences.bridgesDescription "橋接能讓您在 Tor 被封鎖的地方正常存取 Tor 網路。取決於您的位置,某個橋接點可能比另一個還要好。">
<!ENTITY torPreferences.useBridge "使用橋接">
@@ -81,3 +84,12 @@
<!ENTITY torPreferences.viewTorLogs "查看 Tor 紀錄。">
<!ENTITY torPreferences.viewLogs "查看日誌…">
<!ENTITY torPreferences.torLogsDialogTitle "Tor 記錄">
+
+<!-- #24746 about:torconnect strings -->
+<!ENTITY torConnect.tryAgain "Try Connecting Again">
+<!ENTITY torConnect.offline "離線">
+<!ENTITY torConnect.connectMessage "Changes to Tor Settings will not take effect until you connect to the Tor Network">
+<!ENTITY torConnect.tryAgainMessage "Tor Browser has failed to establish a connection to the Tor Network">
+<!ENTITY torConnect.connectingConcise "連接中…">
+<!ENTITY torConnect.connectedConcise "已連缐">
+<!ENTITY torConnect.copyLog "Copy Tor Logs">
diff --git a/src/chrome/locale/zh-TW/torlauncher.properties b/src/chrome/locale/zh-TW/torlauncher.properties
index 398eecb..39cf646 100644
--- a/src/chrome/locale/zh-TW/torlauncher.properties
+++ b/src/chrome/locale/zh-TW/torlauncher.properties
@@ -93,3 +93,5 @@ torlauncher.bootstrapWarning.pt_missing=缺少可插式傳輸
torlauncher.nsresult.NS_ERROR_NET_RESET=與伺服器連線中斷
torlauncher.nsresult.NS_ERROR_CONNECTION_REFUSED=無法連接至伺服器
torlauncher.nsresult.NS_ERROR_PROXY_CONNECTION_REFUSED=無法連接至代理
+
+torlauncher.copiedNLogMessagesShort=Copied %S Logs
diff --git a/src/install.rdf b/src/install.rdf
index c438e7b..fdf0338 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -7,7 +7,7 @@
<em:creator>The Tor Project, Inc.</em:creator>
<em:contributor>Pearl Crescent, LLC</em:contributor>
<em:id>tor-launcher(a)torproject.org</em:id>
- <em:version>0.2.28</em:version>
+ <em:version>0.2.29</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html</em:homepageURL>
<em:updateURL>data:text/plain,</em:updateURL>
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 10760: Integrate TorButton to TorBrowser core
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit c9f997476bbae05a5f4b365559caffc70ce1d59c
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 20:30:41 2021 +0000
fixup! Bug 10760: Integrate TorButton to TorBrowser core
---
toolkit/torproject/torbutton | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/toolkit/torproject/torbutton b/toolkit/torproject/torbutton
index cc73f75d99e5..9b74ffb6c99a 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit cc73f75d99e5bd1b610e4a96e89b895ced72407b
+Subproject commit 9b74ffb6c99adc98094f683340832094c56b4810
1
0
commit 9b74ffb6c99adc98094f683340832094c56b4810
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 17:26:11 2021 +0000
Translations update
---
chrome/locale/ar/torbutton.properties | 6 ++
chrome/locale/bn-BD/torbutton.properties | 12 +++-
chrome/locale/ca/torbutton.properties | 8 ++-
chrome/locale/cs/torbutton.properties | 8 ++-
chrome/locale/da/torbutton.properties | 8 ++-
chrome/locale/de/torbutton.properties | 6 ++
chrome/locale/el/torbutton.properties | 8 ++-
chrome/locale/es-AR/torbutton.properties | 6 ++
chrome/locale/es-ES/torbutton.properties | 28 +++++---
chrome/locale/eu/torbutton.properties | 8 ++-
chrome/locale/fa/torbutton.properties | 8 ++-
chrome/locale/fr/aboutTor.dtd | 2 +-
chrome/locale/fr/browserOnboarding.properties | 8 +--
chrome/locale/fr/torbutton.dtd | 2 +-
chrome/locale/fr/torbutton.properties | 90 +++++++++++++-----------
chrome/locale/ga-IE/torbutton.properties | 12 +++-
chrome/locale/he/torbutton.properties | 8 ++-
chrome/locale/hu/torbutton.properties | 8 ++-
chrome/locale/id/torbutton.properties | 8 ++-
chrome/locale/is/torbutton.properties | 18 +++--
chrome/locale/it/torbutton.properties | 8 ++-
chrome/locale/ja/torbutton.properties | 16 +++--
chrome/locale/ka/torbutton.properties | 18 +++--
chrome/locale/ko/torbutton.properties | 16 +++--
chrome/locale/lt/torbutton.properties | 8 ++-
chrome/locale/mk/torbutton.properties | 18 +++--
chrome/locale/ms/torbutton.properties | 8 ++-
chrome/locale/my/torbutton.properties | 8 ++-
chrome/locale/nb-NO/torbutton.properties | 8 ++-
chrome/locale/nl/torbutton.properties | 6 ++
chrome/locale/pl/torbutton.properties | 8 ++-
chrome/locale/pt-BR/torbutton.properties | 18 +++--
chrome/locale/ro/torbutton.properties | 8 ++-
chrome/locale/ru/torbutton.properties | 18 +++--
chrome/locale/sv-SE/browserOnboarding.properties | 4 +-
chrome/locale/sv-SE/torbutton.dtd | 2 +-
chrome/locale/sv-SE/torbutton.properties | 22 +++---
chrome/locale/th/aboutTor.dtd | 2 +-
chrome/locale/th/torbutton.properties | 8 ++-
chrome/locale/tr/torbutton.properties | 8 ++-
chrome/locale/vi/torbutton.properties | 8 ++-
chrome/locale/zh-CN/torbutton.properties | 18 +++--
chrome/locale/zh-TW/aboutTor.dtd | 2 +-
chrome/locale/zh-TW/torbutton.properties | 8 ++-
44 files changed, 366 insertions(+), 144 deletions(-)
diff --git a/chrome/locale/ar/torbutton.properties b/chrome/locale/ar/torbutton.properties
index 5833e548..92673a58 100644
--- a/chrome/locale/ar/torbutton.properties
+++ b/chrome/locale/ar/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=حذف
onionServices.authPreferences.removeAll=حذف الكل
onionServices.authPreferences.failedToGetKeys=غير قادر على استرداد المفاتيح من tor
onionServices.authPreferences.failedToRemoveKey=لا يمكن حذف المفتاح
+onionServices.v2Deprecated.pageTitle=V2 تحذير من إهمال موقع Onion
+onionServices.v2Deprecated.header=سيتم إهمال الإصدار 2 من مواقع Onion قريبًا
+onionServices.v2Deprecated=لن يمكن الوصول إلى موقع onion هذا قريبًا. يرجى الاتصال بمسؤول الموقع وتشجيعهم على الترقية.
+onionServices.v2Deprecated.longDescription=أنهى Tor دعمه لخدمات onion من الإصدار 2 بدءًا من يوليو 2021 ، ولن يمكن الوصول إلى موقع onion هذا على هذا العنوان. إذا كنت مسؤول الموقع ، فقم بالترقية إلى الإصدار 3 من خدمة onion قريبًا.
+onionServices.v2Deprecated.tryAgain=فهمت ذلك
+onionServices.v2Deprecated.tooltip=لن يمكن الوصول إلى موقع onion هذا قريبًا
# Onion-Location strings.
onionLocation.alwaysPrioritize=قم دائمًا بإعطاء الأولوية لل Onions
diff --git a/chrome/locale/bn-BD/torbutton.properties b/chrome/locale/bn-BD/torbutton.properties
index 76379bc6..02b68434 100644
--- a/chrome/locale/bn-BD/torbutton.properties
+++ b/chrome/locale/bn-BD/torbutton.properties
@@ -68,7 +68,7 @@ onionServices.errorPage.onionSite=অনিওনসাইট
# Tor SOCKS error 0xF0:
onionServices.descNotFound.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.descNotFound.header=অনিওনসাইট পাওয়া যায় নি
-onionServices.descNotFound=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.descNotFound=সবচেয়ে বড় সম্ভাবনা হচ্ছে অনিয়নসাইটটি তারহীন(অফলাইন)। অনিয়নসাইট প্রশাসকের সাথে যোগাযোগ করো।
onionServices.descNotFound.longDescription=Details: %S — The requested onion service descriptor can't be found on the hashring and therefore the service is not reachable by the client.
# Tor SOCKS error 0xF1:
onionServices.descInvalid.pageTitle=অনিওনসাইট লোড করতে সমস্যা
@@ -78,7 +78,7 @@ onionServices.descInvalid.longDescription=Details: %S — The requested onion se
# Tor SOCKS error 0xF2:
onionServices.introFailed.pageTitle=অনিওনসাইট লোড করতে সমস্যা
onionServices.introFailed.header=Onionsite Has Disconnected
-onionServices.introFailed=The most likely cause is that the onionsite is offline. Contact the onionsite administrator.
+onionServices.introFailed=সবচেয়ে বড় সম্ভাবনা হচ্ছে অনিয়নসাইটটি তারহীন(অফলাইন)। অনিয়নসাইট প্রশাসকের সাথে যোগাযোগ করো।
onionServices.introFailed.longDescription=Details: %S — Introduction failed, which means that the descriptor was found but the service is no longer connected to the introduction point. It is likely that the service has changed its descriptor or that it is not running.
# Tor SOCKS error 0xF3:
onionServices.rendezvousFailed.pageTitle=অনিওনসাইট লোড করতে সমস্যা
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=অপসারণ
onionServices.authPreferences.removeAll=Remove All
onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=বুঝেছি
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ask every time
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=ওনিওন সেবা
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/ca/torbutton.properties b/chrome/locale/ca/torbutton.properties
index f92e627e..650abc16 100644
--- a/chrome/locale/ca/torbutton.properties
+++ b/chrome/locale/ca/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Suprimeix la subscripció
onionServices.authPreferences.removeAll=Suprimeix-ho tot
onionServices.authPreferences.failedToGetKeys=No es poden recuperar les claus de tor
onionServices.authPreferences.failedToRemoveKey=No s'ha pogut suprimir la clau
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Entesos
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Sempre prioritza els Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Demana-ho cada vegada
onionLocation.prioritizeOnionsDescription=Prioritza els llocs .onion si se'n coneixen.
onionLocation.onionServicesTitle=Serveis Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/cs/torbutton.properties b/chrome/locale/cs/torbutton.properties
index c781906a..0819a33d 100644
--- a/chrome/locale/cs/torbutton.properties
+++ b/chrome/locale/cs/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Odstranit
onionServices.authPreferences.removeAll=Odstranit všechny
onionServices.authPreferences.failedToGetKeys=Nelze načíst klíče z Toru
onionServices.authPreferences.failedToRemoveKey=Klíč nelze odstranit
+onionServices.v2Deprecated.pageTitle=Varování o zrušení V2 Onion webů
+onionServices.v2Deprecated.header=Onion weby ve verzi 2 budou brzy zrušeny
+onionServices.v2Deprecated=Tento onion web nebude brzy dostupný. Spojte se prosím s administrátory webu a doporučte jim upgrade.
+onionServices.v2Deprecated.longDescription=V červenci 2021 Tor ukončuje podporu onion služeb ve verzi 2 a tento onion web nebude brzy na této adrese dostupný. Pokud jsi administrátor tohoto webu, upgraduj co nejdříve na verzi 3.
+onionServices.v2Deprecated.tryAgain=Chápu
+onionServices.v2Deprecated.tooltip=Tento onion web brzy nebude dostupný
# Onion-Location strings.
onionLocation.alwaysPrioritize=Vždy upřednostňovat Onion stránky
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ptát se vždy
onionLocation.prioritizeOnionsDescription=Upřednostňovat známé .onion stránky.
onionLocation.onionServicesTitle=Služby Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Adresa kryptoměny (%S) byla zkopírována z nezabezpečené webové stránky. Mohla být upravena.
cryptoSafetyPrompt.whatCanHeading=Co s tím můžete dělat?
cryptoSafetyPrompt.whatCanBody=Můžete se zkusit znovu připojit pomocí nového okruhu, abyste navázali bezpečné připojení, nebo přijmout riziko a toto varování odmítnout.
diff --git a/chrome/locale/da/torbutton.properties b/chrome/locale/da/torbutton.properties
index 52fb9ea9..9de61c83 100644
--- a/chrome/locale/da/torbutton.properties
+++ b/chrome/locale/da/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Fjern
onionServices.authPreferences.removeAll=Fjern alle
onionServices.authPreferences.failedToGetKeys=Kan ikke hente nøgler fra tor
onionServices.authPreferences.failedToRemoveKey=Kan ikke fjerne nøgle
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=Dette onionsted vil snart være uopnåelig. Venligst kontakt stedets administrator og anbefal at de opgraderer.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Got it
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Prioriter altid onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Spørg hver gang
onionLocation.prioritizeOnionsDescription=Prioriter .onion-steder når de kendes.
onionLocation.onionServicesTitle=Oniontjenester
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/de/torbutton.properties b/chrome/locale/de/torbutton.properties
index d2956d75..60a54e43 100644
--- a/chrome/locale/de/torbutton.properties
+++ b/chrome/locale/de/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Entfernen
onionServices.authPreferences.removeAll=Alles entfernen
onionServices.authPreferences.failedToGetKeys=Abrufen der Schlüssel von Tor nicht möglich
onionServices.authPreferences.failedToRemoveKey=Schlüssel entfernen nicht möglich
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Abschaltwarnung
+onionServices.v2Deprecated.header=Version 2 Onion Sites werden bald abgeschaltet
+onionServices.v2Deprecated=Diese Onion-Site wird bald nicht mehr erreichbar sein. Bitte kontaktiere den Administrator der Seite und fordere ihn zur Aktualisierung auf.
+onionServices.v2Deprecated.longDescription=Tor stellt die Unterstützung für Onion-Dienste der Version 2 ab Juli 2021 ein, und diese Onion-Seite wird nicht mehr unter dieser Adresse erreichbar sein. Wenn du der Administrator der Seite bist, aktualisiere bald auf einen Onion-Dienst der Version 3.
+onionServices.v2Deprecated.tryAgain=Verstanden
+onionServices.v2Deprecated.tooltip=Diese Onion-Site wird bald nicht mehr erreichbar sein
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onions immer priorisieren
diff --git a/chrome/locale/el/torbutton.properties b/chrome/locale/el/torbutton.properties
index 56eb6492..6fdfd1b2 100644
--- a/chrome/locale/el/torbutton.properties
+++ b/chrome/locale/el/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Απομάκρυνση
onionServices.authPreferences.removeAll=Αφαίρεση όλων
onionServices.authPreferences.failedToGetKeys=Αδυναμία λήψης κλειδιών από το tor
onionServices.authPreferences.failedToRemoveKey=Αδυναμία αφαίρεσης κλειδιού
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Το κατάλαβα
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Πάντα να δίνεται προτεραιότητα στα Onion
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Να ερωτώμαι κάθε φορά
onionLocation.prioritizeOnionsDescription=Να δίνεται προτεραιότητα σε σελίδες .onion όταν είναι γνωστές.
onionLocation.onionServicesTitle=Υπηρεσίες Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/es-AR/torbutton.properties b/chrome/locale/es-AR/torbutton.properties
index 47411582..f99739a3 100644
--- a/chrome/locale/es-AR/torbutton.properties
+++ b/chrome/locale/es-AR/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Remover
onionServices.authPreferences.removeAll=Remover todo
onionServices.authPreferences.failedToGetKeys=Incapaz de recuperar las claves desde tor
onionServices.authPreferences.failedToRemoveKey=No se puede eliminar la clave
+onionServices.v2Deprecated.pageTitle=Advertencia de obsolescencia de sitio Onion V2
+onionServices.v2Deprecated.header=Pronto van a ser obsoletos los sitios Onion Version 2
+onionServices.v2Deprecated=Pronto no va a ser accesible este sitio onion. Por favor, contactate con el administrador del sitio y alentalo para actualizarlo.
+onionServices.v2Deprecated.longDescription=Tor va a terminar su apoyo a los servicios onion versión 2 a partir de julio de 2021, y este sitio onion ya no va a ser accesible en esta dirección. Si sos el administrador del sitio, actualizalo pronto a un servicio onion versión 3.
+onionServices.v2Deprecated.tryAgain=Entendido
+onionServices.v2Deprecated.tooltip=Este sitio onion pronto no va a ser accesible
# Onion-Location strings.
onionLocation.alwaysPrioritize=Siempre priorice las Onions
diff --git a/chrome/locale/es-ES/torbutton.properties b/chrome/locale/es-ES/torbutton.properties
index 8e3a1b6b..99a5fcc9 100644
--- a/chrome/locale/es-ES/torbutton.properties
+++ b/chrome/locale/es-ES/torbutton.properties
@@ -68,38 +68,38 @@ onionServices.errorPage.onionSite=Onionsite
# Tor SOCKS error 0xF0:
onionServices.descNotFound.pageTitle=Problemas cargando Onionsite
onionServices.descNotFound.header=No se encuentra Onionsite
-onionServices.descNotFound=La causa más probable es que onionsite esté fuera de línea. Contacta con el administrador de onionsite
+onionServices.descNotFound=La causa más probable es que el sitio cebolla esté fuera de línea. Contacta con su administrador.
onionServices.descNotFound.longDescription=Detalles: %S - El descriptor del servicio de onion solicitado no se encuentra en el hashring y por lo tanto el servicio no está accesible para el cliente.
# Tor SOCKS error 0xF1:
-onionServices.descInvalid.pageTitle=Problemas cargando Onionsite
+onionServices.descInvalid.pageTitle=Problemas al cargar Sitio Onion
onionServices.descInvalid.header=No se puede llegar a Onionsite
-onionServices.descInvalid=No se puede llegar a onionsite a causa de un error interno
+onionServices.descInvalid=No se puede llegar al sitio cebolla a causa de un error interno.
onionServices.descInvalid.longDescription=Detalles: %S - El descriptor de servicio de onion solicitado no se puede analizar o la validación de la firma falló.
# Tor SOCKS error 0xF2:
onionServices.introFailed.pageTitle=Problemas cargando Onionsite
-onionServices.introFailed.header=Se ha desconectado oniosite
+onionServices.introFailed.header=Se ha desconectado el sitio onion
onionServices.introFailed=La causa más probable es que onionsite esté fuera de línea. Contacta con el administrador de onionsite
onionServices.introFailed.longDescription=Detalles: %S - La introducción falló, lo que significa que el descriptor fue encontrado pero el servicio ya no está conectado al punto de introducción. Es probable que el servicio haya cambiado su descriptor o que no esté funcionando.
# Tor SOCKS error 0xF3:
onionServices.rendezvousFailed.pageTitle=Problemas cargando Onionsite
onionServices.rendezvousFailed.header=Incapaz de conectar a Onionsite
-onionServices.rendezvousFailed=Onionsite está ocupado o la red Tor está sobrecargada. Inténtalo más tarde.
+onionServices.rendezvousFailed=El sitio cebolla está ocupado o la red Tor está sobrecargada. Inténtalo más tarde.
onionServices.rendezvousFailed.longDescription=Detalles: %S - El cliente no encontró el servicio, lo que significa que el cliente no pudo finalizar la conexión.
# Tor SOCKS error 0xF4:
onionServices.clientAuthMissing.pageTitle=Se requiere autorización
onionServices.clientAuthMissing.header=Onionsite requiere autorización
-onionServices.clientAuthMissing=El acceso al sitio onion necesita una clave, pero no se ha proporcionado ninguna.
-onionServices.clientAuthMissing.longDescription=Detalles: %S - El cliente descargó el descriptor de servicio de cebolla solicitado pero no pudo descifrar su contenido porque falta la información de autorización del cliente.
+onionServices.clientAuthMissing=El acceso al sitio cebolla necesita una clave, pero no se ha proporcionado ninguna.
+onionServices.clientAuthMissing.longDescription=Detalles: %S - El cliente descargó el descriptor de servicio de cebolla solicitado, pero no pudo descifrar su contenido porque falta la información de autorización del cliente.
# Tor SOCKS error 0xF5:
onionServices.clientAuthIncorrect.pageTitle=Falló la autorización
onionServices.clientAuthIncorrect.header=Falló la autenticación del Onionsite
onionServices.clientAuthIncorrect=La clave proporcionada es incorrecta o ha sido revocada. Contacta con el administrador del sitio web.
onionServices.clientAuthIncorrect.longDescription=Detalles: %S - El cliente pudo descargar el descriptor de servicio de cebolla solicitado pero no pudo descifrar su contenido usando la información de autorización del cliente proporcionada. Esto puede significar que el acceso ha sido revocado.
# Tor SOCKS error 0xF6:
-onionServices.badAddress.pageTitle=Problemas cargando Onionsite
+onionServices.badAddress.pageTitle=Problemas al cargar sitio cebolla
onionServices.badAddress.header=Invalidada dirección de Onionsite
-onionServices.badAddress=La dirección de cebolla no es válida. Por favor, comprueba que la has introducido correctamente.
-onionServices.badAddress.longDescription=Detalles: %S — La dirección de la cebolla es inválida. Este error se devuelve debido a una de las siguientes razones: la suma de comprobación de la dirección no coincide, la clave pública ed25519 es inválida, o la codificación es inválida.
+onionServices.badAddress=La dirección del sitio cebolla no es válida. Por favor, comprueba que la has introducido correctamente.
+onionServices.badAddress.longDescription=Detalles: %S — La dirección de la cebolla es inválida. Este error se da debido a una de las siguientes razones: la suma de comprobación de la dirección no coincide, la clave pública ed25519 es inválida, o la codificación es inválida.
# Tor SOCKS error 0xF7:
onionServices.introTimedOut.pageTitle=Problemas cargando Onionsite
onionServices.introTimedOut.header=La creación del circuito de Onionsite se ha agotado
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Eliminar
onionServices.authPreferences.removeAll=Eliminar todo
onionServices.authPreferences.failedToGetKeys=No se pueden descargar las claves de Tor
onionServices.authPreferences.failedToRemoveKey=No se puede quitar la clave
+onionServices.v2Deprecated.pageTitle=Advertencia de depreciación del sitio V2 Onion
+onionServices.v2Deprecated.header=Pronto se depreciará el sitio Version 2 Onion
+onionServices.v2Deprecated=Pronto no será accesible este sitio onion. Por favor, contacta con el administrador del sitio y animale a actualizar
+onionServices.v2Deprecated.longDescription=Tor terminará su apoyo a los servicios onion de la versión 2 a partir de julio de 2021, y este sitio onion ya no será accesible en esta dirección. Si eres el administrador del sitio, actualizar a una versión 3 el servicio onion pronto.
+onionServices.v2Deprecated.tryAgain=Entendido
+onionServices.v2Deprecated.tooltip=Este sitio onion pronto no será accesible
# Onion-Location strings.
onionLocation.alwaysPrioritize=Priorizar siempre Onions.
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Preguntar siempre
onionLocation.prioritizeOnionsDescription=Priorizar los sitios .onion cuando se conozcan.
onionLocation.onionServicesTitle=Servicios cebolla
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Se ha copiado de un sitio web inseguro una dirección de criptomoneda (%S). Podría haber sido modificada.
cryptoSafetyPrompt.whatCanHeading=¿Qué puedes hacer?
cryptoSafetyPrompt.whatCanBody=Puedes conectar con un nuevo circuito para establecer una conexión segura, o aceptar el riesgo y descartar esta advertencia.
diff --git a/chrome/locale/eu/torbutton.properties b/chrome/locale/eu/torbutton.properties
index c109d0fb..0d2c58ca 100644
--- a/chrome/locale/eu/torbutton.properties
+++ b/chrome/locale/eu/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Kendu
onionServices.authPreferences.removeAll=Remove All
onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Ulertu dut
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ask every time
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=Onion zerbitzuak
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/fa/torbutton.properties b/chrome/locale/fa/torbutton.properties
index 9f1d5793..fa33a2f5 100644
--- a/chrome/locale/fa/torbutton.properties
+++ b/chrome/locale/fa/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=حذف
onionServices.authPreferences.removeAll=حذف کردن همه
onionServices.authPreferences.failedToGetKeys=قادر به بازیابی کلیدها از تور نیستیم
onionServices.authPreferences.failedToRemoveKey=قادر به حذف کردن کلید نیستیم
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=متوجه شدم
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=همیشه پیازها را در اولویت قرار بده
@@ -139,7 +145,7 @@ onionLocation.askEverytime=هر بار بپرس
onionLocation.prioritizeOnionsDescription=سایتهای .onion را در صورت شناخت در اولویت قرار بده.
onionLocation.onionServicesTitle=خدمات پیازی
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/fr/aboutTor.dtd b/chrome/locale/fr/aboutTor.dtd
index c3dab6db..75b45004 100644
--- a/chrome/locale/fr/aboutTor.dtd
+++ b/chrome/locale/fr/aboutTor.dtd
@@ -26,6 +26,6 @@
<!ENTITY aboutTor.getInvolved.label "Impliquez-vous »">
<!ENTITY aboutTor.newsletter.tagline "Obtenez les dernières nouvelles au sujet de Tor directement dans votre boîte de réception.">
-<!ENTITY aboutTor.newsletter.link_text "Inscrivez-vous aux nouvelles de Tor">
+<!ENTITY aboutTor.newsletter.link_text "Inscrivez-vous aux nouvelles de Tor.">
<!ENTITY aboutTor.donationBanner.freeToUse "Tor peut être utilisé gratuitement grâce aux dons de personnes telles que vous.">
<!ENTITY aboutTor.donationBanner.buttonA "Faites un don maintenant">
diff --git a/chrome/locale/fr/browserOnboarding.properties b/chrome/locale/fr/browserOnboarding.properties
index cd5761ee..cf0beb22 100644
--- a/chrome/locale/fr/browserOnboarding.properties
+++ b/chrome/locale/fr/browserOnboarding.properties
@@ -36,12 +36,12 @@ onboarding.tour-tor-expect-differences=Conseils sur l’expérience
onboarding.tour-tor-expect-differences.title=Attendez-vous à des différences.
onboarding.tour-tor-expect-differences.description=Avec toutes les fonctions de sécurité et de confidentialité offertes par Tor, votre expérience de navigation sur Internet pourrait être un peu différente. Les choses pourraient être un peu plus lentes et selon votre niveau de sécurité, certains éléments pourraient ne pas fonctionner ou ne pas se charger. On pourrait aussi vous demander de prouver que vous êtes un humain et non un robot.
onboarding.tour-tor-expect-differences.button=Consulter les FAQ
-onboarding.tour-tor-expect-differences.next-button=Poursuivre vers Services onion
+onboarding.tour-tor-expect-differences.next-button=Poursuivre vers Services oignon
-onboarding.tour-tor-onion-services=Services onion
+onboarding.tour-tor-onion-services=Services oignon
onboarding.tour-tor-onion-services.title=Soyez plus que protégé.
-onboarding.tour-tor-onion-services.description=Les services onion sont des sites qui se terminent par .onion. Ils offrent des protections accrues aux diffuseurs et aux visiteurs, dont des mesures de protection contre la censure. Les services onion permettent à tous de proposer anonymement du contenu et des services. Cliquez ci-dessous pour visiter le site onion de DuckDuckGo.
-onboarding.tour-tor-onion-services.button=Visiter un onion
+onboarding.tour-tor-onion-services.description=Les services oignon sont des sites qui se terminent par .onion. Ils offrent des protections accrues aux diffuseurs et aux visiteurs, dont des mesures de protection contre la censure. Les services oignon permettent à tous de proposer anonymement du contenu et des services. Cliquez ci-dessous pour visiter le site oignon de DuckDuckGo.
+onboarding.tour-tor-onion-services.button=Visiter un oignon
onboarding.tour-tor-onion-services.next-button=Terminé
onboarding.overlay-icon-tooltip-updated2=Voyez ce qu’il y a de\nnouveau dans %S
diff --git a/chrome/locale/fr/torbutton.dtd b/chrome/locale/fr/torbutton.dtd
index e5585b71..6c60ae10 100644
--- a/chrome/locale/fr/torbutton.dtd
+++ b/chrome/locale/fr/torbutton.dtd
@@ -49,5 +49,5 @@
<!ENTITY torbutton.circuit_display.new_circuit "Nouveau circuit pour ce site">
<!-- Onion services strings. Strings are kept here for ease of translation. -->
-<!ENTITY torbutton.onionServices.authPrompt.tooltip "Ouvrir l’invite d’authentification du client du service onion">
+<!ENTITY torbutton.onionServices.authPrompt.tooltip "Ouvrir l’invite d’authentification du client du service oignon">
<!ENTITY torbutton.onionServices.authPrompt.persistCheckboxLabel "Mémoriser cette clé">
diff --git a/chrome/locale/fr/torbutton.properties b/chrome/locale/fr/torbutton.properties
index aa1e41f7..022c5908 100644
--- a/chrome/locale/fr/torbutton.properties
+++ b/chrome/locale/fr/torbutton.properties
@@ -1,6 +1,6 @@
torbutton.circuit_display.internet = Internet
torbutton.circuit_display.ip_unknown = IP inconnue
-torbutton.circuit_display.onion_site = Site onion
+torbutton.circuit_display.onion_site = Site oignon
torbutton.circuit_display.this_browser = Ce navigateur
torbutton.circuit_display.relay = Relais
torbutton.circuit_display.tor_bridge = Pont
@@ -14,7 +14,7 @@ torbutton.content_sizer.margin_tooltip = Le Navigateur Tor ajoute cette marge p
extensions.torbutton(a)torproject.org.description = BoutonTor offre un bouton pour configurer les paramètres de Tor et effacer facilement les données de navigation privée.
torbutton.popup.external.title = Télécharger un type de fichier externe ?
torbutton.popup.external.app = Le Navigateur Tor ne peut pas afficher ce fichier. Vous devrez l’ouvrir avec une autre application.
-torbutton.popup.external.note = Certains types de fichiers peuvent causer des connexions à l’Internet sans passer par Tor pour certaines applications
+torbutton.popup.external.note = Certains types de fichiers peuvent causer des connexions à l’Internet sans passer par Tor pour certaines applications.
torbutton.popup.external.suggest = Par sécurité, vous ne devriez ouvrir les fichiers téléchargés qu’une fois hors ligne ou en utilisant un CD autonome Tor comme Tails.\n
torbutton.popup.launch = Télécharger le fichier
torbutton.popup.cancel = Annuler
@@ -54,92 +54,98 @@ profileMigrationFailed=La migration de votre profil existant %S a échoué.\nDe
updateDownloadingPanelUILabel=Téléchargement de la mise à jour de %S
# .Onion Page Info prompt. Strings are kept here for ease of translation.
-pageInfo_OnionEncryptionWithBitsAndProtocol=La connexion est chiffrée (service onion, %1$S, clés %2$S bits, %3$S)
-pageInfo_OnionEncryption=La connexion est chiffrée (service onion)
-pageInfo_OnionName=Nom de l’onion :
+pageInfo_OnionEncryptionWithBitsAndProtocol=La connexion est chiffrée (service oignon, %1$S, clés %2$S bits, %3$S)
+pageInfo_OnionEncryption=La connexion est chiffrée (service oignon)
+pageInfo_OnionName=Nom de l’oignon :
# Onion services strings. Strings are kept here for ease of translation.
-onionServices.learnMore=En savoir plus
+onionServices.learnMore=En apprendre davantage
onionServices.errorPage.browser=Navigateur
onionServices.errorPage.network=Réseau
-onionServices.errorPage.onionSite=Site onion
+onionServices.errorPage.onionSite=Site oignon
# LOCALIZATION NOTE: In the longDescription strings, %S will be replaced with
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
-onionServices.descNotFound.pageTitle=Problème de chargement du site onion
-onionServices.descNotFound.header=Le site onion est introuvable
-onionServices.descNotFound=La cause la plus probable est que le site onion est hors ligne. Contactez l’administrateur du site onion.
-onionServices.descNotFound.longDescription=Détails : %S – Le descripteur du service onion demandé est introuvable sur l’anneau de hachage et le service n’est par conséquent pas accessible par le client.
+onionServices.descNotFound.pageTitle=Problème de chargement du site oignon
+onionServices.descNotFound.header=Le site oignon est introuvable
+onionServices.descNotFound=La cause la plus probable est que le site oignon est hors ligne. Contactez l’administrateur du site oignon.
+onionServices.descNotFound.longDescription=Détails : %S – Le descripteur du service oignon demandé est introuvable sur l’anneau de hachage et le service n’est par conséquent pas accessible par le client.
# Tor SOCKS error 0xF1:
-onionServices.descInvalid.pageTitle=Problème de chargement du site onion
-onionServices.descInvalid.header=Le site onion est inaccessible
-onionServices.descInvalid=Le site onion est inaccessible en raison d’une erreur interne.
-onionServices.descInvalid.longDescription=Détails : %S – Le descripteur du service onion demandé ne peut pas être analysé ou la validation de la signature a échoué.
+onionServices.descInvalid.pageTitle=Problème de chargement du site oignon
+onionServices.descInvalid.header=Le site oignon est inaccessible
+onionServices.descInvalid=Le site oignon est inaccessible en raison d’une erreur interne.
+onionServices.descInvalid.longDescription=Détails : %S – Le descripteur du service oignon demandé ne peut pas être analysé ou la validation de la signature a échoué.
# Tor SOCKS error 0xF2:
-onionServices.introFailed.pageTitle=Problème de chargement du site onion
-onionServices.introFailed.header=Le site onion s’est déconnecté
-onionServices.introFailed=La cause la plus probable est que le site onion est hors ligne. Contactez l’administrateur du site onion.
+onionServices.introFailed.pageTitle=Problème de chargement du site oignon
+onionServices.introFailed.header=Le site oignon s’est déconnecté
+onionServices.introFailed=La cause la plus probable est que le site oignon est hors ligne. Contactez l’administrateur du site oignon.
onionServices.introFailed.longDescription=Détails : %S – Échec de présentation, ce qui signifie que le descripteur a été trouvé, mais que le service n’est plus connecté au point de présentation. Il est probable que le service a changé son descripteur ou qu’il ne fonctionne pas actuellement.
# Tor SOCKS error 0xF3:
-onionServices.rendezvousFailed.pageTitle=Problème de chargement du site onion
-onionServices.rendezvousFailed.header=Impossible de se connecter au site onion
-onionServices.rendezvousFailed=Le site onion est occupé ou le réseau Tor est surchargé. Veuillez réessayer ultérieurement.
+onionServices.rendezvousFailed.pageTitle=Problème de chargement du site oignon
+onionServices.rendezvousFailed.header=Impossible de se connecter au site oignon
+onionServices.rendezvousFailed=Le site oignon est occupé ou le réseau Tor est surchargé. Veuillez réessayer ultérieurement.
onionServices.rendezvousFailed.longDescription=Détails : %S – Échec de rencontre du client avec le service, ce qui signifie que le client n’a pas réussi à finaliser la connexion.
# Tor SOCKS error 0xF4:
onionServices.clientAuthMissing.pageTitle=Une autorisation est exigée
-onionServices.clientAuthMissing.header=Le site onion exige une authentification
-onionServices.clientAuthMissing=Le site onion exige une clé, mais aucune n’a été indiquée.
+onionServices.clientAuthMissing.header=Le site oignon exige une authentification
+onionServices.clientAuthMissing=Le site oignon exige une clé, mais aucune n’a été indiquée.
onionServices.clientAuthMissing.longDescription=Détails : %S – Le client a téléchargé le descripteur du site demandé, mais n’a pas réussi à déchiffrer son contenu, car il manque les renseignements d’autorisation du client.
# Tor SOCKS error 0xF5:
onionServices.clientAuthIncorrect.pageTitle=Échec d’autorisation
-onionServices.clientAuthIncorrect.header=Échec d’authentification au site onion
-onionServices.clientAuthIncorrect=La clé indiquée est incorrecte ou a été révoquée. Contactez l’administrateur du site onion.
+onionServices.clientAuthIncorrect.header=Échec d’authentification au site oignon
+onionServices.clientAuthIncorrect=La clé indiquée est incorrecte ou a été révoquée. Contactez l’administrateur du site oignon.
onionServices.clientAuthIncorrect.longDescription=Détails : %S – Le client a réussi à télécharger le descripteur du site demandé, mais n’a pas réussi à déchiffrer son contenu en utilisant les renseignements d’autorisation du client indiqués. Cela pourrait signifier que l’accès a été révoqué.
# Tor SOCKS error 0xF6:
-onionServices.badAddress.pageTitle=Problème de chargement du site onion
-onionServices.badAddress.header=L’adresse du site onion est invalide
+onionServices.badAddress.pageTitle=Problème de chargement du site oignon
+onionServices.badAddress.header=L’adresse du site oignon est invalide
onionServices.badAddress=L’adresse indiquée est invalide. Veuillez vous assurer de l’avoir saisie correctement.
onionServices.badAddress.longDescription=Détails : %S – L’adresse .onion indiquée est invalide. Cette erreur est retournée pour une des raisons qui suivent : la somme de contrôle de l’adresse ne correspond pas, la clé publique ed25519 est invalide ou l’encodage est invalide.
# Tor SOCKS error 0xF7:
-onionServices.introTimedOut.pageTitle=Problème de chargement du site onion
-onionServices.introTimedOut.header=La création du circuit du site onion est arrivée au bout de son délai
-onionServices.introTimedOut=Échec de connexion au site onion, possiblement en raison d’une mauvaise connexion au réseau.
-onionServices.introTimedOut.longDescription=Détails : %S – La connexion au service onion demandé est arrivée au bout de son délai en essayant de construire le circuit de rencontre.
+onionServices.introTimedOut.pageTitle=Problème de chargement du site oignon
+onionServices.introTimedOut.header=La création du circuit du site oignon est arrivée au bout de son délai
+onionServices.introTimedOut=Échec de connexion au site oignon, possiblement en raison d’une mauvaise connexion au réseau.
+onionServices.introTimedOut.longDescription=Détails : %S – La connexion au service oignon demandé est arrivée au bout de son délai en essayant de construire le circuit de rencontre.
#
# LOCALIZATION NOTE: %S will be replaced with the .onion address.
onionServices.authPrompt.description2=%S demande que vous vous authentifiez.
-onionServices.authPrompt.keyPlaceholder=Saisissez votre clé privée pour ce service onion
+onionServices.authPrompt.keyPlaceholder=Saisissez votre clé privée pour ce service oignon
onionServices.authPrompt.done=Terminé
onionServices.authPrompt.doneAccessKey=t
onionServices.authPrompt.invalidKey=Veuillez saisir une clé valide (52 caractères Base32 ou 44 caractères Base64)
onionServices.authPrompt.failedToSetKey=Impossible de configurer Tor avec votre clé
-onionServices.authPreferences.header=Authentification des services onion
-onionServices.authPreferences.overview=Certains services onion exigent que vous vous authentifiiez avec une clé (une sorte de mot de passe) avant de pouvoir y accéder.
+onionServices.authPreferences.header=Authentification des services oignon
+onionServices.authPreferences.overview=Certains services oignon exigent que vous vous authentifiiez avec une clé (une sorte de mot de passe) avant de pouvoir y accéder.
onionServices.authPreferences.savedKeys=Clés enregistrées…
-onionServices.authPreferences.dialogTitle=Clés des services onion
-onionServices.authPreferences.dialogIntro=Les clés pour les sites onion suivants sont enregistrées sur votre ordinateur
-onionServices.authPreferences.onionSite=Site onion
+onionServices.authPreferences.dialogTitle=Clés des services oignon
+onionServices.authPreferences.dialogIntro=Les clés pour les sites oignon suivants sont enregistrées sur votre ordinateur
+onionServices.authPreferences.onionSite=Site oignon
onionServices.authPreferences.onionKey=Clé
onionServices.authPreferences.remove=Supprimer
onionServices.authPreferences.removeAll=Tout supprimer
onionServices.authPreferences.failedToGetKeys=Impossible de récupérer les clés de Tor
onionServices.authPreferences.failedToRemoveKey=Impossible de supprimer la clé
+onionServices.v2Deprecated.pageTitle=Avertissement d’obsolescence des sites oignon V2
+onionServices.v2Deprecated.header=Les sites oignon version 2 seront bientôt déconseillés
+onionServices.v2Deprecated=Ce site oignon ne sera bientôt plus accessible. Veuillez contacter l’administrateur du site et l’encourager à le mettre à niveau.
+onionServices.v2Deprecated.longDescription=À partir de juillet 2021, Tor mettra fin à la prise en charge des services oignon version 2 et ce site oignon ne sera plus accessible à cette adresse. Si vous êtes l’administrateur de ce site, veuillez le mettre à jour vers un service oignon version 3 bientôt.
+onionServices.v2Deprecated.tryAgain=D’accord
+onionServices.v2Deprecated.tooltip=Ce site oignon ne sera bientôt plus accessible
# Onion-Location strings.
-onionLocation.alwaysPrioritize=Toujours prioriser les onions
+onionLocation.alwaysPrioritize=Toujours prioriser les oignons
onionLocation.alwaysPrioritizeAccessKey=t
onionLocation.notNow=Pas maintenant
onionLocation.notNowAccessKey=p
-onionLocation.description=Une version qui offre une meilleure protection de vos données et plus sécurisée de ce site est accessible sur le réseau Tor par ses services onion. Les services onion aident les éditeurs de sites Web et leurs visiteurs à combattre la surveillance et la censure.
-onionLocation.tryThis=Essayer les services onion
+onionLocation.description=Une version qui offre une meilleure protection de vos données et plus sécurisée de ce site est accessible sur le réseau Tor par ses services oignon. Les services oignon aident les éditeurs de sites Web et leurs visiteurs à combattre la surveillance et la censure.
+onionLocation.tryThis=Essayer les services oignon
onionLocation.onionAvailable=Un .onion est proposé
onionLocation.learnMore=En apprendre davantage…
onionLocation.always=Toujours
onionLocation.askEverytime=Toujours demander
onionLocation.prioritizeOnionsDescription=Prioriser les sites .onion s’ils sont connus
-onionLocation.onionServicesTitle=Services onion
+onionLocation.onionServicesTitle=Services oignon
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Une adresse de cryptomonnaie (%S) a été copiée d’un site Web non sécurisé. Elle pourrait avoir été modifiée.
cryptoSafetyPrompt.whatCanHeading=Que pouvez-vous y faire ?
cryptoSafetyPrompt.whatCanBody=Vous pouvez essayer de vous reconnecter avec un nouveau circuit afin d’établir une connexion sécurisée ou accepter le risque et ignorer cet avertissement.
diff --git a/chrome/locale/ga-IE/torbutton.properties b/chrome/locale/ga-IE/torbutton.properties
index 1f1c08fb..409a3db8 100644
--- a/chrome/locale/ga-IE/torbutton.properties
+++ b/chrome/locale/ga-IE/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Bain
onionServices.authPreferences.removeAll=Bain Uile
onionServices.authPreferences.failedToGetKeys=Níorbh fhéidir eochracha a fháil ó Tor
onionServices.authPreferences.failedToRemoveKey=Níorbh fhéidir an eochair a bhaint
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Tuigim
+onionServices.v2Deprecated.tooltip=Ní bheidh tú in ann teacht ar an suíomh onion seo go luath
# Onion-Location strings.
onionLocation.alwaysPrioritize=Tabhair tús áite do Shuímh Onion
@@ -139,12 +145,12 @@ onionLocation.askEverytime=Fiafraigh díom i gcónaí
onionLocation.prioritizeOnionsDescription=Tabhair tús áite do shuímh onion nuair is féidir.
onionLocation.onionServicesTitle=Seirbhísí Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
+cryptoSafetyPrompt.whatCanHeading=Cad is féidir leat a dhéanamh?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
cryptoSafetyPrompt.learnMore=Tuilleadh eolais
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=Athlódáil an Cluaisín seo le Ciorcad Nua
cryptoSafetyPrompt.primaryActionAccessKey=R
cryptoSafetyPrompt.secondaryAction=Dismiss Warning
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/he/torbutton.properties b/chrome/locale/he/torbutton.properties
index 363cbbc9..88fe0ac4 100644
--- a/chrome/locale/he/torbutton.properties
+++ b/chrome/locale/he/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=הסר
onionServices.authPreferences.removeAll=הסר הכול
onionServices.authPreferences.failedToGetKeys=לא היה ניתן לאחזר מפתחות מן tor
onionServices.authPreferences.failedToRemoveKey=לא היה ניתן להסיר מפתח
+onionServices.v2Deprecated.pageTitle=אזהרת הוצאה משימוש של אתר בצל גרסה 2
+onionServices.v2Deprecated.header=אתרי בצל גרסה 2 יוצאו משימוש בקרוב
+onionServices.v2Deprecated=אתר בצל זה לא יהיה נגיש יותר בקרוב. אנא צור קשר עם מנהלן האתר ועודד אותו לשדרג.
+onionServices.v2Deprecated.longDescription=Tor מסיים את תמיכתו בגרסה 2 של שירותי בצל החל מיולי 2021, ואתר הבצל הזה לא יהיה נגיש יותר בכתובת זו. אם אתה מנהלן האתר, שדרג בקרוב אל גרסה 3 של שירותי בצל.
+onionServices.v2Deprecated.tryAgain=הבנתי
+onionServices.v2Deprecated.tooltip=אתר בצל זה לא יהיה נגיש יותר בקרוב
# Onion-Location strings.
onionLocation.alwaysPrioritize=תעדף תמיד בצלים
@@ -132,7 +138,7 @@ onionLocation.notNow=לא עכשיו
onionLocation.notNowAccessKey=n
onionLocation.description=יש גרסה פרטית יותר ומאובטחת יותר של אתר זה שזמינה על גבי רשת Tor באמצעות שירותי בצל. שירותי בצל עוזרים למפרסמי אתרים ולמבקרים שלהם להביס ציתות וצנזורה.
onionLocation.tryThis=נסה שירותי בצל
-onionLocation.onionAvailable=גרסת .onion זמינה
+onionLocation.onionAvailable=.onion זמין
onionLocation.learnMore=למד עוד…
onionLocation.always=תמיד
onionLocation.askEverytime=שאל כל פעם
diff --git a/chrome/locale/hu/torbutton.properties b/chrome/locale/hu/torbutton.properties
index 8c013243..72631994 100644
--- a/chrome/locale/hu/torbutton.properties
+++ b/chrome/locale/hu/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Eltávolít
onionServices.authPreferences.removeAll=Mindent eltávolít
onionServices.authPreferences.failedToGetKeys=Sikertelen a kulcsok lekérése a tor-ról
onionServices.authPreferences.failedToRemoveKey=Nem lehetséges a kulcs eltávolítása
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Megvan
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Mindig priorizálja az Onionokat
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Kérdezze mindig
onionLocation.prioritizeOnionsDescription=Priorizálja a .oinion oldalt, ha ismert.
onionLocation.onionServicesTitle=Onion Szolgáltatások
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/id/torbutton.properties b/chrome/locale/id/torbutton.properties
index 96b7302a..2ff58a32 100644
--- a/chrome/locale/id/torbutton.properties
+++ b/chrome/locale/id/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Hapus
onionServices.authPreferences.removeAll=Hapus semua
onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Got it
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Tanyakan setiap saat
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=Layanan Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/is/torbutton.properties b/chrome/locale/is/torbutton.properties
index e2445fdd..68e7644d 100644
--- a/chrome/locale/is/torbutton.properties
+++ b/chrome/locale/is/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Fjarlægja
onionServices.authPreferences.removeAll=Fjarlægja allt
onionServices.authPreferences.failedToGetKeys=Tókst ekki að ná í lykla frá Tor
onionServices.authPreferences.failedToRemoveKey=Tókst ekki að fjarlægja lykil
+onionServices.v2Deprecated.pageTitle=Onion-vefsvæði af útgáfu 2 verða úrelt
+onionServices.v2Deprecated.header=Onion-vefsvæði af útgáfu 2 verða úrelt innan skamms
+onionServices.v2Deprecated=Þetta onion-vefsvæði verður ekki tiltækt á næstunni. Hafðu samband við kerfisstjóra þess og hvettu þá til að uppfæra.
+onionServices.v2Deprecated.longDescription=Tor hætti stuðningi við onion-þjónustur af útgáfu 2 í byrjun júlí 2021, og verður þetta onion-vefsvæði ekki lengur tiltækt á þessu vistfangi. Ef þú ert kerfisstjóri vefsvæðisins, ættirðu sem fyrst að uppfæra onion-þjónustuna í útgáfu 3.
+onionServices.v2Deprecated.tryAgain=Náði því
+onionServices.v2Deprecated.tooltip=Þetta onion-vefsvæði verður ekki tiltækt á næstunni
# Onion-Location strings.
onionLocation.alwaysPrioritize=Alltaf gefa onion-vefjum forgang
@@ -139,12 +145,12 @@ onionLocation.askEverytime=Spyrja í hvert skipti
onionLocation.prioritizeOnionsDescription=Gefa .onion-vefjum forgang þegar þeir eru þekktir.
onionLocation.onionServicesTitle=Onion-þjónustur
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=Rafmyntavistfang (%S) hefur verið afritað af óöruggu vefsvæði. Mögulega hefur því verið breytt.
+cryptoSafetyPrompt.whatCanHeading=Hvað geturðu gert í því?
+cryptoSafetyPrompt.whatCanBody=Þú getur reynt að endurtengjast með nýrri rás tl að koma á öruggu sambandi, eða tekið áhættuna og hunsað þessa aðvörun.
cryptoSafetyPrompt.learnMore=Fræðast frekar
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=Endurnýja flipa með nýrri rás
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=Hunsa aðvörun
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/it/torbutton.properties b/chrome/locale/it/torbutton.properties
index be28d935..d3dd932f 100644
--- a/chrome/locale/it/torbutton.properties
+++ b/chrome/locale/it/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Rimuovi
onionServices.authPreferences.removeAll=Rimuovi tutte
onionServices.authPreferences.failedToGetKeys=Impossibile recuperare le chiavi da Tor
onionServices.authPreferences.failedToRemoveKey=Impossibile rimuovere la chiave
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Ho capito
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Dare Sempre Priorità agli Onion
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Chiedi ogni volta
onionLocation.prioritizeOnionsDescription=Dare priorità ai siti .onion quando conosciuti.
onionLocation.onionServicesTitle=Servizi Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=È stato copiato un indirizzo di criptovaluta (%S) da un sito non sicuro. Potrebbe essere stato modificato.
cryptoSafetyPrompt.whatCanHeading=Cosa puoi fare al riguardo?
cryptoSafetyPrompt.whatCanBody=Puoi provare a riconnetterti con un nuovo circuito per stabilire una connessione sicura, o accettare il rischio e chiudere questo avviso.
diff --git a/chrome/locale/ja/torbutton.properties b/chrome/locale/ja/torbutton.properties
index ea893f3c..6f917832 100644
--- a/chrome/locale/ja/torbutton.properties
+++ b/chrome/locale/ja/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=解除
onionServices.authPreferences.removeAll=すべて削除
onionServices.authPreferences.failedToGetKeys=Tor から鍵を取得できません
onionServices.authPreferences.failedToRemoveKey=鍵を削除できません
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor は、バージョン 2 の Onion サービスのサポートを 2021 年 7 月に終了します。今後、バージョン 2 の Onion サイトには到達できなくなります。あなたがサイト管理者の場合、早急にバージョン 3 の Onion サービスにアップグレードしてください。
+onionServices.v2Deprecated.tryAgain=了解
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=常に Onion を優先する
@@ -139,12 +145,12 @@ onionLocation.askEverytime=毎回尋ねる
onionLocation.prioritizeOnionsDescription=存在する場合は .onion サイトを優先的に利用する。
onionLocation.onionServicesTitle=Onion サービス
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=暗号通貨アドレス (%S) は安全ではない Web サイトからコピーされました。変更された可能性があります。
+cryptoSafetyPrompt.whatCanHeading=何ができますか?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
cryptoSafetyPrompt.learnMore=詳細情報
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=新しいサーキットを利用してタブを再読み込み
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=警告を無視
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/ka/torbutton.properties b/chrome/locale/ka/torbutton.properties
index 17f0a2cc..bd3a03ec 100644
--- a/chrome/locale/ka/torbutton.properties
+++ b/chrome/locale/ka/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=წაშლა
onionServices.authPreferences.removeAll=ყველას მოცილება
onionServices.authPreferences.failedToGetKeys=ვერ ხერხდება გასაღებების მიღება tor-იდან
onionServices.authPreferences.failedToRemoveKey=ვერ ხერხდება გასაღების მოცილება
+onionServices.v2Deprecated.pageTitle=V2 Onion-საიტების გაუქმების გაფრთხილება
+onionServices.v2Deprecated.header=მე-2 ვერსიის Onion-საიტები მალე გაუქმდება
+onionServices.v2Deprecated=ეს Onion-საიტი მალე აღარ იქნება ხელმისაწვდომი. გთხოვთ, დაუკავშირდეთ საიტის ხელმძღვანელობას და მოუწოდეთ, ახალ ვერსიაზე გადაიყვანონ.
+onionServices.v2Deprecated.longDescription=Tor წყვეტს მე-2 ვერსიის Onion-მომსახურებების მხარდაჭერას 2021 წლის ივლისში და ეს Onion-საიტი აღარ იქნება ხელმიასწვდომი ამ მისამართზე. თუ ამ საიტს ხელმძღვანელობთ, მალე გადაიყვანეთ Onion-ის მე-3 ვერსიაზე.
+onionServices.v2Deprecated.tryAgain=მიღებულია
+onionServices.v2Deprecated.tooltip=ეს Onion-საიტი, მალე აღარ იქნება ხელმისაწვდომი
# Onion-Location strings.
onionLocation.alwaysPrioritize=ყოველთვის Onions
@@ -139,12 +145,12 @@ onionLocation.askEverytime=შეკითხვა ყოველ ჯერზ
onionLocation.prioritizeOnionsDescription=უპირატესობა .onion-საიტებს ამოცნობისას
onionLocation.onionServicesTitle=Onion-მომსახურებები
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=კრიპტოვალუტის მისამართის (%S) ასლი აღებულია დაუცველი საიტიდან. შესაძლოა, გადაკეთებული იყოს.
+cryptoSafetyPrompt.whatCanHeading=რა ვიღონო?
+cryptoSafetyPrompt.whatCanBody=შეგიძლიათ, ახალი წრედის სცადოთ დაცული კავშირის დამყარება, ან საფრთხის გაცნობიერებით აიცილოთ გაფრთხილება.
cryptoSafetyPrompt.learnMore=იხილეთ ვრცლად
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=ჩანართის გადატვირთვა ახალი წრედით
cryptoSafetyPrompt.primaryActionAccessKey=მ
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=გაფრთხილების აცილება
cryptoSafetyPrompt.secondaryActionAccessKey=ბ
diff --git a/chrome/locale/ko/torbutton.properties b/chrome/locale/ko/torbutton.properties
index 493064ee..b59c1f58 100644
--- a/chrome/locale/ko/torbutton.properties
+++ b/chrome/locale/ko/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=제거하기
onionServices.authPreferences.removeAll=모두 제거하기
onionServices.authPreferences.failedToGetKeys=Tor에서 키를 검색할 수 없음
onionServices.authPreferences.failedToRemoveKey=키를 제거할 수 없음
+onionServices.v2Deprecated.pageTitle=V2 Onion 사이트 더 이상 사용되지 않음
+onionServices.v2Deprecated.header=버전 2 Onion 사이트는 곧 더 이상 사용되지 않습니다.
+onionServices.v2Deprecated=이 Onion 사이트에 곧 연결할 수 없습니다. 사이트 관리자에게 문의하여 업그레이드를 권장하십시오.
+onionServices.v2Deprecated.longDescription=Tor는 2021년 7월부터 버전 2 Onion 서비스에 대한 지원을 종료할 예정이며, 이 주소로 더 이상 Onion 사이트에 접속할 수 없습니다. 사이트 관리자일 경우 곧 버전 3 Onion 서비스로 업그레이드하십시오.
+onionServices.v2Deprecated.tryAgain=알겠습니다
+onionServices.v2Deprecated.tooltip=이 Onion 사이트에 곧 연결할 수 없습니다.
# Onion-Location strings.
onionLocation.alwaysPrioritize=항상 Onion 우선 순위 지정
@@ -139,12 +145,12 @@ onionLocation.askEverytime=항상 묻기
onionLocation.prioritizeOnionsDescription=알려진 경우 .onion 사이트의 우선 순위를 지정합니다.
onionLocation.onionServicesTitle=Onion 서비스
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=안전하지 않은 웹사이트에서 암호화폐 주소 (%S)가 복사되었습니다. 수정했을 수도 있습니다.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+cryptoSafetyPrompt.whatCanBody=새 우회로에 다시 연결하여 보안 연결을 설정하거나 위험을 감수하고 이 경고를 해제할 수 있습니다.
cryptoSafetyPrompt.learnMore=더 알아보기
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=새 우회로를 사용하여 탭 다시 로드
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=경고 해제
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/lt/torbutton.properties b/chrome/locale/lt/torbutton.properties
index 0c385096..f87cf465 100644
--- a/chrome/locale/lt/torbutton.properties
+++ b/chrome/locale/lt/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Šalinti
onionServices.authPreferences.removeAll=Šalinti visus
onionServices.authPreferences.failedToGetKeys=Nepavyko gauti raktų iš Tor
onionServices.authPreferences.failedToRemoveKey=Nepavyko pašalinti raktą
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Supratau
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Visada teikti pirmenybę Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Klausti kiekvieną kartą
onionLocation.prioritizeOnionsDescription=Teikti pirmenybę .onion svetainėms, kai žinoma.
onionLocation.onionServicesTitle=Onion paslaugos
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/mk/torbutton.properties b/chrome/locale/mk/torbutton.properties
index 1476692d..c9972203 100644
--- a/chrome/locale/mk/torbutton.properties
+++ b/chrome/locale/mk/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Отстрани
onionServices.authPreferences.removeAll=Избриши се
onionServices.authPreferences.failedToGetKeys=Не може да се повратат клучевите од Tor
onionServices.authPreferences.failedToRemoveKey=Не може да се избрише клуч
+onionServices.v2Deprecated.pageTitle=Предупредување за Амортизација на В2 Onion Веб страни
+onionServices.v2Deprecated.header=Верзијата 2 на Onion веб страните наскоро ќе биде амортизирана
+onionServices.v2Deprecated=Оваа onion веб страна наскоро нема да биде достапна. Ве молиме контактирајте го администраторот на веб страната и охрабрете го да ја надгради.
+onionServices.v2Deprecated.longDescription=Tor ја завршува поддршката за верзија 2 на onion сервисите/услугите почнувајќи од јули 2021 година, и оаа onion веб страна повеќе нема да биде достапна на оваа адреса. Ако вие сте администраторот, надградете ја во верзија 3 onion сервис/услуга поскоро.
+onionServices.v2Deprecated.tryAgain=Разбирам
+onionServices.v2Deprecated.tooltip=Оваа onion веб страна наскоро нема биде достапна
# Onion-Location strings.
onionLocation.alwaysPrioritize=Секогаш преферирај Onion-и
@@ -139,12 +145,12 @@ onionLocation.askEverytime=Прашувај секој пат
onionLocation.prioritizeOnionsDescription=Преферирај .onion веб страна кога се познати.
onionLocation.onionServicesTitle=Onion Услуги
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=Адресата на криптовалутата (%S) беше копирана од небезбедна веб страна. Можно е истата да била променета.
+cryptoSafetyPrompt.whatCanHeading=Што можете да направите?
+cryptoSafetyPrompt.whatCanBody=Можете да се обидете повторно да се поврзете со Нов Круг за да воспоставите безбедно поврзување, или да го прифатите ризикот и да го отфрлите предупредувањето.
cryptoSafetyPrompt.learnMore=Научете повеќе
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=Освежи Таб со Нов Круг
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=Отфрли предупредување
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/ms/torbutton.properties b/chrome/locale/ms/torbutton.properties
index 4da1eaa3..8f066be7 100644
--- a/chrome/locale/ms/torbutton.properties
+++ b/chrome/locale/ms/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Buang
onionServices.authPreferences.removeAll=Remove All
onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Got it
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ask every time
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=Perkhidmatan Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/my/torbutton.properties b/chrome/locale/my/torbutton.properties
index b19b1b20..d3da5249 100644
--- a/chrome/locale/my/torbutton.properties
+++ b/chrome/locale/my/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=ဖယ်ရှားမယ်
onionServices.authPreferences.removeAll=အားလုံး ဖယ်ရှားမယ်
onionServices.authPreferences.failedToGetKeys=Tor မှ ကီးကုဒ်များ မရယူနိုင်ပါ
onionServices.authPreferences.failedToRemoveKey=ကီးကုဒ် ဖယ်ရှား၍မရပါ
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=ရသွားပါပြီ
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onions များကို အမြဲ ဦးစားပေးမယ်
@@ -139,7 +145,7 @@ onionLocation.askEverytime=အချိန်တိုင်းမေးပါ
onionLocation.prioritizeOnionsDescription=.onion ဆိုဒ်များ သိရှိလျှင် ၎င်းတို့ကို ဦးစားပေးပါ။
onionLocation.onionServicesTitle=Onion Services
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/nb-NO/torbutton.properties b/chrome/locale/nb-NO/torbutton.properties
index febca087..cbd35761 100644
--- a/chrome/locale/nb-NO/torbutton.properties
+++ b/chrome/locale/nb-NO/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Fjern
onionServices.authPreferences.removeAll=Fjern Alle
onionServices.authPreferences.failedToGetKeys=Kan ikke hente nøklene fra tor
onionServices.authPreferences.failedToRemoveKey=75%match\nKunne ikke fjerne nøkkel
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Got it
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Spør hver gang
onionLocation.prioritizeOnionsDescription=Prioriter. .onion sider når kjent
onionLocation.onionServicesTitle=Løk-tjenester
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/nl/torbutton.properties b/chrome/locale/nl/torbutton.properties
index 0e38645d..14f8ee0f 100644
--- a/chrome/locale/nl/torbutton.properties
+++ b/chrome/locale/nl/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Verwijderen
onionServices.authPreferences.removeAll=Alle verwijderen
onionServices.authPreferences.failedToGetKeys=Kan geen sleutels van tor ophalen
onionServices.authPreferences.failedToRemoveKey=Kan sleutel niet verwijderen
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Begrepen
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onions altijd prioriteit geven
diff --git a/chrome/locale/pl/torbutton.properties b/chrome/locale/pl/torbutton.properties
index fdf2438b..4929465e 100644
--- a/chrome/locale/pl/torbutton.properties
+++ b/chrome/locale/pl/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Usuń
onionServices.authPreferences.removeAll=Usuń wszystko
onionServices.authPreferences.failedToGetKeys=Nie można odebrać kluczy z Tor
onionServices.authPreferences.failedToRemoveKey=Usunięcie klucza nie powiodło się
+onionServices.v2Deprecated.pageTitle=Ostrzeżenie o wycofaniu strony cebulowej w wersji 2
+onionServices.v2Deprecated.header=Strony cebulowe w wersji 2 zostaną wkrótce wycofane
+onionServices.v2Deprecated=Wkrótce ta strona cebulowa będzie niedostępna. Skontaktuj się z jej administratorem i zachęć go do aktualizacji.
+onionServices.v2Deprecated.longDescription=Tor kończy wsparcie dla usług cebulowych w wersji 2 począwszy od lipca 2021 r., a ta strona cebulowa nie będzie już dostępna pod tym adresem. Jeśli jesteś administratorem strony, prędko uaktualnij usługę cebulową do wersji 3.
+onionServices.v2Deprecated.tryAgain=Rozumiem
+onionServices.v2Deprecated.tooltip=Wkrótce ta strona cebulowa będzie niedostępna
# Onion-Location strings.
onionLocation.alwaysPrioritize=Zawsze traktuj cebule priorytetowo
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Pytaj za każdym razem
onionLocation.prioritizeOnionsDescription=Nadaj priorytet witrynom .onion, gdy są znane.
onionLocation.onionServicesTitle=Usługi cebulowe
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Adres kryptowaluty (%S) został skopiowany z niezabezpieczonej strony internetowej. Mogło dojść do zmodyfikowania.
cryptoSafetyPrompt.whatCanHeading=Co możesz z tym zrobić?
cryptoSafetyPrompt.whatCanBody=Możesz spróbować ponownie połączyć się z nowym obwodem, aby ustanowić bezpieczne połączenie, lub zaakceptować ryzyko i odrzucić to ostrzeżenie.
diff --git a/chrome/locale/pt-BR/torbutton.properties b/chrome/locale/pt-BR/torbutton.properties
index e1aeeecd..0c243401 100644
--- a/chrome/locale/pt-BR/torbutton.properties
+++ b/chrome/locale/pt-BR/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Remover
onionServices.authPreferences.removeAll=Remover tudo
onionServices.authPreferences.failedToGetKeys=Não foi possível recuperar as chaves do tor
onionServices.authPreferences.failedToRemoveKey=Não foi possível remover a chave
+onionServices.v2Deprecated.pageTitle=Aviso de deprecação do local de onion v2
+onionServices.v2Deprecated.header=Sites onion da versão 2 serão depreciados em breve
+onionServices.v2Deprecated=Este site onion não será acessível em breve. Entre em contato com o administrador do site e incentive-os a atualizar.
+onionServices.v2Deprecated.longDescription=O Tor está terminando seu suporte para os serviços onion da versão 2 começando em julho de 2021, e este site onion não será mais alcável neste endereço. Se você é o administrador do site, atualize para um serviço onion da versão 3 em breve.
+onionServices.v2Deprecated.tryAgain=Entendi
+onionServices.v2Deprecated.tooltip=Este site onion não será acessível em breve
# Onion-Location strings.
onionLocation.alwaysPrioritize=Priorizar sempre Onions
@@ -139,12 +145,12 @@ onionLocation.askEverytime=Perguntar sempre
onionLocation.prioritizeOnionsDescription=Priorize sites .onion quando conhecido.
onionLocation.onionServicesTitle=Serviços Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=Um endereço de criptomoeda (%S) foi copiado de um site não seguro. Pode ter sido modificado.
+cryptoSafetyPrompt.whatCanHeading=O que você pode fazer a respeito?
+cryptoSafetyPrompt.whatCanBody=Você pode tentar reconectar com um novo circuito para estabelecer uma conexão segura ou aceitar o risco e ignorar este aviso.
cryptoSafetyPrompt.learnMore=Saiba Mais
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=Recarregar guia com um novo circuito
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=Aviso de dispersar
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/ro/torbutton.properties b/chrome/locale/ro/torbutton.properties
index a37956f5..a62ad70f 100644
--- a/chrome/locale/ro/torbutton.properties
+++ b/chrome/locale/ro/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Eliminare
onionServices.authPreferences.removeAll=Șterge tot
onionServices.authPreferences.failedToGetKeys=Imposibil de a prelua chei de la tor
onionServices.authPreferences.failedToRemoveKey=Nu se poate elimina cheia
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Am înțeles
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Întotdeauna prioritate pentru serviciile Onion
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Întreabă de fiecare dată
onionLocation.prioritizeOnionsDescription=Prioritizați site-urile .onion când sunt cunoscute.
onionLocation.onionServicesTitle=Servicii Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/ru/torbutton.properties b/chrome/locale/ru/torbutton.properties
index 726479d3..c83ae437 100644
--- a/chrome/locale/ru/torbutton.properties
+++ b/chrome/locale/ru/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Удалить
onionServices.authPreferences.removeAll=Удалить все
onionServices.authPreferences.failedToGetKeys=Невозможно получить ключи от Tor
onionServices.authPreferences.failedToRemoveKey=Невозможно удалить ключ
+onionServices.v2Deprecated.pageTitle=Предупреждение о прекращении поддержки сайтов Onion V2
+onionServices.v2Deprecated.header=Поддержка сайтов Onion версии 2 скоро будет прекращена.
+onionServices.v2Deprecated=Этот сайт скоро будет недоступен. Пожалуйста, свяжитесь с администратором сайта и попросите его обновить сайт.
+onionServices.v2Deprecated.longDescription=Tor прекращает поддержку Onion-сервисов версии 2 с июля 2021 года, и этот Onion-сайт больше не будет доступен по этому адресу. Если вы являетесь администратором сайта, перейдите на Onion-сервис версии 3 в ближайшее время.
+onionServices.v2Deprecated.tryAgain=ОК
+onionServices.v2Deprecated.tooltip=Этот onion-сайт в ближайшее время станет недоступным
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onion-ресурсы всегда в приоритете
@@ -139,12 +145,12 @@ onionLocation.askEverytime=Спрашивать всякий раз
onionLocation.prioritizeOnionsDescription=Onion-сайты в приоритете (по возможности).
onionLocation.onionServicesTitle=Onion-ресурсы
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=Адрес криптовалюты (%S) был скопирован с небезопасного веб-сайта. Он мог быть изменен.
+cryptoSafetyPrompt.whatCanHeading=Что вы можете с этим сделать?
+cryptoSafetyPrompt.whatCanBody=Вы можете попробовать переподключиться к новой цепочке, чтобы установить безопасное соединение, или принять риск и пропустить это предупреждение.
cryptoSafetyPrompt.learnMore=Узнать больше
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=Перезагрузить вкладку с новой цепочкой
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=Закрыть предупреждение
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/sv-SE/browserOnboarding.properties b/chrome/locale/sv-SE/browserOnboarding.properties
index 975896d9..e99a0bfe 100644
--- a/chrome/locale/sv-SE/browserOnboarding.properties
+++ b/chrome/locale/sv-SE/browserOnboarding.properties
@@ -41,7 +41,7 @@ onboarding.tour-tor-expect-differences.next-button=Gå till Onion-tjänster
onboarding.tour-tor-onion-services=Onion-tjänster
onboarding.tour-tor-onion-services.title=Var extra skyddad.
onboarding.tour-tor-onion-services.description=Onion-tjänster är webbplatser som slutar med .onion som ger extra skydd till utgivare och besökare, inklusive extra skyddsåtgärder mot censur. Onion-tjänster tillåter vem som helst att tillhandahålla innehåll och tjänster anonymt. Klicka nedan för att besöka onion-webbplatsen för DuckDuckGo.
-onboarding.tour-tor-onion-services.button=Besök en Onion
+onboarding.tour-tor-onion-services.button=Besök en onion
onboarding.tour-tor-onion-services.next-button=Färdig
onboarding.overlay-icon-tooltip-updated2=Se vad som är nytt\ni %S
@@ -49,7 +49,7 @@ onboarding.tour-tor-update.prefix-new=Ny
onboarding.tour-tor-update.prefix-updated=Uppdaterad
onboarding.tour-tor-toolbar=Verktygsfält
-onboarding.tour-tor-toolbar-update-9.0.title=Adjö Onion-knappen.
+onboarding.tour-tor-toolbar-update-9.0.title=Adjö onion-knappen.
onboarding.tour-tor-toolbar-update-9.0.description=Vi vill att din upplevelse med Tor ska vara helt integrerad i Tor Browser.
onboarding.tour-tor-toolbar-update-9.0.description-para2=Därför kan du nu, i stället för att använda onion-knappen, se din Tor-krets via [i] i webbadressfältet och begära en ny identitet med hjälp av verktygsraden eller menyn.
onboarding.tour-tor-toolbar-update-9.0.button=Hur man begär en ny identitet
diff --git a/chrome/locale/sv-SE/torbutton.dtd b/chrome/locale/sv-SE/torbutton.dtd
index 7d69bc12..ee739e20 100644
--- a/chrome/locale/sv-SE/torbutton.dtd
+++ b/chrome/locale/sv-SE/torbutton.dtd
@@ -31,7 +31,7 @@
<!ENTITY torbutton.prefs.sec_safest_label "Säkrast">
<!ENTITY torbutton.prefs.sec_safest_description "Tillåt endast webbplatsfunktioner som krävs för statiska webbplatser och grundläggande tjänster. Dessa förändringar påverkar bilder, media och skript.">
<!ENTITY torbutton.prefs.sec_safest_list_label "I den säkraste inställningen:">
-<!ENTITY torbutton.prefs.sec_learn_more_label "Läs mer">
+<!ENTITY torbutton.prefs.sec_learn_more_label "Lär dig mer">
<!ENTITY torbutton.prefs.sec_js_on_https_sites_only "JavaScript är inaktiverat på webbplatser utan HTTPS.">
<!ENTITY torbutton.prefs.sec_js_disabled "JavaScript är inaktiverat som standard på alla webbplatser.">
<!ENTITY torbutton.prefs.sec_limit_typography "Vissa teckensnitt och matematiska symboler är inaktiverade.">
diff --git a/chrome/locale/sv-SE/torbutton.properties b/chrome/locale/sv-SE/torbutton.properties
index eddcff3f..e8445c5e 100644
--- a/chrome/locale/sv-SE/torbutton.properties
+++ b/chrome/locale/sv-SE/torbutton.properties
@@ -7,7 +7,7 @@ torbutton.circuit_display.tor_bridge = Bro
torbutton.circuit_display.unknown_country = Okänt land
torbutton.circuit_display.guard = Vakt
torbutton.circuit_display.guard_note = Din [Guard]-nod kanske inte ändras.
-torbutton.circuit_display.learn_more = Läs mer
+torbutton.circuit_display.learn_more = Lär dig mer
torbutton.circuit_display.click_to_copy = Klicka för att kopiera
torbutton.circuit_display.copied = Kopierat!
torbutton.content_sizer.margin_tooltip = Tor Browser lägger till denna marginal för att göra bredden och höjden på ditt fönster mindre tydlig. Därmed minskas möjligheten att spåra dig.
@@ -54,15 +54,15 @@ profileMigrationFailed=Migrering av din befintliga %S profil misslyckades.\nNya
updateDownloadingPanelUILabel=Hämtar %S-uppdatering
# .Onion Page Info prompt. Strings are kept here for ease of translation.
-pageInfo_OnionEncryptionWithBitsAndProtocol=Anslutning krypterad (Onion-tjänst, %1$S, %2$S bit nycklar, %3$S)
-pageInfo_OnionEncryption=Anslutning krypterad (Onion-tjänst)
+pageInfo_OnionEncryptionWithBitsAndProtocol=Anslutning krypterad (onion-tjänst, %1$S, %2$S bit nycklar, %3$S)
+pageInfo_OnionEncryption=Anslutning krypterad (onion-tjänst)
pageInfo_OnionName=Onion-namn:
# Onion services strings. Strings are kept here for ease of translation.
-onionServices.learnMore=Läs mer
+onionServices.learnMore=Lär dig mer
onionServices.errorPage.browser=Webbläsare
onionServices.errorPage.network=Nätverk
-onionServices.errorPage.onionSite=Onion-sida
+onionServices.errorPage.onionSite=Onion-webbplats
# LOCALIZATION NOTE: In the longDescription strings, %S will be replaced with
# an error code, e.g., 0xF3.
# Tor SOCKS error 0xF0:
@@ -102,7 +102,7 @@ onionServices.badAddress=Den angivna adressen för onion-webbplatsen är ogiltig
onionServices.badAddress.longDescription=Detaljer: %S — Den tillhandahållna .onion-adressen är ogiltig. Det här felet returneras på grund av ett av följande skäl: adresskontrollsumman stämmer inte, den offentliga nyckeln ed25519 är ogiltig eller kodningen är ogiltig.
# Tor SOCKS error 0xF7:
onionServices.introTimedOut.pageTitle=Problem med att läsa in onion-webbplats
-onionServices.introTimedOut.header=Tiden för skapandet av onionwebbplatskrets löpte ut
+onionServices.introTimedOut.header=Tiden för skapandet av onion-webbplatskrets löpte ut
onionServices.introTimedOut=Det gick inte att ansluta till onion-webbplats, eventuellt på grund av en dålig nätverksanslutning.
onionServices.introTimedOut.longDescription=Detaljer: %S — Anslutningen till den begärda onion-tjänsten avbröts när man försökte bygga möteskretsen.
#
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Ta bort
onionServices.authPreferences.removeAll=Ta bort alla
onionServices.authPreferences.failedToGetKeys=Det går inte att hämta nycklar från Tor
onionServices.authPreferences.failedToRemoveKey=Det går inte att ta bort nyckeln
+onionServices.v2Deprecated.pageTitle=Varning för upphörande av V2 onion-webbplats
+onionServices.v2Deprecated.header=Version 2 onion-webbplatser kommer snart att upphöra att gälla
+onionServices.v2Deprecated=Denna onion-webbplats kan inte nås snart. Kontakta webbplatsadministratören och uppmuntra dem att uppgradera.
+onionServices.v2Deprecated.longDescription=Tor avslutar sitt stöd för onion-tjänster av version 2 i början av juli 2021, och denna onion-webbplats kan inte längre nås på den här adressen. Om du är webbplatsadministratör kan du snart uppgradera till en onion-tjänst av version 3.
+onionServices.v2Deprecated.tryAgain=Förstått
+onionServices.v2Deprecated.tooltip=Denna onion-webbplats kommer inte vara nåbar snart
# Onion-Location strings.
onionLocation.alwaysPrioritize=Prioritera alltid onion-tjänster
@@ -133,7 +139,7 @@ onionLocation.notNowAccessKey=n
onionLocation.description=Det finns en mer privat och säker version av denna webbplats via Tor-nätverket via onion-tjänster. Onion-tjänster hjälper webbplatsutgivare och deras besökare att besegra övervakning och censur.
onionLocation.tryThis=Prova onion-tjänster
onionLocation.onionAvailable=.onion tillgänglig
-onionLocation.learnMore=Läs mer...
+onionLocation.learnMore=Lär dig mer...
onionLocation.always=Alltid
onionLocation.askEverytime=Fråga varje gång
onionLocation.prioritizeOnionsDescription=Prioritera .onion-webbplatser när de är kända.
@@ -143,7 +149,7 @@ onionLocation.onionServicesTitle=Onion-tjänster
cryptoSafetyPrompt.cryptoWarning=En kryptovaluta-adress (%S) har kopierats från en osäker webbplats. Den kunde ha ändrats.
cryptoSafetyPrompt.whatCanHeading=Vad kan du göra åt det?
cryptoSafetyPrompt.whatCanBody=Du kan försöka återansluta till en ny krets för att upprätta en säker anslutning eller acceptera risken och avvisa denna varning.
-cryptoSafetyPrompt.learnMore=Läs mer
+cryptoSafetyPrompt.learnMore=Lär dig mer
cryptoSafetyPrompt.primaryAction=Läs om fliken med en ny krets
cryptoSafetyPrompt.primaryActionAccessKey=R
cryptoSafetyPrompt.secondaryAction=Avvisa varning
diff --git a/chrome/locale/th/aboutTor.dtd b/chrome/locale/th/aboutTor.dtd
index d9671769..96ebca5e 100644
--- a/chrome/locale/th/aboutTor.dtd
+++ b/chrome/locale/th/aboutTor.dtd
@@ -27,5 +27,5 @@
<!ENTITY aboutTor.newsletter.tagline "ส่งตรงข่าวสารเกี่ยวกับ Tor ไปยังกล่องจดหมายของคุณ">
<!ENTITY aboutTor.newsletter.link_text "สมัครรับข่าวสารเกี่ยวกับ Tor">
-<!ENTITY aboutTor.donationBanner.freeToUse "Tor is free to use because of donations from people like you.">
+<!ENTITY aboutTor.donationBanner.freeToUse "บริการ Tor นี้ฟรี ไม่มีค่าใช้จ่ายใดๆเพราะเงินบริจาคจากผู้มีน้ำใจอย่างคุณ">
<!ENTITY aboutTor.donationBanner.buttonA "ร่วมบริจาค">
diff --git a/chrome/locale/th/torbutton.properties b/chrome/locale/th/torbutton.properties
index 2018fc39..fec6faa8 100644
--- a/chrome/locale/th/torbutton.properties
+++ b/chrome/locale/th/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=ลบออก
onionServices.authPreferences.removeAll=ลบออกทั้งหมด
onionServices.authPreferences.failedToGetKeys=ไม่สามารถดึงกุญแจจาก Tor
onionServices.authPreferences.failedToRemoveKey=ไม่สามารถลบกุญแจได้
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=รับทราบ
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ask every time
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=บริการ Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/tr/torbutton.properties b/chrome/locale/tr/torbutton.properties
index 10f8b38d..2d2da738 100644
--- a/chrome/locale/tr/torbutton.properties
+++ b/chrome/locale/tr/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Sil
onionServices.authPreferences.removeAll=Tümünü Sil
onionServices.authPreferences.failedToGetKeys=Anahtarlar Tor üzerinden alınamadı
onionServices.authPreferences.failedToRemoveKey=Anahtar silinemedi
+onionServices.v2Deprecated.pageTitle=V2 Onion Sitelerinin Kullanımdan Kaldırılması Uyarısı
+onionServices.v2Deprecated.header=2. sürüm Onion siteleri yakında kullanımdan kaldırılacak
+onionServices.v2Deprecated=Bu onion sitesine yakında erişilemeyecek. Lütfen site yöneticisine onion hizmetini yükseltmesini bildirin.
+onionServices.v2Deprecated.longDescription=Tor, 2021 Temmuz ayından başlayarak onion hizmetlerinin 2. sürümüne destek vermeyi bırakacak. O nedenle bu onion sitesine bu adresten erişilemeyecek. Sitenin yöneticisi iseniz en kısa zamanda onion hizmetini 3. sürüme yükseltin.
+onionServices.v2Deprecated.tryAgain=Anladım
+onionServices.v2Deprecated.tooltip=Bu onion sitesine yakında erişilemeyecek
# Onion-Location strings.
onionLocation.alwaysPrioritize=Onion sitelerine öncelik verilsin
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Her defasında sorulsun
onionLocation.prioritizeOnionsDescription=Bilindiğinde .onion sitelerine öncelik verilsin.
onionLocation.onionServicesTitle=Onion Hizmetleri
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=Güvenli olmayan bir web sitesinden bir kripto para birimi adresi (%S) kopyalandı. Adres değiştirilmiş olabilir.
cryptoSafetyPrompt.whatCanHeading=Bu konuda ne yapabilirsiniz?
cryptoSafetyPrompt.whatCanBody=Güvenli bir bağlantı kurmak için bağlantı devresini yenilemeyi deneyebilir ya da riski kabul ederek bu uyarıyı yok sayabilirsiniz.
diff --git a/chrome/locale/vi/torbutton.properties b/chrome/locale/vi/torbutton.properties
index 7d5ddf92..3e275ced 100644
--- a/chrome/locale/vi/torbutton.properties
+++ b/chrome/locale/vi/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=Gỡ bỏ
onionServices.authPreferences.removeAll=Remove All
onionServices.authPreferences.failedToGetKeys=Unable to retrieve keys from tor
onionServices.authPreferences.failedToRemoveKey=Unable to remove key
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=Hiểu rõ
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=Always Prioritize Onions
@@ -139,7 +145,7 @@ onionLocation.askEverytime=Ask every time
onionLocation.prioritizeOnionsDescription=Prioritize .onion sites when known.
onionLocation.onionServicesTitle=Các Dịch vụ Onion
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
diff --git a/chrome/locale/zh-CN/torbutton.properties b/chrome/locale/zh-CN/torbutton.properties
index cb20b35a..acf66e66 100644
--- a/chrome/locale/zh-CN/torbutton.properties
+++ b/chrome/locale/zh-CN/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=移除
onionServices.authPreferences.removeAll=移除全部
onionServices.authPreferences.failedToGetKeys=无法从 Tor 获得密钥
onionServices.authPreferences.failedToRemoveKey=无法移除密钥
+onionServices.v2Deprecated.pageTitle=版本 2 洋葱网站弃用警告
+onionServices.v2Deprecated.header=版本 2 洋葱网站将很快被弃用
+onionServices.v2Deprecated=该洋葱网站将很快无法访问。请联系站点管理员并呼吁他们升级。
+onionServices.v2Deprecated.longDescription=Tor 将从 2021 年 7 月开始终止对版本 2 洋葱服务的支持,此洋葱网站将无法再通过此地址访问。 如果您是站点管理员,请尽快升级到版本 3 的洋葱服务。
+onionServices.v2Deprecated.tryAgain=了解了
+onionServices.v2Deprecated.tooltip=该洋葱网站将很快无法访问
# Onion-Location strings.
onionLocation.alwaysPrioritize=始终优先洋葱服务
@@ -139,12 +145,12 @@ onionLocation.askEverytime=每次询问
onionLocation.prioritizeOnionsDescription=请优先使用 .onion 站点。
onionLocation.onionServicesTitle=洋葱服务
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
-cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
-cryptoSafetyPrompt.whatCanHeading=What can you do about it?
-cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
+cryptoSafetyPrompt.cryptoWarning=从不安全的网站复制了加密地址(%S)。它可以被修改。
+cryptoSafetyPrompt.whatCanHeading=你能用它做什么?
+cryptoSafetyPrompt.whatCanBody=您可以尝试使用新线路重新建立安全连接,或者接受风险并消除此警告。
cryptoSafetyPrompt.learnMore=了解更多
-cryptoSafetyPrompt.primaryAction=Reload Tab with a New Circuit
+cryptoSafetyPrompt.primaryAction=使用新线路重新加载选项卡
cryptoSafetyPrompt.primaryActionAccessKey=R
-cryptoSafetyPrompt.secondaryAction=Dismiss Warning
+cryptoSafetyPrompt.secondaryAction=消除警告
cryptoSafetyPrompt.secondaryActionAccessKey=B
diff --git a/chrome/locale/zh-TW/aboutTor.dtd b/chrome/locale/zh-TW/aboutTor.dtd
index 79e06ab4..9061dbce 100644
--- a/chrome/locale/zh-TW/aboutTor.dtd
+++ b/chrome/locale/zh-TW/aboutTor.dtd
@@ -27,5 +27,5 @@
<!ENTITY aboutTor.newsletter.tagline "將 Tor 的最新消息直接傳送到您的收件匣。">
<!ENTITY aboutTor.newsletter.link_text "訂閱 Tor 的新資訊。">
-<!ENTITY aboutTor.donationBanner.freeToUse "由於有像您這樣的人的捐款,Tor 可以免費使用。">
+<!ENTITY aboutTor.donationBanner.freeToUse "由於有像您這樣的人捐款,Tor 可以免費使用。">
<!ENTITY aboutTor.donationBanner.buttonA "立刻捐款">
diff --git a/chrome/locale/zh-TW/torbutton.properties b/chrome/locale/zh-TW/torbutton.properties
index 047e9c56..19afc103 100644
--- a/chrome/locale/zh-TW/torbutton.properties
+++ b/chrome/locale/zh-TW/torbutton.properties
@@ -124,6 +124,12 @@ onionServices.authPreferences.remove=移除
onionServices.authPreferences.removeAll=全部移除
onionServices.authPreferences.failedToGetKeys=無法從 Tor 擷取金鑰
onionServices.authPreferences.failedToRemoveKey=無法移除金鑰
+onionServices.v2Deprecated.pageTitle=V2 Onion Site Deprecation Warning
+onionServices.v2Deprecated.header=Version 2 Onion Sites will be deprecated soon
+onionServices.v2Deprecated=This onion site will not be reachable soon. Please contact the site administrator and encourage them to upgrade.
+onionServices.v2Deprecated.longDescription=Tor is ending its support for version 2 onion services beginning in July 2021, and this onion site will no longer be reachable at this address. If you are the site administrator, upgrade to a version 3 onion service soon.
+onionServices.v2Deprecated.tryAgain=收到
+onionServices.v2Deprecated.tooltip=This onion site will not be reachable soon
# Onion-Location strings.
onionLocation.alwaysPrioritize=洋蔥服務總是優先
@@ -139,7 +145,7 @@ onionLocation.askEverytime=每次詢問
onionLocation.prioritizeOnionsDescription=優先使用洋蔥網站。
onionLocation.onionServicesTitle=洋蔥服務
-# LOCALIZATION NOTE: %S will be replaced with the crytocurrency address.
+# LOCALIZATION NOTE: %S will be replaced with the cryptocurrency address.
cryptoSafetyPrompt.cryptoWarning=A cryptocurrency address (%S) has been copied from an insecure website. It could have been modified.
cryptoSafetyPrompt.whatCanHeading=What can you do about it?
cryptoSafetyPrompt.whatCanBody=You can try reconnecting with a new circuit to establish a secure connection, or accept the risk and dismiss this warning.
1
0

[tor-launcher/master] fixup! Bug 27476: about:torconnect fixes and new strings
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 6358161f36153ba241b7146f8dc9cd713d26183d
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 24 16:53:30 2021 +0200
fixup! Bug 27476: about:torconnect fixes and new strings
---
src/chrome/locale/en-US/network-settings.dtd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/src/chrome/locale/en-US/network-settings.dtd b/src/chrome/locale/en-US/network-settings.dtd
index 45dde8f..73d32e0 100644
--- a/src/chrome/locale/en-US/network-settings.dtd
+++ b/src/chrome/locale/en-US/network-settings.dtd
@@ -67,7 +67,7 @@
<!ENTITY torPreferences.torSettingsDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world." >
<!ENTITY torPreferences.learnMore "Learn More">
<!ENTITY torPreferences.quickstart "Quickstart">
-<!ENTITY torPreferences.quickstartDescription "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world. Quickstart allows Tor Browser to connect automatically.">
+<!ENTITY torPreferences.quickstartDescription "Quickstart allows Tor Browser to connect automatically.">
<!ENTITY torPreferences.quickstartCheckbox "Always connect automatically">
<!ENTITY torPreferences.bridges "Bridges">
<!ENTITY torPreferences.bridgesDescription "Bridges help you access the Tor Network in places where Tor is blocked. Depending on where you are, one bridge may work better than another.">
1
0

[tor-launcher/master] Merge remote-tracking branch 'richardgl/40481'
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 7dfd7e94368128bc3a68dd3adfecca8723082d14
Merge: 6eed724 6358161
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 16:46:55 2021 +0000
Merge remote-tracking branch 'richardgl/40481'
src/chrome/locale/en-US/network-settings.dtd | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit d3b4824cd61cb05b3f2e712a4d80fab27b8b9ec2
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 24 18:08:26 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/components/torconnect/content/aboutTorConnect.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/browser/components/torconnect/content/aboutTorConnect.js b/browser/components/torconnect/content/aboutTorConnect.js
index 5fb5b2924b94..02ea82433a37 100644
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@ -100,6 +100,7 @@ class AboutTorConnect {
this.elemProgressDesc.textContent =
this.torStrings.settings.quickstartDescription;
this.showElem(this.elemConnectButton);
+ this.elemConnectButton.focus();
this.showElem(this.elemAdvancedButton);
this.hideElem(this.elemCopyLogLink);
this.hideElem(this.elemCancelButton);
@@ -114,6 +115,7 @@ class AboutTorConnect {
this.hideElem(this.elemAdvancedButton);
this.hideElem(this.elemCopyLogLink);
this.showElem(this.elemCancelButton);
+ this.elemCancelButton.focus();
this.showElem(this.elemProgressContent);
this.showElem(this.elemProgressMeter);
this.elemTitle.classList.remove("error");
@@ -125,6 +127,7 @@ class AboutTorConnect {
this.showElem(this.elemConnectButton);
this.hideElem(this.elemCancelButton);
this.showElem(this.elemAdvancedButton);
+ this.elemAdvancedButton.focus();
this.showElem(this.elemProgressContent);
this.hideElem(this.elemProgressMeter);
this.elemTitle.classList.add("error");
@@ -278,7 +281,6 @@ class AboutTorConnect {
this.elemConnectButton.addEventListener("click", () => {
this.connect();
});
- this.elemConnectButton.focus();
this.elemCancelButton.textContent = this.torStrings.torConnect.cancel;
this.elemCancelButton.addEventListener("click", () => {
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40480_again' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 280556dc26c9b0b221941d067810a1507eca1bbe
Merge: f6578c3e0085 d3b4824cd61c
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 16:43:31 2021 +0000
Merge remote-tracking branch 'richardgl/40480_again' into tor-browser-78.11.0esr-10.5-1
browser/components/torconnect/content/aboutTorConnect.js | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit b0faf995b30bbff00da3499b544d5431ff7016a3
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 24 16:53:00 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
.../components/torconnect/content/aboutTorConnect.js | 2 +-
browser/components/torpreferences/content/torPane.js | 20 ++++++++++++--------
.../components/torpreferences/content/torPane.xhtml | 9 ++++++++-
browser/modules/TorStrings.jsm | 2 +-
4 files changed, 22 insertions(+), 11 deletions(-)
diff --git a/browser/components/torconnect/content/aboutTorConnect.js b/browser/components/torconnect/content/aboutTorConnect.js
index 5fb5b2924b94..657427767629 100644
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@ -98,7 +98,7 @@ class AboutTorConnect {
setInitialUI() {
this.setTitle(this.torStrings.torConnect.torConnect);
this.elemProgressDesc.textContent =
- this.torStrings.settings.quickstartDescription;
+ this.torStrings.settings.torPreferencesDescription;
this.showElem(this.elemConnectButton);
this.showElem(this.elemAdvancedButton);
this.hideElem(this.elemCopyLogLink);
diff --git a/browser/components/torpreferences/content/torPane.js b/browser/components/torpreferences/content/torPane.js
index d63b31c4c6f6..01609ddda090 100644
--- a/browser/components/torpreferences/content/torPane.js
+++ b/browser/components/torpreferences/content/torPane.js
@@ -75,11 +75,12 @@ const gTorPane = (function() {
},
torPreferences: {
header: "h1#torPreferences-header",
+ description: "span#torPreferences-description",
+ learnMore: "label#torPreferences-learnMore",
},
quickstart: {
header: "h2#torPreferences-quickstart-header",
description: "span#torPreferences-quickstart-description",
- learnMore: "label#torPreferences-quickstart-learnMore",
enableQuickstartCheckbox: "checkbox#torPreferences-quickstart-toggle",
},
bridges: {
@@ -220,15 +221,11 @@ const gTorPane = (function() {
// Heading
prefpane.querySelector(selectors.torPreferences.header).innerText =
TorStrings.settings.torPreferencesHeading;
-
- // Quickstart
- prefpane.querySelector(selectors.quickstart.header).innerText =
- TorStrings.settings.quickstartHeading;
- prefpane.querySelector(selectors.quickstart.description).textContent =
- TorStrings.settings.quickstartDescription;
+ prefpane.querySelector(selectors.torPreferences.description).textContent =
+ TorStrings.settings.torPreferencesDescription;
{
let learnMore = prefpane.querySelector(
- selectors.quickstart.learnMore
+ selectors.torPreferences.learnMore
);
learnMore.setAttribute("value", TorStrings.settings.learnMore);
learnMore.setAttribute(
@@ -236,6 +233,13 @@ const gTorPane = (function() {
TorStrings.settings.learnMoreTorBrowserURL
);
}
+
+ // Quickstart
+ prefpane.querySelector(selectors.quickstart.header).innerText =
+ TorStrings.settings.quickstartHeading;
+ prefpane.querySelector(selectors.quickstart.description).textContent =
+ TorStrings.settings.quickstartDescription;
+
this._enableQuickstartCheckbox = prefpane.querySelector(
selectors.quickstart.enableQuickstartCheckbox
);
diff --git a/browser/components/torpreferences/content/torPane.xhtml b/browser/components/torpreferences/content/torPane.xhtml
index 996325e08bf7..7c8071f2cf10 100644
--- a/browser/components/torpreferences/content/torPane.xhtml
+++ b/browser/components/torpreferences/content/torPane.xhtml
@@ -33,6 +33,14 @@
<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>
+
<!-- Quickstart -->
<groupbox id="torPreferences-quickstart-group"
data-category="paneTor"
@@ -40,7 +48,6 @@
<html:h2 id="torPreferences-quickstart-header"/>
<description flex="1">
<html:span id="torPreferences-quickstart-description"/>
- <label id="torPreferences-quickstart-learnMore" class="learnMore text-link" is="text-link"/>
</description>
<checkbox id="torPreferences-quickstart-toggle"/>
</groupbox>
diff --git a/browser/modules/TorStrings.jsm b/browser/modules/TorStrings.jsm
index e7597bbfa74f..c086d0fe3117 100644
--- a/browser/modules/TorStrings.jsm
+++ b/browser/modules/TorStrings.jsm
@@ -258,7 +258,7 @@ var TorStrings = {
),
learnMore: getString("torPreferences.learnMore", "Learn More"),
quickstartHeading: getString("torPreferences.quickstart", "Quickstart"),
- quickstartDescription: getString("torPreferences.quickstartDescription", "Tor Browser routes your traffic over the Tor Network, run by thousands of volunteers around the world. Quickstart allows Tor Browser to connect automatically."),
+ quickstartDescription: getString("torPreferences.quickstartDescription", "Quickstart allows Tor Browser to connect automatically."),
quickstartCheckbox : getString("torPreferences.quickstartCheckbox", "Always connect automatically"),
bridgesHeading: getString("torPreferences.bridges", "Bridges"),
bridgesDescription: getString(
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40481' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 287d6bbc24a94dd321731deb27e553920fc864fa
Merge: 280556dc26c9 b0faf995b30b
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 16:44:00 2021 +0000
Merge remote-tracking branch 'richardgl/40481' into tor-browser-78.11.0esr-10.5-1
.../components/torconnect/content/aboutTorConnect.js | 2 +-
browser/components/torpreferences/content/torPane.js | 20 ++++++++++++--------
.../components/torpreferences/content/torPane.xhtml | 9 ++++++++-
browser/modules/TorStrings.jsm | 2 +-
4 files changed, 22 insertions(+), 11 deletions(-)
diff --cc browser/components/torconnect/content/aboutTorConnect.js
index 02ea82433a37,657427767629..1c574a5d07c9
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@@ -98,9 -98,8 +98,9 @@@ class AboutTorConnect
setInitialUI() {
this.setTitle(this.torStrings.torConnect.torConnect);
this.elemProgressDesc.textContent =
- this.torStrings.settings.quickstartDescription;
+ this.torStrings.settings.torPreferencesDescription;
this.showElem(this.elemConnectButton);
+ this.elemConnectButton.focus();
this.showElem(this.elemAdvancedButton);
this.hideElem(this.elemCopyLogLink);
this.hideElem(this.elemCancelButton);
1
0

[tor-browser-build/master] Bug 40302: Update version of snowflake
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 4faacf83a969c590db643bfcd67d6b4859770d57
Author: Cecylia Bocovich <cohosh(a)torproject.org>
Date: Tue Jun 1 15:03:50 2021 -0400
Bug 40302: Update version of snowflake
---
projects/snowflake/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/projects/snowflake/config b/projects/snowflake/config
index 95ef549..6022b2c 100644
--- a/projects/snowflake/config
+++ b/projects/snowflake/config
@@ -1,7 +1,7 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
git_url: https://git.torproject.org/pluggable-transports/snowflake.git
-git_hash: 1b29ad7de14fb0a6d2bf88aea38353733682cd26
+git_hash: ae7cc478fd345a1e588f8315ec980809c6806372
filename: '[% project %]-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %].tar.gz'
var:
1
0

[tor-browser-build/master] Merge remote-tracking branch 'cohoshgl/issue/40302'
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 318a0923b373728fcdf3b2db84b0b61e1ccd8176
Merge: 2d69c71 4faacf8
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 16:07:51 2021 +0000
Merge remote-tracking branch 'cohoshgl/issue/40302'
projects/snowflake/config | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit ccef7b35e20bd47dec7717bac2524b86878b2bd3
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 24 15:22:36 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
.../torconnect/content/aboutTorConnect.css | 24 ++++++++++++++++++++++
.../torconnect/content/aboutTorConnect.js | 1 +
browser/themes/shared/onionPattern.inc.xhtml | 7 +++++--
3 files changed, 30 insertions(+), 2 deletions(-)
diff --git a/browser/components/torconnect/content/aboutTorConnect.css b/browser/components/torconnect/content/aboutTorConnect.css
index eff767205266..a70904ca0b28 100644
--- a/browser/components/torconnect/content/aboutTorConnect.css
+++ b/browser/components/torconnect/content/aboutTorConnect.css
@@ -10,6 +10,30 @@
--onion-radius: 50px;
}
+/* override firefox's default blue focus coloring */
+:focus {
+ outline: none!important;
+ box-shadow: 0 0 0 3px #CD8CED !important;
+ border: 1px #59316B solid !important;
+}
+
+@media (prefers-color-scheme: dark)
+{
+ :focus {
+ box-shadow: 0 0 0 3px #8C689E !important;
+ }
+}
+
+/* override firefox's default blue border on hover */
+input[type="checkbox"]:not(:disabled):hover {
+ border-color: #59316B;
+}
+
+/* fix checkbox visibility when dark mode enabled */
+input[type="checkbox"]:checked {
+ fill: var(--in-content-page-color);
+}
+
#connectButton {
background-color: #7D4698;
}
diff --git a/browser/components/torconnect/content/aboutTorConnect.js b/browser/components/torconnect/content/aboutTorConnect.js
index a88a887c7878..5fb5b2924b94 100644
--- a/browser/components/torconnect/content/aboutTorConnect.js
+++ b/browser/components/torconnect/content/aboutTorConnect.js
@@ -278,6 +278,7 @@ class AboutTorConnect {
this.elemConnectButton.addEventListener("click", () => {
this.connect();
});
+ this.elemConnectButton.focus();
this.elemCancelButton.textContent = this.torStrings.torConnect.cancel;
this.elemCancelButton.addEventListener("click", () => {
diff --git a/browser/themes/shared/onionPattern.inc.xhtml b/browser/themes/shared/onionPattern.inc.xhtml
index 95f073e673b4..6bbde93684a2 100644
--- a/browser/themes/shared/onionPattern.inc.xhtml
+++ b/browser/themes/shared/onionPattern.inc.xhtml
@@ -12,8 +12,11 @@
-->
<div class="onion-pattern-container">
- <div class="onion-pattern-crop">
- <div class="onion-pattern-column">
+ <!-- for some reason, these two elements are focusable, seems related to
+ - flex css somehow; disable their tabindex to fix
+ -->
+ <div class="onion-pattern-crop" tabindex="-1">
+ <div class="onion-pattern-column" tabindex="-1">
<div class="onion-pattern-row">
<div class="circle solid"></div>
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40480' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit f6578c3e0085fbb401e7fa3d3e5e323b80962c01
Merge: 9cb771f3026c ccef7b35e20b
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 14:06:01 2021 +0000
Merge remote-tracking branch 'richardgl/40480' into tor-browser-78.11.0esr-10.5-1
.../torconnect/content/aboutTorConnect.css | 24 ++++++++++++++++++++++
.../torconnect/content/aboutTorConnect.js | 1 +
browser/themes/shared/onionPattern.inc.xhtml | 7 +++++--
3 files changed, 30 insertions(+), 2 deletions(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] squash! Bug 28005: Implement .onion alias urlbar rewrites
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit 9cb771f3026c5303e2700e392826a9e028e9b2d5
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 21 20:17:21 2021 +0000
squash! Bug 28005: Implement .onion alias urlbar rewrites
Bug 40456: Update the SecureDrop HTTPS-Everywhere update channel
Bug 40478: Onion alias url rewrite is broken
---
.../onionservices/HttpsEverywhereControl.jsm | 32 ++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
diff --git a/browser/components/onionservices/HttpsEverywhereControl.jsm b/browser/components/onionservices/HttpsEverywhereControl.jsm
index c91db3e8de87..d673de4cd6e5 100644
--- a/browser/components/onionservices/HttpsEverywhereControl.jsm
+++ b/browser/components/onionservices/HttpsEverywhereControl.jsm
@@ -10,7 +10,7 @@ const { ExtensionMessaging } = ChromeUtils.import(
const { setTimeout } = ChromeUtils.import("resource://gre/modules/Timer.jsm");
const EXTENSION_ID = "https-everywhere-eff(a)eff.org";
-const SECUREDROP_TOR_ONION_CHANNEL = {
+const SECUREDROP_TOR_ONION_CHANNEL_2020 = {
name: "SecureDropTorOnion",
jwk: {
kty: "RSA",
@@ -24,6 +24,20 @@ const SECUREDROP_TOR_ONION_CHANNEL = {
replaces_default_rulesets: false,
};
+const SECUREDROP_TOR_ONION_CHANNEL = {
+ name: "SecureDropTorOnion2021",
+ jwk: {
+ kty: "RSA",
+ e: "AQAB",
+ n:
+ "vsC7BNafkRe8Uh1DUgCkv6RbPQMdJgAKKnWdSqQd7tQzU1mXfmo_k1Py_2MYMZXOWmqSZ9iwIYkykZYywJ2VyMGve4byj1sLn6YQoOkG8g5Z3V4y0S2RpEfmYumNjTzfq8nxtLnwjaYd4sCUd5wa0SzeLrpRQuXo2bF3QuUF2xcbLJloxX1MmlsMMCdBc-qGNonLJ7bpn_JuyXlDWy1Fkeyw1qgjiOdiRIbMC1x302zgzX6dSrBrNB8Cpsh-vCE0ZjUo8M9caEv06F6QbYmdGJHM0ZZY34OHMSNdf-_qUKIV_SuxuSuFE99tkAeWnbWpyI1V-xhVo1sc7NzChP8ci2TdPvI3_0JyAuCvL6zIFqJUJkZibEUghhg6F09-oNJKpy7rhUJq7zZyLXJsvuXnn0gnIxfjRvMcDfZAKUVMZKRdw7fwWzwQril4Ib0MQOVda9vb_4JMk7Gup-TUI4sfuS4NKwsnKoODIO-2U5QpJWdtp1F4AQ1pBv8ajFl1WTrVGvkRGK0woPWaO6pWyJ4kRnhnxrV2FyNNt3JSR-0JEjhFWws47kjBvpr0VRiVRFppKA-plKs4LPlaaCff39TleYmY3mETe3w1GIGc2Lliad32Jpbx496IgDe1K3FMBEoKFZfhmtlRSXft8NKgSzPt2zkatM9bFKfaCYRaSy7akbk",
+ },
+ update_path_prefix: "https://securedrop.org/https-everywhere-2021/",
+ scope:
+ "^https?:\\/\\/[a-z0-9-]+(?:\\.[a-z0-9-]+)*\\.securedrop\\.tor\\.onion\\/",
+ replaces_default_rulesets: false,
+};
+
class HttpsEverywhereControl {
constructor() {
this._extensionMessaging = null;
@@ -56,6 +70,20 @@ class HttpsEverywhereControl {
// for that here.
await HttpsEverywhereControl.wait();
+ try {
+ // Delete the previous channel signing key, and add the new one below.
+ await this._sendMessage(
+ "delete_update_channel",
+ SECUREDROP_TOR_ONION_CHANNEL_2020.name
+ );
+ } catch (e) {
+ if (retries <= 0) {
+ throw new Error("Could not uninstall SecureDropTorOnion update channel");
+ }
+ await this.installTorOnionUpdateChannel(retries - 1);
+ return;
+ }
+
try {
// TODO: we may want a way to "lock" this update channel, so that it cannot be modified
// by the user via UI, but I think this is not possible at the time of writing via
@@ -89,7 +117,7 @@ class HttpsEverywhereControl {
* Returns the timestamp of the last .tor.onion update channel update.
*/
async getRulesetTimestamp() {
- const rulesets = await this._sendMessage("get_ruleset_timestamps");
+ const rulesets = await this._sendMessage("get_update_channel_timestamps");
const securedrop =
rulesets &&
rulesets.find(([{ name }]) => name === SECUREDROP_TOR_ONION_CHANNEL.name);
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit b61c939ceef2ed8e5cfa788f495a978883c02404
Author: Richard Pospesel <richard(a)torproject.org>
Date: Tue Jun 22 19:16:28 2021 +0200
fixup! Bug 27476: Implement about:torconnect captive portal within Tor Browser
---
browser/components/BrowserGlue.jsm | 19 ++++++++++++++++++-
.../onionservices/HttpsEverywhereControl.jsm | 17 ++++++++++++++++-
2 files changed, 34 insertions(+), 2 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 2bd28ec1b04c..adc8e5edb07a 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -2506,7 +2506,24 @@ BrowserGlue.prototype = {
{
task: () => {
- OnionAliasStore.init();
+ if (Services.io.offline === false) {
+ // we will take this path when the user is using the legacy tor launcher
+ OnionAliasStore.init();
+ } else {
+ // this path is taken when using about:torconnect, we start in offline mode
+ // and only switch to online after bootstrapping completes
+ const topic = "network:offline-status-changed";
+ let offlineStatusChangedObserver = {
+ observe(aSubject, aTopic, aData) {
+ if (aTopic === topic && aData === "online") {
+ OnionAliasStore.init();
+ // we only need to init once, so remove ourselves as an obvserver
+ Services.obs.removeObserver(this, topic);
+ }
+ }
+ };
+ Services.obs.addObserver(offlineStatusChangedObserver, topic);
+ }
},
},
diff --git a/browser/components/onionservices/HttpsEverywhereControl.jsm b/browser/components/onionservices/HttpsEverywhereControl.jsm
index 60c3b5fca282..c91db3e8de87 100644
--- a/browser/components/onionservices/HttpsEverywhereControl.jsm
+++ b/browser/components/onionservices/HttpsEverywhereControl.jsm
@@ -27,6 +27,7 @@ const SECUREDROP_TOR_ONION_CHANNEL = {
class HttpsEverywhereControl {
constructor() {
this._extensionMessaging = null;
+ this._init();
}
async _sendMessage(type, object) {
@@ -47,7 +48,6 @@ class HttpsEverywhereControl {
* Installs the .tor.onion update channel in https-everywhere
*/
async installTorOnionUpdateChannel(retries = 5) {
- this._init();
// TODO: https-everywhere store is initialized asynchronously, so sending a message
// immediately results in a `store.get is undefined` error.
@@ -115,5 +115,20 @@ class HttpsEverywhereControl {
if (!this._extensionMessaging) {
this._extensionMessaging = new ExtensionMessaging();
}
+
+ // update all of the existing https-everywhere channels
+ setTimeout(async () => {
+ let pinnedChannels = await this._sendMessage("get_pinned_update_channels");
+ for(let channel of pinnedChannels.update_channels) {
+ this._sendMessage("update_update_channel", channel);
+ }
+
+ let storedChannels = await this._sendMessage("get_stored_update_channels");
+ for(let channel of storedChannels.update_channels) {
+ this._sendMessage("update_update_channel", channel);
+ }
+ }, 0);
+
+
}
}
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40455' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 24 Jun '21
by sysrqb@torproject.org 24 Jun '21
24 Jun '21
commit d03456f9cd90665c20f146437962d6e8138cc754
Merge: 8157aa761f34 b61c939ceef2
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 24 00:41:34 2021 +0000
Merge remote-tracking branch 'richardgl/40455' into tor-browser-78.11.0esr-10.5-1
browser/components/BrowserGlue.jsm | 19 ++++++++++++++++++-
.../onionservices/HttpsEverywhereControl.jsm | 17 ++++++++++++++++-
2 files changed, 34 insertions(+), 2 deletions(-)
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] fixup! Bug 40475: Include clearing CORS preflight cache
by sysrqb@torproject.org 22 Jun '21
by sysrqb@torproject.org 22 Jun '21
22 Jun '21
commit 0f2ac709c04851627d75a7eb9ba32a4ecf7debf7
Author: Richard Pospesel <richard(a)torproject.org>
Date: Tue Jun 22 15:37:00 2021 +0200
fixup! Bug 40475: Include clearing CORS preflight cache
---
netwerk/protocol/http/nsCORSListenerProxy.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/netwerk/protocol/http/nsCORSListenerProxy.cpp b/netwerk/protocol/http/nsCORSListenerProxy.cpp
index d9b658af881b..6d2e160c2a9b 100644
--- a/netwerk/protocol/http/nsCORSListenerProxy.cpp
+++ b/netwerk/protocol/http/nsCORSListenerProxy.cpp
@@ -348,7 +348,9 @@ void nsCORSListenerProxy::Shutdown() {
/* static */
void nsCORSListenerProxy::Clear() {
- sPreflightCache->Clear();
+ if (sPreflightCache) {
+ sPreflightCache->Clear();
+ }
}
nsCORSListenerProxy::nsCORSListenerProxy(nsIStreamListener* aOuter,
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Merge remote-tracking branch 'richardgl/40476' into tor-browser-78.11.0esr-10.5-1
by sysrqb@torproject.org 22 Jun '21
by sysrqb@torproject.org 22 Jun '21
22 Jun '21
commit 8157aa761f342864c3c8b6109b24758ae7ead1ea
Merge: 9c9884c27d5a 0f2ac709c048
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Tue Jun 22 14:58:49 2021 +0000
Merge remote-tracking branch 'richardgl/40476' into tor-browser-78.11.0esr-10.5-1
netwerk/protocol/http/nsCORSListenerProxy.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
1
0

[tor-browser-build/master] Merge remote-tracking branch 'boklmgl/bug_40311'
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit b3629abd0fcd0a1b96c13e180031d3fe3f772260
Merge: 80e97dc dac2b35
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 21 21:53:26 2021 +0000
Merge remote-tracking branch 'boklmgl/bug_40311'
projects/android-components/config | 4 ++--
projects/application-services/config | 2 +-
projects/application-services/list_toolchain_updates_checks | 4 ++--
projects/fenix/config | 4 ++--
projects/geckoview/config | 6 +++---
5 files changed, 10 insertions(+), 10 deletions(-)
1
0

[tor-browser-build/master] Merge remote-tracking branch 'boklmgl/bug_40313'
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit 2d69c715c1fdaa4099cf0d4bc37ba36c58d68f83
Merge: b3629ab 8ec1d47
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 21 21:57:18 2021 +0000
Merge remote-tracking branch 'boklmgl/bug_40313'
rbm.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
1
0

[tor-browser-build/master] Bug 40313: Use apt-get to install openjdk-8 .deb files with their dependencies
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit 8ec1d476c8a3b3e8a67a33964bb4e67f494efbf2
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Fri Jun 18 15:14:52 2021 +0200
Bug 40313: Use apt-get to install openjdk-8 .deb files with their dependencies
---
rbm.conf | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rbm.conf b/rbm.conf
index 6d2a774..9a9339f 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -351,7 +351,7 @@ targets:
wget $OPENJDK_URL/openjdk-8-jre-headless_$JDK_VERSION.deb
echo 92b4f8fb77d793a86e0b03b3b0750592b40a26a5d75956d10dd984a7b3aad4c9 openjdk-8-jdk-headless_$JDK_VERSION.deb | sha256sum -c
echo 84bf52b6cce20ead08b0d5b9fd9b81b4aa3da385ca951b313fe11d5cb1aa4d17 openjdk-8-jre-headless_$JDK_VERSION.deb | sha256sum -c
- dpkg -i ./openjdk-8-jre-headless_$JDK_VERSION.deb ./openjdk-8-jdk-headless_$JDK_VERSION.deb
+ apt-get install -y -q ./openjdk-8-jre-headless_$JDK_VERSION.deb ./openjdk-8-jdk-headless_$JDK_VERSION.deb
torbrowser-linux-x86_64:
- linux-x86_64
- linux
1
0

[tor-browser-build/master] Bug 40311: Make the list of components updates for switch to mozilla90-based Fenix (beta 4)
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit dac2b35d64153c183165d0955b0e42f502798794
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Fri Jun 18 12:14:26 2021 +0200
Bug 40311: Make the list of components updates for switch to mozilla90-based Fenix (beta 4)
---
projects/android-components/config | 4 ++--
projects/application-services/config | 2 +-
projects/application-services/list_toolchain_updates_checks | 4 ++--
projects/fenix/config | 4 ++--
projects/geckoview/config | 6 +++---
5 files changed, 10 insertions(+), 10 deletions(-)
diff --git a/projects/android-components/config b/projects/android-components/config
index 0d8d88c..bf3b8a4 100644
--- a/projects/android-components/config
+++ b/projects/android-components/config
@@ -58,8 +58,8 @@ input_files:
steps:
list_toolchain_updates:
- #git_url: https://github.com/mozilla-mobile/android-components.git
- #git_hash: v75.0.22
+ git_url: https://github.com/mozilla-mobile/android-components.git
+ git_hash: v90.0.7
#tag_gpg_id: 0
var:
container:
diff --git a/projects/application-services/config b/projects/application-services/config
index efbe321..93f8f5c 100644
--- a/projects/application-services/config
+++ b/projects/application-services/config
@@ -94,7 +94,7 @@ input_files:
steps:
list_toolchain_updates:
- #git_hash: 'v74.0.1'
+ git_hash: 'v77.0.2'
input_files: []
var:
container:
diff --git a/projects/application-services/list_toolchain_updates_checks b/projects/application-services/list_toolchain_updates_checks
index 69c232c..b028d10 100644
--- a/projects/application-services/list_toolchain_updates_checks
+++ b/projects/application-services/list_toolchain_updates_checks
@@ -74,7 +74,7 @@ check_update_needed sqlcipher "$needed" "$current"
# android-gradle-plugin
read -d '' p << 'EOF' || true
-if (m/^\\s*ext\\.android_gradle_plugin_version\\s=\\s'([^']*)'/) {
+if (m/^\\s*android_gradle_plugin_version\\s=\\s'([^']*)'/) {
print $1;
exit;
}
@@ -86,7 +86,7 @@ check_update_needed android-gradle-plugin "$needed" "$current"
# android-components
read -d '' p << 'EOF' || true
-if (m/^\\s*ext\\.android_components_version\\s=\\s'([^']*)'/) {
+if (m/^\\s*android_components_version\\s=\\s'([^']*)'/) {
print $1;
exit;
}
diff --git a/projects/fenix/config b/projects/fenix/config
index a25aaa0..296ab7c 100644
--- a/projects/fenix/config
+++ b/projects/fenix/config
@@ -56,8 +56,8 @@ input_files:
steps:
list_toolchain_updates:
- #git_url: https://github.com/mozilla-mobile/fenix.git
- #git_hash: v89.1.1
+ git_url: https://github.com/mozilla-mobile/fenix.git
+ git_hash: v90.0.0-beta.4
tag_gpg_id: 0
input_files: []
var:
diff --git a/projects/geckoview/config b/projects/geckoview/config
index 0695277..c46901e 100644
--- a/projects/geckoview/config
+++ b/projects/geckoview/config
@@ -138,9 +138,9 @@ steps:
- torbrowser-android-x86_64
list_toolchain_updates:
- #git_url: https://github.com/mozilla/gecko-dev.git
- # 89.0b10
- #git_hash: 702dfbec3d62823d0dfca870995540383ab39183
+ git_url: https://github.com/mozilla/gecko-dev.git
+ # 90.0b9
+ git_hash: 92485800ccb404788bfd215e59c3850b314d3905
tag_gpg_id: 0
input_files: []
var:
1
0

[torbutton/master] Bug 40039: added min-height rule to Tor Circuit heading so onion icon is not cropped
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit 0e79e26f682c87fbe26a42c021d9a4f72e2ae8aa
Author: Richard Pospesel <richard(a)torproject.org>
Date: Thu Jun 17 15:47:07 2021 +0200
Bug 40039: added min-height rule to Tor Circuit heading so onion icon is not cropped
---
chrome/skin/tor-circuit-display.css | 1 +
1 file changed, 1 insertion(+)
diff --git a/chrome/skin/tor-circuit-display.css b/chrome/skin/tor-circuit-display.css
index 35c786ec..6f132db8 100644
--- a/chrome/skin/tor-circuit-display.css
+++ b/chrome/skin/tor-circuit-display.css
@@ -15,6 +15,7 @@ and lines drawn between them to represent Tor network inter-relay connections.
background-repeat: no-repeat;
background-position: 0 50%;
background-size: 16px auto;
+ min-height: 16px;
-moz-context-properties: fill, fill-opacity;
fill: currentColor;
/* icon indent + 16px icon width + 6px description margin
1
0

[torbutton/master] Merge remote-tracking branch 'richardgl/40039_rev'
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit d841a699f7048607230f7b15036f9a8c6a055527
Merge: cc73f75d 0e79e26f
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Jun 17 15:54:36 2021 +0000
Merge remote-tracking branch 'richardgl/40039_rev'
chrome/skin/tor-circuit-display.css | 1 +
1 file changed, 1 insertion(+)
1
0

21 Jun '21
commit 80e97dcd720810b66b2ce21d61c111e96541ffbc
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 21 21:40:39 2021 +0000
Update/refresh torbrowser keyring
---
keyring/torbrowser.gpg | Bin 12262 -> 14048 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/keyring/torbrowser.gpg b/keyring/torbrowser.gpg
index b23cae3..31c3596 100644
Binary files a/keyring/torbrowser.gpg and b/keyring/torbrowser.gpg differ
1
0

21 Jun '21
commit f10b12c344a646b76238fd228f6799f249245b2b
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Mon Jun 21 21:38:48 2021 +0000
Update/refresh torbutton keyring
---
keyring/torbutton.gpg | Bin 140731 -> 144154 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
diff --git a/keyring/torbutton.gpg b/keyring/torbutton.gpg
index a925b14..32e6d4c 100644
Binary files a/keyring/torbutton.gpg and b/keyring/torbutton.gpg differ
1
0

[tor-browser/tor-browser-78.11.0esr-10.5-1] Bug 40475: Include clearing CORS preflight cache
by sysrqb@torproject.org 21 Jun '21
by sysrqb@torproject.org 21 Jun '21
21 Jun '21
commit 9c9884c27d5a1ee93dde9d78eda6df5707e816f8
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Sun Jun 6 20:32:23 2021 +0000
Bug 40475: Include clearing CORS preflight cache
---
netwerk/protocol/http/nsCORSListenerProxy.cpp | 5 +++++
netwerk/protocol/http/nsCORSListenerProxy.h | 1 +
netwerk/protocol/http/nsHttpHandler.cpp | 2 ++
3 files changed, 8 insertions(+)
diff --git a/netwerk/protocol/http/nsCORSListenerProxy.cpp b/netwerk/protocol/http/nsCORSListenerProxy.cpp
index 76870e6cea3f..d9b658af881b 100644
--- a/netwerk/protocol/http/nsCORSListenerProxy.cpp
+++ b/netwerk/protocol/http/nsCORSListenerProxy.cpp
@@ -346,6 +346,11 @@ void nsCORSListenerProxy::Shutdown() {
sPreflightCache = nullptr;
}
+/* static */
+void nsCORSListenerProxy::Clear() {
+ sPreflightCache->Clear();
+}
+
nsCORSListenerProxy::nsCORSListenerProxy(nsIStreamListener* aOuter,
nsIPrincipal* aRequestingPrincipal,
bool aWithCredentials)
diff --git a/netwerk/protocol/http/nsCORSListenerProxy.h b/netwerk/protocol/http/nsCORSListenerProxy.h
index 8c0df2e0ff28..3f76be33f209 100644
--- a/netwerk/protocol/http/nsCORSListenerProxy.h
+++ b/netwerk/protocol/http/nsCORSListenerProxy.h
@@ -54,6 +54,7 @@ class nsCORSListenerProxy final : public nsIStreamListener,
NS_DECL_NSITHREADRETARGETABLESTREAMLISTENER
static void Shutdown();
+ static void Clear();
[[nodiscard]] nsresult Init(nsIChannel* aChannel,
DataURIHandling aAllowDataURI);
diff --git a/netwerk/protocol/http/nsHttpHandler.cpp b/netwerk/protocol/http/nsHttpHandler.cpp
index d5e2c61dbec9..c6cb95ca7fcc 100644
--- a/netwerk/protocol/http/nsHttpHandler.cpp
+++ b/netwerk/protocol/http/nsHttpHandler.cpp
@@ -10,6 +10,7 @@
#include "prsystem.h"
#include "AltServiceChild.h"
+#include "nsCORSListenerProxy.h"
#include "nsError.h"
#include "nsHttp.h"
#include "nsHttpHandler.h"
@@ -2290,6 +2291,7 @@ nsHttpHandler::Observe(nsISupports* subject, const char* topic,
mAltSvcCache->ClearAltServiceMappings();
}
}
+ nsCORSListenerProxy::Clear();
} else if (!strcmp(topic, NS_NETWORK_LINK_TOPIC)) {
nsAutoCString converted = NS_ConvertUTF16toUTF8(data);
if (!strcmp(converted.get(), NS_NETWORK_LINK_DATA_CHANGED)) {
1
0