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
- 18606 discussions

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 13379: Sign our MAR files.
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 4bb4284aff72cb5c5a42d2f78ef78666b6cd9269
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Dec 17 16:37:11 2014 -0500
Bug 13379: Sign our MAR files.
Configure with --enable-verify-mar (when updating, require a valid
signature on the MAR file before it is applied).
Use the Tor Browser version instead of the Firefox version inside the
MAR file info block (necessary to prevent downgrade attacks).
Use NSS on all platforms for checking MAR signatures (instead of using
OS-native APIs, which Mozilla does on Mac OS and Windows). So that the
NSS and NSPR libraries the updater depends on can be found at runtime,
we add the firefox directory to the shared library search path on macOS.
On Linux, rpath is used by Mozilla to solve that problem, but that
approach won't work on macOS because the updater executable is copied
during the update process to a location that is under TorBrowser-Data,
and the location of TorBrowser-Data varies.
Also includes the fix for bug 18900.
---
.mozconfig | 1 +
.mozconfig-asan | 1 +
.mozconfig-mac | 1 +
.mozconfig-mingw | 1 +
modules/libmar/tool/mar.c | 6 +--
modules/libmar/tool/moz.build | 12 ++++--
modules/libmar/verify/moz.build | 14 +++---
.../mozapps/update/updater/updater-common.build | 26 +++++++++--
toolkit/mozapps/update/updater/updater.cpp | 25 +++++++----
toolkit/xre/moz.build | 3 ++
toolkit/xre/nsUpdateDriver.cpp | 50 ++++++++++++++++++++++
11 files changed, 115 insertions(+), 25 deletions(-)
diff --git a/.mozconfig b/.mozconfig
index 18cd1f9b6487..c50c57d410de 100755
--- a/.mozconfig
+++ b/.mozconfig
@@ -37,3 +37,4 @@ 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
+ac_add_options --enable-verify-mar
diff --git a/.mozconfig-asan b/.mozconfig-asan
index bad7ea022c9f..e42ff6c86bc5 100644
--- a/.mozconfig-asan
+++ b/.mozconfig-asan
@@ -29,6 +29,7 @@ ac_add_options --enable-official-branding
ac_add_options --enable-default-toolkit=cairo-gtk3
ac_add_options --enable-tor-browser-update
+ac_add_options --enable-verify-mar
ac_add_options --disable-strip
ac_add_options --disable-install-strip
diff --git a/.mozconfig-mac b/.mozconfig-mac
index 26e2b6b92fdb..5b4624ef1f67 100644
--- a/.mozconfig-mac
+++ b/.mozconfig-mac
@@ -43,6 +43,7 @@ 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 --enable-verify-mar
ac_add_options --disable-crashreporter
ac_add_options --disable-webrtc
diff --git a/.mozconfig-mingw b/.mozconfig-mingw
index 3ec6ff18a3e9..ce6ace1dad67 100644
--- a/.mozconfig-mingw
+++ b/.mozconfig-mingw
@@ -15,6 +15,7 @@ ac_add_options --enable-strip
ac_add_options --enable-official-branding
ac_add_options --enable-tor-browser-update
+ac_add_options --enable-verify-mar
ac_add_options --disable-bits-download
# Let's make sure no preference is enabling either Adobe's or Google's CDM.
diff --git a/modules/libmar/tool/mar.c b/modules/libmar/tool/mar.c
index 0bf2cb4bd1d4..ea2b79924914 100644
--- a/modules/libmar/tool/mar.c
+++ b/modules/libmar/tool/mar.c
@@ -65,7 +65,7 @@ static void print_usage() {
"signed_input_archive.mar base_64_encoded_signature_file "
"changed_signed_output.mar\n");
printf("(i) is the index of the certificate to extract\n");
-# if defined(XP_MACOSX) || (defined(XP_WIN) && !defined(MAR_NSS))
+# if (defined(XP_MACOSX) || defined(XP_WIN)) && !defined(MAR_NSS)
printf("Verify a MAR file:\n");
printf(" mar [-C workingDir] -D DERFilePath -v signed_archive.mar\n");
printf(
@@ -149,7 +149,7 @@ int main(int argc, char** argv) {
memset((void*)certBuffers, 0, sizeof(certBuffers));
#endif
#if !defined(NO_SIGN_VERIFY) && \
- ((!defined(MAR_NSS) && defined(XP_WIN)) || defined(XP_MACOSX))
+ (!defined(MAR_NSS) && (defined(XP_WIN) || defined(XP_MACOSX)))
memset(DERFilePaths, 0, sizeof(DERFilePaths));
memset(fileSizes, 0, sizeof(fileSizes));
#endif
@@ -181,7 +181,7 @@ int main(int argc, char** argv) {
argc -= 2;
}
#if !defined(NO_SIGN_VERIFY)
-# if (!defined(MAR_NSS) && defined(XP_WIN)) || defined(XP_MACOSX)
+# if (!defined(MAR_NSS) && (defined(XP_WIN) || defined(XP_MACOSX)))
/* -D DERFilePath, also matches -D[index] DERFilePath
We allow an index for verifying to be symmetric
with the import and export command line arguments. */
diff --git a/modules/libmar/tool/moz.build b/modules/libmar/tool/moz.build
index a6d26c66a668..d6fa1677ddf1 100644
--- a/modules/libmar/tool/moz.build
+++ b/modules/libmar/tool/moz.build
@@ -43,15 +43,21 @@ if CONFIG["MOZ_BUILD_APP"] != "tools/update-packaging":
"verifymar",
]
+ if CONFIG["TOR_BROWSER_UPDATE"]:
+ DEFINES["MAR_NSS"] = True
+
if CONFIG["OS_ARCH"] == "WINNT":
USE_STATIC_LIBS = True
OS_LIBS += [
"ws2_32",
- "crypt32",
- "advapi32",
]
- elif CONFIG["OS_ARCH"] == "Darwin":
+ if not CONFIG["TOR_BROWSER_UPDATE"]:
+ OS_LIBS += [
+ "crypt32",
+ "advapi32",
+ ]
+ elif CONFIG["OS_ARCH"] == "Darwin" and not CONFIG["TOR_BROWSER_UPDATE"]:
OS_LIBS += [
"-framework Security",
]
diff --git a/modules/libmar/verify/moz.build b/modules/libmar/verify/moz.build
index b07475655f0d..03718eee50b4 100644
--- a/modules/libmar/verify/moz.build
+++ b/modules/libmar/verify/moz.build
@@ -16,15 +16,12 @@ FORCE_STATIC_LIB = True
if CONFIG["OS_ARCH"] == "WINNT":
USE_STATIC_LIBS = True
elif CONFIG["OS_ARCH"] == "Darwin":
- UNIFIED_SOURCES += [
- "MacVerifyCrypto.cpp",
- ]
- OS_LIBS += [
- "-framework Security",
+ USE_LIBS += [
+ "nspr",
+ "nss",
+ "signmar",
]
else:
- DEFINES["MAR_NSS"] = True
- LOCAL_INCLUDES += ["../sign"]
USE_LIBS += [
"nspr",
"nss",
@@ -38,6 +35,9 @@ else:
"-Wl,-rpath=\\$$ORIGIN",
]
+DEFINES["MAR_NSS"] = True
+LOCAL_INCLUDES += ["../sign"]
+
LOCAL_INCLUDES += [
"../src",
]
diff --git a/toolkit/mozapps/update/updater/updater-common.build b/toolkit/mozapps/update/updater/updater-common.build
index 28cf32982a4f..d1bd88b58a0f 100644
--- a/toolkit/mozapps/update/updater/updater-common.build
+++ b/toolkit/mozapps/update/updater/updater-common.build
@@ -4,6 +4,12 @@
# 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/.
+DEFINES["MAR_NSS"] = True
+
+link_with_nss = DEFINES["MAR_NSS"] or (
+ CONFIG["OS_ARCH"] == "Linux" and CONFIG["MOZ_VERIFY_MAR_SIGNATURE"]
+)
+
srcs = [
"archivereader.cpp",
"updater.cpp",
@@ -36,10 +42,14 @@ if CONFIG["OS_ARCH"] == "WINNT":
"ws2_32",
"shell32",
"shlwapi",
- "crypt32",
- "advapi32",
]
+ if not link_with_nss:
+ OS_LIBS += [
+ "crypt32",
+ "advapi32",
+ ]
+
USE_LIBS += [
"bspatch",
"mar",
@@ -47,6 +57,13 @@ USE_LIBS += [
"xz-embedded",
]
+if link_with_nss:
+ USE_LIBS += [
+ "nspr",
+ "nss",
+ "signmar",
+ ]
+
if CONFIG["MOZ_WIDGET_TOOLKIT"] == "gtk":
have_progressui = 1
srcs += [
@@ -61,9 +78,12 @@ if CONFIG["MOZ_WIDGET_TOOLKIT"] == "cocoa":
]
OS_LIBS += [
"-framework Cocoa",
- "-framework Security",
"-framework SystemConfiguration",
]
+ if not link_with_nss:
+ OS_LIBS += [
+ "-framework Security",
+ ]
UNIFIED_SOURCES += [
"/toolkit/xre/updaterfileutils_osx.mm",
]
diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp
index 8b53090f8508..c3939b338855 100644
--- a/toolkit/mozapps/update/updater/updater.cpp
+++ b/toolkit/mozapps/update/updater/updater.cpp
@@ -110,9 +110,11 @@ struct UpdateServerThreadArgs {
# define stat64 stat
#endif
-#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) && !defined(XP_MACOSX)
-# include "nss.h"
-# include "prerror.h"
+#if defined(MOZ_VERIFY_MAR_SIGNATURE)
+# if defined(MAR_NSS) || (!defined(XP_WIN) && !defined(XP_MACOSX))
+# include "nss.h"
+# include "prerror.h"
+# endif
#endif
#include "crctable.h"
@@ -2722,8 +2724,13 @@ static void UpdateThreadFunc(void* param) {
if (ReadMARChannelIDs(updateSettingsPath, &MARStrings) != OK) {
rv = UPDATE_SETTINGS_FILE_CHANNEL;
} else {
+# ifdef TOR_BROWSER_UPDATE
+ const char* appVersion = TOR_BROWSER_VERSION_QUOTED;
+# else
+ const char* appVersion = MOZ_APP_VERSION;
+# endif
rv = gArchiveReader.VerifyProductInformation(
- MARStrings.MARChannelID.get(), MOZ_APP_VERSION);
+ MARStrings.MARChannelID.get(), appVersion);
}
}
}
@@ -2924,11 +2931,10 @@ int NS_main(int argc, NS_tchar** argv) {
}
#endif
-#if defined(MOZ_VERIFY_MAR_SIGNATURE) && !defined(XP_WIN) && !defined(XP_MACOSX)
- // On Windows and Mac we rely on native APIs to do verifications so we don't
- // need to initialize NSS at all there.
- // Otherwise, minimize the amount of NSS we depend on by avoiding all the NSS
- // databases.
+#if defined(MOZ_VERIFY_MAR_SIGNATURE)
+# if defined(MAR_NSS) || (!defined(XP_WIN) && !defined(XP_MACOSX))
+ // If using NSS for signature verification, initialize NSS but minimize
+ // the portion we depend on by avoiding all of the NSS databases.
if (NSS_NoDB_Init(nullptr) != SECSuccess) {
PRErrorCode error = PR_GetError();
fprintf(stderr, "Could not initialize NSS: %s (%d)", PR_ErrorToName(error),
@@ -2936,6 +2942,7 @@ int NS_main(int argc, NS_tchar** argv) {
_exit(1);
}
#endif
+#endif
#ifdef XP_MACOSX
if (!isElevated) {
diff --git a/toolkit/xre/moz.build b/toolkit/xre/moz.build
index cf5f7ac50093..f9fe777d8e20 100644
--- a/toolkit/xre/moz.build
+++ b/toolkit/xre/moz.build
@@ -232,6 +232,9 @@ for var in ("APP_VERSION", "APP_ID"):
if CONFIG["MOZ_BUILD_APP"] == "browser":
DEFINES["MOZ_BUILD_APP_IS_BROWSER"] = True
+if CONFIG["TOR_BROWSER_UPDATE"]:
+ DEFINES["MAR_NSS"] = True
+
LOCAL_INCLUDES += [
"../../other-licenses/nsis/Contrib/CityHash/cityhash",
"../components/find",
diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp
index 96ac89267e3f..ef8a8aa8829a 100644
--- a/toolkit/xre/nsUpdateDriver.cpp
+++ b/toolkit/xre/nsUpdateDriver.cpp
@@ -364,6 +364,42 @@ static nsresult GetUpdateDirFromAppDir(nsIFile* aAppDir, nsIFile** aResult) {
# endif
#endif
+#if defined(TOR_BROWSER_UPDATE) && defined(MOZ_VERIFY_MAR_SIGNATURE) && \
+ defined(MAR_NSS) && defined(XP_MACOSX)
+/**
+ * Ideally we would save and restore the original library path value after
+ * the updater finishes its work (and before firefox is re-launched).
+ * Doing so would avoid potential problems like the following bug:
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=1434033
+ */
+/**
+ * Appends the specified path to the library path.
+ * This is used so that the updater can find libnss3.dylib and other
+ * shared libs.
+ *
+ * @param pathToAppend A new library path to prepend to the dynamic linker's
+ * search path.
+ */
+# include "prprf.h"
+# define PATH_SEPARATOR ":"
+# define LD_LIBRARY_PATH_ENVVAR_NAME "DYLD_LIBRARY_PATH"
+static void AppendToLibPath(const char* pathToAppend) {
+ char* pathValue = getenv(LD_LIBRARY_PATH_ENVVAR_NAME);
+ if (nullptr == pathValue || '\0' == *pathValue) {
+ // Leak the string because that is required by PR_SetEnv.
+ char* s =
+ Smprintf("%s=%s", LD_LIBRARY_PATH_ENVVAR_NAME, pathToAppend).release();
+ PR_SetEnv(s);
+ } else {
+ // Leak the string because that is required by PR_SetEnv.
+ char* s = Smprintf("%s=%s" PATH_SEPARATOR "%s", LD_LIBRARY_PATH_ENVVAR_NAME,
+ pathToAppend, pathValue)
+ .release();
+ PR_SetEnv(s);
+ }
+}
+#endif
+
/**
* Applies, switches, or stages an update.
*
@@ -610,6 +646,20 @@ static void ApplyUpdate(nsIFile* greDir, nsIFile* updateDir, nsIFile* appDir,
PR_SetEnv("MOZ_SAFE_MODE_RESTART=1");
}
+#if defined(TOR_BROWSER_UPDATE) && defined(MOZ_VERIFY_MAR_SIGNATURE) && \
+ defined(MAR_NSS) && defined(XP_MACOSX)
+ // On macOS, append the app directory to the shared library search path
+ // so the system can locate the shared libraries that are needed by the
+ // updater, e.g., libnss3.dylib).
+ nsAutoCString appPath;
+ nsresult rv2 = appDir->GetNativePath(appPath);
+ if (NS_SUCCEEDED(rv2)) {
+ AppendToLibPath(appPath.get());
+ } else {
+ LOG(("ApplyUpdate -- appDir->GetNativePath() failed (0x%x)\n", rv2));
+ }
+#endif
+
LOG(("spawning updater process [%s]\n", updaterPath.get()));
#ifdef DEBUG
dump_argv("ApplyUpdate updater", argv, argc);
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 19121: reinstate the update.xml hash check
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit da24cd2170640dee851332fe9d5f6fec1b69e678
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Mon Apr 23 15:22:57 2018 -0400
Bug 19121: reinstate the update.xml hash check
Revert most changes from Mozilla Bug 1373267 "Remove hashFunction and
hashValue attributes from nsIUpdatePatch and code related to these
attributes." Changes to the tests were not reverted; the tests have
been changed significantly and we do not run automated updater tests
for Tor Browser at this time.
Also partial revert of commit f1241db6986e4b54473a1ed870f7584c75d51122.
Revert the nsUpdateService.js changes from Mozilla Bug 862173 "don't
verify mar file hash when using mar signing to verify the mar file
(lessens main thread I/O)."
Changes to the tests were not reverted; the tests have been changed
significantly and we do not run automated updater tests for
Tor Browser at this time.
We kept the addition to the AppConstants API in case other JS code
references it in the future.
---
toolkit/modules/AppConstants.jsm | 7 ++++
toolkit/mozapps/update/UpdateService.jsm | 63 ++++++++++++++++++++++++++++-
toolkit/mozapps/update/UpdateTelemetry.jsm | 1 +
toolkit/mozapps/update/nsIUpdateService.idl | 11 +++++
4 files changed, 81 insertions(+), 1 deletion(-)
diff --git a/toolkit/modules/AppConstants.jsm b/toolkit/modules/AppConstants.jsm
index 41ed947d0526..16c3ea56395b 100644
--- a/toolkit/modules/AppConstants.jsm
+++ b/toolkit/modules/AppConstants.jsm
@@ -212,6 +212,13 @@ this.AppConstants = Object.freeze({
false,
#endif
+ MOZ_VERIFY_MAR_SIGNATURE:
+#ifdef MOZ_VERIFY_MAR_SIGNATURE
+ true,
+#else
+ false,
+#endif
+
MOZ_MAINTENANCE_SERVICE:
#ifdef MOZ_MAINTENANCE_SERVICE
true,
diff --git a/toolkit/mozapps/update/UpdateService.jsm b/toolkit/mozapps/update/UpdateService.jsm
index ad2ee1e00bf2..b200e18c5e8f 100644
--- a/toolkit/mozapps/update/UpdateService.jsm
+++ b/toolkit/mozapps/update/UpdateService.jsm
@@ -918,6 +918,20 @@ function LOG(string) {
}
}
+/**
+ * Convert a string containing binary values to hex.
+ */
+function binaryToHex(input) {
+ var result = "";
+ for (var i = 0; i < input.length; ++i) {
+ var hex = input.charCodeAt(i).toString(16);
+ if (hex.length == 1)
+ hex = "0" + hex;
+ result += hex;
+ }
+ return result;
+}
+
/**
* Gets the specified directory at the specified hierarchy under the
* update root directory and creates it if it doesn't exist.
@@ -1918,6 +1932,8 @@ function UpdatePatch(patch) {
}
break;
case "finalURL":
+ case "hashFunction":
+ case "hashValue":
case "state":
case "type":
case "URL":
@@ -1937,6 +1953,8 @@ UpdatePatch.prototype = {
// over writing nsIUpdatePatch attributes.
_attrNames: [
"errorCode",
+ "hashFunction",
+ "hashValue",
"finalURL",
"selected",
"size",
@@ -1950,6 +1968,8 @@ UpdatePatch.prototype = {
*/
serialize: function UpdatePatch_serialize(updates) {
var patch = updates.createElementNS(URI_UPDATE_NS, "patch");
+ patch.setAttribute("hashFunction", this.hashFunction);
+ patch.setAttribute("hashValue", this.hashValue);
patch.setAttribute("size", this.size);
patch.setAttribute("type", this.type);
patch.setAttribute("URL", this.URL);
@@ -4973,7 +4993,42 @@ Downloader.prototype = {
}
LOG("Downloader:_verifyDownload downloaded size == expected size.");
- return true;
+ let fileStream = Cc["@mozilla.org/network/file-input-stream;1"].
+ createInstance(Ci.nsIFileInputStream);
+ fileStream.init(destination, FileUtils.MODE_RDONLY, FileUtils.PERMS_FILE, 0);
+
+ let digest;
+ try {
+ let hash = Cc["@mozilla.org/security/hash;1"].
+ createInstance(Ci.nsICryptoHash);
+ var hashFunction = Ci.nsICryptoHash[this._patch.hashFunction.toUpperCase()];
+ if (hashFunction == undefined) {
+ throw Cr.NS_ERROR_UNEXPECTED;
+ }
+ hash.init(hashFunction);
+ hash.updateFromStream(fileStream, -1);
+ // NOTE: For now, we assume that the format of _patch.hashValue is hex
+ // encoded binary (such as what is typically output by programs like
+ // sha1sum). In the future, this may change to base64 depending on how
+ // we choose to compute these hashes.
+ digest = binaryToHex(hash.finish(false));
+ } catch (e) {
+ LOG("Downloader:_verifyDownload - failed to compute hash of the " +
+ "downloaded update archive");
+ digest = "";
+ }
+
+ fileStream.close();
+
+ if (digest == this._patch.hashValue.toLowerCase()) {
+ LOG("Downloader:_verifyDownload hashes match.");
+ return true;
+ }
+
+ LOG("Downloader:_verifyDownload hashes do not match. ");
+ AUSTLMY.pingDownloadCode(this.isCompleteUpdate,
+ AUSTLMY.DWNLD_ERR_VERIFY_NO_HASH_MATCH);
+ return false;
},
/**
@@ -5559,6 +5614,9 @@ Downloader.prototype = {
" is higher than patch size: " +
this._patch.size
);
+ // It's important that we use a different code than
+ // NS_ERROR_CORRUPTED_CONTENT so that tests can verify the difference
+ // between a hash error and a wrong download error.
AUSTLMY.pingDownloadCode(
this.isCompleteUpdate,
AUSTLMY.DWNLD_ERR_PATCH_SIZE_LARGER
@@ -5577,6 +5635,9 @@ Downloader.prototype = {
" is not equal to expected patch size: " +
this._patch.size
);
+ // It's important that we use a different code than
+ // NS_ERROR_CORRUPTED_CONTENT so that tests can verify the difference
+ // between a hash error and a wrong download error.
AUSTLMY.pingDownloadCode(
this.isCompleteUpdate,
AUSTLMY.DWNLD_ERR_PATCH_SIZE_NOT_EQUAL
diff --git a/toolkit/mozapps/update/UpdateTelemetry.jsm b/toolkit/mozapps/update/UpdateTelemetry.jsm
index dae76e09acd0..df5b8917970e 100644
--- a/toolkit/mozapps/update/UpdateTelemetry.jsm
+++ b/toolkit/mozapps/update/UpdateTelemetry.jsm
@@ -192,6 +192,7 @@ var AUSTLMY = {
DWNLD_ERR_VERIFY_NO_REQUEST: 13,
DWNLD_ERR_VERIFY_PATCH_SIZE_NOT_EQUAL: 14,
DWNLD_ERR_WRITE_FAILURE: 15,
+ DWNLD_ERR_VERIFY_NO_HASH_MATCH: 16,
// Temporary failure code to see if there are failures without an update phase
DWNLD_UNKNOWN_PHASE_ERR_WRITE_FAILURE: 40,
diff --git a/toolkit/mozapps/update/nsIUpdateService.idl b/toolkit/mozapps/update/nsIUpdateService.idl
index 805bec8a7d48..500b2d8b1e9a 100644
--- a/toolkit/mozapps/update/nsIUpdateService.idl
+++ b/toolkit/mozapps/update/nsIUpdateService.idl
@@ -39,6 +39,17 @@ interface nsIUpdatePatch : nsISupports
*/
attribute AString finalURL;
+ /**
+ * The hash function to use when determining this file's integrity
+ */
+ attribute AString hashFunction;
+
+ /**
+ * The value of the hash function named above that should be computed if
+ * this file is not corrupt.
+ */
+ attribute AString hashValue;
+
/**
* The size of this file, in bytes.
*/
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 21431: Clean-up system extensions shipped in Firefox
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 4cd9354c12db38e2870a912ea7562e87b3eedbe0
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Tue May 23 17:05:29 2017 -0400
Bug 21431: Clean-up system extensions shipped in Firefox
Only ship the pdfjs extension.
---
browser/components/BrowserGlue.jsm | 6 ++++++
browser/extensions/moz.build | 9 +--------
browser/installer/package-manifest.in | 1 -
browser/locales/Makefile.in | 8 --------
browser/locales/jar.mn | 7 -------
5 files changed, 7 insertions(+), 24 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 29f2b7328f6b..231bb540921b 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -2007,6 +2007,9 @@ BrowserGlue.prototype = {
const ID = "screenshots(a)mozilla.org";
const _checkScreenshotsPref = async () => {
let addon = await AddonManager.getAddonByID(ID);
+ if (!addon) {
+ return;
+ }
let disabled = Services.prefs.getBoolPref(PREF, false);
if (disabled) {
await addon.disable({ allowSystemAddons: true });
@@ -2023,6 +2026,9 @@ BrowserGlue.prototype = {
const ID = "webcompat-reporter(a)mozilla.org";
Services.prefs.addObserver(PREF, async () => {
let addon = await AddonManager.getAddonByID(ID);
+ if (!addon) {
+ return;
+ }
let enabled = Services.prefs.getBoolPref(PREF, false);
if (enabled && !addon.isActive) {
await addon.enable({ allowSystemAddons: true });
diff --git a/browser/extensions/moz.build b/browser/extensions/moz.build
index 9daae31eca43..8b16ddc4a84a 100644
--- a/browser/extensions/moz.build
+++ b/browser/extensions/moz.build
@@ -4,14 +4,7 @@
# 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/.
-DIRS += [
- "doh-rollout",
- "formautofill",
- "screenshots",
- "webcompat",
- "report-site-issue",
- "pictureinpicture",
-]
+DIRS += []
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 b752f985c4c2..27424c5d7fcd 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -275,7 +275,6 @@
@RESPATH@/browser/chrome/icons/default/default64.png
@RESPATH@/browser/chrome/icons/default/default128.png
#endif
-@RESPATH@/browser/features/*
; [DevTools Startup Files]
@RESPATH@/browser/chrome/devtools-startup@JAREXT@
diff --git a/browser/locales/Makefile.in b/browser/locales/Makefile.in
index 496379c4306f..0946188813da 100644
--- a/browser/locales/Makefile.in
+++ b/browser/locales/Makefile.in
@@ -58,10 +58,6 @@ l10n-%:
@$(MAKE) -C ../../toolkit/locales l10n-$* XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
@$(MAKE) -C ../../services/sync/locales AB_CD=$* XPI_NAME=locale-$*
@$(MAKE) -C ../../extensions/spellcheck/locales AB_CD=$* XPI_NAME=locale-$*
-ifneq (,$(wildcard ../extensions/formautofill/locales))
- @$(MAKE) -C ../extensions/formautofill/locales AB_CD=$* XPI_NAME=locale-$*
-endif
- @$(MAKE) -C ../extensions/report-site-issue/locales AB_CD=$* XPI_NAME=locale-$*
@$(MAKE) -C ../../devtools/client/locales AB_CD=$* XPI_NAME=locale-$* XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
@$(MAKE) -C ../../devtools/startup/locales AB_CD=$* XPI_NAME=locale-$* XPI_ROOT_APPID='$(XPI_ROOT_APPID)'
@$(MAKE) l10n AB_CD=$* XPI_NAME=locale-$* PREF_DIR=$(PREF_DIR)
@@ -75,14 +71,10 @@ chrome-%:
@$(MAKE) -C ../../toolkit/locales chrome-$*
@$(MAKE) -C ../../services/sync/locales chrome AB_CD=$*
@$(MAKE) -C ../../extensions/spellcheck/locales chrome AB_CD=$*
-ifneq (,$(wildcard ../extensions/formautofill/locales))
- @$(MAKE) -C ../extensions/formautofill/locales chrome AB_CD=$*
-endif
@$(MAKE) -C ../../devtools/client/locales chrome AB_CD=$*
@$(MAKE) -C ../../devtools/startup/locales chrome AB_CD=$*
@$(MAKE) chrome AB_CD=$*
@$(MAKE) -C $(DEPTH)/$(MOZ_BRANDING_DIRECTORY)/locales chrome AB_CD=$*
- @$(MAKE) -C ../extensions/report-site-issue/locales chrome AB_CD=$*
package-win32-installer: $(SUBMAKEFILES)
$(MAKE) -C ../installer/windows CONFIG_DIR=l10ngen ZIP_IN='$(ZIP_OUT)' installer
diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn
index 2aecae56bdca..934205ce6e15 100644
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -53,10 +53,3 @@
locale/browser/newInstall.dtd (%chrome/browser/newInstall.dtd)
locale/browser/brandings.dtd (%chrome/browser/brandings.dtd)
locale/browser/fxmonitor.properties (%chrome/browser/fxmonitor.properties)
-
-#ifdef XPI_NAME
-# Bug 1240628, restructure how l10n repacks work with feature addons
-# This is hacky, but ensures the chrome.manifest chain is complete
-[.] chrome.jar:
-% manifest features/chrome.manifest
-#endif
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 21830: Copying large text from web console leaks to /tmp
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit c75df426eb333be6cd5431077b998fda4286bac2
Author: Georg Koppen <gk(a)torproject.org>
Date: Fri Aug 4 05:55:49 2017 +0000
Bug 21830: Copying large text from web console leaks to /tmp
Patch written by Neill Miller
---
widget/nsTransferable.cpp | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/widget/nsTransferable.cpp b/widget/nsTransferable.cpp
index c82549a4d1d1..f8ecfbff0983 100644
--- a/widget/nsTransferable.cpp
+++ b/widget/nsTransferable.cpp
@@ -33,6 +33,7 @@ Notes to self:
#include "nsILoadContext.h"
#include "nsXULAppAPI.h"
#include "mozilla/UniquePtr.h"
+#include "mozilla/Preferences.h"
using namespace mozilla;
@@ -195,6 +196,11 @@ nsTransferable::Init(nsILoadContext* aContext) {
if (aContext) {
mPrivateData = aContext->UsePrivateBrowsing();
+ } else {
+ // without aContext here to provide PrivateBrowsing information,
+ // we defer to the active configured setting
+ mPrivateData =
+ mozilla::Preferences::GetBool("browser.privatebrowsing.autostart");
}
#ifdef DEBUG
mInitialized = true;
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 25658: Replace security slider with security level UI
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 79c7ffaee5adc8da4e3159ef525517e5e897572c
Author: Richard Pospesel <richard(a)torproject.org>
Date: Mon Mar 4 16:09:51 2019 -0800
Bug 25658: Replace security slider with security level UI
This patch adds a new 'securitylevel' component to Tor Browser intended
to replace the torbutton 'Security Slider'.
This component adds a new Security Level toolbar button which visually
indicates the current global security level via icon (as defined by the
extensions.torbutton.security_slider pref), a drop-down hanger with a
short description of the current security level, and a new section in
the about:preferences#privacy page where users can change their current
security level. In addition, the hanger and the preferences page will
show a visual warning when the user has modified prefs associated with
the security level and provide a one-click 'Restore Defaults' button to
get the user back on recommended settings.
Strings used by this patch are pulled from the torbutton extension, but
en-US defaults are provided if there is an error loading from the
extension. With this patch applied, the usual work-flow of "./mach build
&& ./mach run" work as expected, even if the torbutton extension is
disabled.
---
browser/base/content/browser.js | 10 +
browser/base/content/browser.xhtml | 5 +
browser/components/moz.build | 1 +
browser/components/preferences/preferences.xhtml | 1 +
browser/components/preferences/privacy.inc.xhtml | 2 +
browser/components/preferences/privacy.js | 19 +
.../securitylevel/content/securityLevel.js | 501 +++++++++++++++++++++
.../securitylevel/content/securityLevelButton.css | 9 +
.../content/securityLevelButton.inc.xhtml | 7 +
.../securitylevel/content/securityLevelButton.svg | 21 +
.../securitylevel/content/securityLevelPanel.css | 82 ++++
.../content/securityLevelPanel.inc.xhtml | 38 ++
.../content/securityLevelPreferences.css | 26 ++
.../content/securityLevelPreferences.inc.xhtml | 62 +++
browser/components/securitylevel/jar.mn | 6 +
browser/components/securitylevel/moz.build | 1 +
16 files changed, 791 insertions(+)
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index 56537664068a..7d2727b262d5 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -223,6 +223,11 @@ XPCOMUtils.defineLazyScriptGetter(
["DownloadsButton", "DownloadsIndicatorView"],
"chrome://browser/content/downloads/indicator.js"
);
+XPCOMUtils.defineLazyScriptGetter(
+ this,
+ ["SecurityLevelButton"],
+ "chrome://browser/content/securitylevel/securityLevel.js"
+);
XPCOMUtils.defineLazyScriptGetter(
this,
"gEditItemOverlay",
@@ -1837,6 +1842,9 @@ var gBrowserInit = {
// doesn't flicker as the window is being shown.
DownloadsButton.init();
+ // Init the SecuritySettingsButton
+ SecurityLevelButton.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
@@ -2564,6 +2572,8 @@ var gBrowserInit = {
DownloadsButton.uninit();
+ SecurityLevelButton.uninit();
+
gAccessibilityServiceIndicator.uninit();
if (gToolbarKeyNavEnabled) {
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index 3b9fc7e45b74..f8381a5dad9e 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -20,6 +20,8 @@
<?xml-stylesheet href="chrome://browser/content/browser.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/tabbrowser.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/downloads/downloads.css" type="text/css"?>
+<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPanel.css"?>
+<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelButton.css"?>
<?xml-stylesheet href="chrome://browser/content/places/places.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/content/usercontext/usercontext.css" type="text/css"?>
<?xml-stylesheet href="chrome://browser/skin/" type="text/css"?>
@@ -656,6 +658,7 @@
#include ../../components/controlcenter/content/protectionsPanel.inc.xhtml
#include ../../components/downloads/content/downloadsPanel.inc.xhtml
#include ../../../devtools/startup/enableDevToolsPopup.inc.xhtml
+#include ../../components/securitylevel/content/securityLevelPanel.inc.xhtml
#include browser-allTabsMenu.inc.xhtml
<hbox id="downloads-animation-container">
@@ -2104,6 +2107,8 @@
</stack>
</toolbarbutton>
+#include ../../components/securitylevel/content/securityLevelButton.inc.xhtml
+
<toolbarbutton id="library-button" class="toolbarbutton-1 chromeclass-toolbar-additional subviewbutton-nav"
removable="true"
onmousedown="PanelUI.showSubView('appMenu-libraryView', this, event);"
diff --git a/browser/components/moz.build b/browser/components/moz.build
index 1e977cfe5499..1c421b761888 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -50,6 +50,7 @@ DIRS += [
"protocolhandler",
"resistfingerprinting",
"search",
+ "securitylevel",
"sessionstore",
"shell",
"syncedtabs",
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index 46bb2ec3ab57..5f9900564288 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/securitylevel/securityLevelPreferences.css"?>
<!DOCTYPE html>
diff --git a/browser/components/preferences/privacy.inc.xhtml b/browser/components/preferences/privacy.inc.xhtml
index f1dd462289bb..a2ef0edb26f3 100644
--- a/browser/components/preferences/privacy.inc.xhtml
+++ b/browser/components/preferences/privacy.inc.xhtml
@@ -924,6 +924,8 @@
<html:h1 data-l10n-id="security-header"/>
</hbox>
+#include ../securitylevel/content/securityLevelPreferences.inc.xhtml
+
<!-- addons, forgery (phishing) UI Security -->
<groupbox id="browsingProtectionGroup" data-category="panePrivacy" hidden="true">
<label><html:h2 data-l10n-id="security-browsing-protection"/></label>
diff --git a/browser/components/preferences/privacy.js b/browser/components/preferences/privacy.js
index 87006eea83e3..8401d4d101e4 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,
+ ["SecurityLevelPreferences"],
+ "chrome://browser/content/securitylevel/securityLevel.js"
+);
+
XPCOMUtils.defineLazyServiceGetter(
this,
"listManager",
@@ -305,6 +311,18 @@ function setUpContentBlockingWarnings() {
var gPrivacyPane = {
_pane: null,
+ /**
+ * Show the Security Level UI
+ */
+ _initSecurityLevel() {
+ SecurityLevelPreferences.init();
+ let unload = () => {
+ window.removeEventListener("unload", unload);
+ SecurityLevelPreferences.uninit();
+ };
+ window.addEventListener("unload", unload);
+ },
+
/**
* Whether the prompt to restart Firefox should appear when changing the autostart pref.
*/
@@ -504,6 +522,7 @@ var gPrivacyPane = {
this.trackingProtectionReadPrefs();
this.networkCookieBehaviorReadPrefs();
this._initTrackingProtectionExtensionControl();
+ this._initSecurityLevel();
Services.telemetry.setEventRecordingEnabled("pwmgr", true);
diff --git a/browser/components/securitylevel/content/securityLevel.js b/browser/components/securitylevel/content/securityLevel.js
new file mode 100644
index 000000000000..b47d0cfb545e
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevel.js
@@ -0,0 +1,501 @@
+"use strict";
+
+ChromeUtils.import("resource://gre/modules/XPCOMUtils.jsm");
+ChromeUtils.import("resource://gre/modules/Services.jsm");
+
+XPCOMUtils.defineLazyModuleGetters(this, {
+ CustomizableUI: "resource:///modules/CustomizableUI.jsm",
+ PanelMultiView: "resource:///modules/PanelMultiView.jsm",
+});
+
+ChromeUtils.defineModuleGetter(
+ this,
+ "TorStrings",
+ "resource:///modules/TorStrings.jsm"
+);
+
+/*
+ Security Level Prefs
+
+ Getters and Setters for relevant torbutton prefs
+*/
+const SecurityLevelPrefs = {
+ security_slider_pref : "extensions.torbutton.security_slider",
+ security_custom_pref : "extensions.torbutton.security_custom",
+
+ get securitySlider() {
+ try {
+ return Services.prefs.getIntPref(this.security_slider_pref);
+ } catch(e) {
+ // init pref to 4 (standard)
+ const val = 4;
+ Services.prefs.setIntPref(this.security_slider_pref, val);
+ return val;
+ }
+ },
+
+ set securitySlider(val) {
+ Services.prefs.setIntPref(this.security_slider_pref, val);
+ },
+
+ get securityCustom() {
+ try {
+ return Services.prefs.getBoolPref(this.security_custom_pref);
+ } catch(e) {
+ // init custom to false
+ const val = false;
+ Services.prefs.setBoolPref(this.security_custom_pref, val);
+ return val;
+ }
+ },
+
+ set securityCustom(val) {
+ Services.prefs.setBoolPref(this.security_custom_pref, val);
+ },
+}; /* Security Level Prefs */
+
+/*
+ Security Level Button Code
+
+ Controls init and update of the security level toolbar button
+*/
+
+const SecurityLevelButton = {
+ _securityPrefsBranch : null,
+
+ _populateXUL : function(securityLevelButton) {
+ if (securityLevelButton != null) {
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.securityLevel);
+ securityLevelButton.setAttribute("label", TorStrings.securityLevel.securityLevel);
+ }
+ },
+
+ _configUIFromPrefs : function(securityLevelButton) {
+ if (securityLevelButton != null) {
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let classList = securityLevelButton.classList;
+ classList.remove("standard", "safer", "safest");
+ switch(securitySlider) {
+ case 4:
+ classList.add("standard");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.standard.tooltip);
+ break;
+ case 2:
+ classList.add("safer");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.safer.tooltip);
+ break;
+ case 1:
+ classList.add("safest");
+ securityLevelButton.setAttribute("tooltiptext", TorStrings.securityLevel.safest.tooltip);
+ break;
+ }
+ }
+ },
+
+ get button() {
+ let button = document.getElementById("security-level-button");
+ if (!button) {
+ return null;
+ }
+ return button;
+ },
+
+ get anchor() {
+ let anchor = this.button.icon;
+ if (!anchor) {
+ return null;
+ }
+
+ anchor.setAttribute("consumeanchor", SecurityLevelButton.button.id);
+ return anchor;
+ },
+
+ init : function() {
+ // set the initial class based off of the current pref
+ let button = this.button;
+ this._populateXUL(button);
+ this._configUIFromPrefs(button);
+
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+
+ CustomizableUI.addListener(this);
+
+ SecurityLevelPanel.init();
+ },
+
+ uninit : function() {
+ CustomizableUI.removeListener(this);
+
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+
+ SecurityLevelPanel.uninit();
+ },
+
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider") {
+ this._configUIFromPrefs(this.button);
+ }
+ break;
+ }
+ },
+
+ // callback for entering the 'Customize Firefox' screen to set icon
+ onCustomizeStart : function(window) {
+ let navigatorToolbox = document.getElementById("navigator-toolbox");
+ let button = navigatorToolbox.palette.querySelector("#security-level-button");
+ this._populateXUL(button);
+ this._configUIFromPrefs(button);
+ },
+
+ // callback when CustomizableUI modifies DOM
+ onWidgetAfterDOMChange : function(aNode, aNextNode, aContainer, aWasRemoval) {
+ if (aNode.id == "security-level-button" && !aWasRemoval) {
+ this._populateXUL(aNode);
+ this._configUIFromPrefs(aNode);
+ }
+ },
+
+ // for when the toolbar button needs to be activated and displays the Security Level panel
+ //
+ // In the toolbarbutton xul you'll notice we register this callback for both onkeypress and
+ // onmousedown. We do this to match the behavior of other panel spawning buttons such as Downloads,
+ // Library, and the Hamburger menus. Using oncommand alone would result in only getting fired
+ // after onclick, which is mousedown followed by mouseup.
+ onCommand : function(aEvent) {
+ // snippet stolen from /browser/components/downloads/indicator.js DownloadsIndicatorView.onCommand(evt)
+ if (
+ (aEvent.type == "mousedown" && aEvent.button != 0) ||
+ (aEvent.type == "keypress" && aEvent.key != " " && aEvent.key != "Enter")
+ ) {
+ return;
+ }
+
+ // we need to set this attribute for the button to be shaded correctly to look like it is pressed
+ // while the security level panel is open
+ this.button.setAttribute("open", "true");
+ SecurityLevelPanel.show();
+ },
+}; /* Security Level Button */
+
+/*
+ Security Level Panel Code
+
+ Controls init and update of the panel in the security level hanger
+*/
+
+const SecurityLevelPanel = {
+ _securityPrefsBranch : null,
+ _panel : null,
+ _anchor : null,
+ _populated : false,
+
+ _populateXUL : function() {
+ // get the panel elements we need to populate
+ let panelview = document.getElementById("securityLevel-panelview");
+ let labelHeader = panelview.querySelector("#securityLevel-header");
+ let labelCustomWarning = panelview.querySelector("#securityLevel-customWarning")
+ let labelLearnMore = panelview.querySelector("#securityLevel-learnMore");
+ let buttonRestoreDefaults = panelview.querySelector("#securityLevel-restoreDefaults");
+ let buttonAdvancedSecuritySettings = panelview.querySelector("#securityLevel-advancedSecuritySettings");
+
+ labelHeader.setAttribute("value", TorStrings.securityLevel.securityLevel);
+ labelCustomWarning.setAttribute("value", TorStrings.securityLevel.customWarning);
+ labelLearnMore.setAttribute("value", TorStrings.securityLevel.learnMore);
+ labelLearnMore.setAttribute("href", TorStrings.securityLevel.learnMoreURL);
+ buttonRestoreDefaults.setAttribute("label", TorStrings.securityLevel.restoreDefaults);
+ buttonAdvancedSecuritySettings.setAttribute("label", TorStrings.securityLevel.advancedSecuritySettings);
+
+ // rest of the XUL is set based on security prefs
+ this._configUIFromPrefs();
+
+ this._populated = true;
+ },
+
+ _configUIFromPrefs : function() {
+ // get security prefs
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let securityCustom = SecurityLevelPrefs.securityCustom;
+
+ // get the panel elements we need to populate
+ let panelview = document.getElementById("securityLevel-panelview");
+ let labelLevel = panelview.querySelector("#securityLevel-level");
+ let labelCustomWarning = panelview.querySelector("#securityLevel-customWarning")
+ let summary = panelview.querySelector("#securityLevel-summary");
+ let buttonRestoreDefaults = panelview.querySelector("#securityLevel-restoreDefaults");
+ let buttonAdvancedSecuritySettings = panelview.querySelector("#securityLevel-advancedSecuritySettings");
+
+ // only visible when user is using custom settings
+ labelCustomWarning.hidden = !securityCustom;
+ buttonRestoreDefaults.hidden = !securityCustom;
+
+ // Descriptions change based on security level
+ switch(securitySlider) {
+ // standard
+ case 4:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.standard.level);
+ summary.textContent = TorStrings.securityLevel.standard.summary;
+ break;
+ // safer
+ case 2:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.safer.level);
+ summary.textContent = TorStrings.securityLevel.safer.summary;
+ break;
+ // safest
+ case 1:
+ labelLevel.setAttribute("value", TorStrings.securityLevel.safest.level);
+ summary.textContent = TorStrings.securityLevel.safest.summary;
+ break;
+ }
+
+ // override the summary text with custom warning
+ if (securityCustom) {
+ summary.textContent = TorStrings.securityLevel.custom.summary;
+ }
+ },
+
+ init : function() {
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+ },
+
+ uninit : function() {
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+ },
+
+ show : function() {
+ // we have to defer this until after the browser has finished init'ing before
+ // we can populate the panel
+ if (!this._populated) {
+ this._populateXUL();
+ }
+
+ let panel = document.getElementById("securityLevel-panel");
+ panel.hidden = false;
+ PanelMultiView.openPopup(panel, SecurityLevelButton.anchor, "bottomcenter topright",
+ 0, 0, false, null).catch(Cu.reportError);
+ },
+
+ hide : function() {
+ let panel = document.getElementById("securityLevel-panel");
+ PanelMultiView.hidePopup(panel);
+ },
+
+ restoreDefaults : function() {
+ SecurityLevelPrefs.securityCustom = false;
+ // hide and reshow so that layout re-renders properly
+ this.hide();
+ this.show(this._anchor);
+ },
+
+ openAdvancedSecuritySettings : function() {
+ openPreferences("privacy-securitylevel");
+ this.hide();
+ },
+
+ // callback when prefs change
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider" || data == "security_custom") {
+ this._configUIFromPrefs();
+ }
+ break;
+ }
+ },
+
+ // callback when the panel is displayed
+ onPopupShown : function(event) {
+ SecurityLevelButton.button.setAttribute("open", "true");
+ },
+
+ // callback when the panel is hidden
+ onPopupHidden : function(event) {
+ SecurityLevelButton.button.removeAttribute("open");
+ }
+}; /* Security Level Panel */
+
+/*
+ Security Level Preferences Code
+
+ Code to handle init and update of security level section in about:preferences#privacy
+*/
+
+const SecurityLevelPreferences =
+{
+ _securityPrefsBranch : null,
+
+ _populateXUL : function() {
+ let groupbox = document.getElementById("securityLevel-groupbox");
+
+ let labelHeader = groupbox.querySelector("#securityLevel-header");
+ labelHeader.textContent = TorStrings.securityLevel.securityLevel;
+
+ let spanOverview = groupbox.querySelector("#securityLevel-overview");
+ spanOverview.textContent = TorStrings.securityLevel.overview;
+
+ let labelLearnMore = groupbox.querySelector("#securityLevel-learnMore");
+ labelLearnMore.setAttribute("value", TorStrings.securityLevel.learnMore);
+ labelLearnMore.setAttribute("href", TorStrings.securityLevel.learnMoreURL);
+
+ let radiogroup = document.getElementById("securityLevel-radiogroup");
+ radiogroup.addEventListener("command", SecurityLevelPreferences.selectSecurityLevel);
+
+ let populateRadioElements = function(vboxQuery, stringStruct) {
+ let vbox = groupbox.querySelector(vboxQuery);
+
+ let radio = vbox.querySelector("radio");
+ radio.setAttribute("label", stringStruct.level);
+
+ let customWarning = vbox.querySelector("#securityLevel-customWarning");
+ customWarning.setAttribute("value", TorStrings.securityLevel.customWarning);
+
+ let labelSummary = vbox.querySelector("#securityLevel-summary");
+ labelSummary.textContent = stringStruct.summary;
+
+ let labelRestoreDefaults = vbox.querySelector("#securityLevel-restoreDefaults");
+ labelRestoreDefaults.setAttribute("value", TorStrings.securityLevel.restoreDefaults);
+ labelRestoreDefaults.addEventListener("click", SecurityLevelPreferences.restoreDefaults);
+
+ let description1 = vbox.querySelector("#securityLevel-description1");
+ if (description1) {
+ description1.textContent = stringStruct.description1;
+ }
+ let description2 = vbox.querySelector("#securityLevel-description2");
+ if (description2) {
+ description2.textContent = stringStruct.description2;
+ }
+ let description3 = vbox.querySelector("#securityLevel-description3");
+ if (description3) {
+ description3.textContent = stringStruct.description3;
+ }
+ };
+
+ populateRadioElements("#securityLevel-vbox-standard", TorStrings.securityLevel.standard);
+ populateRadioElements("#securityLevel-vbox-safer", TorStrings.securityLevel.safer);
+ populateRadioElements("#securityLevel-vbox-safest", TorStrings.securityLevel.safest);
+ },
+
+ _configUIFromPrefs : function() {
+ // read our prefs
+ let securitySlider = SecurityLevelPrefs.securitySlider;
+ let securityCustom = SecurityLevelPrefs.securityCustom;
+
+ // get our elements
+ let groupbox = document.getElementById("securityLevel-groupbox");
+
+ let radiogroup = groupbox.querySelector("#securityLevel-radiogroup");
+ let labelStandardCustom = groupbox.querySelector("#securityLevel-vbox-standard label#securityLevel-customWarning");
+ let labelSaferCustom = groupbox.querySelector("#securityLevel-vbox-safer label#securityLevel-customWarning");
+ let labelSafestCustom = groupbox.querySelector("#securityLevel-vbox-safest label#securityLevel-customWarning");
+ let labelStandardRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-standard label#securityLevel-restoreDefaults");
+ let labelSaferRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-safer label#securityLevel-restoreDefaults");
+ let labelSafestRestoreDefaults = groupbox.querySelector("#securityLevel-vbox-safest label#securityLevel-restoreDefaults");
+
+ // hide custom label by default until we know which level we're at
+ labelStandardCustom.hidden = true;
+ labelSaferCustom.hidden = true;
+ labelSafestCustom.hidden = true;
+
+ labelStandardRestoreDefaults.hidden = true;
+ labelSaferRestoreDefaults.hidden = true;
+ labelSafestRestoreDefaults.hidden = true;
+
+ switch(securitySlider) {
+ // standard
+ case 4:
+ radiogroup.value = "standard";
+ labelStandardCustom.hidden = !securityCustom;
+ labelStandardRestoreDefaults.hidden = !securityCustom;
+ break;
+ // safer
+ case 2:
+ radiogroup.value = "safer";
+ labelSaferCustom.hidden = !securityCustom;
+ labelSaferRestoreDefaults.hidden = !securityCustom;
+ break;
+ // safest
+ case 1:
+ radiogroup.value = "safest";
+ labelSafestCustom.hidden = !securityCustom;
+ labelSafestRestoreDefaults.hidden = !securityCustom;
+ break;
+ }
+ },
+
+ init : function() {
+ // populate XUL with localized strings
+ this._populateXUL();
+
+ // read prefs and populate UI
+ this._configUIFromPrefs();
+
+ // register for pref chagnes
+ this._securityPrefsBranch = Services.prefs.getBranch("extensions.torbutton.");
+ this._securityPrefsBranch.addObserver("", this, false);
+ },
+
+ uninit : function() {
+ // unregister for pref change events
+ this._securityPrefsBranch.removeObserver("", this);
+ this._securityPrefsBranch = null;
+ },
+
+ // callback for when prefs change
+ observe : function(subject, topic, data) {
+ switch(topic) {
+ case "nsPref:changed":
+ if (data == "security_slider" ||
+ data == "security_custom") {
+ this._configUIFromPrefs();
+ }
+ break;
+ }
+ },
+
+ selectSecurityLevel : function() {
+ // radio group elements
+ let radiogroup = document.getElementById("securityLevel-radiogroup");
+
+ // update pref based on selected radio option
+ switch (radiogroup.value) {
+ case "standard":
+ SecurityLevelPrefs.securitySlider = 4;
+ break;
+ case "safer":
+ SecurityLevelPrefs.securitySlider = 2;
+ break;
+ case "safest":
+ SecurityLevelPrefs.securitySlider = 1;
+ break;
+ }
+
+ SecurityLevelPreferences.restoreDefaults();
+ },
+
+ restoreDefaults : function() {
+ SecurityLevelPrefs.securityCustom = false;
+ },
+}; /* Security Level Prefereces */
+
+Object.defineProperty(this, "SecurityLevelButton", {
+ value: SecurityLevelButton,
+ enumerable: true,
+ writable: false
+});
+
+Object.defineProperty(this, "SecurityLevelPanel", {
+ value: SecurityLevelPanel,
+ enumerable: true,
+ writable: false
+});
+
+Object.defineProperty(this, "SecurityLevelPreferences", {
+ value: SecurityLevelPreferences,
+ enumerable: true,
+ writable: false
+});
diff --git a/browser/components/securitylevel/content/securityLevelButton.css b/browser/components/securitylevel/content/securityLevelButton.css
new file mode 100644
index 000000000000..81f2365bae28
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.css
@@ -0,0 +1,9 @@
+toolbarbutton#security-level-button.standard {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#standard");
+}
+toolbarbutton#security-level-button.safer {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#safer");
+}
+toolbarbutton#security-level-button.safest {
+ list-style-image: url("chrome://browser/content/securitylevel/securityLevelButton.svg#safest");
+}
diff --git a/browser/components/securitylevel/content/securityLevelButton.inc.xhtml b/browser/components/securitylevel/content/securityLevelButton.inc.xhtml
new file mode 100644
index 000000000000..96ee1ec0ca49
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.inc.xhtml
@@ -0,0 +1,7 @@
+<toolbarbutton id="security-level-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ badged="true"
+ removable="true"
+ onmousedown="SecurityLevelButton.onCommand(event);"
+ onkeypress="SecurityLevelButton.onCommand(event);"
+ closemenu="none"
+ cui-areatype="toolbar"/>
diff --git a/browser/components/securitylevel/content/securityLevelButton.svg b/browser/components/securitylevel/content/securityLevelButton.svg
new file mode 100644
index 000000000000..8535cdcc531e
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelButton.svg
@@ -0,0 +1,21 @@
+<svg width="14px" height="16px" viewBox="0 0 14 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <style>
+ use:not(:target) {
+ display: none;
+ }
+ </style>
+ <defs>
+ <g id="standard_icon" stroke="none" stroke-width="1">
+ <path d="M7.0 2.16583509C7.0 2.16583509 2.0 4.24375717 2.0 4.24375717C2.0 4.24375717 2.0 7.27272727 2.0 7.27272727C2.0 10.2413541 4.13435329 13.0576771 7.0 13.9315843C9.8656467 13.0576771 12.0 10.2413541 12.0 7.27272727C12.0 7.27272727 12.0 4.24375717 12.0 4.24375717C12.0 4.24375717 7.0 2.16583509 7.0 2.16583509C7.0 2.16583509 7.0 2.16583509 7.0 2.16583509M7.0 0.0C7.0 0.0 14.0 2.90909091 14.0 2.90909091C14.0 2.90909091 14.0 7.27272727 14.0 7.27272727C14.0 11.3090909 11.0133333 15.0836364 7.0 16.0C2.98666667 15.0836364 0.0 11.3090909 0.0 7.27272727C0.0 7.27272727 0.0 2.90909091 0.0 2.90909091C0.0 2.90909091 7.0 0.0 7.0 0.0C7.0 0.0 7.0 0.0 7.0 0.0" />
+ </g>
+ <g id="safer_icon" stroke="none" stroke-width="1">
+ <path fill-rule="nonzero" d="M7.0 2.1658351C7.0 13.931584 7.0 2.1658351 7.0 13.931584C9.8656467 13.057677 12.0 10.241354 12.0 7.2727273C12.0 7.2727273 12.0 4.2437572 12.0 4.2437572C12.0 4.2437572 7.0 2.1658351 7.0 2.1658351C7.0 2.1658351 7.0 2.1658351 7.0 2.1658351M7.0 0.0C7.0 0.0 14.0 2.9090909 14.0 2.9090909C14.0 2.9090909 14.0 7.2727273 14.0 7.2727273C14.0 11.309091 11.013333 15.083636 7.0 16.0C2.9866667 15.083636 0.0 11.309091 0.0 7.2727273C0.0 7.2727273 0.0 2.9090909 0.0 2.9090909C0.0 2.9090909 7.0 0.0 7.0 0.0"/>
+ </g>
+ <g id="safest_icon" stroke="none" stroke-width="1">
+ <path d="M7.0 0.0C7.0 0.0 14.0 2.90909091 14.0 2.90909091C14.0 2.90909091 14.0 7.27272727 14.0 7.27272727C14.0 11.3090909 11.0133333 15.0836364 7.0 16.0C2.98666667 15.0836364 0.0 11.3090909 0.0 7.27272727C0.0 7.27272727 0.0 2.90909091 0.0 2.90909091C0.0 2.90909091 7.0 0.0 7.0 0.0C7.0 0.0 7.0 0.0 7.0 0.0" />
+ </g>
+ </defs>
+ <use id="standard" fill="context-fill" fill-opacity="context-fill-opacity" href="#standard_icon" />
+ <use id="safer" fill="context-fill" fill-opacity="context-fill-opacity" href="#safer_icon" />
+ <use id="safest" fill="context-fill" fill-opacity="context-fill-opacity" href="#safest_icon" />
+</svg>
diff --git a/browser/components/securitylevel/content/securityLevelPanel.css b/browser/components/securitylevel/content/securityLevelPanel.css
new file mode 100644
index 000000000000..70022e2bd4b2
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPanel.css
@@ -0,0 +1,82 @@
+/* Security Level CSS */
+
+panel#securityLevel-panel > .panel-arrowcontainer > .panel-arrowcontent {
+ padding: 0;
+}
+
+panelview#securityLevel-panelview {
+ width: 20em;
+}
+
+panelview#securityLevel-panelview>vbox.panel-subview-body {
+ padding: 1em;
+}
+
+label#securityLevel-header {
+ text-transform: uppercase;
+ color: var(--panel-disabled-color);
+ font-size: 0.85em;
+ margin: 0 0 0.4em 0;
+ padding: 0;
+}
+
+hbox#securityLevel-levelHbox {
+ margin-bottom: 1em;
+}
+
+label#securityLevel-level {
+ font-size: 1.5em;
+ margin: 0 0.5em 0 0;
+ padding: 0;
+}
+
+label#securityLevel-customWarning {
+ border-radius: 2px;
+ background-color: #ffe845;
+ text-transform: uppercase;
+ font-weight: bolder;
+ font-size: 0.8em;
+ height: 1em;
+ line-height: 1em;
+ vertical-align: middle;
+ margin: auto;
+ padding: 0.4em;
+}
+
+panelview#securityLevel-panelview description {
+ margin: 0 -0.5em 0.5em 0;
+ padding: 0 !important;
+}
+
+label#securityLevel-learnMore {
+ margin: 0 0 1.0em 0;
+ padding: 0;
+}
+
+panelview#securityLevel-panelview button {
+ -moz-appearance: none;
+ background-color: var(--arrowpanel-dimmed);
+}
+
+panelview#securityLevel-panelview button:hover {
+ background-color: var(--arrowpanel-dimmed-further);
+}
+
+panelview#securityLevel-panelview button:active {
+ background-color: var(--arrowpanel-dimmed-even-further);
+}
+
+button#securityLevel-restoreDefaults {
+ margin: 0 0 1.0em 0;
+ padding: 0.45em;
+ color: inherit !important;
+}
+
+button#securityLevel-advancedSecuritySettings {
+ margin: 0 -1.0em -1.0em -1.0em;
+ border-radius: 0;
+ border-top: 1px solid var(--panel-separator-color);
+ padding: 0;
+ height: 3.0em;
+ color: inherit !important;
+}
diff --git a/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml b/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
new file mode 100644
index 000000000000..4abbb12dd856
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPanel.inc.xhtml
@@ -0,0 +1,38 @@
+<panel id="securityLevel-panel"
+ role="group"
+ type="arrow"
+ orient="vertical"
+ level="top"
+ hidden="true"
+ class="panel-no-padding"
+ onpopupshown="SecurityLevelPanel.onPopupShown(event);"
+ onpopuphidden="SecurityLevelPanel.onPopupHidden(event);"
+ >
+ <panelmultiview mainViewId="securityLevel-panelview">
+ <panelview id="securityLevel-panelview" descriptionheightworkaround="true">
+ <vbox class="panel-subview-body">
+ <label id="securityLevel-header"/>
+ <hbox id="securityLevel-levelHbox">
+ <label id="securityLevel-level"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description id="securityLevel-summary"/>
+ <label
+ id="securityLevel-learnMore"
+ class="learnMore text-link"
+ onclick="SecurityLevelPanel.hide();"
+ is="text-link"/>
+ <button
+ id="securityLevel-restoreDefaults"
+ oncommand="SecurityLevelPanel.restoreDefaults();"/>
+ <button
+ id="securityLevel-advancedSecuritySettings"
+ oncommand="SecurityLevelPanel.openAdvancedSecuritySettings();"/>
+ </vbox>
+ </panelview>
+ </panelmultiview>
+</panel>
diff --git a/browser/components/securitylevel/content/securityLevelPreferences.css b/browser/components/securitylevel/content/securityLevelPreferences.css
new file mode 100644
index 000000000000..0d1040d177d8
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPreferences.css
@@ -0,0 +1,26 @@
+label#securityLevel-customWarning {
+ border-radius: 2px;
+ background-color: #ffe845;
+ text-transform: uppercase;
+ font-weight: bolder;
+ font-size: 0.7em;
+ height: 1em;
+ line-height: 1em;
+ padding: 0.35em;
+}
+
+radiogroup#securityLevel-radiogroup radio {
+ font-weight: bold;
+}
+
+vbox#securityLevel-vbox-standard,
+vbox#securityLevel-vbox-safer,
+vbox#securityLevel-vbox-safest {
+ margin-top: 0.4em;
+}
+
+vbox#securityLevel-vbox-standard description.indent,
+vbox#securityLevel-vbox-safer description.indent,
+vbox#securityLevel-vbox-safest description.indent {
+ margin-inline-start: 0 !important;
+}
diff --git a/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml b/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
new file mode 100644
index 000000000000..a108d44a7b51
--- /dev/null
+++ b/browser/components/securitylevel/content/securityLevelPreferences.inc.xhtml
@@ -0,0 +1,62 @@
+<groupbox id="securityLevel-groupbox" data-category="panePrivacy" hidden="true">
+ <label><html:h2 id="securityLevel-header"/></label>
+ <vbox data-subcategory="securitylevel" flex="1">
+ <description flex="1">
+ <html:span id="securityLevel-overview" class="tail-with-learn-more"/>
+ <label id="securityLevel-learnMore" class="learnMore text-link" is="text-link"/>
+ </description>
+ <radiogroup id="securityLevel-radiogroup">
+ <vbox id="securityLevel-vbox-standard">
+ <hbox>
+ <radio value="standard"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ </vbox>
+ <vbox id="securityLevel-vbox-safer">
+ <hbox>
+ <radio value="safer"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ <description id="securityLevel-description1" class="indent tip-caption"/>
+ <description id="securityLevel-description2" class="indent tip-caption"/>
+ <description id="securityLevel-description3" class="indent tip-caption"/>
+ </vbox>
+ <vbox id="securityLevel-vbox-safest">
+ <hbox>
+ <radio value="safest"/>
+ <vbox>
+ <spacer flex="1"/>
+ <label id="securityLevel-customWarning"/>
+ <spacer flex="1"/>
+ </vbox>
+ </hbox>
+ <description flex="1">
+ <html:span id="securityLevel-summary" class="tail-with-learn-more"/>
+ <label id="securityLevel-restoreDefaults"
+ class="learnMore text-link"/>
+ </description>
+ <description id="securityLevel-description1" class="indent tip-caption"/>
+ <description id="securityLevel-description2" class="indent tip-caption"/>
+ <description id="securityLevel-description3" class="indent tip-caption"/>
+ </vbox>
+ </radiogroup>
+ </vbox>
+</groupbox>
diff --git a/browser/components/securitylevel/jar.mn b/browser/components/securitylevel/jar.mn
new file mode 100644
index 000000000000..9ac408083fbc
--- /dev/null
+++ b/browser/components/securitylevel/jar.mn
@@ -0,0 +1,6 @@
+browser.jar:
+ content/browser/securitylevel/securityLevel.js (content/securityLevel.js)
+ content/browser/securitylevel/securityLevelPanel.css (content/securityLevelPanel.css)
+ content/browser/securitylevel/securityLevelButton.css (content/securityLevelButton.css)
+ content/browser/securitylevel/securityLevelPreferences.css (content/securityLevelPreferences.css)
+ content/browser/securitylevel/securityLevelButton.svg (content/securityLevelButton.svg)
diff --git a/browser/components/securitylevel/moz.build b/browser/components/securitylevel/moz.build
new file mode 100644
index 000000000000..2661ad7cb9f3
--- /dev/null
+++ b/browser/components/securitylevel/moz.build
@@ -0,0 +1 @@
+JAR_MANIFESTS += ["jar.mn"]
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 16285: Exclude ClearKey system for now
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 8f812da889efe87dd571ab07bb303fb13946678a
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon May 22 12:44:40 2017 +0000
Bug 16285: Exclude ClearKey system for now
In the past the ClearKey system had not been compiled when specifying
--disable-eme. But that changed and it is even bundled nowadays (see:
Mozilla's bug 1300654). We don't want to ship it right now as the use
case for it is not really visible while the code had security
vulnerabilities in the past.
---
browser/installer/package-manifest.in | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 667da5835b9b..b752f985c4c2 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -473,8 +473,8 @@ bin/libfreebl_64int_3.so
#endif
; media
-@RESPATH@/gmp-clearkey/0.1/@DLL_PREFIX@clearkey@DLL_SUFFIX@
-@RESPATH@/gmp-clearkey/0.1/manifest.json
+;@RESPATH@/gmp-clearkey/0.1/@DLL_PREFIX@clearkey@DLL_SUFFIX@
+;@RESPATH@/gmp-clearkey/0.1/manifest.json
#ifdef MOZ_DMD
; DMD
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 16940: After update, load local change notes.
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 26673c0a0a20dd732a94be5f3699346e5cb26fed
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Nov 25 11:36:20 2015 -0500
Bug 16940: After update, load local change notes.
Add an about:tbupdate page that displays the first section from
TorBrowser/Docs/ChangeLog.txt and includes a link to the remote
post-update page (typically our blog entry for the release).
Always load about:tbupdate in a content process, but implement the
code that reads the file system (changelog) in the chrome process
for compatibility with future sandboxing efforts.
Also fix bug 29440. Now about:tbupdate is styled as a fairly simple
changelog page that is designed to be displayed via a link that is on
about:tor.
---
browser/actors/AboutTBUpdateChild.jsm | 12 +++
browser/actors/AboutTBUpdateParent.jsm | 120 +++++++++++++++++++++
browser/actors/moz.build | 6 ++
.../base/content/abouttbupdate/aboutTBUpdate.css | 74 +++++++++++++
.../base/content/abouttbupdate/aboutTBUpdate.js | 27 +++++
.../base/content/abouttbupdate/aboutTBUpdate.xhtml | 39 +++++++
browser/base/content/browser-siteIdentity.js | 2 +-
browser/base/content/browser.js | 4 +
browser/base/jar.mn | 5 +
browser/components/BrowserContentHandler.jsm | 55 +++++++---
browser/components/BrowserGlue.jsm | 15 +++
browser/components/about/AboutRedirector.cpp | 6 ++
browser/components/about/components.conf | 3 +
browser/components/moz.build | 5 +-
.../locales/en-US/chrome/browser/aboutTBUpdate.dtd | 8 ++
browser/locales/jar.mn | 3 +
toolkit/modules/RemotePageAccessManager.jsm | 5 +
17 files changed, 373 insertions(+), 16 deletions(-)
diff --git a/browser/actors/AboutTBUpdateChild.jsm b/browser/actors/AboutTBUpdateChild.jsm
new file mode 100644
index 000000000000..4670da19b3db
--- /dev/null
+++ b/browser/actors/AboutTBUpdateChild.jsm
@@ -0,0 +1,12 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+// See LICENSE for licensing information.
+//
+// vim: set sw=2 sts=2 ts=8 et syntax=javascript:
+
+var EXPORTED_SYMBOLS = ["AboutTBUpdateChild"];
+
+const { RemotePageChild } = ChromeUtils.import(
+ "resource://gre/actors/RemotePageChild.jsm"
+);
+
+class AboutTBUpdateChild extends RemotePageChild {}
diff --git a/browser/actors/AboutTBUpdateParent.jsm b/browser/actors/AboutTBUpdateParent.jsm
new file mode 100644
index 000000000000..56a10394565a
--- /dev/null
+++ b/browser/actors/AboutTBUpdateParent.jsm
@@ -0,0 +1,120 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+// See LICENSE for licensing information.
+//
+// vim: set sw=2 sts=2 ts=8 et syntax=javascript:
+
+"use strict";
+
+this.EXPORTED_SYMBOLS = ["AboutTBUpdateParent"];
+
+const { Services } = ChromeUtils.import("resource://gre/modules/Services.jsm");
+const { NetUtil } = ChromeUtils.import("resource://gre/modules/NetUtil.jsm");
+const { AppConstants } = ChromeUtils.import(
+ "resource://gre/modules/AppConstants.jsm"
+);
+
+const kRequestUpdateMessageName = "FetchUpdateData";
+
+/**
+ * This code provides services to the about:tbupdate page. Whenever
+ * about:tbupdate needs to do something chrome-privileged, it sends a
+ * message that's handled here. It is modeled after Mozilla's about:home
+ * implementation.
+ */
+class AboutTBUpdateParent extends JSWindowActorParent {
+ receiveMessage(aMessage) {
+ if (aMessage.name == kRequestUpdateMessageName) {
+ return this.releaseNoteInfo;
+ }
+ return undefined;
+ }
+
+ get moreInfoURL() {
+ try {
+ return Services.prefs.getCharPref("torbrowser.post_update.url");
+ } catch (e) {}
+
+ // Use the default URL as a fallback.
+ return Services.urlFormatter.formatURLPref("startup.homepage_override_url");
+ }
+
+ // Read the text from the beginning of the changelog file that is located
+ // at TorBrowser/Docs/ChangeLog.txt and return an object that contains
+ // the following properties:
+ // version e.g., Tor Browser 8.5
+ // releaseDate e.g., March 31 2019
+ // releaseNotes details of changes (lines 2 - end of ChangeLog.txt)
+ // We attempt to parse the first line of ChangeLog.txt to extract the
+ // version and releaseDate. If parsing fails, we return the entire first
+ // line in version and omit releaseDate.
+ //
+ // On Mac OS, when building with --enable-tor-browser-data-outside-app-dir
+ // to support Gatekeeper signing, the ChangeLog.txt file is located in
+ // TorBrowser.app/Contents/Resources/TorBrowser/Docs/.
+ get releaseNoteInfo() {
+ let info = { moreInfoURL: this.moreInfoURL };
+
+ try {
+ let f;
+ if (AppConstants.TOR_BROWSER_DATA_OUTSIDE_APP_DIR) {
+ // "XREExeF".parent is the directory that contains firefox, i.e.,
+ // Browser/ or, on Mac OS, TorBrowser.app/Contents/MacOS/.
+ f = Services.dirsvc.get("XREExeF", Ci.nsIFile).parent;
+ if (AppConstants.platform === "macosx") {
+ f = f.parent;
+ f.append("Resources");
+ }
+ f.append("TorBrowser");
+ } else {
+ // "DefProfRt" is .../TorBrowser/Data/Browser
+ f = Services.dirsvc.get("DefProfRt", Ci.nsIFile);
+ f = f.parent.parent; // Remove "Data/Browser"
+ }
+
+ f.append("Docs");
+ f.append("ChangeLog.txt");
+
+ let fs = Cc["@mozilla.org/network/file-input-stream;1"].createInstance(
+ Ci.nsIFileInputStream
+ );
+ fs.init(f, -1, 0, 0);
+ let s = NetUtil.readInputStreamToString(fs, fs.available());
+ fs.close();
+
+ // Truncate at the first empty line.
+ s = s.replace(/[\r\n][\r\n][\s\S]*$/m, "");
+
+ // Split into first line (version plus releaseDate) and
+ // remainder (releaseNotes).
+ // This first match() uses multiline mode with two capture groups:
+ // first line: (.*$)
+ // remaining lines: ([\s\S]+)
+ // [\s\S] matches all characters including end of line. This trick
+ // is needed because when using JavaScript regex in multiline mode,
+ // . does not match an end of line character.
+ let matchArray = s.match(/(.*$)\s*([\s\S]+)/m);
+ if (matchArray && matchArray.length == 3) {
+ info.releaseNotes = matchArray[2];
+ let line1 = matchArray[1];
+ // Extract the version and releaseDate. The first line looks like:
+ // Tor Browser 8.5 -- May 1 2019
+ // The regex uses two capture groups:
+ // text that does not include a hyphen: (^[^-]*)
+ // remaining text: (.*$)
+ // In between we match optional whitespace, one or more hyphens, and
+ // optional whitespace by using: \s*-+\s*
+ matchArray = line1.match(/(^[^-]*)\s*-+\s*(.*$)/);
+ if (matchArray && matchArray.length == 3) {
+ info.version = matchArray[1];
+ info.releaseDate = matchArray[2];
+ } else {
+ info.version = line1; // Match failed: return entire line in version.
+ }
+ } else {
+ info.releaseNotes = s; // Only one line: use as releaseNotes.
+ }
+ } catch (e) {}
+
+ return info;
+ }
+}
diff --git a/browser/actors/moz.build b/browser/actors/moz.build
index 5118f85caf54..f731ee9b851b 100644
--- a/browser/actors/moz.build
+++ b/browser/actors/moz.build
@@ -89,3 +89,9 @@ FINAL_TARGET_FILES.actors += [
"WebRTCChild.jsm",
"WebRTCParent.jsm",
]
+
+if CONFIG["TOR_BROWSER_UPDATE"]:
+ FINAL_TARGET_FILES.actors += [
+ "AboutTBUpdateChild.jsm",
+ "AboutTBUpdateParent.jsm",
+ ]
diff --git a/browser/base/content/abouttbupdate/aboutTBUpdate.css b/browser/base/content/abouttbupdate/aboutTBUpdate.css
new file mode 100644
index 000000000000..7c1a34b77f17
--- /dev/null
+++ b/browser/base/content/abouttbupdate/aboutTBUpdate.css
@@ -0,0 +1,74 @@
+/*
+ * Copyright (c) 2019, The Tor Project, Inc.
+ * See LICENSE for licensing information.
+ *
+ * vim: set sw=2 sts=2 ts=8 et syntax=css:
+ */
+
+:root {
+ --abouttor-text-color: white;
+ --abouttor-bg-toron-color: #420C5D;
+}
+
+body {
+ font-family: Helvetica, Arial, sans-serif;
+ color: var(--abouttor-text-color);
+ background-color: var(--abouttor-bg-toron-color);
+ background-attachment: fixed;
+ background-size: 100% 100%;
+}
+
+a {
+ color: var(--abouttor-text-color);
+}
+
+.two-column-grid {
+ display: inline-grid;
+ grid-template-columns: auto auto;
+ grid-column-gap: 50px;
+ margin: 10px 0px 0px 50px;
+}
+
+.two-column-grid div {
+ margin-top: 40px;
+ align-self: baseline; /* Align baseline of text across the row. */
+}
+
+.label-column {
+ font-size: 14px;
+ font-weight: 400;
+}
+
+/*
+ * Use a reduced top margin to bring the row that contains the
+ * "visit our website" link closer to the row that precedes it. This
+ * looks better because the "visit our website" row does not have a
+ * label in the left column.
+ */
+div.more-info-row {
+ margin-top: 5px;
+ font-size: 14px;
+}
+
+#version-content {
+ font-size: 50px;
+ font-weight: 300;
+}
+
+body:not([havereleasedate]) .release-date-cell {
+ display: none;
+}
+
+#releasedate-content {
+ font-size: 17px;
+}
+
+#releasenotes-label {
+ align-self: start; /* Anchor "Release Notes" label at the top. */
+}
+
+#releasenotes-content {
+ font-family: monospace;
+ font-size: 15px;
+ white-space: pre;
+}
diff --git a/browser/base/content/abouttbupdate/aboutTBUpdate.js b/browser/base/content/abouttbupdate/aboutTBUpdate.js
new file mode 100644
index 000000000000..ec070e2cb131
--- /dev/null
+++ b/browser/base/content/abouttbupdate/aboutTBUpdate.js
@@ -0,0 +1,27 @@
+// Copyright (c) 2020, The Tor Project, Inc.
+// See LICENSE for licensing information.
+//
+// vim: set sw=2 sts=2 ts=8 et syntax=javascript:
+
+/* eslint-env mozilla/frame-script */
+
+// aData may contain the following string properties:
+// version
+// releaseDate
+// moreInfoURL
+// releaseNotes
+function onUpdate(aData) {
+ document.getElementById("version-content").textContent = aData.version;
+ if (aData.releaseDate) {
+ document.body.setAttribute("havereleasedate", "true");
+ document.getElementById("releasedate-content").textContent =
+ aData.releaseDate;
+ }
+ if (aData.moreInfoURL) {
+ document.getElementById("infolink").setAttribute("href", aData.moreInfoURL);
+ }
+ document.getElementById("releasenotes-content").textContent =
+ aData.releaseNotes;
+}
+
+RPMSendQuery("FetchUpdateData").then(onUpdate);
diff --git a/browser/base/content/abouttbupdate/aboutTBUpdate.xhtml b/browser/base/content/abouttbupdate/aboutTBUpdate.xhtml
new file mode 100644
index 000000000000..8489cfef5083
--- /dev/null
+++ b/browser/base/content/abouttbupdate/aboutTBUpdate.xhtml
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<!DOCTYPE html [
+ <!ENTITY % htmlDTD
+ PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
+ "DTD/xhtml1-strict.dtd">
+ %htmlDTD;
+ <!ENTITY % globalDTD SYSTEM "chrome://global/locale/global.dtd">
+ %globalDTD;
+ <!ENTITY % tbUpdateDTD SYSTEM "chrome://browser/locale/aboutTBUpdate.dtd">
+ %tbUpdateDTD;
+]>
+
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+ <meta http-equiv="Content-Security-Policy" content="default-src chrome:; object-src 'none'" />
+ <title>&aboutTBUpdate.changelogTitle;</title>
+ <link rel="stylesheet" type="text/css"
+ href="chrome://browser/content/abouttbupdate/aboutTBUpdate.css"/>
+ <script src="chrome://browser/content/abouttbupdate/aboutTBUpdate.js"
+ type="text/javascript"/>
+</head>
+<body dir="&locale.dir;">
+<div class="two-column-grid">
+ <div class="label-column">&aboutTBUpdate.version;</div>
+ <div id="version-content"/>
+
+ <div class="label-column release-date-cell">&aboutTBUpdate.releaseDate;</div>
+ <div id="releasedate-content" class="release-date-cell"/>
+
+ <div class="more-info-row"/>
+ <div class="more-info-row">&aboutTBUpdate.linkPrefix;<a id="infolink">&aboutTBUpdate.linkLabel;</a>&aboutTBUpdate.linkSuffix;</div>
+
+ <div id="releasenotes-label"
+ class="label-column">&aboutTBUpdate.releaseNotes;</div>
+ <div id="releasenotes-content"></div>
+</div>
+</body>
+</html>
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 0cffd607a3de..c17d6c76394b 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -57,7 +57,7 @@ var gIdentityHandler = {
* RegExp used to decide if an about url should be shown as being part of
* the browser UI.
*/
- _secureInternalPages: /^(?:accounts|addons|cache|certificate|config|crashes|downloads|license|logins|preferences|protections|rights|sessionrestore|support|welcomeback|ion)(?:[?#]|$)/i,
+ _secureInternalPages: (AppConstants.TOR_BROWSER_UPDATE ? /^(?:accounts|addons|cache|certificate|config|crashes|downloads|license|logins|preferences|protections|rights|sessionrestore|support|welcomeback|ion|tor|tbupdate)(?:[?#]|$)/i : /^(?:accounts|addons|cache|certificate|config|crashes|downloads|license|logins|preferences|protections|rights|sessionrestore|support|welcomeback|ion|tor)(?:[?#]|$)/i),
/**
* Whether the established HTTPS connection is considered "broken".
diff --git a/browser/base/content/browser.js b/browser/base/content/browser.js
index ef46b0ff81cb..56537664068a 100644
--- a/browser/base/content/browser.js
+++ b/browser/base/content/browser.js
@@ -719,6 +719,10 @@ var gInitialPages = [
"about:newinstall",
];
+if (AppConstants.TOR_BROWSER_UPDATE) {
+ gInitialPages.push("about:tbupdate");
+}
+
function isInitialPage(url) {
if (!(url instanceof Ci.nsIURI)) {
try {
diff --git a/browser/base/jar.mn b/browser/base/jar.mn
index 26e70f4f4104..c52edab9cd18 100644
--- a/browser/base/jar.mn
+++ b/browser/base/jar.mn
@@ -31,6 +31,11 @@ browser.jar:
content/browser/aboutTabCrashed.css (content/aboutTabCrashed.css)
content/browser/aboutTabCrashed.js (content/aboutTabCrashed.js)
content/browser/aboutTabCrashed.xhtml (content/aboutTabCrashed.xhtml)
+#ifdef TOR_BROWSER_UPDATE
+ content/browser/abouttbupdate/aboutTBUpdate.xhtml (content/abouttbupdate/aboutTBUpdate.xhtml)
+ content/browser/abouttbupdate/aboutTBUpdate.js (content/abouttbupdate/aboutTBUpdate.js)
+ content/browser/abouttbupdate/aboutTBUpdate.css (content/abouttbupdate/aboutTBUpdate.css)
+#endif
* content/browser/browser.css (content/browser.css)
content/browser/browser.js (content/browser.js)
* content/browser/browser.xhtml (content/browser.xhtml)
diff --git a/browser/components/BrowserContentHandler.jsm b/browser/components/BrowserContentHandler.jsm
index 0a37ca088ca0..ab63c16087f0 100644
--- a/browser/components/BrowserContentHandler.jsm
+++ b/browser/components/BrowserContentHandler.jsm
@@ -652,6 +652,23 @@ nsBrowserContentHandler.prototype = {
}
}
+ // Retrieve the home page early so we can compare it against about:tor
+ // to decide whether or not we need an override page (second tab) after
+ // an update was applied.
+ var startPage = "";
+ try {
+ var choice = prefb.getIntPref("browser.startup.page");
+ if (choice == 1 || choice == 3) {
+ startPage = HomePage.get();
+ }
+ } catch (e) {
+ Cu.reportError(e);
+ }
+
+ if (startPage == "about:blank") {
+ startPage = "";
+ }
+
var override;
var overridePage = "";
var additionalPage = "";
@@ -703,6 +720,16 @@ nsBrowserContentHandler.prototype = {
// into account because that requires waiting for the session file
// to be read. If a crash occurs after updating, before restarting,
// we may open the startPage in addition to restoring the session.
+ //
+ // Tor Browser: Instead of opening the post-update "override page"
+ // directly, we ensure that about:tor will be opened in a special
+ // mode that notifies the user that their browser was updated.
+ // The about:tor page will provide a link to the override page
+ // where the user can learn more about the update, as well as a
+ // link to the Tor Browser changelog page (about:tbupdate). The
+ // override page URL comes from the openURL attribute within the
+ // updates.xml file or, if no showURL action is present, from the
+ // startup.homepage_override_url pref.
willRestoreSession = SessionStartup.isAutomaticRestoreEnabled();
overridePage = Services.urlFormatter.formatURLPref(
@@ -722,6 +749,20 @@ nsBrowserContentHandler.prototype = {
overridePage = overridePage.replace("%OLD_VERSION%", old_mstone);
overridePage = overridePage.replace("%OLD_TOR_BROWSER_VERSION%",
old_tbversion);
+#ifdef TOR_BROWSER_UPDATE
+ if (overridePage)
+ {
+ prefb.setCharPref("torbrowser.post_update.url", overridePage);
+ prefb.setBoolPref("torbrowser.post_update.shouldNotify", true);
+ // If the user's homepage is about:tor, we will inform them
+ // about the update on that page; otherwise, we arrange to
+ // open about:tor in a secondary tab.
+ if (startPage === "about:tor")
+ overridePage = "";
+ else
+ overridePage = "about:tor";
+ }
+#endif
break;
case OVERRIDE_NEW_BUILD_ID:
if (UpdateManager.readyUpdate) {
@@ -794,20 +835,6 @@ nsBrowserContentHandler.prototype = {
}
}
- var startPage = "";
- try {
- var choice = prefb.getIntPref("browser.startup.page");
- if (choice == 1 || choice == 3) {
- startPage = HomePage.get();
- }
- } catch (e) {
- Cu.reportError(e);
- }
-
- if (startPage == "about:blank") {
- startPage = "";
- }
-
let skipStartPage =
(override == OVERRIDE_NEW_PROFILE ||
override == OVERRIDE_ALTERNATE_PROFILE) &&
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 3ef1e1453591..29f2b7328f6b 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -750,6 +750,21 @@ let JSWINDOWACTORS = {
},
};
+if (AppConstants.TOR_BROWSER_UPDATE) {
+ JSWINDOWACTORS["AboutTBUpdate"] = {
+ parent: {
+ moduleURI: "resource:///actors/AboutTBUpdateParent.jsm",
+ },
+ child: {
+ moduleURI: "resource:///actors/AboutTBUpdateChild.jsm",
+ events: {
+ DOMWindowCreated: { capture: true },
+ },
+ },
+ matches: ["about:tbupdate"],
+ };
+}
+
(function earlyBlankFirstPaint() {
let startTime = Cu.now();
if (
diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp
index e3ff9023ca9f..85bd42d67263 100644
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -128,6 +128,12 @@ static const RedirEntry kRedirMap[] = {
nsIAboutModule::URI_CAN_LOAD_IN_PRIVILEGEDABOUT_PROCESS},
{"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 |
+ nsIAboutModule::URI_MUST_LOAD_IN_CHILD | nsIAboutModule::ALLOW_SCRIPT |
+ nsIAboutModule::HIDE_FROM_ABOUTABOUT},
+#endif
};
static nsAutoCString GetAboutModuleName(nsIURI* aURI) {
diff --git a/browser/components/about/components.conf b/browser/components/about/components.conf
index 274eee9c384e..b6d013df3fbc 100644
--- a/browser/components/about/components.conf
+++ b/browser/components/about/components.conf
@@ -32,6 +32,9 @@ pages = [
'welcomeback',
]
+if defined('TOR_BROWSER_UPDATE'):
+ pages.append('tbupdate')
+
Classes = [
{
'cid': '{7e4bb6ad-2fc4-4dc6-89ef-23e8e5ccf980}',
diff --git a/browser/components/moz.build b/browser/components/moz.build
index d16b27b1eaa3..1e977cfe5499 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -87,11 +87,14 @@ EXTRA_COMPONENTS += [
]
EXTRA_JS_MODULES += [
- "BrowserContentHandler.jsm",
"BrowserGlue.jsm",
"distribution.js",
]
+EXTRA_PP_JS_MODULES += [
+ "BrowserContentHandler.jsm",
+]
+
BROWSER_CHROME_MANIFESTS += [
"safebrowsing/content/test/browser.ini",
"tests/browser/browser.ini",
diff --git a/browser/locales/en-US/chrome/browser/aboutTBUpdate.dtd b/browser/locales/en-US/chrome/browser/aboutTBUpdate.dtd
new file mode 100644
index 000000000000..2d1e59b40eaf
--- /dev/null
+++ b/browser/locales/en-US/chrome/browser/aboutTBUpdate.dtd
@@ -0,0 +1,8 @@
+<!ENTITY aboutTBUpdate.changelogTitle "Tor Browser Changelog">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.version "Version">
+<!ENTITY aboutTBUpdate.releaseDate "Release Date">
+<!ENTITY aboutTBUpdate.releaseNotes "Release Notes">
diff --git a/browser/locales/jar.mn b/browser/locales/jar.mn
index 6000f3b48c01..2aecae56bdca 100644
--- a/browser/locales/jar.mn
+++ b/browser/locales/jar.mn
@@ -20,6 +20,9 @@
locale/browser/accounts.properties (%chrome/browser/accounts.properties)
locale/browser/app-extension-fields.properties (%chrome/browser/app-extension-fields.properties)
+#ifdef TOR_BROWSER_UPDATE
+ locale/browser/aboutTBUpdate.dtd (%chrome/browser/aboutTBUpdate.dtd)
+#endif
locale/browser/browser.dtd (%chrome/browser/browser.dtd)
locale/browser/browser.properties (%chrome/browser/browser.properties)
locale/browser/customizableui/customizableWidgets.properties (%chrome/browser/customizableui/customizableWidgets.properties)
diff --git a/toolkit/modules/RemotePageAccessManager.jsm b/toolkit/modules/RemotePageAccessManager.jsm
index 5d9dfd864747..058052cdbf0e 100644
--- a/toolkit/modules/RemotePageAccessManager.jsm
+++ b/toolkit/modules/RemotePageAccessManager.jsm
@@ -205,6 +205,11 @@ let RemotePageAccessManager = {
RPMAddMessageListener: ["*"],
RPMRemoveMessageListener: ["*"],
},
+ "about:tbupdate": {
+ RPMSendQuery: [
+ "FetchUpdateData",
+ ],
+ },
},
/**
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 23104: Add a default line height compensation
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit d49bafb748de41431f6e8d26ae3117202e2fa9dd
Author: Igor Oliveira <igor.oliveira(a)posteo.net>
Date: Sun Dec 10 18:16:59 2017 -0200
Bug 23104: Add a default line height compensation
Many fonts have issues with their vertical metrics. they
are used to influence the height of ascenders and depth
of descenders. Gecko uses it to calculate the line height
(font height + ascender + descender), however because of
that idiosyncratic behavior across multiple operating
systems, it can be used to identify the user's OS.
The solution proposed in the patch uses a default factor
to be multiplied with the font size, simulating the concept
of ascender and descender. This way all operating
systems will have the same line height only and only if the
frame is outside the chrome.
---
layout/generic/ReflowInput.cpp | 19 +++++++++---
layout/generic/test/mochitest.ini | 1 +
layout/generic/test/test_tor_bug23104.html | 50 ++++++++++++++++++++++++++++++
3 files changed, 65 insertions(+), 5 deletions(-)
diff --git a/layout/generic/ReflowInput.cpp b/layout/generic/ReflowInput.cpp
index 4ab0a5d0ecb7..61d303e95438 100644
--- a/layout/generic/ReflowInput.cpp
+++ b/layout/generic/ReflowInput.cpp
@@ -31,6 +31,7 @@
#include "mozilla/SVGUtils.h"
#include "mozilla/dom/HTMLInputElement.h"
#include "nsGridContainerFrame.h"
+#include "nsContentUtils.h"
using namespace mozilla;
using namespace mozilla::css;
@@ -2651,7 +2652,8 @@ void ReflowInput::CalculateBlockSideMargins() {
// For risk management, we use preference to control the behavior, and
// eNoExternalLeading is the old behavior.
-static nscoord GetNormalLineHeight(nsFontMetrics* aFontMetrics) {
+static nscoord GetNormalLineHeight(nsIContent* aContent,
+ nsFontMetrics* aFontMetrics) {
MOZ_ASSERT(nullptr != aFontMetrics, "no font metrics");
nscoord normalLineHeight;
@@ -2659,6 +2661,12 @@ static nscoord GetNormalLineHeight(nsFontMetrics* aFontMetrics) {
nscoord externalLeading = aFontMetrics->ExternalLeading();
nscoord internalLeading = aFontMetrics->InternalLeading();
nscoord emHeight = aFontMetrics->EmHeight();
+
+ if (nsContentUtils::ShouldResistFingerprinting() &&
+ !aContent->IsInChromeDocument()) {
+ return NSToCoordRound(emHeight * NORMAL_LINE_HEIGHT_FACTOR);
+ }
+
switch (GetNormalLineHeightCalcControl()) {
case eIncludeExternalLeading:
normalLineHeight = emHeight + internalLeading + externalLeading;
@@ -2676,7 +2684,8 @@ static nscoord GetNormalLineHeight(nsFontMetrics* aFontMetrics) {
return normalLineHeight;
}
-static inline nscoord ComputeLineHeight(ComputedStyle* aComputedStyle,
+static inline nscoord ComputeLineHeight(nsIContent* aContent,
+ ComputedStyle* aComputedStyle,
nsPresContext* aPresContext,
nscoord aBlockBSize,
float aFontSizeInflation) {
@@ -2705,7 +2714,7 @@ static inline nscoord ComputeLineHeight(ComputedStyle* aComputedStyle,
RefPtr<nsFontMetrics> fm = nsLayoutUtils::GetFontMetricsForComputedStyle(
aComputedStyle, aPresContext, aFontSizeInflation);
- return GetNormalLineHeight(fm);
+ return GetNormalLineHeight(aContent, fm);
}
nscoord ReflowInput::CalcLineHeight() const {
@@ -2727,7 +2736,7 @@ nscoord ReflowInput::CalcLineHeight(nsIContent* aContent,
float aFontSizeInflation) {
MOZ_ASSERT(aComputedStyle, "Must have a ComputedStyle");
- nscoord lineHeight = ComputeLineHeight(aComputedStyle, aPresContext,
+ nscoord lineHeight = ComputeLineHeight(aContent, aComputedStyle, aPresContext,
aBlockBSize, aFontSizeInflation);
NS_ASSERTION(lineHeight >= 0, "ComputeLineHeight screwed up");
@@ -2740,7 +2749,7 @@ nscoord ReflowInput::CalcLineHeight(nsIContent* aContent,
if (!lh.IsNormal()) {
RefPtr<nsFontMetrics> fm = nsLayoutUtils::GetFontMetricsForComputedStyle(
aComputedStyle, aPresContext, aFontSizeInflation);
- nscoord normal = GetNormalLineHeight(fm);
+ nscoord normal = GetNormalLineHeight(aContent, fm);
if (lineHeight < normal) {
lineHeight = normal;
}
diff --git a/layout/generic/test/mochitest.ini b/layout/generic/test/mochitest.ini
index 072b11da7eb6..3c377e0781ed 100644
--- a/layout/generic/test/mochitest.ini
+++ b/layout/generic/test/mochitest.ini
@@ -145,3 +145,4 @@ skip-if = debug == true || tsan # the test is slow. tsan: bug 1612707
support-files =
file_reframe_for_lazy_load_image.html
[test_bug1655135.html]
+[test_tor_bug23104.html]
diff --git a/layout/generic/test/test_tor_bug23104.html b/layout/generic/test/test_tor_bug23104.html
new file mode 100644
index 000000000000..8ff1d2190c45
--- /dev/null
+++ b/layout/generic/test/test_tor_bug23104.html
@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<meta charset="UTF-8">
+<html>
+<head>
+ <title>Test for Tor Bug #23104: CSS line-height reveals the platform Tor browser is running</title>
+ <script type="application/javascript" src="/tests/SimpleTest/SimpleTest.js"></script>
+ <script type="application/javascript" src="/tests/SimpleTest/SpawnTask.js"></script>
+ <style type="text/css">
+ span {
+ background-color: #000;
+ color: #fff;
+ font-size: 16.5px;
+ }
+ </style>
+</head>
+<body>
+<span id="test1">Test1</span>
+<span id="test2">كلمة</span>
+<span id="test3">ação</span>
+<script>
+
+let setPref = async function (key, value) {
+ await SpecialPowers.pushPrefEnv({"set": [[key, value]]});
+}
+
+function getStyle(el, styleprop) {
+ el = document.getElementById(el);
+ return document.defaultView.getComputedStyle(el, null).getPropertyValue(styleprop);
+}
+
+function validateElement(elementName, isFingerprintResistent) {
+ var fontSize = getStyle(elementName, 'font-size');
+ var lineHeight = getStyle(elementName, 'line-height');
+ var validationCb = isFingerprintResistent ? is : isnot;
+ validationCb(parseFloat(lineHeight), Math.round(parseFloat(fontSize)) * 1.2, 'Line Height validation');
+}
+
+add_task(async function() {
+ await setPref("layout.css.line-height.normal-as-resolved-value.enabled", false);
+ for (let resistFingerprintingValue of [true, false]) {
+ await setPref("privacy.resistFingerprinting", resistFingerprintingValue);
+ for (let elementId of ['test1', 'test2', 'test3']) {
+ validateElement(elementId, resistFingerprintingValue);
+ }
+ }
+});
+
+</script>
+</body>
+</html>
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 26345: Hide tracking protection UI
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit b84225de8725f06123b2a1d7ce643ba408598ebb
Author: Alex Catarineu <acat(a)torproject.org>
Date: Tue Sep 10 16:29:31 2019 +0200
Bug 26345: Hide tracking protection UI
---
browser/base/content/browser-siteIdentity.js | 4 ++--
browser/base/content/browser.xhtml | 4 ++--
browser/components/about/AboutRedirector.cpp | 4 ----
browser/components/about/components.conf | 1 -
browser/components/moz.build | 1 -
browser/themes/shared/preferences/privacy.css | 4 ++++
6 files changed, 8 insertions(+), 10 deletions(-)
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index 370e2af9477b..4c11ea8d18f0 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -911,10 +911,10 @@ var gIdentityHandler = {
gPermissionPanel.refreshPermissionIcons();
}
- // Hide the shield icon if it is a chrome page.
+ // Bug 26345: Hide tracking protection UI.
gProtectionsHandler._trackingProtectionIconContainer.classList.toggle(
"chromeUI",
- this._isSecureInternalUI
+ true
);
},
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index f8381a5dad9e..c859d65af413 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -782,7 +782,7 @@
oncommand="gSync.toggleAccountPanel(this, event)"/>
</toolbaritem>
<toolbarseparator class="sync-ui-item"/>
- <toolbaritem>
+ <toolbaritem hidden="true">
<toolbarbutton id="appMenu-protection-report-button"
class="subviewbutton subviewbutton-iconic"
oncommand="gProtectionsHandler.openProtections(); gProtectionsHandler.recordClick('open_full_report', null, 'app_menu');">
@@ -793,7 +793,7 @@
</label>
</toolbarbutton>
</toolbaritem>
- <toolbarseparator id="appMenu-tp-separator"/>
+ <toolbarseparator hidden="true" id="appMenu-tp-separator"/>
<toolbarbutton id="appMenu-new-window-button"
class="subviewbutton subviewbutton-iconic"
label="&newNavigatorCmd.label;"
diff --git a/browser/components/about/AboutRedirector.cpp b/browser/components/about/AboutRedirector.cpp
index 85bd42d67263..179b46804a0b 100644
--- a/browser/components/about/AboutRedirector.cpp
+++ b/browser/components/about/AboutRedirector.cpp
@@ -122,10 +122,6 @@ static const RedirEntry kRedirMap[] = {
nsIAboutModule::URI_MUST_LOAD_IN_CHILD |
nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT},
- {"protections", "chrome://browser/content/protections.html",
- nsIAboutModule::URI_SAFE_FOR_UNTRUSTED_CONTENT |
- nsIAboutModule::URI_MUST_LOAD_IN_CHILD | nsIAboutModule::ALLOW_SCRIPT |
- nsIAboutModule::URI_CAN_LOAD_IN_PRIVILEGEDABOUT_PROCESS},
{"ion", "chrome://browser/content/ion.html",
nsIAboutModule::ALLOW_SCRIPT | nsIAboutModule::HIDE_FROM_ABOUTABOUT},
#ifdef TOR_BROWSER_UPDATE
diff --git a/browser/components/about/components.conf b/browser/components/about/components.conf
index b6d013df3fbc..3729b7e4bf82 100644
--- a/browser/components/about/components.conf
+++ b/browser/components/about/components.conf
@@ -20,7 +20,6 @@ pages = [
'policies',
'preferences',
'privatebrowsing',
- 'protections',
'profiling',
'reader',
'restartrequired',
diff --git a/browser/components/moz.build b/browser/components/moz.build
index 1c421b761888..ef09055b990a 100644
--- a/browser/components/moz.build
+++ b/browser/components/moz.build
@@ -46,7 +46,6 @@ DIRS += [
"preferences",
"privatebrowsing",
"prompts",
- "protections",
"protocolhandler",
"resistfingerprinting",
"search",
diff --git a/browser/themes/shared/preferences/privacy.css b/browser/themes/shared/preferences/privacy.css
index a0cedd7943c6..305692fe0f8a 100644
--- a/browser/themes/shared/preferences/privacy.css
+++ b/browser/themes/shared/preferences/privacy.css
@@ -114,6 +114,10 @@
/* Content Blocking */
+#trackingGroup {
+ display: none;
+}
+
/* Override styling that sets descriptions as grey */
#trackingGroup description.indent,
#trackingGroup .indent > description {
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 28369: Stop shipping pingsender executable
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 881f2f68658764411c49019956d05e6430376e35
Author: Alex Catarineu <acat(a)torproject.org>
Date: Wed Apr 10 17:52:51 2019 +0200
Bug 28369: Stop shipping pingsender executable
---
browser/app/macbuild/Contents/MacOS-files.in | 1 -
browser/installer/package-manifest.in | 4 ----
browser/installer/windows/nsis/shared.nsh | 1 -
python/mozbuild/mozbuild/artifacts.py | 2 --
toolkit/components/telemetry/app/TelemetrySend.jsm | 19 +------------------
toolkit/components/telemetry/moz.build | 4 ----
6 files changed, 1 insertion(+), 30 deletions(-)
diff --git a/browser/app/macbuild/Contents/MacOS-files.in b/browser/app/macbuild/Contents/MacOS-files.in
index 6f0b4481473b..6e8a1689ea19 100644
--- a/browser/app/macbuild/Contents/MacOS-files.in
+++ b/browser/app/macbuild/Contents/MacOS-files.in
@@ -17,7 +17,6 @@
#if defined(MOZ_CRASHREPORTER)
/minidump-analyzer
#endif
-/pingsender
/pk12util
/ssltunnel
/xpcshell
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 27424c5d7fcd..0754508f8693 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -452,10 +452,6 @@ bin/libfreebl_64int_3.so
@BINPATH@/minidump-analyzer@BIN_SUFFIX@
#endif
-; [ Ping Sender ]
-;
-@BINPATH@/pingsender@BIN_SUFFIX@
-
; Shutdown Terminator
@RESPATH@/components/terminator.manifest
diff --git a/browser/installer/windows/nsis/shared.nsh b/browser/installer/windows/nsis/shared.nsh
index 74e1c0c7141e..c5181b8d7ae6 100755
--- a/browser/installer/windows/nsis/shared.nsh
+++ b/browser/installer/windows/nsis/shared.nsh
@@ -1475,7 +1475,6 @@ ${RemoveDefaultBrowserAgentShortcut}
Push "crashreporter.exe"
Push "default-browser-agent.exe"
Push "minidump-analyzer.exe"
- Push "pingsender.exe"
Push "updater.exe"
Push "${FileMainEXE}"
!macroend
diff --git a/python/mozbuild/mozbuild/artifacts.py b/python/mozbuild/mozbuild/artifacts.py
index 50ca81a4aaf5..3f3454b4b7b5 100644
--- a/python/mozbuild/mozbuild/artifacts.py
+++ b/python/mozbuild/mozbuild/artifacts.py
@@ -495,7 +495,6 @@ class LinuxArtifactJob(ArtifactJob):
"{product}/{product}",
"{product}/{product}-bin",
"{product}/minidump-analyzer",
- "{product}/pingsender",
"{product}/plugin-container",
"{product}/updater",
"{product}/**/*.so",
@@ -550,7 +549,6 @@ class MacArtifactJob(ArtifactJob):
"{product}-bin",
"*.dylib",
"minidump-analyzer",
- "pingsender",
"plugin-container.app/Contents/MacOS/plugin-container",
"updater.app/Contents/MacOS/org.mozilla.updater",
# 'xpcshell',
diff --git a/toolkit/components/telemetry/app/TelemetrySend.jsm b/toolkit/components/telemetry/app/TelemetrySend.jsm
index d64da6858124..ba125ea6a459 100644
--- a/toolkit/components/telemetry/app/TelemetrySend.jsm
+++ b/toolkit/components/telemetry/app/TelemetrySend.jsm
@@ -1588,23 +1588,6 @@ var TelemetrySendImpl = {
},
runPingSender(pings, observer) {
- if (AppConstants.platform === "android") {
- throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
- }
-
- const exeName =
- AppConstants.platform === "win" ? "pingsender.exe" : "pingsender";
-
- let exe = Services.dirsvc.get("GreBinD", Ci.nsIFile);
- exe.append(exeName);
-
- let params = pings.flatMap(ping => [ping.url, ping.path]);
- let process = Cc["@mozilla.org/process/util;1"].createInstance(
- Ci.nsIProcess
- );
- process.init(exe);
- process.startHidden = true;
- process.noShell = true;
- process.runAsync(params, params.length, observer);
+ throw Components.Exception("", Cr.NS_ERROR_NOT_IMPLEMENTED);
},
};
diff --git a/toolkit/components/telemetry/moz.build b/toolkit/components/telemetry/moz.build
index 32e670b76b18..21fe4e8c71eb 100644
--- a/toolkit/components/telemetry/moz.build
+++ b/toolkit/components/telemetry/moz.build
@@ -8,10 +8,6 @@ include("/ipc/chromium/chromium-config.mozbuild")
FINAL_LIBRARY = "xul"
-DIRS = [
- "pingsender",
-]
-
DEFINES["MOZ_APP_VERSION"] = '"%s"' % CONFIG["MOZ_APP_VERSION"]
LOCAL_INCLUDES += [
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 30541: Disable WebGL readPixel() for web content
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit d40b03d3c3b234e927b69915b730a63b641309be
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed May 29 12:29:19 2019 +0000
Bug 30541: Disable WebGL readPixel() for web content
---
dom/canvas/ClientWebGLContext.cpp | 8 ++++++++
1 file changed, 8 insertions(+)
diff --git a/dom/canvas/ClientWebGLContext.cpp b/dom/canvas/ClientWebGLContext.cpp
index b940b69fd7bc..d3fe79beec38 100644
--- a/dom/canvas/ClientWebGLContext.cpp
+++ b/dom/canvas/ClientWebGLContext.cpp
@@ -4619,6 +4619,14 @@ bool ClientWebGLContext::ReadPixels_SharedPrecheck(
return false;
}
+ // Security check passed, but don't let content readPixel calls through for
+ // now, if Resist Fingerprinting Mode is enabled.
+ if (nsContentUtils::ResistFingerprinting(aCallerType)) {
+ JsWarning("readPixels: Not allowed in Resist Fingerprinting Mode");
+ out_error.Throw(NS_ERROR_DOM_NOT_SUPPORTED_ERR);
+ return false;
+ }
+
return true;
}
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 26353: Prevent speculative connect that violated FPI.
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit 261421defae697df00d44114b4e6a14f19bf31e5
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Jul 14 08:50:55 2018 -0700
Bug 26353: Prevent speculative connect that violated FPI.
Connections were observed in the catch-all circuit when
the user entered an https or http URL in the URL bar, or
typed a search term.
---
toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm b/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
index 568e70688dc4..e1adbc72bdad 100644
--- a/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
+++ b/toolkit/components/remotebrowserutils/RemoteWebNavigation.jsm
@@ -93,6 +93,9 @@ class RemoteWebNavigation {
}
uri = Services.uriFixup.getFixupURIInfo(aURI, fixupFlags).preferredURI;
+/*******************************************************************************
+ TOR BROWSER: Disable the following speculative connect until
+ we can make it properly obey first-party isolation.
// We know the url is going to be loaded, let's start requesting network
// connection before the content process asks.
@@ -116,6 +119,7 @@ class RemoteWebNavigation {
}
Services.io.speculativeConnect(uri, principal, null);
}
+*******************************************************************************/
} catch (ex) {
// Can't setup speculative connection for this uri string for some
// reason (such as failing to parse the URI), just ignore it.
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 23247: Communicating security expectations for .onion
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit ae8803aa4e0b9cba6a56c88d0021befe19517c14
Author: Richard Pospesel <richard(a)torproject.org>
Date: Fri Jun 8 13:38:40 2018 -0700
Bug 23247: Communicating security expectations for .onion
Encrypting pages hosted on Onion Services with SSL/TLS is redundant
(in terms of hiding content) as all traffic within the Tor network is
already fully encrypted. Therefore, serving HTTP pages from an Onion
Service is more or less fine.
Prior to this patch, Tor Browser would mostly treat pages delivered
via Onion Services as well as pages delivered in the ordinary fashion
over the internet in the same way. This created some inconsistencies
in behaviour and misinformation presented to the user relating to the
security of pages delivered via Onion Services:
- HTTP Onion Service pages did not have any 'lock' icon indicating
the site was secure
- HTTP Onion Service pages would be marked as unencrypted in the Page
Info screen
- Mixed-mode content restrictions did not apply to HTTP Onion Service
pages embedding Non-Onion HTTP content
This patch fixes the above issues, and also adds several new 'Onion'
icons to the mix to indicate all of the various permutations of Onion
Services hosted HTTP or HTTPS pages with HTTP or HTTPS content.
Strings for Onion Service Page Info page are pulled from Torbutton's
localization strings.
---
browser/base/content/browser-siteIdentity.js | 39 ++++++++-----
browser/base/content/pageinfo/security.js | 64 ++++++++++++++++++----
.../shared/identity-block/identity-block.inc.css | 19 +++++++
.../themes/shared/identity-block/onion-slash.svg | 5 ++
.../themes/shared/identity-block/onion-warning.svg | 6 ++
browser/themes/shared/identity-block/onion.svg | 3 +
browser/themes/shared/jar.inc.mn | 3 +
dom/base/nsContentUtils.cpp | 19 +++++++
dom/base/nsContentUtils.h | 5 ++
dom/base/nsGlobalWindowOuter.cpp | 3 +-
dom/ipc/WindowGlobalActor.cpp | 5 +-
dom/ipc/WindowGlobalChild.cpp | 6 +-
dom/security/nsMixedContentBlocker.cpp | 16 +++++-
.../modules/geckoview/GeckoViewProgress.jsm | 4 ++
security/manager/ssl/nsSecureBrowserUI.cpp | 12 ++++
15 files changed, 178 insertions(+), 31 deletions(-)
diff --git a/browser/base/content/browser-siteIdentity.js b/browser/base/content/browser-siteIdentity.js
index c17d6c76394b..370e2af9477b 100644
--- a/browser/base/content/browser-siteIdentity.js
+++ b/browser/base/content/browser-siteIdentity.js
@@ -140,6 +140,10 @@ var gIdentityHandler = {
);
},
+ get _uriIsOnionHost() {
+ return this._uriHasHost ? this._uri.host.toLowerCase().endsWith(".onion") : false;
+ },
+
get _isAboutNetErrorPage() {
return (
gBrowser.selectedBrowser.documentURI &&
@@ -735,9 +739,9 @@ var gIdentityHandler = {
get pointerlockFsWarningClassName() {
// Note that the fullscreen warning does not handle _isSecureInternalUI.
if (this._uriHasHost && this._isSecureConnection) {
- return "verifiedDomain";
+ return this._uriIsOnionHost ? "onionVerifiedDomain" : "verifiedDomain";
}
- return "unknownIdentity";
+ return this._uriIsOnionHost ? "onionUnknownIdentity" : "unknownIdentity";
},
/**
@@ -745,6 +749,10 @@ var gIdentityHandler = {
* built-in (returns false) or imported (returns true).
*/
_hasCustomRoot() {
+ if (!this._secInfo) {
+ return false;
+ }
+
let issuerCert = null;
issuerCert = this._secInfo.succeededCertChain[
this._secInfo.succeededCertChain.length - 1
@@ -787,11 +795,13 @@ var gIdentityHandler = {
"identity.extension.label",
[extensionName]
);
- } else if (this._uriHasHost && this._isSecureConnection) {
+ } else if (this._uriHasHost && this._isSecureConnection && this._secInfo) {
// This is a secure connection.
- this._identityBox.className = "verifiedDomain";
+ // _isSecureConnection implicitly includes onion services, which may not have an SSL certificate
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.className = uriIsOnionHost ? "onionVerifiedDomain" : "verifiedDomain";
if (this._isMixedActiveContentBlocked) {
- this._identityBox.classList.add("mixedActiveBlocked");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedActiveBlocked" : "mixedActiveBlocked");
}
if (!this._isCertUserOverridden) {
// It's a normal cert, verifier is the CA Org.
@@ -802,17 +812,17 @@ var gIdentityHandler = {
}
} else if (this._isBrokenConnection) {
// This is a secure connection, but something is wrong.
- this._identityBox.className = "unknownIdentity";
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.className = uriIsOnionHost ? "onionUnknownIdentity" : "unknownIdentity";
if (this._isMixedActiveContentLoaded) {
- this._identityBox.classList.add("mixedActiveContent");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedActiveContent" : "mixedActiveContent");
} else if (this._isMixedActiveContentBlocked) {
- this._identityBox.classList.add(
- "mixedDisplayContentLoadedActiveBlocked"
- );
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedDisplayContentLoadedActiveBlocked" : "mixedDisplayContentLoadedActiveBlocked");
} else if (this._isMixedPassiveContentLoaded) {
- this._identityBox.classList.add("mixedDisplayContent");
+ this._identityBox.classList.add(uriIsOnionHost ? "onionMixedDisplayContent" : "mixedDisplayContent");
} else {
+ // TODO: ignore weak https cipher for onionsites?
this._identityBox.classList.add("weakCipher");
}
} else if (this._isAboutCertErrorPage) {
@@ -825,8 +835,8 @@ var gIdentityHandler = {
// Network errors and blocked pages get a more neutral icon
this._identityBox.className = "unknownIdentity";
} else if (this._isPotentiallyTrustworthy) {
- // This is a local resource (and shouldn't be marked insecure).
- this._identityBox.className = "localResource";
+ // This is a local resource or an onion site (and shouldn't be marked insecure).
+ this._identityBox.className = this._uriIsOnionHost ? "onionUnknownIdentity" : "localResource";
} else {
// This is an insecure connection.
let warnOnInsecure =
@@ -850,7 +860,8 @@ var gIdentityHandler = {
}
if (this._isCertUserOverridden) {
- this._identityBox.classList.add("certUserOverridden");
+ const uriIsOnionHost = this._uriIsOnionHost;
+ this._identityBox.classList.add(uriIsOnionHost ? "onionCertUserOverridden" : "certUserOverridden");
// Cert is trusted because of a security exception, verifier is a special string.
tooltip = gNavigatorBundle.getString(
"identity.identified.verified_by_you"
diff --git a/browser/base/content/pageinfo/security.js b/browser/base/content/pageinfo/security.js
index 6a2d09ec8442..192e9f763700 100644
--- a/browser/base/content/pageinfo/security.js
+++ b/browser/base/content/pageinfo/security.js
@@ -22,6 +22,13 @@ ChromeUtils.defineModuleGetter(
"PluralForm",
"resource://gre/modules/PluralForm.jsm"
);
+XPCOMUtils.defineLazyGetter(
+ this,
+ "gTorButtonBundle",
+ function() {
+ return Services.strings.createBundle("chrome://torbutton/locale/torbutton.properties");
+ }
+);
var security = {
async init(uri, windowInfo) {
@@ -60,6 +67,11 @@ var security = {
(Ci.nsIWebProgressListener.STATE_LOADED_MIXED_ACTIVE_CONTENT |
Ci.nsIWebProgressListener.STATE_LOADED_MIXED_DISPLAY_CONTENT);
var isEV = ui.state & Ci.nsIWebProgressListener.STATE_IDENTITY_EV_TOPLEVEL;
+ var isOnion = false;
+ const hostName = this.windowInfo.hostName;
+ if (hostName && hostName.endsWith(".onion")) {
+ isOnion = true;
+ }
let retval = {
cAName: "",
@@ -69,6 +81,7 @@ var security = {
isBroken,
isMixed,
isEV,
+ isOnion,
cert: null,
certificateTransparency: null,
};
@@ -107,6 +120,7 @@ var security = {
isBroken,
isMixed,
isEV,
+ isOnion,
cert,
certChain: certChainArray,
certificateTransparency: undefined,
@@ -349,22 +363,50 @@ async function securityOnLoad(uri, windowInfo) {
}
msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
} else if (info.encryptionStrength > 0) {
- hdr = pkiBundle.getFormattedString(
- "pageInfo_EncryptionWithBitsAndProtocol",
- [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
- );
+ if (!info.isOnion) {
+ hdr = pkiBundle.getFormattedString(
+ "pageInfo_EncryptionWithBitsAndProtocol",
+ [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
+ );
+ } else {
+ try {
+ hdr = gTorButtonBundle.formatStringFromName(
+ "pageInfo_OnionEncryptionWithBitsAndProtocol",
+ [info.encryptionAlgorithm, info.encryptionStrength + "", info.version]
+ );
+ } catch(err) {
+ hdr = "Connection Encrypted (Onion Service, "
+ + info.encryptionAlgorithm
+ + ", "
+ + info.encryptionStrength
+ + " bit keys, "
+ + info.version
+ + ")";
+ }
+ }
msg1 = pkiBundle.getString("pageInfo_Privacy_Encrypted1");
msg2 = pkiBundle.getString("pageInfo_Privacy_Encrypted2");
} else {
- hdr = pkiBundle.getString("pageInfo_NoEncryption");
- if (windowInfo.hostName != null) {
- msg1 = pkiBundle.getFormattedString("pageInfo_Privacy_None1", [
- windowInfo.hostName,
- ]);
+ if (!info.isOnion) {
+ hdr = pkiBundle.getString("pageInfo_NoEncryption");
+ if (windowInfo.hostName != null) {
+ msg1 = pkiBundle.getFormattedString("pageInfo_Privacy_None1", [
+ windowInfo.hostName,
+ ]);
+ } else {
+ msg1 = pkiBundle.getString("pageInfo_Privacy_None4");
+ }
+ msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
} else {
- msg1 = pkiBundle.getString("pageInfo_Privacy_None4");
+ try {
+ hdr = gTorButtonBundle.GetStringFromName("pageInfo_OnionEncryption");
+ } catch (err) {
+ hdr = "Connection Encrypted (Onion Service)";
+ }
+
+ msg1 = pkiBundle.getString("pageInfo_Privacy_Encrypted1");
+ msg2 = pkiBundle.getString("pageInfo_Privacy_Encrypted2");
}
- msg2 = pkiBundle.getString("pageInfo_Privacy_None2");
}
setText("security-technical-shortform", hdr);
setText("security-technical-longform1", msg1);
diff --git a/browser/themes/shared/identity-block/identity-block.inc.css b/browser/themes/shared/identity-block/identity-block.inc.css
index 23b66d8a7747..8b5a9fa8ae82 100644
--- a/browser/themes/shared/identity-block/identity-block.inc.css
+++ b/browser/themes/shared/identity-block/identity-block.inc.css
@@ -284,6 +284,25 @@ toolbar[brighttext] #identity-box[pageproxystate="valid"].chromeUI #identity-ico
list-style-image: url(chrome://global/skin/icons/security-broken.svg);
}
+#identity-box[pageproxystate="valid"].onionUnknownIdentity > #identity-icon,
+#identity-box[pageproxystate="valid"].onionVerifiedDomain > #identity-icon,
+#identity-box[pageproxystate="valid"].onionMixedActiveBlocked > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion.svg);
+ visibility: visible;
+}
+
+#identity-box[pageproxystate="valid"].onionMixedDisplayContent > #identity-icon,
+#identity-box[pageproxystate="valid"].onionMixedDisplayContentLoadedActiveBlocked > #identity-icon,
+#identity-box[pageproxystate="valid"].onionCertUserOverridden > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion-warning.svg);
+ visibility: visible;
+}
+
+#identity-box[pageproxystate="valid"].onionMixedActiveContent > #identity-icon {
+ list-style-image: url(chrome://browser/skin/onion-slash.svg);
+ visibility: visible;
+}
+
#permissions-granted-icon {
list-style-image: url(chrome://browser/skin/permissions.svg);
}
diff --git a/browser/themes/shared/identity-block/onion-slash.svg b/browser/themes/shared/identity-block/onion-slash.svg
new file mode 100644
index 000000000000..e7c98b769482
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion-slash.svg
@@ -0,0 +1,5 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M3.409559 13.112147C3.409559 13.112147 8.200807 8.103115 8.200807 8.103115C8.200807 8.103115 8.200807 6.516403 8.200807 6.516403C8.620819 6.516403 9.009719 6.703075 9.274171 6.998639C9.274171 6.998639 10.160863 6.080835 10.160863 6.080835C9.663071 5.567487 8.978607 5.256367 8.200807 5.256367C8.200807 5.256367 8.200807 4.400787 8.200807 4.400787C9.196391 4.400787 10.098639 4.805243 10.736435 5.458595C10.736435 5.458595 11.623127 4.540791 11.623127 4.540791C10.751991 3.669655 9.538623 3.125195 8.200807 3.125195C8.200807 3.125195 8.200807 2.269615 8.200807 2.269615C9.756407 2.269615 11.172003 2.907411 12.214255 3.918551C12.214255 3.918551 13.100947 3.000747 13.100947 3.000747C11.825355 1.756267 10.098639 0.994023 8.185251 0.994023C4.311807 0.994023 1.185051 4.120779 1.185051 7.994223C1.185051 10.016503 2.040631 11.836555 3.409559 13.112147C3.409559 13.112147 3.409559 13.112147 3.409559 13.112147" fill-opacity="context-fill-opacity" fill="context-fill" />
+ <path d="M14.205423 4.416343C14.205423 4.416343 13.287619 5.380815 13.287619 5.380815C13.692075 6.158615 13.909859 7.045307 13.909859 7.994223C13.909859 11.152091 11.358675 13.718831 8.200807 13.718831C8.200807 13.718831 8.200807 12.863251 8.200807 12.863251C10.891995 12.863251 13.069835 10.669855 13.069835 7.978667C13.069835 7.278647 12.929831 6.625295 12.665379 6.018611C12.665379 6.018611 11.685351 7.045307 11.685351 7.045307C11.763131 7.340871 11.809799 7.651991 11.809799 7.963111C11.809799 9.954279 10.207531 11.556547 8.216363 11.572103C8.216363 11.572103 8.216363 10.716523 8.216363 10.716523C9.725295 10.700967 10.954219 9.472043 10.954219 7.963111C10.954219 7.916443 10.954219 7.854219 10.954219 7.807551C10.954219 7.807551 4.887379 14.169955 4.887379 14.169955C5.867407 14.698859 6.987439 14.994423 8.185251 14.994423C12.058695 14.994423 15.185451 11.867667 15.185451 7.994223C15.185451 6.687519 14.827663 5.474151 14.205423 4.416343C14.205423 4.416343 14.205423 4.416343 14.205423
4.416343" fill-opacity="context-fill-opacity" fill="context-fill" />
+ <path d="M1.791735 15.461103C1.402835 15.461103 1.045047 15.212207 0.889487 14.838863C0.733927 14.465519 0.827267 14.014395 1.107271 13.734387C1.107271 13.734387 13.458735 0.822907 13.458735 0.822907C13.847635 0.434007 14.454319 0.449563 14.827663 0.838467C15.201007 1.227367 15.216563 1.865163 14.843223 2.269619C14.843223 2.269619 2.491759 15.181099 2.491759 15.181099C2.289531 15.352215 2.040635 15.461107 1.791739 15.461107C1.791739 15.461107 1.791735 15.461103 1.791735 15.461103" fill="#ff0039" />
+</svg>
diff --git a/browser/themes/shared/identity-block/onion-warning.svg b/browser/themes/shared/identity-block/onion-warning.svg
new file mode 100644
index 000000000000..d42a7dab7246
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion-warning.svg
@@ -0,0 +1,6 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M15.8630401732 14.127C15.8630401732 14.127 12.6649598146 7.716 12.6649598146 7.716C12.4469357756 7.279935 12.0003277145 7.0043454 11.5116853046 7.0043454C11.0230428947 7.0043454 10.5764348336 7.279935 10.3584107946 7.716C10.3584107946 7.716 7.1573218938 14.127 7.1573218938 14.127C6.95646770542 14.527294 6.97733695982 15.002669 7.21250176686 15.38393C7.4476665739 15.765191 7.86372750208 15.998191 8.3126020986 16.0C8.3126020986 16.0 14.7077599684 16.0 14.7077599684 16.0C15.1566344646 15.9982 15.572695794 15.765191 15.8078605007 15.38393C16.0430252075 15.002669 16.0638944619 14.527294 15.8630371647 14.127C15.8630371647 14.127 15.8630401732 14.127 15.8630401732 14.127" fill="#ffbf00" />
+ <path d="M11.5106824572 8.0C11.6210488221 7.99691 11.7223975832 8.060469 11.7674113916 8.161C11.7674113916 8.161 14.9644889028 14.573 14.9644889028 14.573C15.0126456349 14.66534 15.0076715118 14.776305 14.9514518866 14.864C14.9011992034 14.95041 14.8079143382 15.002854 14.7077599684 15.001048C14.7077599684 15.001048 8.3126020986 15.001048 8.3126020986 15.001048C8.2124480296 15.002854 8.1191607576 14.950409 8.0689101804 14.864C8.0124814615 14.77637 8.0075053327 14.665298 8.0558731642 14.573C8.0558731642 14.573 11.2529506754 8.161 11.2529506754 8.161C11.2981038796 8.0601247 11.3999560701 7.9964997 11.5106824572 8.0M11.5106824572 6.9999751C11.0194557096 6.9969427 10.5701148893 7.2754275 10.3554022524 7.716C10.3554022524 7.716 7.1573218938 14.127 7.1573218938 14.127C6.95646770542 14.527294 6.97733695982 15.002669 7.21250176686 15.38393C7.4476665739 15.765191 7.86372750208 15.998191 8.3126020986 16.0C8.3126020986 16.0 14.7077599684 16.0 14.7077599684 16.0C15.1566344646 15.9982 15.57269
5794 15.765191 15.8078605007 15.38393C16.0430252075 15.002669 16.0638944619 14.527294 15.8630371647 14.127C15.8630371647 14.127 12.6649598146 7.716 12.6649598146 7.716C12.4504036219 7.2757546 12.0015481798 6.9973287 11.5106824572 6.9999751C11.5106824572 6.9999751 11.5106824572 6.9999751 11.5106824572 6.9999751" opacity="0.35" fill="#d76e00" />
+ <path d="M11.5327451 12.0C11.8096733867 12.0 12.0341688 11.776142 12.0341688 11.5C12.0341688 11.5 12.0341688 9.5 12.0341688 9.5C12.0341688 9.2238576 11.8096733867 9.0 11.5327451 9.0C11.2558168133 9.0 11.0313214 9.2238576 11.0313214 9.5C11.0313214 9.5 11.0313214 11.5 11.0313214 11.5C11.0313214 11.776142 11.2558168133 12.0 11.5327451 12.0C11.5327451 12.0 11.5327451 12.0 11.5327451 12.0M11.5327451 12.809C11.1500294496 12.809 10.8397775466 13.118371 10.8397775466 13.5C10.8397775466 13.881629 11.1500294496 14.191 11.5327451 14.191C11.9154607504 14.191 12.2257126534 13.881629 12.2257126534 13.5C12.2257126534 13.118371 11.9154607504 12.809 11.5327451 12.809C11.5327451 12.809 11.5327451 12.809 11.5327451 12.809" fill="#ffffff" />
+ <path d="M7.08030321348 6.552C7.90163523408 6.56 8.5645173655 7.225 8.5645173655 8.046C8.5645173655 8.866 7.90163523408 9.532 7.08030321348 9.54C7.08030321348 9.54 7.08030321348 6.552 7.08030321348 6.552M6.30610502068 13.756C6.30610502068 13.756 9.4991711423 7.353 9.4991711423 7.353C9.5453021227 7.259 9.6144985933 7.184 9.6716608951 7.098C9.2845617987 6.039 8.2756973143 5.277 7.08030321348 5.271C7.08030321348 5.271 7.08030321348 4.417 7.08030321348 4.417C8.5043465215 4.423 9.7238089599 5.251 10.3164917733 6.443C10.6795225321 6.21 11.1067355245 6.074 11.5519997701 6.074C11.5519997701 6.074 11.5620282441 6.074 11.5620282441 6.074C11.5620282441 6.074 11.5640339389 6.074 11.5640339389 6.074C11.5660396337 6.074 11.5690481759 6.075 11.5710538707 6.075C10.8108955415 4.35 9.0900094031 3.141 7.08030321348 3.135C7.08030321348 3.135 7.08030321348 2.281 7.08030321348 2.281C9.6716608951 2.288 11.8618796167 3.993 12.5889439817 6.34C13.0231769059 6.561 13.3922247491 6.9 13.6088397875 7.344C13.60
88397875 7.344 14.1162805719 8.361 14.1162805719 8.361C14.1202919615 8.256 14.1313232829 8.152 14.1313232829 8.046C14.1313232829 4.155 10.9683425833 1.0 7.06626334988 1.0C3.16318126908 1.0 0.00020056948 4.155 0.00020056948 8.046C0.00020056948 11.603 2.64571201068 14.536 6.08046435568 15.015C6.03633907008 14.595 6.10252699848 14.16 6.30610502068 13.756C6.30610502068 13.756 6.30610502068 13.756 6.30610502068 13.756" fill-opacity="context-fill-opacity" fill="context-fill" />
+</svg>
diff --git a/browser/themes/shared/identity-block/onion.svg b/browser/themes/shared/identity-block/onion.svg
new file mode 100644
index 000000000000..b123a9786acc
--- /dev/null
+++ b/browser/themes/shared/identity-block/onion.svg
@@ -0,0 +1,3 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
+ <path d="M8.01435945 13.726867125C8.01435945 13.726867125 8.01435945 12.87830525 8.01435945 12.87830525C10.70227825 12.87051775 12.87869375 10.689666 12.87869375 7.9998060125C12.87869375 5.310140275 10.70227825 3.1292621 8.01435945 3.121500325C8.01435945 3.121500325 8.01435945 2.272938975 8.01435945 2.272938975C11.170899375 2.280892725 13.727061375 4.8415202875 13.727061375 7.9998060125C13.727061375 11.158285375 11.170899375 13.719105 8.01435945 13.726867125C8.01435945 13.726867125 8.01435945 13.726867125 8.01435945 13.726867125M8.01435945 10.756805625C9.5304373 10.74884925 10.75758175 9.5180185125 10.75758175 7.9998060125C10.75758175 6.4817875 9.5304373 5.2509564125 8.01435945 5.2430005625C8.01435945 5.2430005625 8.01435945 4.3946332875 8.01435945 4.3946332875C9.999251625 4.4023945375 11.60614275 6.013167425 11.60614275 7.9998060125C11.60614275 9.986639375 9.999251625 11.597411125 8.01435945 11.605172375C8.01435945 11.605172375 8.01435945 10.756805625 8.01435945 10.756805625M8.01
435945 6.5157454625C8.8276046625 6.5235067125 9.484837025 7.184620575 9.484837025 7.9998060125C9.484837025 8.815185875 8.8276046625 9.4762985125 8.01435945 9.4840608125C8.01435945 9.4840608125 8.01435945 6.5157454625 8.01435945 6.5157454625M1.0 7.9998060125C1.0 11.8659705 4.1338360375 15.0 8.0000000875 15.0C11.8659705 15.0 15.0 11.8659705 15.0 7.9998060125C15.0 4.1338360375 11.8659705 1.0 8.0000000875 1.0C4.1338360375 1.0 1.0 4.1338360375 1.0 7.9998060125C1.0 7.9998060125 1.0 7.9998060125 1.0 7.9998060125" fill-rule="even-odd" fill-opacity="context-fill-opacity" fill="context-fill" />
+</svg>
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
index 9a62864b3f1f..cbf18156a455 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -52,6 +52,9 @@
skin/classic/browser/downloads/notification-start-animation.svg (../shared/downloads/notification-start-animation.svg)
skin/classic/browser/drm-icon.svg (../shared/drm-icon.svg)
skin/classic/browser/permissions.svg (../shared/identity-block/permissions.svg)
+ skin/classic/browser/onion.svg (../shared/identity-block/onion.svg)
+ skin/classic/browser/onion-slash.svg (../shared/identity-block/onion-slash.svg)
+ skin/classic/browser/onion-warning.svg (../shared/identity-block/onion-warning.svg)
skin/classic/browser/newInstall.css (../shared/newInstall.css)
skin/classic/browser/newInstallPage.css (../shared/newInstallPage.css)
skin/classic/browser/illustrations/blue-berror.svg (../shared/illustrations/blue-berror.svg)
diff --git a/dom/base/nsContentUtils.cpp b/dom/base/nsContentUtils.cpp
index a5d51c1f6b63..5c328e3753d2 100644
--- a/dom/base/nsContentUtils.cpp
+++ b/dom/base/nsContentUtils.cpp
@@ -9204,6 +9204,25 @@ bool nsContentUtils::ComputeIsSecureContext(nsIChannel* aChannel) {
return principal->GetIsOriginPotentiallyTrustworthy();
}
+/* static */ bool nsContentUtils::DocumentHasOnionURI(Document* aDocument) {
+ if (!aDocument) {
+ return false;
+ }
+
+ nsIURI* uri = aDocument->GetDocumentURI();
+ if (!uri) {
+ return false;
+ }
+
+ nsAutoCString host;
+ if (NS_SUCCEEDED(uri->GetHost(host))) {
+ bool hasOnionURI = StringEndsWith(host, ".onion"_ns);
+ return hasOnionURI;
+ }
+
+ return false;
+}
+
/* static */
void nsContentUtils::TryToUpgradeElement(Element* aElement) {
NodeInfo* nodeInfo = aElement->NodeInfo();
diff --git a/dom/base/nsContentUtils.h b/dom/base/nsContentUtils.h
index 4fe89763c102..9fc33d9780a2 100644
--- a/dom/base/nsContentUtils.h
+++ b/dom/base/nsContentUtils.h
@@ -2979,6 +2979,11 @@ class nsContentUtils {
*/
static bool HttpsStateIsModern(Document* aDocument);
+ /**
+ * Returns true of the document's URI is a .onion
+ */
+ static bool DocumentHasOnionURI(Document* aDocument);
+
/**
* Returns true if the channel is for top-level window and is over secure
* context.
diff --git a/dom/base/nsGlobalWindowOuter.cpp b/dom/base/nsGlobalWindowOuter.cpp
index 653c8c03fbdc..e5cb4d31d94c 100644
--- a/dom/base/nsGlobalWindowOuter.cpp
+++ b/dom/base/nsGlobalWindowOuter.cpp
@@ -1881,7 +1881,8 @@ bool nsGlobalWindowOuter::ComputeIsSecureContext(Document* aDocument,
return false;
}
- if (nsContentUtils::HttpsStateIsModern(aDocument)) {
+ if (nsContentUtils::HttpsStateIsModern(aDocument) ||
+ nsContentUtils::DocumentHasOnionURI(aDocument)) {
return true;
}
diff --git a/dom/ipc/WindowGlobalActor.cpp b/dom/ipc/WindowGlobalActor.cpp
index 64085dbe5d4c..b859ba966ac8 100644
--- a/dom/ipc/WindowGlobalActor.cpp
+++ b/dom/ipc/WindowGlobalActor.cpp
@@ -20,6 +20,7 @@
#include "mozilla/net/CookieJarSettings.h"
#include "mozilla/dom/WindowGlobalChild.h"
#include "mozilla/dom/WindowGlobalParent.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
#include "nsGlobalWindowInner.h"
#include "nsNetUtil.h"
@@ -116,7 +117,9 @@ WindowGlobalInit WindowGlobalActor::WindowInitializer(
// Init Mixed Content Fields
nsCOMPtr<nsIURI> innerDocURI = NS_GetInnermostURI(doc->GetDocumentURI());
if (innerDocURI) {
- fields.mIsSecure = innerDocURI->SchemeIs("https");
+ fields.mIsSecure =
+ innerDocURI->SchemeIs("https") ||
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI);
}
nsCOMPtr<nsIChannel> mixedChannel;
aWindow->GetDocShell()->GetMixedContentChannel(getter_AddRefs(mixedChannel));
diff --git a/dom/ipc/WindowGlobalChild.cpp b/dom/ipc/WindowGlobalChild.cpp
index 92a6fd1e3b7c..6635b83bd339 100644
--- a/dom/ipc/WindowGlobalChild.cpp
+++ b/dom/ipc/WindowGlobalChild.cpp
@@ -45,6 +45,8 @@
# include "GeckoProfiler.h"
#endif
+#include "mozilla/dom/nsMixedContentBlocker.h"
+
using namespace mozilla::ipc;
using namespace mozilla::dom::ipc;
@@ -230,7 +232,9 @@ void WindowGlobalChild::OnNewDocument(Document* aDocument) {
nsCOMPtr<nsIURI> innerDocURI =
NS_GetInnermostURI(aDocument->GetDocumentURI());
if (innerDocURI) {
- txn.SetIsSecure(innerDocURI->SchemeIs("https"));
+ txn.SetIsSecure(
+ innerDocURI->SchemeIs("https") ||
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI));
}
nsCOMPtr<nsIChannel> mixedChannel;
mWindowGlobal->GetDocShell()->GetMixedContentChannel(
diff --git a/dom/security/nsMixedContentBlocker.cpp b/dom/security/nsMixedContentBlocker.cpp
index 64a9f3178874..ba88625eda69 100644
--- a/dom/security/nsMixedContentBlocker.cpp
+++ b/dom/security/nsMixedContentBlocker.cpp
@@ -638,8 +638,8 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
return NS_OK;
}
- // Check the parent scheme. If it is not an HTTPS page then mixed content
- // restrictions do not apply.
+ // Check the parent scheme. If it is not an HTTPS or .onion page then mixed
+ // content restrictions do not apply.
nsCOMPtr<nsIURI> innerRequestingLocation =
NS_GetInnermostURI(requestingLocation);
if (!innerRequestingLocation) {
@@ -654,6 +654,17 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
bool parentIsHttps = innerRequestingLocation->SchemeIs("https");
if (!parentIsHttps) {
+ bool parentIsOnion = IsPotentiallyTrustworthyOnion(innerRequestingLocation);
+ if (!parentIsOnion) {
+ *aDecision = ACCEPT;
+ return NS_OK;
+ }
+ }
+
+ bool isHttpScheme = innerContentLocation->SchemeIs("http");
+ // .onion URLs are encrypted and authenticated. Don't treat them as mixed
+ // content if potentially trustworthy (i.e. whitelisted).
+ if (isHttpScheme && IsPotentiallyTrustworthyOnion(innerContentLocation)) {
*aDecision = ACCEPT;
MOZ_LOG(sMCBLog, LogLevel::Verbose,
(" -> decision: Request will be allowed because the requesting "
@@ -680,7 +691,6 @@ nsresult nsMixedContentBlocker::ShouldLoad(bool aHadInsecureImageRedirect,
return NS_OK;
}
- bool isHttpScheme = innerContentLocation->SchemeIs("http");
if (isHttpScheme && IsPotentiallyTrustworthyOrigin(innerContentLocation)) {
*aDecision = ACCEPT;
return NS_OK;
diff --git a/mobile/android/modules/geckoview/GeckoViewProgress.jsm b/mobile/android/modules/geckoview/GeckoViewProgress.jsm
index 17069dbe657f..c1346b1858cf 100644
--- a/mobile/android/modules/geckoview/GeckoViewProgress.jsm
+++ b/mobile/android/modules/geckoview/GeckoViewProgress.jsm
@@ -145,6 +145,10 @@ var IdentityHandler = {
result.host = uri.host;
}
+ if (!aBrowser.securityUI.secInfo) {
+ return result;
+ }
+
const cert = aBrowser.securityUI.secInfo.serverCert;
result.certificate = aBrowser.securityUI.secInfo.serverCert.getBase64DERString();
diff --git a/security/manager/ssl/nsSecureBrowserUI.cpp b/security/manager/ssl/nsSecureBrowserUI.cpp
index b4de1a331ffc..f1ce39582854 100644
--- a/security/manager/ssl/nsSecureBrowserUI.cpp
+++ b/security/manager/ssl/nsSecureBrowserUI.cpp
@@ -9,6 +9,7 @@
#include "mozilla/Logging.h"
#include "mozilla/Unused.h"
#include "mozilla/dom/Document.h"
+#include "mozilla/dom/nsMixedContentBlocker.h"
#include "nsContentUtils.h"
#include "nsIChannel.h"
#include "nsDocShell.h"
@@ -85,6 +86,17 @@ void nsSecureBrowserUI::RecomputeSecurityFlags() {
}
}
}
+
+ // any protocol routed over tor is secure
+ if (!(mState & nsIWebProgressListener::STATE_IS_SECURE)) {
+ nsCOMPtr<nsIURI> innerDocURI = NS_GetInnermostURI(win->GetDocumentURI());
+ if (innerDocURI &&
+ nsMixedContentBlocker::IsPotentiallyTrustworthyOnion(innerDocURI)) {
+ MOZ_LOG(gSecureBrowserUILog, LogLevel::Debug, (" is onion"));
+ mState = (mState & ~nsIWebProgressListener::STATE_IS_INSECURE) |
+ nsIWebProgressListener::STATE_IS_SECURE;
+ }
+ }
}
// Add upgraded-state flags when request has been
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 31575: Replace Firefox Home (newtab) with about:tor
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit d1f8c8945f182d723fb682bb35b5cf3e5e07ea32
Author: Alex Catarineu <acat(a)torproject.org>
Date: Mon Sep 9 13:04:34 2019 +0200
Bug 31575: Replace Firefox Home (newtab) with about:tor
Avoid loading AboutNewTab in BrowserGlue.jsm in order
to avoid several network requests that we do not need. Besides,
about:newtab will now point to about:blank or about:tor (depending
on browser.newtabpage.enabled) and about:home will point to
about:tor.
---
browser/components/BrowserGlue.jsm | 33 ++----------------------
browser/components/newtab/AboutNewTabService.jsm | 15 +----------
browser/components/preferences/home.inc.xhtml | 4 +--
browser/components/preferences/preferences.xhtml | 5 +++-
browser/modules/HomePage.jsm | 2 +-
5 files changed, 10 insertions(+), 49 deletions(-)
diff --git a/browser/components/BrowserGlue.jsm b/browser/components/BrowserGlue.jsm
index 231bb540921b..10c789d822f7 100644
--- a/browser/components/BrowserGlue.jsm
+++ b/browser/components/BrowserGlue.jsm
@@ -18,7 +18,6 @@ const { AppConstants } = ChromeUtils.import(
);
XPCOMUtils.defineLazyModuleGetters(this, {
- AboutNewTab: "resource:///modules/AboutNewTab.jsm",
ActorManagerParent: "resource://gre/modules/ActorManagerParent.jsm",
AddonManager: "resource://gre/modules/AddonManager.jsm",
AppMenuNotifications: "resource://gre/modules/AppMenuNotifications.jsm",
@@ -225,28 +224,6 @@ let JSWINDOWACTORS = {
matches: ["about:newinstall"],
},
- AboutNewTab: {
- parent: {
- moduleURI: "resource:///actors/AboutNewTabParent.jsm",
- },
- child: {
- moduleURI: "resource:///actors/AboutNewTabChild.jsm",
- events: {
- DOMContentLoaded: {},
- pageshow: {},
- visibilitychange: {},
- },
- },
- // The wildcard on about:newtab is for the ?endpoint query parameter
- // that is used for snippets debugging. The wildcard for about:home
- // is similar, and also allows for falling back to loading the
- // about:home document dynamically if an attempt is made to load
- // about:home?jscache from the AboutHomeStartupCache as a top-level
- // load.
- matches: ["about:home*", "about:welcome", "about:newtab*"],
- remoteTypes: ["privilegedabout"],
- },
-
AboutPlugins: {
parent: {
moduleURI: "resource:///actors/AboutPluginsParent.jsm",
@@ -1650,8 +1627,6 @@ BrowserGlue.prototype = {
// the first browser window has finished initializing
_onFirstWindowLoaded: function BG__onFirstWindowLoaded(aWindow) {
- AboutNewTab.init();
-
TabCrashHandler.init();
ProcessHangMonitor.init();
@@ -5142,12 +5117,8 @@ var AboutHomeStartupCache = {
return { pageInputStream: null, scriptInputStream: null };
}
- let state = AboutNewTab.activityStream.store.getState();
- return new Promise(resolve => {
- this._cacheDeferred = resolve;
- this.log.trace("Parent is requesting cache streams.");
- this._procManager.sendAsyncMessage(this.CACHE_REQUEST_MESSAGE, { state });
- });
+ this.log.error("Activity Stream is disabled in Tor Browser.");
+ return { pageInputStream: null, scriptInputStream: null };
},
/**
diff --git a/browser/components/newtab/AboutNewTabService.jsm b/browser/components/newtab/AboutNewTabService.jsm
index 605d34c0de1c..3f4f04a386db 100644
--- a/browser/components/newtab/AboutNewTabService.jsm
+++ b/browser/components/newtab/AboutNewTabService.jsm
@@ -425,20 +425,7 @@ class BaseAboutNewTabService {
* the newtab page has no effect on the result of this function.
*/
get defaultURL() {
- // Generate the desired activity stream resource depending on state, e.g.,
- // "resource://activity-stream/prerendered/activity-stream.html"
- // "resource://activity-stream/prerendered/activity-stream-debug.html"
- // "resource://activity-stream/prerendered/activity-stream-noscripts.html"
- return [
- "resource://activity-stream/prerendered/",
- "activity-stream",
- // Debug version loads dev scripts but noscripts separately loads scripts
- this.activityStreamDebug && !this.privilegedAboutProcessEnabled
- ? "-debug"
- : "",
- this.privilegedAboutProcessEnabled ? "-noscripts" : "",
- ".html",
- ].join("");
+ return "about:tor";
}
get welcomeURL() {
diff --git a/browser/components/preferences/home.inc.xhtml b/browser/components/preferences/home.inc.xhtml
index c348e1cf754b..c37dc5e731f6 100644
--- a/browser/components/preferences/home.inc.xhtml
+++ b/browser/components/preferences/home.inc.xhtml
@@ -33,7 +33,7 @@
class="check-home-page-controlled"
data-preference-related="browser.startup.homepage">
<menupopup>
- <menuitem value="0" data-l10n-id="home-mode-choice-default" />
+ <menuitem value="0" label="&aboutTor.title;" />
<menuitem value="2" data-l10n-id="home-mode-choice-custom" />
<menuitem value="1" data-l10n-id="home-mode-choice-blank" />
</menupopup>
@@ -85,7 +85,7 @@
Preferences so we need to handle setting the pref manually.-->
<menulist id="newTabMode" flex="1" data-preference-related="browser.newtabpage.enabled">
<menupopup>
- <menuitem value="0" data-l10n-id="home-mode-choice-default" />
+ <menuitem value="0" label="&aboutTor.title;" />
<menuitem value="1" data-l10n-id="home-mode-choice-blank" />
</menupopup>
</menulist>
diff --git a/browser/components/preferences/preferences.xhtml b/browser/components/preferences/preferences.xhtml
index 5f9900564288..c1322ea10357 100644
--- a/browser/components/preferences/preferences.xhtml
+++ b/browser/components/preferences/preferences.xhtml
@@ -14,7 +14,10 @@
<?xml-stylesheet href="chrome://browser/skin/preferences/privacy.css"?>
<?xml-stylesheet href="chrome://browser/content/securitylevel/securityLevelPreferences.css"?>
-<!DOCTYPE html>
+<!DOCTYPE html [
+<!ENTITY % aboutTorDTD SYSTEM "chrome://torbutton/locale/aboutTor.dtd">
+ %aboutTorDTD;
+]>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:html="http://www.w3.org/1999/xhtml"
diff --git a/browser/modules/HomePage.jsm b/browser/modules/HomePage.jsm
index 751e6ebb39b3..01317b9e9754 100644
--- a/browser/modules/HomePage.jsm
+++ b/browser/modules/HomePage.jsm
@@ -21,7 +21,7 @@ XPCOMUtils.defineLazyModuleGetters(this, {
});
const kPrefName = "browser.startup.homepage";
-const kDefaultHomePage = "about:home";
+const kDefaultHomePage = "about:tor";
const kExtensionControllerPref =
"browser.startup.homepage_override.extensionControlled";
const kHomePageIgnoreListId = "homepage-urls";
1
0

[tor-browser/tor-browser-88.0b4-10.5-1] Bug 27511: Add new identity button to toolbar
by sysrqb@torproject.org 20 Apr '21
by sysrqb@torproject.org 20 Apr '21
20 Apr '21
commit ebe87b1e46a157dc9e61ba2e62e13fd7ded2cd76
Author: Alex Catarineu <acat(a)torproject.org>
Date: Fri Oct 4 19:08:33 2019 +0200
Bug 27511: Add new identity button to toolbar
Also added 'New circuit for this site' button to CustomizableUI, but
not visible by default.
---
browser/base/content/browser.xhtml | 10 ++++++++++
.../components/customizableui/CustomizableUI.jsm | 21 +++++++++++++++++++++
browser/themes/shared/icons/new_circuit.svg | 8 ++++++++
browser/themes/shared/icons/new_identity.svg | 9 +++++++++
browser/themes/shared/jar.inc.mn | 3 +++
browser/themes/shared/menupanel.inc.css | 8 ++++++++
browser/themes/shared/toolbarbutton-icons.inc.css | 8 ++++++++
7 files changed, 67 insertions(+)
diff --git a/browser/base/content/browser.xhtml b/browser/base/content/browser.xhtml
index c859d65af413..4c3a7e7cae55 100644
--- a/browser/base/content/browser.xhtml
+++ b/browser/base/content/browser.xhtml
@@ -2281,6 +2281,16 @@
ondragenter="newWindowButtonObserver.onDragOver(event)"
ondragexit="newWindowButtonObserver.onDragExit(event)"/>
+ <toolbarbutton id="new-identity-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&torbutton.context_menu.new_identity;"
+ oncommand="torbutton_new_identity();"
+ tooltiptext="&torbutton.context_menu.new_identity;"/>
+
+ <toolbarbutton id="new-circuit-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
+ label="&torbutton.context_menu.new_circuit;"
+ oncommand="torbutton_new_circuit();"
+ tooltiptext="&torbutton.context_menu.new_circuit;"/>
+
<toolbarbutton id="fullscreen-button" class="toolbarbutton-1 chromeclass-toolbar-additional"
observes="View:FullScreen"
type="checkbox"
diff --git a/browser/components/customizableui/CustomizableUI.jsm b/browser/components/customizableui/CustomizableUI.jsm
index 5188ac328fbd..e3942dec97fd 100644
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -87,6 +87,8 @@ const kSubviewEvents = ["ViewShowing", "ViewHiding"];
*/
var kVersion = 16;
+var kTorVersion = 1;
+
/**
* Buttons removed from built-ins by version they were removed. kVersion must be
* bumped any time a new id is added to this. Use the button id as key, and
@@ -603,6 +605,20 @@ var CustomizableUIInternal = {
navbarPlacements.push("fxa-toolbar-menu-button");
}
}
+
+ let currentTorVersion = gSavedState.currentTorVersion;
+ if (currentTorVersion < 1 && gSavedState.placements) {
+ let navbarPlacements = gSavedState.placements[CustomizableUI.AREA_NAVBAR];
+ if (navbarPlacements) {
+ let secLevelIndex = navbarPlacements.indexOf("security-level-button");
+ if (secLevelIndex === -1) {
+ let urlbarIndex = navbarPlacements.indexOf("urlbar-container");
+ secLevelIndex = urlbarIndex + 1;
+ navbarPlacements.splice(secLevelIndex, 0, "security-level-button");
+ }
+ navbarPlacements.splice(secLevelIndex + 1, 0, "new-identity-button");
+ }
+ }
},
_updateForNewProtonVersion() {
@@ -2505,6 +2521,10 @@ var CustomizableUIInternal = {
gSavedState.currentVersion = 0;
}
+ if (!("currentTorVersion" in gSavedState)) {
+ gSavedState.currentTorVersion = 0;
+ }
+
gSeenWidgets = new Set(gSavedState.seen || []);
gDirtyAreaCache = new Set(gSavedState.dirtyAreaCache || []);
gNewElementCount = gSavedState.newElementCount || 0;
@@ -2583,6 +2603,7 @@ var CustomizableUIInternal = {
seen: gSeenWidgets,
dirtyAreaCache: gDirtyAreaCache,
currentVersion: kVersion,
+ currentTorVersion: kTorVersion,
newElementCount: gNewElementCount,
};
diff --git a/browser/themes/shared/icons/new_circuit.svg b/browser/themes/shared/icons/new_circuit.svg
new file mode 100644
index 000000000000..e0a93cc83502
--- /dev/null
+++ b/browser/themes/shared/icons/new_circuit.svg
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>Icon / New Circuit(a)1.5x</title>
+ <g id="Icon-/-New-Circuit" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <path d="M13.4411138,10.1446317 L9.5375349,10.1446317 C8.99786512,10.1446317 8.56164018,10.5818326 8.56164018,11.1205264 C8.56164018,11.6592203 8.99786512,12.0964212 9.5375349,12.0964212 L11.4571198,12.0964212 C10.7554515,13.0479185 9.73466563,13.692009 8.60067597,13.9359827 C8.41818366,13.9720908 8.23276366,14.0033194 8.04734366,14.0218614 C7.97219977,14.0277168 7.89803177,14.0306445 7.82288788,14.0335722 C6.07506044,14.137017 4.290149,13.4499871 3.38647049,11.857327 C2.52280367,10.3349312 2.77263271,8.15966189 3.93687511,6.87343267 C5.12453898,5.56183017 7.44814431,5.04363008 8.21226987,3.38558497 C9.01738301,4.92847451 9.60682342,5.02801577 10.853041,6.15029468 C11.2892659,6.54455615 11.9704404,7.55558307 12.1861132,8.10501179 C12.3051723,8.40949094 12.5013272,9.17947187 12.5013272,9.17947187 L14.2862386,9.17947187 C14.2091429,7.59754654 13.439162,5.96877827 12.2261248,4.93628166 C11.279507,4.13116853 10.5065984,3.84718317 9.77662911,2.8088312 C9.63219669,2.60194152 9.599
99216,2.4565332 9.56290816,2.21646311 C9.53851079,2.00762164 9.54143848,1.78511764 9.62048595,1.53919218 C9.65952174,1.41720534 9.59804037,1.28545955 9.47702943,1.23764071 L6.40296106,0.0167964277 C6.32391359,-0.0134563083 6.23413128,-0.00272146652 6.16679454,0.0480250584 L5.95502539,0.206120002 C5.85743592,0.280288 5.82815908,0.416913259 5.89159223,0.523285783 C6.70060895,1.92564648 6.36978064,2.82542141 5.8984235,3.20211676 C5.4914754,3.4900057 4.99084141,3.72226864 4.63366394,3.95453159 C3.82367132,4.47956294 3.03222071,5.02508808 2.40374451,5.76774396 C0.434388969,8.09427695 0.519291809,12.0046871 2.77165682,14.1077402 C3.65288975,14.9284676 4.70295247,15.4749686 5.81742423,15.7570022 C5.81742423,15.7570022 6.13556591,15.833122 6.21754107,15.8497122 C7.36616915,16.0829511 8.53529102,16.0146384 9.62243774,15.6672199 C9.67416016,15.6525815 9.77174963,15.620377 9.76784605,15.6154975 C10.7730176,15.2700308 11.7049971,14.7010841 12.4652191,13.90573 L12.4652191,15.0241053 C12.4652191,
15.5627992 12.901444,16 13.4411138,16 C13.9798077,16 14.4170085,15.5627992 14.4170085,15.0241053 L14.4170085,11.1205264 C14.4170085,10.5818326 13.9798077,10.1446317 13.4411138,10.1446317" id="Fill-3" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ <path d="M5.107,7.462 C4.405,8.078 4,8.946 4,9.839 C4,10.712 4.422,11.57 5.13,12.132 C5.724,12.607 6.627,12.898 7.642,12.949 L7.642,5.8 C7.39,6.029 7.103,6.227 6.791,6.387 C5.993,6.812 5.489,7.133 5.107,7.462" id="Fill-1" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ </g>
+</svg>
diff --git a/browser/themes/shared/icons/new_identity.svg b/browser/themes/shared/icons/new_identity.svg
new file mode 100644
index 000000000000..91d5b35f7e80
--- /dev/null
+++ b/browser/themes/shared/icons/new_identity.svg
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+ <title>New Identity Icon</title>
+ <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+ <g id="New-Identity-Icon" fill="#000000" fill-rule="nonzero">
+ <path d="M4.65687153,14.5532899 L5.79494313,12.0855326 C5.8689125,11.9251399 5.6620883,11.7793527 5.53742729,11.9040137 L3.77194352,13.6694975 L2.32342782,12.2228406 L4.089841,10.4564274 C4.21450201,10.3317664 4.06871482,10.1249422 3.90832206,10.1989116 L1.43773764,11.338287 L0.206601383,10.1087306 C0.0509544211,9.9532834 -0.0167994233,9.75447206 0.00351451705,9.53432844 C0.0238284574,9.31418483 0.154794797,9.13897939 0.330406365,9.0302193 L4.61213917,6.53066101 C4.98542292,6.31331572 5.42541251,6.16259067 5.8659261,6.07796117 C6.63682488,5.92985954 7.40999434,6.06817199 8.09666802,6.42610336 L12.618483,1.910278 C13.0562019,1.47313888 13.7399062,1.45652879 14.1403159,1.87828207 C14.5407256,2.30003536 14.523905,2.96081599 14.0861861,3.39795511 L9.56437119,7.91378047 C9.92258101,8.57753432 10.0391721,9.37155544 9.91292178,10.1416209 C9.85023328,10.5817332 9.67706706,10.9989392 9.45960494,11.3937636 L6.95651989,15.6478297 C6.84761416,15.82321 6.6720026,15.9319701 6.47398108
,15.9964916 C6.25354962,16.0167745 6.0544801,15.9491049 5.89883314,15.7936577 L4.65687153,14.5532899 L4.65687153,14.5532899 Z M6.35600863,9.57888316 C6.35684236,9.57982492 6.35770616,9.58074275 6.35860024,9.58163642 L7.56801202,10.7899206 C7.78820303,11.010009 8.15567242,10.9533982 8.29166823,10.678253 C8.42766403,10.4031079 8.55818512,10.1511975 8.61427424,9.83946755 C8.73630873,9.14856819 8.51477165,8.45005355 8.01189873,7.92920397 C8.01085853,7.92816425 8.00979562,7.92715687 8.00871022,7.92618158 C8.00773493,7.92509618 8.00672754,7.92403327 8.00568783,7.92299307 C7.48483824,7.42012014 6.7863236,7.19858307 6.09542425,7.32061756 C5.78369428,7.37670668 5.53178393,7.50722777 5.25663877,7.64322357 C4.98149362,7.77921937 4.92488284,8.14668876 5.14497116,8.36687978 L6.35325537,9.57629155 C6.35414904,9.57718564 6.35506687,9.57804944 6.35600863,9.57888316 L6.35600863,9.57888316 Z M3.56503003,4.86094581 C3.44279837,4.85716019 3.33693302,4.76594656 3.31450832,4.6450962 C3.29259157,4.5009814
3 3.24425431,4.36089837 3.1719467,4.23194774 C3.04272848,4.15978087 2.90235166,4.11153221 2.75793184,4.08964745 C2.63678145,4.06729735 2.5453314,3.9616241 2.54155161,3.83961366 C2.53777182,3.71760322 2.62276629,3.61489221 2.74265726,3.59658884 C2.88757581,3.57942626 3.02687427,3.53584537 3.15371096,3.46798665 C3.21938702,3.3436261 3.26061987,3.20700605 3.27529255,3.0651408 C3.29205048,2.94466859 3.39451537,2.85825378 3.5172925,2.86104768 C3.6386065,2.86399065 3.74452528,2.95324633 3.76872081,3.07292141 C3.79288781,3.21715288 3.84342323,3.35694342 3.91777207,3.4852254 C4.04615548,3.55876237 4.18583906,3.60883869 4.32991405,3.63297757 C4.45015386,3.6576218 4.53936117,3.76418021 4.54139495,3.88559216 C4.54342874,4.00700411 4.45770065,4.10814717 4.33816215,4.12536877 C4.1960481,4.14067978 4.05931708,4.18249381 3.9349938,4.24866259 C3.86697751,4.37522253 3.82328954,4.51422019 3.80607564,4.65882867 C3.78847982,4.77811508 3.68677836,4.86339193 3.56503003,4.86094581 Z M14.4103464,14.3126948
C14.2513672,14.307719 14.1137716,14.188804 14.0849193,14.0314492 C14.045996,13.7585014 13.9510862,13.4938971 13.8061961,13.2543814 C13.5663773,13.109665 13.301434,13.0148623 13.0281329,12.9759728 C12.8707684,12.946921 12.75198,12.8095493 12.7470672,12.6509372 C12.7421545,12.492325 12.8525523,12.3587997 13.0082799,12.3350024 C13.2816632,12.3044807 13.5433622,12.2185794 13.7775725,12.0824861 C13.9099238,11.8524988 13.992337,11.5955854 14.0197279,11.3275956 C14.0417134,11.1717293 14.1740126,11.0598594 14.3327736,11.0628895 C14.4905572,11.0667732 14.6282205,11.1831391 14.6593783,11.3389665 C14.703143,11.6110771 14.8017156,11.8740418 14.9490566,12.1117486 C15.1872615,12.2578242 15.450159,12.3559923 15.7221615,12.4004323 C15.8783433,12.4324665 15.9942186,12.5709889 15.9968634,12.7288231 C15.9995083,12.8866572 15.8881575,13.0181443 15.7328877,13.0405352 C15.4641157,13.0669716 15.2064728,13.14931 14.9763475,13.2823129 C14.8406047,13.5164173 14.7548186,13.7777086 14.724105,14.0506041 C14.70
09285,14.2056508 14.5685348,14.3162427 14.4103464,14.3126948 Z M8.37194288,2.75251202 C8.23729358,2.7482977 8.12075529,2.6475812 8.09631849,2.5143077 C8.06335201,2.28313133 7.98296703,2.05902158 7.86025062,1.85616098 C7.65713325,1.73359169 7.43273641,1.65329741 7.2012608,1.62035947 C7.06797908,1.59575373 6.9673698,1.47940513 6.96320889,1.34506671 C6.95904797,1.21072829 7.05255074,1.09763741 7.18444606,1.07748204 C7.41599123,1.0516313 7.6376403,0.978876138 7.83600755,0.863610339 C7.94810399,0.668819911 8.01790485,0.45122403 8.04110388,0.224246882 C8.05972477,0.0922341146 8.17177714,-0.00251545243 8.30624168,5.089704e-05 C8.43987839,0.00334026838 8.55647391,0.101897787 8.58286336,0.233877601 C8.61993042,0.464344927 8.70341768,0.687066016 8.82820981,0.888394549 C9.02996027,1.012115 9.25262444,1.09525963 9.4830002,1.13289867 C9.6152802,1.16003037 9.71342219,1.27735361 9.71566226,1.41103311 C9.71790232,1.5447126 9.62359245,1.65607713 9.49208487,1.67504141 C9.26444525,1.69743199 9.0462315
3,1.76716948 8.85132417,1.87981789 C8.73635526,2.07809534 8.66369764,2.2993991 8.63768445,2.53053117 C8.61805481,2.66184983 8.50592239,2.75551697 8.37194288,2.75251202 Z" id="Shape" fill="context-fill" fill-opacity="context-fill-opacity"></path>
+ </g>
+ </g>
+</svg>
\ No newline at end of file
diff --git a/browser/themes/shared/jar.inc.mn b/browser/themes/shared/jar.inc.mn
index cbf18156a455..5b41d65ebd45 100644
--- a/browser/themes/shared/jar.inc.mn
+++ b/browser/themes/shared/jar.inc.mn
@@ -272,3 +272,6 @@
skin/classic/browser/places/tree-icons.css (../shared/places/tree-icons.css)
skin/classic/browser/privatebrowsing/aboutPrivateBrowsing.css (../shared/privatebrowsing/aboutPrivateBrowsing.css)
skin/classic/browser/privatebrowsing/favicon.svg (../shared/privatebrowsing/favicon.svg)
+
+ skin/classic/browser/new_circuit.svg (../shared/icons/new_circuit.svg)
+ skin/classic/browser/new_identity.svg (../shared/icons/new_identity.svg)
diff --git a/browser/themes/shared/menupanel.inc.css b/browser/themes/shared/menupanel.inc.css
index d5079e9881f2..91dae3481f2e 100644
--- a/browser/themes/shared/menupanel.inc.css
+++ b/browser/themes/shared/menupanel.inc.css
@@ -195,3 +195,11 @@ toolbarpaletteitem[place="palette"] > #bookmarks-menu-button,
list-style-image: url(chrome://browser/skin/fullscreen-exit.svg);
}
} /** END Proton **/
+
+#appMenuNewIdentity {
+ list-style-image: url("chrome://browser/skin/new_identity.svg");
+}
+
+#appMenuNewCircuit {
+ list-style-image: url("chrome://browser/skin/new_circuit.svg");
+}
diff --git a/browser/themes/shared/toolbarbutton-icons.inc.css b/browser/themes/shared/toolbarbutton-icons.inc.css
index 3d4fd8192898..d81d7f7b2dcf 100644
--- a/browser/themes/shared/toolbarbutton-icons.inc.css
+++ b/browser/themes/shared/toolbarbutton-icons.inc.css
@@ -203,6 +203,14 @@ toolbar[brighttext] {
list-style-image: url("chrome://browser/skin/new-tab.svg");
}
+#new-identity-button {
+ list-style-image: url("chrome://browser/skin/new_identity.svg");
+}
+
+#new-circuit-button {
+ list-style-image: url("chrome://browser/skin/new_circuit.svg");
+}
+
#privatebrowsing-button {
list-style-image: url("chrome://browser/skin/privateBrowsing.svg");
}
1
0

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

[Git][tpo/applications/android-components][android-components-74.0.6-10.5-1] 12 commits: Bug 40005: Modify Default toolbar menu
by Matthew Finkel 20 Apr '21
by Matthew Finkel 20 Apr '21
20 Apr '21
Matthew Finkel pushed to branch android-components-74.0.6-10.5-1 at The Tor Project / Applications / android-components
Commits:
283e6c4b by Matthew Finkel at 2021-04-20T02:28:37+00:00
Bug 40005: Modify Default toolbar menu
- - - - -
e13c7ff9 by Alex Catarineu at 2021-04-20T02:28:37+00:00
Bug 40007: Port external helper app prompting
Together with the corresponding fenix patch, this allows all `startActivity`
that may open external apps to be replaced by `TorUtils.startActivityPrompt`.
- - - - -
65f9abf0 by Alex Catarineu at 2021-04-20T02:28:38+00:00
Bug 40002: Ensure system download manager is not used
- - - - -
5f17ce5f by Alex Catarineu at 2021-04-20T02:28:38+00:00
Bug 40009: Change the default search engines
This matches the search engines from desktop, that is:
DDG as the default, then YouTube, Google, DDGOnion,
Startpage, Twitter, Wikipedia and Yahoo.
- - - - -
0d7125a6 by Alex Catarineu at 2021-04-20T02:28:39+00:00
Modify Addon support
Bug 40011: Hide option for disallowing addons in private mode
Bug 40016: Allow inheriting from AddonCollectionProvider
This will allow implementing our own AddonsProvider in fenix.
- - - - -
3f1f2fc6 by Georg Koppen at 2021-04-20T02:28:39+00:00
Bug 40013: Add option do overwrite timestamp in extension version
- - - - -
1fd6b2b7 by Alex Catarineu at 2021-04-20T02:28:40+00:00
Bug 40015: Port padlock states for .onion services
- - - - -
001f280e by Alex Catarineu at 2021-04-20T02:28:40+00:00
Bug 40021: Force telemetry=false in Fennec settings migration
- - - - -
64a36949 by Alex Catarineu at 2021-04-20T02:28:41+00:00
Bug 40022: Migrate Tor security level from Fennec
- - - - -
9a622ba1 by Matthew Finkel at 2021-04-20T02:28:42+00:00
Modify Tracking Protection configuration
Bug 40020: Disable third-party cookies
Bug 40024: Disable tracking protection by default
- - - - -
51cf313c by Matthew Finkel at 2021-04-20T02:28:42+00:00
Bug 40023: Stop PrivateNotificationService
- - - - -
98991432 by Matthew Finkel at 2021-04-20T02:28:43+00:00
Add support for new GeckoView interfaces
Bug 40006: Expose Security Level interface
Bug 40019: Expose spoofEnglish pref
Bug 34439: Isolate Icon loader on Android
- - - - -
30 changed files:
- build.gradle
- components/browser/engine-gecko-beta/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
- components/browser/engine-gecko-beta/src/main/java/mozilla/components/browser/engine/gecko/fetch/GeckoViewFetchClient.kt
- components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/GeckoEngine.kt
- components/browser/engine-gecko/src/main/java/mozilla/components/browser/engine/gecko/fetch/GeckoViewFetchClient.kt
- components/browser/icons/src/main/java/mozilla/components/browser/icons/loader/HttpIconLoader.kt
- components/browser/menu/src/main/java/mozilla/components/browser/menu/WebExtensionBrowserMenuBuilder.kt
- components/browser/search/src/main/assets/search/list.json
- + components/browser/search/src/main/assets/searchplugins/ddg-onion.xml
- components/browser/search/src/main/assets/searchplugins/ddg.xml
- + components/browser/search/src/main/assets/searchplugins/startpage.xml
- + components/browser/search/src/main/assets/searchplugins/yahoo.xml
- components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/display/DisplayToolbar.kt
- components/browser/toolbar/src/main/java/mozilla/components/browser/toolbar/display/SiteSecurityIconView.kt
- components/browser/toolbar/src/main/res/drawable/mozac_ic_site_security.xml
- components/browser/toolbar/src/main/res/values/attrs_browser_toolbar.xml
- components/concept/engine/src/main/java/mozilla/components/concept/engine/EngineSession.kt
- components/concept/engine/src/main/java/mozilla/components/concept/engine/Settings.kt
- components/concept/fetch/src/main/java/mozilla/components/concept/fetch/Request.kt
- components/concept/toolbar/src/main/java/mozilla/components/concept/toolbar/Toolbar.kt
- components/feature/addons/src/main/java/mozilla/components/feature/addons/amo/AddonCollectionProvider.kt
- components/feature/addons/src/main/res/layout/mozac_feature_addons_fragment_dialog_addon_installed.xml
- components/feature/app-links/build.gradle
- components/feature/app-links/src/main/java/mozilla/components/feature/app/links/AppLinksFeature.kt
- components/feature/app-links/src/main/java/mozilla/components/feature/app/links/AppLinksUseCases.kt
- components/feature/contextmenu/src/main/java/mozilla/components/feature/contextmenu/ContextMenuCandidate.kt
- components/feature/downloads/build.gradle
- components/feature/downloads/src/main/java/mozilla/components/feature/downloads/AbstractFetchDownloadService.kt
- components/feature/downloads/src/main/java/mozilla/components/feature/downloads/DownloadsFeature.kt
- components/feature/privatemode/src/main/java/mozilla/components/feature/privatemode/notification/PrivateNotificationFeature.kt
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/compare…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/android-components/-/compare…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

[Git][tpo/applications/fenix][tor-browser-88.0.0b4-10.5-1] 8 commits: Bug 40002: Add GitLab CI
by Matthew Finkel 20 Apr '21
by Matthew Finkel 20 Apr '21
20 Apr '21
Matthew Finkel pushed to branch tor-browser-88.0.0b4-10.5-1 at The Tor Project / Applications / fenix
Commits:
5338cbd3 by Matthew Finkel at 2021-04-06T22:08:25+00:00
Bug 40002: Add GitLab CI
Pin CI builds to runners with 32GB of RAM to avoid OOM conditions.
- - - - -
191a835d by Matthew Finkel at 2021-04-06T22:08:25+00:00
Rename as Tor Browser
Bug 40020: Change applicationId
Bug 40020: Change app name
Bug 40020: Change deeplink scheme
Bug 40020: Change App icons
Bug 40073: Use correct branding on About page
Bug 40088: Use Tor Browser logo in migration screen
- - - - -
805473e1 by Matthew Finkel at 2021-04-06T22:08:25+00:00
Disable features and functionality
Bug 33594: Disable data collection by default (Glean)
Bug 40019: Adjust is disabled on Release when data collection is disabled
Bug 34338: Disable the crash reporter
Bug 40014: Neuter Google Advertising ID
Bug 40018: Disable Push service
Bug 40034: Disable PWA onboading
Bug 40072: Disable Tracking Protection
Bug 40061: Do not show "Send to device" in sharing menu
Bug 40109: Reduce requested permissions
Exclude LOCATION and NETWORK_STATE
- - - - -
fa2eafbb by Georg Koppen at 2021-04-06T22:08:25+00:00
Modify build system
Bug 40083: Make locale ordering in BuildConfig deterministic
Bug 40042: Add option do overwrite timestamp in extension version
Bug 40059: Use MOZ_BUILD_DATE for versionCode
At the same time we adapt MOZ_BUILD_DATE to our needs where it is
actually used and not in tor-browser-build. This gives us more
flexibility. See: tor-browser-build#40084.
Bug 40067: Fix reproducibility issue in classes2.dex
We make sure our MOZ_BUILD_DATE gets used as a source for showing date
related information on the Fenix about page.
Bug 40071: Show only supported locales
Bug 40064: Use Gecko Beta for Nightly and Debug variants
Bug 40123: Allow building the instrumented tests apks for variants other than debug
This allows to specify the variant of the instrumented tests via
a `testBuildType` gradle argument. It also applies a workaround for
a R8 issue from https://issuetracker.google.com/issues/140851070.
Bug 40143: Use deterministic date in Test apk
The build config was using Date() when generating the Test apk's
versionName.
- - - - -
47deabfc by Matthew Finkel at 2021-04-20T02:19:33+00:00
Add Tor integration and UI
Bug 40001: Start Tor as part of the Fenix initialization
Bug 40028: Implement Tor Service controller
Bug 40028: Integrate Tor Controller into HomeFragment
Bug 40028: Implement Tor connect and logger screens
Bug 40028: Implement Tor Onboarding
Bug 40028: Implement new home screen
Bug 40028: Define bootstrapping events and Quick Start
Bug 40041: Implement Tor Network Settings
Bug 40041: Integrate Tor Network Settings
- - - - -
f2645d89 by Alex Catarineu at 2021-04-20T02:19:33+00:00
Modify UI/UX
Bug 40015: Modify Home menu
Bug 40016: Hide unwanted Settings
Bug 40016: Modify Default toolbar menu
Bug 40016: Add Donate settings button
Bug 40016: Move Allow Screenshots under Advanced
Bug 40016: Don't install WebCompat webext
Bug 40016: Don't onboard Search Suggestions
Bug 40094: Do not use MasterPasswordTipProvider in HomeFragment
Bug 40095: Hide "Sign in to sync" in bookmarks
Bug 40031: Hide Mozilla-specific items on About page
Bug 40032: Set usesCleartextTraffic as false
Bug 40063: Do not sort search engines alphabetically
Bug 34378: Port external helper app prompting
With the corresponding android-components patch, this allows all `startActivity`
that may open external apps to be replaced by `TorUtils.startActivityPrompt`.
Bug 34403: Disable Normal mode by default
Bug 40087: Implement a switch for english locale spoofing
Bug 40144: Hide Download Manager
Bug 40141: Hide EME site permission
- - - - -
16e71cc2 by Alex Catarineu at 2021-04-20T02:19:33+00:00
Modify Add-on support
Bug 40030: Install HTTPS Everywhere and NoScript addons on startup
HTTPS Everywhere is installed as a builtin extension and NoScript as
a regular AMO addon. To avoid unnecessary I/O we only install NoScript
the first time, and rely on the browser addon updating mechanism for
keeping up with new versions. This is the same behaviour that was
implemented in the Fennec-based Tor Browser, where it was installed
as a "distribution addon", which also only occurred once.
Bug 40062: HTTPS Everywhere is not shown as installed
Also 40070: Consider storing the list of recommended addons
This implements our own AddonsProvider, which loads the list of
available addons from assets instead of fetching it from an
endpoint. In this list, we replace https-everywhere by
our https-everywhere-eff, so that the EFF one is shown as installed
in the addons list and the AMO one is not displayed.
Also, we hide the uninstall button for builtin addons.
Bug 40058: Hide option for disallowing addon in private mode
- - - - -
81e94daa by Matthew Finkel at 2021-04-20T02:23:54+00:00
Add Security Level UI
Bug 40026: Implement Security Level settings
Bug 40026: Integrate Security Level settings
- - - - -
30 changed files:
- + .gitlab-ci.yml
- app/build.gradle
- app/proguard-rules.pro
- app/src/androidTest/java/org/mozilla/fenix/ui/robots/SettingsSubMenuAboutRobot.kt
- − app/src/beta/res/drawable/ic_launcher_foreground.xml
- app/src/beta/res/mipmap-hdpi/ic_launcher.png
- app/src/beta/res/mipmap-mdpi/ic_launcher.png
- app/src/beta/res/mipmap-xhdpi/ic_launcher.png
- app/src/beta/res/mipmap-xxhdpi/ic_launcher.png
- app/src/beta/res/mipmap-xxxhdpi/ic_launcher.png
- app/src/beta/res/values/static_strings.xml
- app/src/beta/res/xml/shortcuts.xml
- − app/src/debug/res/drawable/ic_launcher_foreground.xml
- app/src/debug/res/xml/shortcuts.xml
- app/src/main/AndroidManifest.xml
- + app/src/main/assets/allowed_addons.json
- app/src/main/java/org/mozilla/fenix/FenixApplication.kt
- app/src/main/java/org/mozilla/fenix/HomeActivity.kt
- app/src/main/java/org/mozilla/fenix/addons/InstalledAddonDetailsFragment.kt
- app/src/main/java/org/mozilla/fenix/browser/BaseBrowserFragment.kt
- app/src/main/java/org/mozilla/fenix/components/Analytics.kt
- app/src/main/java/org/mozilla/fenix/components/Components.kt
- app/src/main/java/org/mozilla/fenix/components/Core.kt
- + app/src/main/java/org/mozilla/fenix/components/TorAddonCollectionProvider.kt
- + app/src/main/java/org/mozilla/fenix/components/TorBrowserFeatures.kt
- app/src/main/java/org/mozilla/fenix/components/metrics/AdjustMetricsService.kt
- app/src/main/java/org/mozilla/fenix/components/metrics/MetricsUtils.kt
- app/src/main/java/org/mozilla/fenix/components/toolbar/DefaultToolbarMenu.kt
- app/src/main/java/org/mozilla/fenix/home/HomeFragment.kt
- app/src/main/java/org/mozilla/fenix/home/HomeMenu.kt
The diff was not included because it is too large.
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/compare/bcea234cee6b…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/compare/bcea234cee6b…
You're receiving this email because of your account on gitlab.torproject.org.
1
0
commit 54694e57164831ec0f170c42402090d8331be61c
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Apr 19 08:57:43 2021 +0000
Pick up rbm fix for rbm#40022
---
rbm | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/rbm b/rbm
index 1ebbf5e..4072294 160000
--- a/rbm
+++ b/rbm
@@ -1 +1 @@
-Subproject commit 1ebbf5ee34239a58d91e59acd0c2c85e1900aceb
+Subproject commit 407229448b4e714b4761a1a4f73208170671087a
1
0

[rbm/master] Bug 40022: Use projects/common directory in input_files
by gk@torproject.org 19 Apr '21
by gk@torproject.org 19 Apr '21
19 Apr '21
commit 407229448b4e714b4761a1a4f73208170671087a
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Tue Apr 13 17:01:29 2021 +0200
Bug 40022: Use projects/common directory in input_files
---
lib/RBM.pm | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/lib/RBM.pm b/lib/RBM.pm
index a81a290..57b5dde 100644
--- a/lib/RBM.pm
+++ b/lib/RBM.pm
@@ -793,6 +793,7 @@ sub input_files {
goto RETURN_RES unless $input_files;
my $proj_dir = rbm_path(project_config($project, 'projects_dir', $options));
my $src_dir = "$proj_dir/$project";
+ my $common_dir = "$proj_dir/common";
my $old_cwd = getcwd;
chdir $src_dir || exit_error "cannot chdir to $src_dir";
foreach my $input_file_alias (@$input_files) {
@@ -883,7 +884,7 @@ sub input_files {
origin_project => $project, %$input_file})
if $input_file->{project};
exit_error("Missing filename:\n" . pp($input_file)) unless $name;
- my ($fname) = file_in_dir($name, $src_dir, $proj_out_dir);
+ my ($fname) = file_in_dir($name, $src_dir, $proj_out_dir, $common_dir);
my $file_gpg_id = gpg_id($t->('file_gpg_id'));
if (input_file_need_dl($input_file, $t, $fname, $action)) {
if ($t->('content')) {
@@ -911,7 +912,7 @@ sub input_files {
dd $input_file;
exit_error "Missing file $name";
}
- ($fname) = file_in_dir($name, $src_dir, $proj_out_dir);
+ ($fname) = file_in_dir($name, $src_dir, $proj_out_dir, $common_dir);
exit_error "Error getting file $name" unless $fname;
}
if ($action eq 'input_files_id') {
1
0

[tor-browser-build/maint-10.0-desktop] Release preparation for 10.0.16
by sysrqb@torproject.org 16 Apr '21
by sysrqb@torproject.org 16 Apr '21
16 Apr '21
commit 67473253d678b22f0102dac6c370c8ac38e1048d
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Apr 15 03:49:57 2021 +0000
Release preparation for 10.0.16
Versions bump and Changelog update
---
projects/firefox/config | 4 ++--
projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt | 8 ++++++++
projects/tor-browser/config | 4 ++--
projects/tor-launcher/config | 2 +-
rbm.conf | 4 ++--
5 files changed, 15 insertions(+), 7 deletions(-)
diff --git a/projects/firefox/config b/projects/firefox/config
index 22b491c..e5baf06 100644
--- a/projects/firefox/config
+++ b/projects/firefox/config
@@ -1,14 +1,14 @@
# vim: filetype=yaml sw=2
version: '[% c("abbrev") %]'
filename: 'firefox-[% c("version") %]-[% c("var/osname") %]-[% c("var/build_id") %]'
-git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build3'
+git_hash: 'tor-browser-[% c("var/firefox_version") %]-[% c("var/torbrowser_branch") %]-1-build1'
tag_gpg_id: 1
git_url: https://git.torproject.org/tor-browser.git
git_submodule: 1
gpg_keyring: torbutton.gpg
var:
- firefox_platform_version: 78.9.0
+ firefox_platform_version: 78.10.0
firefox_version: '[% c("var/firefox_platform_version") %]esr'
torbrowser_branch: 10.0
branding_directory: 'browser/branding/alpha'
diff --git a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
index 924c893..59c6316 100644
--- a/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
+++ b/projects/tor-browser/Bundle-Data/Docs/ChangeLog.txt
@@ -1,3 +1,11 @@
+Tor Browser 10.0.16 -- April 20 2021
+ * Windows + OS X + Linux
+ * Update Firefox to 78.10.0esr
+ * Update NoScript to 11.2.4
+ * Bug 40007: Update domain fronting config for Moat [tor-launcher]
+ * Bug 40390: Add Burmese as a new locale [tor-browser]
+ * Bug 40408: Disallow SVG Context Paint in all web content [tor-browser]
+
Tor Browser 10.0.15 -- March 26 2021
* Windows + OS X + Linux
* Update Openssl to 1.1.1k
diff --git a/projects/tor-browser/config b/projects/tor-browser/config
index 20d920d..2c4575c 100644
--- a/projects/tor-browser/config
+++ b/projects/tor-browser/config
@@ -77,9 +77,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: eafc5f5be40d33a34d757940b5391455dad166921c880ee67daab056078d51ae
+ sha256sum: 278ee526d7c3ce5236c1a04aa5b6605c81b82399b846e43cdf6f93f11fef1ec9
- 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 0c9698a..1ebf3e1 100644
--- a/projects/tor-launcher/config
+++ b/projects/tor-launcher/config
@@ -1,5 +1,5 @@
# vim: filetype=yaml sw=2
-version: 0.2.26
+version: 0.2.28
git_url: https://git.torproject.org/tor-launcher.git
git_hash: '[% c("version") %]'
gpg_keyring: torbutton.gpg
diff --git a/rbm.conf b/rbm.conf
index 56f2cd7..e40f731 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -24,11 +24,11 @@ buildconf:
git_signtag_opt: '-s'
var:
- torbrowser_version: '10.0.15'
+ torbrowser_version: '10.0.16'
torbrowser_build: 'build1'
torbrowser_incremental_from:
- - 10.0.12
- 10.0.14
+ - 10.0.15
project_name: tor-browser
multi_lingual: 0
build_mar: 1
1
0

[tor-browser-build/maint-10.0-android] Bug 40268: Add Burmese (my) as a locale
by boklm@torproject.org 15 Apr '21
by boklm@torproject.org 15 Apr '21
15 Apr '21
commit ce84f0c196f010996904714d055e2d3741c9c63e
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Apr 7 15:35:07 2021 +0000
Bug 40268: Add Burmese (my) as a locale
Backported in Bug 40278
---
rbm.conf | 2 ++
1 file changed, 2 insertions(+)
diff --git a/rbm.conf b/rbm.conf
index 7546f1f..cbc705a 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -86,6 +86,7 @@ var:
- lt
- mk
- ms
+ - my
- nb-NO
- nl
- pl
@@ -119,6 +120,7 @@ var:
- ka
- ko
- lt
+ - my
- nb-rNO
- nl
- pl
1
0

[tor-browser-build/maint-10.0-desktop] Bug 40268: Add Burmese (my) as a locale
by boklm@torproject.org 15 Apr '21
by boklm@torproject.org 15 Apr '21
15 Apr '21
commit d5c080f0c1eb3c49d15a0e2e76274035f0b4a9ad
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Apr 7 15:35:07 2021 +0000
Bug 40268: Add Burmese (my) as a locale
Backported in Bug 40277
---
rbm.conf | 1 +
1 file changed, 1 insertion(+)
diff --git a/rbm.conf b/rbm.conf
index 6cdedde..56f2cd7 100644
--- a/rbm.conf
+++ b/rbm.conf
@@ -87,6 +87,7 @@ var:
- lt
- mk
- ms
+ - my
- nb-NO
- nl
- pl
1
0

[tor-browser/tor-browser-78.10.0esr-10.0-1] fixup! Bug 10760: Integrate TorButton to TorBrowser core
by sysrqb@torproject.org 15 Apr '21
by sysrqb@torproject.org 15 Apr '21
15 Apr '21
commit da7e5f4c2ce2e427f4db2f8e72989feafef2c8ab
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Thu Apr 15 14:56:07 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 a9372507c5c0..8a1913cdda9d 160000
--- a/toolkit/torproject/torbutton
+++ b/toolkit/torproject/torbutton
@@ -1 +1 @@
-Subproject commit a9372507c5c035aa94109223302f1c3e77932baa
+Subproject commit 8a1913cdda9d5f263596b47d7d77386452236dd0
1
0

15 Apr '21
commit 8a1913cdda9d5f263596b47d7d77386452236dd0
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Wed Apr 7 15:23:38 2021 +0000
Bug 40033: Add Burmese (my) as a locale
Backported in Bug 40034
---
chrome/locale/my/aboutDialog.dtd | 19 +++
chrome/locale/my/aboutTBUpdate.dtd | 8 ++
chrome/locale/my/aboutTor.dtd | 56 +++------
chrome/locale/my/brand.dtd | 17 ++-
chrome/locale/my/brand.properties | 19 +--
chrome/locale/my/branding/tor-browser-brand.ftl | 12 +-
chrome/locale/my/browserOnboarding.properties | 72 +++++++++++
chrome/locale/my/torbutton.dtd | 51 ++++++--
chrome/locale/my/torbutton.properties | 155 +++++++++++++++++++++---
import-translations.sh | 2 +-
jar.mn | 2 +
11 files changed, 328 insertions(+), 85 deletions(-)
diff --git a/chrome/locale/my/aboutDialog.dtd b/chrome/locale/my/aboutDialog.dtd
new file mode 100644
index 00000000..74eef2f4
--- /dev/null
+++ b/chrome/locale/my/aboutDialog.dtd
@@ -0,0 +1,19 @@
+<!ENTITY project.start "&brandShortName; ááᯠáááºáá®ážáá°ááẠ">
+<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
+<!ENTITY project.tpoLink "&vendorShortName;">
+<!ENTITY project.end "á áááºážááẠá¡áœááºááá¯ááºážáá±á«áºááœáẠáááºá áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±áž ááŸáá·áº ááœááºáááºááœáá·áºááᯠáá¯áá¶áá¬ááœááºááẠáá¯ááºáá±á¬ááºáá±á¬ á¡áá»áá¯ážá¡ááŒááºááá°áá±á¬ á¡ááœá²á·á¡á
ááºážáá
áºáá¯ááŒá
áºáááºá">
+
+<!ENTITY help.start "áá°áá®áá»ááºáá«ááá¬áž?">
+<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
+<!ENTITY help.donateLink "ááŸá°áá«ááºážáááº">
+<!ENTITY help.or "ááá¯á·ááá¯ááº">
+<!-- LOCALIZATION NOTE (help.getInvolvedLink): This is a link title that links to https://www.torproject.org/getinvolved/volunteer.html.en -->
+<!ENTITY help.getInvolvedLink "áá«áááºáá¯ááºáá±á¬ááºáááº">
+<!ENTITY help.end "!">
+<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
+<!ENTITY bottomLinks.questions "áá±ážá
áá¬áá»á¬ážááŸááŠážááá¬áž?">
+<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/getinvolved/relays -->
+<!ENTITY bottomLinks.grow "Tor ááœááºáááºááᯠááŒá®ážááœá¬ážáááºáá°áá®áá«!">
+<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to about:license -->
+<!ENTITY bottomLinks.license "ááá¯ááºá
ááºá¡ááŒá±á¬ááºáž áááá±á¬ááºážá
áá¬">
+<!ENTITY tor.TrademarkStatement ""Tor" ááŸáá·áº "Onion Logo" (ááŒááºááœááºáá®á¡ááŸááºáá¶ááááºáááºá¹áá±á) ááẠTor Project, Inc. áááŸááºáá¯á¶áááºáá¬ážáá±á¬áá¯ááºá¡ááŸááºáá¶ááááºááŒá
áºáááºá">
diff --git a/chrome/locale/my/aboutTBUpdate.dtd b/chrome/locale/my/aboutTBUpdate.dtd
new file mode 100644
index 00000000..3878e860
--- /dev/null
+++ b/chrome/locale/my/aboutTBUpdate.dtd
@@ -0,0 +1,8 @@
+<!ENTITY aboutTBUpdate.changelogTitle "Tor ááá±á¬ááºáᬠChangeLog (ááŒá±á¬ááºážáá²ááŸá¯ááŸááºáááºáž)">
+<!ENTITY aboutTBUpdate.updated "Tor ááá±á¬ááºáá¬ááᯠá¡ááºááááºááŒá¯áá¯ááºáá¬ážáááºá">
+<!ENTITY aboutTBUpdate.linkPrefix "á€áá¯ááºááœáŸááºááŸá¯ááŸáá·áº áááºáááºá áá±á¬ááºáá¯á¶ážáá±á«áº ááááºážá¡áá»ááºá¡áááºáá»á¬ážá¡ááœááº">
+<!ENTITY aboutTBUpdate.linkLabel "áá»áœááºá¯ááºááá¯á·ááááºááºááá¯ááºááá¯á· áááºáá±á¬ááºááŒáá·áºááŸá¯áá«">
+<!ENTITY aboutTBUpdate.linkSuffix "á">
+<!ENTITY aboutTBUpdate.version "áá¬ážááŸááºáž">
+<!ENTITY aboutTBUpdate.releaseDate "ááŒááºá·áá»á®áááºá·áááºá
áœá²">
+<!ENTITY aboutTBUpdate.releaseNotes "ááŒáá·áºáá»á®ááŸááºáá»ááºáá»á¬áž">
diff --git a/chrome/locale/my/aboutTor.dtd b/chrome/locale/my/aboutTor.dtd
index 9f14022b..bdde5b28 100644
--- a/chrome/locale/my/aboutTor.dtd
+++ b/chrome/locale/my/aboutTor.dtd
@@ -1,47 +1,31 @@
<!--
- - Copyright (c) 2014, The Tor Project, Inc.
+ - Copyright (c) 2019, The Tor Project, Inc.
- See LICENSE for licensing information.
- vim: set sw=2 sts=2 ts=8 et syntax=xml:
-->
-<!ENTITY aboutTor.title "About Tor">
+<!ENTITY aboutTor.title "Tor á¡ááŒá±á¬ááºáž">
-<!ENTITY aboutTor.outOfDateTorOn.label "HOWEVER, this browser is out of date.">
-<!ENTITY aboutTor.outOfDateTorOff.label "ALSO, this browser is out of date.">
-<!ENTITY aboutTor.outOfDate2.label "Click on the onion and then choose Download Tor Browser Bundle Update.">
+<!ENTITY aboutTor.viewChangelog.label "ááŒá±á¬ááºážáá²ááŸááºáááºáž ááŒááºá·áááº">
-<!ENTITY aboutTor.check.label "Test Tor Network Settings">
+<!ENTITY aboutTor.ready.label "áá¯á¶ááŒá¯á¶á
áœá¬ áá¯á¶ážá
áœá²áá«á">
+<!ENTITY aboutTor.ready2.label "áááºááẠá¡ááºáá¬áááºááᯠá¡áá¯á¶ááŒá¯á¶áá¯á¶ážá
áœá¬ áá¯á¶ážá
áœá²ááá¯á· á¡áááºáááºá·ááŒá
áºáá«ááŒá®á">
+<!ENTITY aboutTor.failure.label "áá
áºáá¯áᯠááŸá¬ážááœááºážááœá¬ážáá«áááº!">
+<!ENTITY aboutTor.failure2.label "ဠááá±á¬ááºáá¬ááœáẠTor á¡áá¯ááºááá¯ááºáá«á">
-<!ENTITY aboutTor.success.label "Congratulations!">
-<!ENTITY aboutTor.success2.label "This browser is configured to use Tor.">
-<!ENTITY aboutTor.success3.label "You are now free to browse the Internet anonymously.">
-<!ENTITY aboutTor.failure.label "Something Went Wrong!">
-<!ENTITY aboutTor.failure2.label "Tor is not working in this browser.">
-<!ENTITY aboutTor.failure3prefix.label "For assistance, please contact ">
-<!ENTITY aboutTor.failure3Link "help(a)rt.torproject.org">
-<!ENTITY aboutTor.failure3suffix.label ".">
+<!ENTITY aboutTor.search.label "DuckDuckGo ááŒááºá· ááŸá¬ááœá±áááº">
+<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
-<!ENTITY aboutTor.search.label "Search">
-<!ENTITY aboutTor.searchSPPost.link "https://startpage.com/do/search">
-<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com/html/">
+<!ENTITY aboutTor.torbrowser_user_manual_questions.label "áá±ážá
áá¬áá»á¬áž ááŸááŠážááá¬áž?">
+<!ENTITY aboutTor.torbrowser_user_manual_link.label "áá»áœááºá¯ááºááá¯á· Tor ááá±á¬ááºáᬠáááºá
áœá²á
á¬á¡á¯ááºá¡á¬áž ááŒáá·áºááŒááºá·á᫠»">
+<!-- The next two entities are used within the browser's Help menu. -->
+<!ENTITY aboutTor.torbrowser_user_manual.accesskey "M">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Tor ááá±á¬ááºáᬠáááºá
áœá²á
á¬á¡á¯ááº">
-<!ENTITY aboutTor.torInfo1.label "Additional Info:">
-<!ENTITY aboutTor.torInfo2.label "Country & IP Address:">
-<!ENTITY aboutTor.torInfo3.label "Exit Node:">
-<!ENTITY aboutTor.torInfo4.label "This server does not log any information about visitors.">
-<!ENTITY aboutTor.whatnextQuestion.label "What Next?">
-<!ENTITY aboutTor.whatnextAnswer.label "Tor is NOT all you need to browse anonymously! You may need to change some of your browsing habits to ensure your identity stays safe.">
-<!ENTITY aboutTor.whatnext.label "Tips On Staying Anonymous »">
-<!ENTITY aboutTor.whatnext.link "https://www.torproject.org/download/download.html.en#warning">
-<!ENTITY aboutTor.helpInfo1.label "You Can Help!">
-<!ENTITY aboutTor.helpInfo2.label "There are many ways you can help make the Tor Network faster and stronger:">
-<!ENTITY aboutTor.helpInfo3.label "Run a Tor Relay Node »">
-<!ENTITY aboutTor.helpInfo3.link "https://www.torproject.org/docs/tor-doc-relay.html.en">
-<!ENTITY aboutTor.helpInfo4.label "Volunteer Your Services »">
-<!ENTITY aboutTor.helpInfo4.link "https://www.torproject.org/getinvolved/volunteer.html.en">
-<!ENTITY aboutTor.helpInfo5.label "Make a Donation »">
-<!ENTITY aboutTor.helpInfo5.link "https://www.torproject.org/donate/donate.html.en">
+<!ENTITY aboutTor.tor_mission.label "Tor Project ááẠáá°á·á¡ááœááºá·á¡áá±ážááŸááºá· ááœááºáááºáá±ážááœááºá·áá»á¬ážááᯠááá¯ážáááºá
á±ááẠá¡áá±ááááẠá¡áá»áá¯ážá¡ááŒááºááá°áá±á¬ á
áá(á)(á) á¡ááœá²á·á¡á
ááºážáá
áºáᯠááŒá
áºáá«áááºá ááœááºáááºá á¡áááºááŸááºáᬠá¡áá»á¬ážáá¯á¶ážááá¯ááºááŒá®áž áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±ážá
á±á¬ááºá·ááŸá±á¬ááºáá±á¬ áááºážááá¬áá»á¬áž á¡áá¯á¶ážááŒá¯áá«áááºá áááºážáááºážááá¬áá»á¬ážááᯠá¡áááºá·á¡áááºáááŸáá
áœá¬ áá¯á¶ážá
áœá²ááá¯ááºááŒááºážááŸááºá· áááá¹áá¶ááá¯ááºáá¬ááŸááºá· ááŒááºáá°áá»á¬ážáá¬ážáááºááá¯ááºá
á±ááẠáá¶á·
ááá¯ážáá±á¬ááºáá¶á·áá«áááºá">
+<!ENTITY aboutTor.getInvolved.label "áá«áááºá᫠»">
-<!ENTITY aboutTor.footer.label "The Tor Project is a US 501(c)(3) non-profit dedicated to the research, development, and education of online anonymity and privacy.">
-<!ENTITY aboutTor.learnMore.label "Learn more about The Tor Project »">
-<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+<!ENTITY aboutTor.newsletter.tagline "Tor á០áá±á¬ááºáá¯á¶ážááááºážáá»á¬ážááᯠáááºá· á
á¬áááºáá¯á¶ážáá²áááºáž ááá°ááá¯ááºáá«á">
+<!ENTITY aboutTor.newsletter.link_text "Tor News ááááºážáá»á¬ážá¡ááœáẠá¡ááẠá
á¬áááºážááœááºážááá¯ááºáá«á">
+<!ENTITY aboutTor.donationBanner.freeToUse "Tor ááẠáááºá·ááᯠáá¯á¶ážáá°áá»á¬ážá០ááŸá°áá«ááºážááœá±ááŒá±á¬ááºá· á¡ááá²á·áá¯á¶ážááá¯ááºáá«áááºá">
+<!ENTITY aboutTor.donationBanner.buttonA "á¡áá¯áá² ááŸá°áááº">
diff --git a/chrome/locale/my/brand.dtd b/chrome/locale/my/brand.dtd
index 6b072f5c..6df03e49 100644
--- a/chrome/locale/my/brand.dtd
+++ b/chrome/locale/my/brand.dtd
@@ -2,11 +2,18 @@
- 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/. -->
-<!ENTITY brandShortName "Tor Browser">
-<!ENTITY brandFullName "Tor Browser">
-<!ENTITY vendorShortName "Tor Project">
-<!ENTITY trademarkInfo.part1 "'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.">
+<!ENTITY brandShorterName "Tor ááá±á¬ááºáá¬">
+<!ENTITY brandShortName "Tor ááá±á¬ááºáá¬">
+<!ENTITY brandFullName "Tor ááá±á¬ááºáá¬">
+<!ENTITY vendorShortName "Tor á
á®áá¶ááááºáž ááá±á¬áá»ááº">
+<!ENTITY trademarkInfo.part1 ""Tor" ááŸáá·áº "Onion Logo" (ááŒááºááœááºáá®á¡ááŸááºáá¶ááááºáááºá¹áá±á) ááẠTor Project, Inc. á ááŸááºáá¯á¶áááºáá¬ážáá±á¬ áá¯ááºá¡ááŸááºáá¶ááááºááŒá
áºáááºá">
<!-- LOCALIZATION NOTE (brandProductName):
This brand name can be used in messages where the product name needs to
remain unchanged across different versions (Nightly, Beta, etc.). -->
-<!ENTITY brandProductName "Tor Browser">
+<!ENTITY brandProductName "Tor ááá±á¬ááºáá¬">
+
+<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
+<!ENTITY plugins.installed.find "áááºááœááºážáá¬ážáá±á¬ áááºááá¯ážá
áá
áºáá±á¬á·áá²áá»á¬ážááᯠáááºáá¯á¶ážááẠááŸáááºáá«">
+<!ENTITY plugins.installed.enable "áááºááá¯áž áá±á¬á·áá²áá»á¬áž ááœááºá·áááº">
+<!ENTITY plugins.installed.disable "áááºááá¯áž áá±á¬á·áá²áá»á¬áž ááááºáááº">
+<!ENTITY plugins.installed.disable.tip "áááºááá¯ážá
áá
áºáá±á¬á·áá²áá»á¬ážááᯠáááºáá¯á¶ážááŒááºážááŸâ ááŸá±á¬ááºááŒá¥áºááẠááŸáááºáá«">
diff --git a/chrome/locale/my/brand.properties b/chrome/locale/my/brand.properties
index 1ba6ed31..385dab96 100644
--- a/chrome/locale/my/brand.properties
+++ b/chrome/locale/my/brand.properties
@@ -2,18 +2,19 @@
# 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/.
-brandShortName=Tor Browser
-brandFullName=Tor Browser
+brandShorterName=Tor ááá±á¬ááºáá¬
+brandShortName=Tor ááá±á¬ááºáá¬
+brandFullName=Tor ááá±á¬ááºáá¬
# LOCALIZATION NOTE(brandProductName):
# This brand name can be used in messages where the product name needs to
# remain unchanged across different versions (Nightly, Beta, etc.).
-brandProductName=Tor Browser
-vendorShortName=Tor Project
+brandProductName=Tor ááá±á¬ááºáá¬
+vendorShortName=Tor á
á®áá¶ááááºáž ááá±á¬áá»ááº
-homePageSingleStartMain=Firefox Start, a fast home page with built-in search
-homePageImport=Import your home page from %S
+homePageSingleStartMain=Firefox Startá ááŸá¬ááœá±ááẠáááááá¬ááœááºážáá¬ážááŒá®áž áá»ááºááŒááºáá±á¬ áááºáá
á¬áá»ááºááŸá¬
+homePageImport=%S áá¶á០áááºá· áááºáá
á¬áá»ááºááŸá¬ áááºááœááºážáá«
-homePageMigrationPageTitle=Home Page Selection
-homePageMigrationDescription=Please select the home page you wish to use:
+homePageMigrationPageTitle=áááºá á
á¬áá»ááºááŸá¬ ááœá±ážáá»ááºááŸá¯
+homePageMigrationDescription=áááºáá¯á¶ážááá¯áá±á¬ áááºáá
á¬áá»ááºááŸá¬ááᯠááœá±ážáá±ážáá« -
-syncBrandShortName=Sync
+syncBrandShortName=ááá¯ááºááá¯ááºááŸááá°áááº
diff --git a/chrome/locale/my/branding/tor-browser-brand.ftl b/chrome/locale/my/branding/tor-browser-brand.ftl
index af1fd648..d859549c 100644
--- a/chrome/locale/my/branding/tor-browser-brand.ftl
+++ b/chrome/locale/my/branding/tor-browser-brand.ftl
@@ -2,11 +2,11 @@
# that is used by Firefox) to avoid picking up the -brand-short-name values
# that Mozilla includes in the Firefox language packs.
--brand-shorter-name = Tor Browser
--brand-short-name = Tor Browser
--brand-full-name = Tor Browser
+-brand-shorter-name = Tor ááá±á¬ááºáá¬
+-brand-short-name = Tor ááá±á¬ááºáá¬
+-brand-full-name = Tor ááá±á¬ááºáá¬
# This brand name can be used in messages where the product name needs to
# remain unchanged across different versions (Nightly, Beta, etc.).
--brand-product-name = Tor Browser
--vendor-short-name = Tor Project
-trademarkInfo = 'Tor' and the 'Onion Logo' are registered trademarks of the Tor Project, Inc.
+-brand-product-name = Tor ááá±á¬ááºáá¬
+-vendor-short-name = Tor á
á®áá¶ááááºáž ááá±á¬áá»ááº
+trademarkInfo = 'Tor' ááŸáá·áº 'Onion Logo' (ááŒááºááœááºáá®á¡ááŸááºáá¶ááááºáááºá¹áá±á) ááẠTor Project, Inc. á ááŸááºáá¯á¶áááºáá¬ážáá±á¬ áá¯ááºá¡ááŸááºáá¶ááááºááŒá
áºáááºá
diff --git a/chrome/locale/my/browserOnboarding.properties b/chrome/locale/my/browserOnboarding.properties
new file mode 100644
index 00000000..1dbe28c9
--- /dev/null
+++ b/chrome/locale/my/browserOnboarding.properties
@@ -0,0 +1,72 @@
+# Copyright (c) 2019, The Tor Project, Inc.
+# See LICENSE for licensing information.
+# vim: set sw=2 sts=2 ts=8 et:
+
+onboarding.tour-tor-welcome=ááŒáá¯ááá¯áá«áááº
+onboarding.tour-tor-welcome.title=ááẠá¡áááºáááºá·ááŒá
áºáá«ááŒá®á
+onboarding.tour-tor-welcome.description=Tor ááá±á¬ááºáá¬ááẠá¡ááºáá¬áááºáá¯á¶ážá
áœá²á
á¥áº á¡ááŒááºá·áá¯á¶áž áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶ááŸá¯á¡á¬áž áá±ážááá¯á·áá«áááºá áááºá· á¡áœááºááá¯ááºážááŒá±áá¬ááá¯ááºáá¶áááŒááºážá á
á±á¬ááºá·ááŒááºá·áá¶áááŒááºáž ááŸááºá· áááºáá¬áá¶áááŒááºážááá¯á·á០ááá¯áá¬ááœááºáá¬ážáá±ážáá«áááºá ဠáááºážááœáŸááºááá¯ááẠáááºá·á¡á¬ážáááºáá²á·ááá¯á· áá¬ááœááºáá±ážáááºááᯠááŸááºážááŒáá«áááºá
+onboarding.tour-tor-welcome.next-button=áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±áž ááá¯á·ááœá¬ážáááº
+
+onboarding.tour-tor-privacy=áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±áž
+onboarding.tour-tor-privacy.title=áááºá· á¡áœááºááá¯ááºážááŒá±áá¬ááá¯ááºáá°áá»á¬ážááŸááºá· ááá±á¬ááºáá»á¬ážááᯠáááºáá»áá«á
+onboarding.tour-tor-privacy.description=Tor ááá±á¬ááºáá¬ááẠááœááºáá®ážáá»á¬ážááᯠáá®ážááŒá¬ážá
áœá¬áá¬ážá áááºá· ááá±á¬ááºáᬠáá¬ááááºá¡á¬áž áááºá¡áá¯á¶ážááŒá¯ááŒá®ážáá»áŸáẠáá»ááºááááºážáá±ážáá«áááºá á€áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááẠááá±á¬ááºáá¬á¡ááœááºážááŸá áááºá·áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶ááŸá¯ááᯠá
á±á¬ááºá·ááŸá±á¬ááºáá±ážáá«áááºá "Tor ááœááºáááº" ááá¯ááŸáááºá áá»áœááºá¯ááºááá¯á·á០ááœááºáááºá¡áááºá·ááœáẠáááºá·ááá¯áááºáá²á·ááá¯á· áá¬ááœááºááŸá¯áá±ážáááºááᯠáá±á·áá¬áá«á
+onboarding.tour-tor-privacy.button=Tor ááœááºááẠááá¯á·ááœá¬ážáááº
+
+onboarding.tour-tor-network=Tor ááœááºáááº
+onboarding.tour-tor-network.title=áááá¯ááááºážáá»á¯ááºááŸá¯ áááŸááá±á¬ ááœááºáááºáá±á«áº áááºááá¯ááºáá«á
+onboarding.tour-tor-network.description=ááá¹áá¬á¡ááŸá¶á·ááŸá áá¯ááºá¡á¬ážáá±ážáá°áá»á¬ážá០áááºáááºáá±ážáá±á¬ Tor ááœááºáááºááᯠáááºááŸááºá· Tor ááá±á¬ááºáá¬á០áá»áááºáá±ážáá«áááºá á¡ááºáá¬áááºááᯠáá¯á¶ááŒá¯á¶á
áœá¬áá¶á
á¬ážááá¯ááºáááºá¡ááœáẠVPN ááŸááºá·ááá°áá² áá»ááºááœááºááŸá¯áááŸááá« ááá¯á·ááá¯áẠáááá¯áá»á¯ááºá¡áá¬áá
áºáá¯á¡á¬áž áá¯á¶ááŒááºáááºáááá¯áá«á
+onboarding.tour-tor-network.description-para2=á¡áá
Ạ- Tor ááœááºááẠá¡ááŒááºá¡áááºáá»á¬ážááᯠáá»áááºááŸááá»ááºáá»á¬áž (âPreferences) ááá¯áááºá· ááá¹áááœáẠááœá±á·ááŸáááá¯ááºáá«áááºá (á¡áá»ááºážáá»ááºážáá»áááºáááºá áá»áœá±áá¬ááŒááºážáá¯ááºá
á¥áºáá»á¬áž (bridges) áá±á¬ááºážááá¯ááá¯ááºááŒááºáž á¡áá«á¡áááº)
+onboarding.tour-tor-network.action-button=áááºá· Tor ááœááºááẠá¡ááŒááºá¡áááºáá»á¬áž áá»áááºááŸááá«
+onboarding.tour-tor-network.button=áááºážááŒá±á¬ááºážá
á¥áº ááá¯á·ááœá¬ážáááº
+
+onboarding.tour-tor-circuit-display=áááºážááŒá±á¬ááºážá
á¥áº
+onboarding.tour-tor-circuit-display.title=áááºá·áááºážááŒá±á¬ááºážááᯠááŒááºá·áá«á
+onboarding.tour-tor-circuit-display.description=áááºáááºáá±á¬ááºááŒááºá·ááŸá¯áááºá· ááá¯ááááºážáá
áºáá¯áá»ááºážá
á®á¡ááœáẠáááºá·á¡ááœá¬ážá¡áá¬áá»á¬ážááᯠáááºáááºá·áááºážá ááá¹áá¬á¡ááŸá¶á·ááŸáâ Tor áááºážááŒá±á¬ááºáž á áá¯áá±á«áºá áá¯ááºááŒááºá·ááŒá±á¬ááºážáá²ááŸááºáá«áááºáâ áááºáááºáááºá·áá±áá¬á០áááºááœááºáá±áááºááᯠáááºáááºá·áááºááá¯ááºááá»áŸ ááááá«á áá»áœááºá¯ááºááá¯á·á áááºážááŒá±á¬ááºážá
á¥áºááŸá "á€ááá¯ááºá¡ááœáẠáááºážááŒá±á¬ááºážá¡áá
áº" ááᯠááŸáááºá áááºážááŒá±á¬ááºážá¡áá
áºááᯠáááºáá±á¬ááºážááá¯ááá¯ááºáá«áááºá
+onboarding.tour-tor-circuit-display.button=áá»áœááºá¯ááºá áááºážááŒá±á¬ááºážááŒááºá·áááº
+onboarding.tour-tor-circuit-display.next-button=áá¯á¶ááŒá¯á¶áá±áž ááá¯á·ááœá¬ážáááº
+
+onboarding.tour-tor-security=áá¯á¶ááŒá¯á¶áá±áž
+onboarding.tour-tor-security.title=áááºá· á¡ááœá±á·á¡ááŒá¯á¶ááᯠááœá±ážáá«á
+onboarding.tour-tor-security.description=áá»áœááºá¯ááºááá¯á·ááẠáááºá· ááá±á¬ááºáá¬áá¯á¶ááŒá¯á¶ááŸá¯ááᯠááá¯ááá¯áá¯á¶ááŒá¯á¶á
á±ááẠáááºá·á¡á¬áž á¡ááá¯á¡ááŒááºá¡áááºáá»á¬ážááŸááá«áááºá áá»áœááºá¯ááºááá¯á·á áá¯á¶ááŒá¯á¶áá±áž á¡ááŒááºá¡áááºáá»á¬ážááẠáááºá·ááœááºáá»á°áá¬ááᯠááá¯ááºááá¯ááºááá¯ááºáá±á¬ á¡áá¬áá»á¬ážááᯠááááºáááºááá¯ááºáá«áááºá á¡á±á¬ááºááœáẠááŸáááºá áááºááá¯á· ááŒááºáááºááá¯ááºááẠáá±á·áá¬áá«á
+onboarding.tour-tor-security.description-suffix=ááŸááºáá»áẠ- NoScript ááŸááºá· HTTPS Everywhere ááá¯áá±á¬ áááºááá¯ážáá±á¬á·áá²áá»á¬ážááẠáááááá¬á¡á¶áá²ááœáẠáá°áááŒááºáááºááŸá¯á¡á ááá«áá«á ááá¯á·áá±á¬áºáºáááºáž áááºá០áááááá¬á¡á¶ááᯠá
áááºááŒáá¯ááºá
áœá¬ ááŒá±á¬ááºážá áááºážááá¯á·ááᯠáá±á«ááºážáááºá·ááá¯ááºáá«áááºá
+onboarding.tour-tor-security-level.button=áááºá· áá¯á¶ááŒá¯á¶áá±ážá¡áááºá·ááᯠááŒááºá·áááº
+onboarding.tour-tor-security-level.next-button=á¡ááœá±á·á¡ááŒá¯á¶ á¡ááŒá¶áá±ážáá»ááºáá»á¬ážááá¯á· ááœá¬ážáááº
+
+onboarding.tour-tor-expect-differences=á¡ááœá±á·á¡ááŒá¯á¶ á¡ááŒá¶áá±ážáá»ááºáá»á¬áž
+onboarding.tour-tor-expect-differences.title=á¡áá»áá¯á·ááœá¬ááŒá¬ážááŸá¯áá»á¬áž áá»áŸá±á¬áºáááºá·áá¬ážáá«á
+onboarding.tour-tor-expect-differences.description=Tor á០áá¶á·ááá¯ážáá±ážáá¬ážáá±á¬ áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±áž á¡ááºá¹áá«áááºáá»á¬ážááŒá±á¬ááºá· áááºá¡ááºáá¬áááºáá¯á¶ážá
áœá²áá±á¬ á¡ááœá±á·á¡ááŒá¯á¶ááẠáá¬áááºááẠááœá¬ááŒá¬ážááá¯ááºáá«áááºá áááºá· áá¯á¶ááŒá¯á¶áá±ážá¡áááºá·áá±á«áºáá°áááºá áááºááá¯ááºá¡áá¬áá»á¬áž áááºááŒááŒááºážááẠááá¯ááŸá±ážááá¯ááºáá«áááºá á¡áá»áá¯á·á¡áá¬áá»á¬ážááẠá¡áá¯ááºááá¯ááºááŒááºáž ááá¯á·ááá¯áẠááááºááŒááá¯ááºááŒááºáž ááá¯á·ááŒá
áºáááºáá«áááºá áááºááẠáá°áá¯ááºááá¯ááºáááºááᯠá
á
áºáá±ážááŸá¯áá¶áááá¯ááºáá«á
ááºá
+onboarding.tour-tor-expect-differences.button=áá±ážáá±á·áá±ážáááŸááá±á¬ áá±ážááœááºážáá»á¬áž áááºáááº
+onboarding.tour-tor-expect-differences.next-button=Onion áááºáá±á¬ááºááŸá¯áá»á¬áž ááá¯á·ááœá¬ážáááº
+
+onboarding.tour-tor-onion-services=Onion áááºáá±á¬ááºááŸá¯áá»á¬áž
+onboarding.tour-tor-onion-services.title=á¡ááá¯áá¬ááœááºááŸá¯áá¶áá¬ážáá«á
+onboarding.tour-tor-onion-services.description= Onion áááºáá±á¬ááºááŸá¯áá»á¬ážááẠ.onion ááŸááºá· áá¯á¶ážáááºá· áááºááá¯ááºáá»á¬ážááŒá
áºáá«áááºá áááºážáááºáá±á¬ááºááŸá¯áá»á¬ážááẠáá¯ááºáá±áá°áá»á¬ážááŸááºá· áá¯á¶ážá
áœá²áá°áá»á¬ážááᯠá¡ááá¯áá¬ááœááºááŸá¯áá»á¬ážáá±ážáááºá·á¡ááŒáẠáááºáá¬áá¶áááŒááºážááá¯á·ááá¯áááºáž áááºá·áá»ááºááẠá¡áá¬ááœááºááŸá¯áá»á¬ážáááºážáá«áááºáá«áááºá Onion áááºáá±á¬ááºááŸá¯áá»á¬ážááẠáááºáá°ááá¯áááᯠá¡áááºááá±á«áºáá² á¡ááŒá±á¬ááºážá¡áá¬áá»á¬áž ááŸááºá· á¡ááŒá¬ážáááºáá±á¬ááºááŸá¯áá»á¬áž áá¯ááºáá±ááá¯ááºááẠá¡ááœááºá·áá
áºážáá±ážáá«áááºá á¡á±á¬ááºááœáẠááŸáááºá DuckDuckGo onion ááá¯ááºá¡á¬ážáááºáá±á·áá¬áá«á
+onboarding.tour-tor-onion-services.button=Onion ááá¯á·áááºáá±á¬ááºáá«
+onboarding.tour-tor-onion-services.next-button=ááŒá®ážááœá¬ážááŒá®
+
+onboarding.overlay-icon-tooltip-updated2=%S ááœááº\náá¬áá°ážááŒá¬ážáá»ááºááŸááá²ááŒááºá·áá«
+onboarding.tour-tor-update.prefix-new=á¡áá
áº
+onboarding.tour-tor-update.prefix-updated=á¡ááºááááºáá¯ááºááŒá®áž
+
+onboarding.tour-tor-toolbar=áááááá¬á¡á¶ toolbar
+onboarding.tour-tor-toolbar-update-9.0.title=ááœááºááá¯áẠOnion ááá¯ááºá
+onboarding.tour-tor-toolbar-update-9.0.description=áá»áœááºá¯ááºááá¯á·á០ááẠTor á¡áá¯á¶ážááŒá¯ááŒááºáž á¡ááœá±á·á¡ááŒá¯á¶ááᯠTor ááá±á¬ááºáá¬á¡áá²á á¡ááŒááºá·á¡á áá±á«ááºážá
ááºážáá¬ážá
á±áá»ááºáá«áááºá
+onboarding.tour-tor-toolbar-update-9.0.description-para2=á¡á²á·áá«ááŒá±á¬ááºá· onion ááá¯ááºáá¯á¶ážáááºá·á¡á
á¬áž áááºááẠáááºá· Tor áááºážááŒá±á¬ááºážááᯠ[i] URL á¡ááœááºááœáẠááœá±á·ááŸáááá¯ááºááŒá®áž áááááá¬á¡á¶ (toolbar) ááá¯áẠááá¯á·ááá¯áẠ[â¡] áá®áá°áž áá¯á¶ážá á¡áá±á¬ááºá¡áá¬ážá¡áá
áºááᯠáá±á¬ááºážááá¯ááá¯ááºáá«áááºá
+onboarding.tour-tor-toolbar-update-9.0.button=á¡áá±á¬ááºá¡áá¬ážá¡áá
Ạáááºááá¯á· áá±á¬ááºážááá¯ááááºáááºáž
+onboarding.tour-tor-toolbar-update-9.0.next-button=Tor ááœááºáááºáá±á«áº ááá¯á·ááœá¬ážáá«
+
+# Circuit Display onboarding.
+onboarding.tor-circuit-display.next=ááŸá±á·áááºáááº
+onboarding.tor-circuit-display.done=ááŒá®ážááœá¬ážááŒá®
+onboarding.tor-circuit-display.one-of-three=á áá¯á០á áá¯
+onboarding.tor-circuit-display.two-of-three=á áá¯á០á áá¯
+onboarding.tor-circuit-display.three-of-three=á áá¯á០á áá¯
+
+onboarding.tor-circuit-display.intro.title=áááºážááŒá±á¬ááºážá
á¥áºáá»á¬áž áááºáá²á·ááá¯á· á¡áá¯ááºáá¯ááºááááºáž?
+onboarding.tor-circuit-display.intro.msg=áá¬ážáá
áºáááºážááŒá±á¬ááºážáá»á¬ážááẠáá»áááºážáááºááŸááºáá¬ážáá±á¬ áááºáááºá·áááºážááŒááºážáá»á¬ážááŒááºá· áááºáá±á¬ááºáá¬ážáá«áááºá áááºážáááºáááºá·áááºážááŸá¯áá»á¬ážááẠááá¹áá¬á¡ááŸá¶á·ááŸá Tor á¡ááœá¬ážá¡áá¬áá»á¬ážááᯠáááºáááºá·áááºážááá¯ááºááẠáá»áááºááŸááá¬ážáááºá· ááœááºáá»á°áá¬áá»á¬ážááŒá
áºáá«áááºá áá¬ážáá
áºáááºážááŒá±á¬ááºážáá»á¬ážáááºÂ áááºá·ááᯠá¡ááºáá¬áááºáá¯á¶ááŒá¯á¶á
áœá¬áá¯á¶ážá
áœá²ááá¯ááºá
á±áááºááŸááºá· onion áááºáá±á¬ááºááŸá¯áá»á¬ážááŸááºá· áá»áááºáááºá
á±ááá¯ááºáá«áááºá
+
+onboarding.tor-circuit-display.diagram.title=áááºážááŒá±á¬ááºážá
á¥áº
+onboarding.tor-circuit-display.diagram.msg=á€áá¯á¶ááẠáááºážáááºááá¯ááºá¡ááœáẠáááºážááŒá±á¬ááºážá
á¥áºáá±ážáá±á¬ áááºáááºá·áááºážááŸá¯ááá¯á·ááᯠááŒááá«áááºá áááºááá¯ááºáá»á¬áž á¡áá»ááºážáá»ááºáž áá»áááºáááºááŒááºážáá»á¬ážááᯠáá¬ážááŒá
áºááẠáááºááá¯ááºáá
áºáá¯ááᯠááá°áá®áá±á¬ áááºážááŒá±á¬ááºážáá
áºáá¯á
á®áᬠáááŸááá«áááºá
+
+onboarding.tor-circuit-display.new-circuit.title=ááẠáááºážááŒá±á¬ááºážá¡áá
Ạááá¯á¡ááºáá«ááá¬áž?
+onboarding.tor-circuit-display.new-circuit.msg=áááºáááºáá±á¬ááºááẠááŒáá¯ážá
á¬ážáá±áá±á¬ áááºááá¯ááºááŸááºá· áá»áááºáááºááááá»áŸáẠáááºááẠá€ááá¯ááºá¡á¬ážá¡áá¯á¶ážááŒá¯á áááºááá¯ááºá¡á¬áž áááºážááŒá±á¬ááºážá¡áá
áºááŒááºá· ááŒááºáááºááá¯ááºáá«áááºá
diff --git a/chrome/locale/my/torbutton.dtd b/chrome/locale/my/torbutton.dtd
index eed16215..8f54338e 100644
--- a/chrome/locale/my/torbutton.dtd
+++ b/chrome/locale/my/torbutton.dtd
@@ -1,11 +1,15 @@
<!ENTITY torbutton.context_menu.new_identity "á¡áá±á¬ááºá¡áá¬áž á¡áá
áº">
-<!ENTITY torbutton.context_menu.new_identity_key "I">
-<!ENTITY torbutton.context_menu.networksettings "Open Network SettingsâŠ">
-<!ENTITY torbutton.context_menu.downloadUpdate "Download Tor Browser Bundle Update...">
-<!ENTITY torbutton.context_menu.downloadUpdate.key "A">
-<!ENTITY torbutton.context_menu.cookieProtections "ááœááºáá®áž áá¬ááœááºááŸá¯áá»á¬áž">
-<!ENTITY torbutton.context_menu.cookieProtections.key "C">
-<!ENTITY torbutton.button.tooltip "Torbutton ááᯠá¡á
ááŒá¯ááẠááŸáááºáá«á">
+<!ENTITY torbutton.context_menu.new_identity_key "á">
+<!ENTITY torbutton.context_menu.new_circuit "New Tor Circuit for this Site">
+<!ENTITY torbutton.context_menu.new_circuit_key "á">
+<!ENTITY torbutton.context_menu.networksettings "Tor ááœááºááẠá¡ááŒááºá¡áááºáá»á¬áž...">
+<!ENTITY torbutton.context_menu.networksettings.key "á">
+<!ENTITY torbutton.context_menu.downloadUpdate "Tor ááá±á¬ááºáᬠá¡ááºááááºá¡ááœáẠá
á
áºáá±ážáá«...">
+<!ENTITY torbutton.context_menu.downloadUpdate.key "á¡">
+<!ENTITY torbutton.context_menu.cookieProtections "ááœááºáá®áž á¡áá¬á¡ááœááºáá»á¬áž...">
+<!ENTITY torbutton.context_menu.cookieProtections.key "á">
+<!ENTITY torbutton.button.tooltip "Torbutton ááᯠá¡á
ááŒá¯ááẠááŸáááºáá«">
+<!ENTITY torbutton.prefs.security_settings "Tor ááá±á¬ááºáᬠáá¯á¶ááŒá¯á¶áá±áž á¡ááŒááºá¡áááºáá»á¬áž">
<!ENTITY torbutton.cookiedialog.title "ááœááºáá®áž áá¬ááœááºááŸá¯áá»á¬ážááᯠá
á®áá¶áááºá·ááœá²áááº">
<!ENTITY torbutton.cookiedialog.lockCol "á¡áá¬á¡ááœáẠáá¯ááºáá¬ážáááº">
<!ENTITY torbutton.cookiedialog.domainCol "Host">
@@ -13,8 +17,37 @@
<!ENTITY torbutton.cookiedialog.pathCol "áááºážááŒá±á¬ááºáž">
<!ENTITY torbutton.cookiedialog.protectCookie "ááœááºáá®ážááᯠáá¬ááœááºáááº">
<!ENTITY torbutton.cookiedialog.removeCookie "ááœááºáá®ážááᯠáááºáá¯ááºáááº">
-<!ENTITY torbutton.cookiedialog.unprotectCookie "ááœááºáá®ážááᯠáá¬ááœááºááá¬ážáá«">
-<!ENTITY torbutton.cookiedialog.removeAllBut "á¡á¬ážáá¯á¶ážááᯠáááºáá¯ááºáá«á ááá¯á·áá±á¬áº á¡áá¬á¡ááœáẠáá¯ááºáá¬ážáááº">
+<!ENTITY torbutton.cookiedialog.unprotectCookie "ááœááºáá®ážááᯠááá¬ááœááºáá¬ážáá«">
+<!ENTITY torbutton.cookiedialog.removeAllBut "á¡á¬ážáá¯á¶ážááᯠáááºáá¯ááºáá«á ááá¯á·áá±á¬áº á¡áá¬á¡ááœáẠáá¯ááºáá¬ážáááº">
<!ENTITY torbutton.cookiedialog.saveAllCookies "ááœááºáá®ážáá
áºáá»á¬ážááᯠáá¬ááœááºáááº">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "ááœááºáá®ážáá
áºáá»á¬ážááᯠáá¬ááœááºááŒááºáž áááŒá¯áááº">
+<!ENTITY torbutton.prefs.sec_caption "áá¯á¶ááŒá¯á¶âáá±ážá¡áááºá·">
+<!ENTITY torbutton.prefs.sec_caption_tooltip "áááºá· ááá±á¬ááºáá¬ááᯠáááºáá¬áá»á¬áž (hackers) á
á®áááºážááẠááá¯ááá¯áá¯áá¶á¡á¬ážáááºážá
á±áá±á¬ áááºá·ááá±á¬ááºáá¬á á¡áá»áá¯á·áá±á¬á¡ááºá¹áá«áááºáá»á¬ážááᯠáá¯á¶ááŒá¯á¶áá±áž ááœááºáááºáááááá¬á០ááááºáááºááá¯ááºáá«áááºá">
+<!ENTITY torbutton.prefs.sec_standard_label "áá¯á¶ááŸááº">
+<!ENTITY torbutton.prefs.sec_standard_description "Tor ááá±á¬ááºáᬠááŸááºá· áááºááá¯áẠá¡ááºá¹áá«áááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááœááºá·áá¬ážáá«áááºá">
+<!ENTITY torbutton.prefs.sec_safer_label "ááá¯ááá¯áá¯á¶ááŒá¯á¶áá±á¬">
+<!ENTITY torbutton.prefs.sec_safer_description " áááŒá¬áá á¡áá¹ááá¬ááºáá±ážááá¯ááºáá±á¬ áááºááá¯ááºá¡ááºá¹áá«áááºáá»á¬ážááᯠááááºáááºáá¬ážáá«áááºá ááá¯á·ááŒá
áºá á¡áá»áá¯á·áá±á¬ ááá¯ááºááá¯ááºááá¯ááºá
áœááºážáá»á¬áž áá¯á¶ážááŸá°á¶ážá
á±áááºá">
+<!ENTITY torbutton.prefs.sec_safer_list_label "ááá¯ááá¯áá¯á¶ááŒá¯á¶áá±á¬ á¡ááŒááºá¡áááºááœáẠ-">
+<!ENTITY torbutton.prefs.sec_safest_label "á¡áá¯á¶ááŒá¯á¶áá¯á¶áž">
+<!ENTITY torbutton.prefs.sec_safest_description "áááºááŒáááºáá±á¬ ááá¯ááºáá»á¬ážááŸááºá· á¡ááŒá±áá¶áááºáá±á¬ááºááŸá¯áá»á¬ážá¡ááœáẠááá¯á¡ááºáá±á¬ áááºááºááá¯ááºáá¡ááºá¹áá«áááºáá»á¬ážááá¯áᬠááœáá·áºááŒá¯áááºá á€ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááẠáá¯ááºáá¯á¶áá»á¬ážá áá®áá®áá¬áá»á¬áž ááŸááºá· áááá¯ááááºáá¬áá¬á
áá¬ážáá»á¬áž (scripts) ááá¯á·ááᯠááááá¯ááºá
á±áááºá">
+<!ENTITY torbutton.prefs.sec_safest_list_label "á¡áá¯á¶ááŒá¯á¶áá¯á¶áž á¡ááŒááºáááºááœáẠ-">
+<!ENTITY torbutton.prefs.sec_learn_more_label "áááºáá¶áá±á·áá¬áááº">
+<!ENTITY torbutton.prefs.sec_js_on_https_sites_only "HTTPS ááá¯ááºáá»á¬ážáá±á«áº ááá¯ááºáá±á¬ JavaScript ááá¯ááááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_js_disabled "ááá¯ááºáá»á¬ážá¡á¬ážáá¯á¶ážáá±á«áºááœáẠJavaScript ááᯠáá°áá¡ááŒááºá¡áááºá¡á ááááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_limit_typography "á¡áá»áá¯á·áá±á¬ á
á¬áá¯á¶ážá
ááá¯ááºáá»á¬áž ááŸááºá· áááºá¹áá»á¬áááºá¹áá±ááá»á¬ážááᯠááááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_limit_graphics_and_typography "á¡áá»áá¯á·áá±á¬ á
á¬áá¯á¶ážá
ááá¯ááºáá»á¬ážá á¡áá¯ááºááœááºáá»á¬ážá áááºá¹áá»á¬áááºá¹áá±ááá»á¬áž ááŸááºá· áá¯ááºáá¯á¶áá»á¬ážááá¯á·ááᯠááááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_click_to_play_media "á¡áá¶ ááŸááºá· áá®áá®ááá¯ááá¯ááºáá»á¬áž (HTML5 áá®áá®áá¬) ááŸááºá· WebGL ááá¯á·ááᯠááŸáááºáá
ááá¯ááºááẠ(click-to-play)">
+<!ENTITY torbutton.prefs.sec_custom_warning "á
áááºááŒáá¯áẠ">
+<!ENTITY torbutton.prefs.sec_overview "áááºá· áá¯á¶ááŒá¯á¶áá±ážááŸááºá· á¡áááºááŸááºááŸá¯ááá¯á·ááᯠááá¯ááºááá¯ááºá
á±ááá¯ááºáá±á¬ á¡áá»áá¯á·áá±á¬ áááºá¡ááºá¹áá«áááºáá»á¬ážááᯠááááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_standard_tooltip "áá¯á¶ááŒá¯á¶áá±ážá¡áááºá· - áá¯á¶ááŸááº">
+<!ENTITY torbutton.prefs.sec_safer_tooltip "áá¯á¶ááŒá¯á¶áá±ážá¡áááºá· - ááá¯ááá¯áá¯á¶ááŒá¯á¶áá±á¬">
+<!ENTITY torbutton.prefs.sec_safest_tooltip "áá¯á¶ááŒá¯á¶áá±ážá¡áááºá· - á¡áá¯á¶ááŒá¯á¶áá¯á¶áž">
+<!ENTITY torbutton.prefs.sec_custom_summary "ááẠá
áááºááŒáá¯ááºááœá±ážáá¬ážáá±á¬ ááá±á¬ááºáá¬á áá»áááºááŸáááŸá¯áá»á¬ážááẠáá¯á¶ááŸááºááá¯ááºáá±á¬ áá¯á¶ááŒá¯á¶áá±áž á¡ááŒááºá¡áááºáá»á¬áž ááŒá
áºáá±á«áºá
á±áá²á·áá«áááºá áá¯á¶ááŒá¯á¶áá±ážááŸááºá· áá¯áá¹ááá¯ááºáá¯á¶ááŒá¯á¶áá±áž á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážá¡ááœáẠáá°ááá¯á¶ááŒá¯á¶áá±ážá¡áááºá·ááá¯á· ááœá±ážáá¬ážááẠáá»áœááºá¯ááºááá¯á·á០á¡ááŒá¶ááŒá¯áá«áááºá">
<!ENTITY torbutton.prefs.sec_restore_defaults " áá°áá¡ááá¯ááºáž ááŒááºáá¬ážáááº">
+<!ENTITY torbutton.prefs.sec_advanced_security_settings "á¡áááºá·ááŒááºá· áá¯á¶ááŒá¯á¶áá±áž á¡ááŒááºá¡áááºáá»á¬áž...">
+<!ENTITY torbutton.circuit_display.title "Tor áááºážááŒá±á¬ááºáž">
+<!ENTITY torbutton.circuit_display.new_circuit "á€ááá¯ááºá¡ááœáẠáááºážááŒá±á¬ááºážá¡áá
áº">
+
+<!-- Onion services strings. Strings are kept here for ease of translation. -->
+<!ENTITY torbutton.onionServices.authPrompt.tooltip "Onion áááºáá±á¬ááºááŸá¯ áá¯á¶ážáá°á¡áááºááŒá¯ááẠáá±á¬ááºážááá¯á
ᬠááœááºá·áá«">
+<!ENTITY torbutton.onionServices.authPrompt.persistCheckboxLabel "á€áá®ážáá¯ááºá¡á¬áž ááŸááºáá¬ážáá«">
diff --git a/chrome/locale/my/torbutton.properties b/chrome/locale/my/torbutton.properties
index 043cb4a0..c894ba7e 100644
--- a/chrome/locale/my/torbutton.properties
+++ b/chrome/locale/my/torbutton.properties
@@ -2,26 +2,143 @@ torbutton.panel.tooltip.disabled = Tor ááᯠááœááºá·ááẠááŸ
torbutton.panel.tooltip.enabled = Tor ááᯠááááºááẠááŸáááºáá«
torbutton.panel.label.disabled = ááááºáá¬ážáá±á¬ Tor
torbutton.panel.label.enabled = ááœááºá·áá¬ážáá±á¬ Tor
-extensions.torbutton(a)torproject.org.description = Torbutton provides a button to configure Tor settings and quickly and easily clear private browsing data.
-torbutton.popup.external.title = ááŒááºáá០á¡ááŒá±á¬ááºážá¡áá¬ááᯠááœááºá·áááº
-torbutton.popup.external.app = ááŒááºá á¡áá¹ááá®áá±ážááŸááºáž áá
áºáá¯ááᯠááŒá±ááŸááºážááẠááá¯á¡ááºááẠ- \n\n
-torbutton.popup.external.note = \n\nááŸááºáá»áẠ- ááŒááºá á¡áá¹ááá®áá±ážááŸááºážáá»á¬ážááẠáá¯á¶ááŸááºá¡á¬ážááŒááºá· áá¯á¶ááŒá¯á¶áá±á¬ Tor ááá¯ááºáá«á áááºážá áááºá·ááᯠáá±á«áºááá¯ááºáááºá\n
-torbutton.popup.external.suggest = \ná¡áááºá á€ááá¯ááºááᯠá
áááºááá»áá«áá ááẠá¡á±á¬á·ááºááá¯ááºáž ááŸááá±áá»áááºá (ááá¯á·) VM áá
áºáá¯áá²ááœááº\n ááŸááá±áá»áááºááœáẠáááºážááᯠááŒááºá·ááẠááẠááááºážáááºážáá¬ážááá¯ááºááẠ(ááá¯á·) Tails LiveCD ááá¯á·ááá¯ááº\n torsocks ááá¯á·áá²á·ááá¯á·áá±á¬ Tor ááá±á¬ááºáá®ááᯠáá¯á¶ážá
áœá²ááẠá
ááºážá
á¬ážáá«á\n
-torbutton.popup.launch = á¡áá¹ááá®áá±ážááŸááºážááᯠááœááºá·áááº
-torbutton.popup.cancel = áá»ááºááááºážáááº
-torbutton.popup.dontask = ááá¯á¡áá»áááºááŸá
ááŒá®áž á¡áá¹ááá®áá±ážááŸááºážáá»á¬ážááᯠá¡ááŒá² ááœááºá·áááº
-torbutton.popup.prompted_language = áááºá· ááá¯ááºáá±ážááá¯ááºáᬠáá¯á¶ááŒá¯á¶áá±ážááᯠááá¯ááᯠáááŸááááºá Torbutton ááẠááœááºááẠá
á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡ááºá¹ááááẠáá¬áᬠáá¬ážááŸááºážááŒááºá· áá±á¬ááºážáá¶áá±ážááá¯ááºáááºá áááºážááá¯á·ááŒá¯áá¯ááºááŒááºážááẠáááºá· áá¬áá¬ááŒááºá· áááºááŸá¯ááá¯áá±á¬ ááœááºááẠá
á¬áá»ááºááŸá¬áá»á¬ážááᯠá¡ááºá¹ááááẠáá¬áá¬áááŒááºá· áá±á«áºááŒáá±ááẠááŒá
áºáááºá\n\náá¯á¶ááŒá¯á¶ááŸá¯ ááá¯ááŸááááºá¡ááœáẠá¡ááºá¹ááááẠáá¬áá¬ááŒááºá· ááœááºáááºá
á¬áá»ááºááŸá¬áá»á¬ážááᯠááẠáá±á¬ááºážáá¶ááá¯á
áá¬áž?
-torbutton.popup.no_newnym = Torbutton ááẠáááºá·á¡á¬áž á¡áá±á¬ááºá¡áá¬áž á¡áá
áºááᯠáá¯á¶áá¯á¶ááŒá¯á¶ááŒá¯á¶ ááá±ážááá¯ááºáá«á áááºážááẠTor ááááºážáá»á¯ááºáá±áž Port áá² ááááºáá±á¬ááºááá¯ááºáá«á\n\nTor Browser Bundle ááᯠááẠáá¯á¶ážá
áœá²áá±ááá¬áž?
-torbutton.title.prompt_torbrowser = Important Torbutton Information
-torbutton.popup.prompt_torbrowser = Torbutton works differently now: you can't turn it off any more.\n\nWe made this change because it isn't safe to use Torbutton in a browser that's also used for non-Tor browsing. There were too many bugs there that we couldn't fix any other way.\n\nIf you want to keep using Firefox normally, you should uninstall Torbutton and download Tor Browser Bundle. The privacy properties of Tor Browser are also superior to those of normal Firefox, even when Firefox is used with Torbutton.\n\nTo remove Torbutton, go to Tools->Addons->Extensions and then click the Remove button next to Torbutton.
-torbutton.popup.short_torbrowser = Important Torbutton Information!\n\nTorbutton is now always enabled.\n\nClick on the Torbutton for more information.
-
-torbutton.popup.confirm_plugins = Plugins such as Flash can harm your privacy and anonymity.\n\nThey can also bypass Tor to reveal your current location and IP address.\n\nAre you sure you want to enable plugins?\n\n
-torbutton.popup.never_ask_again = Never ask me again
+torbutton.circuit_display.internet = á¡ááºáá¬áááº
+torbutton.circuit_display.ip_unknown = áááááŸááá±á¬ IP
+torbutton.circuit_display.onion_site = Onion ááá¯ááº
+torbutton.circuit_display.this_browser = ဠááá±á¬ááºáá¬
+torbutton.circuit_display.relay = áááºáááºá·áááºáž
+torbutton.circuit_display.tor_bridge = Bridge
+torbutton.circuit_display.unknown_country = áááááŸááá±á¬ ááá¯ááºáá¶
+torbutton.circuit_display.guard = á
á±á¬ááºá·
+torbutton.circuit_display.guard_note = áááºá [Guard] node áááºááŒá±á¬ááºážáá²ááẠááá¯ááºáá«á
+torbutton.circuit_display.learn_more = áááºáá¶áá±á·áá¬áááº
+torbutton.circuit_display.click_to_copy = áá±á¬áºáá®áá°ážááẠááŸáááºáá«
+torbutton.circuit_display.copied = áá±á¬áºáá®áá°ážááŒá®áž!
+torbutton.content_sizer.margin_tooltip = Tor ááá±á¬ááºáá¬ááẠáááºá· áááºážááá¯ážá á¡áá»ááºááŸááºá· á¡ááŒááºá·ááᯠááááºááá°ážááŒá¬ážá¡á±á¬áẠá€á¡áá¬ážááẠáááºáá±á«ááºážáá±ážáá«áááºá ááá¯á·ááŒááºá· á¡ááŒá¬ážáá°áá»á¬ážááẠáááºá·á¡á¬áž á¡áœááºááá¯ááºážáá±á«áºááœáẠááá¯ááºááŸá¬ááœá±ááá¯ááºááŒááºáž áá»á±á¬á·áááºážá
á±áááºá
+extensions.torbutton(a)torproject.org.description = Torbutton ááẠTor á¡ááŒááºá¡áááºáá»á¬áž áá»áááºáááẠááŸááºá· á¡áœááºááá¯ááºážáá±á«áº ááá¯ááºááá¯ááºááŸá¯ááºááŸá¬ážááŸá¯áá¬ááááºá¡á¬áž ááœááºáá°áá»ááºááŒááºá
áœá¬ ááŸááºážáááºážááẠááá¯ááºáá
áºáᯠáá±ážáá«áááºá
+torbutton.popup.external.title = ááŒááºáááá¯ááºá¡áá»áá¯ážá¡á
á¬áž áá±á«ááºážáá¯ááºáá¯ááºáááºáá¬áž?
+torbutton.popup.external.app = Tor ááá±á¬ááºáá¬ááẠá€ááá¯ááºá¡á¬áž ááŒáááá¯á·áááá«á á¡ááŒá¬áž á¡áá¹ááá®áá±ážááŸááºážááŒááºá· áááºá០ááœááºá·áááºááá¯á¡ááºáá«áááºá\n\n
+torbutton.popup.external.note = á¡áá»áá¯á·ááá¯ááºá¡áá»áá¯ážá¡á
á¬ážáá»á¬ážááẠá¡áá¹ááá®áá±ážááŸááºážáá»á¬ážá¡á¬áž Tor á¡áá¯á¶ážáááŒá¯áá² á¡ááºáá¬áááºááŸááºá· áá»áááºááẠá
á±ááá¯ááºáá«áááºá\n\n
+torbutton.popup.external.suggest = áá¯á¶ááŒá¯á¶á
á±ááẠáááºááẠá¡áœááºááá¯ááºážáá±á«áºáááŸááá»ááẠááá¯á·ááá¯áẠTails ááá¯áá»áá¯áž Tor Live CD á¡áá¯á¶ážááŒá¯ááᬠáá±á«ááºážáá¯ááºááœá²áá¬ážáá±á¬ááá¯ááºáá»á¬ážááᯠááœááºá·áááºá·áá«áááºá\n
+torbutton.popup.launch = ááá¯ááºáá±á«ááºážáá¯ááºáááº
+torbutton.popup.cancel = áááºáá»ááºáááº
+torbutton.popup.dontask = ááá¯á¡áá»áááºááŸá
á ááá¯ááºáá»á¬ážááᯠá¡ááá¯á¡áá»á±á¬áẠáá±á«ááºážáá¯ááºááœá²áááº
+torbutton.popup.no_newnym = Torbutton ááẠáááºá·á¡á¬áž á¡áá±á¬ááºá¡áá¬áž á¡áá
áºááᯠáá¯á¶áá¯á¶ááŒá¯á¶ááŒá¯á¶ ááá±ážááá¯ááºáá«á áááºážááẠTor ááááºážáá»á¯ááºáá±áž Port áá² áááºáá±á¬ááºááœááºá·áááŸááá«á\n\nTor Browser Bundle ááᯠááẠáá¯á¶ážá
áœá²áá±áá«ááá¬áž?
+torbutton.security_settings.menu.title = áá¯á¶ááŒá¯á¶áá±áž á¡ááŒááºá¡áááºáá»á¬áž
+torbutton.title.prompt_torbrowser = á¡áá±ážááŒá®ážáá±á¬ Torbutton á¡áá»ááºá¡áááº
+torbutton.popup.prompt_torbrowser = Torbutton ááẠááá¯á¡áá« á¡áá¯ááºáá¯ááºáá¯á¶ ááá°áá±á¬á·áá«á áááºá áááºážááá¯ááºááᯠááááºááá¯á·áááá±á¬á·áá«á\n\nTor ááá«áá² ááá±á¬ááºáá¬ááᯠá¡áá¯á¶ážááŒá¯áá¯ááºáž Torbutton ááᯠááá±á¬ááºáá¬á¡ááœááºáž á¡áá¯á¶ážááŒá¯ááŒááºážááẠááá¯á¶ááŒá¯á¶á áá»áœááºá¯ááºááá¯á·á០á€ááŒá±á¬ááºážáá²áá»áẠááŒá¯áá¯ááºáá²á·áá«áááºá áá»ááºááœááºááŸá¯áá»á¬áž áá»á¬ážááœááºážá á¡ááŒá¬ážáááºážáááºážááŸááºá· ááŒá¯ááŒááºááá¯á·áááá±á¬á·ááá¯á·áá«á\n\náááºááŸâ Firefox á¡á¬áž áá¯á¶ááŸááºááá¯áá¯á¶ážá
áœá²ááá¯áá»áŸáẠáááºá០Torbutton á¡á¬áž áááºáá¯ááºá
áŒá®áž Tor Browser Bundle ááᯠáá±á«ááºážáá¯ááºáá¯ááºáááºá·áá«áááºá Tor ááá±á¬ááºáᬠá áá¯áá¹ááá¯ááºáá±ážá¡ááºá¹áá«áááºáá»á¬ážááẠáá¬ááẠááá±á¬ááºáá¬ááẠááá¯áá±á¬ááºážáá«áááºá Firefox ááᯠTorbutton ááŸááºá·áá¯á¶ážáá¬áááºáááºáž ááá¯áá¬áá«áááºá\n\nTorbutton á¡á¬áž áááºáá¯ááºááẠTools > Addons > Extensions ááá¯á·ááœá¬ážá Torbutton áá±ážááŸááá±á¬ "áááºáá¯ááºáááº" ááá¯áááºá· ááá¯ááºá¡á¬ážááŸáááºáá±ážáá«á
+torbutton.popup.short_torbrowser = á¡áá±ážááŒá®ážáá±á¬ Torbutton á¡áá»ááºá¡áááº!\n\nTorbutton ááẠááá¯á¡ááŒá²ááœááºá·áá¬ážáá«áááºá\n\nTorbutton á¡á¬áž ááŸáááºá á¡áá»ááºá¡áááºáá»á¬áž áááºáá¶áá±á·áá¬áá«á
+
+torbutton.popup.confirm_plugins = Flash ááá¯áá»áá¯áž ááá¯ážááœá²áá±á¬ ááááºááẠáá±á¬á·áá² (plugins) áá»á¬ážááẠáááºá· áááá¹áá¯áá¯á¶ááŒá¯á¶áá±ážááŸááºá· á¡áááºááŸááºááŒááºážááá¯á·ááᯠááááá¯ááºááá¯ááºá
á±áá«áááºá\n\náááºážááá¯á·ááẠáááºá·ááᯠáááºáá±áá¬ááŸááºá· IP ááááºá
á¬ááá¯á·ááᯠáá±á«áºáá¯ááºááẠTor ááᯠááŒááºáá»á±á¬áºááá¯ááºáá«áááºá\n\nááá¯ážááœá²áá±á¬ ááááºááẠáá±á¬á·áá² (plugins) áá»á¬ážááᯠááœááºá·áááºááŸá¬ áá±áá»á¬áá«ááá¬áž?\n\n
+torbutton.popup.never_ask_again = áá»áœááºá¯ááºáá¶ áááºáááºá·á¡áá»áááºáá»áŸ áááºááá±ážáá«ááŸááºá·
+torbutton.popup.confirm_newnym = Tor ááá±á¬ááºáá¬ááẠáááºááá¯ážááŸááºá· áááºááºáá»á¬ážá¡á¬ážáá¯á¶ážááᯠááááºáá«áááºá áááºááá¯áẠáááºááŒááºážáá»á¬áž á¡á¬ážáá¯á¶áž áá¯á¶ážááŸá°á¶ážááœá¬ážáá«áááºá\n\náááºá· ááá¯ááºáá±áž á¡áá±á¬ááºá¡áá¬ážáá»á¬áž ááŒááºáááºáááºáááºáá»ááẠTor ááá±á¬ááºáá¬ááᯠááááºááŒá®ážááŒááºááœááºá· ááá¬áž?\n\n
+
+torbutton.maximize_warning = Tor ááá±á¬ááºáá¬ááᯠá¡ááŒá®ážáá¯á¶ážááá¯ááºá¡áá áá»á²á·ááŒááºážá¡á¬ážááŒááºá· áááºááá¯ááºáá»á¬ážááẠáááºá· á
áááºááẠá¡ááœááºá¡á
á¬ážááᯠááááŸáááá¯ááºááŒá®áž áááºá·á¡á¬áž ááá¯ááºááŸá¬ááá¯á·áááá¯ááºáá«áááºá áá»áœááºá¯ááºááá¯á·á០áááºá· Tor ááá±á¬ááºáᬠáááºážááá¯ážááᯠáá°áááºážá¡ááœááºá¡á
á¬ážááŒááºá· áá¬ážááẠá¡ááŒá¶ááŒá¯áá«áááºá
# Canvas permission prompt. Strings are kept here for ease of translation.
-canvas.siteprompt=This website (%S) attempted to access image data on a canvas. Since canvas image data can be used to discover information about your computer, blank image data was returned this time.
-canvas.allow=Allow in the Future
+canvas.siteprompt=á€áááºááá¯ááºááẠ(%S) HTML5 ááá¹áá°áá¯ááºáá¯á¶áá±áá¬ááᯠáá¯ááºáá°ááẠááŒáá¯ážá
á¬ážáá±áá«áááºáâ áááºážáá±áá¬ááŒááºá· áááºá· ááœááºáá»á°áá¬ááᯠáááá»á
áœá¬áá±á«áºáá¯ááºááá¯ááºáá«áááºá\n\nTor ááá±á¬ááºáá¬á០áááºážáááºááá¯áẠHTML5 ááá¹áá°áá¯ááºáá¯á¶áá±áᬠáá¯ááºáá°ááŒááºážááᯠááœááºá·ááŒá¯ááááºáá¬áž?
+canvas.notNow=ááá¯ááá¯ááº
+canvas.notNowAccessKey=á
+canvas.allow=áá±á¬ááºááœáẠááœááºá·ááŒá¯áááº
canvas.allowAccessKey=A
-canvas.never=Never for This Site
+canvas.never=ဠááá¯ááºá¡ááœáẠáááºááá·áºá¡áá»áááºááŸá (á¡ááŒá¶ááŒá¯áááº)
canvas.neverAccessKey=e
+
+# Profile/startup error messages. Strings are kept here for ease of translation.
+# LOCALIZATION NOTE: %S is the application name.
+profileProblemTitle=%S áááá¯ááá¯áẠááŒá¿áá¬
+profileReadOnly=%S á¡á¬áž áááºáááºá¡ááœááºáᬠáááºááŸááºáá¬ážáá±á¬ ááá¯ááºá
áá
áºááŒááºá· (read-only file system) áááœááºá·ááá¯ááºáá«á áá»á±ážáá°ážááŒá¯á áááºážá¡á¬áž á
ááºáážáá¯á¶ážáá® á¡ááŒá¬ážáá±áá¬ááá¯á· %S á¡á¬áž áá±á¬áºáá®áá°ážáá±ážáá«á
+profileReadOnlyMac=%S á¡á¬áž áááºáááºá¡ááœááºáᬠáááºááŸááºáá¬ážáá±á¬ ááá¯ááºá
áá
áºááŒááºá· (read-only file system) áááœááºá·ááá¯ááºáá«á áá»á±ážáá°ážááŒá¯á áááºážá¡á¬áž á
ááºáážáá¯á¶ážáá® áááºá· Desktop ááá¯á·ááá¯áẠá¡áá¹ááá®áá±ážááŸááºážááá¯ááºááœá² áá²ááá¯á· %S á¡á¬áž áá±á¬áºáá®áá°ážáá±ážáá«á
+profileAccessDenied=%S ááẠáááá¯ááá¯áẠáá¯á¶ážááœááºá·áááŸááá«á áá»á±ážáá°ážááŒá¯á áááºá· ááá¯ááºá
áá
áºááœááºá·ááŒá¯áá»ááºáá»á¬áž ááŒá±á¬ááºážáá²á ááŒááºá
ááºážááŒááºá·áá±ážáá«á
+profileMigrationFailed=áááºá· %S áááá¯ááá¯áẠááŒá±á¬ááºážáá²ááŒááºážáá¡á±á¬ááºááŒááºáá«á\ná¡ááŒááºá¡áááºá¡áá
áºáá»á¬áž áá¯á¶ážá
áœá²áá«áááºá
+
+# "Downloading update" string for the hamburger menu (see #28885).
+# This string is kept here for ease of translation.
+# LOCALIZATION NOTE: %S is the application name.
+updateDownloadingPanelUILabel=%S á¡ááºáááºá¡á¬áž áá±á«ááºážáá¯ááºááœá²áá±áá«áááº
+
+# .Onion Page Info prompt. Strings are kept here for ease of translation.
+pageInfo_OnionEncryptionWithBitsAndProtocol=áá»áááºáááºááŸá¯á¡á¬áž áá¯ááºááŒááºá·ááŒá±á¬ááºážáá²ááŸááºááŒá®áž (Onion áááºáá±á¬ááºááŸá¯á %1$S, %2$S bit keys, %3$S)
+pageInfo_OnionEncryption=áá»áááºáááºááŸá¯á¡á¬áž áá¯ááºááŒááºá·ááŒá±á¬ááºážáá²ááŸááºááŒá®áž (Onion áááºáá±á¬ááºááŸá¯)
+pageInfo_OnionName=Onion á¡ááẠ-
+
+# Onion services strings. Strings are kept here for ease of translation.
+onionServices.learnMore=áááºáá¶áá±á·áá¬áááº
+onionServices.errorPage.browser=ááá±á¬ááºáá¬
+onionServices.errorPage.network=ááœááºáááº
+onionServices.errorPage.onionSite=Onionsite
+# LOCALIZATION NOTE: In the longDescription strings, %S will be replaced with
+# an error code, e.g., 0xF3.
+# Tor SOCKS error 0xF0:
+onionServices.descNotFound.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.descNotFound.header=Onionsite áááœá±á·ááŸááá«
+onionServices.descNotFound=á¡ááŒá
áºááá¯ááºáá¯á¶áž á¡ááŒá±á¬ááºážáááºážááẠOnionsite ááá¯ááºážáá»ááŒááºážááŒá±á¬ááºá·ááŒá
áºáá«áááºá Onionsite á
á®áá¶áá°á¡á¬áž áááºááœááºáá±ážáá«á
+onionServices.descNotFound.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá±á¬ááºážááá¯áá¬ážáá±á¬ onion áááºáá±á¬ááºááŸá¯ áá±á«áºááŒá
á¬ááẠhashring ááœááºáááœá±á·ááŸáá áá¯á¶ážáá°á០áááºáá±á¬ááºááŸá¯á¡á¬áž áááºááŸááºážááá®ááá¯ááºáá«á
+# Tor SOCKS error 0xF1:
+onionServices.descInvalid.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.descInvalid.header=Onionsite á¡á¬áž ááá®ááá¯ááºáá«
+onionServices.descInvalid=Onionsite á¡á¬áž ááá®ááá¯ááºááŒááºážááẠá¡ááœááºážááŒá
áºáá±á¬ áá»ááºááœááºááŸá¯ááŒá±á¬ááºá·ááŒá
áºáá«áááºá
+onionServices.descInvalid.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá±á¬ááºážááá¯áá¬ážáá±á¬ onion áááºáá±á¬ááºááŸá¯ áá±á«áºááŒá
á¬ááẠáááºážá
á
áºááááá« ááá¯á·ááá¯áẠáááºááŸááºá¡áááºááŒá¯ááŒááºáž áá¡á±á¬ááºááŒááºáá«á
+# Tor SOCKS error 0xF2:
+onionServices.introFailed.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.introFailed.header=Onionsite ááŸááºá· áá»áááºáááºááŸá¯ááŒááºááœá¬áž
+onionServices.introFailed=á¡ááŒá
áºááá¯ááºáá¯á¶áž á¡ááŒá±á¬ááºážáááºážááẠOnionsite ááá¯ááºážáá»ááŒááºážááŒá±á¬ááºá·ááŒá
áºáá«áááºá Onionsite á
á®áá¶áá°á¡á¬áž áááºááœááºáá±ážáá«á
+onionServices.introFailed.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â ááááºáááºááŸá¯áá¡á±á¬ááºááŒááºáá«á ááá¯áááºááŸá¬ áá±á«áºááŒá
á¬ááœá±á·ááŸááá±á¬áºáááºáž áááºáá±á¬ááºááŸá¯ááẠááááºáááºááŸá¯ááŒá
áºááŒááºážá¡áá áá»áááºáááºááŸá¯ áááŸááá«á ááŒá
áºááá¯ááºááŒá±ááŸá¬ áááºáá±á¬ááºááŸá¯á០áá±á«áºááŒá
á¬á¡á¬áž ááŒá±á¬ááºážáá²áá¬ážááẠááá¯á·ááá¯áẠáááºážááẠá¡áá¯ááºááá¯ááºáá±á¬á·áá«á
+# Tor SOCKS error 0xF3:
+onionServices.rendezvousFailed.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.rendezvousFailed.header=Onionsite ááŸááºá· áá»áááºáááºááá
+onionServices.rendezvousFailed=Onionsite ááẠáá¡á¬ážáá« ááá¯á·ááá¯áẠTor áá»áááºáááºááŸá¯ááẠáááºáááºááœááºážáá±áá«áááºá áá±á¬ááºááŸááŒááºá
ááºážááŒááºá·áá±ážáá«á
+onionServices.rendezvousFailed.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá¯á¶ážáá°áááºá០áááºáá±á¬ááºááŸá¯ááŸááºá· ááŒááºáááºááœá±á·áá¯á¶ááŒááºáž áá»ááºááœááºáá²á·á áá¯á¶ážáá°á០áá»áááºáááºááŸá¯á¡á¬áž áááŒá®ážá
á®ážááá¯ááºáá«á
+# Tor SOCKS error 0xF4:
+onionServices.clientAuthMissing.pageTitle=á¡áááºááŒá¯ááŒááºáž ááá¯á¡ááºáá«áááº
+onionServices.clientAuthMissing.header=Onionsite ááẠá¡áááºááŒá¯ááŒááºáž ááá¯á¡ááºáá«áááº
+onionServices.clientAuthMissing=Onionsite áá²áááºáá±á¬ááºááẠáá¯ááºáá±á¬á·áá
áºáᯠááá¯á¡ááºáá«áááºá ááá¯á·áá±á¬áºáááºáž áááºáááºá·áá¯ááºáá±á¬á·á០ááááºáá¶ááœá±á·ááŸááá«á
+onionServices.clientAuthMissing.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá¯á¶ážáá°á០áá±á¬ááºážááá¯áá¬ážáá±á¬ Onion áááºáá±á¬ááºááŸá¯á áá±á«áºááŒá
á¬á¡á¬áž áá±á«ááºážáá¯ááºááœá²áá²á·áá«áááºáâ ááá¯á·áá±á¬áºáááºáž áá¯á¶ážáá°á¡áááºááŒá¯ááẠá¡áá»ááºá¡áááºáá»á¬áž áááœá±á·ááŸáá áááºážá¡áá¬áá»á¬ážááᯠáá¯ááºááŒááºááŒááºááŒááºážáááá«á
+# Tor SOCKS error 0xF5:
+onionServices.clientAuthIncorrect.pageTitle=á¡áááºááŒá¯ááŒááºáž áá¡á±á¬ááºááŒááºáá«
+onionServices.clientAuthIncorrect.header=Onionsite á¡áááºááŒá¯ááŒááºáž áá¡á±á¬ááºááŒááºáá«
+onionServices.clientAuthIncorrect=áááºáá¶áááŸááá¬ážáá±á¬ áá®ážáá¯ááºááẠááŸá¬ážááœááºážáá±áá«ááẠááá¯á·ááá¯áẠááŒááºáááºáá¯ááºááááºážáá¶áá¬ážááá«áááºá Onionsite á
á®áá¶áá°á¡á¬áž áááºááœááºáá±ážáá«á
+onionServices.clientAuthIncorrect.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá¯á¶ážáá°á០áá±á¬ááºážááá¯áá¬ážáá±á¬ Onion áááºáá±á¬ááºááŸá¯á áá±á«áºááŒá
á¬á¡á¬áž áá±á«ááºážáá¯ááºááœá²ááá¯ááºáá²á·áá«áááºáâ ááá¯á·áá±á¬áºáááºáž áá¯á¶ážáá°á á¡áááºááŒá¯áá±á¬ á¡áá»ááºá¡áááºáá»á¬ážáá¯á¶ážá áááºážá¡áá¬áá»á¬ážááᯠáá¯ááºááŒááºááŒááºááŒááºážáááá«á ááá¯áááºááŸá¬ áááºáá±á¬ááºáá¯á¶ážááœááºá· ááŒááºáááºáá¯ááºááááºážáá¶áááŒááºáž ááŒá
áºááá¯ááºáá«áááºá
+# Tor SOCKS error 0xF6:
+onionServices.badAddress.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.badAddress.header=Onionsite ááááºá
ᬠáááŸááºáááºáá«
+onionServices.badAddress=áááºáá¶áá±ážáá¬ážáá±á¬ Onionsite ááááºá
á¬ááẠáááŸááºáááºáá«áâ áá»á±ážáá°ážááŒá¯á ááŸááºáááºá
áœá¬ ááŒááºážáá¬ážáá±ážááẠá
á
áºáá±ážáá«á
+onionServices.badAddress.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áááºáá¶áá±ážáá¬ážáá±á¬ .onion ááááºá
á¬ááẠáááŸááºáááºáá«á á€ááŸá¬ážááœááºážááŸá¯ááẠá¡á±á¬ááºáá«á¡ááŒá±á¬ááºážááŒáá»ááºáá»á¬ážááŒá±á¬ááºá·ááŒá
áºáá«ááẠ- ááááºá
á¬á
á¬áá¯á¶ážááœá² áááá¯ááºáá®áá«áâ ed25519 á¡áá»á¬ážáá¯á¶ážáá®ážáá¯ááºááẠáááŸááºáááºáá« ááá¯á·áºááá¯áẠáá¯ááºááŒááºá·ááŒá±á¬ááºážáá²ááŸááºááŒááºážááẠá¡áá»á¯á¶ážááááºáá«á
+# Tor SOCKS error 0xF7:
+onionServices.introTimedOut.pageTitle=Onionsite á¡á¬ážáááºááŒááºáž ááŒá¿áá¬ááŸááá«áááº
+onionServices.introTimedOut.header=Onionsite ááŒááºáááºážáááºáá®ážááŒááºáž á¡áá»áááºáá¯ááºáá¯á¶ážááœá¬ážáá«ááŒá®
+onionServices.introTimedOut=Onionsite ááŒááºá· áá»áááºáááºááŸá¯ áá¡á±á¬ááºááŒááºáá«á áá»áááºáááºááŸá¯ááá¯ááºáž ááá±á¬ááºážáá±á¬ááŒá±á¬ááºá· ááŒá
áºááá¯ááºáá«áááºá
+onionServices.introTimedOut.longDescription=á¡áá»ááºá¡áááºáá»á¬áž - %S â áá±á¬ááºážááá¯áá¬ážáá±á¬ Onion áááºáá±á¬ááºááŸá¯ááŒááºá· áá»áááºáááºááŸá¯ ááŒááºáááºážáááºááœááºáá±áá¯ááºáž á¡áá»áááºáá¯ááºáá¯á¶ážááœá¬ážáá«ááŒá®á
+#
+# LOCALIZATION NOTE: %S will be replaced with the .onion address.
+onionServices.authPrompt.description2=%S ááẠáááºá¡áááºááŒá¯ááẠáá±á¬ááºážááá¯áá±áá«áááºá
+onionServices.authPrompt.keyPlaceholder=ဠonion áááºáá±á¬ááºááŸá¯á¡ááœáẠáááºá· áá®ážáááºá·áá®ážáá¯ááºá¡á¬áž ááá¯ááºáááºá·áá±ážáá«á
+onionServices.authPrompt.done=ááŒá®ážááœá¬ážááŒá®
+onionServices.authPrompt.doneAccessKey=d
+onionServices.authPrompt.invalidKey=á¡áá»á¯á¶ážáááºáá±á¬ áá®ážáá¯áẠááá¯ááºáááºá·áá±ážáá«â ((52 base32 á
á¬áá¯á¶ážáá»á¬áž ááá¯á·ááá¯áẠ44 base64 á
á¬áá¯á¶ážáá»á¬áž)
+onionServices.authPrompt.failedToSetKey=áááºá· áá®ážáá¯ááºááŒááºá· Tor á¡á¬áž áá»áááºáááŒááºáááºá áááá«
+onionServices.authPreferences.header=Onion áááºáá±á¬ááºááŸá¯áá»á¬áž á¡áááºááŒá¯ááŒááºáž
+onionServices.authPreferences.overview=á¡áá»áá¯á· onion áááºáá±á¬ááºááŸá¯áá»á¬áž á¡áá¯á¶ážáááŒá¯ááẠáá®ážáá¯áẠ(á
áá¬ážááŸááºááá¯áá»áá¯áž) ááŒááºá· áááºá·á¡áá±á¬ááºá¡áá¬ážááŒááẠááá¯á¡ááºáá«áááºá
+onionServices.authPreferences.savedKeys=ááááºážáá¬ážáá±á¬ áá®ážáá¯ááºáá»á¬áž...
+onionServices.authPreferences.dialogTitle=Onion áááºáá±á¬ááºááŸá¯ áá®ážáá¯ááºáá»á¬áž
+onionServices.authPreferences.dialogIntro=á¡á±á¬ááºáá« onionsites áá»á¬ážá¡ááœáẠáá®ážáá¯ááºáá»á¬ážááẠáááºá· ááœááºáá»á°áá¬áá±á«áºááœáẠááááºážáááºážáá¬áá«áááº
+onionServices.authPreferences.onionSite=Onionsite
+onionServices.authPreferences.onionKey=áá®ážáá¯ááº
+onionServices.authPreferences.remove=áááºááŸá¬ážáááº
+onionServices.authPreferences.removeAll=á¡á¬ážáá¯á¶áž áááºááŸá¬ážáááº
+onionServices.authPreferences.failedToGetKeys=Tor á០áá®ážáá¯ááºáá»á¬áž áááá°ááá¯ááºáá«
+onionServices.authPreferences.failedToRemoveKey=áá®ážáá¯áẠáááºááŸá¬ážááááá«
+
+# Onion-Location strings.
+onionLocation.alwaysPrioritize=Onions áá»á¬ážááᯠá¡ááŒá² á¥á®ážá
á¬ážáá±ážáááº
+onionLocation.alwaysPrioritizeAccessKey=P
+onionLocation.notNow=ááá¯ááá¯ááº
+onionLocation.notNowAccessKey=P
+onionLocation.description=Tor ááœááºáááºáá±á«áºááœáẠonion áááºáá±á¬ááºááŸá¯áá»á¬ážááŒááºá· áá
áºáááºá· ááá¯ááá¯áá¯á¶ááŒá¯á¶á
áááºáá»ááá±á¬ áááºážááá¯ááºá áá¬ážááŸááºážááŸááá«áááºá Onion áááºáá±á¬ááºááŸá¯áá»á¬ážááẠáááºááá¯ááºáá¯ááºáá±áá°áá»á¬áž ááŸááºá· áá¯á¶ážáá°áá»á¬ážá¡ááœáẠá
á±á¬ááºá·ááŒááºá·ááá¯ááºáá¶ááŒááºáž ááŸááºá· áááºáá¬ááŒááºáá¶áááŒááºážááá¯á·ááᯠááŸáááºáááºážáá±ážááá¯ááºáá«áááºá
+onionLocation.tryThis=Onion áááºáá±á¬ááºááŸá¯áá»á¬áž á
ááºážáá¯á¶ážááŒááºá·áá«
+onionLocation.onionAvailable=.onion áááŸáááá¯ááº
+onionLocation.learnMore=áááºáá¶áá±á·áá¬áááº...
+onionLocation.always=á¡ááŒá²áááºáž
+onionLocation.askEverytime=á¡áá»áááºááá¯ááºážáá±ážáá«
+onionLocation.prioritizeOnionsDescription=.onion ááá¯ááºáá»á¬áž ááááŸááá»áŸáẠáááºážááá¯á·ááᯠá¥á®ážá
á¬ážáá±ážáá«á
+onionLocation.onionServicesTitle=Onion Services
diff --git a/import-translations.sh b/import-translations.sh
index 78b4b8b9..12065015 100755
--- a/import-translations.sh
+++ b/import-translations.sh
@@ -2,7 +2,7 @@
# This var comes from the TBB locale list.
# XXX: Find some way to keep this, tor-launcher, and Tor Browser in sync
-BUNDLE_LOCALES="ar ca cs da de el es-AR es-ES fa fr ga-IE he hu id is it ja ka ko lt nb-NO mk ms nl pl pt-BR ro ru sv-SE th tr vi zh-CN zh-TW"
+BUNDLE_LOCALES="ar ca cs da de el es-AR es-ES fa fr ga-IE he hu id is it ja ka ko lt nb-NO mk ms my nl pl pt-BR ro ru sv-SE th tr vi zh-CN zh-TW"
# XXX: Basque (eu) by request in #10687.
# This is not used for official builds, but should remain so Basque XPIs can be
diff --git a/jar.mn b/jar.mn
index 3838bc9b..c8fd813f 100644
--- a/jar.mn
+++ b/jar.mn
@@ -66,6 +66,8 @@ torbutton.jar:
locale/mk/ (chrome/locale/mk/*)
% locale torbutton ms %locale/ms/
locale/ms/ (chrome/locale/ms/*)
+% locale torbutton my %locale/my/
+ locale/my/ (chrome/locale/my/*)
% locale torbutton nb-NO %locale/nb-NO/
locale/nb-NO/ (chrome/locale/nb-NO/*)
% locale torbutton nl %locale/nl/
1
0