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

[translation/tbmanual-contentspot] https://gitweb.torproject.org/translation.git/commit/?h=tbmanual-contentspot
by translation@torproject.org 21 Apr '21
by translation@torproject.org 21 Apr '21
21 Apr '21
commit 5113c9c34e54f246e1a0e19df56e3104c45bd752
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Apr 21 05:47:05 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tbmanual-contentspot
---
contents+es.po | 12 +-
contents+hi.po | 814 +++++++++++++++++++++++++++++++++++++++++++--------------
2 files changed, 619 insertions(+), 207 deletions(-)
diff --git a/contents+es.po b/contents+es.po
index 5145d0814f..19e3c3ef5b 100644
--- a/contents+es.po
+++ b/contents+es.po
@@ -1977,7 +1977,7 @@ msgid ""
"You can further increase your security by choosing to disable certain web "
"features that can be used to compromise your security and anonymity."
msgstr ""
-"Puedes aumentar aún más tu seguridad al elegir deshabilitar ciertas "
+"Puedes aumentar aún más tu seguridad si eliges deshabilitar ciertas "
"funciones web que se pueden usar para comprometer tu seguridad y anonimato."
#: https//tb-manual.torproject.org/security-settings/
@@ -2168,11 +2168,11 @@ msgid ""
"indicator when Tor Browser opens. You can update either automatically or "
"manually."
msgstr ""
-"El Navegador Tor te pedirá que actualices el software una vez que haya sido "
-"lanzada una nueva versión: el menú de hamburguesa (menú principal) mostrará "
-"un círculo verde con una flecha apuntando hacia arriba en él, y podrías ver "
-"un indicador de actualización escrito cuando se abra el Navegador Tor. "
-"Puedes actualizar tanto automática como manualmente."
+"El Navegador Tor te pedirá que actualices el software cuando se publique una"
+" nueva versión: el menú de hamburguesa (menú principal) mostrará un círculo "
+"verde con una flecha apuntando hacia arriba en él, y podrías ver un "
+"indicador de actualización escrito cuando se abra el Navegador Tor. Puedes "
+"actualizar tanto automática como manualmente."
#: https//tb-manual.torproject.org/updating/
#: (content/updating/contents+en.lrtopic.body)
diff --git a/contents+hi.po b/contents+hi.po
index 3d796985d0..e7bc8bd507 100644
--- a/contents+hi.po
+++ b/contents+hi.po
@@ -3,20 +3,20 @@
# Drashti Pandya <drashtipandya37(a)gmail.com>, 2018
# Manav Garg <garg.manav8(a)protonmail.com>, 2019
# erinm, 2019
-# Emma Peel, 2020
# Kalyan Dikshit <dikshitrocks93(a)gmail.com>, 2020
# Mruga Shah <mruga30(a)gmail.com>, 2020
# Karan S, 2020
# James Bond <python07(a)tuta.io>, 2020
-# Adarsh Bharat <aadarshbharat(a)pm.me>, 2020
+# Adarsh Bharat <aadarshbharat(a)pm.me>, 2021
+# Emma Peel, 2021
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2020-04-12 08:00+CET\n"
+"POT-Creation-Date: 2021-03-02 09:17+CET\n"
"PO-Revision-Date: 2018-11-14 12:31+0000\n"
-"Last-Translator: Adarsh Bharat <aadarshbharat(a)pm.me>, 2020\n"
+"Last-Translator: Emma Peel, 2021\n"
"Language-Team: Hindi (https://www.transifex.com/otf/teams/1519/hi/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -152,8 +152,6 @@ msgstr "ज्ञात पहलु"
#: https//tb-manual.torproject.org/menu/
#: (content/menu/contents+en.lrtopic.body)
-#: https//tb-manual.torproject.org/mobile-tor/
-#: (content/mobile-tor/contents+en.lrtopic.title)
msgid "Mobile Tor"
msgstr "मोबाइल टोर"
@@ -235,7 +233,7 @@ msgid ""
msgstr ""
"डिफ़ॉल्ट रूप से, टोर ब्राउज़र कोई ब्राउज़िंग इतिहास नहीं रखता है। कुकीज़ "
"केवल एक सत्र के लिए मान्य हैं (जब तक कि टॉर ब्राउज़र बाहर न निकल जाए या एक "
-"[नई पहचान] (/ प्रबंध-पहचान / # नई-पहचान) का अनुरोध किया जाए।"
+"[नई पहचान](/managing-identities/#new-identity) का अनुरोध किया जाए।"
#: https//tb-manual.torproject.org/about/
#: (content/about/contents+en.lrtopic.body)
@@ -302,8 +300,8 @@ msgid ""
"Your connection to the site will be secured using [HTTPS](/secure-"
"connections), which makes it much harder for somebody to tamper with."
msgstr ""
-"साइट पर आपका कनेक्शन [HTTPS] (/ सिक्योर-कनेक्शन) का उपयोग करके सुरक्षित किया"
-" जाएगा, जिससे किसी के साथ छेड़छाड़ करना मुश्किल हो जाता है।"
+"साइट पर आपका कनेक्शन [HTTPS](/secure-connections) का उपयोग करके सुरक्षित "
+"किया जाएगा, जिससे किसी के साथ छेड़छाड़ करना मुश्किल हो जाता है।"
#: https//tb-manual.torproject.org/downloading/
#: (content/downloading/contents+en.lrtopic.body)
@@ -338,8 +336,9 @@ msgid ""
msgstr ""
"यदि आप टॉर ब्राउज़र को आधिकारिक टोर प्रोजेक्ट वेबसाइट से डाउनलोड करने में "
"असमर्थ हैं, तो आप इसे हमारे आधिकारिक दर्पणों में से एक से डाउनलोड करने का "
-"प्रयास कर सकते हैं, या तो [EFF] (https://tor.eff.org) [Calyx Institute] के "
-"माध्यम से। (https://tor.calyxinstitute.org) या [CCC] (https://tor.ccc.de)।"
+"प्रयास कर सकते हैं, या तो [EFF](https://tor.eff.org), [Calyx "
+"Institute](https://tor.calyxinstitute.org) के माध्यम से। या "
+"[CCC](https://tor.ccc.de)।"
#: https//tb-manual.torproject.org/downloading/
#: (content/downloading/contents+en.lrtopic.body)
@@ -365,9 +364,9 @@ msgstr "### ईमेल द्वारा GETTOR का उपयोग कर
#: https//tb-manual.torproject.org/downloading/
#: (content/downloading/contents+en.lrtopic.body)
msgid ""
-"Send an email to gettor(a)torproject.org, and in the body of the message "
-"simply write “windows”, “osx”, or “linux”, (without quotation marks) "
-"depending on your operating system."
+"Send an email to [gettor@torproject.org](mailto:gettor@torproject.org), and "
+"in the body of the message simply write “windows”, “osx”, or “linux”, "
+"(without quotation marks) depending on your operating system."
msgstr ""
#: https//tb-manual.torproject.org/downloading/
@@ -390,7 +389,8 @@ msgstr ""
#: (content/downloading/contents+en.lrtopic.body)
msgid ""
"To get links for downloading Tor Browser in Chinese for Linux, send a "
-"message to gettor(a)torproject.org with the words \"linux zh\" in it."
+"message to [gettor@torproject.org](mailto:gettor@torproject.org) with the "
+"words \"linux zh\" in it."
msgstr ""
#: https//tb-manual.torproject.org/installation/
@@ -478,7 +478,7 @@ msgstr ""
#: (content/installation/contents+en.lrtopic.body)
msgid ""
"5. You'll need to tell your GNU/Linux that you want the ability to execute "
-"shell scripts from the graphical interface."
+"shell scripts from the graphical interface or the command line."
msgstr ""
#: https//tb-manual.torproject.org/installation/
@@ -498,6 +498,29 @@ msgstr ""
msgid "Double-click the icon to start up Tor Browser for the first time."
msgstr ""
+#: https//tb-manual.torproject.org/installation/
+#: (content/installation/contents+en.lrtopic.body)
+msgid ""
+"**Note:** On Ubuntu and some other distros if you try to launch the start-"
+"tor-browser.desktop file a text file might open up."
+msgstr ""
+
+#: https//tb-manual.torproject.org/installation/
+#: (content/installation/contents+en.lrtopic.body)
+msgid ""
+"To change this behavior and launch Tor Browser instead, follow this: Open "
+"\"Files\" (GNOME Files/Nautilus) → open Preferences → go to the 'Behavior' "
+"Tab → Select \"Run them\" or \"Ask what to do\" under \"Executable Text "
+"Files\"."
+msgstr ""
+
+#: https//tb-manual.torproject.org/installation/
+#: (content/installation/contents+en.lrtopic.body)
+msgid ""
+"If you choose the latter click on \"Run\" after launching the start-tor-"
+"browser.desktop file."
+msgstr ""
+
#: https//tb-manual.torproject.org/installation/
#: (content/installation/contents+en.lrtopic.body)
msgid ""
@@ -507,7 +530,14 @@ msgstr ""
#: https//tb-manual.torproject.org/installation/
#: (content/installation/contents+en.lrtopic.body)
-msgid "`./start-tor-browser`"
+msgid "`./start-tor-browser.desktop`"
+msgstr "`./start-tor-browser.desktop`"
+
+#: https//tb-manual.torproject.org/installation/
+#: (content/installation/contents+en.lrtopic.body)
+msgid ""
+"See here on how to [update Tor Browser](https://tb-"
+"manual.torproject.org/updating/)"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -541,9 +571,9 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
-#: https//tb-manual.torproject.org/troubleshooting/
-#: (content/troubleshooting/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/connect.png\">"
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/connect.png\" alt=\"Click "
+"'connect' to connect to Tor.\">"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -576,7 +606,9 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/configure.png\">"
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/configure.png\" "
+"alt=\"Click 'configure' to adjust network settings.\">"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -588,7 +620,9 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/proxy_question.png\">"
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/proxy_question.png\" "
+"alt=\"Select options for censored connection or proxy use.\">"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -600,7 +634,9 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/pluggable-transport.png\">"
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/pluggable-transport.png\" "
+"alt=\"Configure Tor bridge options\">"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -632,7 +668,9 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/proxy.png\">"
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/proxy.png\" "
+"alt=\"Configure proxy options\">"
msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
@@ -698,17 +736,17 @@ msgstr "<table class=\"table table-striped\">"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "<tbody>"
-msgstr ""
+msgstr "<tbody>"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "<tr class=\"odd\">"
-msgstr ""
+msgstr "<tr class=\"odd\">"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "<td>"
-msgstr ""
+msgstr "<td>"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
@@ -718,7 +756,7 @@ msgstr "ओबीएफएस4 "
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "</td>"
-msgstr ""
+msgstr "</td>"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
@@ -731,12 +769,12 @@ msgstr ""
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "</tr>"
-msgstr ""
+msgstr "</tr>"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
msgid "meek"
-msgstr ""
+msgstr "meek"
#: https//tb-manual.torproject.org/circumvention/
#: (content/circumvention/contents+en.lrtopic.body)
@@ -920,12 +958,15 @@ msgstr ""
#: https//tb-manual.torproject.org/bridges/
#: (content/bridges/contents+en.lrtopic.body)
msgid ""
-"* Visit https://bridges.torproject.org/ and follow the instructions, or"
+"* Visit [https://bridges.torproject.org/](https://bridges.torproject.org) "
+"and follow the instructions, or"
msgstr ""
#: https//tb-manual.torproject.org/bridges/
#: (content/bridges/contents+en.lrtopic.body)
-msgid "* Email bridges(a)torproject.org from a Gmail, or Riseup email address"
+msgid ""
+"* Email [bridges@torproject.org](mailto:bridges@torproject.org) from a "
+"Gmail, or Riseup email address"
msgstr ""
#: https//tb-manual.torproject.org/bridges/
@@ -942,7 +983,8 @@ msgstr ""
#: (content/bridges/contents+en.lrtopic.body)
msgid ""
"<img class=\"col-md-6\" align=\"right\" hspace=\"5\" "
-"src=\"../../static/images/request-a-bridge.png\">"
+"src=\"../../static/images/request-a-bridge.png\" alt=\"Request a bridge from"
+" torproject.org\">"
msgstr ""
#: https//tb-manual.torproject.org/bridges/
@@ -963,7 +1005,7 @@ msgstr ""
#: https//tb-manual.torproject.org/bridges/
#: (content/bridges/contents+en.lrtopic.body)
msgid ""
-"Complete the CAPTCHA and click \"Submit.\" Click \"Connect\" to save your "
+"Complete the Captcha and click \"Submit.\" Click \"Connect\" to save your "
"settings."
msgstr ""
@@ -978,7 +1020,7 @@ msgstr ""
#: https//tb-manual.torproject.org/bridges/
#: (content/bridges/contents+en.lrtopic.body)
msgid ""
-"Complete the CAPTCHA and click \"Submit.\" Your setting will automatically "
+"Complete the Captcha and click \"Submit.\" Your setting will automatically "
"be saved once you close the tab."
msgstr ""
@@ -991,7 +1033,8 @@ msgstr ""
#: (content/bridges/contents+en.lrtopic.body)
msgid ""
"<img class=\"col-md-6\" align=\"right\" hspace=\"5\" "
-"src=\"../../static/images/tor-launcher-custom-bridges.png\">"
+"src=\"../../static/images/tor-launcher-custom-bridges.png\" alt=\"Enter "
+"custom bridge addresses\">"
msgstr ""
#: https//tb-manual.torproject.org/bridges/
@@ -1087,7 +1130,8 @@ msgstr ""
#: (content/managing-identities/contents+en.lrtopic.body)
msgid ""
"<img class=\"col-md-6\" align=\"right\" hspace=\"5\" "
-"src=\"../../static/images/circuit_full.png\">"
+"src=\"../../static/images/circuit_full.png\" alt=\"Display circuit diagram "
+"under the site information menu\">"
msgstr ""
#: https//tb-manual.torproject.org/managing-identities/
@@ -1165,8 +1209,11 @@ msgstr ""
#: https//tb-manual.torproject.org/managing-identities/
#: (content/managing-identities/contents+en.lrtopic.body)
-msgid "<img class=\"col-md-6\" src=\"../../static/images/new_identity.png\">"
-msgstr "<img class=\"col-md-6\" src=\"../../static/images/new_identity.png\">"
+msgid ""
+"<img style=\"max-width:100%\" class=\"col-md-6\" "
+"src=\"../../static/images/new_identity.png\" alt=\"New Identity and New Tor "
+"Circuit options under main menu\">"
+msgstr ""
#: https//tb-manual.torproject.org/managing-identities/
#: (content/managing-identities/contents+en.lrtopic.body)
@@ -1235,7 +1282,7 @@ msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
-"Onion services (formerly known as “hidden services”) are services (like "
+"Onion services (formerly known as \"hidden services\") are services (like "
"websites) that are only accessible through the Tor network."
msgstr ""
@@ -1249,8 +1296,8 @@ msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
-"* An onion services’s location and IP address are hidden, making it "
-"difficult for adversaries to censor it or identify its operators."
+"* Onion services’ location and IP address are hidden, making it difficult "
+"for adversaries to censor them or identify their operators."
msgstr ""
#: https//tb-manual.torproject.org/onion-services/
@@ -1280,17 +1327,223 @@ msgstr ""
msgid ""
"Just like any other website, you will need to know the address of an onion "
"service in order to connect to it. An onion address is a string of 16 (and "
-"in V3 format, 56) mostly random letters and numbers, followed by “.onion”."
+"in V3 format, 56) mostly random letters and numbers, followed by \".onion\"."
msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
"When accessing a website that uses an onion service, Tor Browser will show "
-"at the URL bar an icon of a little green onion displaying the state of your "
-"connection: secure and using an onion service. And if you're accessing a "
-"website with https and onion service, it will show an icon of a green onion "
-"and a padlock."
+"in the URL bar an icon of an onion displaying the state of your connection: "
+"secure and using an onion service."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"You can learn more about the onion site that you are visiting by looking at "
+"the Circuit Display."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Another way to learn about an onion site is if the website administrator has"
+" implemented a feature called Onion-Location."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Onion-Location is a non-standard HTTP header that websites can use to "
+"advertise their onion counterpart."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"If the website that you are visiting has an onion site available, a purple "
+"suggestion pill will prompt at the URL bar in Tor Browser displaying "
+"\".onion available\"."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"When you click on \".onion available\", the website will be reloaded and "
+"redirected to its onion counterpart."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"<img style=\"max-width:100%\" class=\"col-md-6\" src=\"../../static/images"
+"/onion-location.png\" alt=\"Onion-Location\">"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"To prioritize an onion site version of a website, you can enable automatic "
+"Onion-Location redirects."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Click on hamburger menu (≡), go to Preferences (or Options on Windows), "
+"click on Privacy & Security, and in the Onion Services section look for the "
+"entry \"Prioritize .onion sites when known.\" and check the option "
+"\"Always\"."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Or, if you're already running Tor Browser, you can copy and paste this "
+"string in a new tab: `about:preferences#privacy` and change this setting."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid "## ONION SERVICE AUTHENTICATION"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"An authenticated onion service is a service like an onion site that requires"
+" the client to provide an authentication token before accessing the service."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"As a Tor user, you may authenticate yourself directly in the Tor Browser."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"In order to access this service, you will need access credentials from the "
+"onion service operator."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"When accessing an authenticated onion service, Tor Browser will show in the "
+"URL bar an icon of a little gray key, accompanied by a tooltip."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid "Enter your valid private key into the input field."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"<img style=\"max-width:100%\" class=\"col-md-6\" src=\"../../static/images"
+"/client-auth.png\" alt=\"Client Authorization\">"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid "### ONION SERVICES ERRORS"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"If you can't connect to an onion site, Tor Browser will provide a specific "
+"error message informing why the website is unavailable."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Errors can happen in different layers: client errors, network errors or "
+"service errors."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"Some of these errors can be fixed by following the Troubleshooting section."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"The table below shows all the possible errors and which action you should "
+"take to solve the issue."
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid "| **Code** | **Error Title** | **Short Description** |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid "|----------|-----------------|-----------------------|"
+msgstr "|----------|-----------------|-----------------------|"
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF0 | Onion site Not Found | The most likely cause is that the onion site "
+"is offline or disabled. Contact the onion site administrator. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF1 | Onion site Cannot Be Reached | The onion site is unreachable due to "
+"an internal error. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF2 | Onion site Has Disconnected | The most likely cause is that the "
+"onion site is offline or disabled. Contact the onion site administrator. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF3 | Unable to Connect to Onion site | The onion site is busy or the Tor "
+"network is overloaded. Try again later. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF4 | Onion site Requires Authentication | Access to the onion site "
+"requires a key but none was provided. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF5 | Onion site Authentication Failed | The provided key is incorrect or "
+"has been revoked. Contact the onion site administrator. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF6 | Invalid Onion site Address | The provided onion site address is "
+"invalid. Please check that you entered it correctly. |"
+msgstr ""
+
+#: https//tb-manual.torproject.org/onion-services/
+#: (content/onion-services/contents+en.lrtopic.body)
+msgid ""
+"| XF7 | Onion site Circuit Creation Timed Out | Failed to connect to the "
+"onion site, possibly due to a poor network connection. |"
msgstr ""
#: https//tb-manual.torproject.org/onion-services/
@@ -1301,23 +1554,23 @@ msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
-"If you cannot reach the onion service you require, make sure that you have "
-"entered the onion address correctly: even a small mistake will stop Tor "
+"If you cannot reach the onion service you requested, make sure that you have"
+" entered the onion address correctly: even a small mistake will stop Tor "
"Browser from being able to reach the site."
msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
-"If you are still unable to connect to the onion service, please try again "
-"later. There may be a temporary connection issue, or the site operators may "
-"have allowed it to go offline without warning."
+"If you are still unable to connect to the onion service after verifying the "
+"address, please try again later. There may be a temporary connection issue, "
+"or the site operators may have allowed it to go offline without warning."
msgstr ""
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
-"You can also ensure that you're able to access other onion services by "
+"You can also test if you are able to access other onion services by "
"connecting to [DuckDuckGo's Onion Service](http://3g2upl4pq6kufc4m.onion/)."
msgstr ""
@@ -1363,7 +1616,7 @@ msgstr ""
#: (content/security-settings/contents+en.lrtopic.body)
msgid ""
"You can further increase your security by choosing to disable certain web "
-"features that can be used to attack your security and anonymity."
+"features that can be used to compromise your security and anonymity."
msgstr ""
#: https//tb-manual.torproject.org/security-settings/
@@ -1403,8 +1656,9 @@ msgstr ""
#: https//tb-manual.torproject.org/security-settings/
#: (content/security-settings/contents+en.lrtopic.body)
msgid ""
-"<img class=\"col-lg-6\" src=\"../../static/images/security-settings-"
-"anim.gif\">"
+"<img style=\"max-width:100%\" class=\"col-lg-6\" src=\"../../static/images"
+"/security-settings-anim.gif\" alt=\"Click on 'Advanced Security Settings' "
+"under the shield menu.\">"
msgstr ""
#: https//tb-manual.torproject.org/security-settings/
@@ -1430,8 +1684,9 @@ msgstr ""
#: https//tb-manual.torproject.org/security-settings/
#: (content/security-settings/contents+en.lrtopic.body)
msgid ""
-"<img class=\"col-lg-6\" src=\"../../static/images/security-settings-"
-"safest.png\">"
+"<img style=\"max-width:100%\" class=\"col-lg-6\" src=\"../../static/images"
+"/security-settings-safest.png\" alt=\"Security Level is currently set to "
+"Standard.\">"
msgstr ""
#: https//tb-manual.torproject.org/security-settings/
@@ -1513,9 +1768,10 @@ msgstr ""
#: (content/updating/contents+en.lrtopic.body)
msgid ""
"Tor Browser will prompt you to update the software once a new version has "
-"been released: the Torbutton icon will display a yellow triangle, and you "
-"may see a written update indicator when Tor Browser opens. You can update "
-"either automatically or manually."
+"been released: the hamburger menu (main menu) will display a green circle "
+"with an upwards facing arrow in it, and you may see a written update "
+"indicator when Tor Browser opens. You can update either automatically or "
+"manually."
msgstr ""
#: https//tb-manual.torproject.org/updating/
@@ -1525,8 +1781,10 @@ msgstr ""
#: https//tb-manual.torproject.org/updating/
#: (content/updating/contents+en.lrtopic.body)
-msgid "<img width=\"400\" src=\"../../static/images/update1.png\" />"
-msgstr "<img width=\"400\" src=\"../../static/images/update1.png\" />"
+msgid ""
+"<img width=\"400\" src=\"../../static/images/update1.png\" alt=\"Select "
+"'Restart to update Tor Browser' under the main menu\"/>"
+msgstr ""
#: https//tb-manual.torproject.org/updating/
#: (content/updating/contents+en.lrtopic.body)
@@ -1537,7 +1795,9 @@ msgstr ""
#: https//tb-manual.torproject.org/updating/
#: (content/updating/contents+en.lrtopic.body)
-msgid "<img width=\"500\" src=\"../../static/images/update4.png\" />"
+msgid ""
+"<img width=\"500\" src=\"../../static/images/update4.png\" alt=\"Update "
+"progress bar\"/>"
msgstr ""
#: https//tb-manual.torproject.org/updating/
@@ -1591,6 +1851,13 @@ msgid ""
"for the first time."
msgstr ""
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"<img class=\"col-md-6\" src=\"../../static/images/connect.png\" alt=\"Click "
+"'Connect' to connect to Tor.\">"
+msgstr ""
+
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid "### QUICK FIXES"
@@ -1598,9 +1865,12 @@ msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
-msgid ""
-"If Tor Browser doesn’t connect, there may be a simple solution. Try each of "
-"the following:"
+msgid "If Tor Browser doesn’t connect, there may be a simple solution."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "Try each of the following:"
msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
@@ -1613,16 +1883,27 @@ msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid ""
-"* Make sure another Tor Browser is not already running. If you’re not sure "
-"if Tor Browser is running, restart your computer."
+"* Make sure another Tor Browser or instance of 'Tor' is not already running "
+"on your system."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "If you’re not sure if Tor Browser is running, restart your computer."
msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid ""
"* Make sure that any antivirus program you have installed is not preventing "
-"Tor from running. You may need to consult the documentation for your "
-"antivirus software if you do not know how to do this."
+"Tor from running."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"You may need to consult the documentation for your antivirus software if you"
+" do not know how to do this."
msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
@@ -1633,9 +1914,94 @@ msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid ""
-"* Delete Tor Browser and install it again. If updating, do not just "
-"overwrite your previous Tor Browser files; ensure they are fully deleted "
-"beforehand."
+"* If Tor Browser was working before and is not working now your system may "
+"have been hibernating."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "A reboot of your system will solve the issue."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "* Delete Tor Browser and install it again."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"If updating, do not just overwrite your previous Tor Browser files; ensure "
+"they are fully deleted beforehand."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "### VIEW TOR LOGS"
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"In most cases, taking a look at the Tor logs can be helpful in diagnosing "
+"the issue."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"If you’re having trouble connecting, an error message may appear and you can"
+" select the option to \"copy Tor log to clipboard\"."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "Then paste the Tor log into a text file or other document."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"If you don't see this option and you have Tor Browser open, you can navigate"
+" to the hamburger menu (\"≡\"), then click on \"Preferences\", and finally "
+"on \"Tor\" in the side bar."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"At the bottom of the page, next to the \"View the Tor logs\" text, click the"
+" button \"View Logs...\"."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"Alternatively, on GNU/Linux, to view the logs right in the terminal, "
+"navigate to the Tor Browser directory and launch the Tor Browser from the "
+"command line by running:"
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "`./start-tor-browser.desktop --verbose`"
+msgstr "`./start-tor-browser.desktop --verbose`"
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "Or to save the logs to a file (default: tor-browser.log):"
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid "`./start-tor-browser.desktop --log [file]`"
+msgstr "`./start-tor-browser.desktop --log [file]`"
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"More information on this can be found on the [Support "
+"Portal](https://support.torproject.org/connecting/connecting-2/)."
msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
@@ -1647,8 +2013,13 @@ msgstr ""
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid ""
"If you still can’t connect, your Internet Service Provider might be "
-"censoring connections to the Tor network. Read the "
-"[Circumvention](/circumvention) section for possible solutions."
+"censoring connections to the Tor network."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"Read the [Circumvention](/circumvention) section for possible solutions."
msgstr ""
#: https//tb-manual.torproject.org/troubleshooting/
@@ -1662,8 +2033,14 @@ msgstr ""
#: (content/troubleshooting/contents+en.lrtopic.body)
msgid ""
"Tor Browser is under constant development, and some issues are known about "
-"but not yet fixed. Please check the [Known Issues](/known-issues) page to "
-"see if the problem you are experiencing is already listed there."
+"but not yet fixed."
+msgstr ""
+
+#: https//tb-manual.torproject.org/troubleshooting/
+#: (content/troubleshooting/contents+en.lrtopic.body)
+msgid ""
+"Please check the [Known Issues](/known-issues) page to see if the problem "
+"you are experiencing is already listed there."
msgstr ""
#: https//tb-manual.torproject.org/plugins/
@@ -1896,8 +2273,29 @@ msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid ""
-"* The following firewall software have been known to interfere with Tor and "
-"may need to be temporarily disabled:"
+"* Antivirus or malware protection blocking users from accessing Tor Browser."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid ""
+"Sometimes these also pop up with [false positives regarding malware and/or "
+"vulnerabilities](https://support.torproject.org/tbb/antivirus-false-"
+"positive/)."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid ""
+"You can read more about this on our [Support "
+"Portal](https://support.torproject.org/tbb/tbb-10/)."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid ""
+"The following antivirus and firewall software have been known to interfere "
+"with Tor and may need to be temporarily disabled:"
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
@@ -1920,11 +2318,39 @@ msgstr ""
msgid "* Microsoft Security Essentials"
msgstr ""
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "* Avast Antivirus"
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "* VPNs also tend to interfere with Tor and need to be disabled."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid ""
+"We also do not recommend using VPN and Tor together unless you're an "
+"advanced user who knows how to configure both in a way that doesn't "
+"compromise your privacy."
+msgstr ""
+
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid ""
-"* Videos that require Adobe Flash are unavailable. Flash is disabled for "
-"security reasons."
+"You can find more detailed information about Tor + VPN at our "
+"[wiki](https://gitlab.torproject.org/legacy/trac/-/wikis/doc/TorPlusVPN)."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "* Videos that require Adobe Flash are unavailable."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "Flash is disabled for security reasons."
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
@@ -1934,37 +2360,50 @@ msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
-msgid ""
-"* The Tor Browser package is dated January 1, 2000 00:00:00 UTC. This is to "
-"ensure that each software build is exactly reproducible."
+msgid "* The Tor Browser package is dated January 1, 2000 00:00:00 UTC."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "This is to ensure that each software build is exactly reproducible."
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid ""
-"* To run Tor Browser on Ubuntu, users need to execute a shell script. Open "
-"\"Files\" (Unity's explorer), open Preferences → Behavior Tab → Set \"Run "
-"executable text files when they are opened\" to \"Ask every time\", then "
-"click OK."
+"* Issues with making Tor Browser as your [default "
+"browser](https://support.torproject.org/tbb/tbb-32/)."
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid ""
-"* Tor Browser can also be started from the command line by running the "
-"following command from inside the Tor Browser directory:"
+"* If Tor Browser was working before and is not working now (especially after"
+" a re-install or an update), your system may have been hibernating."
+msgstr ""
+
+#: https//tb-manual.torproject.org/known-issues/
+#: (content/known-issues/contents+en.lrtopic.body)
+msgid "A reboot of your system, in that case, will solve the issue."
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
-msgid "./start-tor-browser.desktop"
+msgid ""
+"* Tor won't start on Windows when the [folder path contains non-ascii "
+"characters](https://gitlab.torproject.org/tpo/core/tor/-/issues/10416)."
msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid ""
-"* BitTorrent in specific is [not anonymous over "
-"Tor](https://blog.torproject.org/bittorrent-over-tor-isnt-good-idea)."
+"* BitTorrent [is not anonymous over Tor](https://blog.torproject.org"
+"/bittorrent-over-tor-isnt-good-idea)."
+msgstr ""
+
+#: https//tb-manual.torproject.org/mobile-tor/
+#: (content/mobile-tor/contents+en.lrtopic.title)
+msgid "MOBILE TOR"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2019,7 +2458,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Tor Browser for Android is available on Play Store, F-droid and the Tor "
+"Tor Browser for Android is available on Play Store, F-Droid and the Tor "
"Project website."
msgstr ""
@@ -2063,7 +2502,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"1. Install the F-Droid app on your Android device from [the F-droid "
+"1. Install the F-Droid app on your Android device from [the F-Droid "
"website.](https://f-droid.org/)"
msgstr ""
@@ -2142,7 +2581,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"When you run Tor Browser for the first time, you will see the option to "
+"When you run Tor Browser for the first time, you will see the option to "
"connect directly to the Tor network, or to configure Tor Browser for your "
"connection with the settings icon."
msgstr ""
@@ -2162,7 +2601,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Once clicked, changing sentences will appear at the bottom of the screen, "
+"Once tapped, changing sentences will appear at the bottom of the screen, "
"indicating Tor’s connection progress."
msgstr ""
@@ -2170,8 +2609,8 @@ msgstr ""
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"If you are on a relatively fast connection, but this text seems to get stuck"
-" at a certain point, see the [Troubleshooting](https://tb-"
-"manual.torproject.org/troubleshooting) page for help solving the problem."
+" at a certain point, see the [Troubleshooting](../troubleshooting) page for "
+"help solving the problem."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2196,23 +2635,23 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"The first screen asks if access to the Tor network is blocked or censored on"
-" your connection."
+"The first screen will tell you about the status of the Tor Network and "
+"provide you the option to configure a Bridge ('Config Bridge')."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"If you know your connection is censored, or you have tried and failed to "
-"connect to the Tor network and no other solutions have worked, click the "
-"switch."
+"connect to the Tor network and no other solutions have worked, tap on "
+"'Config Bridge'."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"You will then be taken to the [Circumvention](/mobile-tor/#circumvention) "
-"screen to configure a pluggable transport."
+"You will then be taken to the [Circumvention](../circumvention) screen to "
+"configure a pluggable transport."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2238,15 +2677,15 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"To use a pluggable transport, click on the settings icon when starting Tor "
+"To use a pluggable transport, tap on the settings icon when starting Tor "
"Browser for the first time."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"The first screen asks if access to the Tor network is censored on your "
-"connection. Click on the switch to toggle it."
+"The first screen tells you about the status of the Tor network. Tap on "
+"'Config Bridge' to configure a bridge."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2267,8 +2706,8 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"With the \"Select a bridge\" option, you will have two options: \"obfs4\" "
-"and \"meek-azure\"."
+"With the \"Use a Bridge\" option, you will have two options: \"obfs4\" and "
+"\"meek-azure\"."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2291,7 +2730,7 @@ msgstr ""
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"If you choose the \"Provide a Bridge I know\" option, then you have to enter"
-" a [bridge address](https://tb-manual.torproject.org/bridges/)."
+" a [bridge address](../bridges/)."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2336,7 +2775,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid "Clicking on this button will provide you with a new identity."
+msgid "Tapping on this button will provide you with a new identity."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2368,9 +2807,8 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"[Security settings](https://tb-manual.torproject.org/security-settings/) "
-"disable certain web features that can be used to attack your security and "
-"anonymity."
+"[Security settings](../security-settings/) disable certain web features that"
+" can be used to compromise your security and anonymity."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2397,7 +2835,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid "* You can now select an option from the security level slider."
+msgid "* You can now select an option i.e. Standard, Safer or Safest."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2418,7 +2856,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"This method assumes that you have either Google Play or F-droid installed on"
+"This method assumes that you have either Google Play or F-Droid installed on"
" your mobile device."
msgstr ""
@@ -2438,15 +2876,15 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Click on the hamburger menu next to the search bar and navigate to \"My apps"
-" & games\" > \"Updates\"."
+"Tap on the hamburger menu next to the search bar and navigate to \"My apps &"
+" games\" > \"Updates\"."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"If you find Tor Browser on the list of apps which need updating, select it "
-"and click the \"Update\" button."
+"and tap the \"Update\" button."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2459,18 +2897,18 @@ msgstr ""
msgid ""
"<img style=\"max-width:300px\" class=\"col-md-6\" src=\"../../static/images"
"/android-update-f-droid.png\" alt=\"Updating Tor Browser for Android on "
-"F-droid\">"
+"F-Droid\">"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid "Click on \"Settings\", then go to \"Manage installed apps\"."
+msgid "Tap on \"Settings\", then go to \"Manage installed apps\"."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"On the next screen, select Tor Browser and finally click on the \"Update\" "
+"On the next screen, select Tor Browser and finally tap on the \"Update\" "
"button."
msgstr ""
@@ -2513,8 +2951,8 @@ msgstr ""
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"Depending on your mobile device's brand, navigate to Settings > Apps, then "
-"select Tor Browser and click on the \"Uninstall\" button. "
-"Afterwards,download the latest Tor Browser release and install it."
+"select Tor Browser and tap on the \"Uninstall\" button. Afterwards, download"
+" the latest Tor Browser release and install it."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2525,7 +2963,7 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Tor Browser for Android can be uninstalled directly from F-droid, Google "
+"Tor Browser for Android can be uninstalled directly from F-Droid, Google "
"Play or from your mobile device's app settings."
msgstr ""
@@ -2540,8 +2978,8 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Click on the hamburger menu next to the search bar and navigate to \"My apps"
-" & games\" > \"Installed\"."
+"Tap on the hamburger menu next to the search bar and navigate to \"My apps &"
+" games\" > \"Installed\"."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2556,14 +2994,14 @@ msgstr ""
msgid ""
"<img style=\"max-width:300px\" class=\"col-md-6\" src=\"../../static/images"
"/android-uninstall-f-droid.png\" alt=\"Uninstalling Tor Browser for Android "
-"on F-droid\">"
+"on F-Droid\">"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"On the next screen, select Tor Browser and finally click on the "
-"\"Uninstall\" button."
+"On the next screen, select Tor Browser and finally tap on the \"Uninstall\" "
+"button."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2583,7 +3021,7 @@ msgstr ""
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"Depending on your mobile device's brand, navigate to Settings > Apps, then "
-"select Tor Browser and click on the \"Uninstall\" button."
+"select Tor Browser and tap on the \"Uninstall\" button."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2597,42 +3035,31 @@ msgstr ""
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"* You can't see your Tor circuit. "
-"[#25764](https://trac.torproject.org/projects/tor/ticket/25764)"
-msgstr ""
-
-#: https//tb-manual.torproject.org/mobile-tor/
-#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid ""
-"* Custom obfs4 bridges not working. "
-"[#30767](https://trac.torproject.org/projects/tor/ticket/30767)"
-msgstr ""
-
-#: https//tb-manual.torproject.org/mobile-tor/
-#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid ""
-"* 'Clear private data' option does not clear browsing history. "
-"[#27592](https://trac.torproject.org/projects/tor/ticket/27592)"
+"[#25764](https://gitlab.torproject.org/tpo/applications/torbutton/-/issues/25764)"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"* Tor Browser for Android does not connect when moved to the SD Card. "
-"[#31814](https://trac.torproject.org/projects/tor/ticket/31814)"
+"[#31814](https://gitlab.torproject.org/tpo/applications/tor-"
+"browser/-/issues/31814)"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"* You can't take screenshots while using Tor Browser for Android. "
-"[#27987](https://trac.torproject.org/projects/tor/ticket/27987)"
+"[#27987](https://gitlab.torproject.org/tpo/applications/tor-"
+"browser/-/issues/27987)"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"* You can't save images. "
-"[#31013](https://trac.torproject.org/projects/tor/ticket/31013)"
+"* Can't upload files with Tor Browser for Android. "
+"[#40283](https://gitlab.torproject.org/tpo/applications/tor-"
+"browser/-/issues/40283)"
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2655,27 +3082,18 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"Over the next three years, Orfox continously improved and became a popular "
-"way for people to browse the internet with more privacy"
-msgstr ""
-
-#: https//tb-manual.torproject.org/mobile-tor/
-#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid ""
-"than standard browsers, and Orfox was crucial for helping people circumvent "
-"censorship and access blocked sites and critical resources."
+"Over the next three years, Orfox continuously improved and became a popular "
+"way for people to browse the internet with more privacy than standard "
+"browsers, and Orfox was crucial for helping people circumvent censorship and"
+" access blocked sites and critical resources."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
"In 2019, [Orfox was sunsetted](https://blog.torproject.org/orfox-paved-way-"
-"tor-browser-android) after the official Tor Browser for"
-msgstr ""
-
-#: https//tb-manual.torproject.org/mobile-tor/
-#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid "Android was released."
+"tor-browser-android) after the official Tor Browser for Android was "
+"released."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2691,14 +3109,14 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid ""
-"Orbot uses Tor to encrypt your Internet traffic. Then you can use it with "
-"other apps installed on your mobile device to"
+msgid "Orbot uses Tor to encrypt your Internet traffic."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
-msgid "circumvent censorship and protect against surveillance."
+msgid ""
+"Then you can use it with other apps installed on your mobile device to "
+"circumvent censorship and protect against surveillance."
msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
@@ -2764,7 +3182,9 @@ msgstr ""
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
msgid ""
-"There is currently no supported method for running Tor on Windows Phone."
+"There is currently no supported method for running Tor on older Windows "
+"Phones but in case of the newer Microsoft-branded/promoted phones, same "
+"steps on [Tor Browser on Android](#tor-browser-for-android) can be followed."
msgstr ""
#: https//tb-manual.torproject.org/make-tor-portable/
@@ -2870,22 +3290,29 @@ msgid "Close banner"
msgstr ""
#: lego/templates/banner.html:11 templates/banner.html:11
-msgid "Tracking, surveillance, and censorship are widespread online."
+msgid "Use a Mask, Use Tor."
msgstr ""
#: lego/templates/banner.html:20 templates/banner.html:20
-msgid "TAKE BACK THE INTERNET WITH TOR"
+msgid "Resist the surveillance pandemic."
+msgstr "निगरानी महामारी का विरोध करें।"
+
+#: lego/templates/banner.html:32 templates/banner.html:32
+msgid "Your donation will be matched by Friends of Tor, up to $100,000."
msgstr ""
-#: lego/templates/banner.html:33 lego/templates/banner.html:35
-#: templates/banner.html:33 templates/banner.html:35
+#: lego/templates/banner.html:38 lego/templates/footer.html:64
+#: lego/templates/footer.html:66 lego/templates/navbar.html:18
+#: lego/templates/navbar.html:20 templates/banner.html:38
+#: templates/footer.html:64 templates/footer.html:66 templates/navbar.html:18
+#: templates/navbar.html:20
+msgid "Donate Now"
+msgstr "अभी दान करें"
+
+#: lego/templates/banner.html:40 templates/banner.html:40
msgid "DONATE NOW"
msgstr "दान करे "
-#: lego/templates/banner.html:37 templates/banner.html:37
-msgid "Give today, and Mozilla will match your donation."
-msgstr ""
-
#: lego/templates/footer.html:13 lego/templates/footer.html:22
#: lego/templates/navbar.html:83 templates/footer.html:13
#: templates/footer.html:22 templates/navbar.html:83
@@ -2917,26 +3344,19 @@ msgstr ""
msgid "Donate"
msgstr "दान करें "
-#: lego/templates/footer.html:64 lego/templates/footer.html:66
-#: lego/templates/navbar.html:18 lego/templates/navbar.html:20
-#: templates/footer.html:64 templates/footer.html:66 templates/navbar.html:18
-#: templates/navbar.html:20
-msgid "Donate Now"
-msgstr "अभी दान करें"
-
-#: lego/templates/footer.html:73 templates/footer.html:73
+#: lego/templates/footer.html:75 templates/footer.html:75
msgid "Subscribe to our Newsletter"
msgstr ""
-#: lego/templates/footer.html:74 templates/footer.html:74
+#: lego/templates/footer.html:76 templates/footer.html:76
msgid "Get monthly updates and opportunities from the Tor Project:"
msgstr ""
-#: lego/templates/footer.html:75 templates/footer.html:75
+#: lego/templates/footer.html:77 templates/footer.html:77
msgid "Sign up"
msgstr ""
-#: lego/templates/footer.html:94 templates/footer.html:94
+#: lego/templates/footer.html:98 templates/footer.html:98
#, python-format
msgid ""
"Trademark, copyright notices, and rules for use by third parties can be "
@@ -3054,11 +3474,11 @@ msgid ""
"Defend yourself against tracking and surveillance. Circumvent censorship."
msgstr ""
-#: templates/layout.html:11
+#: templates/layout.html:14
msgid "Tor Project | Tor Browser Manual"
msgstr ""
-#: templates/sidenav.html:4 templates/sidenav.html:35
+#: templates/sidenav.html:4 templates/sidenav.html:34
msgid "Topics"
msgstr ""
@@ -3077,11 +3497,3 @@ msgstr ""
#: templates/macros/topic.html:26
msgid "Permalink"
msgstr ""
-
-#: lego/templates/banner.html:11 templates/banner.html:11
-msgid "Use a Mask, Use Tor."
-msgstr ""
-
-#: lego/templates/banner.html:20 templates/banner.html:20
-msgid "Resist the surveillance pandemic."
-msgstr "निगरानी महामारी का विरोध करें।"
1
0

[translation/abouttor-homepage_completed] https://gitweb.torproject.org/translation.git/commit/?h=abouttor-homepage_completed
by translation@torproject.org 21 Apr '21
by translation@torproject.org 21 Apr '21
21 Apr '21
commit 3d2975597e3eb8e23fea49b8b93b10a26d38ee38
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Apr 21 05:45:13 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=abouttor-homepage_c…
---
my/aboutTor.dtd | 31 +++++++++++++++++++++++++++++++
1 file changed, 31 insertions(+)
diff --git a/my/aboutTor.dtd b/my/aboutTor.dtd
new file mode 100644
index 0000000000..06bc341034
--- /dev/null
+++ b/my/aboutTor.dtd
@@ -0,0 +1,31 @@
+<!--
+ - 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 "Tor အကြောင်း">
+
+<!ENTITY aboutTor.viewChangelog.label "ပြောင်းလဲမှတ်တမ်း ကြည့်မယ်">
+
+<!ENTITY aboutTor.ready.label "လုံခြုံစွာ သုံးစွဲပါ။">
+<!ENTITY aboutTor.ready2.label "သင်သည် အင်တာနက်ကို အလုံခြုံဆုံးစွာ သုံးစွဲဖို့ အဆင်သင့်ဖြစ်ပါပြီ။">
+<!ENTITY aboutTor.failure.label "တစ်ခုခု မှားယွင်းသွားပါသည်!">
+<!ENTITY aboutTor.failure2.label "ဤ ဘရောင်ဇာတွင် Tor အလုပ်မလုပ်ပါ။">
+
+<!ENTITY aboutTor.search.label "DuckDuckGo ဖြင့် ရှာဖွေမယ်">
+<!ENTITY aboutTor.searchDDGPost.link "https://duckduckgo.com">
+
+<!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 "လ">
+<!ENTITY aboutTor.torbrowser_user_manual.label "Tor ဘရောင်ဇာ လက်စွဲစာအုပ်">
+
+<!ENTITY aboutTor.tor_mission.label "Tor Project သည် လူ့အခွင့်အရေးနှင့် လွတ်လပ်ရေးခွင့်များကို တိုးတက်စေရန် အမေရိကန် အကျိုးအမြတ်မယူသော ၅၀၁(ဂ)(၃) အဖွဲ့အစည်းတစ်ခု ဖြစ်ပါသည်။ လွတ်လပ်၍ အမည်ဝှက်ကာ အများသုံးနိုင်ပြီး ပုဂ္ဂိုလ်လုံခြုံရေးစောင့်ရှောက်သော နည်းပညာများ အသုံးပြုပါသည်။ ၎င်းနည်းပညာများကို အကန့်အသတ်မရှိစွာ သုံးစွဲနိုင်ခြင်းနှင့် သိပ္ပံဆိုင်ရာနှင့် ပြည်သူများနားလည်နိုင်စေရန် ပံ့
ပိုးထောက်ပံ့ပါသည်။">
+<!ENTITY aboutTor.getInvolved.label "ပါဝင်ပါ »">
+
+<!ENTITY aboutTor.newsletter.tagline "Tor မှ နောက်ဆုံးသတင်းများကို သင့် စာဝင်ပုံးထဲတန်း ရယူလိုက်ပါ။">
+<!ENTITY aboutTor.newsletter.link_text "Tor News သတင်းများအတွက် အမည် စာရင်းသွင်းလိုက်ပါ။">
+<!ENTITY aboutTor.donationBanner.freeToUse "Tor သည် သင့်လို သုံးသူများမှ လှူဒါန်းငွေကြောင့် အခမဲ့သုံးနိုင်ပါသည်။">
+<!ENTITY aboutTor.donationBanner.buttonA "အခုဘဲ လှူမယ်">
1
0

[translation/tbmanual-contentspot] pulling translations from transifex
by translation@torproject.org 21 Apr '21
by translation@torproject.org 21 Apr '21
21 Apr '21
commit 1494108d7aa748b9a549fecd0084901d97a5ba90
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Apr 21 05:16:13 2021 +0000
pulling translations from transifex
---
contents+es.po | 28 ++++++++++++++--------------
contents+pl.po | 7 +++----
contents+pt-BR.po | 7 +++----
3 files changed, 20 insertions(+), 22 deletions(-)
diff --git a/contents+es.po b/contents+es.po
index 9442424712..5145d0814f 100644
--- a/contents+es.po
+++ b/contents+es.po
@@ -12,8 +12,8 @@
# erinm, 2021
# Gus, 2021
# Burro Moro <burromoro(a)riseup.net>, 2021
-# Emma Peel, 2021
# Zuhualime Akoochimoya, 2021
+# Emma Peel, 2021
#
msgid ""
msgstr ""
@@ -21,7 +21,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-02 09:17+CET\n"
"PO-Revision-Date: 2018-11-14 12:31+0000\n"
-"Last-Translator: Zuhualime Akoochimoya, 2021\n"
+"Last-Translator: Emma Peel, 2021\n"
"Language-Team: Spanish (https://www.transifex.com/otf/teams/1519/es/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1691,8 +1691,8 @@ msgid ""
msgstr ""
"Haz clic en el menú hamburguesa (≡), vé hacia Preferencias (u Opciones en "
"Windows), haz clic en Privacidad y Seguridad, y en la sección Servicios "
-"Cebolla busca la entrada \"Priorizar sitios .onion cuando sean conocidos.\" "
-"y marca la opción \"Siempre\"."
+"Cebolla busca la entrada \"Priorizar sitios .onion cuando se conozcan\" y "
+"marca la opción \"Siempre\"."
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
@@ -1783,15 +1783,15 @@ msgid ""
"service errors."
msgstr ""
"Los errores pueden suceder en diferentes capas: errores de cliente, de red o"
-" de servicio."
+" del servicio."
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
msgid ""
"Some of these errors can be fixed by following the Troubleshooting section."
msgstr ""
-"Algunos de estos errors pueden ser arreglados siguiendo la sección Solución "
-"de Problemas."
+"Algunos de estos errores pueden arreglarse siguiendo la sección Solución de "
+"Problemas."
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
@@ -1800,7 +1800,7 @@ msgid ""
"take to solve the issue."
msgstr ""
"La tabla de abajo muestra todos los posibles errores y qué acción deberías "
-"tomar para resolver la cuestión."
+"tomar para resolverlos."
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
@@ -1828,7 +1828,7 @@ msgid ""
"| XF1 | Onion site Cannot Be Reached | The onion site is unreachable due to "
"an internal error. |"
msgstr ""
-"| XF1 | El Sitio Cebolla No Puede Ser Alcanzado | El sitio cebolla es "
+"| XF1 | El Sitio Cebolla No Se Puede Alcanzar | El sitio cebolla es "
"inalcanzable debido a un error interno. |"
#: https//tb-manual.torproject.org/onion-services/
@@ -1857,7 +1857,7 @@ msgid ""
"requires a key but none was provided. |"
msgstr ""
"| XF4 | El Sitio Cebolla Requiere Autenticación | El acceso al sitio cebolla"
-" requiere una clave, pero ninguna fue provista. |"
+" requiere una clave, pero no se ha proporcionado. |"
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
@@ -1876,7 +1876,7 @@ msgid ""
"invalid. Please check that you entered it correctly. |"
msgstr ""
"| XF6 | Dirección Del Sitio Cebolla Inválida | La dirección provista para el"
-" sitio cebolla no es válida. Por favor, comprueba que la hayas introducido "
+" sitio cebolla no es válida. Por favor, comprueba que la has introducido "
"correctamente. |"
#: https//tb-manual.torproject.org/onion-services/
@@ -1912,9 +1912,9 @@ msgid ""
"or the site operators may have allowed it to go offline without warning."
msgstr ""
"Si todavía no puedes conectar al servicio cebolla luego de verificar la "
-"dirección, por favor, inténtalo de nuevo más tarde. Puede haber un problema "
-"temporario de conexión, o los operadores del sitio pueden haberle permitido "
-"salir de línea sin advertencia."
+"dirección, por favor inténtalo más tarde. Puede haber un problema temporario"
+" de conexión, o los operadores del sitio pueden haberle permitido salir de "
+"línea sin advertencia."
#: https//tb-manual.torproject.org/onion-services/
#: (content/onion-services/contents+en.lrtopic.body)
diff --git a/contents+pl.po b/contents+pl.po
index 9b3c91ee04..b7b38122b6 100644
--- a/contents+pl.po
+++ b/contents+pl.po
@@ -1,6 +1,5 @@
#
# Translators:
-# Emma Peel, 2019
# Filip <filipiczesio(a)vp.pl>, 2019
# erinm, 2019
# Michał Nowak <nowak1michal(a)gmail.com>, 2019
@@ -13,6 +12,7 @@
# Gus, 2021
# Dawid Job <hoek(a)tuta.io>, 2021
# Jarek Kaczynski, 2021
+# Emma Peel, 2021
#
msgid ""
msgstr ""
@@ -20,7 +20,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-02 09:17+CET\n"
"PO-Revision-Date: 2018-11-14 12:31+0000\n"
-"Last-Translator: Jarek Kaczynski, 2021\n"
+"Last-Translator: Emma Peel, 2021\n"
"Language-Team: Polish (https://www.transifex.com/otf/teams/1519/pl/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -2813,8 +2813,7 @@ msgid ""
"Store](https://play.google.com/store/apps/details?id=org.torproject.torbrow…."
msgstr ""
"Możesz zainstalować przeglądarkę Tor na system Android ze [Sklepu Google "
-"Play] "
-"(https://play.google.com/store/apps/details?id=org.torproject.torbrowser)"
+"Play](https://play.google.com/store/apps/details?id=org.torproject.torbrows…."
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
diff --git a/contents+pt-BR.po b/contents+pt-BR.po
index aca8eec429..8016b993ae 100644
--- a/contents+pt-BR.po
+++ b/contents+pt-BR.po
@@ -3340,10 +3340,9 @@ msgid ""
"of the latest Tor Browser release, then [install](/mobile-tor/#downloading-"
"and-installation) it as before."
msgstr ""
-"Visite o [site do Projeto Tor] "
-"(https://www.torproject.org/download/#android) e faça o download de uma "
-"cópia da última versão do Navegador Tor e, em seguida, [instale](/mobile-tor"
-"/#downloading-and-installation) como antes."
+"Visite o [site do Projeto Tor](https://www.torproject.org/download/#android)"
+" e faça o download de uma cópia da última versão do Navegador Tor e, em "
+"seguida, [instale](/mobile-tor/#downloading-and-installation) como antes."
#: https//tb-manual.torproject.org/mobile-tor/
#: (content/mobile-tor/contents+en.lrtopic.body)
1
0

[Git][tpo/applications/android-components][android-components-74.0.10-10.5-1] 12 commits: Bug 40005: Modify Default toolbar menu
by Matthew Finkel 21 Apr '21
by Matthew Finkel 21 Apr '21
21 Apr '21
Matthew Finkel pushed to branch android-components-74.0.10-10.5-1 at The Tor Project / Applications / android-components
Commits:
f6027eb0 by Matthew Finkel at 2021-04-20T21:37:47+00:00
Bug 40005: Modify Default toolbar menu
- - - - -
44807351 by Alex Catarineu at 2021-04-20T21:37:47+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`.
- - - - -
72285226 by Alex Catarineu at 2021-04-20T21:37:47+00:00
Bug 40002: Ensure system download manager is not used
- - - - -
6af3b554 by Alex Catarineu at 2021-04-20T21:37:47+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.
- - - - -
cad8e466 by Alex Catarineu at 2021-04-20T21:37:47+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.
- - - - -
e43853a9 by Georg Koppen at 2021-04-20T21:37:47+00:00
Bug 40013: Add option do overwrite timestamp in extension version
- - - - -
2a406401 by Alex Catarineu at 2021-04-20T21:37:47+00:00
Bug 40015: Port padlock states for .onion services
- - - - -
22e293e9 by Alex Catarineu at 2021-04-20T21:37:47+00:00
Bug 40021: Force telemetry=false in Fennec settings migration
- - - - -
eeecd91f by Alex Catarineu at 2021-04-20T21:37:47+00:00
Bug 40022: Migrate Tor security level from Fennec
- - - - -
dc48045f by Matthew Finkel at 2021-04-20T21:37:47+00:00
Modify Tracking Protection configuration
Bug 40020: Disable third-party cookies
Bug 40024: Disable tracking protection by default
- - - - -
78efdf83 by Matthew Finkel at 2021-04-20T21:37:47+00:00
Bug 40023: Stop PrivateNotificationService
- - - - -
2c2db7aa by Matthew Finkel at 2021-04-20T21:37:54+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.1.0-10.5-1] 8 commits: Bug 40002: Add GitLab CI
by Matthew Finkel 21 Apr '21
by Matthew Finkel 21 Apr '21
21 Apr '21
Matthew Finkel pushed to branch tor-browser-88.1.0-10.5-1 at The Tor Project / Applications / fenix
Commits:
90e53f2d by Matthew Finkel at 2021-04-20T21:04:09+00:00
Bug 40002: Add GitLab CI
Pin CI builds to runners with 32GB of RAM to avoid OOM conditions.
- - - - -
00002797 by Matthew Finkel at 2021-04-20T21:04:09+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
- - - - -
42131500 by Matthew Finkel at 2021-04-20T21:04:09+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
- - - - -
c80e202d by Georg Koppen at 2021-04-20T21:04:09+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.
- - - - -
efae7ebb by Matthew Finkel at 2021-04-20T21:04:09+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
- - - - -
c8bec06e by Alex Catarineu at 2021-04-20T21:04:09+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
- - - - -
ad26d7dd by Alex Catarineu at 2021-04-20T21:04:09+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
- - - - -
774375bf by Matthew Finkel at 2021-04-20T21:04:20+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/2d998b2f81cc…
--
View it on GitLab: https://gitlab.torproject.org/tpo/applications/fenix/-/compare/2d998b2f81cc…
You're receiving this email because of your account on gitlab.torproject.org.
1
0

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

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

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

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

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