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

[translation/tpo-web] https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit dbc114b01c11b29c543470d0432ab5c49996deee
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 12:53:13 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
---
contents+sv.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/contents+sv.po b/contents+sv.po
index b209da2bb3..45c8a50132 100644
--- a/contents+sv.po
+++ b/contents+sv.po
@@ -4,7 +4,7 @@
# Jonas Franzén, 2019
# erinm, 2019
# IDRASSI Mounir …
[View More]<mounir.idrassi(a)idrix.fr>, 2019
-# Jonatan Nyberg, 2019
+# Jonatan Nyberg, 2020
#
msgid ""
msgstr ""
@@ -12,7 +12,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-15 12:00+CET\n"
"PO-Revision-Date: 2019-03-09 10:41+0000\n"
-"Last-Translator: Jonatan Nyberg, 2019\n"
+"Last-Translator: Jonatan Nyberg, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/otf/teams/1519/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -671,7 +671,7 @@ msgstr "Ge idag, och Mozilla kommer att matcha din donation."
#: templates/footer.html:18 templates/hero-home.html:13
#: templates/navbar.html:79
msgid "Download Tor Browser"
-msgstr ""
+msgstr "Hämta Tor Browser"
#: lego/templates/footer.html:10 templates/footer.html:10
msgid ""
[View Less]
1
0

[translation/tbmanual-contentspot] https://gitweb.torproject.org/translation.git/commit/?h=tbmanual-contentspot
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit 0e31f7e6803f377567b0b186188437a45a479621
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 12:50:15 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tbmanual-contentspot
---
contents+sv-SE.po | 40 +++++++++++++++++++++++++---------------
1 file changed, 25 insertions(+), 15 deletions(-)
diff --git a/contents+sv-SE.po b/contents+sv-SE.po
index 0ffed247d9..4e5052a222 100644
--- a/contents+sv-SE.po
+++ b/contents+sv-SE.po
@@ -1,…
[View More]7 +1,7 @@
# Translators:
# erinm, 2019
# Henrik Mattsson-Mårn <h(a)reglage.net>, 2019
-# Jonatan Nyberg, 2019
+# Jonatan Nyberg, 2020
#
msgid ""
msgstr ""
@@ -9,7 +9,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-15 15:58+CET\n"
"PO-Revision-Date: 2018-11-14 12:31+0000\n"
-"Last-Translator: Jonatan Nyberg, 2019\n"
+"Last-Translator: Jonatan Nyberg, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/otf/teams/1519/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -314,8 +314,8 @@ msgid ""
" Dropbox, Google Drive and GitHub."
msgstr ""
"GetTor är en tjänst som automatiskt svarar på meddelanden med länkar till "
-"den senaste versionen av Tor-webbläsaren, som finns på en mängd olika "
-"platser, som Dropbox, Google Drive och GitHub."
+"den senaste versionen av Tor Browser, som finns på en mängd olika platser, "
+"som Dropbox, Google Drive och GitHub."
#: https//tb-manual.torproject.org/downloading/
#: (content/downloading/contents+en.lrtopic.body)
@@ -489,7 +489,7 @@ msgstr ""
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.description)
msgid "Learn how to use Tor Browser for the first time"
-msgstr "Lär dig använda Tor för första gången"
+msgstr "Lär dig hur du använder Tor Browser för första gången"
#: https//tb-manual.torproject.org/running-tor-browser/
#: (content/running-tor-browser/contents+en.lrtopic.body)
@@ -1019,6 +1019,8 @@ msgid ""
"You can see a diagram of the circuit that Tor Browser is using for the "
"current tab in the site information menu, in the URL bar."
msgstr ""
+"Du kan se ett diagram över kretsen som Tor Browser använder för den aktuella"
+" fliken i webbplatsinformationsmenyn, i webbadressfältet."
#: https//tb-manual.torproject.org/managing-identities/
#: (content/managing-identities/contents+en.lrtopic.body)
@@ -1093,6 +1095,12 @@ msgid ""
"following the site’s recommended procedure for account recovery, or "
"contacting the operators and explaining the situation."
msgstr ""
+"* Tor Browser gör ofta att din anslutning visas som om den kommer från en "
+"helt annan del av världen. Vissa webbplatser, som banker eller "
+"e-postleverantörer, kan tolka detta som ett tecken på att ditt konto har "
+"hackats eller äventyrats och låser ut dig. Det enda sättet att lösa detta är"
+" genom att följa webbplatsens rekommenderade förfarande för "
+"kontoåterställning, eller kontakta operatörerna och förklara situationen."
#: https//tb-manual.torproject.org/managing-identities/
#: (content/managing-identities/contents+en.lrtopic.body)
@@ -1126,13 +1134,13 @@ msgid ""
"connections. Tor Browser will warn you that all activity and downloads will "
"be stopped, so take this into account before clicking “New Identity”."
msgstr ""
-"Denna inställningen är användbar ifall du vill förebygga din föregående "
-"aktivitet ska vara länkbar med vad du har gjort innan. Vid val av denna "
-"inställningen kommer att stänga alla öppna flikar, fönster, all privat data "
-"som cookies och webbläsar historik kommer att tas bort, och nya Tor kretsar "
-"kommer användas för alla uppkopplingar. Tor webläsaren kommer att varna dig "
-"att all aktivitet och nedladdningar kommer att stoppas, tänk på detta innan "
-"du klicka \"Ny identitet\"."
+"Det här alternativet är användbart om du vill förhindra att din "
+"efterföljande webbläsaraktivitet är länkbar till vad du gjorde tidigare. Om "
+"du väljer det stänger du alla dina öppna flikar och fönster, rensar all "
+"privat information som kakor och webbhistorik och använder nya Tor-kretsar "
+"för alla anslutningar. Tor Browser kommer att varna dig att all aktivitet "
+"och hämtning kommer att stoppas, så ta hänsyn till detta innan du klickar på"
+" \"Ny identitet\"."
#: https//tb-manual.torproject.org/managing-identities/
#: (content/managing-identities/contents+en.lrtopic.body)
@@ -1591,6 +1599,8 @@ msgid ""
"* Make sure another Tor Browser is not already running. If you’re not sure "
"if Tor Browser is running, restart your computer."
msgstr ""
+"* Se till att en annan Tor Browser inte redan körs. Om du inte är säker på "
+"om Tor Browser körs, starta om datorn."
#: https//tb-manual.torproject.org/troubleshooting/
#: (content/troubleshooting/contents+en.lrtopic.body)
@@ -1765,7 +1775,7 @@ msgstr "Hur du raderar Tor webbläsare från ditt system"
#: https//tb-manual.torproject.org/uninstalling/
#: (content/uninstalling/contents+en.lrtopic.body)
msgid "Removing Tor Browser from your system is simple:"
-msgstr "Att radera Tor från ditt system är enkelt:"
+msgstr "Ta bort Tor Browser från ditt system är enkelt:"
#: https//tb-manual.torproject.org/uninstalling/
#: (content/uninstalling/contents+en.lrtopic.body)
@@ -1953,7 +1963,7 @@ msgstr ""
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
msgid "./start-tor-browser.desktop"
-msgstr ""
+msgstr "./start-tor-browser.desktop"
#: https//tb-manual.torproject.org/known-issues/
#: (content/known-issues/contents+en.lrtopic.body)
@@ -2085,7 +2095,7 @@ msgstr "Ge idag, och Mozilla kommer att matcha din donation."
#: lego/templates/navbar.html:83 templates/footer.html:10
#: templates/footer.html:19 templates/navbar.html:83
msgid "Download Tor Browser"
-msgstr ""
+msgstr "Hämta Tor Browser"
#: lego/templates/footer.html:11 templates/footer.html:11
msgid ""
[View Less]
1
0

[translation/donatepages-messagespot] https://gitweb.torproject.org/translation.git/commit/?h=donatepages-messagespot
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit 5765cda1576ce30ed38848184addb7fab61e3234
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 12:45:38 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=donatepages-message…
---
locale/sv/LC_MESSAGES/messages.po | 158 ++++++++++++++++++++++++--------------
1 file changed, 101 insertions(+), 57 deletions(-)
diff --git a/locale/sv/LC_MESSAGES/messages.po b/locale/sv/LC_MESSAGES/messages.po
index 51b94b270b..ae6201e63e 100644
--- a/…
[View More]locale/sv/LC_MESSAGES/messages.po
+++ b/locale/sv/LC_MESSAGES/messages.po
@@ -5,11 +5,11 @@
# Filip Bengtsson, 2019
# Daniel Sjöberg <sjbrg(a)protonmail.com>, 2019
# erinm, 2019
-# Jonatan Nyberg, 2019
+# Jonatan Nyberg, 2020
#
msgid ""
msgstr ""
-"Last-Translator: Jonatan Nyberg, 2019\n"
+"Last-Translator: Jonatan Nyberg, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/otf/teams/1519/sv/)\n"
"Language: sv\n"
"Plural-Forms: nplurals=2; plural=(n != 1);\n"
@@ -31,12 +31,12 @@ msgstr "Ge idag, och Mozilla kommer att matcha din donation."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:34
#: tmp/cache_locale/c8/c806c3e41d2762077fdd1ce236b4b0b7dc838a7c1a428d6d6daeede2a01d35aa.php:53
msgid "Tor Privacy Policy"
-msgstr ""
+msgstr "Tors sekretesspolicy"
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:44
#: tmp/cache_locale/c8/c806c3e41d2762077fdd1ce236b4b0b7dc838a7c1a428d6d6daeede2a01d35aa.php:64
msgid "Donor privacy policy"
-msgstr ""
+msgstr "Donators sekretesspolicy"
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:58
#: tmp/cache_locale/c8/c806c3e41d2762077fdd1ce236b4b0b7dc838a7c1a428d6d6daeede2a01d35aa.php:79
@@ -169,7 +169,7 @@ msgstr ""
#: tmp/cache_locale/17/179dc1a0f488d5bbb8c128dc5c0fb35d6240d83414df10335a1cf4031139609a.php:183
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:656
msgid "Back to Donate Page"
-msgstr ""
+msgstr "Tillbaka till donera sidan"
#: tmp/cache_locale/ef/ef5649de7f8cead2eb5ba30c5d2afbe4e1ea84df12773fd2513ca8f8823e3fbc.php:35
#: tmp/cache_locale/cc/cc2e1dd4edb96c59a6514d676ca3f562a2a9a2cd34e2c211c03fb08b3e664469.php:54
@@ -179,7 +179,7 @@ msgstr ""
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:35
#: tmp/cache_locale/02/023cc9edfe6c60b72788b97f6a123fde6020d003845e03b26b572d864d6eb3de.php:54
msgid "Support the Tor Project Today!"
-msgstr ""
+msgstr "Stöd Tor-projektet idag!"
#: tmp/cache_locale/ef/ef5649de7f8cead2eb5ba30c5d2afbe4e1ea84df12773fd2513ca8f8823e3fbc.php:61
#: tmp/cache_locale/cc/cc2e1dd4edb96c59a6514d676ca3f562a2a9a2cd34e2c211c03fb08b3e664469.php:83
@@ -238,29 +238,31 @@ msgid ""
"The European shirt fits run a little small so you might want to consider "
"sizing up."
msgstr ""
+"Den europeiska skjortan är lite liten så du kanske vill överväga en större "
+"storlek."
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:54
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:36
msgid "Fit"
-msgstr ""
+msgstr "Passform"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:58
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:40
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:508
msgid "Select Fit"
-msgstr ""
+msgstr "Välj passform"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:62
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:44
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:500
msgid "Slim"
-msgstr ""
+msgstr "Smal"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:66
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:48
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:496
msgid "Classic"
-msgstr ""
+msgstr "Klassisk"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:74
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:56
@@ -277,7 +279,7 @@ msgstr "Storlek"
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:70
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:512
msgid "Select Size"
-msgstr ""
+msgstr "Välj storlek"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:92
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:74
@@ -292,17 +294,17 @@ msgstr "M"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:100
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:82
msgid "L"
-msgstr ""
+msgstr "L"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:104
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:86
msgid "XL"
-msgstr ""
+msgstr "XL"
#: tmp/cache_locale/eb/eb66db0fc2349cdc00200df1ba86814695c5deb02dc0f5941de0ada2f44eb52b.php:108
#: tmp/cache_locale/ce/ce708c1cd991748e8c1c29f932e6ddbd1be5be1b4cc2c5b49b607cae1df80432.php:90
msgid "XXL"
-msgstr ""
+msgstr "XXL"
#: tmp/cache_locale/dd/ddde851dcf0f4bcfdf69b2fb2bdd731c4f85ce373ca3ec850a7ca8bbc00dfb85.php:47
#: tmp/cache_locale/dd/ddde851dcf0f4bcfdf69b2fb2bdd731c4f85ce373ca3ec850a7ca8bbc00dfb85.php:70
@@ -318,7 +320,7 @@ msgstr ""
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:63
#: tmp/cache_locale/2c/2c32942b896dd845bd6204d3104922983a843d726e231446ff21ddb2a33f6cda.php:40
msgid "summary_large_image"
-msgstr ""
+msgstr "summary_large_image"
#: tmp/cache_locale/dd/ddde851dcf0f4bcfdf69b2fb2bdd731c4f85ce373ca3ec850a7ca8bbc00dfb85.php:62
#: tmp/cache_locale/66/666e9197f427d70c0743bcdae2c3e34f41f9d7acf2b2dddb2c21c21723e73d10.php:67
@@ -374,7 +376,7 @@ msgstr "E-post"
#: tmp/cache_locale/a1/a1384b9a21e3d43e946972b01389567dff845ee982dcf05228aa3e5096a74210.php:47
#: tmp/cache_locale/84/843b15891cb1c4a052da0edfef1988434048191530bcfe390199ff0e33e802d4.php:29
msgid "First Name"
-msgstr ""
+msgstr "Förnamn"
#: tmp/cache_locale/cc/cc2e1dd4edb96c59a6514d676ca3f562a2a9a2cd34e2c211c03fb08b3e664469.php:196
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:324
@@ -382,7 +384,7 @@ msgstr ""
#: tmp/cache_locale/a1/a1384b9a21e3d43e946972b01389567dff845ee982dcf05228aa3e5096a74210.php:51
#: tmp/cache_locale/84/843b15891cb1c4a052da0edfef1988434048191530bcfe390199ff0e33e802d4.php:33
msgid "Last Name"
-msgstr ""
+msgstr "Efternamn"
#: tmp/cache_locale/cc/cc2e1dd4edb96c59a6514d676ca3f562a2a9a2cd34e2c211c03fb08b3e664469.php:200
#: tmp/cache_locale/a1/a1384b9a21e3d43e946972b01389567dff845ee982dcf05228aa3e5096a74210.php:98
@@ -415,7 +417,7 @@ msgstr ""
#: tmp/cache_locale/60/60fb10a60dd92fe380a6d105fd68d9375e135c65251f204fa37158d9c2e655d9.php:53
#: tmp/cache_locale/12/12677df2d2a5991edb775c6909b7be7ca718fd00abd6950a809cda5ab878d2ce.php:53
msgid "Tor Thanks You"
-msgstr ""
+msgstr "Tor tackar dig"
#: tmp/cache_locale/ca/ca1cd152d40544030a642d8d074e6afb769c3bf80a1b2b61c380f1466e3a03a4.php:44
#: tmp/cache_locale/af/afda2fbd22ed389453e63ca9acc074a25ce820b5bc97120edfd975cf8f46634a.php:44
@@ -484,14 +486,14 @@ msgstr ""
#: tmp/cache_locale/60/60fb10a60dd92fe380a6d105fd68d9375e135c65251f204fa37158d9c2e655d9.php:97
#: tmp/cache_locale/12/12677df2d2a5991edb775c6909b7be7ca718fd00abd6950a809cda5ab878d2ce.php:82
msgid "SHARE THE TOR PROJECT"
-msgstr ""
+msgstr "DELA TOR-PROJEKTET"
#: tmp/cache_locale/ca/ca1cd152d40544030a642d8d074e6afb769c3bf80a1b2b61c380f1466e3a03a4.php:145
#: tmp/cache_locale/af/afda2fbd22ed389453e63ca9acc074a25ce820b5bc97120edfd975cf8f46634a.php:115
#: tmp/cache_locale/60/60fb10a60dd92fe380a6d105fd68d9375e135c65251f204fa37158d9c2e655d9.php:166
#: tmp/cache_locale/12/12677df2d2a5991edb775c6909b7be7ca718fd00abd6950a809cda5ab878d2ce.php:109
msgid "Got Skills?"
-msgstr ""
+msgstr "Har du kompetens?"
#: tmp/cache_locale/ca/ca1cd152d40544030a642d8d074e6afb769c3bf80a1b2b61c380f1466e3a03a4.php:151
#: tmp/cache_locale/af/afda2fbd22ed389453e63ca9acc074a25ce820b5bc97120edfd975cf8f46634a.php:121
@@ -543,6 +545,9 @@ msgid ""
" <a href=\"https://www.torproject.org/donate/donate-options.html.en\">other "
"donations options page</a>."
msgstr ""
+"Om du vill donera utan att aktivera Javascript, ta en titt på vår <a "
+"href=\"https://www.torproject.org/donate/donate-"
+"options.html.en\">alternativa sida för andra donationer</a>."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:87
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:109
@@ -564,17 +569,17 @@ msgstr ""
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:152
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:158
msgid "donate"
-msgstr ""
+msgstr "donera"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:132
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:154
msgid "once"
-msgstr ""
+msgstr "en gång"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:138
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:160
msgid "monthly"
-msgstr ""
+msgstr "månatlig"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:145
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:167
@@ -589,22 +594,22 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:166
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:187
msgid "invalid amount"
-msgstr ""
+msgstr "ogiltigt belopp"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:170
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:191
msgid "$2 minimum donation"
-msgstr ""
+msgstr "$2 minsta donation"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:174
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:195
msgid "$ other"
-msgstr ""
+msgstr "$ annat"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:181
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:202
msgid "Choose your gift as a token of our thanks."
-msgstr ""
+msgstr "Välj din gåva som ett tecken på vårt tack."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:188
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:209
@@ -620,7 +625,7 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:201
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:222
msgid "sticker Pack"
-msgstr ""
+msgstr "klistermärkespaket"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:208
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:229
@@ -628,11 +633,13 @@ msgid ""
"A collection of our favorite logo stickers for decorating your stuff and "
"covering your cams."
msgstr ""
+"En samling av våra favoritlogotyper för att dekorera dina saker och täcka "
+"dina kameror."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:218
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:239
msgid "t-shirt"
-msgstr ""
+msgstr "t-shirt"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:226
msgid "Get our limited edition Tor: Strength in Numbers shirt."
@@ -665,7 +672,7 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:272
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:277
msgid "sweatshirt"
-msgstr ""
+msgstr "tröja"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:279
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:284
@@ -679,7 +686,7 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:295
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:300
msgid "Credit Card"
-msgstr ""
+msgstr "Kreditkort"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:304
msgid "Want to donate Bitcoin, Stock, or via snail mail?"
@@ -688,17 +695,17 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:315
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:314
msgid "* required fields"
-msgstr ""
+msgstr "* obligatoriska fält"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:330
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:329
msgid "Street Address"
-msgstr ""
+msgstr "Gatuadress"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:334
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:333
msgid "Apt."
-msgstr ""
+msgstr "Lägenhet"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:344
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:343
@@ -713,32 +720,32 @@ msgstr "Tillstånd"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:353
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:352
msgid "Zip"
-msgstr ""
+msgstr "Postnummer"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:359
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:358
msgid "Enter email"
-msgstr ""
+msgstr "Ange e-post"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:363
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:362
msgid "We‘ll email you your receipt"
-msgstr ""
+msgstr "Vi kommer att mejla dig ditt kvitto"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:377
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:376
msgid "Card Number"
-msgstr ""
+msgstr "Kortnummer"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:384
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:383
msgid "MM"
-msgstr ""
+msgstr "MM"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:388
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:387
msgid "YY"
-msgstr ""
+msgstr "ÅÅ"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:392
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:391
@@ -750,14 +757,14 @@ msgstr ""
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:399
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:472
msgid "Choose your size and fit."
-msgstr ""
+msgstr "Välj din storlek och passform."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:405
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:413
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:404
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:412
msgid "T-shirt:"
-msgstr ""
+msgstr "T-shirt:"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:423
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:427
@@ -821,12 +828,12 @@ msgstr "Tor: Styrka i antal"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:485
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:516
msgid "Choose your size."
-msgstr ""
+msgstr "Välj din storlek."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:489
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:520
msgid "Sweatshirt"
-msgstr ""
+msgstr "Tröja"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:493
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:524
@@ -841,19 +848,19 @@ msgstr ""
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:499
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:530
msgid "There was a problem submitting your request to the server:<br>"
-msgstr ""
+msgstr "Det uppstod ett problem när din förfrågan skickades till servern:<br>"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:503
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:534
msgid "validation failed"
-msgstr ""
+msgstr "valideringen misslyckades"
#. notes: __field_name__ will be replaced with the field name in the
#. javascript.
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:509
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:540
msgid "__field_name__ must be filled out."
-msgstr ""
+msgstr "__field_name__ måste fyllas i."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:514
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:545
@@ -863,7 +870,7 @@ msgstr "Detta fält krävs"
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:518
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:549
msgid "Invalid email address."
-msgstr ""
+msgstr "Ogiltig e-postadress."
#: tmp/cache_locale/c7/c763c19bb6abb9330294c550c8241bb3874e3b4e17fb6e7b15db26c60df8d5fe.php:522
#: tmp/cache_locale/af/af919ed4d7946ee7ed7d71a5580f4c75c5fb2b9374dd8d99d3a0671f71654f60.php:553
@@ -1079,11 +1086,14 @@ msgid ""
"href=\"https://www.giantrabbit.com/\" class=\"stamp-bold\" "
"target=\"_blank\">Giant Rabbit</a></span>"
msgstr ""
+"Designad och byggd av <span class=\"stamp-bold\"><a "
+"href=\"https://www.giantrabbit.com/\" class=\"stamp-bold\" "
+"target=\"_blank\">Giant Rabbit</a></span>"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:53
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:34
msgid "Tor Donor FAQ"
-msgstr ""
+msgstr "Vanliga frågor för Tor-donatorer"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:64
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:44
@@ -1199,6 +1209,10 @@ msgid ""
"cryptographers, computer scientists, and privacy advocates, and most are not"
" paid by the Tor Project."
msgstr ""
+"Tusentals människor runt om i världen stöder aktivt arbetet i Tor-projektet,"
+" inklusive utvecklare, designers, reläoperatörer, forskare, kryptografer, "
+"dataforskare och integritetsförespråkare, och de flesta betalas inte av Tor-"
+"projektet."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:171
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:88
@@ -1218,7 +1232,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:178
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:95
msgid "Who uses Tor?"
-msgstr ""
+msgstr "Vem använder Tor?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:182
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:99
@@ -1303,6 +1317,9 @@ msgid ""
"anonymous, because the more people using Tor, the harder it is to identify "
"any single individual."
msgstr ""
+"Dessutom hjälper alla som använder Tor att hålla andra användare säkra och "
+"anonyma, eftersom ju fler människor som använder Tor, desto svårare är det "
+"att identifiera en enskild individ."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:220
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:137
@@ -1316,6 +1333,9 @@ msgid ""
"which is a distributed network of relays run by volunteers all around the "
"world."
msgstr ""
+"Tor skyddar dig genom att studsa din kommunikation runt Tor-nätverket, "
+"vilket är ett distribuerat nätverk av reläer som drivs av volontärer runt om"
+" i världen."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:226
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:143
@@ -1391,6 +1411,8 @@ msgid ""
"Downloading Tor Browser or using the Tor network is legal in nearly every "
"country."
msgstr ""
+"Hämta Tor Browser eller använda Tor-nätverket är lagligt i nästan alla "
+"länder."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:267
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:184
@@ -1575,7 +1597,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:369
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:268
msgid "Yes, definitely."
-msgstr ""
+msgstr "Ja, definitivt."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:371
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:270
@@ -1677,6 +1699,8 @@ msgid ""
"used, we're required by the IRS to track and report separately on that "
"money."
msgstr ""
+"Om vi accepterar en donation från någon som har angett hur de vill använda "
+"den, är vi skyldiga av IRS att spåra och rapportera separat om dessa pengar."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:423
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:284
@@ -1698,16 +1722,18 @@ msgid ""
"If you're donating using a mechanism that allows for comments, feel free to "
"send your thoughts that way."
msgstr ""
+"Om du donerar med hjälp av en mekanism som möjliggör kommentarer, skicka "
+"gärna dina tankar på det sättet."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:433
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:294
msgid "Can I donate while using Tor Browser?"
-msgstr ""
+msgstr "Kan jag donera medan jag använder Tor Browser?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:437
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:298
msgid "Yes! In our testing, donation works via Tor Browser."
-msgstr ""
+msgstr "Ja! I våra test fungerar donation via Tor Browser."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:439
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:300
@@ -1722,6 +1748,8 @@ msgid ""
"For users logging in to Paypal: some people had no problem donating via "
"PayPal while using Tor Browser."
msgstr ""
+"För användare som loggar in till Paypal: vissa människor hade inga problem "
+"att donera via PayPal när du använder Tor Browser."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:445
msgid ""
@@ -1785,7 +1813,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:481
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:338
msgid "Why is there a minimum donation?"
-msgstr ""
+msgstr "Varför finns det en minsta donation?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:485
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:342
@@ -1822,6 +1850,8 @@ msgid ""
"If I want my donation to be anonymous, what is the best way for me to "
"donate?"
msgstr ""
+"Om jag vill att min donation ska vara anonym, vad är det bästa sättet för "
+"mig att donera?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:509
msgid "You can donate by sending us a postal money order."
@@ -1961,6 +1991,8 @@ msgid ""
"Is the Tor Project required to identify me as a donor to the United States "
"government, or to any other authority?"
msgstr ""
+"Krävs Tor-projektet för att identifiera mig som en givare till USA:s "
+"regering eller någon annan myndighet?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:621
msgid ""
@@ -1976,6 +2008,9 @@ msgid ""
"from the copy of the 990 that's made publicly-available, and that's what we "
"do."
msgstr ""
+"Det är dock normalt för ideella organisationer att göra om enskilda "
+"givaruppgifter från kopian av 990 som görs offentligt tillgängliga, och det "
+"är vad vi gör."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:625
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:395
@@ -1990,6 +2025,8 @@ msgid ""
"In your privacy policy, you say you will never publicly identify me as a "
"donor without my permission."
msgstr ""
+"I er sekretesspolicy säger ni att ni aldrig offentligt identifierar mig som "
+"donator utan min tillåtelse."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:633
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:405
@@ -2014,6 +2051,8 @@ msgid ""
"However, we will never publicly identify you as a donor, unless you have "
"given us permission to do so."
msgstr ""
+"Vi kommer dock aldrig att offentligt identifiera dig som donator, om du inte"
+" har gett oss tillåtelse att göra det."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:643
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:415
@@ -2040,7 +2079,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:653
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:448
msgid "What is your donor privacy policy?"
-msgstr ""
+msgstr "Vad är er donators sekretesspolicy?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:657
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:452
@@ -2060,6 +2099,8 @@ msgid ""
"If you want your donation refunded, please tell us by emailing <span "
"class=\"email\">giving(at)torproject.org</span>."
msgstr ""
+"Om du vill att din donation återbetalas, berätta för oss genom att mejla "
+"<span class=\"email\">giving(at)torproject.org</span>."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:669
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:464
@@ -2085,7 +2126,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:679
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:496
msgid "Does Tor Project accept matching donations?"
-msgstr ""
+msgstr "Accepterar Tor-projektet matchande donationer?"
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:683
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:500
@@ -2119,6 +2160,8 @@ msgid ""
"Right now, we don't have a membership program, but we may set one up in the "
"future."
msgstr ""
+"Just nu har vi inget medlemskapsprogram, men vi skulle kunna sätta upp ett i"
+" framtiden."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:699
msgid ""
@@ -2287,7 +2330,7 @@ msgstr ""
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:803
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:616
msgid "Sure."
-msgstr ""
+msgstr "Visst."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:805
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:618
@@ -2315,6 +2358,7 @@ msgstr ""
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:632
msgid "We are happy that a broad range of people use and support Tor."
msgstr ""
+"Vi är glada att ett brett spektrum av människor använder och stöder Tor."
#: tmp/cache_locale/7d/7d56367a61f987367eeb2a89d0c6db83fd0801cce86278bf7e99ed39b5b46254.php:825
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:638
[View Less]
1
0

[translation/support-portal] https://gitweb.torproject.org/translation.git/commit/?h=support-portal
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit a2ff9ce7214cd31353766da4b7e5edf2a2ad2600
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 12:23:54 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=support-portal
---
contents+sv.po | 180 +++++++++++++++++++++++++++++++++++++++++----------------
1 file changed, 131 insertions(+), 49 deletions(-)
diff --git a/contents+sv.po b/contents+sv.po
index 09f63c5e85..9c5101e8c7 100644
--- a/contents+sv.po
+++ b/contents+sv.po
@@ -65,7 …
[View More]+65,7 @@ msgstr "GetTor"
#: https//support.torproject.org/misc/menu/
#: (content/misc/menu/contents+en.lrquestion.description)
msgid "Connecting To Tor"
-msgstr ""
+msgstr "Anslutning till Tor"
#: https//support.torproject.org/censorship/
#: (content/censorship/contents+en.lrtopic.title)
@@ -86,7 +86,7 @@ msgstr "HTTPS"
#: https//support.torproject.org/misc/menu/
#: (content/misc/menu/contents+en.lrquestion.description)
msgid "Operators"
-msgstr ""
+msgstr "Operatörer"
#: https//support.torproject.org/onionservices/
#: (content/onionservices/contents+en.lrtopic.title)
@@ -141,6 +141,8 @@ msgid ""
"see that you're using Tor, but they won't know where you're going when you "
"do."
msgstr ""
+"Vissa enheter, till exempel din Internetleverantör (ISP), kanske kan se att "
+"du använder Tor, men de vet inte vart du ska när du gör det."
#: https//support.torproject.org/faq/faq-2/
#: (content/faq/faq-2/contents+en.lrquestion.title)
@@ -374,6 +376,9 @@ msgid ""
" advanced user who knows how to configure both in a way that doesn't "
"compromise your privacy."
msgstr ""
+"Generellt sett rekommenderar vi inte att du använder en VPN med Tor om du "
+"inte är en avancerad användare som vet hur du konfigurerar både på ett sätt "
+"som inte äventyrar din integritet."
#: https//support.torproject.org/faq/faq-5/
#: (content/faq/faq-5/contents+en.lrquestion.description)
@@ -1299,6 +1304,8 @@ msgid ""
"What are the most common issues with the latest stable version of Tor "
"Browser?"
msgstr ""
+"Vilka är de vanligaste problemen med den senaste stabila versionen av Tor "
+"Browser?"
#: https//support.torproject.org/tbb/tbb-1/
#: (content/tbb/tbb-1/contents+en.lrquestion.description)
@@ -1366,7 +1373,7 @@ msgstr "* tor.exe"
#: https//support.torproject.org/tbb/tbb-10/
#: (content/tbb/tbb-10/contents+en.lrquestion.description)
msgid "* obfs4proxy.exe (if you use bridges)"
-msgstr ""
+msgstr "* obfs4proxy.exe (om du använder broar)"
#: https//support.torproject.org/tbb/tbb-10/
#: (content/tbb/tbb-10/contents+en.lrquestion.description)
@@ -1386,7 +1393,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-10/
#: (content/tbb/tbb-10/contents+en.lrquestion.description)
msgid "* obfs4proxy (if you use bridges)"
-msgstr ""
+msgstr "* obfs4proxy (om du använder broar)"
#: https//support.torproject.org/tbb/tbb-10/
#: (content/tbb/tbb-10/contents+en.lrquestion.description)
@@ -1410,6 +1417,8 @@ msgstr ""
msgid ""
"I downloaded and installed Tor Browser for Windows, but now I can't find it."
msgstr ""
+"Jag hämtade och installerade Tor Browser för Windows, men nu kan jag inte "
+"hitta den."
#: https//support.torproject.org/tbb/tbb-11/
#: (content/tbb/tbb-11/contents+en.lrquestion.description)
@@ -1448,7 +1457,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-12/
#: (content/tbb/tbb-12/contents+en.lrquestion.title)
msgid "Can I use Flash in Tor Browser?"
-msgstr ""
+msgstr "Kan jag använda Flash i Tor Browser?"
#: https//support.torproject.org/tbb/tbb-12/
#: (content/tbb/tbb-12/contents+en.lrquestion.description)
@@ -1474,7 +1483,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-13/
#: (content/tbb/tbb-13/contents+en.lrquestion.title)
msgid "Does using Tor Browser protect other applications on my computer?"
-msgstr ""
+msgstr "Skyddar användningen av Tor Browser andra program på min dator?"
#: https//support.torproject.org/tbb/tbb-13/
#: (content/tbb/tbb-13/contents+en.lrquestion.description)
@@ -1532,7 +1541,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-16/
#: (content/tbb/tbb-16/contents+en.lrquestion.title)
msgid "Can I pick which country I'm exiting from?"
-msgstr ""
+msgstr "Kan jag välja vilket land jag lämnar från?"
#: https//support.torproject.org/tbb/tbb-16/
#: (content/tbb/tbb-16/contents+en.lrquestion.description)
@@ -1582,11 +1591,14 @@ msgid ""
"private, and you may forget and accidentally use that non-private browser to"
" do something that you intended to do in Tor Browser."
msgstr ""
+"Men tänk på att din andra webbläsare inte håller din aktivitet privat, och "
+"du kan glömma och oavsiktligt använda den icke-privata webbläsaren för att "
+"göra något som du tänkt att göra i Tor Browser."
#: https//support.torproject.org/tbb/tbb-18/
#: (content/tbb/tbb-18/contents+en.lrquestion.title)
msgid "Is there support for *BSD?"
-msgstr ""
+msgstr "Finns det stöd för *BSD?"
#: https//support.torproject.org/tbb/tbb-18/
#: (content/tbb/tbb-18/contents+en.lrquestion.description)
@@ -1648,7 +1660,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-2/
#: (content/tbb/tbb-2/contents+en.lrquestion.title)
msgid "Why is the first IP address in my relay circuit always the same?"
-msgstr ""
+msgstr "Varför är den första IP-adressen i min reläkrets alltid densamma?"
#: https//support.torproject.org/tbb/tbb-2/
#: (content/tbb/tbb-2/contents+en.lrquestion.description)
@@ -1721,7 +1733,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-21/
#: (content/tbb/tbb-21/contents+en.lrquestion.title)
msgid "How do I view Tor Browser message log?"
-msgstr ""
+msgstr "Hur visar jag Tor Browsers meddelandelogg?"
#: https//support.torproject.org/tbb/tbb-21/
#: (content/tbb/tbb-21/contents+en.lrquestion.description)
@@ -1797,6 +1809,8 @@ msgid ""
"That said, Tor is much faster than it used to be and you may not actually "
"notice any change in speed from other browsers."
msgstr ""
+"Som sagt, Tor är mycket snabbare än det brukade vara och du kanske inte "
+"märker någon förändring i hastighet från andra webbläsare."
#: https//support.torproject.org/tbb/tbb-23/
#: (content/tbb/tbb-23/contents+en.lrquestion.title)
@@ -1804,6 +1818,7 @@ msgid ""
"What search engine comes with Tor Browser and how does it protect my "
"privacy?"
msgstr ""
+"Vilken sökmotor kommer med Tor Browser och hur skyddar den min integritet?"
#: https//support.torproject.org/tbb/tbb-23/
#: (content/tbb/tbb-23/contents+en.lrquestion.description)
@@ -1844,7 +1859,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-25/
#: (content/tbb/tbb-25/contents+en.lrquestion.title)
msgid "I'm having a problem with NoScript."
-msgstr ""
+msgstr "Jag har problem med NoScript."
#: https//support.torproject.org/tbb/tbb-25/
#: (content/tbb/tbb-25/contents+en.lrquestion.description)
@@ -1854,7 +1869,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-26/
#: (content/tbb/tbb-26/contents+en.lrquestion.title)
msgid "I'm having a problem with HTTPS Everywhere."
-msgstr ""
+msgstr "Jag har problem med HTTPS Everywhere."
#: https//support.torproject.org/tbb/tbb-26/
#: (content/tbb/tbb-26/contents+en.lrquestion.description)
@@ -1866,7 +1881,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-27/
#: (content/tbb/tbb-27/contents+en.lrquestion.title)
msgid "How do I update Tor Browser?"
-msgstr ""
+msgstr "Hur uppdaterar jag Tor Browser?"
#: https//support.torproject.org/tbb/tbb-27/
#: (content/tbb/tbb-27/contents+en.lrquestion.description)
@@ -1878,7 +1893,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-28/
#: (content/tbb/tbb-28/contents+en.lrquestion.title)
msgid "How do I uninstall Tor Browser?"
-msgstr ""
+msgstr "Hur avinstallerar jag Tor Browser?"
#: https//support.torproject.org/tbb/tbb-28/
#: (content/tbb/tbb-28/contents+en.lrquestion.description)
@@ -1893,6 +1908,8 @@ msgid ""
"Is there a way to change the IP address that Tor Browser assigns me for a "
"particular site?"
msgstr ""
+"Finns det ett sätt att ändra IP-adressen som Tor Browser tilldelar mig för "
+"en viss webbplats?"
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1900,6 +1917,8 @@ msgid ""
"Tor Browser has two ways to change your relay circuit — \"New Identity\" and"
" \"New Tor Circuit for this Site\"."
msgstr ""
+"Tor Browser har två sätt att ändra din reläkrets - \"Ny identitet\" och \"Ny"
+" Tor-krets för den här webbplatsen\"."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1917,7 +1936,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
msgid "##### New Identity"
-msgstr ""
+msgstr "##### Ny Identitet"
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1925,6 +1944,8 @@ msgid ""
"This option is useful if you want to prevent your subsequent browser "
"activity from being linkable to what you were doing before."
msgstr ""
+"Det här alternativet är användbart om du vill förhindra att din "
+"efterföljande webbläsaraktivitet är länkbar till vad du gjorde tidigare."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1933,6 +1954,9 @@ msgid ""
"information such as cookies and browsing history, and use new Tor circuits "
"for all connections."
msgstr ""
+"Om du väljer det stänger du alla dina flikar och fönster, rensar all privat "
+"information som kakor och webbhistorik och använder nya Tor-kretsar för alla"
+" anslutningar."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1940,6 +1964,8 @@ msgid ""
"Tor Browser will warn you that all activity and downloads will be stopped, "
"so take this into account before clicking \"New Identity\"."
msgstr ""
+"Tor Browser kommer att varna dig att all aktivitet och hämtningar kommer att"
+" stoppas, så ta hänsyn till detta innan du klickar på \"Ny identitet\"."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1949,7 +1975,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
msgid "##### New Tor Circuit for this Site"
-msgstr ""
+msgstr "##### Ny Tor-krets för denna webbplats"
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1971,6 +1997,8 @@ msgid ""
"Other open tabs and windows from the same website will use the new circuit "
"as well once they are reloaded."
msgstr ""
+"Andra öppna flikar och fönster från samma webbplats kommer att använda den "
+"nya kretsen också när de uppdateras."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1978,6 +2006,9 @@ msgid ""
"This option does not clear any private information or unlink your activity, "
"nor does it affect your current connections to other websites."
msgstr ""
+"Det här alternativet rensar inte någon privat information eller kopplar bort"
+" din aktivitet, och det påverkar inte dina nuvarande anslutningar till andra"
+" webbplatser."
#: https//support.torproject.org/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1990,6 +2021,8 @@ msgid ""
"A website (bank, email provider, etc..) locks me out whenever I use Tor, "
"what can I do?"
msgstr ""
+"En webbplats (bank, e-postleverantör, o.s.v...) låser mig när jag använder "
+"Tor, vad kan jag göra?"
#: https//support.torproject.org/tbb/tbb-30/
#: (content/tbb/tbb-30/contents+en.lrquestion.description)
@@ -2012,6 +2045,9 @@ msgid ""
"procedure for account recovery, or contacting the operators and explaining "
"the situation."
msgstr ""
+"Det enda sättet att lösa detta är genom att följa webbplatsens "
+"rekommenderade förfarande för kontoåterställning, eller kontakta "
+"operatörerna och förklara situationen."
#: https//support.torproject.org/tbb/tbb-30/
#: (content/tbb/tbb-30/contents+en.lrquestion.description)
@@ -2029,7 +2065,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-32/
#: (content/tbb/tbb-32/contents+en.lrquestion.title)
msgid "Can I set Tor Browser as my default browser?"
-msgstr ""
+msgstr "Kan jag ange Tor Browser som standardwebbläsare?"
#: https//support.torproject.org/tbb/tbb-32/
#: (content/tbb/tbb-32/contents+en.lrquestion.description)
@@ -2056,7 +2092,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-33/
#: (content/tbb/tbb-33/contents+en.lrquestion.title)
msgid "Does running Tor Browser make me a relay?"
-msgstr ""
+msgstr "Gör körning av Tor Browser mig ett relä?"
#: https//support.torproject.org/tbb/tbb-33/
#: (content/tbb/tbb-33/contents+en.lrquestion.description)
@@ -2068,6 +2104,7 @@ msgstr ""
msgid ""
"This means that your computer will not be used to route traffic for others."
msgstr ""
+"Detta innebär att datorn inte kommer att användas som slusstrafik för andra."
#: https//support.torproject.org/tbb/tbb-33/
#: (content/tbb/tbb-33/contents+en.lrquestion.description)
@@ -2148,7 +2185,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-36/
#: (content/tbb/tbb-36/contents+en.lrquestion.title)
msgid "Can I run multiple instances of Tor Browser?"
-msgstr ""
+msgstr "Kan jag köra flera instanser av Tor Browser?"
#: https//support.torproject.org/tbb/tbb-36/
#: (content/tbb/tbb-36/contents+en.lrquestion.description)
@@ -2160,7 +2197,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-37/
#: (content/tbb/tbb-37/contents+en.lrquestion.title)
msgid "I need Tor Browser in a language that's not English."
-msgstr ""
+msgstr "Jag behöver Tor Browser på ett språk som inte är engelska."
#: https//support.torproject.org/tbb/tbb-37/
#: (content/tbb/tbb-37/contents+en.lrquestion.description)
@@ -2185,6 +2222,8 @@ msgstr ""
#: (content/tbb/tbb-38/contents+en.lrquestion.title)
msgid "Will my network admin be able to tell I'm using Tor Browser?"
msgstr ""
+"Kommer min nätverksadministratör att kunna berätta att jag använder Tor "
+"Browser?"
#: https//support.torproject.org/tbb/tbb-38/
#: (content/tbb/tbb-38/contents+en.lrquestion.description)
@@ -2225,12 +2264,13 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-39/
#: (content/tbb/tbb-39/contents+en.lrquestion.description)
msgid "Set your security to \"Standard\"."
-msgstr ""
+msgstr "Ställ in din säkerhet till \"Standard\"."
#: https//support.torproject.org/tbb/tbb-4/
#: (content/tbb/tbb-4/contents+en.lrquestion.title)
msgid "Why is Tor Browser built from Firefox and not some other browser?"
msgstr ""
+"Varför är Tor Browser byggd från Firefox och inte någon annan webbläsare?"
#: https//support.torproject.org/tbb/tbb-4/
#: (content/tbb/tbb-4/contents+en.lrquestion.description)
@@ -2264,7 +2304,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-40/
#: (content/tbb/tbb-40/contents+en.lrquestion.title)
msgid "Does Tor Browser use a different circuit for each website?"
-msgstr ""
+msgstr "Använder Tor Browser en annan krets för varje webbplats?"
#: https//support.torproject.org/tbb/tbb-40/
#: (content/tbb/tbb-40/contents+en.lrquestion.description)
@@ -2282,7 +2322,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-41/
#: (content/tbb/tbb-41/contents+en.lrquestion.title)
msgid "Why did my search engine switch to DuckDuckGo?"
-msgstr ""
+msgstr "Varför byttes min sökmotor till DuckDuckGo?"
#: https//support.torproject.org/tbb/tbb-41/
#: (content/tbb/tbb-41/contents+en.lrquestion.description)
@@ -2290,6 +2330,8 @@ msgid ""
"With the release of Tor Browser 6.0.6, we switched to DuckDuckGo as the "
"primary search engine."
msgstr ""
+"Med lanseringen av Tor Browser 6.0.6 bytte vi till DuckDuckGo som den "
+"primära sökmotorn."
#: https//support.torproject.org/tbb/tbb-41/
#: (content/tbb/tbb-41/contents+en.lrquestion.description)
@@ -2309,7 +2351,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-42/
#: (content/tbb/tbb-42/contents+en.lrquestion.title)
msgid "Why does my Tor Browser say something about Firefox not working?"
-msgstr ""
+msgstr "Varför säger Min Tor Browser något om att Firefox inte fungerar?"
#: https//support.torproject.org/tbb/tbb-42/
#: (content/tbb/tbb-42/contents+en.lrquestion.description)
@@ -2573,6 +2615,7 @@ msgstr ""
msgid ""
"You can certainly use another browser while you are also using Tor Browser."
msgstr ""
+"Du kan använda en annan webbläsare medan du också använder Tor Browser."
#: https//support.torproject.org/tbb/tbb-5/
#: (content/tbb/tbb-5/contents+en.lrquestion.description)
@@ -2592,7 +2635,7 @@ msgstr ""
#: https//support.torproject.org/tbb/tbb-9/
#: (content/tbb/tbb-9/contents+en.lrquestion.title)
msgid "Can I use Tor with a browser besides Tor Browser?"
-msgstr ""
+msgstr "Kan jag använda Tor med en webbläsare förutom Tor Browser?"
#: https//support.torproject.org/tbb/tbb-9/
#: (content/tbb/tbb-9/contents+en.lrquestion.description)
@@ -2872,6 +2915,8 @@ msgstr "Hur kör jag Tor på Windows Phone?"
msgid ""
"There is currently no supported method for running Tor on Windows Phone."
msgstr ""
+"Det finns för närvarande ingen metod som stöds för att köra Tor på Windows "
+"Phone."
#: https//support.torproject.org/tormobile/tormobile-5/
#: (content/tormobile/tormobile-5/contents+en.lrquestion.title)
@@ -3033,6 +3078,9 @@ msgid ""
"depends on the model of the computer you are using; consult documentation "
"about your computer to find out more."
msgstr ""
+"Du kan erbjudas ett val av \"32-bitars\" eller \"64-bitars\" programvara: "
+"Detta beror på vilken modell av datorn du använder; konsultera dokumentation"
+" om din dator för att ta reda på mer."
#: https//support.torproject.org/gettor/gettor-3/
#: (content/gettor/gettor-3/contents+en.lrquestion.title)
@@ -3057,6 +3105,8 @@ msgid ""
"To get links for downloading Tor Browser, send a message to "
"gettor(a)torproject.org with one of the following codes in it:"
msgstr ""
+"För att få länkar för att hämta Tor Browser, skicka ett meddelande till "
+"gettor(a)torproject.org med en av följande koder i det:"
#: https//support.torproject.org/gettor/gettor-4/
#: (content/gettor/gettor-4/contents+en.lrquestion.description)
@@ -3071,7 +3121,7 @@ msgstr ""
#: https//support.torproject.org/gettor/gettor-4/
#: (content/gettor/gettor-4/contents+en.lrquestion.description)
msgid "* Windows"
-msgstr ""
+msgstr "* Windows"
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.title)
@@ -3193,7 +3243,7 @@ msgstr ""
#: https//support.torproject.org/censorship/censorship-5/
#: (content/censorship/censorship-5/contents+en.lrquestion.description)
msgid "##### Common log error #2: Can’t reach guard relays"
-msgstr ""
+msgstr "##### Vanligt loggfel #2: Kan inte nå vaktreläer"
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
@@ -3267,7 +3317,7 @@ msgstr ""
#: https//support.torproject.org/censorship/censorship-5/
#: (content/censorship/censorship-5/contents+en.lrquestion.description)
msgid "##### Common log error #3: Failed to complete TLS handshake"
-msgstr ""
+msgstr "##### Vanligt loggfel #3: Misslyckades med att slutföra TLS-handslag"
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
@@ -3321,20 +3371,22 @@ msgid ""
"If you see lines like this in your Tor log, it means that Tor failed to "
"complete a TLS handshake with the directory authorities."
msgstr ""
+"Om du ser rader som detta i din Tor-logg betyder det att Tor misslyckades "
+"med att slutföra ett TLS-handslag med katalogmyndigheterna."
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
#: https//support.torproject.org/censorship/censorship-5/
#: (content/censorship/censorship-5/contents+en.lrquestion.description)
msgid "Using bridges will likely fix this."
-msgstr ""
+msgstr "Att använda broar kommer sannolikt att fixa detta."
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
#: https//support.torproject.org/censorship/censorship-5/
#: (content/censorship/censorship-5/contents+en.lrquestion.description)
msgid "##### Common log error #4: Clock skew"
-msgstr ""
+msgstr "##### Vanligt loggfel #4: Klockan skev"
#: https//support.torproject.org/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
@@ -3439,7 +3491,7 @@ msgstr ""
#: https//support.torproject.org/censorship/censorship-2/
#: (content/censorship/censorship-2/contents+en.lrquestion.title)
msgid "A website I am trying to reach is blocking access over Tor."
-msgstr ""
+msgstr "En webbplats som jag försöker nå blockerar åtkomst över Tor."
#: https//support.torproject.org/censorship/censorship-2/
#: (content/censorship/censorship-2/contents+en.lrquestion.description)
@@ -3499,6 +3551,10 @@ msgid ""
"relay on the other side of the world, your account may be locked or "
"suspended)."
msgstr ""
+"När det gäller banker och andra känsliga webbplatser är det också vanligt "
+"att se geografibaserad blockering (om en bank vet att du i allmänhet får "
+"tillgång till sina tjänster från ett land och plötsligt ansluter du från ett"
+" exit-relä på andra sidan världen kan ditt konto låsas eller stängas)."
#: https//support.torproject.org/censorship/censorship-2/
#: (content/censorship/censorship-2/contents+en.lrquestion.description)
@@ -3510,7 +3566,7 @@ msgstr ""
#: https//support.torproject.org/censorship/censorship-7/
#: (content/censorship/censorship-7/contents+en.lrquestion.title)
msgid "What is a bridge?"
-msgstr ""
+msgstr "Vad är en bro?"
#: https//support.torproject.org/censorship/censorship-7/
#: (content/censorship/censorship-7/contents+en.lrquestion.description)
@@ -3568,6 +3624,8 @@ msgid ""
"Setting up an obfsproxy bridge requires an additional software package and "
"additional configurations."
msgstr ""
+"Ställa in en obfsproxy-bro kräver ytterligare ett programpaket och "
+"ytterligare konfigurationer."
#: https//support.torproject.org/censorship/censorship-7/
#: (content/censorship/censorship-7/contents+en.lrquestion.description)
@@ -3605,6 +3663,8 @@ msgid ""
"If the site you are visiting uses HTTPS, then the traffic leaving your exit "
"relay will be encrypted, and won't be visible to eavesdroppers."
msgstr ""
+"Om webbplatsen du besöker använder HTTPS kommer trafiken som lämnar ditt "
+"exit-relä att krypteras och kommer inte att vara synlig för avlyssnare."
#: https//support.torproject.org/https/https-1/
#: (content/https/https-1/contents+en.lrquestion.description)
@@ -4435,7 +4495,7 @@ msgstr ""
#: https//support.torproject.org/operators/operators-1/
#: (content/operators/operators-1/contents+en.lrquestion.title)
msgid "How do I run a middle or guard relay on Debian?"
-msgstr ""
+msgstr "Hur kör jag en mellan- -eller vaktrelä på Debian?"
#: https//support.torproject.org/operators/operators-1/
#: (content/operators/operators-1/contents+en.lrquestion.description)
@@ -4451,7 +4511,7 @@ msgstr ""
#: https//support.torproject.org/operators/operators-2/
#: (content/operators/operators-2/contents+en.lrquestion.title)
msgid "How do I run an exit relay on Debian?"
-msgstr ""
+msgstr "Hur kör jag ett exit-relä på Debian?"
#: https//support.torproject.org/operators/operators-3/
#: (content/operators/operators-3/contents+en.lrquestion.title)
@@ -4461,7 +4521,7 @@ msgstr "Hur kör jag en mellan- eller vaktrelä på FreeBSD eller HardenedBSD?"
#: https//support.torproject.org/operators/operators-4/
#: (content/operators/operators-4/contents+en.lrquestion.title)
msgid "How do I make sure that I'm using the correct packages on Ubuntu?"
-msgstr ""
+msgstr "Hur ser jag till att jag använder rätt paket på Ubuntu?"
#: https//support.torproject.org/operators/operators-4/
#: (content/operators/operators-4/contents+en.lrquestion.description)
@@ -4517,6 +4577,8 @@ msgstr ""
#: (content/operators/operators-4/contents+en.lrquestion.description)
msgid "* Run the following commands to install tor and check its signatures:"
msgstr ""
+"* Kör följande kommandon för att installera Tor och kontrollera dess "
+"signaturer:"
#: https//support.torproject.org/operators/operators-4/
#: (content/operators/operators-4/contents+en.lrquestion.description)
@@ -4544,7 +4606,7 @@ msgstr ""
#: https//support.torproject.org/operators/operators-7/
#: (content/operators/operators-7/contents+en.lrquestion.title)
msgid "Should I run an exit relay from home?"
-msgstr ""
+msgstr "Ska jag köra ett exit-relä hemifrån?"
#: https//support.torproject.org/operators/operators-7/
#: (content/operators/operators-7/contents+en.lrquestion.description)
@@ -4578,6 +4640,8 @@ msgid ""
"Have a separate IP address for your exit relay, and don't route your own "
"traffic through it."
msgstr ""
+"Ha en separat IP-adress för din exit-relä och dirigera inte din egen trafik "
+"genom det."
#: https//support.torproject.org/operators/operators-7/
#: (content/operators/operators-7/contents+en.lrquestion.description)
@@ -5099,6 +5163,8 @@ msgid ""
"I've heard about websites that are only accessible over Tor. What are these "
"websites, and how can I access them?"
msgstr ""
+"Jag har hört talas om webbplatser som endast är tillgängliga över Tor. Vad "
+"är dessa webbplatser, och hur kan jag komma åt dem?"
#: https//support.torproject.org/onionservices/onionservices-1/
#: (content/onionservices/onionservices-1/contents+en.lrquestion.description)
@@ -5129,7 +5195,7 @@ msgstr ""
#: https//support.torproject.org/onionservices/onionservices-2/
#: (content/onionservices/onionservices-2/contents+en.lrquestion.title)
msgid "What is a .onion or what are onion services?"
-msgstr ""
+msgstr "Vad är en .onion eller vad är onion-tjänster?"
#: https//support.torproject.org/onionservices/onionservices-2/
#: (content/onionservices/onionservices-2/contents+en.lrquestion.description)
@@ -5137,6 +5203,8 @@ msgid ""
"Onion services allow people to browse but also to publish anonymously, "
"including publishing anonymous websites."
msgstr ""
+"Onion-tjänster tillåter människor att bläddra men också att publicera "
+"anonymt, inklusive publicera anonyma webbplatser."
#: https//support.torproject.org/onionservices/onionservices-2/
#: (content/onionservices/onionservices-2/contents+en.lrquestion.description)
@@ -5164,6 +5232,9 @@ msgid ""
"at the URL bar an icon of a little green onion displaying the state of your "
"connection: secure and using an onion service."
msgstr ""
+"När du öppnar en webbplats som använder en onion-tjänst, visar Tor Browser i"
+" webbadressfältet en ikon för en liten grön lök som visar tillståndet för "
+"din anslutning: säker och använder en onion-tjänst."
#: https//support.torproject.org/onionservices/onionservices-2/
#: (content/onionservices/onionservices-2/contents+en.lrquestion.description)
@@ -7315,6 +7386,7 @@ msgstr ""
#: (content/misc/misc-1/contents+en.lrquestion.title)
msgid "I have a compelling reason to trace a Tor user. Can you help?"
msgstr ""
+"Jag har en tvingande anledning att spåra en Tor-användare. Kan du hjälpa?"
#: https//support.torproject.org/misc/misc-1/
#: (content/misc/misc-1/contents+en.lrquestion.description)
@@ -7327,21 +7399,23 @@ msgid ""
"The same protections that keep bad people from breaking Tor's anonymity also"
" prevent us from tracking users."
msgstr ""
+"Samma skydd som håller dåliga människor från att bryta Tors anonymitet "
+"hindrar oss också från att spåra användare."
#: https//support.torproject.org/misc/misc-10/
#: (content/misc/misc-10/contents+en.lrquestion.title)
msgid "Does the Tor Project offer hosting?"
-msgstr ""
+msgstr "Erbjuder Tor-projektet hosting?"
#: https//support.torproject.org/misc/misc-10/
#: (content/misc/misc-10/contents+en.lrquestion.description)
msgid "No, the Tor Project does not offer hosting services."
-msgstr ""
+msgstr "Nej, Tor-projektet erbjuder inte hostingtjänster."
#: https//support.torproject.org/misc/misc-11/
#: (content/misc/misc-11/contents+en.lrquestion.title)
msgid "Can I change the number of hops Tor uses?"
-msgstr ""
+msgstr "Kan jag ändra antalet hopp Tor använder?"
#: https//support.torproject.org/misc/misc-11/
#: (content/misc/misc-11/contents+en.lrquestion.description)
@@ -7349,6 +7423,8 @@ msgid ""
"Right now the path length is hard-coded at 3 plus the number of nodes in "
"your path that are sensitive."
msgstr ""
+"Just nu är sökvägslängden hårdkodad vid 3 plus antalet noder i din sökväg "
+"som är känsliga."
#: https//support.torproject.org/misc/misc-11/
#: (content/misc/misc-11/contents+en.lrquestion.description)
@@ -7377,7 +7453,7 @@ msgstr ""
#: https//support.torproject.org/misc/misc-12/
#: (content/misc/misc-12/contents+en.lrquestion.title)
msgid "How can I share files anonymously through Tor?"
-msgstr ""
+msgstr "Hur kan jag dela filer anonymt genom tor?"
#: https//support.torproject.org/misc/misc-12/
#: (content/misc/misc-12/contents+en.lrquestion.description)
@@ -7461,7 +7537,7 @@ msgstr ""
#: https//support.torproject.org/misc/misc-15/
#: (content/misc/misc-15/contents+en.lrquestion.title)
msgid "How can I donate to Tor Project?"
-msgstr ""
+msgstr "Hur kan jag donera till Tor-projektet?"
#: https//support.torproject.org/misc/misc-15/
#: (content/misc/misc-15/contents+en.lrquestion.description)
@@ -7479,6 +7555,8 @@ msgstr ""
#: (content/misc/misc-2/contents+en.lrquestion.title)
msgid "Why don't you prevent bad people from doing bad things when using Tor?"
msgstr ""
+"Varför hindrar du inte dåliga människor från att göra dåliga saker när du "
+"använder Tor?"
#: https//support.torproject.org/misc/misc-2/
#: (content/misc/misc-2/contents+en.lrquestion.description)
@@ -7507,7 +7585,7 @@ msgstr ""
#: https//support.torproject.org/misc/misc-3/
#: (content/misc/misc-3/contents+en.lrquestion.title)
msgid "Who funds Tor?"
-msgstr ""
+msgstr "Vem finansierar Tor?"
#: https//support.torproject.org/misc/misc-3/
#: (content/misc/misc-3/contents+en.lrquestion.description)
@@ -7542,7 +7620,7 @@ msgstr ""
#: https//support.torproject.org/misc/misc-4/
#: (content/misc/misc-4/contents+en.lrquestion.title)
msgid "Can I use Tor with BitTorrent?"
-msgstr ""
+msgstr "Kan jag använda Tor med BitTorrent?"
#: https//support.torproject.org/misc/misc-4/
#: (content/misc/misc-4/contents+en.lrquestion.description)
@@ -7562,6 +7640,8 @@ msgid ""
"The files on my computer have been locked, and someone is demanding I "
"download Tor Browser to pay a ransom for my files!"
msgstr ""
+"Filerna på min dator har låsts, och någon kräver att jag hämtar Tor Browser "
+"för att betala en lösensumma för mina filer!"
#: https//support.torproject.org/misc/misc-5/
#: (content/misc/misc-5/contents+en.lrquestion.description)
@@ -7603,12 +7683,12 @@ msgstr ""
#: https//support.torproject.org/misc/misc-6/
#: (content/misc/misc-6/contents+en.lrquestion.title)
msgid "Does Tor keep logs?"
-msgstr ""
+msgstr "Sparar Tor loggar?"
#: https//support.torproject.org/misc/misc-6/
#: (content/misc/misc-6/contents+en.lrquestion.description)
msgid "Tor doesn't keep any logs that could identify a particular user."
-msgstr ""
+msgstr "Tor sparar inte några loggar som kan identifiera en viss användare."
#: https//support.torproject.org/misc/misc-6/
#: (content/misc/misc-6/contents+en.lrquestion.description)
@@ -7623,6 +7703,8 @@ msgid ""
"Does Tor Project offer email service or other privacy protecting web "
"services?"
msgstr ""
+"Erbjuder Tor-projektet e-posttjänst eller annan integritetsskyddande "
+"webbtjänster?"
#: https//support.torproject.org/misc/misc-7/
#: (content/misc/misc-7/contents+en.lrquestion.description)
@@ -7639,7 +7721,7 @@ msgstr ""
#: https//support.torproject.org/misc/misc-8/
#: (content/misc/misc-8/contents+en.lrquestion.title)
msgid "Can I use the Tor logo in my product?"
-msgstr ""
+msgstr "Kan jag använda Tor-logotypen i min produkt?"
#: https//support.torproject.org/misc/misc-8/
#: (content/misc/misc-8/contents+en.lrquestion.description)
@@ -7651,12 +7733,12 @@ msgstr ""
#: https//support.torproject.org/misc/misc-9/
#: (content/misc/misc-9/contents+en.lrquestion.title)
msgid "I'm having a problem updating or using Vidalia."
-msgstr ""
+msgstr "Jag har problem med att uppdatera eller använda Vidalia."
#: https//support.torproject.org/misc/misc-9/
#: (content/misc/misc-9/contents+en.lrquestion.description)
msgid "Vidalia is no longer maintained or supported."
-msgstr ""
+msgstr "Vidalia underhålls inte längre eller stöds."
#: https//support.torproject.org/misc/misc-9/
#: (content/misc/misc-9/contents+en.lrquestion.description)
[View Less]
1
0

[translation/support-portal] https://gitweb.torproject.org/translation.git/commit/?h=support-portal
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit 315f5b78a77bba81250dbff01d3497309a4e81c3
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 11:53:36 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=support-portal
---
contents+sv.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/contents+sv.po b/contents+sv.po
index 5735493606..09f63c5e85 100644
--- a/contents+sv.po
+++ b/contents+sv.po
@@ -1,6 +1,6 @@
# Translators:
# erinm, 2019
-# Jonatan Nyberg,…
[View More] 2019
+# Jonatan Nyberg, 2020
#
msgid ""
msgstr ""
@@ -8,7 +8,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2020-01-20 16:43+CET\n"
"PO-Revision-Date: 2018-10-02 22:41+0000\n"
-"Last-Translator: Jonatan Nyberg, 2019\n"
+"Last-Translator: Jonatan Nyberg, 2020\n"
"Language-Team: Swedish (https://www.transifex.com/otf/teams/1519/sv/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -4456,7 +4456,7 @@ msgstr ""
#: https//support.torproject.org/operators/operators-3/
#: (content/operators/operators-3/contents+en.lrquestion.title)
msgid "How do I run a middle or guard relay on FreeBSD or HardenedBSD?"
-msgstr ""
+msgstr "Hur kör jag en mellan- eller vaktrelä på FreeBSD eller HardenedBSD?"
#: https//support.torproject.org/operators/operators-4/
#: (content/operators/operators-4/contents+en.lrquestion.title)
[View Less]
1
0

[stem/master] Drop undocumented 'encoded' attribute from certificates
by atagar@torproject.org 18 Feb '20
by atagar@torproject.org 18 Feb '20
18 Feb '20
commit 657b8acf95c83ec3836039bf1844d9e55c607956
Author: Damian Johnson <atagar(a)torproject.org>
Date: Mon Feb 17 16:42:27 2020 -0800
Drop undocumented 'encoded' attribute from certificates
When an Ed25519Certificate was created through from_base64() we appended an
undocumented 'encoded' attribute with the base64 content we were created from.
Our to_base64() method computes the exact same thing.
This attribute was only used in a single place for server …
[View More]descriptor
validation.
If 'encoded' and to_base64() mismatches that is a bug. Fiddling with these I
cound't come up with a scenario where that is a case, so dropping the redundant
attribute.
Also merging _validate_server_desc_signing_key() into its sole caller.
---
stem/descriptor/certificate.py | 44 +++++++++++++------------------
test/unit/descriptor/certificate.py | 7 +++--
test/unit/descriptor/server_descriptor.py | 2 +-
3 files changed, 23 insertions(+), 30 deletions(-)
diff --git a/stem/descriptor/certificate.py b/stem/descriptor/certificate.py
index d7c0743d..ae2d6636 100644
--- a/stem/descriptor/certificate.py
+++ b/stem/descriptor/certificate.py
@@ -6,8 +6,8 @@ Parsing for `Tor Ed25519 certificates
<https://gitweb.torproject.org/torspec.git/tree/cert-spec.txt>`_, which are
used to for a variety of purposes...
- * validating the key used to sign server descriptors
- * validating the key used to sign hidden service v3 descriptors
+ * validate the signing key of server descriptors
+ * validate the signing key of hidden service v3 descriptors
* signing and encrypting hidden service v3 indroductory points
.. versionadded:: 1.6.0
@@ -185,9 +185,7 @@ class Ed25519Certificate(object):
if not decoded:
raise TypeError('empty')
- instance = Ed25519Certificate.unpack(decoded)
- instance.encoded = content
- return instance
+ return Ed25519Certificate.unpack(decoded)
except (TypeError, binascii.Error) as exc:
raise ValueError("Ed25519 certificate wasn't propoerly base64 encoded (%s):\n%s" % (exc, content))
@@ -236,7 +234,7 @@ class Ed25519Certificate(object):
class Ed25519CertificateV1(Ed25519Certificate):
"""
- Version 1 Ed25519 certificate, which are used for signing tor server
+ Version 1 Ed25519 certificate, which sign tor server and hidden service v3
descriptors.
:var stem.client.datatype.CertType type: certificate purpose
@@ -381,7 +379,21 @@ class Ed25519CertificateV1(Ed25519Certificate):
signed_content = hashlib.sha256(Ed25519CertificateV1._signed_content(descriptor)).digest()
signature = stem.util.str_tools._decode_b64(descriptor.ed25519_signature)
- self._validate_server_desc_signing_key(descriptor)
+ # verify that we're created from this descriptor's signing key
+
+ if descriptor.ed25519_master_key:
+ signing_key = base64.b64decode(stem.util.str_tools._to_bytes(descriptor.ed25519_master_key) + b'=')
+ else:
+ signing_key = self.signing_key()
+
+ if not signing_key:
+ raise ValueError('Server descriptor missing an ed25519 signing key')
+
+ try:
+ key = Ed25519PublicKey.from_public_bytes(signing_key)
+ key.verify(self.signature, base64.b64decode(stem.util.str_tools._to_bytes(self.to_base64()))[:-ED25519_SIGNATURE_LENGTH])
+ except InvalidSignature:
+ raise ValueError('Ed25519KeyCertificate signing key is invalid (signature forged or corrupt)')
elif isinstance(descriptor, stem.descriptor.hidden_service.HiddenServiceDescriptorV3):
signed_content = Ed25519CertificateV1._signed_content(descriptor)
signature = stem.util.str_tools._decode_b64(descriptor.signature)
@@ -418,21 +430,3 @@ class Ed25519CertificateV1(Ed25519Certificate):
raise ValueError('Malformed descriptor missing signature line')
return prefix + match.group(1)
-
- def _validate_server_desc_signing_key(self, descriptor):
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
- from cryptography.exceptions import InvalidSignature
-
- if descriptor.ed25519_master_key:
- signing_key = base64.b64decode(stem.util.str_tools._to_bytes(descriptor.ed25519_master_key) + b'=')
- else:
- signing_key = self.signing_key()
-
- if not signing_key:
- raise ValueError('Server descriptor missing an ed25519 signing key')
-
- try:
- key = Ed25519PublicKey.from_public_bytes(signing_key)
- key.verify(self.signature, base64.b64decode(stem.util.str_tools._to_bytes(self.encoded))[:-ED25519_SIGNATURE_LENGTH])
- except InvalidSignature:
- raise ValueError('Ed25519KeyCertificate signing key is invalid (signature forged or corrupt)')
diff --git a/test/unit/descriptor/certificate.py b/test/unit/descriptor/certificate.py
index 9e29556a..000de2de 100644
--- a/test/unit/descriptor/certificate.py
+++ b/test/unit/descriptor/certificate.py
@@ -58,7 +58,7 @@ class TestEd25519Certificate(unittest.TestCase):
self.assertEqual(Ed25519CertificateV1, type(cert))
self.assertEqual(1, cert.version)
- self.assertEqual(stem.util.str_tools._to_unicode(cert_bytes), cert.encoded)
+ self.assertEqual(stem.util.str_tools._to_unicode(cert_bytes), cert.to_base64().replace('\n', ''))
self.assertEqual(CertType.ED25519_SIGNING, cert.type)
self.assertEqual(datetime.datetime(1970, 1, 1, 0, 0), cert.expiration)
self.assertEqual(1, cert.key_type)
@@ -82,7 +82,7 @@ class TestEd25519Certificate(unittest.TestCase):
self.assertEqual(Ed25519CertificateV1, type(cert))
self.assertEqual(1, cert.version)
- self.assertEqual(ED25519_CERT, cert.encoded)
+ self.assertEqual(ED25519_CERT, cert.to_base64())
self.assertEqual(CertType.ED25519_SIGNING, cert.type)
self.assertEqual(datetime.datetime(2015, 8, 28, 17, 0), cert.expiration)
self.assertEqual(1, cert.key_type)
@@ -109,8 +109,7 @@ class TestEd25519Certificate(unittest.TestCase):
"""
cert = Ed25519Certificate.from_base64(ED25519_CERT)
- self.assertEqual(ED25519_CERT, cert.encoded) # read base64 encoding (getting removed in stem 2.x)
- self.assertEqual(ED25519_CERT, cert.to_base64()) # computed base64 encoding
+ self.assertEqual(ED25519_CERT, cert.to_base64())
def test_non_base64(self):
"""
diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py
index e1036ada..07f50013 100644
--- a/test/unit/descriptor/server_descriptor.py
+++ b/test/unit/descriptor/server_descriptor.py
@@ -355,7 +355,7 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
self.assertTrue(desc.certificate.key.startswith(b'\xa5\xb6\x1a\x80D\x0f'))
self.assertTrue(desc.certificate.signature.startswith(b'\xc6\x8e\xd3\xae\x0b'))
self.assertEqual(1, len(desc.certificate.extensions))
- self.assertTrue('bWPo2fIzo3uOywfoM' in desc.certificate.encoded)
+ self.assertTrue('bWPo2fIzo3uOywfoM' in desc.certificate.to_base64())
extension = desc.certificate.extensions[0]
self.assertEqual(ExtensionType.HAS_SIGNING_KEY, extension.type)
[View Less]
1
0
commit 75403ace36d39bc003955e5aec91b53c66c2e472
Author: Damian Johnson <atagar(a)torproject.org>
Date: Sun Feb 16 17:19:52 2020 -0800
Replace stem.prereq module
Our prereq module provides dependency checks, mostly for python versioning
(now moot) and the cryptography module.
It is not only cleaner but less error prone to perform dependency checks down
where their imports are performed rather than upfront. This way import changes
can't fall out of sync …
[View More]with our upfront checks.
---
run_tests.py | 9 +-
stem/__init__.py | 1 -
stem/client/__init__.py | 8 +-
stem/client/datatype.py | 1 -
stem/descriptor/__init__.py | 36 +++---
stem/descriptor/certificate.py | 9 +-
stem/descriptor/extrainfo_descriptor.py | 1 -
stem/descriptor/hidden_service.py | 115 +++++++++----------
stem/descriptor/microdescriptor.py | 1 -
stem/descriptor/remote.py | 13 ++-
stem/descriptor/router_status_entry.py | 1 -
stem/descriptor/server_descriptor.py | 27 +++--
stem/exit_policy.py | 1 -
stem/interpreter/__init__.py | 1 -
stem/interpreter/autocomplete.py | 2 -
stem/interpreter/help.py | 2 -
stem/manual.py | 22 ++--
stem/prereq.py | 179 ------------------------------
stem/process.py | 1 -
stem/response/events.py | 1 -
stem/response/protocolinfo.py | 1 -
stem/socket.py | 1 -
stem/util/__init__.py | 16 +--
stem/util/conf.py | 2 -
stem/util/log.py | 1 -
stem/util/proc.py | 1 -
stem/util/str_tools.py | 1 -
stem/util/system.py | 3 +-
stem/util/test_tools.py | 1 -
stem/version.py | 1 -
test/integ/installation.py | 4 +-
test/integ/process.py | 1 -
test/integ/util/system.py | 4 +-
test/integ/version.py | 1 -
test/require.py | 20 +++-
test/runner.py | 1 -
test/settings.cfg | 24 ----
test/task.py | 4 +-
test/unit/descriptor/certificate.py | 7 +-
test/unit/descriptor/collector.py | 2 +-
test/unit/descriptor/hidden_service_v2.py | 1 -
test/unit/descriptor/hidden_service_v3.py | 36 ++----
test/unit/descriptor/remote.py | 23 +---
test/unit/descriptor/server_descriptor.py | 13 ---
test/unit/directory/authority.py | 1 -
test/unit/manual.py | 1 -
test/unit/tutorial.py | 1 -
test/unit/tutorial_examples.py | 1 -
test/unit/util/system.py | 5 +-
49 files changed, 172 insertions(+), 437 deletions(-)
diff --git a/run_tests.py b/run_tests.py
index 16fbe267..c9196e18 100755
--- a/run_tests.py
+++ b/run_tests.py
@@ -21,7 +21,6 @@ import time
import traceback
import unittest
-import stem.prereq
import stem.util.conf
import stem.util.log
import stem.util.system
@@ -179,10 +178,10 @@ def _get_tests(modules, module_prefixes, exclude):
def main():
start_time = time.time()
- try:
- stem.prereq.check_requirements()
- except ImportError as exc:
- println('%s\n' % exc)
+ major_version, minor_version = sys.version_info[0:2]
+
+ if major_version < 3 or (major_version == 3 and minor_version < 6):
+ println('stem requires python version 3.6 or greater\n')
sys.exit(1)
signal.signal(signal.SIGABRT, log_traceback)
diff --git a/stem/__init__.py b/stem/__init__.py
index 3600e920..907156fe 100644
--- a/stem/__init__.py
+++ b/stem/__init__.py
@@ -522,7 +522,6 @@ __all__ = [
'control',
'directory',
'exit_policy',
- 'prereq',
'process',
'socket',
'version',
diff --git a/stem/client/__init__.py b/stem/client/__init__.py
index 2abeac88..7456726a 100644
--- a/stem/client/__init__.py
+++ b/stem/client/__init__.py
@@ -303,12 +303,12 @@ class Circuit(object):
"""
def __init__(self, relay, circ_id, kdf):
- if not stem.prereq.is_crypto_available():
+ try:
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
+ from cryptography.hazmat.backends import default_backend
+ except ImportError:
raise ImportError('Circuit construction requires the cryptography module')
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
- from cryptography.hazmat.backends import default_backend
-
ctr = modes.CTR(ZERO * (algorithms.AES.block_size // 8))
self.relay = relay
diff --git a/stem/client/datatype.py b/stem/client/datatype.py
index 1db46a28..4f7110e9 100644
--- a/stem/client/datatype.py
+++ b/stem/client/datatype.py
@@ -140,7 +140,6 @@ import collections
import hashlib
import stem.client.cell
-import stem.prereq
import stem.util
import stem.util.connection
import stem.util.enum
diff --git a/stem/descriptor/__init__.py b/stem/descriptor/__init__.py
index 556970c3..ff273405 100644
--- a/stem/descriptor/__init__.py
+++ b/stem/descriptor/__init__.py
@@ -115,7 +115,6 @@ import re
import string
import tarfile
-import stem.prereq
import stem.util
import stem.util.enum
import stem.util.str_tools
@@ -205,6 +204,13 @@ class _Compression(object):
try:
self._module = __import__(module)
self.available = True
+
+ # Unfortunately the zstandard module uses the same namespace as another
+ # zstd module (https://pypi.org/project/zstd/) so we need to
+ # differentiate them.
+
+ if module == 'zstd' and not hasattr(self._module, 'ZstdDecompressor'):
+ raise ImportError()
except ImportError:
self._module = None
self.available = False
@@ -1033,13 +1039,13 @@ class Descriptor(object):
:raises: ValueError if unable to provide a validly signed digest
"""
- if not stem.prereq.is_crypto_available():
+ try:
+ from cryptography.hazmat.backends import default_backend
+ from cryptography.hazmat.primitives.serialization import load_der_public_key
+ from cryptography.utils import int_to_bytes, int_from_bytes
+ except ImportError:
raise ValueError('Generating the signed digest requires the cryptography module')
- from cryptography.hazmat.backends import default_backend
- from cryptography.hazmat.primitives.serialization import load_der_public_key
- from cryptography.utils import int_to_bytes, int_from_bytes
-
key = load_der_public_key(_bytes_for_block(signing_key), default_backend())
modulus = key.public_numbers().n
public_exponent = key.public_numbers().e
@@ -1334,13 +1340,13 @@ def create_signing_key(private_key = None):
:raises: **ImportError** if the cryptography module is unavailable
"""
- if not stem.prereq.is_crypto_available():
+ try:
+ from cryptography.hazmat.backends import default_backend
+ from cryptography.hazmat.primitives import serialization
+ from cryptography.hazmat.primitives.asymmetric import rsa
+ except ImportError:
raise ImportError('Signing requires the cryptography module')
- from cryptography.hazmat.backends import default_backend
- from cryptography.hazmat.primitives import serialization
- from cryptography.hazmat.primitives.asymmetric import rsa
-
if private_key is None:
private_key = rsa.generate_private_key(
public_exponent = 65537,
@@ -1381,12 +1387,12 @@ def _append_router_signature(content, private_key):
:returns: **bytes** with the signed descriptor content
"""
- if not stem.prereq.is_crypto_available():
+ try:
+ from cryptography.hazmat.primitives import hashes
+ from cryptography.hazmat.primitives.asymmetric import padding
+ except ImportError:
raise ImportError('Signing requires the cryptography module')
- from cryptography.hazmat.primitives import hashes
- from cryptography.hazmat.primitives.asymmetric import padding
-
signature = base64.b64encode(private_key.sign(content, padding.PKCS1v15(), hashes.SHA1()))
return content + b'\n'.join([b'-----BEGIN SIGNATURE-----'] + stem.util.str_tools._split_by_length(signature, 64) + [b'-----END SIGNATURE-----\n'])
diff --git a/stem/descriptor/certificate.py b/stem/descriptor/certificate.py
index fed16bac..d7c0743d 100644
--- a/stem/descriptor/certificate.py
+++ b/stem/descriptor/certificate.py
@@ -59,7 +59,6 @@ import hashlib
import re
import stem.descriptor.hidden_service
-import stem.prereq
import stem.util
import stem.util.enum
import stem.util.str_tools
@@ -372,7 +371,10 @@ class Ed25519CertificateV1(Ed25519Certificate):
import stem.descriptor.server_descriptor
- if not stem.prereq.is_crypto_available(ed25519 = True):
+ try:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
+ from cryptography.exceptions import InvalidSignature
+ except ImportError:
raise ImportError('Certificate validation requires the cryptography module and ed25519 support')
if isinstance(descriptor, stem.descriptor.server_descriptor.RelayDescriptor):
@@ -386,9 +388,6 @@ class Ed25519CertificateV1(Ed25519Certificate):
else:
raise TypeError('Certificate validation only supported for server and hidden service descriptors, not %s' % type(descriptor).__name__)
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
- from cryptography.exceptions import InvalidSignature
-
try:
key = Ed25519PublicKey.from_public_bytes(self.key)
key.verify(signature, signed_content)
diff --git a/stem/descriptor/extrainfo_descriptor.py b/stem/descriptor/extrainfo_descriptor.py
index c9125efa..dcca9d14 100644
--- a/stem/descriptor/extrainfo_descriptor.py
+++ b/stem/descriptor/extrainfo_descriptor.py
@@ -71,7 +71,6 @@ import functools
import hashlib
import re
-import stem.prereq
import stem.util.connection
import stem.util.enum
import stem.util.str_tools
diff --git a/stem/descriptor/hidden_service.py b/stem/descriptor/hidden_service.py
index 64daee16..980222a3 100644
--- a/stem/descriptor/hidden_service.py
+++ b/stem/descriptor/hidden_service.py
@@ -44,7 +44,6 @@ import time
import stem.client.datatype
import stem.descriptor.certificate
-import stem.prereq
import stem.util
import stem.util.connection
import stem.util.str_tools
@@ -218,9 +217,7 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
:raises: **ValueError** if the address, port, or keys are malformed
"""
- if not stem.prereq.is_crypto_available(ed25519 = True):
- raise ImportError('Introduction point creation requires the cryptography module ed25519 support')
- elif not stem.util.connection.is_valid_port(port):
+ if not stem.util.connection.is_valid_port(port):
raise ValueError("'%s' is an invalid port" % port)
if stem.util.connection.is_valid_ipv4_address(address):
@@ -250,12 +247,12 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
:raises: **ValueError** if the address, port, or keys are malformed
"""
- if not stem.prereq.is_crypto_available(ed25519 = True):
+ try:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+ from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
+ except ImportError:
raise ImportError('Introduction point creation requires the cryptography module ed25519 support')
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
- from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
-
if expiration is None:
expiration = datetime.datetime.utcnow() + datetime.timedelta(hours = stem.descriptor.certificate.DEFAULT_EXPIRATION_HOURS)
@@ -354,7 +351,11 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
def _key_as(value, x25519 = False, ed25519 = False):
if value is None or (not x25519 and not ed25519):
return value
- elif not stem.prereq.is_crypto_available():
+
+ try:
+ from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PublicKey
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
+ except ImportError:
raise ImportError('cryptography module unavailable')
if x25519:
@@ -364,14 +365,9 @@ class IntroductionPointV3(collections.namedtuple('IntroductionPointV3', ['link_s
raise EnvironmentError('OpenSSL x25519 unsupported')
- from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PublicKey
return X25519PublicKey.from_public_bytes(base64.b64decode(value))
if ed25519:
- if not stem.prereq.is_crypto_available(ed25519 = True):
- raise EnvironmentError('cryptography ed25519 unsupported')
-
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
return Ed25519PublicKey.from_public_bytes(value)
@staticmethod
@@ -719,13 +715,16 @@ class HiddenServiceDescriptorV2(HiddenServiceDescriptor):
self._parse(entries, validate)
- if not skip_crypto_validation and stem.prereq.is_crypto_available():
- signed_digest = self._digest_for_signature(self.permanent_key, self.signature)
- digest_content = self._content_range('rendezvous-service-descriptor ', '\nsignature\n')
- content_digest = hashlib.sha1(digest_content).hexdigest().upper()
+ if not skip_crypto_validation:
+ try:
+ signed_digest = self._digest_for_signature(self.permanent_key, self.signature)
+ digest_content = self._content_range('rendezvous-service-descriptor ', '\nsignature\n')
+ content_digest = hashlib.sha1(digest_content).hexdigest().upper()
- if signed_digest != content_digest:
- raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, content_digest))
+ if signed_digest != content_digest:
+ raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, content_digest))
+ except ImportError:
+ pass # cryptography module unavailable
else:
self._entries = entries
@@ -746,9 +745,6 @@ class HiddenServiceDescriptorV2(HiddenServiceDescriptor):
if not content:
return []
elif authentication_cookie:
- if not stem.prereq.is_crypto_available():
- raise DecryptionFailure('Decrypting introduction-points requires the cryptography module')
-
try:
authentication_cookie = stem.util.str_tools._decode_b64(authentication_cookie)
except TypeError as exc:
@@ -772,8 +768,11 @@ class HiddenServiceDescriptorV2(HiddenServiceDescriptor):
@staticmethod
def _decrypt_basic_auth(content, authentication_cookie):
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
- from cryptography.hazmat.backends import default_backend
+ try:
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
+ from cryptography.hazmat.backends import default_backend
+ except ImportError:
+ raise DecryptionFailure('Decrypting introduction-points requires the cryptography module')
try:
client_blocks = int(binascii.hexlify(content[1:2]), 16)
@@ -816,8 +815,11 @@ class HiddenServiceDescriptorV2(HiddenServiceDescriptor):
@staticmethod
def _decrypt_stealth_auth(content, authentication_cookie):
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
- from cryptography.hazmat.backends import default_backend
+ try:
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
+ from cryptography.hazmat.backends import default_backend
+ except ImportError:
+ raise DecryptionFailure('Decrypting introduction-points requires the cryptography module')
# byte 1 = authentication type, 2-17 = input vector, 18 on = encrypted content
iv, encrypted = content[1:17], content[17:]
@@ -965,14 +967,13 @@ class HiddenServiceDescriptorV3(HiddenServiceDescriptor):
* **ImportError** if cryptography is unavailable
"""
- if not stem.prereq.is_crypto_available(ed25519 = True):
+ try:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+ except ImportError:
raise ImportError('Hidden service descriptor creation requires cryptography version 2.6')
- elif not stem.prereq._is_sha3_available():
- raise ImportError('Hidden service descriptor creation requires python 3.6+ or the pysha3 module (https://pypi.org/project/pysha3/)')
- elif blinding_nonce and len(blinding_nonce) != 32:
- raise ValueError('Blinding nonce must be 32 bytes, but was %i' % len(blinding_nonce))
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+ if blinding_nonce and len(blinding_nonce) != 32:
+ raise ValueError('Blinding nonce must be 32 bytes, but was %i' % len(blinding_nonce))
inner_layer = inner_layer if inner_layer else InnerLayer.create(exclude = exclude)
identity_key = identity_key if identity_key else Ed25519PrivateKey.generate()
@@ -1038,8 +1039,11 @@ class HiddenServiceDescriptorV3(HiddenServiceDescriptor):
self._parse(entries, validate)
- if self.signing_cert and stem.prereq.is_crypto_available(ed25519 = True):
- self.signing_cert.validate(self)
+ if self.signing_cert:
+ try:
+ self.signing_cert.validate(self)
+ except ImportError:
+ pass # cryptography module unavailable
else:
self._entries = entries
@@ -1059,22 +1063,20 @@ class HiddenServiceDescriptorV3(HiddenServiceDescriptor):
* **ValueError** if unable to decrypt or validation fails
"""
- if not stem.prereq.is_crypto_available(ed25519 = True):
- raise ImportError('Hidden service descriptor decryption requires cryptography version 2.6')
- elif not stem.prereq._is_sha3_available():
- raise ImportError('Hidden service descriptor decryption requires python 3.6+ or the pysha3 module (https://pypi.org/project/pysha3/)')
-
if self._inner_layer is None:
- blinded_key = self.signing_cert.signing_key() if self.signing_cert else None
+ try:
+ blinded_key = self.signing_cert.signing_key() if self.signing_cert else None
- if not blinded_key:
- raise ValueError('No signing key is present')
+ if not blinded_key:
+ raise ValueError('No signing key is present')
- identity_public_key = HiddenServiceDescriptorV3.identity_key_from_address(onion_address)
- subcredential = HiddenServiceDescriptorV3._subcredential(identity_public_key, blinded_key)
+ identity_public_key = HiddenServiceDescriptorV3.identity_key_from_address(onion_address)
+ subcredential = HiddenServiceDescriptorV3._subcredential(identity_public_key, blinded_key)
- outer_layer = OuterLayer._decrypt(self.superencrypted, self.revision_counter, subcredential, blinded_key)
- self._inner_layer = InnerLayer._decrypt(outer_layer, self.revision_counter, subcredential, blinded_key)
+ outer_layer = OuterLayer._decrypt(self.superencrypted, self.revision_counter, subcredential, blinded_key)
+ self._inner_layer = InnerLayer._decrypt(outer_layer, self.revision_counter, subcredential, blinded_key)
+ except ImportError:
+ raise ImportError('Hidden service descriptor decryption requires cryptography version 2.6')
return self._inner_layer
@@ -1092,9 +1094,6 @@ class HiddenServiceDescriptorV3(HiddenServiceDescriptor):
:raises: **ImportError** if sha3 unsupported
"""
- if not stem.prereq._is_sha3_available():
- raise ImportError('Hidden service address conversion requires python 3.6+ or the pysha3 module (https://pypi.org/project/pysha3/)')
-
key = stem.util._pubkey_bytes(key) # normalize key into bytes
version = stem.client.datatype.Size.CHAR.pack(3)
@@ -1117,9 +1116,6 @@ class HiddenServiceDescriptorV3(HiddenServiceDescriptor):
* **ValueError** if address malformed or checksum is invalid
"""
- if not stem.prereq._is_sha3_available():
- raise ImportError('Hidden service address conversion requires python 3.6+ or the pysha3 module (https://pypi.org/project/pysha3/)')
-
if onion_address.endswith('.onion'):
onion_address = onion_address[:-6]
@@ -1202,15 +1198,14 @@ class OuterLayer(Descriptor):
@classmethod
def content(cls, attr = None, exclude = (), validate = True, sign = False, inner_layer = None, revision_counter = None, authorized_clients = None, subcredential = None, blinded_key = None):
- if not stem.prereq.is_crypto_available(ed25519 = True):
+ try:
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
+ from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
+ except ImportError:
raise ImportError('Hidden service layer creation requires cryptography version 2.6')
- elif not stem.prereq._is_sha3_available():
- raise ImportError('Hidden service layer creation requires python 3.6+ or the pysha3 module (https://pypi.org/project/pysha3/)')
- elif authorized_clients and 'auth-client' in attr:
- raise ValueError('Authorized clients cannot be specified through both attr and authorized_clients')
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey
- from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey
+ if authorized_clients and 'auth-client' in attr:
+ raise ValueError('Authorized clients cannot be specified through both attr and authorized_clients')
inner_layer = inner_layer if inner_layer else InnerLayer.create()
revision_counter = revision_counter if revision_counter else 1
diff --git a/stem/descriptor/microdescriptor.py b/stem/descriptor/microdescriptor.py
index 42d115d6..c62a3d0d 100644
--- a/stem/descriptor/microdescriptor.py
+++ b/stem/descriptor/microdescriptor.py
@@ -68,7 +68,6 @@ import functools
import hashlib
import stem.exit_policy
-import stem.prereq
from stem.descriptor import (
Descriptor,
diff --git a/stem/descriptor/remote.py b/stem/descriptor/remote.py
index 0f411a71..24eb7b9b 100644
--- a/stem/descriptor/remote.py
+++ b/stem/descriptor/remote.py
@@ -96,7 +96,6 @@ import stem.client
import stem.descriptor
import stem.descriptor.networkstatus
import stem.directory
-import stem.prereq
import stem.util.enum
import stem.util.tor_tools
@@ -383,10 +382,10 @@ class Query(object):
elif not isinstance(compression, list):
compression = [compression] # caller provided only a single option
- if Compression.ZSTD in compression and not stem.prereq.is_zstd_available():
+ if Compression.ZSTD in compression and not Compression.ZSTD.available:
compression.remove(Compression.ZSTD)
- if Compression.LZMA in compression and not stem.prereq.is_lzma_available():
+ if Compression.LZMA in compression and not Compression.LZMA.available:
compression.remove(Compression.LZMA)
if not compression:
@@ -765,10 +764,14 @@ class DescriptorDownloader(object):
# if we're performing validation then check that it's signed by the
# authority key certificates
- if consensus_query.validate and consensus_query.document_handler == stem.descriptor.DocumentHandler.DOCUMENT and stem.prereq.is_crypto_available():
+ if consensus_query.validate and consensus_query.document_handler == stem.descriptor.DocumentHandler.DOCUMENT:
consensus = list(consensus_query.run())[0]
key_certs = self.get_key_certificates(**query_args).run()
- consensus.validate_signatures(key_certs)
+
+ try:
+ consensus.validate_signatures(key_certs)
+ except ImportError:
+ pass # cryptography module unavailable
return consensus_query
diff --git a/stem/descriptor/router_status_entry.py b/stem/descriptor/router_status_entry.py
index 0486d78d..c2d8dd07 100644
--- a/stem/descriptor/router_status_entry.py
+++ b/stem/descriptor/router_status_entry.py
@@ -25,7 +25,6 @@ import binascii
import io
import stem.exit_policy
-import stem.prereq
import stem.util.str_tools
from stem.descriptor import (
diff --git a/stem/descriptor/server_descriptor.py b/stem/descriptor/server_descriptor.py
index d38bac9d..955b8429 100644
--- a/stem/descriptor/server_descriptor.py
+++ b/stem/descriptor/server_descriptor.py
@@ -53,7 +53,6 @@ import re
import stem.descriptor.extrainfo_descriptor
import stem.exit_policy
-import stem.prereq
import stem.util.connection
import stem.util.enum
import stem.util.str_tools
@@ -764,20 +763,26 @@ class RelayDescriptor(ServerDescriptor):
if key_hash != self.fingerprint.lower():
raise ValueError('Fingerprint does not match the hash of our signing key (fingerprint: %s, signing key hash: %s)' % (self.fingerprint.lower(), key_hash))
- if not skip_crypto_validation and stem.prereq.is_crypto_available():
- signed_digest = self._digest_for_signature(self.signing_key, self.signature)
+ if not skip_crypto_validation:
+ try:
+ signed_digest = self._digest_for_signature(self.signing_key, self.signature)
- if signed_digest != self.digest():
- raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, self.digest()))
+ if signed_digest != self.digest():
+ raise ValueError('Decrypted digest does not match local digest (calculated: %s, local: %s)' % (signed_digest, self.digest()))
- if self.onion_key_crosscert and stem.prereq.is_crypto_available():
- onion_key_crosscert_digest = self._digest_for_signature(self.onion_key, self.onion_key_crosscert)
+ if self.onion_key_crosscert:
+ onion_key_crosscert_digest = self._digest_for_signature(self.onion_key, self.onion_key_crosscert)
- if onion_key_crosscert_digest != self._onion_key_crosscert_digest():
- raise ValueError('Decrypted onion-key-crosscert digest does not match local digest (calculated: %s, local: %s)' % (onion_key_crosscert_digest, self._onion_key_crosscert_digest()))
+ if onion_key_crosscert_digest != self._onion_key_crosscert_digest():
+ raise ValueError('Decrypted onion-key-crosscert digest does not match local digest (calculated: %s, local: %s)' % (onion_key_crosscert_digest, self._onion_key_crosscert_digest()))
+ except ImportError:
+ pass # cryptography module unavailable
- if stem.prereq.is_crypto_available(ed25519 = True) and self.certificate:
- self.certificate.validate(self)
+ if self.certificate:
+ try:
+ self.certificate.validate(self)
+ except ImportError:
+ pass # cryptography module unavailable
@classmethod
def content(cls, attr = None, exclude = (), sign = False, signing_key = None, exit_policy = None):
diff --git a/stem/exit_policy.py b/stem/exit_policy.py
index 0150e190..e2a64bc4 100644
--- a/stem/exit_policy.py
+++ b/stem/exit_policy.py
@@ -70,7 +70,6 @@ import re
import socket
import zlib
-import stem.prereq
import stem.util
import stem.util.connection
import stem.util.enum
diff --git a/stem/interpreter/__init__.py b/stem/interpreter/__init__.py
index 67984261..07a5f573 100644
--- a/stem/interpreter/__init__.py
+++ b/stem/interpreter/__init__.py
@@ -11,7 +11,6 @@ import sys
import stem
import stem.connection
-import stem.prereq
import stem.process
import stem.util.conf
import stem.util.system
diff --git a/stem/interpreter/autocomplete.py b/stem/interpreter/autocomplete.py
index 05585b48..9f5f2659 100644
--- a/stem/interpreter/autocomplete.py
+++ b/stem/interpreter/autocomplete.py
@@ -7,8 +7,6 @@ Tab completion for our interpreter prompt.
import functools
-import stem.prereq
-
from stem.interpreter import uses_settings
diff --git a/stem/interpreter/help.py b/stem/interpreter/help.py
index 5fde9246..1f242a8e 100644
--- a/stem/interpreter/help.py
+++ b/stem/interpreter/help.py
@@ -7,8 +7,6 @@ Provides our /help responses.
import functools
-import stem.prereq
-
from stem.interpreter import (
STANDARD_OUTPUT,
BOLD_OUTPUT,
diff --git a/stem/manual.py b/stem/manual.py
index 3f385ba0..44117f93 100644
--- a/stem/manual.py
+++ b/stem/manual.py
@@ -57,7 +57,6 @@ import tempfile
import urllib.request
import stem
-import stem.prereq
import stem.util
import stem.util.conf
import stem.util.enum
@@ -134,11 +133,11 @@ def query(query, *param):
* **sqlite3.OperationalError** if query fails
"""
- if not stem.prereq.is_sqlite_available():
+ try:
+ import sqlite3
+ except ImportError:
raise ImportError('Querying requires the sqlite3 module')
- import sqlite3
-
# The only reason to explicitly close the sqlite connection is to ensure
# transactions are committed. Since we're only using read-only access this
# doesn't matter, and can allow interpreter shutdown to do the needful.
@@ -385,13 +384,13 @@ class Manual(object):
it or the schema is out of date
"""
- if path is None:
- path = CACHE_PATH
-
- if not stem.prereq.is_sqlite_available():
+ try:
+ import sqlite3
+ except ImportError:
raise ImportError('Reading a sqlite cache requires the sqlite3 module')
- import sqlite3
+ if path is None:
+ path = CACHE_PATH
if not os.path.exists(path):
raise IOError("%s doesn't exist" % path)
@@ -517,10 +516,11 @@ class Manual(object):
* **IOError** if unsuccessful
"""
- if not stem.prereq.is_sqlite_available():
+ try:
+ import sqlite3
+ except ImportError:
raise ImportError('Saving a sqlite cache requires the sqlite3 module')
- import sqlite3
tmp_path = path + '.new'
if os.path.exists(tmp_path):
diff --git a/stem/prereq.py b/stem/prereq.py
deleted file mode 100644
index 74584165..00000000
--- a/stem/prereq.py
+++ /dev/null
@@ -1,179 +0,0 @@
-# Copyright 2012-2020, Damian Johnson and The Tor Project
-# See LICENSE for licensing information
-
-"""
-Checks for stem dependencies.
-
-Aside from Python itself Stem only has soft dependencies, which is to say
-module unavailability only impacts features that require it. For example,
-descriptor signature validation requires 'cryptography'. If unavailable
-stem will still read descriptors - just without signature checks.
-
-::
-
- check_requirements - checks for minimum requirements for running stem
- is_sqlite_available - checks if the sqlite3 module is available
- is_crypto_available - checks if the cryptography module is available
- is_zstd_available - checks if the zstd module is available
- is_lzma_available - checks if the lzma module is available
-"""
-
-import functools
-import hashlib
-import inspect
-import platform
-import sys
-
-# TODO: in stem 2.x consider replacing these functions with requirement
-# annotations (like our tests)
-
-CRYPTO_UNAVAILABLE = "Unable to import the cryptography module. Because of this we'll be unable to verify descriptor signature integrity. You can get cryptography from: https://pypi.org/project/cryptography/"
-ZSTD_UNAVAILABLE = 'ZSTD compression requires the zstandard module (https://pypi.org/project/zstandard/)'
-LZMA_UNAVAILABLE = 'LZMA compression requires the lzma module (https://docs.python.org/3/library/lzma.html)'
-ED25519_UNSUPPORTED = 'Unable to verify descriptor ed25519 certificate integrity. ed25519 is not supported by installed versions of OpenSSL and/or cryptography'
-
-
-def check_requirements():
- """
- Checks that we meet the minimum requirements to run stem. If we don't then
- this raises an ImportError with the issue.
-
- :raises: **ImportError** with the problem if we don't meet stem's
- requirements
- """
-
- major_version, minor_version = sys.version_info[0:2]
-
- if major_version < 3 or (major_version == 3 and minor_version < 6):
- raise ImportError('stem requires python version 3.6 or greater')
-
-
-def is_pypy():
- """
- Checks if we're running PyPy.
-
- .. versionadded:: 1.7.0
-
- :returns: **True** if running pypy, **False** otherwise
- """
-
- return platform.python_implementation() == 'PyPy'
-
-
-def is_sqlite_available():
- """
- Checks if the sqlite3 module is available. Usually this is built in, but some
- platforms such as FreeBSD and Gentoo exclude it by default.
-
- .. versionadded:: 1.6.0
-
- :returns: **True** if we can use the sqlite3 module and **False** otherwise
- """
-
- try:
- import sqlite3
- return True
- except ImportError:
- return False
-
-
-def is_crypto_available(ed25519 = False):
- """
- Checks if the cryptography functions we use are available. This is used for
- verifying relay descriptor signatures.
-
- :param bool ed25519: check for `ed25519 support
- <https://cryptography.io/en/latest/hazmat/primitives/asymmetric/ed25519/>`_,
- which requires both cryptography version 2.6 and OpenSSL support
-
- :returns: **True** if we can use the cryptography module and **False**
- otherwise
- """
-
- from stem.util import log
-
- try:
- from cryptography.utils import int_from_bytes, int_to_bytes
- from cryptography.hazmat.backends import default_backend
- from cryptography.hazmat.backends.openssl.backend import backend
- from cryptography.hazmat.primitives.asymmetric import rsa
- from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
- from cryptography.hazmat.primitives.serialization import load_der_public_key
-
- if not hasattr(rsa.RSAPrivateKey, 'sign'):
- raise ImportError()
-
- if ed25519:
- # The following import confirms cryptography support (ie. version 2.6+),
- # whereas ed25519_supported() checks for OpenSSL bindings.
-
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
-
- if not hasattr(backend, 'ed25519_supported') or not backend.ed25519_supported():
- log.log_once('stem.prereq._is_crypto_ed25519_supported', log.INFO, ED25519_UNSUPPORTED)
- return False
-
- return True
- except ImportError:
- log.log_once('stem.prereq.is_crypto_available', log.INFO, CRYPTO_UNAVAILABLE)
- return False
-
-
-def is_zstd_available():
- """
- Checks if the `zstd module <https://pypi.org/project/zstandard/>`_ is
- available.
-
- .. versionadded:: 1.7.0
-
- :returns: **True** if we can use the zstd module and **False** otherwise
- """
-
- try:
- # Unfortunately the zstandard module uses the same namespace as another
- # zstd module (https://pypi.org/project/zstd/) so we need to
- # differentiate them.
-
- import zstd
- return hasattr(zstd, 'ZstdDecompressor')
- except ImportError:
- from stem.util import log
- log.log_once('stem.prereq.is_zstd_available', log.INFO, ZSTD_UNAVAILABLE)
- return False
-
-
-def is_lzma_available():
- """
- Checks if the `lzma module <https://docs.python.org/3/library/lzma.html>`_ is
- available. This was added as a builtin in Python 3.3.
-
- .. versionadded:: 1.7.0
-
- :returns: **True** if we can use the lzma module and **False** otherwise
- """
-
- try:
- import lzma
- return True
- except ImportError:
- from stem.util import log
- log.log_once('stem.prereq.is_lzma_available', log.INFO, LZMA_UNAVAILABLE)
- return False
-
-
-def _is_sha3_available():
- """
- Check if hashlib has sha3 support. This requires Python 3.6+ *or* the `pysha3
- module <https://github.com/tiran/pysha3>`_.
- """
-
- # If pysha3 is present then importing sha3 will monkey patch the methods we
- # want onto hashlib.
-
- if not hasattr(hashlib, 'sha3_256') or not hasattr(hashlib, 'shake_256'):
- try:
- import sha3
- except ImportError:
- pass
-
- return hasattr(hashlib, 'sha3_256') and hasattr(hashlib, 'shake_256')
diff --git a/stem/process.py b/stem/process.py
index 913a9be7..a1d805ec 100644
--- a/stem/process.py
+++ b/stem/process.py
@@ -25,7 +25,6 @@ import subprocess
import tempfile
import threading
-import stem.prereq
import stem.util.str_tools
import stem.util.system
import stem.version
diff --git a/stem/response/events.py b/stem/response/events.py
index 38708abc..b82457e6 100644
--- a/stem/response/events.py
+++ b/stem/response/events.py
@@ -7,7 +7,6 @@ import re
import stem
import stem.control
import stem.descriptor.router_status_entry
-import stem.prereq
import stem.response
import stem.util
import stem.version
diff --git a/stem/response/protocolinfo.py b/stem/response/protocolinfo.py
index 46f6ab4f..459fef5b 100644
--- a/stem/response/protocolinfo.py
+++ b/stem/response/protocolinfo.py
@@ -3,7 +3,6 @@
import sys
-import stem.prereq
import stem.response
import stem.socket
import stem.version
diff --git a/stem/socket.py b/stem/socket.py
index 45a1c53c..2ef42dd5 100644
--- a/stem/socket.py
+++ b/stem/socket.py
@@ -78,7 +78,6 @@ import ssl
import threading
import time
-import stem.prereq
import stem.response
import stem.util.str_tools
diff --git a/stem/util/__init__.py b/stem/util/__init__.py
index 2bcc8a07..cde49de7 100644
--- a/stem/util/__init__.py
+++ b/stem/util/__init__.py
@@ -7,8 +7,6 @@ Utility functions used by the stem library.
import datetime
-import stem.prereq
-
__all__ = [
'conf',
'connection',
@@ -88,14 +86,12 @@ def _pubkey_bytes(key):
if isinstance(key, (bytes, str)):
return key
- if not stem.prereq.is_crypto_available():
- raise ImportError('Key normalization requires the cryptography module')
- elif not stem.prereq.is_crypto_available(ed25519 = True):
- raise ImportError('Key normalization requires the cryptography ed25519 support')
-
- from cryptography.hazmat.primitives import serialization
- from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey
- from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey, X25519PublicKey
+ try:
+ from cryptography.hazmat.primitives import serialization
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PrivateKey, Ed25519PublicKey
+ from cryptography.hazmat.primitives.asymmetric.x25519 import X25519PrivateKey, X25519PublicKey
+ except ImportError:
+ raise ImportError('Key normalization requires the cryptography module with ed25519 support')
if isinstance(key, (X25519PrivateKey, Ed25519PrivateKey)):
return key.public_key().public_bytes(
diff --git a/stem/util/conf.py b/stem/util/conf.py
index 1dbcc243..a06f1fd7 100644
--- a/stem/util/conf.py
+++ b/stem/util/conf.py
@@ -162,8 +162,6 @@ import inspect
import os
import threading
-import stem.prereq
-
from stem.util import log
CONFS = {} # mapping of identifier to singleton instances of configs
diff --git a/stem/util/log.py b/stem/util/log.py
index 3093396f..94d055ff 100644
--- a/stem/util/log.py
+++ b/stem/util/log.py
@@ -50,7 +50,6 @@ them at your own risk.**
import logging
-import stem.prereq
import stem.util.enum
import stem.util.str_tools
diff --git a/stem/util/proc.py b/stem/util/proc.py
index 0b4c0ab4..3589af13 100644
--- a/stem/util/proc.py
+++ b/stem/util/proc.py
@@ -51,7 +51,6 @@ import socket
import sys
import time
-import stem.prereq
import stem.util.connection
import stem.util.enum
import stem.util.str_tools
diff --git a/stem/util/str_tools.py b/stem/util/str_tools.py
index bf582bea..8ce22dc9 100644
--- a/stem/util/str_tools.py
+++ b/stem/util/str_tools.py
@@ -23,7 +23,6 @@ import datetime
import re
import sys
-import stem.prereq
import stem.util
import stem.util.enum
diff --git a/stem/util/system.py b/stem/util/system.py
index b9a7ef8d..b3dee151 100644
--- a/stem/util/system.py
+++ b/stem/util/system.py
@@ -75,7 +75,6 @@ import tarfile
import threading
import time
-import stem.prereq
import stem.util
import stem.util.enum
import stem.util.proc
@@ -483,7 +482,7 @@ def size_of(obj, exclude = None):
:raises: **NotImplementedError** if using PyPy
"""
- if stem.prereq.is_pypy():
+ if platform.python_implementation() == 'PyPy':
raise NotImplementedError('PyPy does not implement sys.getsizeof()')
if exclude is None:
diff --git a/stem/util/test_tools.py b/stem/util/test_tools.py
index 5888eb86..71165214 100644
--- a/stem/util/test_tools.py
+++ b/stem/util/test_tools.py
@@ -38,7 +38,6 @@ import time
import traceback
import unittest
-import stem.prereq
import stem.util.conf
import stem.util.enum
import stem.util.system
diff --git a/stem/version.py b/stem/version.py
index 4f873f47..e67a93b5 100644
--- a/stem/version.py
+++ b/stem/version.py
@@ -58,7 +58,6 @@ import functools
import os
import re
-import stem.prereq
import stem.util
import stem.util.enum
import stem.util.system
diff --git a/test/integ/installation.py b/test/integ/installation.py
index 2f41ef58..16d63538 100644
--- a/test/integ/installation.py
+++ b/test/integ/installation.py
@@ -4,6 +4,7 @@ Tests installation of our library.
import glob
import os
+import platform
import shutil
import sys
import tarfile
@@ -11,7 +12,6 @@ import time
import unittest
import stem
-import stem.prereq
import stem.util.system
import stem.util.test_tools
import test
@@ -75,7 +75,7 @@ class TestInstallation(unittest.TestCase):
stem.util.system.call('%s setup.py install --prefix %s' % (PYTHON_EXE, BASE_INSTALL_PATH), timeout = 60, cwd = test.STEM_BASE)
stem.util.system.call('%s setup.py clean --all' % PYTHON_EXE, timeout = 60, cwd = test.STEM_BASE) # tidy up the build directory
- if stem.prereq.is_pypy():
+ if platform.python_implementation() == 'PyPy':
site_packages_paths = glob.glob('%s/site-packages' % BASE_INSTALL_PATH)
else:
site_packages_paths = glob.glob('%s/lib*/*/site-packages' % BASE_INSTALL_PATH)
diff --git a/test/integ/process.py b/test/integ/process.py
index 430ed484..347e3f11 100644
--- a/test/integ/process.py
+++ b/test/integ/process.py
@@ -15,7 +15,6 @@ import threading
import time
import unittest
-import stem.prereq
import stem.process
import stem.socket
import stem.util.str_tools
diff --git a/test/integ/util/system.py b/test/integ/util/system.py
index 2a7ac07a..08a367c9 100644
--- a/test/integ/util/system.py
+++ b/test/integ/util/system.py
@@ -5,10 +5,10 @@ that we're running.
import getpass
import os
+import platform
import tempfile
import unittest
-import stem.prereq
import stem.util.proc
import stem.util.system
import test.require
@@ -556,7 +556,7 @@ class TestSystem(unittest.TestCase):
Exercises the get_process_name() and set_process_name() methods.
"""
- if stem.prereq.is_pypy():
+ if platform.python_implementation() == 'PyPy':
self.skipTest('(unimplemented for pypy)')
initial_name = stem.util.system.get_process_name()
diff --git a/test/integ/version.py b/test/integ/version.py
index b28ee868..641629d4 100644
--- a/test/integ/version.py
+++ b/test/integ/version.py
@@ -5,7 +5,6 @@ running with.
import unittest
-import stem.prereq
import stem.version
import test.require
import test.runner
diff --git a/test/require.py b/test/require.py
index 12b3adf5..53d66f62 100644
--- a/test/require.py
+++ b/test/require.py
@@ -12,7 +12,6 @@ run.
|- needs - skips the test unless a requirement is met
|
|- cryptography - skips test unless the cryptography module is present
- |- ed25519_support - skips test unless cryptography has ed25519 support
|- command - requires a command to be on the path
|- proc - requires the platform to have recognized /proc contents
|
@@ -27,6 +26,22 @@ import stem.version
import test
import test.runner
+try:
+ from cryptography.utils import int_from_bytes, int_to_bytes
+ from cryptography.hazmat.backends import default_backend
+ from cryptography.hazmat.backends.openssl.backend import backend
+ from cryptography.hazmat.primitives.asymmetric import rsa
+ from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
+ from cryptography.hazmat.primitives.serialization import load_der_public_key
+ from cryptography.hazmat.primitives.asymmetric.ed25519 import Ed25519PublicKey
+
+ if not hasattr(rsa.RSAPrivateKey, 'sign') or not hasattr(backend, 'ed25519_supported') or not backend.ed25519_supported():
+ raise ImportError()
+
+ CRYPTOGRAPHY_AVAILABLE = True
+except ImportError:
+ CRYPTOGRAPHY_AVAILABLE = False
+
RAN_TESTS = []
@@ -94,8 +109,7 @@ def version(req_version):
return needs(lambda: test.tor_version() >= req_version, 'requires %s' % req_version)
-cryptography = needs(stem.prereq.is_crypto_available, 'requires cryptography')
-ed25519_support = needs(lambda: stem.prereq.is_crypto_available(ed25519 = True), 'requires ed25519 support')
+cryptography = needs(lambda: CRYPTOGRAPHY_AVAILABLE, 'requires cryptography')
proc = needs(stem.util.proc.is_available, 'proc unavailable')
controller = needs(_can_access_controller, 'no connection')
ptrace = needs(_can_ptrace, 'DisableDebuggerAttachment is set')
diff --git a/test/runner.py b/test/runner.py
index d6a0d561..a8079908 100644
--- a/test/runner.py
+++ b/test/runner.py
@@ -42,7 +42,6 @@ import time
import uuid
import stem.connection
-import stem.prereq
import stem.process
import stem.socket
import stem.util.conf
diff --git a/test/settings.cfg b/test/settings.cfg
index d22bec42..d796993a 100644
--- a/test/settings.cfg
+++ b/test/settings.cfg
@@ -195,30 +195,6 @@ pycodestyle.ignore test/unit/util/connection.py => W291: _tor tor 158
pyflakes.ignore run_tests.py => 'unittest' imported but unused
pyflakes.ignore stem/control.py => undefined name 'controller'
pyflakes.ignore stem/manual.py => undefined name 'unichr'
-pyflakes.ignore stem/prereq.py => 'int_to_bytes' imported but unused
-pyflakes.ignore stem/prereq.py => 'int_from_bytes' imported but unused
-pyflakes.ignore stem/prereq.py => 'default_backend' imported but unused
-pyflakes.ignore stem/prereq.py => 'load_der_public_key' imported but unused
-pyflakes.ignore stem/prereq.py => 'modes' imported but unused
-pyflakes.ignore stem/prereq.py => 'Cipher' imported but unused
-pyflakes.ignore stem/prereq.py => 'algorithms' imported but unused
-pyflakes.ignore stem/prereq.py => 'unittest' imported but unused
-pyflakes.ignore stem/prereq.py => 'unittest.mock' imported but unused
-pyflakes.ignore stem/prereq.py => 'long_to_bytes' imported but unused
-pyflakes.ignore stem/prereq.py => 'encoding' imported but unused
-pyflakes.ignore stem/prereq.py => 'sha3' imported but unused
-pyflakes.ignore stem/prereq.py => 'signing' imported but unused
-pyflakes.ignore stem/prereq.py => 'sqlite3' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.utils.int_to_bytes' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.utils.int_from_bytes' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.backends.default_backend' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.backends.openssl.backend.backend' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.serialization.load_der_public_key' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.modes' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.Cipher' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.ciphers.algorithms' imported but unused
-pyflakes.ignore stem/prereq.py => 'cryptography.hazmat.primitives.asymmetric.ed25519.Ed25519PublicKey' imported but unused
-pyflakes.ignore stem/prereq.py => 'lzma' imported but unused
pyflakes.ignore stem/client/datatype.py => redefinition of unused 'pop' from *
pyflakes.ignore stem/descriptor/hidden_service_descriptor.py => 'stem.descriptor.hidden_service.*' imported but unused
pyflakes.ignore stem/descriptor/hidden_service_descriptor.py => 'from stem.descriptor.hidden_service import *' used; unable to detect undefined names
diff --git a/test/task.py b/test/task.py
index 19026165..939e263c 100644
--- a/test/task.py
+++ b/test/task.py
@@ -34,12 +34,12 @@ import time
import traceback
import stem
-import stem.prereq
import stem.util.conf
import stem.util.system
import stem.util.test_tools
import stem.version
import test
+import test.require
import test.output
from test.output import STATUS, ERROR, NO_NL, println
@@ -321,7 +321,7 @@ STEM_VERSION = Task('stem version', _check_stem_version)
TOR_VERSION = Task('tor version', _check_tor_version)
PYTHON_VERSION = Task('python version', _check_python_version)
PLATFORM_VERSION = Task('operating system', _check_platform_version)
-CRYPTO_VERSION = ModuleVersion('cryptography version', 'cryptography', stem.prereq.is_crypto_available)
+CRYPTO_VERSION = ModuleVersion('cryptography version', 'cryptography', lambda: test.require.CRYPTOGRAPHY_AVAILABLE)
PYFLAKES_VERSION = ModuleVersion('pyflakes version', 'pyflakes')
PYCODESTYLE_VERSION = ModuleVersion('pycodestyle version', ['pycodestyle', 'pep8'])
CLEAN_PYC = Task('checking for orphaned .pyc files', _clean_orphaned_pyc, (SRC_PATHS,), print_runtime = True)
diff --git a/test/unit/descriptor/certificate.py b/test/unit/descriptor/certificate.py
index 74ea0a6e..9e29556a 100644
--- a/test/unit/descriptor/certificate.py
+++ b/test/unit/descriptor/certificate.py
@@ -9,7 +9,6 @@ import unittest
import stem.descriptor.certificate
import stem.util.str_tools
-import stem.prereq
import test.require
from stem.client.datatype import Size, CertType
@@ -183,7 +182,7 @@ class TestEd25519Certificate(unittest.TestCase):
exc_msg = 'Ed25519 HAS_SIGNING_KEY extension must be 32 bytes, but was 2.'
self.assertRaisesWith(ValueError, exc_msg, Ed25519Certificate.from_base64, certificate(extension_data = [b'\x00\x02\x04\x07\11\12']))
- @test.require.ed25519_support
+ @test.require.cryptography
def test_validation_with_descriptor_key(self):
"""
Validate a descriptor signature using the ed25519 master key within the
@@ -195,7 +194,7 @@ class TestEd25519Certificate(unittest.TestCase):
desc.certificate.validate(desc)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_validation_with_embedded_key(self):
"""
Validate a descriptor signature using the signing key within the ed25519
@@ -208,7 +207,7 @@ class TestEd25519Certificate(unittest.TestCase):
desc.ed25519_master_key = None
desc.certificate.validate(desc)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_validation_with_invalid_descriptor(self):
"""
Validate a descriptor without a valid signature.
diff --git a/test/unit/descriptor/collector.py b/test/unit/descriptor/collector.py
index 99e19d7c..2960cf53 100644
--- a/test/unit/descriptor/collector.py
+++ b/test/unit/descriptor/collector.py
@@ -6,7 +6,7 @@ import datetime
import io
import unittest
-import stem.prereq
+import stem.descriptor.collector
from unittest.mock import Mock, patch
diff --git a/test/unit/descriptor/hidden_service_v2.py b/test/unit/descriptor/hidden_service_v2.py
index 54553d03..7112648b 100644
--- a/test/unit/descriptor/hidden_service_v2.py
+++ b/test/unit/descriptor/hidden_service_v2.py
@@ -7,7 +7,6 @@ import functools
import unittest
import stem.descriptor
-import stem.prereq
import test.require
from stem.descriptor.hidden_service import (
diff --git a/test/unit/descriptor/hidden_service_v3.py b/test/unit/descriptor/hidden_service_v3.py
index 4004a94d..c24eb1ad 100644
--- a/test/unit/descriptor/hidden_service_v3.py
+++ b/test/unit/descriptor/hidden_service_v3.py
@@ -10,7 +10,6 @@ import unittest
import stem.client.datatype
import stem.descriptor
import stem.descriptor.hidden_service
-import stem.prereq
import test.require
@@ -30,7 +29,6 @@ from test.unit.descriptor import (
base_expect_invalid_attr_for_text,
)
-require_sha3 = test.require.needs(stem.prereq._is_sha3_available, 'requires sha3')
require_x25519 = test.require.needs(lambda: stem.descriptor.hidden_service.X25519_AVAILABLE, 'requires openssl x5509')
expect_invalid_attr = functools.partial(base_expect_invalid_attr, HiddenServiceDescriptorV3, 'version', 3)
@@ -89,8 +87,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertTrue('eaH8VdaTKS' in desc.superencrypted)
self.assertEqual('aglChCQF+lbzKgyxJJTpYGVShV/GMDRJ4+cRGCp+a2y/yX/tLSh7hzqI7rVZrUoGj74Xr1CLMYO3fXYCS+DPDQ', desc.signature)
- @require_sha3
- @test.require.ed25519_support
+ @test.require.cryptography
def test_decryption(self):
"""
Decrypt our descriptor and validate its content.
@@ -152,7 +149,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertEqual(None, intro_point.legacy_key_raw)
self.assertEqual(None, intro_point.legacy_key_cert)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_required_fields(self):
"""
Check that we require the mandatory fields.
@@ -171,7 +168,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
desc_text = HiddenServiceDescriptorV3.content(exclude = (line,))
expect_invalid_attr_for_text(self, desc_text, line_to_attr[line], None)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_invalid_version(self):
"""
Checks that our version field expects a numeric value.
@@ -186,7 +183,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
for test_value in test_values:
expect_invalid_attr(self, {'hs-descriptor': test_value}, 'version')
- @test.require.ed25519_support
+ @test.require.cryptography
def test_invalid_lifetime(self):
"""
Checks that our lifetime field expects a numeric value.
@@ -201,7 +198,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
for test_value in test_values:
expect_invalid_attr(self, {'descriptor-lifetime': test_value}, 'lifetime')
- @test.require.ed25519_support
+ @test.require.cryptography
def test_invalid_revision_counter(self):
"""
Checks that our revision counter field expects a numeric value.
@@ -216,11 +213,9 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
for test_value in test_values:
expect_invalid_attr(self, {'revision-counter': test_value}, 'revision_counter')
- @require_sha3
def test_address_from_identity_key(self):
self.assertEqual(HS_ADDRESS, HiddenServiceDescriptorV3.address_from_identity_key(HS_PUBKEY))
- @require_sha3
def test_identity_key_from_address(self):
self.assertEqual(HS_PUBKEY, HiddenServiceDescriptorV3.identity_key_from_address(HS_ADDRESS))
self.assertRaisesWith(ValueError, "'boom.onion' isn't a valid hidden service v3 address", HiddenServiceDescriptorV3.identity_key_from_address, 'boom')
@@ -249,7 +244,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertEqual(INTRO_POINT_STR.rstrip(), intro_point.encode())
@require_x25519
- @test.require.ed25519_support
+ @test.require.cryptography
def test_intro_point_crypto(self):
"""
Retrieve IntroductionPointV3 cryptographic materials.
@@ -276,16 +271,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertEqual(None, intro_point.legacy_key_raw)
self.assertEqual(None, intro_point.legacy_key())
- @patch('stem.prereq.is_crypto_available', Mock(return_value = False))
- def test_intro_point_crypto_without_prereq(self):
- """
- Fetch cryptographic materials when the module is unavailable.
- """
-
- intro_point = InnerLayer(INNER_LAYER_STR).introduction_points[0]
- self.assertRaisesWith(ImportError, 'cryptography module unavailable', intro_point.onion_key)
-
- @test.require.ed25519_support
+ @test.require.cryptography
def test_intro_point_creation(self):
"""
Create an introduction point, encode it, then re-parse.
@@ -301,7 +287,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
reparsed = IntroductionPointV3.parse(intro_point.encode())
self.assertEqual(intro_point, reparsed)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_inner_layer_creation(self):
"""
Internal layer creation.
@@ -344,7 +330,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
IntroductionPointV3.create_for_address('1.1.1.1', 9001),
]).startswith(b'create2-formats 2\nintroduction-point AQAGAQEBASMp'))
- @test.require.ed25519_support
+ @test.require.cryptography
def test_outer_layer_creation(self):
"""
Outer layer creation.
@@ -402,7 +388,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertEqual(1, len(inner_layer.introduction_points))
self.assertEqual('1.1.1.1', inner_layer.introduction_points[0].link_specifiers[0].address)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_descriptor_creation(self):
"""
HiddenServiceDescriptorV3 creation.
@@ -451,7 +437,7 @@ class TestHiddenServiceDescriptorV3(unittest.TestCase):
self.assertEqual(3, len(inner_layer.introduction_points))
self.assertEqual('1.1.1.1', inner_layer.introduction_points[0].link_specifiers[0].address)
- @test.require.ed25519_support
+ @test.require.cryptography
def test_blinding(self):
"""
Create a descriptor with key blinding.
diff --git a/test/unit/descriptor/remote.py b/test/unit/descriptor/remote.py
index 01e0c58e..70f88b52 100644
--- a/test/unit/descriptor/remote.py
+++ b/test/unit/descriptor/remote.py
@@ -11,7 +11,6 @@ import unittest
import stem
import stem.descriptor
import stem.descriptor.remote
-import stem.prereq
import stem.util.str_tools
from unittest.mock import patch, Mock, MagicMock
@@ -168,24 +167,6 @@ class TestDescriptorDownloader(unittest.TestCase):
self.assertEqual([stem.descriptor.Compression.GZIP], query.compression)
self.assertEqual(TEST_RESOURCE, query.resource)
- def test_zstd_support_check(self):
- with patch('stem.prereq.is_zstd_available', Mock(return_value = True)):
- query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.ZSTD, start = False)
- self.assertEqual([stem.descriptor.Compression.ZSTD], query.compression)
-
- with patch('stem.prereq.is_zstd_available', Mock(return_value = False)):
- query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.ZSTD, start = False)
- self.assertEqual([stem.descriptor.Compression.PLAINTEXT], query.compression)
-
- def test_lzma_support_check(self):
- with patch('stem.prereq.is_lzma_available', Mock(return_value = True)):
- query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.LZMA, start = False)
- self.assertEqual([stem.descriptor.Compression.LZMA], query.compression)
-
- with patch('stem.prereq.is_lzma_available', Mock(return_value = False)):
- query = stem.descriptor.remote.Query(TEST_RESOURCE, compression = Compression.LZMA, start = False)
- self.assertEqual([stem.descriptor.Compression.PLAINTEXT], query.compression)
-
@patch('urllib.request.urlopen', _dirport_mock(read_resource('compressed_identity'), encoding = 'identity'))
def test_compression_plaintext(self):
"""
@@ -222,7 +203,7 @@ class TestDescriptorDownloader(unittest.TestCase):
Download a zstd compressed descriptor.
"""
- if not stem.prereq.is_zstd_available():
+ if not Compression.ZSTD.available:
self.skipTest('(requires zstd module)')
descriptors = list(stem.descriptor.remote.get_server_descriptors(
@@ -240,7 +221,7 @@ class TestDescriptorDownloader(unittest.TestCase):
Download a lzma compressed descriptor.
"""
- if not stem.prereq.is_lzma_available():
+ if not Compression.LZMA.available:
self.skipTest('(requires lzma module)')
descriptors = list(stem.descriptor.remote.get_server_descriptors(
diff --git a/test/unit/descriptor/server_descriptor.py b/test/unit/descriptor/server_descriptor.py
index 99eb2d27..e1036ada 100644
--- a/test/unit/descriptor/server_descriptor.py
+++ b/test/unit/descriptor/server_descriptor.py
@@ -16,7 +16,6 @@ import stem.descriptor
import stem.descriptor.router_status_entry
import stem.descriptor.server_descriptor
import stem.exit_policy
-import stem.prereq
import stem.version
import stem.util.str_tools
import test.require
@@ -647,18 +646,6 @@ Qlx9HNCqCY877ztFRC624ja2ql6A2hBcuoYMbkHjcQ4=
expect_invalid_attr(self, {'opt': 'protocols Link 1 2'}, 'circuit_protocols')
- @patch('stem.prereq.is_crypto_available', Mock(return_value = False))
- def test_published_leap_year(self):
- """
- Constructs with a published entry for a leap year, and when the date is
- invalid.
- """
-
- expect_invalid_attr(self, {'published': '2011-02-29 04:03:19'}, 'published')
-
- desc = RelayDescriptor.create({'published': '2012-02-29 04:03:19'})
- self.assertEqual(datetime.datetime(2012, 2, 29, 4, 3, 19), desc.published)
-
def test_published_no_time(self):
"""
Constructs with a published entry without a time component.
diff --git a/test/unit/directory/authority.py b/test/unit/directory/authority.py
index 1574bea3..68f1a2af 100644
--- a/test/unit/directory/authority.py
+++ b/test/unit/directory/authority.py
@@ -7,7 +7,6 @@ import unittest
import stem
import stem.directory
-import stem.prereq
from unittest.mock import patch, Mock
diff --git a/test/unit/manual.py b/test/unit/manual.py
index e1891ca4..006e0b3e 100644
--- a/test/unit/manual.py
+++ b/test/unit/manual.py
@@ -10,7 +10,6 @@ import tempfile
import unittest
import urllib.request
-import stem.prereq
import stem.manual
import stem.util.system
import test.require
diff --git a/test/unit/tutorial.py b/test/unit/tutorial.py
index 91a70a32..35b2fe28 100644
--- a/test/unit/tutorial.py
+++ b/test/unit/tutorial.py
@@ -168,7 +168,6 @@ class TestTutorial(unittest.TestCase):
@patch('sys.stdout', new_callable = io.StringIO)
@patch('stem.descriptor.remote.DescriptorDownloader')
- @patch('stem.prereq.is_crypto_available', Mock(return_value = False))
def test_mirror_mirror_on_the_wall_5(self, downloader_mock, stdout_mock):
def tutorial_example():
from stem.descriptor.remote import DescriptorDownloader
diff --git a/test/unit/tutorial_examples.py b/test/unit/tutorial_examples.py
index d96ff71b..fccdba57 100644
--- a/test/unit/tutorial_examples.py
+++ b/test/unit/tutorial_examples.py
@@ -9,7 +9,6 @@ import unittest
import stem.response
import stem.descriptor.remote
-import stem.prereq
from unittest.mock import Mock, patch
diff --git a/test/unit/util/system.py b/test/unit/util/system.py
index 32be337c..042c1bd1 100644
--- a/test/unit/util/system.py
+++ b/test/unit/util/system.py
@@ -8,12 +8,11 @@ system running the tests.
import functools
import ntpath
import os
+import platform
import posixpath
import tempfile
import unittest
-import stem.prereq
-
from unittest.mock import Mock, patch
from stem.util import system
@@ -152,7 +151,7 @@ class TestSystem(unittest.TestCase):
Exercises the size_of function.
"""
- if stem.prereq.is_pypy():
+ if platform.python_implementation() == 'PyPy':
self.assertRaises(NotImplementedError, system.size_of, 'hello')
else:
self.assertTrue(system.size_of('') < system.size_of('hello') < system.size_of('hello world'))
[View Less]
1
0

[translation/tpo-web] https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
by translation@torproject.org 18 Feb '20
by translation@torproject.org 18 Feb '20
18 Feb '20
commit df2dcc061ac924cbfabc096c26c3fe939c4590b0
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Feb 18 05:53:38 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=tpo-web
---
contents+cs.po | 5 +++--
contents+sk.po | 6 +++---
2 files changed, 6 insertions(+), 5 deletions(-)
diff --git a/contents+cs.po b/contents+cs.po
index a0da8fa926..0db99b3198 100644
--- a/contents+cs.po
+++ b/contents+cs.po
@@ -3,6 +3,7 @@
# IDRASSI Mounir <mounir.…
[View More]idrassi(a)idrix.fr>, 2019
# Ondrej Führer <transifex(a)fuhrer.cz>, 2019
# Michal Stanke <mstanke(a)mozilla.cz>, 2020
+# Lenka Ježková <lenka.jezkova(a)oziveni.cz>, 2020
#
msgid ""
msgstr ""
@@ -10,7 +11,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-15 12:00+CET\n"
"PO-Revision-Date: 2019-03-09 10:41+0000\n"
-"Last-Translator: Michal Stanke <mstanke(a)mozilla.cz>, 2020\n"
+"Last-Translator: Lenka Ježková <lenka.jezkova(a)oziveni.cz>, 2020\n"
"Language-Team: Czech (https://www.transifex.com/otf/teams/1519/cs/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1298,7 +1299,7 @@ msgstr ""
#: templates/reports.html:16
msgid "Reports"
-msgstr ""
+msgstr "Podání"
#: templates/reports.html:22
msgid "Year"
diff --git a/contents+sk.po b/contents+sk.po
index d21c1a19b2..eb851f0519 100644
--- a/contents+sk.po
+++ b/contents+sk.po
@@ -2,11 +2,11 @@
# Robert Kirschner <robertkirschner(a)yahoo.com>, 2019
# Michal Sykora <michal.sykora.sk(a)gmail.com>, 2019
# Marek Čápek <capek.marek(a)gmail.com>, 2019
-# Lenka Ježková <lenka.jezkova(a)oziveni.cz>, 2019
# Matúš <mato699(a)gmail.com>, 2019
# erinm, 2019
# IDRASSI Mounir <mounir.idrassi(a)idrix.fr>, 2019
# Iveta H, 2019
+# Lenka Ježková <lenka.jezkova(a)oziveni.cz>, 2020
#
msgid ""
msgstr ""
@@ -14,7 +14,7 @@ msgstr ""
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-11-15 12:00+CET\n"
"PO-Revision-Date: 2019-03-09 10:41+0000\n"
-"Last-Translator: Iveta H, 2019\n"
+"Last-Translator: Lenka Ježková <lenka.jezkova(a)oziveni.cz>, 2020\n"
"Language-Team: Slovak (https://www.transifex.com/otf/teams/1519/sk/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -1300,7 +1300,7 @@ msgstr ""
#: templates/reports.html:16
msgid "Reports"
-msgstr ""
+msgstr "Podania"
#: templates/reports.html:22
msgid "Year"
[View Less]
1
0

[metrics-web/master] Revert "Fix unknown issue with spread() function."
by karsten@torproject.org 17 Feb '20
by karsten@torproject.org 17 Feb '20
17 Feb '20
commit 45ae585ebfa97fbfb31f01c9943edae02edcedd7
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Wed Jan 22 16:32:59 2020 +0100
Revert "Fix unknown issue with spread() function."
This reverts commit b3e80fce17f04cf7c83ef3843d2de0cc3bfef389 and also
reverts a similar workaround made after that commit.
The spread() function works fine again using buster's r-cran-tidyr
0.8.2-1 package, whereas it was previously broken with stretch's
r-cran-tidyr …
[View More]0.6.1-1 package.
Fixes #30351.
---
src/main/R/rserver/rserve-init.R | 23 ++++++++++-------------
1 file changed, 10 insertions(+), 13 deletions(-)
diff --git a/src/main/R/rserver/rserve-init.R b/src/main/R/rserver/rserve-init.R
index df6da79..46abc8a 100644
--- a/src/main/R/rserver/rserve-init.R
+++ b/src/main/R/rserver/rserve-init.R
@@ -1,4 +1,3 @@
-require(reshape2)
require(ggplot2)
require(RColorBrewer)
require(scales)
@@ -437,7 +436,7 @@ prepare_platforms <- function(start_p = NULL, end_p = NULL) {
filter(if (!is.null(start_p)) date >= as.Date(start_p) else TRUE) %>%
filter(if (!is.null(end_p)) date <= as.Date(end_p) else TRUE) %>%
mutate(platform = tolower(platform)) %>%
- dcast(date ~ platform, value.var = "relays")
+ spread(platform, relays)
}
plot_platforms <- function(start_p, end_p, path_p) {
@@ -748,7 +747,7 @@ prepare_connbidirect <- function(start_p = NULL, end_p = NULL) {
filter(if (!is.null(end_p)) date <= as.Date(end_p) else TRUE) %>%
mutate(quantile = paste("X", quantile, sep = ""),
fraction = fraction / 100) %>%
- dcast(date + direction ~ quantile, value.var = "fraction") %>%
+ spread(quantile, fraction) %>%
rename(q1 = X0.25, md = X0.5, q3 = X0.75)
}
@@ -800,8 +799,7 @@ prepare_bandwidth_flags <- function(start_p = NULL, end_p = NULL) {
filter(if (!is.null(end_p)) date <= as.Date(end_p) else TRUE) %>%
filter(!is.na(have_exit_flag)) %>%
filter(!is.na(have_guard_flag)) %>%
- dcast(date + have_guard_flag + have_exit_flag ~ variable,
- value.var = "value")
+ spread(variable, value)
}
plot_bandwidth_flags <- function(start_p, end_p, path_p) {
@@ -1131,7 +1129,7 @@ prepare_advbwdist_perc <- function(start_p = NULL, end_p = NULL, p_p = NULL) {
transmute(date, percentile = as.factor(percentile),
variable = ifelse(is.na(isexit), "all", "exits"),
advbw = advbw * 8 / 1e9) %>%
- dcast(date + percentile ~ variable, value.var = "advbw") %>%
+ spread(variable, advbw) %>%
rename(p = percentile)
}
@@ -1169,7 +1167,7 @@ prepare_advbwdist_relay <- function(start_p = NULL, end_p = NULL, n_p = NULL) {
transmute(date, relay = as.factor(relay),
variable = ifelse(is.na(isexit), "all", "exits"),
advbw = advbw * 8 / 1e9) %>%
- dcast(date + relay ~ variable, value.var = "advbw") %>%
+ spread(variable, advbw) %>%
rename(n = relay)
}
@@ -1267,7 +1265,7 @@ prepare_webstats_tb <- function(start_p = NULL, end_p = NULL) {
filter(request_type %in% c("tbid", "tbsd", "tbup", "tbur")) %>%
group_by(log_date, request_type) %>%
summarize(count = sum(count)) %>%
- dcast(log_date ~ request_type, value.var = "count") %>%
+ spread(request_type, count) %>%
rename(date = log_date, initial_downloads = tbid,
signature_downloads = tbsd, update_pings = tbup,
update_requests = tbur)
@@ -1312,7 +1310,7 @@ prepare_webstats_tb_platform <- function(start_p = NULL, end_p = NULL) {
filter(request_type %in% c("tbid", "tbup")) %>%
group_by(log_date, platform, request_type) %>%
summarize(count = sum(count)) %>%
- dcast(log_date + platform ~ request_type, value.var = "count") %>%
+ spread(request_type, count, fill = 0) %>%
rename(date = log_date, initial_downloads = tbid, update_pings = tbup)
}
@@ -1360,7 +1358,7 @@ prepare_webstats_tb_locale <- function(start_p = NULL, end_p = NULL) {
group_by(date, locale, request_type) %>%
summarize(count = sum(count)) %>%
mutate(request_type = factor(request_type, levels = c("tbid", "tbup"))) %>%
- dcast(date + locale ~ request_type, value.var = "count") %>%
+ spread(request_type, count, fill = 0) %>%
rename(initial_downloads = tbid, update_pings = tbup)
}
@@ -1415,7 +1413,7 @@ prepare_webstats_tb_channel <- function(start_p = NULL, end_p = NULL) {
filter(channel %in% c("a", "r")) %>%
group_by(log_date, channel, request_type) %>%
summarize(count = sum(count)) %>%
- dcast(log_date + channel ~ request_type, value.var = "count") %>%
+ spread(request_type, count) %>%
rename(date = log_date, update_pings = tbup, update_requests = tbur)
}
@@ -1461,8 +1459,7 @@ prepare_webstats_tm <- function(start_p = NULL, end_p = NULL) {
group_by(log_date, request_type) %>%
summarize(count = sum(count)) %>%
mutate(request_type = factor(request_type, levels = c("tmid", "tmup"))) %>%
- dcast(log_date ~ request_type, value.var = "count", drop = FALSE,
- fill = 0) %>%
+ spread(request_type, count, drop = FALSE, fill = 0) %>%
rename(date = log_date, initial_downloads = tmid, update_pings = tmup)
}
[View Less]
1
0

[translation/torbirdy_completed] https://gitweb.torproject.org/translation.git/commit/?h=torbirdy_completed
by translation@torproject.org 17 Feb '20
by translation@torproject.org 17 Feb '20
17 Feb '20
commit 7dcc5fdec2b4612cceafe0cb99f94986395c86fd
Author: Translation commit bot <translation(a)torproject.org>
Date: Mon Feb 17 05:20:55 2020 +0000
https://gitweb.torproject.org/translation.git/commit/?h=torbirdy_completed
---
vi/torbirdy.properties | 24 ++++++++++++------------
1 file changed, 12 insertions(+), 12 deletions(-)
diff --git a/vi/torbirdy.properties b/vi/torbirdy.properties
index 5315699d2f..9fa0965ccb 100644
--- a/vi/torbirdy.properties
+++ b/vi/torbirdy.properties
…
[View More]@@ -1,15 +1,15 @@
-torbirdy.name=TorBirdy
+# torbirdy.name=TorBirdy
-torbirdy.enabled.tor=TorBirdy đã kích hoạt: Tor
-torbirdy.enabled.jondo=TorBirdy được kích hoạt: JonDo
-torbirdy.enabled.custom=TorBirdy đã kích hoạt: Ủy quyền tùy chỉnh
-torbirdy.enabled.torification=TorBirdy được kích hoạt: Transparent Torification
-torbirdy.enabled.whonix=TorBirdy đã kích hoạt: Whonix
-torbirdy.disabled=TorBirdy: Đã bị vô hiệu hoá.
-torbirdy.enabled=TorBirdy: Đã kích hoạt
+# torbirdy.enabled.tor=TorBirdy Enabled: Tor
+# torbirdy.enabled.jondo=TorBirdy Enabled: JonDo
+# torbirdy.enabled.custom=TorBirdy Enabled: Custom Proxy
+# torbirdy.enabled.torification=TorBirdy Enabled: Transparent Torification
+# torbirdy.enabled.whonix=TorBirdy Enabled: Whonix
+# torbirdy.disabled=TorBirdy: Disabled!
+# torbirdy.enabled=TorBirdy: Enabled
-torbirdy.email.prompt=TorBirdy đã vô hiệu hoá thuật sĩ tự động cấu hình của ThunderBird để bảo vệ sự ẩn danh của bạn.\nBạn có thể cài đặt cấu hình các tài khoản bằng thủ công.
+# torbirdy.email.prompt=TorBirdy has disabled Thunderbird's auto-configuration wizard to protect your anonymity.\n\nThe recommended security settings for %S have been set.\n\nYou can now configure the other account settings manually.
-torbirdy.email.advanced=Vui lòng chú ý việc thay đổi các cài đặt nâng cao của TorBirdy là không được khuyến khích.\nBạn chỉ nên tiếp tục nếu như bạn biết chắc rằng mình đang làm gì.
-torbirdy.email.advanced.nextwarning=HIển thị cảnh báo này trong thời gian tới.
-torbirdy.email.advanced.title=Những cài đặt nâng cao của TorBirdy
+# torbirdy.email.advanced=Please note that changing the advanced settings of TorBirdy is NOT recommended.\n\nYou should only continue if you are sure of what you are doing.
+# torbirdy.email.advanced.nextwarning=Show this warning next time
+# torbirdy.email.advanced.title=TorBirdy Advanced Settings
[View Less]
1
0