tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 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/tails-misc] https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
by translation@torproject.org 15 Apr '21
by translation@torproject.org 15 Apr '21
15 Apr '21
commit 08de46f1d3078663b37ae65b11a967a4759ee131
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 15 09:16:07 2021 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tails-misc
---
cs.po | 52 ++++++++++++++++++++++++++--------------------------
1 file changed, 26 insertions(+), 26 deletions(-)
diff --git a/cs.po b/cs.po
index d93d00ae4a..ac87c83500 100644
--- a/cs.po
+++ b/cs.po
@@ -7,7 +7,7 @@
# Adam Slovacek <adamslovacek(a)gmail.com…
[View More]>, 2013
# David Nowak <user412(a)secmail.pro>, 2020
# Filip Hruska <fhr(a)fhrnet.eu>, 2014
-# Fourdee Foureight, 2020
+# Fourdee Foureight, 2020-2021
# Jan Pechacek <jan386(a)gmail.com>, 2021
# Pivoj, 2015
# Jiří Vírava <appukonrad(a)gmail.com>, 2013-2014
@@ -26,8 +26,8 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2021-03-22 07:40+0100\n"
-"PO-Revision-Date: 2021-03-22 09:16+0000\n"
-"Last-Translator: IDRASSI Mounir <mounir.idrassi(a)idrix.fr>\n"
+"PO-Revision-Date: 2021-04-15 08:56+0000\n"
+"Last-Translator: Fourdee Foureight\n"
"Language-Team: Czech (http://www.transifex.com/otf/torproject/language/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -116,7 +116,7 @@ msgstr "_Ukončit"
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/DownloadProgress.pm:59
msgid "Unknow time"
-msgstr ""
+msgstr "Neznámý čas"
#. Translators: Don't translate {count}, it's a place holder and
#. will be replaced.
@@ -125,10 +125,10 @@ msgstr ""
#, perl-brace-format
msgid "1y"
msgid_plural "{count}y"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1r"
+msgstr[1] "1y"
+msgstr[2] "1y"
+msgstr[3] "{count}r"
#. Translators: Don't translate {count}, it's a place holder and
#. will be replaced.
@@ -137,10 +137,10 @@ msgstr[3] ""
#, perl-brace-format
msgid "1d"
msgid_plural "{count}d"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1d"
+msgstr[1] "1d"
+msgstr[2] "1d"
+msgstr[3] "{count}d"
#. Translators: Don't translate {count}, it's a place holder and
#. will be replaced.
@@ -149,10 +149,10 @@ msgstr[3] ""
#, perl-brace-format
msgid "1h"
msgid_plural "{count}h"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1h"
+msgstr[1] "1h"
+msgstr[2] "1h"
+msgstr[3] "{count}h"
#. Translators: Don't translate {count}, it's a place holder and
#. will be replaced.
@@ -161,10 +161,10 @@ msgstr[3] ""
#, perl-brace-format
msgid "1m"
msgid_plural "{count}m"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1m"
+msgstr[1] "1m"
+msgstr[2] "1m"
+msgstr[3] "{count}m"
#. Translators: Don't translate {count}, it's a place holder and
#. will be replaced.
@@ -173,17 +173,17 @@ msgstr[3] ""
#, perl-brace-format
msgid "1s"
msgid_plural "{count}s"
-msgstr[0] ""
-msgstr[1] ""
-msgstr[2] ""
-msgstr[3] ""
+msgstr[0] "1s"
+msgstr[1] "1s"
+msgstr[2] "1s"
+msgstr[3] "{count}s"
#. Translators: don't translate {time}, {downloaded}, {size}
#. and {speed}, they are placeholders and will be replaced.
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/DownloadProgress.pm:139
#, perl-brace-format
msgid "#{time} left — {downloaded} of {size} ({speed}/sec)\n"
-msgstr ""
+msgstr "#{time} zbývá — {downloaded} z {size} ({speed}/s)\n"
#. Translators: KB is the short form for kilobyte
#: config/chroot_local-includes/usr/src/iuk/lib/Tails/IUK/Role/FormatByte.pm:33
@@ -1981,7 +1981,7 @@ msgid ""
"You are not connected to a local network yet.\\n\\nTo be able to start the "
"Unsafe Browser, you first need to connect to a Wi-Fi, wired, or mobile "
"network."
-msgstr ""
+msgstr "Ještě nejste připojeni k místní síti. \\n\\n Nebudete moci spustit nezabezpečený prohlížeč, dokud se napřipojíte k Wi-Fi, kabelové nebo mobilní síti."
#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:131
msgid "Failed to run browser."
[View Less]
1
0

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

[tor-browser/tor-browser-78.10.0esr-10.0-1] squash! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 15 Apr '21
by gk@torproject.org 15 Apr '21
15 Apr '21
commit ad9b226c58980e211c2f1f6b862035597c1f7fbf
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Tue Apr 13 19:38:32 2021 +0000
squash! TB4: Tor Browser's Firefox preference overrides.
Bug 40408: Disallow SVG Context Paint in all web content
---
browser/app/profile/000-tor-browser.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 5c65eff70fc0..ea6a2f097e4d 100644
--- a/…
[View More]browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -255,6 +255,9 @@ pref("browser.policies.testing.disallowEnterprise", true);
pref("svg.in-content.enabled", true);
pref("mathml.disabled", false);
+// Bug 40408
+pref("svg.context-properties.content.allowed-domains", "");
+
// Network and performance
pref("security.ssl.enable_false_start", true);
pref("network.http.connection-retry-timeout", 0);
[View Less]
1
0

[tor-browser/tor-browser-78.10.0esr-10.5-1] squash! TB4: Tor Browser's Firefox preference overrides.
by gk@torproject.org 15 Apr '21
by gk@torproject.org 15 Apr '21
15 Apr '21
commit 7f4ec86a0a0129f069ed0cc911a26fe4055d448c
Author: Matthew Finkel <sysrqb(a)torproject.org>
Date: Tue Apr 13 19:38:32 2021 +0000
squash! TB4: Tor Browser's Firefox preference overrides.
Bug 40408: Disallow SVG Context Paint in all web content
---
browser/app/profile/000-tor-browser.js | 3 +++
1 file changed, 3 insertions(+)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 3961eca0868a..760c405d06a6 100644
--- a/…
[View More]browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -255,6 +255,9 @@ pref("browser.policies.testing.disallowEnterprise", true);
pref("svg.in-content.enabled", true);
pref("mathml.disabled", false);
+// Bug 40408
+pref("svg.context-properties.content.allowed-domains", "");
+
// Network and performance
pref("security.ssl.enable_false_start", true);
pref("network.http.connection-retry-timeout", 0);
[View Less]
1
0
commit 284f445248655871709e2b25d696d382109d2b78
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Apr 14 15:22:26 2021 -0400
two more changelog fixes from arma
---
ChangeLog | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index a16c21a327..11d1479fcd 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -21,7 +21,7 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
inactivity. Most people won't need this. Closes ticket 40228.
o …
[View More]Minor features (fallback directory list):
- - Renegerate the list of fallback directories to contain a new set
+ - Regenerate the list of fallback directories to contain a new set
of 200 relays. Closes ticket 40265.
o Minor features (geoip data):
@@ -35,7 +35,7 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
o Minor bugfixes (bridge, pluggable transport):
- Fix a regression that made it impossible start Tor using a bridge
- line with a transport name and no a fingerprint. Fixes bug 40360;
+ line with a transport name and no fingerprint. Fixes bug 40360;
bugfix on 0.4.5.4-rc.
o Minor bugfixes (channel, DoS):
[View Less]
1
0
commit 943d4834afb2a09a0b2ab1c154f09a653ddd0589
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Apr 14 14:24:32 2021 -0400
light changelog edits
---
ChangeLog | 48 ++++++++++++++++++++++++++----------------------
1 file changed, 26 insertions(+), 22 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 0f8d338b68..d7793f00f0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,24 +1,28 @@
Changes in version 0.4.6.2-alpha - 2021-04-15
- BLURB HERE
+ Tor 0.4.6.2-alpha is the …
[View More]second alpha in its series. It fixes several
+ small bugs in previous releases, and solves other issues that had
+ enabled denial-of-service attacks and affected integration with
+ other tools.
o Minor features (client):
- Clients now check whether their streams are attempting to re-enter
- the Tor network (i.e. to send Tor traffic over Tor), and they
- close them preemptively if they think exit relays will refuse
- them. See ticket 2667 for details. Close ticket 40271.
+ the Tor network (i.e. to send Tor traffic over Tor), and close
+ them preemptively if they think exit relays will refuse them for
+ this reason. See ticket 2667 for details. Close ticket 40271.
o Minor features (command line):
- - Add long format name --torrc-file for command line option -f.
- Closes ticket 40324. Patch by Daniel Pinto.
+ - Add long format name "--torrc-file" equivalent to the existing
+ command-line option "-f". Closes ticket 40324. Patch by
+ Daniel Pinto.
o Minor features (dormant mode):
- Add a new 'DormantTimeoutEnabled' option to allow coarse-grained
control over whether the client ever becomes dormant from
inactivity. Most people won't need this. Closes ticket 40228.
- o Minor features (fallback directory):
- - Renegerate the list to a new set of 200 relays acting as fallback
- directories. Closes ticket 40265.
+ o Minor features (fallback directory list):
+ - Renegerate the list of fallback directories to contain a new set
+ of 200 relays. Closes ticket 40265.
o Minor features (geoip data):
- Update the geoip files to match the IPFire Location Database, as
@@ -35,9 +39,9 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
bugfix on 0.4.5.4-rc.
o Minor bugfixes (channel, DoS):
- - Fix a possible non fatal assertion BUG() due to a too early free
- of a string when noting down the client connection for the DoS
- defenses subsystem. Fixes bug 40345; bugfix on 0.4.3.4-rc
+ - Fix a non-fatal BUG() message due to a too-early free of a string,
+ when listing a client connection from the DoS defenses subsystem.
+ Fixes bug 40345; bugfix on 0.4.3.4-rc
o Minor bugfixes (compilation):
- Fix a compilation warning about unused functions when building
@@ -45,9 +49,9 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
40354; bugfix on 0.4.5.1-alpha. Patch by Daniel Pinto.
o Minor bugfixes (configuration):
- - Fix globbing directories on all platforms when using %include
- options in configuration files. This patch also fixes compilation
- on musl libc based systems. Fixes bug 40141; bugfix
+ - Fix pattern-matching for directories on all platforms when using
+ %include options in configuration files. This patch also fixes
+ compilation on musl libc based systems. Fixes bug 40141; bugfix
on 0.4.5.1-alpha.
o Minor bugfixes (relay):
@@ -55,17 +59,17 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
descriptor. Fixes bug 40364; bugfix on 0.4.6.1-alpha.
o Minor bugfixes (testing, BSD):
- - Fix glob processing errors when globs expand to invalid paths on
- BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by
+ - Fix pattern-matching errors when patterns expand to invalid paths
+ on BSD systems. Fixes bug 40318; bugfix on 0.4.5.1-alpha. Patch by
Daniel Pinto.
o Documentation (manual):
- - Move the ServerTransport* options to the SERVER OPTIONS` section.
+ - Move the ServerTransport* options to the "SERVER OPTIONS" section.
Closes issue 40331.
- - The HiddenServiceStatistics option also applies to bridges so
- properly indicate that in the tor.1 man page. Closes ticket 40346.
- - Move the description of "BridgeRecordUsageByCountry" to the
- section "STATISTICS OPTIONS". Closes ticket 40323.
+ - Indicate that the HiddenServiceStatistics option also applies to
+ bridges. Closes ticket 40346.
+ - Move the description of BridgeRecordUsageByCountry to the section
+ "STATISTICS OPTIONS". Closes ticket 40323.
Changes in version 0.4.6.1-alpha - 2021-03-18
[View Less]
1
0
commit c5f84ce6a3f5184ff02984e2f0505651df5a88c5
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Apr 14 15:15:15 2021 -0400
changelog edits from arma
---
ChangeLog | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index d7793f00f0..a16c21a327 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -8,7 +8,7 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
- Clients now check whether their streams are attempting to re-enter
the …
[View More]Tor network (i.e. to send Tor traffic over Tor), and close
them preemptively if they think exit relays will refuse them for
- this reason. See ticket 2667 for details. Close ticket 40271.
+ this reason. See ticket 2667 for details. Closes ticket 40271.
o Minor features (command line):
- Add long format name "--torrc-file" equivalent to the existing
@@ -34,14 +34,14 @@ Changes in version 0.4.6.2-alpha - 2021-04-15
from 'cypherpunks'.
o Minor bugfixes (bridge, pluggable transport):
- - Fix a regression that prevented to configure a Bridge line without
- a fingerprint (which is a normal use case). Fixes bug 40360;
+ - Fix a regression that made it impossible start Tor using a bridge
+ line with a transport name and no a fingerprint. Fixes bug 40360;
bugfix on 0.4.5.4-rc.
o Minor bugfixes (channel, DoS):
- Fix a non-fatal BUG() message due to a too-early free of a string,
when listing a client connection from the DoS defenses subsystem.
- Fixes bug 40345; bugfix on 0.4.3.4-rc
+ Fixes bug 40345; bugfix on 0.4.3.4-rc.
o Minor bugfixes (compilation):
- Fix a compilation warning about unused functions when building
[View Less]
1
0

[tor-browser/tor-browser-78.10.0esr-10.0-1] Bug 4234: Use the Firefox Update Process for Tor Browser.
by sysrqb@torproject.org 14 Apr '21
by sysrqb@torproject.org 14 Apr '21
14 Apr '21
commit 1f7298a7f42f6bdf5159d84cb3955dc5b34400ad
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Fri Jan 13 11:40:24 2017 -0500
Bug 4234: Use the Firefox Update Process for Tor Browser.
The following files are never updated:
TorBrowser/Data/Browser/profiles.ini
TorBrowser/Data/Browser/profile.default/bookmarks.html
TorBrowser/Data/Tor/torrc
Mac OS: Store update metadata under TorBrowser/UpdateInfo.
Removed the %OS_VERSION% component from the …
[View More]update URL (13047) and
added support for minSupportedOSVersion, an attribute of the
<update> element that may be used to trigger Firefox's
"unsupported platform" behavior.
Hide the "What's new" links (set app.releaseNotesURL value to about:blank).
Windows: disable "runas" code path in updater (15201).
Windows: avoid writing to the registry (16236).
Also includes fixes for tickets 13047, 13301, 13356, 13594, 15406,
16014, 16909, 24476, and 25909.
Also fix Bug 26049: reduce the delay before the update prompt is displayed.
Instead of Firefox's 2 days, we use 1 hour (after which time the update
doorhanger will be displayed).
Also fix bug 27221: purge the startup cache if the Tor Browser
version changed (even if the Firefox version and build ID did
not change), e.g., after a minor Tor Browser update.
Also fix 32616: Disable GetSecureOutputDirectoryPath() functionality.
Bug 26048: potentially confusing "restart to update" message
Within the update doorhanger, remove the misleading message that mentions
that windows will be restored after an update is applied, and replace the
"Restart and Restore" button label with an existing
"Restart to update Tor Browser" string.
Bug 28885: notify users that update is downloading
Add a "Downloading Tor Browser update" item which appears in the
hamburger (app) menu while the update service is downloading a MAR
file. Before this change, the browser did not indicate to the user
that an update was in progress, which is especially confusing in
Tor Browser because downloads often take some time. If the user
clicks on the new menu item, the about dialog is opened to allow
the user to see download progress.
As part of this fix, the update service was changed to always show
update-related messages in the hamburger menu, even if the update
was started in the foreground via the about dialog or via the
"Check for Tor Browser Update" toolbar menu item. This change is
consistent with the Tor Browser goal of making sure users are
informed about the update process.
Removed #28885 parts of this patch which have been uplifted to Firefox.
Use a localized string from Torbutton for the app menu's
"Downloading update" message. This is a temporary fix that can
be removed once Tor Browser is based on Firefox 79 or newer (at
which point the localized string will be included in the Firefox
language packs).
---
browser/app/Makefile.in | 2 +
browser/app/profile/000-tor-browser.js | 16 +-
browser/app/profile/firefox.js | 10 +-
.../base/content/aboutDialog-appUpdater-legacy.js | 2 +-
browser/base/content/aboutDialog-appUpdater.js | 2 +-
browser/base/content/aboutDialog.js | 12 +-
browser/components/BrowserContentHandler.jsm | 39 ++-
.../customizableui/content/panelUI.inc.xhtml | 8 +-
.../components/customizableui/content/panelUI.js | 22 ++
browser/confvars.sh | 35 +--
browser/installer/package-manifest.in | 2 +
build/application.ini.in | 2 +-
build/moz.configure/init.configure | 3 +-
config/createprecomplete.py | 17 +-
.../client/aboutdebugging/src/actions/runtimes.js | 5 +
toolkit/modules/UpdateUtils.jsm | 34 +--
toolkit/mozapps/extensions/AddonManager.jsm | 24 ++
toolkit/mozapps/extensions/test/browser/head.js | 1 +
.../extensions/test/xpcshell/head_addons.js | 1 +
toolkit/mozapps/update/UpdateService.jsm | 127 +++++++-
toolkit/mozapps/update/UpdateServiceStub.jsm | 4 +
toolkit/mozapps/update/common/updatehelper.cpp | 8 +
toolkit/mozapps/update/moz.build | 5 +-
toolkit/mozapps/update/updater/launchchild_osx.mm | 2 +
toolkit/mozapps/update/updater/moz.build | 2 +-
toolkit/mozapps/update/updater/updater.cpp | 339 ++++++++++++++++++---
toolkit/xre/MacLaunchHelper.h | 2 +
toolkit/xre/MacLaunchHelper.mm | 2 +
toolkit/xre/nsAppRunner.cpp | 22 +-
toolkit/xre/nsUpdateDriver.cpp | 109 ++++++-
toolkit/xre/nsXREDirProvider.cpp | 42 ++-
tools/update-packaging/common.sh | 76 +++--
tools/update-packaging/make_full_update.sh | 26 ++
tools/update-packaging/make_incremental_update.sh | 74 ++++-
34 files changed, 912 insertions(+), 165 deletions(-)
diff --git a/browser/app/Makefile.in b/browser/app/Makefile.in
index 6770319f1866..7263b8e1dde7 100644
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -98,10 +98,12 @@ tools repackage:: $(DIST)/bin/$(MOZ_APP_NAME)
rsync -aL $(DIST)/bin/$(MOZ_APP_NAME) '$(dist_dest)/Contents/MacOS'
cp -RL $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/firefox.icns '$(dist_dest)/Contents/Resources/firefox.icns'
cp -RL $(topsrcdir)/$(MOZ_BRANDING_DIRECTORY)/document.icns '$(dist_dest)/Contents/Resources/document.icns'
+ifndef TOR_BROWSER_UPDATE
$(MKDIR) -p '$(dist_dest)/Contents/Library/LaunchServices'
ifdef MOZ_UPDATER
mv -f '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater' '$(dist_dest)/Contents/Library/LaunchServices'
ln -s ../../../../Library/LaunchServices/org.mozilla.updater '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater'
+endif
endif
printf APPLTORB > '$(dist_dest)/Contents/PkgInfo'
endif
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index ee43580c1365..c842e80deb68 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -7,7 +7,6 @@
// Disable initial homepage notifications
pref("browser.search.update", false);
pref("browser.rights.3.shown", true);
-pref("browser.startup.homepage_override.mstone", "ignore");
pref("startup.homepage_welcome_url", "");
pref("startup.homepage_welcome_url.additional", "");
@@ -20,9 +19,17 @@ pref("startup.homepage_override_url", "https://blog.torproject.org/category/tags
// Try to nag a bit more about updates: Pop up a restart dialog an hour after the initial dialog
pref("app.update.promptWaitTime", 3600);
-
-#ifdef XP_WIN
-// For now, disable staged updates on Windows (see #18292).
+pref("app.update.notifyDuringDownload", true);
+pref("app.update.url.manual", "https://www.torproject.org/download/languages/");
+pref("app.update.url.details", "https://www.torproject.org/download/");
+pref("app.update.badgeWaitTime", 0);
+pref("app.releaseNotesURL", "about:blank");
+
+#ifndef XP_MACOSX
+// Disable staged updates on platforms other than macOS.
+// Staged updates do not work on Windows due to #18292.
+// Also, on Windows and Linux any changes that are made to the browser profile
+// or Tor data after an update is staged will be lost.
pref("app.update.staging.enabled", false);
#endif
@@ -82,6 +89,7 @@ pref("datareporting.policy.dataSubmissionEnabled", false);
// Make sure Unified Telemetry is really disabled, see: #18738.
pref("toolkit.telemetry.unified", false);
pref("toolkit.telemetry.enabled", false);
+pref("toolkit.telemetry.updatePing.enabled", false); // Make sure updater telemetry is disabled; see #25909.
#ifdef XP_WIN
// Defense-in-depth: ensure that the Windows default browser agent will
// not ping Mozilla if it is somehow present (we omit it at build time).
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index b04fd2dd30f0..fb2d10c0a305 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -136,14 +136,8 @@ pref("app.update.elevation.promptMaxAttempts", 2);
pref("app.update.notifyDuringDownload", false);
// If set to true, the Update Service will automatically download updates if the
-// user can apply updates. This pref is no longer used on Windows, except as the
-// default value to migrate to the new location that this data is now stored
-// (which is in a file in the update directory). Because of this, this pref
-// should no longer be used directly. Instead, getAppUpdateAutoEnabled and
-// getAppUpdateAutoEnabled from UpdateUtils.jsm should be used.
-#ifndef XP_WIN
- pref("app.update.auto", true);
-#endif
+// user can apply updates.
+pref("app.update.auto", true);
// If set to true, the Update Service will apply updates in the background
// when it finishes downloading them.
diff --git a/browser/base/content/aboutDialog-appUpdater-legacy.js b/browser/base/content/aboutDialog-appUpdater-legacy.js
index 0629e8eaf41a..9f96e2263295 100644
--- a/browser/base/content/aboutDialog-appUpdater-legacy.js
+++ b/browser/base/content/aboutDialog-appUpdater-legacy.js
@@ -192,7 +192,7 @@ appUpdater.prototype = {
if (aChildID == "downloadAndInstall") {
let updateVersion = gAppUpdater.update.displayVersion;
// Include the build ID if this is an "a#" (nightly or aurora) build
- if (/a\d+$/.test(updateVersion)) {
+ if (!AppConstants.TOR_BROWSER_UPDATE && /a\d+$/.test(updateVersion)) {
let buildID = gAppUpdater.update.buildID;
let year = buildID.slice(0, 4);
let month = buildID.slice(4, 6);
diff --git a/browser/base/content/aboutDialog-appUpdater.js b/browser/base/content/aboutDialog-appUpdater.js
index 79828e5a279f..71de80626b89 100644
--- a/browser/base/content/aboutDialog-appUpdater.js
+++ b/browser/base/content/aboutDialog-appUpdater.js
@@ -147,7 +147,7 @@ appUpdater.prototype = {
if (aChildID == "downloadAndInstall") {
let updateVersion = gAppUpdater.update.displayVersion;
// Include the build ID if this is an "a#" (nightly or aurora) build
- if (/a\d+$/.test(updateVersion)) {
+ if (!AppConstants.TOR_BROWSER_UPDATE && /a\d+$/.test(updateVersion)) {
let buildID = gAppUpdater.update.buildID;
let year = buildID.slice(0, 4);
let month = buildID.slice(4, 6);
diff --git a/browser/base/content/aboutDialog.js b/browser/base/content/aboutDialog.js
index 19f0d6f16c6c..13dfe0e37ca2 100644
--- a/browser/base/content/aboutDialog.js
+++ b/browser/base/content/aboutDialog.js
@@ -50,15 +50,13 @@ async function init(aEvent) {
bits: Services.appinfo.is64Bit ? 64 : 32,
};
+ // Adjust version text to show the Tor Browser version
+ versionAttributes.version = AppConstants.TOR_BROWSER_VERSION +
+ " (based on Mozilla Firefox " +
+ AppConstants.MOZ_APP_VERSION_DISPLAY + ")";
+
let version = Services.appinfo.version;
if (/a\d+$/.test(version)) {
- versionId = "aboutDialog-version-nightly";
- let buildID = Services.appinfo.appBuildID;
- let year = buildID.slice(0, 4);
- let month = buildID.slice(4, 6);
- let day = buildID.slice(6, 8);
- versionAttributes.isodate = `${year}-${month}-${day}`;
-
document.getElementById("experimental").hidden = false;
document.getElementById("communityDesc").hidden = true;
}
diff --git a/browser/components/BrowserContentHandler.jsm b/browser/components/BrowserContentHandler.jsm
index 8d5c4e970cd9..9f5b6ab0218c 100644
--- a/browser/components/BrowserContentHandler.jsm
+++ b/browser/components/BrowserContentHandler.jsm
@@ -46,6 +46,8 @@ XPCOMUtils.defineLazyGlobalGetters(this, [URL]);
const NEWINSTALL_PAGE = "about:newinstall";
+const kTBSavedVersionPref = "browser.startup.homepage_override.torbrowser.version";
+
// One-time startup homepage override configurations
const ONCE_DOMAINS = ["mozilla.org", "firefox.com"];
const ONCE_PREF = "browser.startup.homepage_override.once";
@@ -105,7 +107,8 @@ const OVERRIDE_ALTERNATE_PROFILE = 4;
* Returns:
* OVERRIDE_NEW_PROFILE if this is the first run with a new profile.
* OVERRIDE_NEW_MSTONE if this is the first run with a build with a different
- * Gecko milestone (i.e. right after an upgrade).
+ * Gecko milestone or Tor Browser version (i.e. right
+ * after an upgrade).
* OVERRIDE_NEW_BUILD_ID if this is the first run with a new build ID of the
* same Gecko milestone (i.e. after a nightly upgrade).
* OVERRIDE_NONE otherwise.
@@ -128,6 +131,11 @@ function needHomepageOverride(prefb) {
var mstone = Services.appinfo.platformVersion;
+ var savedTBVersion = null;
+ try {
+ savedTBVersion = prefb.getCharPref(kTBSavedVersionPref);
+ } catch (e) {}
+
var savedBuildID = prefb.getCharPref(
"browser.startup.homepage_override.buildID",
""
@@ -146,7 +154,22 @@ function needHomepageOverride(prefb) {
prefb.setCharPref("browser.startup.homepage_override.mstone", mstone);
prefb.setCharPref("browser.startup.homepage_override.buildID", buildID);
- return savedmstone ? OVERRIDE_NEW_MSTONE : OVERRIDE_NEW_PROFILE;
+ prefb.setCharPref(kTBSavedVersionPref, AppConstants.TOR_BROWSER_VERSION);
+
+ // After an upgrade from an older release of Tor Browser (<= 5.5a1), the
+ // savedmstone will be undefined because those releases included the
+ // value "ignore" for the browser.startup.homepage_override.mstone pref.
+ // To correctly detect an upgrade vs. a new profile, we check for the
+ // presence of the "app.update.postupdate" pref.
+ let updated = prefb.prefHasUserValue("app.update.postupdate");
+ return (savedmstone || updated) ? OVERRIDE_NEW_MSTONE
+ : OVERRIDE_NEW_PROFILE;
+ }
+
+ if (AppConstants.TOR_BROWSER_VERSION != savedTBVersion) {
+ prefb.setCharPref("browser.startup.homepage_override.buildID", buildID);
+ prefb.setCharPref(kTBSavedVersionPref, AppConstants.TOR_BROWSER_VERSION);
+ return OVERRIDE_NEW_MSTONE;
}
if (buildID != savedBuildID) {
@@ -645,6 +668,13 @@ nsBrowserContentHandler.prototype = {
"browser.startup.homepage_override.buildID",
"unknown"
);
+
+ // We do the same for the Tor Browser version.
+ let old_tbversion = null;
+ try {
+ old_tbversion = prefb.getCharPref(kTBSavedVersionPref);
+ } catch (e) {}
+
override = needHomepageOverride(prefb);
if (override != OVERRIDE_NONE) {
switch (override) {
@@ -677,9 +707,10 @@ nsBrowserContentHandler.prototype = {
"startup.homepage_override_url"
);
let update = UpdateManager.activeUpdate;
+ let old_version = old_tbversion ? old_tbversion: old_mstone;
if (
update &&
- Services.vc.compare(update.appVersion, old_mstone) > 0
+ Services.vc.compare(update.appVersion, old_version) > 0
) {
overridePage = getPostUpdateOverridePage(update, overridePage);
// Send the update ping to signal that the update was successful.
@@ -687,6 +718,8 @@ nsBrowserContentHandler.prototype = {
}
overridePage = overridePage.replace("%OLD_VERSION%", old_mstone);
+ overridePage = overridePage.replace("%OLD_TOR_BROWSER_VERSION%",
+ old_tbversion);
break;
case OVERRIDE_NEW_BUILD_ID:
if (UpdateManager.activeUpdate) {
diff --git a/browser/components/customizableui/content/panelUI.inc.xhtml b/browser/components/customizableui/content/panelUI.inc.xhtml
index bdb8a7c227cf..719eee14e681 100644
--- a/browser/components/customizableui/content/panelUI.inc.xhtml
+++ b/browser/components/customizableui/content/panelUI.inc.xhtml
@@ -143,14 +143,15 @@
<popupnotification id="appMenu-update-restart-notification"
popupid="update-restart"
data-lazy-l10n-id="appmenu-update-restart"
- data-l10n-attrs="buttonlabel, buttonaccesskey, secondarybuttonlabel, secondarybuttonaccesskey"
+ data-l10n-attrs="buttonaccesskey, secondarybuttonlabel, secondarybuttonaccesskey"
+ buttonlabel="&updateRestart.panelUI.label2;"
closebuttonhidden="true"
dropmarkerhidden="true"
checkboxhidden="true"
buttonhighlight="true"
hidden="true">
<popupnotificationcontent id="update-restart-notification-content" orient="vertical">
- <description id="update-restart-description" data-lazy-l10n-id="appmenu-update-restart-message"></description>
+ <description id="update-restart-description"> </description>
</popupnotificationcontent>
</popupnotification>
@@ -223,8 +224,7 @@
<vbox class="panel-subview-body">
<vbox id="appMenu-addon-banners"/>
<toolbarbutton id="appMenu-update-banner" class="panel-banner-item"
- data-l10n-id="appmenuitem-update-banner"
- data-l10n-attrs="label-update-downloading"
+ label-update-downloading="Downloading update"
label-update-available="&updateAvailable.panelUI.label;"
label-update-manual="&updateManual.panelUI.label;"
label-update-unsupported="&updateUnsupported.panelUI.label;"
diff --git a/browser/components/customizableui/content/panelUI.js b/browser/components/customizableui/content/panelUI.js
index aa5cc7021f8e..97b6af51b22b 100644
--- a/browser/components/customizableui/content/panelUI.js
+++ b/browser/components/customizableui/content/panelUI.js
@@ -59,6 +59,7 @@ const PanelUI = {
init() {
this._initElements();
+ this._initUpdaterStrings();
this.menuButton.addEventListener("mousedown", this);
this.menuButton.addEventListener("keypress", this);
@@ -147,6 +148,27 @@ const PanelUI = {
}
},
+ _initUpdaterStrings() {
+ // If Torbutton is installed and enabled, replace the "Downloading update"
+ // string with one from torbutton.properties (to facilitate localization).
+ // This function can be removed when Tor Browser is based on Firefox 79
+ // or newer (where the localized string is included in the Firefox
+ // language packs).
+ try {
+ let brands = Services.strings.createBundle(
+ "chrome://branding/locale/brand.properties");
+ let stringArgs = [brands.GetStringFromName("brandShortName")];
+ let torbuttonBundle = Services.strings.createBundle(
+ "chrome://torbutton/locale/torbutton.properties");
+ let label = torbuttonBundle.formatStringFromName(
+ "updateDownloadingPanelUILabel", stringArgs, 1);
+ let elem = document.getElementById("appMenu-update-banner");
+ if (elem) {
+ elem.setAttribute("label-update-downloading", label);
+ }
+ } catch (e) {}
+ },
+
_eventListenersAdded: false,
_ensureEventListenersAdded() {
if (this._eventListenersAdded) {
diff --git a/browser/confvars.sh b/browser/confvars.sh
index 31f28736606d..f994783f9c65 100755
--- a/browser/confvars.sh
+++ b/browser/confvars.sh
@@ -7,26 +7,6 @@ MOZ_APP_BASENAME=Firefox
MOZ_APP_VENDOR=Mozilla
MOZ_UPDATER=1
-if test "$OS_ARCH" = "WINNT"; then
- if ! test "$HAVE_64BIT_BUILD"; then
- if test "$MOZ_UPDATE_CHANNEL" = "nightly" -o \
- "$MOZ_UPDATE_CHANNEL" = "nightly-try" -o \
- "$MOZ_UPDATE_CHANNEL" = "aurora" -o \
- "$MOZ_UPDATE_CHANNEL" = "beta" -o \
- "$MOZ_UPDATE_CHANNEL" = "release"; then
- if ! test "$MOZ_DEBUG"; then
- if ! test "$USE_STUB_INSTALLER"; then
- # Expect USE_STUB_INSTALLER from taskcluster for downstream task consistency
- echo "ERROR: STUB installer expected to be enabled but"
- echo "ERROR: USE_STUB_INSTALLER is not specified in the environment"
- exit 1
- fi
- MOZ_STUB_INSTALLER=1
- fi
- fi
- fi
-fi
-
BROWSER_CHROME_URL=chrome://browser/content/browser.xhtml
# MOZ_APP_DISPLAYNAME will be set by branding/configure.sh
@@ -39,6 +19,21 @@ MOZ_BRANDING_DIRECTORY=browser/branding/unofficial
MOZ_OFFICIAL_BRANDING_DIRECTORY=browser/branding/official
MOZ_APP_ID={ec8030f7-c20a-464f-9b0e-13a3a9e97384}
+# ACCEPTED_MAR_CHANNEL_IDS should usually be the same as the value MAR_CHANNEL_ID.
+# If more than one ID is needed, then you should use a comma separated list
+# of values.
+# The MAR_CHANNEL_ID must not contain the following 3 characters: ",\t "
+if test "$MOZ_UPDATE_CHANNEL" = "alpha"; then
+ ACCEPTED_MAR_CHANNEL_IDS=torbrowser-torproject-alpha
+ MAR_CHANNEL_ID=torbrowser-torproject-alpha
+elif test "$MOZ_UPDATE_CHANNEL" = "nightly"; then
+ ACCEPTED_MAR_CHANNEL_IDS=torbrowser-torproject-nightly
+ MAR_CHANNEL_ID=torbrowser-torproject-nightly
+else
+ ACCEPTED_MAR_CHANNEL_IDS=torbrowser-torproject-release
+ MAR_CHANNEL_ID=torbrowser-torproject-release
+fi
+
MOZ_PROFILE_MIGRATOR=1
# Include the DevTools client, not just the server (which is the default)
diff --git a/browser/installer/package-manifest.in b/browser/installer/package-manifest.in
index 3722bf2ee22b..792acb870afa 100644
--- a/browser/installer/package-manifest.in
+++ b/browser/installer/package-manifest.in
@@ -36,8 +36,10 @@
; Mac bundle stuff
@APPNAME@/Contents/Info.plist
#ifdef MOZ_UPDATER
+#ifndef TOR_BROWSER_UPDATE
@APPNAME@/Contents/Library/LaunchServices
#endif
+#endif
@APPNAME@/Contents/PkgInfo
@RESPATH@/firefox.icns
@RESPATH@/document.icns
diff --git a/build/application.ini.in b/build/application.ini.in
index a6141de0be15..96faf3775588 100644
--- a/build/application.ini.in
+++ b/build/application.ini.in
@@ -52,5 +52,5 @@ ServerURL=https://crash-reports.mozilla.com/submit?id=@MOZ_APP_ID@&version=…
#if MOZ_UPDATER
[AppUpdate]
-URL=https://@MOZ_APPUPDATE_HOST@/update/6/%PRODUCT%/%VERSION%/%BUILD_ID%/%BUILD_TARGET%/%LOCALE%/%CHANNEL%/%OS_VERSION%/%SYSTEM_CAPABILITIES%/%DISTRIBUTION%/%DISTRIBUTION_VERSION%/update.xml
+URL=https://aus1.torproject.org/torbrowser/update_3/%CHANNEL%/%BUILD_TARGET%/%VERSION%/%LOCALE%
#endif
diff --git a/build/moz.configure/init.configure b/build/moz.configure/init.configure
index b887153321ab..d02ed4303ec1 100644
--- a/build/moz.configure/init.configure
+++ b/build/moz.configure/init.configure
@@ -1161,7 +1161,6 @@ def version_path(path):
# set RELEASE_OR_BETA and NIGHTLY_BUILD variables depending on the cycle we're in
# The logic works like this:
# - if we have "a1" in GRE_MILESTONE, we're building Nightly (define NIGHTLY_BUILD)
-# - otherwise, if we have "a" in GRE_MILESTONE, we're building Nightly or Aurora
# - otherwise, we're building Release/Beta (define RELEASE_OR_BETA)
@depends(check_build_environment, build_project, version_path, '--help')
@imports(_from='__builtin__', _import='open')
@@ -1208,7 +1207,7 @@ def milestone(build_env, build_project, version_path, _):
if 'a1' in milestone:
is_nightly = True
- elif 'a' not in milestone:
+ else:
is_release_or_beta = True
major_version = milestone.split('.')[0]
diff --git a/config/createprecomplete.py b/config/createprecomplete.py
index fadd796aa21f..73793c8e8b19 100644
--- a/config/createprecomplete.py
+++ b/config/createprecomplete.py
@@ -5,6 +5,7 @@
# update instructions which is used to remove files and directories that are no
# longer present in a complete update. The current working directory is used for
# the location to enumerate and to create the precomplete file.
+# For symlinks, remove instructions are always generated.
from __future__ import absolute_import
from __future__ import unicode_literals
@@ -13,9 +14,17 @@ import os
import io
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove all lines in this file that contain:
+# TorBrowser/Data
+
def get_build_entries(root_path):
""" Iterates through the root_path, creating a list for each file and
directory. Excludes any file paths ending with channel-prefs.js.
+ To support Tor Browser updates, excludes:
+ TorBrowser/Data/Browser/profiles.ini
+ TorBrowser/Data/Browser/profile.default/bookmarks.html
+ TorBrowser/Data/Tor/torrc
"""
rel_file_path_set = set()
rel_dir_path_set = set()
@@ -26,6 +35,9 @@ def get_build_entries(root_path):
rel_path_file = rel_path_file.replace("\\", "/")
if not (rel_path_file.endswith("channel-prefs.js") or
rel_path_file.endswith("update-settings.ini") or
+ rel_path_file == "TorBrowser/Data/Browser/profiles.ini" or
+ rel_path_file == "TorBrowser/Data/Browser/profile.default/bookmarks.html" or
+ rel_path_file == "TorBrowser/Data/Tor/torrc" or
rel_path_file.find("distribution/") != -1):
rel_file_path_set.add(rel_path_file)
@@ -34,7 +46,10 @@ def get_build_entries(root_path):
rel_path_dir = os.path.join(parent_dir_rel_path, dir_name)
rel_path_dir = rel_path_dir.replace("\\", "/")+"/"
if rel_path_dir.find("distribution/") == -1:
- rel_dir_path_set.add(rel_path_dir)
+ if (os.path.islink(rel_path_dir[:-1])):
+ rel_file_path_set.add(rel_path_dir[:-1])
+ else:
+ rel_dir_path_set.add(rel_path_dir)
rel_file_path_list = list(rel_file_path_set)
rel_file_path_list.sort(reverse=True)
diff --git a/devtools/client/aboutdebugging/src/actions/runtimes.js b/devtools/client/aboutdebugging/src/actions/runtimes.js
index b96f93e244b7..4c1e87a0818a 100644
--- a/devtools/client/aboutdebugging/src/actions/runtimes.js
+++ b/devtools/client/aboutdebugging/src/actions/runtimes.js
@@ -70,6 +70,11 @@ async function getRuntimeIcon(runtime, channel) {
}
}
+ // Use the release build skin for devtools within Tor Browser alpha releases.
+ if (channel === "alpha") {
+ return "chrome://devtools/skin/images/aboutdebugging-firefox-release.svg";
+ }
+
return channel === "release" || channel === "beta" || channel === "aurora"
? `chrome://devtools/skin/images/aboutdebugging-firefox-${channel}.svg`
: "chrome://devtools/skin/images/aboutdebugging-firefox-nightly.svg";
diff --git a/toolkit/modules/UpdateUtils.jsm b/toolkit/modules/UpdateUtils.jsm
index d2b695b47442..883928472732 100644
--- a/toolkit/modules/UpdateUtils.jsm
+++ b/toolkit/modules/UpdateUtils.jsm
@@ -103,7 +103,7 @@ var UpdateUtils = {
case "PRODUCT":
return Services.appinfo.name;
case "VERSION":
- return Services.appinfo.version;
+ return AppConstants.TOR_BROWSER_VERSION;
case "BUILD_ID":
return Services.appinfo.appBuildID;
case "BUILD_TARGET":
@@ -167,25 +167,17 @@ var UpdateUtils = {
* downloads and installs updates. This corresponds to whether or not the user
* has selected "Automatically install updates" in about:preferences.
*
- * On Windows, this setting is shared across all profiles for the installation
+ * On Windows (except in Tor Browser), this setting is shared across all profiles
+ * for the installation
* and is read asynchronously from the file. On other operating systems, this
* setting is stored in a pref and is thus a per-profile setting.
*
* @return A Promise that resolves with a boolean.
*/
getAppUpdateAutoEnabled() {
- if (Services.policies) {
- if (!Services.policies.isAllowed("app-auto-updates-off")) {
- // We aren't allowed to turn off auto-update - it is forced on.
- return Promise.resolve(true);
- }
- if (!Services.policies.isAllowed("app-auto-updates-on")) {
- // We aren't allowed to turn on auto-update - it is forced off.
- return Promise.resolve(false);
- }
- }
- if (AppConstants.platform != "win") {
- // On platforms other than Windows the setting is stored in a preference.
+ if (AppConstants.TOR_BROWSER_UPDATE || (AppConstants.platform != "win")) {
+ // On platforms other than Windows and always in Tor Browser the setting
+ // is stored in a preference.
let prefValue = Services.prefs.getBoolPref(
PREF_APP_UPDATE_AUTO,
DEFAULT_APP_UPDATE_AUTO
@@ -256,7 +248,8 @@ var UpdateUtils = {
* updates" and "Check for updates but let you choose to install them" options
* in about:preferences.
*
- * On Windows, this setting is shared across all profiles for the installation
+ * On Windows (except in Tor Browser), this setting is shared across all profiles
+ * for the installation
* and is written asynchronously to the file. On other operating systems, this
* setting is stored in a pref and is thus a per-profile setting.
*
@@ -276,14 +269,9 @@ var UpdateUtils = {
* this operation simply sets a pref.
*/
setAppUpdateAutoEnabled(enabledValue) {
- if (this.appUpdateAutoSettingIsLocked()) {
- return Promise.reject(
- "setAppUpdateAutoEnabled: Unable to change value of setting because " +
- "it is locked by policy"
- );
- }
- if (AppConstants.platform != "win") {
- // Only in Windows do we store the update config in the update directory
+ if (AppConstants.TOR_BROWSER_UPDATE || (AppConstants.platform != "win")) {
+ // Only in Windows (but never for Tor Browser) do we store the update config
+ // in the update directory
let prefValue = !!enabledValue;
Services.prefs.setBoolPref(PREF_APP_UPDATE_AUTO, prefValue);
// Rather than call maybeUpdateAutoConfigChanged, a pref observer has
diff --git a/toolkit/mozapps/extensions/AddonManager.jsm b/toolkit/mozapps/extensions/AddonManager.jsm
index 0dca5d712523..4e5ca4b10308 100644
--- a/toolkit/mozapps/extensions/AddonManager.jsm
+++ b/toolkit/mozapps/extensions/AddonManager.jsm
@@ -23,6 +23,7 @@ const { AppConstants } = ChromeUtils.import(
const MOZ_COMPATIBILITY_NIGHTLY = ![
"aurora",
+ "alpha",
"beta",
"release",
"esr",
@@ -37,6 +38,7 @@ const PREF_EM_AUTOUPDATE_DEFAULT = "extensions.update.autoUpdateDefault";
const PREF_EM_STRICT_COMPATIBILITY = "extensions.strictCompatibility";
const PREF_EM_CHECK_UPDATE_SECURITY = "extensions.checkUpdateSecurity";
const PREF_SYS_ADDON_UPDATE_ENABLED = "extensions.systemAddon.update.enabled";
+const PREF_EM_LAST_TORBROWSER_VERSION = "extensions.lastTorBrowserVersion";
const PREF_MIN_WEBEXT_PLATFORM_VERSION =
"extensions.webExtensionsMinPlatformVersion";
@@ -682,6 +684,28 @@ var AddonManagerInternal = {
);
}
+ // To ensure that extension and plugin code gets a chance to run
+ // after each browser update, set appChanged = true when the
+ // Tor Browser version has changed even if the Mozilla app
+ // version has not changed.
+ let tbChanged = undefined;
+ try {
+ tbChanged = AppConstants.TOR_BROWSER_VERSION !=
+ Services.prefs.getCharPref(PREF_EM_LAST_TORBROWSER_VERSION);
+ }
+ catch (e) { }
+ if (tbChanged !== false) {
+ // Because PREF_EM_LAST_TORBROWSER_VERSION was not present in older
+ // versions of Tor Browser, an app change is indicated when tbChanged
+ // is undefined or true.
+ if (appChanged === false) {
+ appChanged = true;
+ }
+
+ Services.prefs.setCharPref(PREF_EM_LAST_TORBROWSER_VERSION,
+ AppConstants.TOR_BROWSER_VERSION);
+ }
+
if (!MOZ_COMPATIBILITY_NIGHTLY) {
PREF_EM_CHECK_COMPATIBILITY =
PREF_EM_CHECK_COMPATIBILITY_BASE +
diff --git a/toolkit/mozapps/extensions/test/browser/head.js b/toolkit/mozapps/extensions/test/browser/head.js
index fddea608fcad..745fdaca6735 100644
--- a/toolkit/mozapps/extensions/test/browser/head.js
+++ b/toolkit/mozapps/extensions/test/browser/head.js
@@ -43,6 +43,7 @@ var PREF_CHECK_COMPATIBILITY;
var channel = Services.prefs.getCharPref("app.update.channel", "default");
if (
channel != "aurora" &&
+ channel != "alpha" &&
channel != "beta" &&
channel != "release" &&
channel != "esr"
diff --git a/toolkit/mozapps/extensions/test/xpcshell/head_addons.js b/toolkit/mozapps/extensions/test/xpcshell/head_addons.js
index ee5d06f16d49..adb43b70c301 100644
--- a/toolkit/mozapps/extensions/test/xpcshell/head_addons.js
+++ b/toolkit/mozapps/extensions/test/xpcshell/head_addons.js
@@ -379,6 +379,7 @@ function isNightlyChannel() {
return (
channel != "aurora" &&
+ channel != "alpha" &&
channel != "beta" &&
channel != "release" &&
channel != "esr"
diff --git a/toolkit/mozapps/update/UpdateService.jsm b/toolkit/mozapps/update/UpdateService.jsm
index ead961ab5252..2c565cecadd7 100644
--- a/toolkit/mozapps/update/UpdateService.jsm
+++ b/toolkit/mozapps/update/UpdateService.jsm
@@ -32,11 +32,15 @@ XPCOMUtils.defineLazyGlobalGetters(this, ["DOMParser", "XMLHttpRequest"]);
XPCOMUtils.defineLazyModuleGetters(this, {
AsyncShutdown: "resource://gre/modules/AsyncShutdown.jsm",
CertUtils: "resource://gre/modules/CertUtils.jsm",
+#ifdef XP_WIN
ctypes: "resource://gre/modules/ctypes.jsm",
+#endif
DeferredTask: "resource://gre/modules/DeferredTask.jsm",
OS: "resource://gre/modules/osfile.jsm",
UpdateUtils: "resource://gre/modules/UpdateUtils.jsm",
+#if !defined(TOR_BROWSER_UPDATE)
WindowsRegistry: "resource://gre/modules/WindowsRegistry.jsm",
+#endif
});
const UPDATESERVICE_CID = Components.ID(
@@ -296,6 +300,7 @@ function testWriteAccess(updateTestFile, createDirectory) {
updateTestFile.remove(false);
}
+#ifdef XP_WIN
/**
* Windows only function that closes a Win32 handle.
*
@@ -388,6 +393,7 @@ function getPerInstallationMutexName(aGlobal = true) {
(aGlobal ? "Global\\" : "") + "MozillaUpdateMutex-" + hasher.finish(true)
);
}
+#endif
/**
* Whether or not the current instance has the update mutex. The update mutex
@@ -398,6 +404,7 @@ function getPerInstallationMutexName(aGlobal = true) {
* @return true if this instance holds the update mutex
*/
function hasUpdateMutex() {
+#ifdef XP_WIN
if (AppConstants.platform != "win") {
return true;
}
@@ -405,6 +412,9 @@ function hasUpdateMutex() {
gUpdateMutexHandle = createMutex(getPerInstallationMutexName(true), false);
}
return !!gUpdateMutexHandle;
+#else
+ return true;
+#endif
}
/**
@@ -435,6 +445,11 @@ function areDirectoryEntriesWriteable(aDir) {
* @return true if elevation is required, false otherwise
*/
function getElevationRequired() {
+#if defined(TOR_BROWSER_UPDATE)
+ // To avoid potential security holes associated with running the updater
+ // process with elevated privileges, Tor Browser does not support elevation.
+ return false;
+#else
if (AppConstants.platform != "macosx") {
return false;
}
@@ -469,6 +484,7 @@ function getElevationRequired() {
"not required"
);
return false;
+#endif
}
/**
@@ -501,6 +517,7 @@ function getCanApplyUpdates() {
return false;
}
+#if !defined(TOR_BROWSER_UPDATE)
if (AppConstants.platform == "macosx") {
LOG(
"getCanApplyUpdates - bypass the write since elevation can be used " +
@@ -516,6 +533,7 @@ function getCanApplyUpdates() {
);
return true;
}
+#endif
try {
if (AppConstants.platform == "win") {
@@ -1203,6 +1221,9 @@ function handleUpdateFailure(update, errorCode) {
cancelations++;
Services.prefs.setIntPref(PREF_APP_UPDATE_CANCELATIONS, cancelations);
if (AppConstants.platform == "macosx") {
+#if defined(TOR_BROWSER_UPDATE)
+ cleanupActiveUpdate();
+#else
let osxCancelations = Services.prefs.getIntPref(
PREF_APP_UPDATE_CANCELATIONS_OSX,
0
@@ -1226,6 +1247,7 @@ function handleUpdateFailure(update, errorCode) {
(update.state = STATE_PENDING_ELEVATE)
);
}
+#endif
update.statusText = gUpdateBundle.GetStringFromName("elevationFailure");
} else {
writeStatusFile(getUpdatesDir(), (update.state = STATE_PENDING));
@@ -1752,7 +1774,26 @@ function Update(update) {
this._patches.push(patch);
}
- if (!this._patches.length && !update.hasAttribute("unsupported")) {
+ if (update.hasAttribute("unsupported")) {
+ this.unsupported = ("true" == update.getAttribute("unsupported"));
+ } else if (update.hasAttribute("minSupportedOSVersion")) {
+ let minOSVersion = update.getAttribute("minSupportedOSVersion");
+ try {
+ let osVersion = Services.sysinfo.getProperty("version");
+ this.unsupported = (Services.vc.compare(osVersion, minOSVersion) < 0);
+ } catch (e) {}
+ }
+ if (!this.unsupported && update.hasAttribute("minSupportedInstructionSet")) {
+ let minInstructionSet = update.getAttribute("minSupportedInstructionSet");
+ if (['MMX', 'SSE', 'SSE2', 'SSE3',
+ 'SSE4A', 'SSE4_1', 'SSE4_2'].indexOf(minInstructionSet) >= 0) {
+ try {
+ this.unsupported = !Services.sysinfo.getProperty("has" + minInstructionSet);
+ } catch (e) {}
+ }
+ }
+
+ if (!this._patches.length && !this.unsupported) {
throw Components.Exception("", Cr.NS_ERROR_ILLEGAL_VALUE);
}
@@ -1790,9 +1831,7 @@ function Update(update) {
if (!isNaN(attr.value)) {
this.promptWaitTime = parseInt(attr.value);
}
- } else if (attr.name == "unsupported") {
- this.unsupported = attr.value == "true";
- } else {
+ } else if (attr.name != "unsupported") {
switch (attr.name) {
case "appVersion":
case "buildID":
@@ -1817,7 +1856,11 @@ function Update(update) {
}
if (!this.previousAppVersion) {
+#ifdef TOR_BROWSER_UPDATE
+ this.previousAppVersion = AppConstants.TOR_BROWSER_VERSION;
+#else
this.previousAppVersion = Services.appinfo.version;
+#endif
}
if (!this.elevationFailure) {
@@ -2200,6 +2243,7 @@ UpdateService.prototype = {
Services.obs.removeObserver(this, topic);
Services.prefs.removeObserver(PREF_APP_UPDATE_LOG, this);
+#ifdef XP_WIN
if (AppConstants.platform == "win" && gUpdateMutexHandle) {
// If we hold the update mutex, let it go!
// The OS would clean this up sometime after shutdown,
@@ -2207,6 +2251,7 @@ UpdateService.prototype = {
closeHandle(gUpdateMutexHandle);
gUpdateMutexHandle = null;
}
+#endif
if (this._retryTimer) {
this._retryTimer.cancel();
}
@@ -2240,6 +2285,7 @@ UpdateService.prototype = {
}
break;
case "test-close-handle-update-mutex":
+#ifdef XP_WIN
if (Cu.isInAutomation) {
if (AppConstants.platform == "win" && gUpdateMutexHandle) {
LOG("UpdateService:observe - closing mutex handle for testing");
@@ -2247,6 +2293,7 @@ UpdateService.prototype = {
gUpdateMutexHandle = null;
}
}
+#endif
break;
}
},
@@ -2277,6 +2324,9 @@ UpdateService.prototype = {
return;
}
gUpdateFileWriteInfo = { phase: "startup", failure: false };
+#if defined(TOR_BROWSER_UPDATE) && !defined(XP_MACOSX)
+ this._removeOrphanedTorBrowserFiles();
+#endif
if (!this.canCheckForUpdates) {
LOG(
"UpdateService:_postUpdateProcessing - unable to check for " +
@@ -2513,6 +2563,42 @@ UpdateService.prototype = {
}
},
+#if defined(TOR_BROWSER_UPDATE) && !defined(XP_MACOSX)
+ /**
+ * When updating from an earlier version to Tor Browser 6.0 or later, old
+ * update info files are left behind on Linux and Windows. Remove them.
+ */
+ _removeOrphanedTorBrowserFiles: function AUS__removeOrphanedTorBrowserFiles() {
+ try {
+ let oldUpdateInfoDir = getAppBaseDir(); // aka the Browser directory.
+
+#ifdef XP_WIN
+ // On Windows, the updater files were stored under
+ // Browser/TorBrowser/Data/Browser/Caches/firefox/
+ oldUpdateInfoDir.appendRelativePath(
+ "TorBrowser\\Data\\Browser\\Caches\\firefox");
+#endif
+
+ // Remove the updates directory.
+ let updatesDir = oldUpdateInfoDir.clone();
+ updatesDir.append("updates");
+ if (updatesDir.exists() && updatesDir.isDirectory()) {
+ updatesDir.remove(true);
+ }
+
+ // Remove files: active-update.xml and updates.xml
+ let filesToRemove = [ "active-update.xml", "updates.xml" ];
+ filesToRemove.forEach(function(aFileName) {
+ let f = oldUpdateInfoDir.clone();
+ f.append(aFileName);
+ if (f.exists()) {
+ f.remove(false);
+ }
+ });
+ } catch (e) {}
+ },
+#endif
+
/**
* Register an observer when the network comes online, so we can short-circuit
* the app.update.interval when there isn't connectivity
@@ -2873,9 +2959,14 @@ UpdateService.prototype = {
updates.forEach(function(aUpdate) {
// Ignore updates for older versions of the application and updates for
// the same version of the application with the same build ID.
- if (
- vc.compare(aUpdate.appVersion, Services.appinfo.version) < 0 ||
- (vc.compare(aUpdate.appVersion, Services.appinfo.version) == 0 &&
+#ifdef TOR_BROWSER_UPDATE
+ let compatVersion = AppConstants.TOR_BROWSER_VERSION;
+#else
+ let compatVersion = Services.appinfo.version;
+#endif
+ let rc = vc.compare(aUpdate.appVersion, compatVersion);
+ if (rc < 0 ||
+ (rc == 0 &&
aUpdate.buildID == Services.appinfo.appBuildID)
) {
LOG(
@@ -3228,20 +3319,32 @@ UpdateService.prototype = {
// current application's version or the update's version is the same as the
// application's version and the build ID is the same as the application's
// build ID.
+#ifdef TOR_BROWSER_UPDATE
+ let compatVersion = AppConstants.TOR_BROWSER_VERSION;
+#else
+ let compatVersion = Services.appinfo.version;
+#endif
if (
update.appVersion &&
- (Services.vc.compare(update.appVersion, Services.appinfo.version) < 0 ||
+ (Services.vc.compare(update.appVersion, compatVersion) < 0 ||
(update.buildID &&
update.buildID == Services.appinfo.appBuildID &&
- update.appVersion == Services.appinfo.version))
+ update.appVersion == compatVersion))
) {
LOG(
"UpdateService:downloadUpdate - canceling download of update since " +
"it is for an earlier or same application version and build ID.\n" +
+#ifdef TOR_BROWSER_UPDATE
+ "current Tor Browser version: " +
+ compatVersion +
+ "\n" +
+ "update Tor Browser version : " +
+#else
"current application version: " +
- Services.appinfo.version +
+ compatVersion +
"\n" +
"update application version : " +
+#endif
update.appVersion +
"\n" +
"current build ID: " +
@@ -3819,6 +3922,7 @@ Checker.prototype = {
*/
_callback: null,
+#if !defined(TOR_BROWSER_UPDATE)
_getCanMigrate: function UC__getCanMigrate() {
if (AppConstants.platform != "win") {
return false;
@@ -3888,6 +3992,7 @@ Checker.prototype = {
LOG("Checker:_getCanMigrate - no registry entries for this installation");
return false;
},
+#endif // !defined(TOR_BROWSER_UPDATE)
/**
* The URL of the update service XML file to connect to that contains details
@@ -3916,9 +4021,11 @@ Checker.prototype = {
url += (url.includes("?") ? "&" : "?") + "force=1";
}
+#if !defined(TOR_BROWSER_UPDATE)
if (this._getCanMigrate()) {
url += (url.includes("?") ? "&" : "?") + "mig64=1";
}
+#endif
LOG("Checker:getUpdateURL - update URL: " + url);
return url;
diff --git a/toolkit/mozapps/update/UpdateServiceStub.jsm b/toolkit/mozapps/update/UpdateServiceStub.jsm
index 9524a8f61bfa..d44d0f9d7ad1 100644
--- a/toolkit/mozapps/update/UpdateServiceStub.jsm
+++ b/toolkit/mozapps/update/UpdateServiceStub.jsm
@@ -78,8 +78,12 @@ function UpdateServiceStub() {
// contains the status file's path
// We may need to migrate update data
+ // In Tor Browser we skip this because we do not use an update agent and we
+ // do not want to store any data outside of the browser installation directory.
+ // For more info, see https://bugzilla.mozilla.org/show_bug.cgi?id=1458314
if (
AppConstants.platform == "win" &&
+ !AppConstants.TOR_BROWSER_UPDATE &&
!Services.prefs.getBoolPref(prefUpdateDirMigrated, false)
) {
migrateUpdateDirectory();
diff --git a/toolkit/mozapps/update/common/updatehelper.cpp b/toolkit/mozapps/update/common/updatehelper.cpp
index b094d9eb75e9..b9d45c70c3d3 100644
--- a/toolkit/mozapps/update/common/updatehelper.cpp
+++ b/toolkit/mozapps/update/common/updatehelper.cpp
@@ -66,6 +66,13 @@ BOOL PathGetSiblingFilePath(LPWSTR destinationBuffer, LPCWSTR siblingFilePath,
* @return TRUE if successful
*/
BOOL GetSecureOutputDirectoryPath(LPWSTR outBuf) {
+# ifdef TOR_BROWSER_UPDATE
+ // This function is used to support the maintenance service and elevated
+ // updates and is therefore not called by Tor Browser's updater. We stub
+ // it out to avoid any chance that the Tor Browser updater will create
+ // files under C:\Program Files (x86)\ or a similar location.
+ return FALSE;
+# else
PWSTR progFilesX86;
if (FAILED(SHGetKnownFolderPath(FOLDERID_ProgramFilesX86, KF_FLAG_CREATE,
nullptr, &progFilesX86))) {
@@ -99,6 +106,7 @@ BOOL GetSecureOutputDirectoryPath(LPWSTR outBuf) {
}
return TRUE;
+# endif
}
/**
diff --git a/toolkit/mozapps/update/moz.build b/toolkit/mozapps/update/moz.build
index ddfda4571c31..d0c93895c1ec 100644
--- a/toolkit/mozapps/update/moz.build
+++ b/toolkit/mozapps/update/moz.build
@@ -22,11 +22,14 @@ EXTRA_COMPONENTS += [
EXTRA_JS_MODULES += [
'UpdateListener.jsm',
- 'UpdateService.jsm',
'UpdateServiceStub.jsm',
'UpdateTelemetry.jsm',
]
+EXTRA_PP_JS_MODULES += [
+ 'UpdateService.jsm',
+]
+
XPCOM_MANIFESTS += [
'components.conf',
]
diff --git a/toolkit/mozapps/update/updater/launchchild_osx.mm b/toolkit/mozapps/update/updater/launchchild_osx.mm
index 5544c8a9878b..a86c9ca23905 100644
--- a/toolkit/mozapps/update/updater/launchchild_osx.mm
+++ b/toolkit/mozapps/update/updater/launchchild_osx.mm
@@ -372,6 +372,7 @@ bool ObtainUpdaterArguments(int* argc, char*** argv) {
@end
+#ifndef TOR_BROWSER_UPDATE
bool ServeElevatedUpdate(int argc, const char** argv) {
MacAutoreleasePool pool;
@@ -387,6 +388,7 @@ bool ServeElevatedUpdate(int argc, const char** argv) {
[updater release];
return didSucceed;
}
+#endif
bool IsOwnedByGroupAdmin(const char* aAppBundle) {
MacAutoreleasePool pool;
diff --git a/toolkit/mozapps/update/updater/moz.build b/toolkit/mozapps/update/updater/moz.build
index a0eff9a3b7cd..ecc634c87037 100644
--- a/toolkit/mozapps/update/updater/moz.build
+++ b/toolkit/mozapps/update/updater/moz.build
@@ -49,7 +49,7 @@ xpcshell_cert.script = 'gen_cert_header.py:create_header'
dep1_cert.script = 'gen_cert_header.py:create_header'
dep2_cert.script = 'gen_cert_header.py:create_header'
-if CONFIG['MOZ_UPDATE_CHANNEL'] in ('beta', 'release', 'esr'):
+if CONFIG['MOZ_UPDATE_CHANNEL'] in ('alpha', 'beta', 'release', 'esr'):
primary_cert.inputs += ['release_primary.der']
secondary_cert.inputs += ['release_secondary.der']
elif CONFIG['MOZ_UPDATE_CHANNEL'] in ('nightly', 'aurora', 'nightly-elm',
diff --git a/toolkit/mozapps/update/updater/updater.cpp b/toolkit/mozapps/update/updater/updater.cpp
index 40b806b067e1..9a95c3b17761 100644
--- a/toolkit/mozapps/update/updater/updater.cpp
+++ b/toolkit/mozapps/update/updater/updater.cpp
@@ -16,7 +16,7 @@
* updatev3.manifest
* -----------------
* method = "add" | "add-if" | "add-if-not" | "patch" | "patch-if" |
- * "remove" | "rmdir" | "rmrfdir" | type
+ * "remove" | "rmdir" | "rmrfdir" | "addsymlink" | type
*
* 'add-if-not' adds a file if it doesn't exist.
*
@@ -78,7 +78,9 @@ bool IsRecursivelyWritable(const char* aPath);
void LaunchChild(int argc, const char** argv);
void LaunchMacPostProcess(const char* aAppBundle);
bool ObtainUpdaterArguments(int* argc, char*** argv);
+# ifndef TOR_BROWSER_UPDATE
bool ServeElevatedUpdate(int argc, const char** argv);
+# endif
void SetGroupOwnershipAndPermissions(const char* aAppBundle);
struct UpdateServerThreadArgs {
int argc;
@@ -475,9 +477,12 @@ static const NS_tchar* get_relative_path(const NS_tchar* fullpath) {
* The line from the manifest that contains the path.
* @param isdir
* Whether the path is a directory path. Defaults to false.
+ * @param islinktarget
+ * Whether the path is a symbolic link target. Defaults to false.
* @return valid filesystem path or nullptr if the path checks fail.
*/
-static NS_tchar* get_valid_path(NS_tchar** line, bool isdir = false) {
+static NS_tchar* get_valid_path(NS_tchar** line, bool isdir = false,
+ bool islinktarget = false) {
NS_tchar* path = mstrtok(kQuote, line);
if (!path) {
LOG(("get_valid_path: unable to determine path: " LOG_S, *line));
@@ -513,10 +518,12 @@ static NS_tchar* get_valid_path(NS_tchar** line, bool isdir = false) {
path[NS_tstrlen(path) - 1] = NS_T('\0');
}
- // Don't allow relative paths that resolve to a parent directory.
- if (NS_tstrstr(path, NS_T("..")) != nullptr) {
- LOG(("get_valid_path: paths must not contain '..': " LOG_S, path));
- return nullptr;
+ if (!islinktarget) {
+ // Don't allow relative paths that resolve to a parent directory.
+ if (NS_tstrstr(path, NS_T("..")) != nullptr) {
+ LOG(("get_valid_path: paths must not contain '..': " LOG_S, path));
+ return nullptr;
+ }
}
return path;
@@ -556,7 +563,7 @@ static void ensure_write_permissions(const NS_tchar* path) {
(void)_wchmod(path, _S_IREAD | _S_IWRITE);
#else
struct stat fs;
- if (!stat(path, &fs) && !(fs.st_mode & S_IWUSR)) {
+ if (!lstat(path, &fs) && !S_ISLNK(fs.st_mode) && !(fs.st_mode & S_IWUSR)) {
(void)chmod(path, fs.st_mode | S_IWUSR);
}
#endif
@@ -743,11 +750,9 @@ static int ensure_copy(const NS_tchar* path, const NS_tchar* dest) {
return READ_ERROR;
}
-# ifdef XP_UNIX
if (S_ISLNK(ss.st_mode)) {
return ensure_copy_symlink(path, dest);
}
-# endif
AutoFile infile(ensure_open(path, NS_T("rb"), ss.st_mode));
if (!infile) {
@@ -834,12 +839,19 @@ static int ensure_copy_recursive(const NS_tchar* path, const NS_tchar* dest,
return READ_ERROR;
}
-#ifdef XP_UNIX
+#ifndef XP_WIN
if (S_ISLNK(sInfo.st_mode)) {
return ensure_copy_symlink(path, dest);
}
#endif
+#ifdef XP_UNIX
+ // Ignore Unix domain sockets. See #20691.
+ if (S_ISSOCK(sInfo.st_mode)) {
+ return 0;
+ }
+#endif
+
if (!S_ISDIR(sInfo.st_mode)) {
return ensure_copy(path, dest);
}
@@ -896,7 +908,7 @@ static int rename_file(const NS_tchar* spath, const NS_tchar* dpath,
}
struct NS_tstat_t spathInfo;
- rv = NS_tstat(spath, &spathInfo);
+ rv = NS_tlstat(spath, &spathInfo); // Get info about file or symlink.
if (rv) {
LOG(("rename_file: failed to read file status info: " LOG_S ", "
"err: %d",
@@ -904,7 +916,12 @@ static int rename_file(const NS_tchar* spath, const NS_tchar* dpath,
return READ_ERROR;
}
- if (!S_ISREG(spathInfo.st_mode)) {
+#ifdef XP_WIN
+ if (!S_ISREG(spathInfo.st_mode))
+#else
+ if (!S_ISREG(spathInfo.st_mode) && !S_ISLNK(spathInfo.st_mode))
+#endif
+ {
if (allowDirs && !S_ISDIR(spathInfo.st_mode)) {
LOG(("rename_file: path present, but not a file: " LOG_S ", err: %d",
spath, errno));
@@ -913,7 +930,12 @@ static int rename_file(const NS_tchar* spath, const NS_tchar* dpath,
LOG(("rename_file: proceeding to rename the directory"));
}
- if (!NS_taccess(dpath, F_OK)) {
+#ifdef XP_WIN
+ if (!NS_taccess(dpath, F_OK))
+#else
+ if (!S_ISLNK(spathInfo.st_mode) && !NS_taccess(dpath, F_OK))
+#endif
+ {
if (ensure_remove(dpath)) {
LOG(
("rename_file: destination file exists and could not be "
@@ -933,7 +955,7 @@ static int rename_file(const NS_tchar* spath, const NS_tchar* dpath,
return OK;
}
-#ifdef XP_WIN
+#if defined(XP_WIN) && !defined(TOR_BROWSER_UPDATE)
// Remove the directory pointed to by path and all of its files and
// sub-directories. If a file is in use move it to the tobedeleted directory
// and attempt to schedule removal of the file on reboot
@@ -1032,7 +1054,19 @@ static int backup_restore(const NS_tchar* path, const NS_tchar* relPath) {
NS_tsnprintf(relBackup, sizeof(relBackup) / sizeof(relBackup[0]),
NS_T("%s") BACKUP_EXT, relPath);
- if (NS_taccess(backup, F_OK)) {
+ bool isLink = false;
+#ifndef XP_WIN
+ struct stat linkInfo;
+ int rv = lstat(backup, &linkInfo);
+ if (rv) {
+ LOG(("backup_restore: cannot get info for backup file: " LOG_S ", err: %d",
+ relBackup, errno));
+ return OK;
+ }
+ isLink = S_ISLNK(linkInfo.st_mode);
+#endif
+
+ if (!isLink && NS_taccess(backup, F_OK)) {
LOG(("backup_restore: backup file doesn't exist: " LOG_S, relBackup));
return OK;
}
@@ -1050,8 +1084,18 @@ static int backup_discard(const NS_tchar* path, const NS_tchar* relPath) {
NS_tsnprintf(relBackup, sizeof(relBackup) / sizeof(relBackup[0]),
NS_T("%s") BACKUP_EXT, relPath);
+ bool isLink = false;
+#ifndef XP_WIN
+ struct stat linkInfo;
+ int rv2 = lstat(backup, &linkInfo);
+ if (rv2) {
+ return OK; // File does not exist; nothing to do.
+ }
+ isLink = S_ISLNK(linkInfo.st_mode);
+#endif
+
// Nothing to discard
- if (NS_taccess(backup, F_OK)) {
+ if (!isLink && NS_taccess(backup, F_OK)) {
return OK;
}
@@ -1066,6 +1110,8 @@ static int backup_discard(const NS_tchar* path, const NS_tchar* relPath) {
relBackup, relPath));
return WRITE_ERROR_DELETE_BACKUP;
}
+
+# if !defined(TOR_BROWSER_UPDATE)
// The MoveFileEx call to remove the file on OS reboot will fail if the
// process doesn't have write access to the HKEY_LOCAL_MACHINE registry key
// but this is ok since the installer / uninstaller will delete the
@@ -1082,6 +1128,7 @@ static int backup_discard(const NS_tchar* path, const NS_tchar* relPath) {
"file: " LOG_S,
relPath));
}
+# endif
}
#else
if (rv) {
@@ -1136,7 +1183,7 @@ class Action {
class RemoveFile : public Action {
public:
- RemoveFile() : mSkip(0) {}
+ RemoveFile() : mSkip(0), mIsLink(0) {}
int Parse(NS_tchar* line) override;
int Prepare() override;
@@ -1147,6 +1194,7 @@ class RemoveFile : public Action {
mozilla::UniquePtr<NS_tchar[]> mFile;
mozilla::UniquePtr<NS_tchar[]> mRelPath;
int mSkip;
+ int mIsLink;
};
int RemoveFile::Parse(NS_tchar* line) {
@@ -1169,28 +1217,39 @@ int RemoveFile::Parse(NS_tchar* line) {
}
int RemoveFile::Prepare() {
- // Skip the file if it already doesn't exist.
- int rv = NS_taccess(mFile.get(), F_OK);
- if (rv) {
- mSkip = 1;
- mProgressCost = 0;
- return OK;
+ int rv;
+#ifndef XP_WIN
+ struct stat linkInfo;
+ rv = lstat(mFile.get(), &linkInfo);
+ mIsLink = ((0 == rv) && S_ISLNK(linkInfo.st_mode));
+#endif
+
+ if (!mIsLink) {
+ // Skip the file if it already doesn't exist.
+ rv = NS_taccess(mFile.get(), F_OK);
+ if (rv) {
+ mSkip = 1;
+ mProgressCost = 0;
+ return OK;
+ }
}
LOG(("PREPARE REMOVEFILE " LOG_S, mRelPath.get()));
- // Make sure that we're actually a file...
- struct NS_tstat_t fileInfo;
- rv = NS_tstat(mFile.get(), &fileInfo);
- if (rv) {
- LOG(("failed to read file status info: " LOG_S ", err: %d", mFile.get(),
- errno));
- return READ_ERROR;
- }
+ if (!mIsLink) {
+ // Make sure that we're actually a file...
+ struct NS_tstat_t fileInfo;
+ rv = NS_tstat(mFile.get(), &fileInfo);
+ if (rv) {
+ LOG(("failed to read file status info: " LOG_S ", err: %d", mFile.get(),
+ errno));
+ return READ_ERROR;
+ }
- if (!S_ISREG(fileInfo.st_mode)) {
- LOG(("path present, but not a file: " LOG_S, mFile.get()));
- return DELETE_ERROR_EXPECTED_FILE;
+ if (!S_ISREG(fileInfo.st_mode)) {
+ LOG(("path present, but not a file: " LOG_S, mFile.get()));
+ return DELETE_ERROR_EXPECTED_FILE;
+ }
}
NS_tchar* slash = (NS_tchar*)NS_tstrrchr(mFile.get(), NS_T('/'));
@@ -1219,7 +1278,13 @@ int RemoveFile::Execute() {
// The file is checked for existence here and in Prepare since it might have
// been removed by a separate instruction: bug 311099.
- int rv = NS_taccess(mFile.get(), F_OK);
+ int rv = 0;
+ if (mIsLink) {
+ struct NS_tstat_t linkInfo;
+ rv = NS_tlstat(mFile.get(), &linkInfo);
+ } else {
+ rv = NS_taccess(mFile.get(), F_OK);
+ }
if (rv) {
LOG(("file cannot be removed because it does not exist; skipping"));
mSkip = 1;
@@ -1942,6 +2007,92 @@ void PatchIfFile::Finish(int status) {
PatchFile::Finish(status);
}
+#ifndef XP_WIN
+class AddSymlink : public Action {
+ public:
+ AddSymlink() : mAdded(false) {}
+
+ virtual int Parse(NS_tchar* line);
+ virtual int Prepare();
+ virtual int Execute();
+ virtual void Finish(int status);
+
+ private:
+ mozilla::UniquePtr<NS_tchar[]> mLinkPath;
+ mozilla::UniquePtr<NS_tchar[]> mRelPath;
+ mozilla::UniquePtr<NS_tchar[]> mTarget;
+ bool mAdded;
+};
+
+int AddSymlink::Parse(NS_tchar* line) {
+ // format "<linkname>" "target"
+
+ NS_tchar* validPath = get_valid_path(&line);
+ if (!validPath) return PARSE_ERROR;
+
+ mRelPath = mozilla::MakeUnique<NS_tchar[]>(MAXPATHLEN);
+ NS_tstrcpy(mRelPath.get(), validPath);
+ mLinkPath.reset(get_full_path(validPath));
+ if (!mLinkPath) {
+ return PARSE_ERROR;
+ }
+
+ // consume whitespace between args
+ NS_tchar* q = mstrtok(kQuote, &line);
+ if (!q) return PARSE_ERROR;
+
+ validPath = get_valid_path(&line, false, true);
+ if (!validPath) return PARSE_ERROR;
+
+ mTarget = mozilla::MakeUnique<NS_tchar[]>(MAXPATHLEN);
+ NS_tstrcpy(mTarget.get(), validPath);
+
+ return OK;
+}
+
+int AddSymlink::Prepare() {
+ LOG(("PREPARE ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(),
+ mTarget.get()));
+
+ return OK;
+}
+
+int AddSymlink::Execute() {
+ LOG(("EXECUTE ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(),
+ mTarget.get()));
+
+ // First make sure that we can actually get rid of any existing file or link.
+ struct stat linkInfo;
+ int rv = lstat(mLinkPath.get(), &linkInfo);
+ if ((0 == rv) && !S_ISLNK(linkInfo.st_mode)) {
+ rv = NS_taccess(mLinkPath.get(), F_OK);
+ }
+ if (rv == 0) {
+ rv = backup_create(mLinkPath.get());
+ if (rv) return rv;
+ } else {
+ rv = ensure_parent_dir(mLinkPath.get());
+ if (rv) return rv;
+ }
+
+ // Create the link.
+ rv = symlink(mTarget.get(), mLinkPath.get());
+ if (!rv) {
+ mAdded = true;
+ }
+
+ return rv;
+}
+
+void AddSymlink::Finish(int status) {
+ LOG(("FINISH ADDSYMLINK " LOG_S " -> " LOG_S, mRelPath.get(), mTarget.get()));
+ // When there is an update failure and a link has been added it is removed
+ // here since there might not be a backup to replace it.
+ if (status && mAdded) NS_tremove(mLinkPath.get());
+ backup_finish(mLinkPath.get(), mRelPath.get(), status);
+}
+#endif
+
//-----------------------------------------------------------------------------
#ifdef XP_WIN
@@ -2279,14 +2430,29 @@ static bool IsSecureUpdateStatusSucceeded(bool& isSucceeded) {
*/
static int CopyInstallDirToDestDir() {
// These files should not be copied over to the updated app
-#ifdef XP_WIN
-# define SKIPLIST_COUNT 3
-#elif XP_MACOSX
-# define SKIPLIST_COUNT 0
+#if defined(TOR_BROWSER_UPDATE) && !defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+# ifdef XP_WIN
+# define SKIPLIST_COUNT 6
+# else
+# define SKIPLIST_COUNT 5
+# endif
#else
-# define SKIPLIST_COUNT 2
+# ifdef XP_WIN
+# define SKIPLIST_COUNT 3
+# elif XP_MACOSX
+# define SKIPLIST_COUNT 0
+# else
+# define SKIPLIST_COUNT 2
+# endif
#endif
copy_recursive_skiplist<SKIPLIST_COUNT> skiplist;
+#if defined(TOR_BROWSER_UPDATE) && !defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+# ifdef XP_MACOSX
+ skiplist.append(0, gInstallDirPath, NS_T("Updated.app"));
+ skiplist.append(1, gInstallDirPath, NS_T("TorBrowser/UpdateInfo/updates/0"));
+# endif
+#endif
+
#ifndef XP_MACOSX
skiplist.append(0, gInstallDirPath, NS_T("updated"));
skiplist.append(1, gInstallDirPath, NS_T("updates/0"));
@@ -2295,6 +2461,19 @@ static int CopyInstallDirToDestDir() {
# endif
#endif
+#if defined(TOR_BROWSER_UPDATE) && !defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+# ifdef XP_WIN
+ skiplist.append(SKIPLIST_COUNT - 3, gInstallDirPath,
+ NS_T("TorBrowser/Data/Browser/profile.default/parent.lock"));
+# else
+ skiplist.append(SKIPLIST_COUNT - 3, gInstallDirPath,
+ NS_T("TorBrowser/Data/Browser/profile.default/.parentlock"));
+# endif
+
+ skiplist.append(SKIPLIST_COUNT - 1, gInstallDirPath,
+ NS_T("TorBrowser/Data/Tor/lock"));
+#endif
+
return ensure_copy_recursive(gInstallDirPath, gWorkingDirPath, skiplist);
}
@@ -2432,7 +2611,9 @@ static int ProcessReplaceRequest() {
if (NS_taccess(deleteDir, F_OK)) {
NS_tmkdir(deleteDir, 0755);
}
+# if !defined(TOR_BROWSER_UPDATE)
remove_recursive_on_reboot(tmpDir, deleteDir);
+# endif
#endif
}
@@ -2440,8 +2621,45 @@ static int ProcessReplaceRequest() {
// On OS X, we we need to remove the staging directory after its Contents
// directory has been moved.
NS_tchar updatedAppDir[MAXPATHLEN];
+# if defined(TOR_BROWSER_UPDATE) && !defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+ NS_tsnprintf(updatedAppDir, sizeof(updatedAppDir) / sizeof(updatedAppDir[0]),
+ NS_T("%s/Updated.app"), gInstallDirPath);
+ // For Tor Browser on OS X, we also need to copy everything else that is
+ // inside Updated.app.
+ NS_tDIR* dir = NS_topendir(updatedAppDir);
+ if (dir) {
+ NS_tdirent* entry;
+ while ((entry = NS_treaddir(dir)) != 0) {
+ if (NS_tstrcmp(entry->d_name, NS_T(".")) &&
+ NS_tstrcmp(entry->d_name, NS_T(".."))) {
+ NS_tchar childSrcPath[MAXPATHLEN];
+ NS_tsnprintf(childSrcPath,
+ sizeof(childSrcPath) / sizeof(childSrcPath[0]),
+ NS_T("%s/%s"), updatedAppDir, entry->d_name);
+ NS_tchar childDstPath[MAXPATHLEN];
+ NS_tsnprintf(childDstPath,
+ sizeof(childDstPath) / sizeof(childDstPath[0]),
+ NS_T("%s/%s"), gInstallDirPath, entry->d_name);
+ ensure_remove_recursive(childDstPath);
+ rv = rename_file(childSrcPath, childDstPath, true);
+ if (rv) {
+ LOG(("Moving " LOG_S " to " LOG_S " failed, err: %d", childSrcPath,
+ childDstPath, errno));
+ }
+ }
+ }
+
+ NS_tclosedir(dir);
+ } else {
+ LOG(("Updated.app dir can't be found: " LOG_S ", err: %d", updatedAppDir,
+ errno));
+ }
+# else
NS_tsnprintf(updatedAppDir, sizeof(updatedAppDir) / sizeof(updatedAppDir[0]),
NS_T("%s/Updated.app"), gPatchDirPath);
+# endif
+
+ // Remove the Updated.app directory.
ensure_remove_recursive(updatedAppDir);
#endif
@@ -2620,11 +2838,15 @@ static void UpdateThreadFunc(void* param) {
#ifdef XP_MACOSX
static void ServeElevatedUpdateThreadFunc(void* param) {
+# ifdef TOR_BROWSER_UPDATE
+ WriteStatusFile(ELEVATION_CANCELED);
+# else
UpdateServerThreadArgs* threadArgs = (UpdateServerThreadArgs*)param;
gSucceeded = ServeElevatedUpdate(threadArgs->argc, threadArgs->argv);
if (!gSucceeded) {
WriteStatusFile(ELEVATION_CANCELED);
}
+# endif
QuitProgressUI();
}
@@ -2648,7 +2870,7 @@ int LaunchCallbackAndPostProcessApps(int argc, NS_tchar** argv,
#endif
) {
if (argc > callbackIndex) {
-#if defined(XP_WIN)
+#if defined(XP_WIN) && !defined(TOR_BROWSER_UPDATE)
if (gSucceeded) {
if (!LaunchWinPostProcess(gInstallDirPath, gPatchDirPath)) {
fprintf(stderr, "The post update process was not launched");
@@ -2703,8 +2925,12 @@ int NS_main(int argc, NS_tchar** argv) {
UmaskContext umaskContext(0);
bool isElevated =
+# ifdef TOR_BROWSER_UPDATE
+ false;
+# else
strstr(argv[0], "/Library/PrivilegedHelperTools/org.mozilla.updater") !=
0;
+# endif
if (isElevated) {
if (!ObtainUpdaterArguments(&argc, &argv)) {
// Won't actually get here because ObtainUpdaterArguments will terminate
@@ -3348,6 +3574,26 @@ int NS_main(int argc, NS_tchar** argv) {
// using the service is because we are testing.
if (!useService && !noServiceFallback &&
updateLockFileHandle == INVALID_HANDLE_VALUE) {
+# ifdef TOR_BROWSER_UPDATE
+# ifdef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+ // Because the TorBrowser-Data directory that contains the user's
+ // profile is a sibling of the Tor Browser installation directory,
+ // the user probably has permission to apply updates. Therefore, to
+ // avoid potential security issues such as CVE-2015-0833, do not
+ // attempt to elevate privileges. Instead, write a "failed" message
+ // to the update status file (this function will return immediately
+ // after the CloseHandle(elevatedFileHandle) call below).
+# else
+ // Because the user profile is contained within the Tor Browser
+ // installation directory, the user almost certainly has permission to
+ // apply updates. Therefore, to avoid potential security issues such
+ // as CVE-2015-0833, do not attempt to elevate privileges. Instead,
+ // write a "failed" message to the update status file (this function
+ // will return immediately after the CloseHandle(elevatedFileHandle)
+ // call below).
+# endif
+ WriteStatusFile(WRITE_ERROR_ACCESS_DENIED);
+# else
// Get the secure ID before trying to update so it is possible to
// determine if the updater has created a new one.
char uuidStringBefore[UUID_LEN] = {'\0'};
@@ -3393,6 +3639,7 @@ int NS_main(int argc, NS_tchar** argv) {
gCopyOutputFiles = false;
WriteStatusFile(ELEVATION_CANCELED);
}
+# endif
}
// Note: The PostUpdate process is launched by the elevated updater which
@@ -3727,6 +3974,7 @@ int NS_main(int argc, NS_tchar** argv) {
if (!sStagedUpdate && !sReplaceRequest && _wrmdir(gDeleteDirPath)) {
LOG(("NS_main: unable to remove directory: " LOG_S ", err: %d", DELETE_DIR,
errno));
+# if !defined(TOR_BROWSER_UPDATE)
// The directory probably couldn't be removed due to it containing files
// that are in use and will be removed on OS reboot. The call to remove the
// directory on OS reboot is done after the calls to remove the files so the
@@ -3745,6 +3993,7 @@ int NS_main(int argc, NS_tchar** argv) {
"directory: " LOG_S,
DELETE_DIR));
}
+# endif
}
#endif /* XP_WIN */
@@ -4386,7 +4635,13 @@ int DoUpdate() {
action = new AddIfNotFile();
} else if (NS_tstrcmp(token, NS_T("patch-if")) == 0) { // Patch if exists
action = new PatchIfFile();
- } else {
+ }
+#ifndef XP_WIN
+ else if (NS_tstrcmp(token, NS_T("addsymlink")) == 0) {
+ action = new AddSymlink();
+ }
+#endif
+ else {
LOG(("DoUpdate: unknown token: " LOG_S, token));
free(buf);
return PARSE_ERROR;
diff --git a/toolkit/xre/MacLaunchHelper.h b/toolkit/xre/MacLaunchHelper.h
index f8dc75ee4d08..ce816acd83e2 100644
--- a/toolkit/xre/MacLaunchHelper.h
+++ b/toolkit/xre/MacLaunchHelper.h
@@ -17,7 +17,9 @@ extern "C" {
* pid of the terminated process to confirm that it executed successfully.
*/
void LaunchChildMac(int aArgc, char** aArgv, pid_t* aPid = 0);
+#ifndef TOR_BROWSER_UPDATE
bool LaunchElevatedUpdate(int aArgc, char** aArgv, pid_t* aPid = 0);
+#endif
}
#endif
diff --git a/toolkit/xre/MacLaunchHelper.mm b/toolkit/xre/MacLaunchHelper.mm
index ec570ffab124..da2917c2a99e 100644
--- a/toolkit/xre/MacLaunchHelper.mm
+++ b/toolkit/xre/MacLaunchHelper.mm
@@ -40,6 +40,7 @@ void LaunchChildMac(int aArgc, char** aArgv, pid_t* aPid) {
}
}
+#ifndef TOR_BROWSER_UPDATE
BOOL InstallPrivilegedHelper() {
AuthorizationRef authRef = NULL;
OSStatus status = AuthorizationCreate(
@@ -116,3 +117,4 @@ bool LaunchElevatedUpdate(int aArgc, char** aArgv, pid_t* aPid) {
}
return didSucceed;
}
+#endif
diff --git a/toolkit/xre/nsAppRunner.cpp b/toolkit/xre/nsAppRunner.cpp
index 1fd397f4aae8..2be7500d174d 100644
--- a/toolkit/xre/nsAppRunner.cpp
+++ b/toolkit/xre/nsAppRunner.cpp
@@ -2671,6 +2671,11 @@ static bool CheckCompatibility(nsIFile* aProfileDir, const nsCString& aVersion,
gLastAppBuildID.Assign(gAppData->buildID);
nsAutoCString buf;
+
+ nsAutoCString tbVersion(TOR_BROWSER_VERSION_QUOTED);
+ rv = parser.GetString("Compatibility", "LastTorBrowserVersion", buf);
+ if (NS_FAILED(rv) || !tbVersion.Equals(buf)) return false;
+
rv = parser.GetString("Compatibility", "LastOSABI", buf);
if (NS_FAILED(rv) || !aOSABI.Equals(buf)) return false;
@@ -2756,6 +2761,12 @@ static void WriteVersion(nsIFile* aProfileDir, const nsCString& aVersion,
PR_Write(fd, kHeader, sizeof(kHeader) - 1);
PR_Write(fd, aVersion.get(), aVersion.Length());
+ nsAutoCString tbVersion(TOR_BROWSER_VERSION_QUOTED);
+ static const char kTorBrowserVersionHeader[] =
+ NS_LINEBREAK "LastTorBrowserVersion=";
+ PR_Write(fd, kTorBrowserVersionHeader, sizeof(kTorBrowserVersionHeader) - 1);
+ PR_Write(fd, tbVersion.get(), tbVersion.Length());
+
static const char kOSABIHeader[] = NS_LINEBREAK "LastOSABI=";
PR_Write(fd, kOSABIHeader, sizeof(kOSABIHeader) - 1);
PR_Write(fd, aOSABI.get(), aOSABI.Length());
@@ -4203,8 +4214,17 @@ int XREMain::XRE_mainStartup(bool* aExitFlag) {
if (CheckArg("test-process-updates")) {
SaveToEnv("MOZ_TEST_PROCESS_UPDATES=1");
}
+# ifdef TOR_BROWSER_UPDATE
+ nsAutoCString compatVersion(TOR_BROWSER_VERSION_QUOTED);
+# endif
ProcessUpdates(mDirProvider.GetGREDir(), exeDir, updRoot, gRestartArgc,
- gRestartArgv, mAppData->version);
+ gRestartArgv,
+# ifdef TOR_BROWSER_UPDATE
+ compatVersion.get()
+# else
+ mAppData->version
+# endif
+ );
if (EnvHasValue("MOZ_TEST_PROCESS_UPDATES")) {
SaveToEnv("MOZ_TEST_PROCESS_UPDATES=");
*aExitFlag = true;
diff --git a/toolkit/xre/nsUpdateDriver.cpp b/toolkit/xre/nsUpdateDriver.cpp
index 6af227711642..55d1982504ed 100644
--- a/toolkit/xre/nsUpdateDriver.cpp
+++ b/toolkit/xre/nsUpdateDriver.cpp
@@ -159,6 +159,13 @@ static nsresult GetInstallDirPath(nsIFile* appDir, nsACString& installDirPath) {
return NS_OK;
}
+#ifdef DEBUG
+static void dump_argv(const char* aPrefix, char** argv, int argc) {
+ printf("%s - %d args\n", aPrefix, argc);
+ for (int i = 0; i < argc; ++i) printf(" %d: %s\n", i, argv[i]);
+}
+#endif
+
static bool GetFile(nsIFile* dir, const nsACString& name,
nsCOMPtr<nsIFile>& result) {
nsresult rv;
@@ -220,6 +227,34 @@ typedef enum {
eAppliedService,
} UpdateStatus;
+#ifdef DEBUG
+static const char* UpdateStatusToString(UpdateStatus aStatus) {
+ const char* rv = "unknown";
+ switch (aStatus) {
+ case eNoUpdateAction:
+ rv = "NoUpdateAction";
+ break;
+ case ePendingUpdate:
+ rv = "PendingUpdate";
+ break;
+ case ePendingService:
+ rv = "PendingService";
+ break;
+ case ePendingElevate:
+ rv = "PendingElevate";
+ break;
+ case eAppliedUpdate:
+ rv = "AppliedUpdate";
+ break;
+ case eAppliedService:
+ rv = "AppliedService";
+ break;
+ }
+
+ return rv;
+}
+#endif
+
/**
* Returns a value indicating what needs to be done in order to handle an
* update.
@@ -292,9 +327,39 @@ static bool IsOlderVersion(nsIFile* versionFile, const char* appVersion) {
return false;
}
+#ifdef DEBUG
+ printf("IsOlderVersion checking appVersion %s against updateVersion %s\n",
+ appVersion, buf);
+#endif
+
return mozilla::Version(appVersion) > buf;
}
+#ifndef TOR_BROWSER_DATA_OUTSIDE_APP_DIR
+# if defined(TOR_BROWSER_UPDATE) && defined(XP_MACOSX)
+static nsresult GetUpdateDirFromAppDir(nsIFile* aAppDir, nsIFile** aResult) {
+ // On Mac OSX, we stage the update to an Updated.app directory that is
+ // directly below the main Tor Browser.app directory (two levels up from
+ // the appDir).
+ NS_ENSURE_ARG_POINTER(aAppDir);
+ NS_ENSURE_ARG_POINTER(aResult);
+ nsCOMPtr<nsIFile> parentDir1, parentDir2;
+ nsresult rv = aAppDir->GetParent(getter_AddRefs(parentDir1));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = parentDir1->GetParent(getter_AddRefs(parentDir2));
+ NS_ENSURE_SUCCESS(rv, rv);
+
+ nsCOMPtr<nsIFile> updatedDir;
+ if (!GetFile(parentDir2, NS_LITERAL_CSTRING("Updated.app"), updatedDir)) {
+ return NS_ERROR_FAILURE;
+ }
+
+ updatedDir.forget(aResult);
+ return NS_OK;
+}
+# endif
+#endif
+
/**
* Applies, switches, or stages an update.
*
@@ -442,7 +507,12 @@ static void ApplyUpdate(nsIFile* greDir, nsIFile* updateDir, nsIFile* appDir,
} else {
// Get the directory where the update is staged or will be staged.
#if defined(XP_MACOSX)
+# if defined(TOR_BROWSER_UPDATE) && !defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+ rv = GetUpdateDirFromAppDir(appDir, getter_AddRefs(updatedDir));
+ if (NS_FAILED(rv)) {
+# else
if (!GetFile(updateDir, NS_LITERAL_CSTRING("Updated.app"), updatedDir)) {
+# endif
#else
if (!GetFile(appDir, NS_LITERAL_CSTRING("updated"), updatedDir)) {
#endif
@@ -537,6 +607,9 @@ static void ApplyUpdate(nsIFile* greDir, nsIFile* updateDir, nsIFile* appDir,
}
LOG(("spawning updater process [%s]\n", updaterPath.get()));
+#ifdef DEBUG
+ dump_argv("ApplyUpdate updater", argv, argc);
+#endif
#if defined(XP_UNIX) && !defined(XP_MACOSX)
// We use execv to spawn the updater process on all UNIX systems except Mac
@@ -574,6 +647,10 @@ static void ApplyUpdate(nsIFile* greDir, nsIFile* updateDir, nsIFile* appDir,
}
#elif defined(XP_MACOSX)
UpdateDriverSetupMacCommandLine(argc, argv, restart);
+# ifdef DEBUG
+dump_argv("ApplyUpdate after SetupMacCommandLine", argv, argc);
+# endif
+# ifndef TOR_BROWSER_UPDATE
// We need to detect whether elevation is required for this update. This can
// occur when an admin user installs the application, but another admin
// user attempts to update (see bug 394984).
@@ -586,6 +663,7 @@ if (restart && !IsRecursivelyWritable(installDirPath.get())) {
}
exit(0);
}
+# endif
if (isStaged) {
// Launch the updater to replace the installation with the staged updated.
@@ -656,9 +734,27 @@ static bool ProcessHasTerminated(ProcessType pt) {
nsresult ProcessUpdates(nsIFile* greDir, nsIFile* appDir, nsIFile* updRootDir,
int argc, char** argv, const char* appVersion,
bool restart, ProcessType* pid) {
+#if defined(XP_WIN) && defined(TOR_BROWSER_UPDATE)
+ // Try to remove the "tobedeleted" directory which, if present, contains
+ // files that could not be removed during a previous update (e.g., DLLs
+ // that were in use and therefore locked by Windows).
+ nsCOMPtr<nsIFile> deleteDir;
+ nsresult winrv = appDir->Clone(getter_AddRefs(deleteDir));
+ if (NS_SUCCEEDED(winrv)) {
+ winrv = deleteDir->AppendNative(NS_LITERAL_CSTRING("tobedeleted"));
+ if (NS_SUCCEEDED(winrv)) {
+ winrv = deleteDir->Remove(true);
+ }
+ }
+#endif
+
nsresult rv;
nsCOMPtr<nsIFile> updatesDir;
+#ifdef DEBUG
+ printf("ProcessUpdates updateRootDir: %s appVersion: %s\n",
+ updRootDir->HumanReadablePath().get(), appVersion);
+#endif
rv = updRootDir->Clone(getter_AddRefs(updatesDir));
NS_ENSURE_SUCCESS(rv, rv);
rv = updatesDir->AppendNative(NS_LITERAL_CSTRING("updates"));
@@ -678,6 +774,12 @@ nsresult ProcessUpdates(nsIFile* greDir, nsIFile* appDir, nsIFile* updRootDir,
nsCOMPtr<nsIFile> statusFile;
UpdateStatus status = GetUpdateStatus(updatesDir, statusFile);
+#ifdef DEBUG
+ printf("ProcessUpdates status: %s (%d)\n", UpdateStatusToString(status),
+ status);
+ printf("ProcessUpdates updatesDir: %s\n",
+ updatesDir->HumanReadablePath().get());
+#endif
switch (status) {
case ePendingUpdate:
case ePendingService: {
@@ -741,13 +843,16 @@ nsUpdateProcessor::ProcessUpdate() {
NS_ENSURE_SUCCESS(rv, rv);
}
+ nsAutoCString appVersion;
+#ifdef TOR_BROWSER_UPDATE
+ appVersion = TOR_BROWSER_VERSION_QUOTED;
+#else
nsCOMPtr<nsIXULAppInfo> appInfo =
do_GetService("@mozilla.org/xre/app-info;1", &rv);
NS_ENSURE_SUCCESS(rv, rv);
-
- nsAutoCString appVersion;
rv = appInfo->GetVersion(appVersion);
NS_ENSURE_SUCCESS(rv, rv);
+#endif
// Copy the parameters to the StagedUpdateInfo structure shared with the
// watcher thread.
diff --git a/toolkit/xre/nsXREDirProvider.cpp b/toolkit/xre/nsXREDirProvider.cpp
index 09f34911d3cb..e96b940e1172 100644
--- a/toolkit/xre/nsXREDirProvider.cpp
+++ b/toolkit/xre/nsXREDirProvider.cpp
@@ -1240,6 +1240,41 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
}
#endif
nsCOMPtr<nsIFile> updRoot;
+#if defined(TOR_BROWSER_UPDATE)
+ // For Tor Browser, we store update history, etc. within the UpdateInfo
+ // directory under the user data directory.
+ nsresult rv = GetTorBrowserUserDataDir(getter_AddRefs(updRoot));
+ NS_ENSURE_SUCCESS(rv, rv);
+ rv = updRoot->AppendNative(NS_LITERAL_CSTRING("UpdateInfo"));
+ NS_ENSURE_SUCCESS(rv, rv);
+# if defined(XP_MACOSX) && defined(TOR_BROWSER_DATA_OUTSIDE_APP_DIR)
+ // Since the TorBrowser-Data directory may be shared among different
+ // installations of the application, embed the app path in the update dir
+ // so that the update history is partitioned. This is much less likely to
+ // be an issue on Linux or Windows because the Tor Browser packages for
+ // those platforms include a "container" folder that provides partitioning
+ // by default, and we do not support use of a shared, OS-recommended area
+ // for user data on those platforms.
+ nsCOMPtr<nsIFile> appFile;
+ bool per = false;
+ rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
+ NS_ENSURE_SUCCESS(rv, rv);
+ nsCOMPtr<nsIFile> appRootDirFile;
+ nsAutoString appDirPath;
+ if (NS_FAILED(appFile->GetParent(getter_AddRefs(appRootDirFile))) ||
+ NS_FAILED(appRootDirFile->GetPath(appDirPath))) {
+ return NS_ERROR_FAILURE;
+ }
+
+ int32_t dotIndex = appDirPath.RFind(".app");
+ if (dotIndex == kNotFound) {
+ dotIndex = appDirPath.Length();
+ }
+ appDirPath = Substring(appDirPath, 1, dotIndex - 1);
+ rv = updRoot->AppendRelativePath(appDirPath);
+ NS_ENSURE_SUCCESS(rv, rv);
+# endif
+#else // ! TOR_BROWSER_UPDATE
nsCOMPtr<nsIFile> appFile;
bool per = false;
nsresult rv = GetFile(XRE_EXECUTABLE_FILE, &per, getter_AddRefs(appFile));
@@ -1247,7 +1282,7 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
rv = appFile->GetParent(getter_AddRefs(updRoot));
NS_ENSURE_SUCCESS(rv, rv);
-#ifdef XP_MACOSX
+# ifdef XP_MACOSX
nsCOMPtr<nsIFile> appRootDirFile;
nsCOMPtr<nsIFile> localDir;
nsAutoString appDirPath;
@@ -1281,7 +1316,7 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
localDir.forget(aResult);
return NS_OK;
-#elif XP_WIN
+# elif XP_WIN
nsAutoString installPath;
rv = updRoot->GetPath(installPath);
NS_ENSURE_SUCCESS(rv, rv);
@@ -1310,7 +1345,8 @@ nsresult nsXREDirProvider::GetUpdateRootDir(nsIFile** aResult,
nsAutoString updatePathStr;
updatePathStr.Assign(updatePath.get());
updRoot->InitWithPath(updatePathStr);
-#endif // XP_WIN
+# endif // XP_WIN
+#endif // ! TOR_BROWSER_UPDATE
updRoot.forget(aResult);
return NS_OK;
}
diff --git a/tools/update-packaging/common.sh b/tools/update-packaging/common.sh
index 69aef38c5ccc..78a8bdeb634b 100755
--- a/tools/update-packaging/common.sh
+++ b/tools/update-packaging/common.sh
@@ -8,6 +8,10 @@
# Author: Darin Fisher
#
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove all lines in this file that contain:
+# TorBrowser/Data
+
# -----------------------------------------------------------------------------
QUIET=0
@@ -85,22 +89,10 @@ make_add_instruction() {
forced=
fi
- is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/')
- if [ $is_extension = "1" ]; then
- # Use the subdirectory of the extensions folder as the file to test
- # before performing this add instruction.
- testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
- verbose_notice " add-if \"$testdir\" \"$f\""
- echo "add-if \"$testdir\" \"$f\"" >> "$filev2"
- if [ ! $filev3 = "" ]; then
- echo "add-if \"$testdir\" \"$f\"" >> "$filev3"
- fi
- else
- verbose_notice " add \"$f\"$forced"
- echo "add \"$f\"" >> "$filev2"
- if [ ! "$filev3" = "" ]; then
- echo "add \"$f\"" >> "$filev3"
- fi
+ verbose_notice " add \"$f\"$forced"
+ echo "add \"$f\"" >> "$filev2"
+ if [ ! "$filev3" = "" ]; then
+ echo "add \"$f\"" >> "$filev3"
fi
}
@@ -135,24 +127,25 @@ make_add_if_not_instruction() {
echo "add-if-not \"$f\" \"$f\"" >> "$filev3"
}
+make_addsymlink_instruction() {
+ link="$1"
+ target="$2"
+ filev2="$3"
+ filev3="$4"
+
+ verbose_notice " addsymlink: $link -> $target"
+ echo "addsymlink \"$link\" \"$target\"" >> "$filev2"
+ echo "addsymlink \"$link\" \"$target\"" >> "$filev3"
+}
+
make_patch_instruction() {
f="$1"
filev2="$2"
filev3="$3"
- is_extension=$(echo "$f" | grep -c 'distribution/extensions/.*/')
- if [ $is_extension = "1" ]; then
- # Use the subdirectory of the extensions folder as the file to test
- # before performing this add instruction.
- testdir=$(echo "$f" | sed 's/\(.*distribution\/extensions\/[^\/]*\)\/.*/\1/')
- verbose_notice " patch-if \"$testdir\" \"$f.patch\" \"$f\""
- echo "patch-if \"$testdir\" \"$f.patch\" \"$f\"" >> "$filev2"
- echo "patch-if \"$testdir\" \"$f.patch\" \"$f\"" >> "$filev3"
- else
- verbose_notice " patch \"$f.patch\" \"$f\""
- echo "patch \"$f.patch\" \"$f\"" >> "$filev2"
- echo "patch \"$f.patch\" \"$f\"" >> "$filev3"
- fi
+ verbose_notice " patch \"$f.patch\" \"$f\""
+ echo "patch \"$f.patch\" \"$f\"" >> "$filev2"
+ echo "patch \"$f.patch\" \"$f\"" >> "$filev3"
}
append_remove_instructions() {
@@ -201,6 +194,10 @@ append_remove_instructions() {
# List all files in the current directory, stripping leading "./"
# Pass a variable name and it will be filled as an array.
+# To support Tor Browser updates, skip the following files:
+# TorBrowser/Data/Browser/profiles.ini
+# TorBrowser/Data/Browser/profile.default/bookmarks.html
+# TorBrowser/Data/Tor/torrc
list_files() {
count=0
temp_filelist=$(mktemp)
@@ -211,6 +208,11 @@ list_files() {
| sed 's/\.\/\(.*\)/\1/' \
| sort -r > "${temp_filelist}"
while read file; do
+ if [ "$file" = "TorBrowser/Data/Browser/profiles.ini" -o \
+ "$file" = "TorBrowser/Data/Browser/profile.default/bookmarks.html" -o \
+ "$file" = "TorBrowser/Data/Tor/torrc" ]; then
+ continue;
+ fi
eval "${1}[$count]=\"$file\""
(( count++ ))
done < "${temp_filelist}"
@@ -232,3 +234,19 @@ list_dirs() {
done < "${temp_dirlist}"
rm "${temp_dirlist}"
}
+
+# List all symbolic links in the current directory, stripping leading "./"
+list_symlinks() {
+ count=0
+
+ find . -type l \
+ | sed 's/\.\/\(.*\)/\1/' \
+ | sort -r > "temp-symlinklist"
+ while read symlink; do
+ target=$(readlink "$symlink")
+ eval "${1}[$count]=\"$symlink\""
+ eval "${2}[$count]=\"$target\""
+ (( count++ ))
+ done < "temp-symlinklist"
+ rm "temp-symlinklist"
+}
diff --git a/tools/update-packaging/make_full_update.sh b/tools/update-packaging/make_full_update.sh
index a79a1839147c..fcf143339a1c 100755
--- a/tools/update-packaging/make_full_update.sh
+++ b/tools/update-packaging/make_full_update.sh
@@ -69,6 +69,7 @@ if [ ! -f "precomplete" ]; then
fi
list_files files
+list_symlinks symlinks symlink_targets
popd
@@ -81,6 +82,22 @@ notice " type complete"
echo "type \"complete\"" >> "$updatemanifestv2"
echo "type \"complete\"" >> "$updatemanifestv3"
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove the following lines:
+# If removal of any old, existing directories is desired, emit the appropriate
+# rmrfdir commands.
+notice ""
+notice "Adding directory removal instructions to update manifests"
+for dir_to_remove in $directories_to_remove; do
+ # rmrfdir requires a trailing slash; if slash is missing, add one.
+ if ! [[ "$dir_to_remove" =~ /$ ]]; then
+ dir_to_remove="${dir_to_remove}/"
+ fi
+ echo "rmrfdir \"$dir_to_remove\"" >> "$updatemanifestv2"
+ echo "rmrfdir \"$dir_to_remove\"" >> "$updatemanifestv3"
+done
+# END TOR_BROWSER_DATA_OUTSIDE_APP_DIR removal
+
notice ""
notice "Adding file add instructions to update manifests"
num_files=${#files[*]}
@@ -109,6 +126,15 @@ for ((i=0; $i<$num_files; i=$i+1)); do
targetfiles="$targetfiles \"$f\""
done
+notice ""
+notice "Adding symlink add instructions to update manifests"
+num_symlinks=${#symlinks[*]}
+for ((i=0; $i<$num_symlinks; i=$i+1)); do
+ link="${symlinks[$i]}"
+ target="${symlink_targets[$i]}"
+ make_addsymlink_instruction "$link" "$target" "$updatemanifestv2" "$updatemanifestv3"
+done
+
# Append remove instructions for any dead files.
notice ""
notice "Adding file and directory remove instructions from file 'removed-files'"
diff --git a/tools/update-packaging/make_incremental_update.sh b/tools/update-packaging/make_incremental_update.sh
index 7b30cb5165fa..5ff620a667d5 100755
--- a/tools/update-packaging/make_incremental_update.sh
+++ b/tools/update-packaging/make_incremental_update.sh
@@ -78,7 +78,11 @@ if [ $# = 0 ]; then
exit 1
fi
-requested_forced_updates='Contents/MacOS/firefox'
+# Firefox uses requested_forced_updates='Contents/MacOS/firefox' due to
+# 770996 but in Tor Browser we do not need that fix.
+requested_forced_updates=""
+directories_to_remove=""
+extra_files_to_remove=""
while getopts "hqf:" flag
do
@@ -113,6 +117,28 @@ updatemanifestv2="$workdir/updatev2.manifest"
updatemanifestv3="$workdir/updatev3.manifest"
archivefiles="updatev2.manifest updatev3.manifest"
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove the following lines:
+# If the NoScript extension has changed between
+# releases, add it to the "force updates" list.
+ext_path='TorBrowser/Data/Browser/profile.default/extensions'
+if [ -d "$newdir/$ext_path" ]; then
+ noscript='{73a6fe31-595d-460b-a920-fcc0f8843232}.xpi'
+
+ # NoScript is a packed extension, so we simply compare the old and the new
+ # .xpi files.
+ noscript_path="$ext_path/$noscript"
+ diff -a "$olddir/$noscript_path" "$newdir/$noscript_path" > /dev/null
+ rc=$?
+ if [ $rc -gt 1 ]; then
+ notice "Unexpected exit $rc from $noscript_path diff command"
+ exit 2
+ elif [ $rc -eq 1 ]; then
+ requested_forced_updates="$requested_forced_updates $noscript_path"
+ fi
+fi
+# END TOR_BROWSER_DATA_OUTSIDE_APP_DIR removal
+
mkdir -p "$workdir"
# Generate a list of all files in the target directory.
@@ -123,6 +149,7 @@ fi
list_files oldfiles
list_dirs olddirs
+list_symlinks oldsymlinks oldsymlink_targets
popd
@@ -140,6 +167,7 @@ fi
list_dirs newdirs
list_files newfiles
+list_symlinks newsymlinks newsymlink_targets
popd
@@ -152,6 +180,23 @@ notice " type partial"
echo "type \"partial\"" >> $updatemanifestv2
echo "type \"partial\"" >> $updatemanifestv3
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove the following lines:
+# If removal of any old, existing directories is desired, emit the appropriate
+# rmrfdir commands.
+notice ""
+notice "Adding directory removal instructions to update manifests"
+for dir_to_remove in $directories_to_remove; do
+ # rmrfdir requires a trailing slash, so add one if missing.
+ if ! [[ "$dir_to_remove" =~ /$ ]]; then
+ dir_to_remove="${dir_to_remove}/"
+ fi
+ echo "rmrfdir \"$dir_to_remove\"" >> "$updatemanifestv2"
+ echo "rmrfdir \"$dir_to_remove\"" >> "$updatemanifestv3"
+done
+# END TOR_BROWSER_DATA_OUTSIDE_APP_DIR removal
+
+
notice ""
notice "Adding file patch and add instructions to update manifests"
@@ -274,6 +319,24 @@ for ((i=0; $i<$num_oldfiles; i=$i+1)); do
fi
done
+# Remove and re-add symlinks
+notice ""
+notice "Adding symlink remove/add instructions to update manifests"
+num_oldsymlinks=${#oldsymlinks[*]}
+for ((i=0; $i<$num_oldsymlinks; i=$i+1)); do
+ link="${oldsymlinks[$i]}"
+ verbose_notice " remove: $link"
+ echo "remove \"$link\"" >> "$updatemanifestv2"
+ echo "remove \"$link\"" >> "$updatemanifestv3"
+done
+
+num_newsymlinks=${#newsymlinks[*]}
+for ((i=0; $i<$num_newsymlinks; i=$i+1)); do
+ link="${newsymlinks[$i]}"
+ target="${newsymlink_targets[$i]}"
+ make_addsymlink_instruction "$link" "$target" "$updatemanifestv2" "$updatemanifestv3"
+done
+
# Newly added files
notice ""
notice "Adding file add instructions to update manifests"
@@ -323,6 +386,15 @@ notice ""
notice "Adding file and directory remove instructions from file 'removed-files'"
append_remove_instructions "$newdir" "$updatemanifestv2" "$updatemanifestv3"
+# TODO When TOR_BROWSER_DATA_OUTSIDE_APP_DIR is used on all platforms,
+# we should remove the following lines:
+for f in $extra_files_to_remove; do
+ notice " remove \"$f\""
+ echo "remove \"$f\"" >> "$updatemanifestv2"
+ echo "remove \"$f\"" >> "$updatemanifestv3"
+done
+# END TOR_BROWSER_DATA_OUTSIDE_APP_DIR removal
+
notice ""
notice "Adding directory remove instructions for directories that no longer exist"
num_olddirs=${#olddirs[*]}
[View Less]
1
0

[tor-browser/tor-browser-78.10.0esr-10.0-1] Bug 21907: Fix runtime error on CentOS 6
by sysrqb@torproject.org 14 Apr '21
by sysrqb@torproject.org 14 Apr '21
14 Apr '21
commit 128cfb712ef9657b44142389a8e4e861cf1c38f4
Author: Nicolas Vigier <boklm(a)torproject.org>
Date: Mon Apr 10 16:07:23 2017 +0200
Bug 21907: Fix runtime error on CentOS 6
In Mozilla bug 1324780, support for building with glib 2.28 (the version
available in CentOS 6) was added. However we are building on Debian
Wheezy which has glib 2.32. We fix that by backing out all glib > 2.28
code paths.
---
gfx/harfbuzz/src/hb-glib.cc | 53 ---------------------------…
[View More]------------------
gfx/harfbuzz/src/hb-glib.h | 5 -----
2 files changed, 58 deletions(-)
diff --git a/gfx/harfbuzz/src/hb-glib.cc b/gfx/harfbuzz/src/hb-glib.cc
index 058f65ae69c3..2fd39610203d 100644
--- a/gfx/harfbuzz/src/hb-glib.cc
+++ b/gfx/harfbuzz/src/hb-glib.cc
@@ -49,7 +49,6 @@
**/
-#if !GLIB_CHECK_VERSION(2,29,14)
static const hb_script_t
glib_script_to_script[] =
{
@@ -171,7 +170,6 @@ glib_script_to_script[] =
HB_SCRIPT_SORA_SOMPENG,
HB_SCRIPT_TAKRI
};
-#endif
/**
* hb_glib_script_to_script:
@@ -187,9 +185,6 @@ glib_script_to_script[] =
hb_script_t
hb_glib_script_to_script (GUnicodeScript script)
{
-#if GLIB_CHECK_VERSION(2,29,14)
- return (hb_script_t) g_unicode_script_to_iso15924 (script);
-#else
if (likely ((unsigned int) script < ARRAY_LENGTH (glib_script_to_script)))
return glib_script_to_script[script];
@@ -197,7 +192,6 @@ hb_glib_script_to_script (GUnicodeScript script)
return HB_SCRIPT_INVALID;
return HB_SCRIPT_UNKNOWN;
-#endif
}
/**
@@ -214,9 +208,6 @@ hb_glib_script_to_script (GUnicodeScript script)
GUnicodeScript
hb_glib_script_from_script (hb_script_t script)
{
-#if GLIB_CHECK_VERSION(2,29,14)
- return g_unicode_script_from_iso15924 (script);
-#else
unsigned int count = ARRAY_LENGTH (glib_script_to_script);
for (unsigned int i = 0; i < count; i++)
if (glib_script_to_script[i] == script)
@@ -226,7 +217,6 @@ hb_glib_script_from_script (hb_script_t script)
return G_UNICODE_SCRIPT_INVALID_CODE;
return G_UNICODE_SCRIPT_UNKNOWN;
-#endif
}
@@ -273,10 +263,6 @@ hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_codepoint_t *ab,
void *user_data HB_UNUSED)
{
-#if GLIB_CHECK_VERSION(2,29,12)
- return g_unichar_compose (a, b, ab);
-#endif
-
/* We don't ifdef-out the fallback code such that compiler always
* sees it and makes sure it's compilable. */
@@ -310,10 +296,6 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED,
hb_codepoint_t *b,
void *user_data HB_UNUSED)
{
-#if GLIB_CHECK_VERSION(2,29,12)
- return g_unichar_decompose (ab, a, b);
-#endif
-
/* We don't ifdef-out the fallback code such that compiler always
* sees it and makes sure it's compilable. */
@@ -415,39 +397,4 @@ hb_glib_get_unicode_funcs ()
return static_glib_funcs.get_unconst ();
}
-
-
-#if GLIB_CHECK_VERSION(2,31,10)
-
-static void
-_hb_g_bytes_unref (void *data)
-{
- g_bytes_unref ((GBytes *) data);
-}
-
-/**
- * hb_glib_blob_create:
- * @gbytes: the GBytes structure to work upon
- *
- * Creates an #hb_blob_t blob from the specified
- * GBytes data structure.
- *
- * Return value: (transfer full): the new #hb_blob_t blob object
- *
- * Since: 0.9.38
- **/
-hb_blob_t *
-hb_glib_blob_create (GBytes *gbytes)
-{
- gsize size = 0;
- gconstpointer data = g_bytes_get_data (gbytes, &size);
- return hb_blob_create ((const char *) data,
- size,
- HB_MEMORY_MODE_READONLY,
- g_bytes_ref (gbytes),
- _hb_g_bytes_unref);
-}
-#endif
-
-
#endif
diff --git a/gfx/harfbuzz/src/hb-glib.h b/gfx/harfbuzz/src/hb-glib.h
index 5f04183ba19f..4adbd7c332cb 100644
--- a/gfx/harfbuzz/src/hb-glib.h
+++ b/gfx/harfbuzz/src/hb-glib.h
@@ -46,11 +46,6 @@ hb_glib_script_from_script (hb_script_t script);
HB_EXTERN hb_unicode_funcs_t *
hb_glib_get_unicode_funcs (void);
-#if GLIB_CHECK_VERSION(2,31,10)
-HB_EXTERN hb_blob_t *
-hb_glib_blob_create (GBytes *gbytes);
-#endif
-
HB_END_DECLS
#endif /* HB_GLIB_H */
[View Less]
1
0

[tor-browser/tor-browser-78.10.0esr-10.0-1] Bug 21724: Make Firefox and Tor Browser distinct macOS apps
by sysrqb@torproject.org 14 Apr '21
by sysrqb@torproject.org 14 Apr '21
14 Apr '21
commit 748b74fceeb470c7d5c7d9e38506feb3f371334d
Author: teor <teor2345(a)gmail.com>
Date: Mon Mar 13 23:06:23 2017 +1100
Bug 21724: Make Firefox and Tor Browser distinct macOS apps
When macOS opens a document or selects a default browser, it sometimes
uses the CFBundleSignature. Changing from the Firefox MOZB signature to
a different signature TORB allows macOS to distinguish between Firefox
and Tor Browser.
---
browser/app/Makefile.in | 2 +…
[View More]-
browser/app/macbuild/Contents/Info.plist.in | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/browser/app/Makefile.in b/browser/app/Makefile.in
index 1aec6541fc0f..6770319f1866 100644
--- a/browser/app/Makefile.in
+++ b/browser/app/Makefile.in
@@ -103,5 +103,5 @@ ifdef MOZ_UPDATER
mv -f '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater' '$(dist_dest)/Contents/Library/LaunchServices'
ln -s ../../../../Library/LaunchServices/org.mozilla.updater '$(dist_dest)/Contents/MacOS/updater.app/Contents/MacOS/org.mozilla.updater'
endif
- printf APPLMOZB > '$(dist_dest)/Contents/PkgInfo'
+ printf APPLTORB > '$(dist_dest)/Contents/PkgInfo'
endif
diff --git a/browser/app/macbuild/Contents/Info.plist.in b/browser/app/macbuild/Contents/Info.plist.in
index f6791ea48125..95b3bc83905c 100644
--- a/browser/app/macbuild/Contents/Info.plist.in
+++ b/browser/app/macbuild/Contents/Info.plist.in
@@ -179,7 +179,7 @@
<key>CFBundleShortVersionString</key>
<string>%APP_VERSION%</string>
<key>CFBundleSignature</key>
- <string>MOZB</string>
+ <string>TORB</string>
<key>CFBundleURLTypes</key>
<array>
<dict>
[View Less]
1
0