tor-commits
Threads by month
- ----- 2025 -----
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
April 2017
- 19 participants
- 966 discussions
commit cd299eea7451d92fc7d47374d42080ec7b9712b1
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Apr 13 20:30:03 2017 +0000
Translations update
---
src/chrome/locale/ar/network-settings.dtd | 2 +-
src/chrome/locale/bn/network-settings.dtd | 2 +-
src/chrome/locale/da/network-settings.dtd | 52 +++++++++++++-------------
src/chrome/locale/da/progress.dtd | 8 ++--
src/chrome/locale/da/torlauncher.properties | 18 ++++-----
src/chrome/locale/es-MX/network-settings.dtd | 2 +-
src/chrome/locale/es/network-settings.dtd | 28 +++++++-------
src/chrome/locale/es/torlauncher.properties | 4 +-
src/chrome/locale/fil/progress.dtd | 2 +-
src/chrome/locale/fil/torlauncher.properties | 8 ++--
src/chrome/locale/fr-CA/network-settings.dtd | 4 +-
src/chrome/locale/fr/network-settings.dtd | 28 +++++++-------
src/chrome/locale/fr/torlauncher.properties | 6 +--
src/chrome/locale/hr-HR/network-settings.dtd | 4 +-
src/chrome/locale/hr-HR/torlauncher.properties | 6 +--
src/chrome/locale/it/network-settings.dtd | 2 +-
src/chrome/locale/lt/network-settings.dtd | 22 +++++------
src/chrome/locale/lt/torlauncher.properties | 20 +++++-----
src/chrome/locale/nb/network-settings.dtd | 2 +-
src/chrome/locale/pt/network-settings.dtd | 14 +++----
src/chrome/locale/pt/progress.dtd | 2 +-
src/chrome/locale/pt/torlauncher.properties | 8 ++--
src/chrome/locale/ru/network-settings.dtd | 2 +-
src/chrome/locale/sv/network-settings.dtd | 2 +-
src/chrome/locale/zh-CN/network-settings.dtd | 2 +-
25 files changed, 125 insertions(+), 125 deletions(-)
diff --git a/src/chrome/locale/ar/network-settings.dtd b/src/chrome/locale/ar/network-settings.dtd
index 73be5a2..a20acd8 100644
--- a/src/chrome/locale/ar/network-settings.dtd
+++ b/src/chrome/locale/ar/network-settings.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torsettings.dialog.title "إعدادات الشبكة">
+<!ENTITY torsettings.dialog.title "إعدادات شبكة تور">
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "لغة متصفح تور">
diff --git a/src/chrome/locale/bn/network-settings.dtd b/src/chrome/locale/bn/network-settings.dtd
index a674a2c..5ebd2d0 100644
--- a/src/chrome/locale/bn/network-settings.dtd
+++ b/src/chrome/locale/bn/network-settings.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torsettings.dialog.title "Tor Network Settings">
+<!ENTITY torsettings.dialog.title "টর নেটওয়ার্ক সেটিংস">
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Tor Browser Language">
diff --git a/src/chrome/locale/da/network-settings.dtd b/src/chrome/locale/da/network-settings.dtd
index aa32a1f..2851032 100644
--- a/src/chrome/locale/da/network-settings.dtd
+++ b/src/chrome/locale/da/network-settings.dtd
@@ -1,75 +1,75 @@
<!ENTITY torsettings.dialog.title "Tor netværksindstillinger">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser Sprog">
+<!ENTITY torlauncher.localePicker.title "Tor Browser sprog">
<!ENTITY torlauncher.localePicker.prompt "Vælg venligst et sprog.">
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Før du forbinder til Tor netværket, skal du indtaste information om denne computers Internetforbindelse.">
+<!ENTITY torsettings.prompt "Før du opretter forbindelse til Tor-netværket, skal du indtaste information om denne computers internetforbindelse.">
<!ENTITY torSettings.yes "Ja">
<!ENTITY torSettings.no "Nej">
<!ENTITY torSettings.firstQuestion "Hvilke af de følgende beskriver bedst din situation?">
<!ENTITY torSettings.configurePrompt1 "Denne computers internetforbindelse er censureret eller er etableret gennem en proxy.">
-<!ENTITY torSettings.configurePrompt2 "I need to configure bridge or local proxy settings before I connect to the Tor network.">
+<!ENTITY torSettings.configurePrompt2 "Jeg skal konfigurerer bro- og lokal proxyindstillinger før jeg opretter forbindelse til Tor-netværket.">
<!ENTITY torSettings.configure "Indstil">
-<!ENTITY torSettings.connectPrompt2 "I would like to make a direct connection to the Tor network.">
+<!ENTITY torSettings.connectPrompt2 "Jeg vil foretage en direkte forbindelse til Tor-netværket.">
<!ENTITY torSettings.connectPrompt3 "Dette vil virker i de fleste situationer">
<!ENTITY torSettings.connect "Tilslut">
<!ENTITY torSettings.proxyPageTitle "Lokale proxy indstillinger">
-<!ENTITY torSettings.proxyQuestion "Behøver denne computer bruge en lokal proxy for at tilgå Internettet?">
+<!ENTITY torSettings.proxyQuestion "Behøver denne computer bruge en lokal proxy for at tilgå internettet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyExplanation1 "In most cases a local proxy is not needed, but it may be required when connecting through a company, school, or university network.">
-<!ENTITY torSettings.proxyExplanation2 "If you are not sure how to answer this question, look at the Internet settings in another browser or check your system's network settings to see whether a local proxy is needed.">
+<!ENTITY torSettings.proxyExplanation1 "I de fleste tilfælde er en lokal proxy ikke nødvendig, men det kan være krævet når der oprettes forbindelse gennem netværket i en virksomhed, skole eller universitet.">
+<!ENTITY torSettings.proxyExplanation2 "Hvis du ikke er sikker på hvad du skal svare til dette spørgsmål, så kig i internetindstillingerne i en anden browser og tjek dit systems netværksindstillinger, for at se hvorvidt det er nødvendigt med en lokal proxy.">
<!ENTITY torSettings.enterProxy "Indtast proxy-indstillinger.">
<!ENTITY torSettings.bridgePageTitle "Tor bridge konfiguration">
-<!ENTITY torSettings.bridgeQuestion "Blokerer eller censurerer din internetudbyder (ISP) forbindelser til Tor netværket?">
-<!ENTITY torSettings.bridgeExplanation1 "If you are not sure how to answer this question, choose No (if you are unable to connect to the Tor network without a bridge, you can add one later).">
-<!ENTITY torSettings.bridgeExplanation2 "If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
+<!ENTITY torSettings.bridgeQuestion "Blokerer eller censurerer din internetudbyder (ISP) forbindelser til Tor-netværket?">
+<!ENTITY torSettings.bridgeExplanation1 "Hvis du ikke er sikker på hvad du skal svare til dette spørgsmål, så vælg Nej (hvis du ikke er i stand til at oprette forbindelse til Tor-netværket gennem en bro, så kan du tilføje en senere).">
+<!ENTITY torSettings.bridgeExplanation2 "Hvis du vælger Ja, så vil du blive spurgt om at konfigurere Tor-broer, hvilket er ulistede relæer som gøre det svære at blokere forbindelser til Tor-netværket.">
<!ENTITY torSettings.bridgeSettingsPrompt "Du kan bruge det tildelte sæt broer eller du kan hente og indtaste et skræddersyet sæt broer.">
<!-- Other: -->
<!ENTITY torsettings.startingTor "Venter på at Tor starter...">
<!ENTITY torsettings.restartTor "Genstart Tor">
-<!ENTITY torsettings.reconfigTor "Reconfigure">
+<!ENTITY torsettings.reconfigTor "Genkonfigurer">
-<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
-<!ENTITY torsettings.discardSettings.proceed "Remove Settings and Connect">
+<!ENTITY torsettings.discardSettings.prompt "Du har konfigureret Tor-broer eller du har indtastet lokale proxyindstillinger.  For at kunne foretage direkte forbindelse til Tor-netværket, skal disse indstillinger fjernes.">
+<!ENTITY torsettings.discardSettings.proceed "Fjern indstillinger og opret forbindelse">
<!ENTITY torsettings.optional "Valgfri">
-<!ENTITY torsettings.useProxy.checkbox "Denne computer skal bruge en lokal proxy for at tilgå Internettet">
+<!ENTITY torsettings.useProxy.checkbox "Denne computer skal bruge en lokal proxy for at tilgå internettet">
<!ENTITY torsettings.useProxy.type "Proxy type:">
<!ENTITY torsettings.useProxy.address "Adresse:">
<!ENTITY torsettings.useProxy.address.placeholder "IP adresse eller værtsnavn">
<!ENTITY torsettings.useProxy.port "Port:">
<!ENTITY torsettings.useProxy.username "Brugernavn:">
-<!ENTITY torsettings.useProxy.password "Kodeord:">
+<!ENTITY torsettings.useProxy.password "Adgangskode:">
<!ENTITY torsettings.useProxy.type.socks4 "SOCKS 4">
<!ENTITY torsettings.useProxy.type.socks5 "SOCKS 5">
-<!ENTITY torsettings.useProxy.type.http "HTTP / HTTPS">
+<!ENTITY torsettings.useProxy.type.http "HTTP/HTTPS">
<!ENTITY torsettings.firewall.checkbox "Denne computer går gennem en firewall som kun tillader forbindelse til specifikke porte">
<!ENTITY torsettings.firewall.allowedPorts "Tilladte Porte:">
-<!ENTITY torsettings.useBridges.checkbox "Min udbyder (ISP) blokerer forbindelse til Tor netværket">
+<!ENTITY torsettings.useBridges.checkbox "Min internetudbyder (ISP) blokerer forbindelser til Tor-netværket">
<!ENTITY torsettings.useBridges.default "Forbind med tildelte broer">
-<!ENTITY torsettings.useBridges.note "Each type of bridge uses a different method to avoid censorship.  If one bridge does not work, try again using a different one.">
-<!ENTITY torsettings.useBridges.type "Transport type:">
+<!ENTITY torsettings.useBridges.note "Hver type bro bruger forskellige metoder for at undgå censurering.  Hvis en bro ikke virker, så prøv igen med en anden.">
+<!ENTITY torsettings.useBridges.type "Transporttype:">
<!ENTITY torsettings.useBridges.custom "Indtast skræddersyede broer">
-<!ENTITY torsettings.useBridges.label "Indtast et eller flere bro-relæer (et per linie)">
+<!ENTITY torsettings.useBridges.label "Indtast et eller flere bro-relæer (et pr. linje)">
<!ENTITY torsettings.useBridges.placeholder "type adresse:port">
<!ENTITY torsettings.copyLog "Kopier Tor loggen til udklipsholderen">
<!ENTITY torsettings.bridgeHelpTitle "Bro-relæ hjælp">
-<!ENTITY torsettings.bridgeHelp1 "Hvis du ikke kan forbinde dig til Tor netværket er det muligt at din internet udbyder (ISP) eller anden myndighed blokerer Tor.   Det er ofte muligt at komme rundt om en blokade ved at bruge en Tor bro. En bro er et relæ som ikke er på den offentliggjorte liste og som derfor er sværere at blokkere.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
-<!ENTITY torsettings.bridgeHelp2Heading "På nettet">
+<!ENTITY torsettings.bridgeHelp1 "Hvis du ikke kan oprette forbindelse til Tor-netværket er det muligt at din internetudbyder (ISP) eller anden myndighed blokerer Tor.   Det er ofte muligt at omgå problemet ved at bruge Tor-broer. En bro er et relæ som ikke er på den offentliggjorte liste og som derfor er sværere at blokkere.">
+<!ENTITY torsettings.bridgeHelp1B "Du kan bruge de prækonfigurerede, tildelte sæt af broadresser eller du kan få fat i et tilpasset sæt af adresser, ved at bruge en af disse metoder:">
+<!ENTITY torsettings.bridgeHelp2Heading "Gennem webbet">
<!ENTITY torsettings.bridgeHelp2 "Brug en browser og besøg https://bridges.torproject.org">
-<!ENTITY torsettings.bridgeHelp3Heading "Via den automatiske email service">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Send e-mail til bridges(a)torproject.org med linjen 'get bridges' som det eneste i beskedteksten.  Men, for at gøre det sværere for en angriber at få kendskab til en masse broadresser, skal du sende din forespørgsel fra en af de følgende e-mailudbydere (i foretrukket rækkefølge):">
+<!ENTITY torsettings.bridgeHelp3Heading "Via den automatiske e-mailservice">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Send e-mail til bridges(a)torproject.org med linjen "get bridges" som det eneste i beskedteksten.  Men, for at gøre det sværere for en angriber at få kendskab til en masse broadresser, skal du sende din forespørgsel fra en af de følgende e-mailudbydere (i foretrukket rækkefølge):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com eller https://mail.yahoo.com">
<!ENTITY torsettings.bridgeHelp4Heading "Via vores Help Desk">
-<!ENTITY torsettings.bridgeHelp4 "Som en sidste mulighed kan du bede om at få en bro adresse tilsendt ved at sende en venlig email to help(a)rt.torproject.org.  Bemærk venligst at alle emails besvares manuelt.">
+<!ENTITY torsettings.bridgeHelp4 "Som en sidste mulighed kan du bede om at få en bro adresse tilsendt ved at sende en venlig e-mail to help(a)rt.torproject.org.  Bemærk venligst at alle e-mails besvares manuelt.">
diff --git a/src/chrome/locale/da/progress.dtd b/src/chrome/locale/da/progress.dtd
index 2a8a41a..063ad85 100644
--- a/src/chrome/locale/da/progress.dtd
+++ b/src/chrome/locale/da/progress.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torprogress.dialog.title "Tor Status">
-<!ENTITY torprogress.openSettings "Åben Indstillinger">
-<!ENTITY torprogress.heading "Forbinder til Tor netværket">
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
+<!ENTITY torprogress.dialog.title "Tor status">
+<!ENTITY torprogress.openSettings "Åbn indstillinger">
+<!ENTITY torprogress.heading "Opretter forbindelse til Tor-netværket">
+<!ENTITY torprogress.pleaseWait "Vent venligst mens vi etablerer en forbindelse til Tor-netværket.  Det kan tage flere minutter.">
diff --git a/src/chrome/locale/da/torlauncher.properties b/src/chrome/locale/da/torlauncher.properties
index 2ca0df2..e18d62f 100644
--- a/src/chrome/locale/da/torlauncher.properties
+++ b/src/chrome/locale/da/torlauncher.properties
@@ -4,31 +4,31 @@
torlauncher.error_title=Tor starter
torlauncher.tor_exited_during_startup=Tor lukkede under opstart. Det kan skyldes en fejl i din torrc-fil, en fejl i Tor eller et andet program på dit system, eller hardwarefejl. Tor Browser vil ikke starte, før du løser det underliggende problem og genstarter Tor.
-torlauncher.tor_exited=Tor lukkede uventet. Dette kan skyldes en fejl i selve Tor, et andet program i dit system eller en hardware-fejl. Tor-browseren vil ikke være i stand til at forbinde til noget som helst website før du genstarter Tor. Send en kopi af din Tor-log til support-teamet hvis problemet fortsætter.
+torlauncher.tor_exited=Tor lukkede uventet. Dette kan skyldes en fejl i selve Tor, et andet program i dit system eller en hardware-fejl. Tor-browseren vil ikke være i stand til at forbinde til noget som helst websted før du genstarter Tor. Send en kopi af din Tor-log til support-teamet hvis problemet fortsætter.
torlauncher.tor_exited2=Fanebladene i din browser vil ikke blive lukket ved af at du genstarter Tor.
torlauncher.tor_controlconn_failed=Kunne ikke forbinde til Tor kontrol-porten.
torlauncher.tor_failed_to_start=Tor kunne ikke starte.
torlauncher.tor_control_failed=Det lykkedes ikke at tage kontrol over Tor.
-torlauncher.tor_bootstrap_failed=Tor kunne ikke etablere forbindelse til Tor netværket
+torlauncher.tor_bootstrap_failed=Tor kunne ikke etablere forbindelse til Tor-netværket
torlauncher.tor_bootstrap_failed_details=%1$S fejlede (%2$S).
torlauncher.unable_to_start_tor=Kan ikke starte Tor.\n\n%S
torlauncher.tor_missing=Kunne ikke finde Tor programmet.
torlauncher.torrc_missing=torrc-filen mangler og kunne ikke dannes.
torlauncher.datadir_missing=Tor-datamappen findes ikke og kunne ikke dannes.
-torlauncher.password_hash_missing=Kunne ikke finde hash-værdi af kodeordet.
+torlauncher.password_hash_missing=Kunne ikke finde hash-værdi af adgangskode.
torlauncher.failed_to_get_settings=Kunne ikke læse Tor indstillingerne..⏎\n⏎\n%S
torlauncher.failed_to_save_settings=Kunne ikke gemme Tor indstillingerne.⏎\n⏎\n%S
torlauncher.ensure_tor_is_running=Kontroller venligst at Tor kører.
-torlauncher.error_proxy_addr_missing=Du skal angive både IP adresse eller værts navn og en port, for at indstille Tor til at bruge en proxy som forbindelse til Internettet.
+torlauncher.error_proxy_addr_missing=Du skal angive både IP adresse eller værts navn og en port, for at indstille Tor til at bruge en proxy som forbindelse til internettet.
torlauncher.error_proxy_type_missing=Du skal vælge proxy-typen:
torlauncher.error_bridges_missing=Du skal angive en eller flere broer.
torlauncher.error_default_bridges_type_missing=Du skal vælge en transporttype for de tildelte broer.
-torlauncher.error_bridge_bad_default_type=Ingen tildelte broer med transporttypen %S er tilgængelige. Venligst justér dine indstillinger.
+torlauncher.error_bridge_bad_default_type=Ingen tildelte broer med transporttypen %S er tilgængelige. Justér venligst dine indstillinger.
-torlauncher.recommended_bridge=(Anbefalet)
+torlauncher.recommended_bridge=(anbefalet)
torlauncher.connect=Tilslut
torlauncher.restart_tor=Genstart Tor
@@ -46,11 +46,11 @@ torlauncher.bootstrapStatus.handshake_dir=Opretter en krypteret mappe forbindels
torlauncher.bootstrapStatus.requesting_status=Henter netværk status
torlauncher.bootstrapStatus.loading_status=Henter netværk status
torlauncher.bootstrapStatus.loading_keys=Henter nøglecentercertifikater
-torlauncher.bootstrapStatus.requesting_descriptors=Beder om relæ information
+torlauncher.bootstrapStatus.requesting_descriptors=Anmoder om relæ information
torlauncher.bootstrapStatus.loading_descriptors=Henter relæ information
-torlauncher.bootstrapStatus.conn_or=Forbinder til Tor netværk
+torlauncher.bootstrapStatus.conn_or=Opretter forbindelse til Tor-netværket
torlauncher.bootstrapStatus.handshake_or=Opretter et Tor kredsløb
-torlauncher.bootstrapStatus.done=Forbundet til Tor netværket!
+torlauncher.bootstrapStatus.done=Forbundet til Tor-netværket!
torlauncher.bootstrapWarning.done=færdig
torlauncher.bootstrapWarning.connectrefused=forbindelse afvist
diff --git a/src/chrome/locale/es-MX/network-settings.dtd b/src/chrome/locale/es-MX/network-settings.dtd
index 6dca5f8..ad001f4 100644
--- a/src/chrome/locale/es-MX/network-settings.dtd
+++ b/src/chrome/locale/es-MX/network-settings.dtd
@@ -40,7 +40,7 @@
<!ENTITY torsettings.discardSettings.prompt "Has configurado los puentes Tor o has introducido un proxy local settings.  Para hacer una conexión directa a la red Tor, esta configuración debe removerse. ">
<!ENTITY torsettings.discardSettings.proceed "Remover configuración y conectarse">
-<!ENTITY torsettings.optional "Optional">
+<!ENTITY torsettings.optional "Opcional">
<!ENTITY torsettings.useProxy.checkbox "This computer needs to use a local proxy to access the Internet">
<!ENTITY torsettings.useProxy.type "Proxy Type:">
diff --git a/src/chrome/locale/es/network-settings.dtd b/src/chrome/locale/es/network-settings.dtd
index 91a356a..dc01bb3 100644
--- a/src/chrome/locale/es/network-settings.dtd
+++ b/src/chrome/locale/es/network-settings.dtd
@@ -13,9 +13,9 @@
<!ENTITY torSettings.firstQuestion "¿Cuál de las siguientes opciones describe mejor su situación?">
<!ENTITY torSettings.configurePrompt1 "La conexión a Internet de este equipo está censurada o proxificada.">
-<!ENTITY torSettings.configurePrompt2 "Necesito configurar los ajustes de puente de red o proxy local antes de conectar a la red Tor. ">
+<!ENTITY torSettings.configurePrompt2 "Necesito configurar puentes de red o proxy local antes de conectar a la red Tor. ">
<!ENTITY torSettings.configure "Configurar">
-<!ENTITY torSettings.connectPrompt2 "Quisiera hacer una conexión directa a la red Tor.">
+<!ENTITY torSettings.connectPrompt2 "Me gustaría conectar directamente a la red Tor.">
<!ENTITY torSettings.connectPrompt3 "Esto funcionará en la mayoría de las situaciones.">
<!ENTITY torSettings.connect "Conectar">
@@ -23,13 +23,13 @@
<!ENTITY torSettings.proxyQuestion "¿Necesita mi computadora utilizar un proxy local para acceder a Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
<!ENTITY torSettings.proxyExplanation1 "En la mayoría de los casos no se requiere un proxy (interpuesto) local, pero puede ser necesario al realizar una conexión a través de una red de empresa, de escuela, o universitaria. ">
-<!ENTITY torSettings.proxyExplanation2 "Si no está seguro de cómo responder a esta pregunta, mire la configuración de Internet en otro navegador o compruebe la configuración de red de su sistema para ver si un proxy local es necesario.">
-<!ENTITY torSettings.enterProxy "Introduzca los ajustes del proxy.">
+<!ENTITY torSettings.proxyExplanation2 "Si no estás seguro de cómo responder a esta pregunta mira la configuración de Internet en otro navegador o comprueba la configuración de red de tu sistema para ver si necesitas un proxy local.">
+<!ENTITY torSettings.enterProxy "Introduce los ajustes del proxy.">
<!ENTITY torSettings.bridgePageTitle "Configuración de puentes de red Tor">
<!ENTITY torSettings.bridgeQuestion "Su proveedor de servicios de Internet (ISP) bloquea o censura de alguna forma las conexiones hacia la red Tor?">
-<!ENTITY torSettings.bridgeExplanation1 "Si no está seguro de cómo responder a esta pregunta, elija No (si no puede conectarse a la red Tor sin un puente de red (bridge), puede añadir uno más adelante).">
-<!ENTITY torSettings.bridgeExplanation2 "Si elige Sí, se le pedirá que configure los puentes de red (bridges) de Tor, que son repetidores no listados que dificultan el bloqueo de conexiones hacia la red Tor.">
-<!ENTITY torSettings.bridgeSettingsPrompt "Puede utilizar el conjunto de puentes de red (bridges) proporcionado, o puede obtener e introducir un juego de puentes personalizado.">
+<!ENTITY torSettings.bridgeExplanation1 "Si no estás seguro de cómo responder a esta pregunta elige No (si no puedes conectarte a la red Tor sin un puente de red o bridge, puedes añadir uno más adelante).">
+<!ENTITY torSettings.bridgeExplanation2 "Si eliges Sí se te pedirá que configures los puentes de red (bridges) de Tor, que son repetidores no listados que dificultan el bloqueo de conexiones hacia la red Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Puedes utilizar el grupo de puentes de red (bridges) proporcionado, o puedes obtener e introducir un grupo de puentes propio.">
<!-- Other: -->
@@ -37,8 +37,8 @@
<!ENTITY torsettings.restartTor "Reiniciar Tor">
<!ENTITY torsettings.reconfigTor "Configurar de nuevo">
-<!ENTITY torsettings.discardSettings.prompt "Ha configurado los puentes de red (bridges) de Tor o ha introducido los ajustes para proxy (interpuesto) local.  Para realizar una conexión directa a la red Tor, estos ajustes deben ser borrados.">
-<!ENTITY torsettings.discardSettings.proceed "Eliminar ajustes y conectar">
+<!ENTITY torsettings.discardSettings.prompt "Has configurado los puentes de red (bridges) de Tor o has introducido los ajustes para proxy (interpuesto) local.  Para realizar una conexión directa a la red Tor, estos ajustes se deben borrar.">
+<!ENTITY torsettings.discardSettings.proceed "Elimina ajustes y conecta">
<!ENTITY torsettings.optional "Opcional">
@@ -56,7 +56,7 @@
<!ENTITY torsettings.firewall.allowedPorts "Puertos permitidos:">
<!ENTITY torsettings.useBridges.checkbox "Mi Proveedor de Servicios de Internet (ISP) bloquea las conexiones a la red Tor">
<!ENTITY torsettings.useBridges.default "Conectar con los puentes proporcionados">
-<!ENTITY torsettings.useBridges.note "Cada tipo de puente de red usa un método diferente para evitar la censura.  Si un puente no funciona, inténtelo de nuevo utilizando otro distinto.">
+<!ENTITY torsettings.useBridges.note "Cada tipo de puente de red usa un método diferente para evitar la censura.  Si un puente no funciona, inténtalo de nuevo utilizando otro.">
<!ENTITY torsettings.useBridges.type "Tipo de transporte:">
<!ENTITY torsettings.useBridges.custom "Introducir puentes personalizados">
<!ENTITY torsettings.useBridges.label "Introduzca uno o más repetidores puente(uno por línea).">
@@ -65,12 +65,12 @@
<!ENTITY torsettings.copyLog "Copiar el registro de mensajes(log) de Tor al portapapeles">
<!ENTITY torsettings.bridgeHelpTitle "Ayuda de repetidores puente ('bridge relays')">
<!ENTITY torsettings.bridgeHelp1 "Si no puede conectarse a la red Tor, podría ser que su proveedor de servicios de Internet (ISP) u otra agencia, esté bloqueando Tor.  A menudo, puede evitar este problema usando puentes ('bridges') de Tor, que son repetidores ('relays') de salida de la red Tor que no son públicos, y es más difícil que sean bloqueados.">
-<!ENTITY torsettings.bridgeHelp1B "Puede usar el juego preajustado de direcciones de puentes de red proporcionado, o puede obtener un juego personalizado de direcciones usando uno de estos métodos:">
+<!ENTITY torsettings.bridgeHelp1B "Puedes usar grupo de direcciones de puentes de red proporcionado aquí, o puedes obtener un nuevo grupo de direcciones usando uno de estos métodos:">
<!ENTITY torsettings.bridgeHelp2Heading "Mediante la web">
<!ENTITY torsettings.bridgeHelp2 "Use un navegador web para visitar https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Mediante el correo electrónico automático">
-<!ENTITY torsettings.bridgeHelp3.emailDesc "Envíe un correo electrónico a bridges(a)torproject.org únicamente con la línea 'get bridges' en el cuerpo del mensaje.  Sin embargo, para ponerle más difícil a un atacante el poder adquirir muchas direcciones de puentes, tiene que enviar esta petición desde uno de los siguientes proveedores de correo electrónico (listados en orden de preferencia):">
+<!ENTITY torsettings.bridgeHelp3.emailDesc "Envía un correo electrónico a bridges(a)torproject.org únicamente con la línea 'get bridges' en el cuerpo del mensaje.  Para que sea más difícil para un atacante adquirir muchas direcciones de puentes, tienes que enviar esta petición desde uno de los siguientes proveedores de correo electrónico (listados en orden de preferencia):">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com o https://mail.yahoo.com">
<!ENTITY torsettings.bridgeHelp4Heading "Mediante el soporte de usuario">
-<!ENTITY torsettings.bridgeHelp4 "Como último recurso, puede pedir direcciones de repetidores puente enviando un cortés mensaje de correo a help(a)rt.torproject.org . 
-Por favor tenga en cuenta que es una persona la que tendrá que responder a cada petición.">
+<!ENTITY torsettings.bridgeHelp4 "Como último recurso, puedes pedir direcciones de repetidores puente enviando un mensaje de correo amable a help(a)rt.torproject.org . 
+Por favor ten en cuenta que es una persona la que tendrá que responder a cada petición.">
diff --git a/src/chrome/locale/es/torlauncher.properties b/src/chrome/locale/es/torlauncher.properties
index 00bada5..d414c01 100644
--- a/src/chrome/locale/es/torlauncher.properties
+++ b/src/chrome/locale/es/torlauncher.properties
@@ -3,7 +3,7 @@
torlauncher.error_title=Arranque de Tor
-torlauncher.tor_exited_during_startup=Tor se cerró durante el arranque. Esto se podría deber a un error en su fichero torrc, un fallo en Tor o en otro programa de su sistema, o a hardware defectuoso. Hasta que solucione el problema subyacente y reinice Tor, el Navegador Tor no se iniciará.
+torlauncher.tor_exited_during_startup=Tor se cerró durante el arranque. Esto se podría deber a un error en tu fichero torrc, un fallo en Tor o en otro programa de tu sistema, o a hardware defectuoso. Hasta que soluciones el problema subyacente y reinices Tor, el Navegador Tor no se iniciará.
torlauncher.tor_exited=Tor se cerró inesperadamente. Esto podría deberse a un fallo con el propio Tor, con otro programa de su sistema, o por hardware defectuoso. Hasta que reinicie Tor, el Navegador Tor no podrá abrir ningún sitio web. Si el problema persiste, por favor envíe una copia de su Registro de Tor (log) al equipo de soporte.
torlauncher.tor_exited2=Al reiniciar Tor no se cerrarán las pestañas de su navegador.
torlauncher.tor_controlconn_failed=No se pudo conectar al puerto de control de Tor
@@ -37,7 +37,7 @@ torlauncher.quit_win=Salir
torlauncher.done=Listo
torlauncher.forAssistance=Para obtener ayuda, contacte con %S
-torlauncher.forAssistance2=Para asistencia, visite %S
+torlauncher.forAssistance2=Para asistencia, visita %S
torlauncher.copiedNLogMessages=Copia completada. %S mensajes de registro ('log') de Tor están listos para ser pegados en un editor de texto o en un mensaje de correo electrónico.
diff --git a/src/chrome/locale/fil/progress.dtd b/src/chrome/locale/fil/progress.dtd
index b8256ea..c73883b 100644
--- a/src/chrome/locale/fil/progress.dtd
+++ b/src/chrome/locale/fil/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "Tor Status">
<!ENTITY torprogress.openSettings "Buksan ang Settings">
<!ENTITY torprogress.heading "Nakikipag-ugnayan sa network ng Tor.">
-<!ENTITY torprogress.pleaseWait "Please wait while we establish a connection to the Tor network.  This may take several minutes.">
+<!ENTITY torprogress.pleaseWait "Mag-hintay habang ginagawa ang pag-establish ng connection sa Tor network.  Maari itong tumagal ng ilang minuto.">
diff --git a/src/chrome/locale/fil/torlauncher.properties b/src/chrome/locale/fil/torlauncher.properties
index c00fa3a..120c7d7 100644
--- a/src/chrome/locale/fil/torlauncher.properties
+++ b/src/chrome/locale/fil/torlauncher.properties
@@ -3,7 +3,7 @@
torlauncher.error_title=Tagapaglunsad ng Tor
-torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start.
+torlauncher.tor_exited_during_startup=Tor exited during startup. Maaring ang dahilan nito ay ang an error sa torrc file, bug sa Tor o iba pang program sa iyong system, or sirang hardware. Hanggat di mo na fix ang underlying problem at mag-restart ng Tor, ang Tor Browser ay hindi gagana.
torlauncher.tor_exited=Ang Tor ay nagsara ng hindi sinasadya. Ito ay marahil sa isang bug sa Tor, ibang programa sa iyong sistema, o depektibong hardware. Hanggang ma-restart mo ang Tor, ang Tor Browser ay hindi makakapagabot sa kahit anong mga website. Kung ang problema ay nagpapatuloy, mag-sumite ng isang kopya ng iyong Tor Log sa support team.
torlauncher.tor_exited2=Ang pag-restart sa Tor ay hindi magsasara ng mga tab sa browser.
torlauncher.tor_controlconn_failed=Hindi makakonekta sa Tor control port.
@@ -14,8 +14,8 @@ torlauncher.tor_bootstrap_failed_details=%1$S nabigo (%2$S).
torlauncher.unable_to_start_tor=Hindi magawang simulan ang Tor.\n\n%S
torlauncher.tor_missing=Ang Tor executable ay nawawala.
-torlauncher.torrc_missing=The torrc file is missing and could not be created.
-torlauncher.datadir_missing=The Tor data directory does not exist and could not be created.
+torlauncher.torrc_missing=Ang torrc file ay missing at hindi ma create.
+torlauncher.datadir_missing=Ang Tor data directory ay not exist at could not be created.
torlauncher.password_hash_missing=Nabigong makakuha ng na-hash na password.
torlauncher.failed_to_get_settings=Hindi nabawi ang mga setting ng Tor.\n\n%S
@@ -37,7 +37,7 @@ torlauncher.quit_win=Lumabas
torlauncher.done=Tapos na
torlauncher.forAssistance=Para sa tulong, makipag-ugnay sa %S
-torlauncher.forAssistance2=For assistance, visit %S
+torlauncher.forAssistance2=Para sa gabay o tulong, bisitahin ang %S
torlauncher.copiedNLogMessages=Kumpleto na ang Pag-kopya. %S Ang mga log messages ng Tor ay handa na ma-paste sa isang text editor o sa e-mail message.
diff --git a/src/chrome/locale/fr-CA/network-settings.dtd b/src/chrome/locale/fr-CA/network-settings.dtd
index a4056e0..212b983 100644
--- a/src/chrome/locale/fr-CA/network-settings.dtd
+++ b/src/chrome/locale/fr-CA/network-settings.dtd
@@ -27,7 +27,7 @@
<!ENTITY torSettings.enterProxy "Saisir les paramètres du serveur mandataire.">
<!ENTITY torSettings.bridgePageTitle "Configuration des ponts Tor">
<!ENTITY torSettings.bridgeQuestion "Votre fournisseur d'accès à Internet (FAI) bloque-t-il ou censure-t-il vos connexions au réseau Tor?">
-<!ENTITY torSettings.bridgeExplanation1 "Si vous n'êtes pas certain de savoir comment répondre à cette question, choisissez Non (si vous n'arrivez pas à vous connecter au réseau Tor sans pont, pour pourrez en ajouter un ultérieurement).">
+<!ENTITY torSettings.bridgeExplanation1 "Si vous n'êtes pas certain de savoir comment répondre à cette question, choisissez Non (si vous n'arrivez pas à vous connecter au réseau Tor sans pont, vous pourrez en ajouter un ultérieurement).">
<!ENTITY torSettings.bridgeExplanation2 "Si vous choisissez Oui, l'on vous demandera de configurer des ponts Tor, qui sont des relais non répertoriés rendant le blocage des connexions au réseau Tor plus difficile.">
<!ENTITY torSettings.bridgeSettingsPrompt "Vous pouvez utiliser le jeu de ponts fourni ou vous pouvez obtenir et saisir un jeu de ponts personnalisé.">
@@ -58,7 +58,7 @@
<!ENTITY torsettings.useBridges.default "Se connecter avec les ponts fournis">
<!ENTITY torsettings.useBridges.note "Chaque type de pont utilise une méthode différente pour contourner la censure.  Si un pont ne fonctionne pas, ressayez en utilisant un autre type.">
<!ENTITY torsettings.useBridges.type "Type de transport :">
-<!ENTITY torsettings.useBridges.custom "Saisir les ponts personnalisés">
+<!ENTITY torsettings.useBridges.custom "Saisir des ponts personnalisés">
<!ENTITY torsettings.useBridges.label "Saisir un ou plusieurs relais-ponts (un par ligne).">
<!ENTITY torsettings.useBridges.placeholder "type adresse:port">
diff --git a/src/chrome/locale/fr/network-settings.dtd b/src/chrome/locale/fr/network-settings.dtd
index 078424e..5aae7f3 100644
--- a/src/chrome/locale/fr/network-settings.dtd
+++ b/src/chrome/locale/fr/network-settings.dtd
@@ -13,7 +13,7 @@
<!ENTITY torSettings.firstQuestion "Laquelle des suivantes décrit le mieux votre situation ?javascript:;">
<!ENTITY torSettings.configurePrompt1 "La connexion Internet de cet ordinateur est censurée ou relayée.">
-<!ENTITY torSettings.configurePrompt2 "Je dois paramétrer un pont ou un mandataire local avant de me connecter au réseau Tor.">
+<!ENTITY torSettings.configurePrompt2 "Je dois paramétrer un pont (Bridge) ou un mandataire local avant de me connecter au réseau Tor.">
<!ENTITY torSettings.configure "Configurer">
<!ENTITY torSettings.connectPrompt2 "J'aimerais établir une connexion directe vers le réseau Tor.">
<!ENTITY torSettings.connectPrompt3 "Cela fonctionnera dans la plupart des situations.">
@@ -25,11 +25,11 @@
<!ENTITY torSettings.proxyExplanation1 "Dans la plupart des cas, un serveur mandataire local n'est pas requis, mais il pourrait être exigé pour une connexion par un réseau d'entreprise, d'école ou d'université.">
<!ENTITY torSettings.proxyExplanation2 "Si vous n'êtes pas certain de savoir comment répondre à cette question, vérifiez les paramètres Internet d'un autre navigateur ou les paramètres réseau de votre système pour voir si un serveur mandataire local est requis.">
<!ENTITY torSettings.enterProxy "Saisir les paramètres du serveur mandataire.">
-<!ENTITY torSettings.bridgePageTitle "Configuration des ponts Tor">
+<!ENTITY torSettings.bridgePageTitle "Configuration des ponts (Bridges) Tor">
<!ENTITY torSettings.bridgeQuestion "Votre fournisseur d'accès à Internet (FAI) bloque-t-il ou censure-t-il vos connexions au réseau Tor ?">
-<!ENTITY torSettings.bridgeExplanation1 "Si vous n'êtes pas certain de savoir comment répondre à cette question, choisissez Non (si vous n'arrivez pas à vous connecter au réseau Tor sans pont, pour pourrez en ajouter un ultérieurement).">
-<!ENTITY torSettings.bridgeExplanation2 "Si vous choisissez Oui, il vous sera demandé de configurer des ponts Tor, qui sont des relais non répertoriés et qui rendent plus difficile le blocage du réseau Tor.">
-<!ENTITY torSettings.bridgeSettingsPrompt "Vous pouvez utiliser le jeu de ponts fourni ou vous pouvez obtenir et saisir un jeu de ponts personnalisé.">
+<!ENTITY torSettings.bridgeExplanation1 "Si vous n'êtes pas certain de savoir comment répondre à cette question, choisissez Non (si vous n'arrivez pas à vous connecter au réseau Tor sans pont (Bridge), vous pourrez en ajouter un ultérieurement).">
+<!ENTITY torSettings.bridgeExplanation2 "Si vous choisissez Oui, il vous sera demandé de configurer des ponts (Bridges) Tor, qui sont des relais non répertoriés et qui rendent plus difficile le blocage du réseau Tor.">
+<!ENTITY torSettings.bridgeSettingsPrompt "Vous pouvez utiliser le jeu de ponts (Bridges) fourni ou vous pouvez obtenir et saisir un jeu de ponts personnalisé.">
<!-- Other: -->
@@ -37,7 +37,7 @@
<!ENTITY torsettings.restartTor "Redémarrer Tor">
<!ENTITY torsettings.reconfigTor "Reconfigurer">
-<!ENTITY torsettings.discardSettings.prompt "Vous avez configuré des ponts Tor ou vous avez saisi des paramètres de mandataire local.  Pour établir une connexion directe vers le réseau Tor, ces paramètres doivent être supprimés.">
+<!ENTITY torsettings.discardSettings.prompt "Vous avez configuré des ponts Tor (Bridges) ou vous avez saisi des paramètres de mandataire local.  Pour établir une connexion directe vers le réseau Tor, ces paramètres doivent être supprimés.">
<!ENTITY torsettings.discardSettings.proceed "Supprimer les paramètres et se connecter">
<!ENTITY torsettings.optional "Facultatif">
@@ -55,21 +55,21 @@
<!ENTITY torsettings.firewall.checkbox "Cet ordinateur passe par un pare-feu qui n'autorise que les connexions à certains ports">
<!ENTITY torsettings.firewall.allowedPorts "Ports autorisés :">
<!ENTITY torsettings.useBridges.checkbox "Mon fournisseur d'accès à Internet (FAI) bloque les connexions vers le réseau Tor">
-<!ENTITY torsettings.useBridges.default "Se connecter avec les ponts fournis">
-<!ENTITY torsettings.useBridges.note "Chaque type de pont utilise une méthode différente pour contourner la censure.  Si un pont ne fonctionne pas, ressayez en utilisant un autre type.">
+<!ENTITY torsettings.useBridges.default "Se connecter avec les ponts (Bridges) fournis">
+<!ENTITY torsettings.useBridges.note "Chaque type de pont (Bridge) utilise une méthode différente pour contourner la censure.  Si un pont ne fonctionne pas, ressayez en utilisant un autre type.">
<!ENTITY torsettings.useBridges.type "Type de transport :">
-<!ENTITY torsettings.useBridges.custom "Saisir les ponts personnalisés">
-<!ENTITY torsettings.useBridges.label "Saisir un ou plusieurs relais-ponts (un par ligne).">
+<!ENTITY torsettings.useBridges.custom "Saisir des ponts (Bridges) personnalisés">
+<!ENTITY torsettings.useBridges.label "Saisir un ou plusieurs relais-ponts (Bridge Relays) (un par ligne).">
<!ENTITY torsettings.useBridges.placeholder "type address:port">
<!ENTITY torsettings.copyLog "Copier le journal de Tor dans le presse-papiers">
-<!ENTITY torsettings.bridgeHelpTitle "Aide sur les relais-ponts">
-<!ENTITY torsettings.bridgeHelp1 "Si vous ne pouvez pas vous connecter au réseau Tor, il se peut que votre fournisseur d'accès à Internet (FAI) ou une autre organisme bloque Tor.  Vous pouvez souvent le contourner en utilisant des ponts Tor qui sont des relais non répertoriés, plus difficiles à bloquer.">
-<!ENTITY torsettings.bridgeHelp1B "Vous pouvez utiliser le jeu préconfiguré d'adresses de ponts fourni ou vous pouvez obtenir un jeu personnalisé d'adresses en utilisant une de ces méthodes :">
+<!ENTITY torsettings.bridgeHelpTitle "Aide sur les relais-ponts ((Bridges Relays)">
+<!ENTITY torsettings.bridgeHelp1 "Si vous ne pouvez pas vous connecter au réseau Tor, il se peut que votre fournisseur d'accès à Internet (FAI) ou une autre organisme bloque Tor.  Vous pouvez souvent le contourner en utilisant des ponts (Bridges) Tor qui sont des relais non répertoriés, plus difficiles à bloquer.">
+<!ENTITY torsettings.bridgeHelp1B "Vous pouvez utiliser le jeu préconfiguré d'adresses de ponts (Bridges) fourni ou vous pouvez obtenir un jeu personnalisé d'adresses en utilisant une de ces méthodes :">
<!ENTITY torsettings.bridgeHelp2Heading "Par le Web">
<!ENTITY torsettings.bridgeHelp2 "En utilisant un navigateur Web pour visiter https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Par le répondeur automatique de courriel">
<!ENTITY torsettings.bridgeHelp3.emailDesc "Envoyez un courriel à bridges(a)torproject.org avec la ligne « get bridges » seule dans le corps du message.  Cependant, afin qu'il soit plus difficile pour un attaquant de découvrir de nombreuses adresses de ponts, vous devez envoyer cette demande à partir d'un des fournisseurs de courriel suivants (listés par ordre de préférence) :">
<!ENTITY torsettings.bridgeHelp3.emailList "https://www.riseup.net, https://mail.google.com ou https://mail.yahoo.com">
<!ENTITY torsettings.bridgeHelp4Heading "Par le centre d'assistance">
-<!ENTITY torsettings.bridgeHelp4 "En dernier recours, vous pouvez demander des adresses de ponts en envoyant un courriel poli à help(a)rt.torproject.org.  Veuillez remarquer qu'une personne devra répondre à chaque demande.">
+<!ENTITY torsettings.bridgeHelp4 "En dernier recours, vous pouvez demander des adresses de ponts (Bridges) en envoyant un courriel poli à help(a)rt.torproject.org.  Veuillez remarquer qu'une personne devra répondre à chaque demande.">
diff --git a/src/chrome/locale/fr/torlauncher.properties b/src/chrome/locale/fr/torlauncher.properties
index 1b25457..93b11a8 100644
--- a/src/chrome/locale/fr/torlauncher.properties
+++ b/src/chrome/locale/fr/torlauncher.properties
@@ -24,9 +24,9 @@ torlauncher.ensure_tor_is_running=Veuillez-vous assurer que Tor fonctionne.
torlauncher.error_proxy_addr_missing=Vous devez spécifier à la fois une adresse IP ou un nom d'hôte et un numéro de port afin de configurer Tor pour qu'il utilise un mandataire pour accéder à Internet.
torlauncher.error_proxy_type_missing=Vous devez choisir le type de mandataire.
-torlauncher.error_bridges_missing=Vous devez spécifier un ou plusieurs ponts.
-torlauncher.error_default_bridges_type_missing=Vous devez sélectionner un type de transport pour les ponts fournis.
-torlauncher.error_bridge_bad_default_type=Aucun des pont fournis n'est disponible pour le type de transport %S, Veuillez ajuster vos paramètres.
+torlauncher.error_bridges_missing=Vous devez spécifier un ou plusieurs ponts (Bridges).
+torlauncher.error_default_bridges_type_missing=Vous devez sélectionner un type de transport pour les ponts (Bridges) fournis.
+torlauncher.error_bridge_bad_default_type=Aucun des pont (Bridges) fournis n'est disponible pour le type de transport %S, Veuillez ajuster vos paramètres.
torlauncher.recommended_bridge=(recommandé)
diff --git a/src/chrome/locale/hr-HR/network-settings.dtd b/src/chrome/locale/hr-HR/network-settings.dtd
index 902c4f0..0e4d96a 100644
--- a/src/chrome/locale/hr-HR/network-settings.dtd
+++ b/src/chrome/locale/hr-HR/network-settings.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torsettings.dialog.title "Tor mrežne postavke">
+<!ENTITY torsettings.dialog.title "Postavke Tor mreže">
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Jezik Tor Browsera">
@@ -13,7 +13,7 @@ internetskoj vezi ovog računala.">
<!ENTITY torSettings.no "Ne">
<!ENTITY torSettings.firstQuestion "Koje od sljedećeg najbolje opisuje Vašu situaciju?">
-<!ENTITY torSettings.configurePrompt1 "Veza ovog računal s Internetom je cenzurirana ili iza proxy-a.">
+<!ENTITY torSettings.configurePrompt1 "Veza ovog računala s Internetom je cenzurirana ili iza proxya.">
<!ENTITY torSettings.configurePrompt2 "Trebam konfigurirati postavke mosta ili lokalnog proxya prije nego se spojim na Tor mrežu.">
<!ENTITY torSettings.configure "Podesi">
<!ENTITY torSettings.connectPrompt2 "Želim direktnu vezu s Tor mrežom.">
diff --git a/src/chrome/locale/hr-HR/torlauncher.properties b/src/chrome/locale/hr-HR/torlauncher.properties
index 175e7b4..108f29e 100644
--- a/src/chrome/locale/hr-HR/torlauncher.properties
+++ b/src/chrome/locale/hr-HR/torlauncher.properties
@@ -1,9 +1,9 @@
### Copyright (c) 2016, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Pokretač Tora
+torlauncher.error_title=Tor Launcher
-torlauncher.tor_exited_during_startup=Tor je izašao usred pokretanja. Do toga može doći zbog greške u Vašoj torrc datoteci, greške u Tor-u ili drugom programu u Vašem sustavu ili zbog neispravnog hardware-a. Dok ne popravite inicijalni problem i ponovno pokrenete Tor, Tor Browser se neće pokrenuti.
+torlauncher.tor_exited_during_startup=Tor je izašao usred pokretanja. Do toga može doći zbog greške u Vašoj torrc datoteci, greške u Toru ili drugom programu u Vašem sustavu ili zbog neispravnog hardwarea. Dok ne popravite inicijalni problem i ponovno pokrenete Tor, Tor Browser se neće pokrenuti.
torlauncher.tor_exited=Tor je neočekivano izašao. Ovo bi moglo biti zbog greške u samom Toru, drugog programa na Vašem sustavu ili neispravnog hardwarea. Dok ne pokrenete Tor ponovno, Tor Browser neće biti u mogućnosti pristupiti web stranicama. Ako problem ustraje, molimo Vas da pošaljete kopiju Vašeg Tor zapisa timu za podršku.
torlauncher.tor_exited2=Ponovno pokretanje Tora neće zatvoriti Vaše kartice u pregledniku.
torlauncher.tor_controlconn_failed=Nije se moguće spojiti na Torov upravljački port.
@@ -60,4 +60,4 @@ torlauncher.bootstrapWarning.identity=nepodudaranje identiteta
torlauncher.bootstrapWarning.timeout=vrijeme čekanja veze isteklo
torlauncher.bootstrapWarning.noroute=nema rute do domaćina
torlauncher.bootstrapWarning.ioerror=greška čitanja/pisanja
-torlauncher.bootstrapWarning.pt_missing=nedostaje transport koji se može priključiti
+torlauncher.bootstrapWarning.pt_missing=nedostaje priključni transport
diff --git a/src/chrome/locale/it/network-settings.dtd b/src/chrome/locale/it/network-settings.dtd
index beaabf6..b7a4411 100644
--- a/src/chrome/locale/it/network-settings.dtd
+++ b/src/chrome/locale/it/network-settings.dtd
@@ -23,7 +23,7 @@
<!ENTITY torSettings.proxyQuestion "Questo computer richiede l'uso di un proxy locale per accedere ad Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
<!ENTITY torSettings.proxyExplanation1 "Nella maggior parte dei casi un proxy locale non è necessario, ma può essere richiesto quando ci si connette da una rete scolastica, universitaria o aziendale.">
-<!ENTITY torSettings.proxyExplanation2 "Se non sei sicuro su come rispondere a questa domanda, controlla le impostazioni di Rete in un altro browser o nelle impostazioni del tuo sistema per vedere se è necessario un proxy locale.">
+<!ENTITY torSettings.proxyExplanation2 "Se non sei sicuro su come rispondere a questa domanda, controlla le impostazioni Internet di un altro browser web per vedere se sia configurato l'uso di un proxy.">
<!ENTITY torSettings.enterProxy "Inserisci le impostazioni del proxy.">
<!ENTITY torSettings.bridgePageTitle "Configurazione Bridge di Tor">
<!ENTITY torSettings.bridgeQuestion "Il tuo fornitore di servizi internet (ISP) blocca o censura la connessione alla rete Tor?">
diff --git a/src/chrome/locale/lt/network-settings.dtd b/src/chrome/locale/lt/network-settings.dtd
index ad55643..0da969f 100644
--- a/src/chrome/locale/lt/network-settings.dtd
+++ b/src/chrome/locale/lt/network-settings.dtd
@@ -1,17 +1,17 @@
<!ENTITY torsettings.dialog.title "Tor tinklo nustatymai">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Tor Browser kalba">
+<!ENTITY torlauncher.localePicker.title "Tor naršyklės kalba">
<!ENTITY torlauncher.localePicker.prompt "Prašome pasirinkti kalbą.">
<!-- For "first run" wizard: -->
-<!ENTITY torsettings.prompt "Prieš tai, kaip prisijungsite prie Tor tinklo, jūs turite pateikti informaciją apie šio kompiuterio interneto ryšį.">
+<!ENTITY torsettings.prompt "Prieš tai, kai prisijungsite prie Tor tinklo, jūs turite pateikti informaciją apie šio kompiuterio interneto ryšį.">
<!ENTITY torSettings.yes "Taip">
<!ENTITY torSettings.no "Ne">
-<!ENTITY torSettings.firstQuestion "Kuris iš žemiau pateiktų apibrėžimų labiausiai atspindi Jūsų padėtį?">
+<!ENTITY torSettings.firstQuestion "Kuris iš žemiau pateiktų apibrėžimų labiausiai atspindi jūsų padėtį?">
<!ENTITY torSettings.configurePrompt1 "Šio kompiuterio interneto ryšys yra cenzūruojamas arba jungiamas per įgaliotąjį serverį.">
<!ENTITY torSettings.configurePrompt2 "Prieš jungiantis prie Tor tinklo, man reikia sukonfigūruoti tinklų tiltą ar vietinius įgaliotojo serverio nustatymus.">
<!ENTITY torSettings.configure "Konfigūruoti">
@@ -25,17 +25,17 @@
<!ENTITY torSettings.proxyExplanation1 "Daugeliu atveju, vietinis įgaliotasis serveris yra nereikalingas, tačiau jo gali prireikti, jungiantis per kompanijos, mokyklos ar universiteto tinklą.">
<!ENTITY torSettings.proxyExplanation2 "Jeigu nesate tikri kaip atsakyti į šį klausimą, pažiūrėkite interneto nustatymus kitoje naršyklėje arba patikrinkite savo sistemos tinklo nustatymus, kad pamatytumėte ar vietinis įgaliotasis serveris yra reikalingas.">
<!ENTITY torSettings.enterProxy "Įrašykite įgaliotojo serverio nustatymus.">
-<!ENTITY torSettings.bridgePageTitle "Tor tiltų konfigūracija">
+<!ENTITY torSettings.bridgePageTitle "Tor tinklų tiltų konfigūracija">
<!ENTITY torSettings.bridgeQuestion "Ar jūsų interneto paslaugų tiekėjas (ISP) blokuoja ar kitaip cenzūruoja prisijungimus prie Tor tinklo?">
<!ENTITY torSettings.bridgeExplanation1 "Jeigu nesate tikri kaip atsakyti į šį klausimą, pasirinkite Ne (jeigu negalėsite prisijungti prie Tor tinklo be tinklų tilto, tuomet galėsite jį pridėti vėliau).">
-<!ENTITY torSettings.bridgeExplanation2 "If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
+<!ENTITY torSettings.bridgeExplanation2 "Jeigu pasirinksite Taip, jūsų bus paprašyta sukonfigūruoti Tor tinklų tiltus, kurie yra neišvardyti retransliavimai, trukdantys blokuoti ryšius su Tor tinklu.">
<!ENTITY torSettings.bridgeSettingsPrompt "You may use the provided set of bridges or you may obtain and enter a custom set of bridges.">
<!-- Other: -->
-<!ENTITY torsettings.startingTor "Waiting for Tor to start…">
+<!ENTITY torsettings.startingTor "Laukiama, kol Tor bus paleistas…">
<!ENTITY torsettings.restartTor "Pakartotinai paleisti Tor">
-<!ENTITY torsettings.reconfigTor "Reconfigure">
+<!ENTITY torsettings.reconfigTor "Konfigūruoti iš naujo">
<!ENTITY torsettings.discardSettings.prompt "Jūs esate sukofigūravę Tor tinklų tiltus arba esate įrašę vietinio įgaliotojo serverio nustatymus.  Tam, kad galėtumėte tiesiogiai prisijungti prie Tor tinklo, šie nustatymai privalo būti pašalinti.">
<!ENTITY torsettings.discardSettings.proceed "Šalinti nustatymus ir prisijungti">
@@ -55,11 +55,11 @@
<!ENTITY torsettings.firewall.checkbox "This computer goes through a firewall that only allows connections to certain ports">
<!ENTITY torsettings.firewall.allowedPorts "Leidžiami prievadai:">
<!ENTITY torsettings.useBridges.checkbox "Mano interneto paslaugų tiekėjas (ISP) blokuoja prisijungimus prie Tor tinklo">
-<!ENTITY torsettings.useBridges.default "Connect with provided bridges">
-<!ENTITY torsettings.useBridges.note "Each type of bridge uses a different method to avoid censorship.  If one bridge does not work, try again using a different one.">
-<!ENTITY torsettings.useBridges.type "Transport type:">
+<!ENTITY torsettings.useBridges.default "Prisijungti, naudojant pateiktus tinklų tiltus">
+<!ENTITY torsettings.useBridges.note "Kiekvienas tinklų tilto tipas, tam, kad išvengtų cenzūros, naudoja skirtingą metodą.  Jeigu vienas tinklų tiltas neveikia, bandykite dar kartą, naudodami kitą tinklų tiltą.">
+<!ENTITY torsettings.useBridges.type "Perdavimo tipas:">
<!ENTITY torsettings.useBridges.custom "Enter custom bridges">
-<!ENTITY torsettings.useBridges.label "Enter one or more bridge relays (one per line).">
+<!ENTITY torsettings.useBridges.label "Įveskite vieną ar daugiau tinklų tilto retransliavimus (kiekvieną atskiroje eilutėje).">
<!ENTITY torsettings.useBridges.placeholder "įrašykite adresą:prievadą">
<!ENTITY torsettings.copyLog "Kopijuoti Tor žurnalą į iškarpinę">
diff --git a/src/chrome/locale/lt/torlauncher.properties b/src/chrome/locale/lt/torlauncher.properties
index ccdb8a8..19e97d8 100644
--- a/src/chrome/locale/lt/torlauncher.properties
+++ b/src/chrome/locale/lt/torlauncher.properties
@@ -4,8 +4,8 @@
torlauncher.error_title=Tor Leistuvas
torlauncher.tor_exited_during_startup=Tor nustojo veikti paleisties metu. Taip galėjo nutikti dėl klaidos jūsų torrc faile, klaidos Tor ar kitoje jūsų sistemos programoje, arba dėl aparatinės įrangos kaltės. Tor naršyklė nepasileis tol, kol neištaisysite slypinčios problemos ir iš naujo nepaleisite Tor.
-torlauncher.tor_exited=Tor netikėtai nustojo veikti. Taip galėjo atsitikti arba dėl klaidos Tor arba kitoje programoje, Jūsų sistemoje arba dėl sugedusios techninės įrangos. Kol iš naujo nepaleisite Tor, Tor Naršyklė negalės prisijungti prie jokių interneto tinklalapių. Jei problema kartojasi, prašome išsiųsti Tor įvykių žurnalo kopiją paramos grupei.
-torlauncher.tor_exited2=Pakartotinai paleidus Tor naršyklės kortelės nebus uždarytos.
+torlauncher.tor_exited=Tor netikėtai nustojo veikti. Taip galėjo atsitikti arba dėl klaidos Tor, arba dėl klaidos kitoje jūsų sistemos programoje, arba dėl sugedusios aparatinės įrangos. Kol iš naujo nepaleisite Tor, Tor naršyklė negalės prisijungti prie jokių interneto tinklalapių. Jei problema išlieka, prašome išsiųsti Tor įvykių žurnalo kopiją Tor palaikymo komandai.
+torlauncher.tor_exited2=Paleidus Tor iš naujo, jūsų naršyklės kortelės nebus užvertos.
torlauncher.tor_controlconn_failed=Nepavyko prisijungti prie Tor valdymo prievado.
torlauncher.tor_failed_to_start=Tor nepavyko paleisti.
torlauncher.tor_control_failed=Nepavyko perimti Tor valdymo
@@ -24,9 +24,9 @@ torlauncher.ensure_tor_is_running=Įsitikinkite, kad Tor yra vykdomas.
torlauncher.error_proxy_addr_missing=Jei norite, kad Tor prie interneto jungtųsi per įgaliotąjį serverį, turite nurodyti ir prievado numerį, ir serverio IP adresą arba serverio vardą.
torlauncher.error_proxy_type_missing=Turite pasirinkti įgaliotojo serverio tipą.
-torlauncher.error_bridges_missing=Turite nurodyti bent vieną tinklų tiltą
-torlauncher.error_default_bridges_type_missing=Turite pasirinkti perdavimo būdą nurodytiems tinklų tiltams
-torlauncher.error_bridge_bad_default_type=Nepasiekiamas nei vienas tinklų tiltas, kurio perdavimo tipas būtų %S. Prašome pakoreguoti nustatymo parametrus.
+torlauncher.error_bridges_missing=Privalote nurodyti bent vieną tinklų tiltą.
+torlauncher.error_default_bridges_type_missing=Privalote nurodytiems tinklų tiltams pasirinkti perdavimo tipą.
+torlauncher.error_bridge_bad_default_type=Neprieinamas nei vienas tinklų tiltas, kurio perdavimo tipas būtų %S. Prašome sureguliuoti savo nustatymus.
torlauncher.recommended_bridge=(rekomenduojama)
@@ -41,13 +41,13 @@ torlauncher.forAssistance2=Norėdami gauti pagalbos, apsilankykite %S
torlauncher.copiedNLogMessages=Kopijavimas atliktas. %S Tor įvykių žurnalas paruoštas įklijuoti į teksto redagavimo programą ar elektroninio pašto pranešimą.
-torlauncher.bootstrapStatus.conn_dir=Jungiamasi prie retransliavimo taškų
+torlauncher.bootstrapStatus.conn_dir=Jungiamasi prie retransliavimo katalogo
torlauncher.bootstrapStatus.handshake_dir=Užmezgiamas ryšys
torlauncher.bootstrapStatus.requesting_status=Nuskaitoma tinklo būklė
torlauncher.bootstrapStatus.loading_status=Įkeliama tinklo būklė
-torlauncher.bootstrapStatus.loading_keys=Įkeliami prieigos sertifikatai
-torlauncher.bootstrapStatus.requesting_descriptors=Užklausiama retransliacijos taškų informacija
-torlauncher.bootstrapStatus.loading_descriptors=Įkeliama retransliacijos taško informacija
+torlauncher.bootstrapStatus.loading_keys=Įkeliami liudijimų įstaigos liudijimai
+torlauncher.bootstrapStatus.requesting_descriptors=Užklausiama retransliavimo informacija
+torlauncher.bootstrapStatus.loading_descriptors=Įkeliama retransliavimo informacija
torlauncher.bootstrapStatus.conn_or=Jungiamasi prie Tor tinklo
torlauncher.bootstrapStatus.handshake_or=Užmezgiamas sujungimas
torlauncher.bootstrapStatus.done=Prisijungta prie Tor tinklo!
@@ -60,4 +60,4 @@ torlauncher.bootstrapWarning.identity=tapatybės neatitiktis
torlauncher.bootstrapWarning.timeout=per nustatytą laiką nepavyko prisijungti
torlauncher.bootstrapWarning.noroute=nėra maršruto iki pagrindinio kompiuterio
torlauncher.bootstrapWarning.ioerror=skaitymo/rašymo klaida
-torlauncher.bootstrapWarning.pt_missing=Trūksta įterpiamojo perdavimo
+torlauncher.bootstrapWarning.pt_missing=trūksta prijungiamo perdavimo
diff --git a/src/chrome/locale/nb/network-settings.dtd b/src/chrome/locale/nb/network-settings.dtd
index 51e6e52..56f41f1 100644
--- a/src/chrome/locale/nb/network-settings.dtd
+++ b/src/chrome/locale/nb/network-settings.dtd
@@ -1,7 +1,7 @@
<!ENTITY torsettings.dialog.title "Nettverksinnstillinger for Tor">
<!-- For locale picker: -->
-<!ENTITY torlauncher.localePicker.title "Språk i Tor-nettleser">
+<!ENTITY torlauncher.localePicker.title "Språk i Tor-nettleseren">
<!ENTITY torlauncher.localePicker.prompt "Velg språk">
<!-- For "first run" wizard: -->
diff --git a/src/chrome/locale/pt/network-settings.dtd b/src/chrome/locale/pt/network-settings.dtd
index eb93ba8..5c0ae5c 100644
--- a/src/chrome/locale/pt/network-settings.dtd
+++ b/src/chrome/locale/pt/network-settings.dtd
@@ -22,13 +22,13 @@
<!ENTITY torSettings.proxyPageTitle "Configuração do Proxy Local">
<!ENTITY torSettings.proxyQuestion "Este computador precisa de utilizar um proxy para aceder à Internet?">
<!-- see https://www.torproject.org/docs/proxychain.html.en -->
-<!ENTITY torSettings.proxyExplanation1 "In most cases a local proxy is not needed, but it may be required when connecting through a company, school, or university network.">
-<!ENTITY torSettings.proxyExplanation2 "If you are not sure how to answer this question, look at the Internet settings in another browser or check your system's network settings to see whether a local proxy is needed.">
+<!ENTITY torSettings.proxyExplanation1 "Na maioria dos casos não é necessário um proxy local, mas este poderá ser necessário quando ligar através da rede de uma empresa, escola ou universidade.">
+<!ENTITY torSettings.proxyExplanation2 "Se não tem a certeza de como responder a esta pergunta, consulte as definições da Internet noutro navegador ou verifique as definições da rede do seu sistema para verificar se é necessário ou não um proxy local.">
<!ENTITY torSettings.enterProxy "Insira as definições do proxy.">
<!ENTITY torSettings.bridgePageTitle "Configuração das Pontes Tor">
<!ENTITY torSettings.bridgeQuestion "O seu Provedor de Serviços da Internet (ISP) bloqueia ou então censura as ligações à Rede Tor?">
-<!ENTITY torSettings.bridgeExplanation1 "If you are not sure how to answer this question, choose No (if you are unable to connect to the Tor network without a bridge, you can add one later).">
-<!ENTITY torSettings.bridgeExplanation2 "If you choose Yes, you will be asked to configure Tor Bridges, which are unlisted relays that make it more difficult to block connections to the Tor Network.">
+<!ENTITY torSettings.bridgeExplanation1 "Se não tem a certeza sobre como responder a esta pergunta, escolha Não (se não consegue ligar-se à rede Tor sem uma ponte, pode adicionar uma mais tarde).">
+<!ENTITY torSettings.bridgeExplanation2 "Se escolher 'Sim', ser-lhe-á pedido para configurar as Pontes do Tor, que são retransmissões não listadas o que torna mais difícil o bloqueio das ligações à Rede Tor.">
<!ENTITY torSettings.bridgeSettingsPrompt "Poderá utilizar o conjunto de pontes fornecido ou poderá obter um conjunto de pontes personalizadas.">
<!-- Other: -->
@@ -37,7 +37,7 @@
<!ENTITY torsettings.restartTor "Reiniciar Tor">
<!ENTITY torsettings.reconfigTor "Reconfigurar">
-<!ENTITY torsettings.discardSettings.prompt "You have configured Tor bridges or you have entered local proxy settings.  To make a direct connection to the Tor network, these settings must be removed.">
+<!ENTITY torsettings.discardSettings.prompt "Configurou as pontes do Tor ou inseriu as definições do proxy local.  Para efetuar uma ligação direta à rede Tor, estas definições devem ser removidas.">
<!ENTITY torsettings.discardSettings.proceed "Remover Definições e Ligar">
<!ENTITY torsettings.optional "Opcional">
@@ -56,7 +56,7 @@
<!ENTITY torsettings.firewall.allowedPorts "Portas permitidas:">
<!ENTITY torsettings.useBridges.checkbox "O meu Provedor de Serviço da Internet (ISP) bloqueia as ligações à rede Tor">
<!ENTITY torsettings.useBridges.default "Ligar com as pontes fornecidas">
-<!ENTITY torsettings.useBridges.note "Each type of bridge uses a different method to avoid censorship.  If one bridge does not work, try again using a different one.">
+<!ENTITY torsettings.useBridges.note "Cada tipo de ponte utiliza um método diferente para evitar a censura.  Se uma ponte não funcionar, tente novamente utilizando uma diferente.">
<!ENTITY torsettings.useBridges.type "Tipo de transporte:">
<!ENTITY torsettings.useBridges.custom "Insira as pontes personalizadas">
<!ENTITY torsettings.useBridges.label "Insira uma ou mais retransmissões de ponte (uma por linha).">
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "Copiar o Registo do Tor para a Área de Transferência">
<!ENTITY torsettings.bridgeHelpTitle "Ajuda da Retransmissão de Ponte">
<!ENTITY torsettings.bridgeHelp1 "Se não consegue ligar-se à rede Tor, pode ser devido a algum bloqueio do seu Provedor de Serviço de Internet (ISP) ou outra agência está a bloquear o Tor.  Frequentemente, pode contornar este problema utilizando Tor Bridges, o qual são pontos de passagem não listados que são mais difíceis de bloquear.">
-<!ENTITY torsettings.bridgeHelp1B "You may use the preconfigured, provided set of bridge addresses or you may obtain a custom set of addresses by using one of these methods:">
+<!ENTITY torsettings.bridgeHelp1B "Poderá utilizar o conjunto de pontes pré-configurado fornecido ou poderá obter um conjunto de endereços personalizados, utilizando um deste métodos:">
<!ENTITY torsettings.bridgeHelp2Heading "Através da Web">
<!ENTITY torsettings.bridgeHelp2 "Utilize um navegador da Web para visitar https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "Através do Respondedor Automático de Correio Eletrónico">
diff --git a/src/chrome/locale/pt/progress.dtd b/src/chrome/locale/pt/progress.dtd
index 6ed4a63..f3a6922 100644
--- a/src/chrome/locale/pt/progress.dtd
+++ b/src/chrome/locale/pt/progress.dtd
@@ -1,4 +1,4 @@
<!ENTITY torprogress.dialog.title "Estado do Tor">
<!ENTITY torprogress.openSettings "Abrir Configurações">
<!ENTITY torprogress.heading "A conetar à rede Tor">
-<!ENTITY torprogress.pleaseWait "Por favor aguarde enquanto estabelecemos a ligação à rede Tor.  Isto pode levar alguns minutos.">
+<!ENTITY torprogress.pleaseWait "Por favor, aguarde, enquanto nós estabelecemos uma ligação à rede Tor.  Isto pode demorar alguns minutos.">
diff --git a/src/chrome/locale/pt/torlauncher.properties b/src/chrome/locale/pt/torlauncher.properties
index 41a235a..bd6085d 100644
--- a/src/chrome/locale/pt/torlauncher.properties
+++ b/src/chrome/locale/pt/torlauncher.properties
@@ -1,10 +1,10 @@
### Copyright (c) 2016, The Tor Project, Inc.
### See LICENSE for licensing information.
-torlauncher.error_title=Executor Tor
+torlauncher.error_title=Tor Launcher
-torlauncher.tor_exited_during_startup=Tor exited during startup. This might be due to an error in your torrc file, a bug in Tor or another program on your system, or faulty hardware. Until you fix the underlying problem and restart Tor, Tor Browser will not start.
-torlauncher.tor_exited=O Tor encerrou inesperadamente. Isto pode ter acontecido devido a erro dentro do Tor, outro programa no seu sistema ou falha de hardware. Até que reinicie o Tor, o Navegador Tor não irá poder aceder a quaisquer sítios da Web. Se o problema persistir, por favor, envie uma cópia do Registo de Eventos do seu Tor para a equipa de suporte.
+torlauncher.tor_exited_during_startup=O Tor fechou-se durante o arranque. Isto pode ter acontecido devido a erro no seu ficheiro torrc, um erro no Tor ou outro programa no seu sistema, ou falha de hardware. Até que corrija o problema em causa reinicie o Tor, o Tor Browser não irá iniciar.
+torlauncher.tor_exited=O Tor encerrou inesperadamente. Isto pode ter acontecido devido a erro dentro do Tor, outro programa no seu sistema ou falha de hardware. Até que reinicie o Tor, o Tor Browser não irá poder aceder a quaisquer sítios da Web. Se o problema persistir, por favor, envie uma cópia do Registo de Eventos do seu Tor para a equipa de suporte.
torlauncher.tor_exited2=Ao reiniciar o Tor não irá fechar os separadores do seu navegador.
torlauncher.tor_controlconn_failed=Não foi possível ligar à porta de controlo do Tor.
torlauncher.tor_failed_to_start=O Tor não foi iniciado.
@@ -37,7 +37,7 @@ torlauncher.quit_win=Fechar
torlauncher.done=Concluído
torlauncher.forAssistance=Para assistência, contacte %S
-torlauncher.forAssistance2=For assistance, visit %S
+torlauncher.forAssistance2=Para assistência, visite %S
torlauncher.copiedNLogMessages=Cópia completa. Estão prontas %S mensagens do registo de eventos do Tor para serem coladas num editor de texto ou numa mensagem de correio eletrónico.
diff --git a/src/chrome/locale/ru/network-settings.dtd b/src/chrome/locale/ru/network-settings.dtd
index b2663e7..ed79f3c 100644
--- a/src/chrome/locale/ru/network-settings.dtd
+++ b/src/chrome/locale/ru/network-settings.dtd
@@ -1,4 +1,4 @@
-<!ENTITY torsettings.dialog.title "Сетевые настройки Tor">
+<!ENTITY torsettings.dialog.title "Настройки сети Tor">
<!-- For locale picker: -->
<!ENTITY torlauncher.localePicker.title "Язык браузера Tor">
diff --git a/src/chrome/locale/sv/network-settings.dtd b/src/chrome/locale/sv/network-settings.dtd
index aab93e0..5975310 100644
--- a/src/chrome/locale/sv/network-settings.dtd
+++ b/src/chrome/locale/sv/network-settings.dtd
@@ -58,7 +58,7 @@
<!ENTITY torsettings.useBridges.default "Anslut med tillgängliga bryggor">
<!ENTITY torsettings.useBridges.note "Varje typ av brygga använder en egen metod för att undvika censur.  Om en brygga inte fungerar, försök igen genom att använda en annan.">
<!ENTITY torsettings.useBridges.type "Transport-typ:">
-<!ENTITY torsettings.useBridges.custom "Fyll i anpassade bryggor">
+<!ENTITY torsettings.useBridges.custom "Ange egna bryggor">
<!ENTITY torsettings.useBridges.label "Ange en eller flera Tor-bryggor (en per rad).">
<!ENTITY torsettings.useBridges.placeholder "typ adress:port">
diff --git a/src/chrome/locale/zh-CN/network-settings.dtd b/src/chrome/locale/zh-CN/network-settings.dtd
index 167a597..fe39f0f 100644
--- a/src/chrome/locale/zh-CN/network-settings.dtd
+++ b/src/chrome/locale/zh-CN/network-settings.dtd
@@ -65,7 +65,7 @@
<!ENTITY torsettings.copyLog "点击复制 Tor 日志">
<!ENTITY torsettings.bridgeHelpTitle "网桥中继帮助">
<!ENTITY torsettings.bridgeHelp1 "如果 Tor 网络无法连接,可能是因为互联网服务提供商 (ISP) 或其他机构对 Tor 进行了封锁。通常,使用 Tor 网桥可以解决这种问题。网桥指未公开的网络中继,更难于封锁。">
-<!ENTITY torsettings.bridgeHelp1B "您可以使用集成的网桥,也可以以下列方式获取一些网桥并手动输入:">
+<!ENTITY torsettings.bridgeHelp1B "您可以使用预先配置好的默认设置的网桥地址集成,也可以以下列方式获取一些自定的网桥地址:">
<!ENTITY torsettings.bridgeHelp2Heading "网页方式">
<!ENTITY torsettings.bridgeHelp2 "使用浏览器访问 https://bridges.torproject.org">
<!ENTITY torsettings.bridgeHelp3Heading "电子邮件自动回复方式">
1
0

[translation/tor-browser-manual] Update translations for tor-browser-manual
by translation@torproject.org 13 Apr '17
by translation@torproject.org 13 Apr '17
13 Apr '17
commit ae22914ff2dff49673deff795ca651bfb4085324
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 13 20:18:18 2017 +0000
Update translations for tor-browser-manual
---
ar/ar.po | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index 2f24ce6..39221f2 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -38,7 +38,7 @@ msgid ""
"Tor Browser uses the Tor network to protect your privacy and anonymity. "
"Using the Tor network has two main properties:"
msgstr ""
-"متصفح Tor يستعمل شبكة Tor لحماية خصويتك و سرية هويتك. استخدام شبكة Tor له "
+" يستعمل متصفح Torشبكة Tor لحماية خصوصيتك وسرية هويتك. استخدام شبكة Tor له "
"خاصيتان رئيسيتان:"
#: about-tor-browser.page:18
@@ -66,8 +66,8 @@ msgid ""
"In addition, Tor Browser is designed to prevent websites from "
"“fingerprinting” or identifying you based on your browser configuration."
msgstr ""
-"بالإضافة، تمّ تصميم متصفّح Tor لكي يمنع المواقع الإلكترونية من \"أخذ بصماتك"
-" الإلكترونية\" أو من التعريف عنك عبر إعدادات متصفّحك."
+"إضافة على ذلك، تمّ تصميم متصفّح Tor لكي يمنع المواقع الإلكترونية من أخذ "
+"\"بصمتك الإلكترونية\" أو من التعريف عنك عبر إعدادات متصفّحك."
#: about-tor-browser.page:39
msgid ""
1
0
commit cb0b9fda68ad2c02aeea49856114dbdae0fffe27
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Apr 13 19:58:27 2017 +0000
Version bump, and CHANGELOG update
---
src/CHANGELOG | 10 ++++++++++
src/install.rdf | 2 +-
2 files changed, 11 insertions(+), 1 deletion(-)
diff --git a/src/CHANGELOG b/src/CHANGELOG
index bc1092b..9de9989 100644
--- a/src/CHANGELOG
+++ b/src/CHANGELOG
@@ -1,3 +1,13 @@
+1.9.7.2
+ * Bug 21865: Update our JIT preferences in the security slider
+ * Bug 21747: Make 'New Tor Circuit for this Site' work in ESR52
+ * Bug 21745: Fix handling of catch-all circuit
+ * Bug 21547: Fix circuit display under e10s
+ * Bug 21268: e10s compatibility for New Identity
+ * Bug 21267: Remove window resize implementation for now
+ * Bug 21201: Make Torbutton multiprocess compatible
+ * Translation updates
+
1.9.7.1
* Bug 21396: Allow leaking of resource/chrome URIs (off by default)
* Bug 21574: Add link for zh manual and create manual links dynamically
diff --git a/src/install.rdf b/src/install.rdf
index 5a698b3..670dbb6 100644
--- a/src/install.rdf
+++ b/src/install.rdf
@@ -6,7 +6,7 @@
<em:name>Torbutton</em:name>
<em:creator>Mike Perry</em:creator>
<em:id>torbutton(a)torproject.org</em:id>
- <em:version>1.9.7.1</em:version>
+ <em:version>1.9.7.2</em:version>
<em:multiprocessCompatible>true</em:multiprocessCompatible>
<em:homepageURL>https://www.torproject.org/projects/torbrowser.html.en</em:homepageURL>
<em:optionsURL>chrome://torbutton/content/preferences.xul</em:optionsURL>
1
0

[translation/tor-browser-manual] Update translations for tor-browser-manual
by translation@torproject.org 13 Apr '17
by translation@torproject.org 13 Apr '17
13 Apr '17
commit b7c630a38e2685dcba1a890f27c8735f028d4388
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 13 19:48:17 2017 +0000
Update translations for tor-browser-manual
---
ar/ar.po | 34 ++++++++++++++++++++++++++++------
1 file changed, 28 insertions(+), 6 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index 74efeb1..2f24ce6 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -409,10 +409,14 @@ msgid ""
"“32-bit” or “64-bit” software: this depends on the model of the computer you"
" are using."
msgstr ""
+"سيردّ GetTor مرسلاً روابطاً تستطيع من خلالها تنزيل رزمة متصفّح Tor، التوقيع "
+"المشفّر (ضروريّ لتوثيق التنزيل)، بصمة المفتاح المستخدم لإنشاء التوقيع، و "
+"اختباري الرزمة. قد تجد خيارين للتنزيل : 32-bit أو 64-bit : إختر الرزمة بحسب "
+"موديل الحاسوب الذي تستخدمه."
#: downloading.page:57
msgid "To use GetTor via Twitter:"
-msgstr ""
+msgstr "لاستخدام GetTor عبر Twitter:"
#: downloading.page:62
msgid ""
@@ -420,38 +424,44 @@ msgid ""
"Message to @get_tor with the words \"osx en\" in it (you don't need to "
"follow the account)."
msgstr ""
+"لتحصل على روابط تنزيل متصفّح Tor بالإنجليزية لنظام OS X، إبعث برسالة مباشرة "
+"الى @get_tor تحتوي على كلمات osx en (لست بحاحة للكون متابعاً للحساب)."
#: downloading.page:70
msgid "To use GetTor via Jabber/XMPP (Tor Messenger, Jitsi, CoyIM):"
-msgstr ""
+msgstr "لإستخدام GetTor عبر Jabber/XMPP (أي Tor Messenger, Jitsi, CoyIM): "
#: downloading.page:75
msgid ""
"To get links for downloading Tor Browser in Chinese for Linux, send a "
"message to gettor(a)torproject.org with the words \"linux zh\" in it."
msgstr ""
+"للحصول على روابط تنزيل متصفّح Tor بالصينية لنظام Linux، إبعث برسالة مباشرة "
+"الى @get_tor تحتوي على كلمات linux zh."
#: downloading.page:84
msgid "Satori"
-msgstr ""
+msgstr "Satori"
#: downloading.page:85
msgid ""
"Satori is an add-on for the Chrome or Chromium browsers that allows you to "
"download several security and privacy programs from different sources."
msgstr ""
+"Satori هو تطبيق مضاف لمتصفّحي Chrome و Chromium يسمح لك بتنزيل عدّة برامج "
+"تتعلّق بالأمان والخصوصية من عدّة مصادر."
#: downloading.page:90
msgid "To download Tor Browser using Satori:"
-msgstr ""
+msgstr "لتنزيل متصفّح Tor باستخدام Satori:"
#: downloading.page:95
msgid "Install Satori from the Chrome App Store."
-msgstr ""
+msgstr "ثبّت Satori من متجر تطبيقات Chrome."
#: downloading.page:100
msgid "Select Satori from your browser’s Apps menu."
-msgstr ""
+msgstr "إختر Satori من قائمة التطبيقات في متصفّحك."
#: downloading.page:105
msgid ""
@@ -461,12 +471,18 @@ msgid ""
"after the name of the program — each one represents a different source from "
"which to get the software. Your download will then begin."
msgstr ""
+"عندما يفتح Satori، إنقر على لغتك المفضّلة. ستفتح قائمة مدرجة التنزيلات "
+"المتوفّرة لهذه اللغة. أعثر على بند متصفّح Tor التابع لإسم نظام التشغيل الخاص"
+" بك. إختر أو A أو B الملحقة بإسم البرنامج - كل منها يمثّل مصدراً مختلفاً "
+"للحصول على البرنامج. بعد ذلك يبدأ التنزيل."
#: downloading.page:115
msgid ""
"Wait for your download to finish, then find the “Generate Hash” section in "
"Satori’s menu and click “Select Files”."
msgstr ""
+"إنتظر حتى اكتمال التنزيل، ثمّ إعثر على قسم \"أنشئ الهاش\" في قائمة Satori "
+"وانقر \"إختر الملفات\"."
#: downloading.page:121
msgid ""
@@ -478,6 +494,12 @@ msgid ""
"Browser</link>. If they do not match, you may need to try downloading again,"
" or from a different source."
msgstr ""
+"إختر الملف الذي تمّ تنزيله. سيظهر Satori إختباري الملف والذي عليك مقارنته "
+"باختباري البرنامج الأصلي: تحصل على الأصلي بالنقر على كلمة \"إختباري\" بعد "
+"الرابط الذي تمّ استخدامه لبدء التنزيل. إذا تطابقت نسختا الاختباري، كان "
+"التنزيل ناجحاً، وبإمكانك <link xref=\"first-time\"> المباشرة باستخدام "
+"المتصفّح </link>. إن لم تتطابق النسختين، قد يكون عليك معاودة التنزيل، أو "
+"التنزيل من مصدر مختلف. "
#: first-time.page:7
msgid "Learn how to use Tor Browser for the first time"
1
0

[translation/tor-browser-manual] Update translations for tor-browser-manual
by translation@torproject.org 13 Apr '17
by translation@torproject.org 13 Apr '17
13 Apr '17
commit 742c823a8a82a247145be0752189c05ee3b435b1
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 13 19:18:17 2017 +0000
Update translations for tor-browser-manual
---
ar/ar.po | 16 +++++++++++++---
1 file changed, 13 insertions(+), 3 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index e6f07ad..74efeb1 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -347,7 +347,7 @@ msgstr ""
#: downloading.page:7
msgid "How to download Tor Browser"
-msgstr ""
+msgstr "كيفية تنزيل متصفّح Tor"
#: downloading.page:10
msgid "Downloading"
@@ -360,6 +360,9 @@ msgid ""
"will be secured using <link xref=\"secure-connections\">HTTPS</link>, which "
"makes it much harder for somebody to tamper with."
msgstr ""
+"الطريقة الأبسط والأكثر أماناً لتنزيل متصفّح Tor هي تنزيله من موقع مشروع Tor "
+"الرسمي على https://www.torproject.org. يتم تأمين صلتك بالموقع عبر بروتوكول "
+"<link xref=\"secure-connections\">HTTPS</link> الذي يصعب التلاعب به."
#: downloading.page:19
msgid ""
@@ -367,10 +370,13 @@ msgid ""
"for example, it could be blocked on your network. If this happens, you can "
"use one of the alternative download methods listed below."
msgstr ""
+"غير أنّك أحياناً لا تتمكّن من ولوج موقع مشروع Tor: على سبيل المثال قد يكون "
+"الموقع محجوباً من قبل شبكتك. في هذه الحال، تستطيع استخدام إحدى طرق التنزيل "
+"البديلة المذكورة أدناه:"
#: downloading.page:27
msgid "GetTor"
-msgstr ""
+msgstr "getTor"
#: downloading.page:28
msgid ""
@@ -378,10 +384,12 @@ msgid ""
"the latest version of Tor Browser, hosted at a variety of locations, such as"
" Dropbox, Google Drive and Github.."
msgstr ""
+"GetTor هو عبارة عن خدمة تردّ على الرسائل تلقائياً مرسلة روابط لأحدث نسخة "
+"لمتصفّح Tor، ومحفّظة في عدّة مواقع، مثال Dropbox, Google Drive, و Github."
#: downloading.page:34
msgid "To use GetTor via email:"
-msgstr ""
+msgstr "لاستخدام GetTor عبر الإيميل:"
#: downloading.page:39
msgid ""
@@ -389,6 +397,8 @@ msgid ""
"simply write “windows”, “osx”, or “linux”, (without quotation marks) "
"depending on your operating system."
msgstr ""
+"أرسل إيميلاً الى عنوان gettor(a)torproject.org, وفي صلب الموضوع اكتب فقط إسم "
+"نظام التشغيل الخاص بك مثلا windows, osx, linux."
#: downloading.page:46
msgid ""
1
0

[translation/tor-browser-manual] Update translations for tor-browser-manual
by translation@torproject.org 13 Apr '17
by translation@torproject.org 13 Apr '17
13 Apr '17
commit 1be0235c25a244c4df16f5f29762a70a5acbff09
Author: Translation commit bot <translation(a)torproject.org>
Date: Thu Apr 13 18:48:19 2017 +0000
Update translations for tor-browser-manual
---
ar/ar.po | 28 ++++++++++++++++++++++++++--
1 file changed, 26 insertions(+), 2 deletions(-)
diff --git a/ar/ar.po b/ar/ar.po
index 84aee7b..e6f07ad 100644
--- a/ar/ar.po
+++ b/ar/ar.po
@@ -242,10 +242,14 @@ msgid ""
"page for more information on the types of transport that are currently "
"available."
msgstr ""
+"قد يقوم مزوّدك للإنترنت أو الدولة بحجب الولوج المباشر الى شبكة Tor. يشمل "
+"متصفّح Tor بعض الأدوات للاتفاف حول هذا الحجب. تسمّى هذه الأدوات بإسم "
+"\"النواقل الموصولة\". توجّه الى صفحة <link xref=\"transports\"> النواقل "
+"الموصولة </link> للمزيد من المعلومات حول أنواع النقل المتوفّرة حالياً. "
#: circumvention.page:22
msgid "Using pluggable transports"
-msgstr ""
+msgstr "إستخدام النواقل الموصولة"
#. This is a reference to an external file such as an image or video. When
#. the file changes, the md5 hash will change to let you know you need to
@@ -257,12 +261,16 @@ msgid ""
"external ref='media/circumvention/configure.png' "
"md5='519d888303eadfe4cb03f178aedd90f5'"
msgstr ""
+"المرجع الخارجي='media/circumvention/configure.png' "
+"md5='519d888303eadfe4cb03f178aedd90f5'"
#: circumvention.page:28
msgid ""
"To use pluggable transports, click \"Configure\" in the Tor Launcher window "
"that appears when you first run Tor Browser."
msgstr ""
+"لإستخدام النواقل الموصولة إنقر \"ضبط\" في نافذة برنامج إطلاق Tor والتي تظهر "
+"أوّل تشغيلك لمتصفّح Tor."
#: circumvention.page:33
msgid ""
@@ -270,12 +278,16 @@ msgid ""
" clicking on the green onion near your address bar and selecting “Tor "
"Network Settings”."
msgstr ""
+"بإمكانك أيضاً ضبط النواقل الموصولة بعد تشغيل متصفّح Tor، عبر النقر على "
+"البصلة الخضراء بجانب عنوان المتصفّح واختيار \"إعدادات شبكة Tor\". "
#: circumvention.page:41
msgid ""
"Select “yes” when asked if your Internet Service Provider blocks connections"
" to the Tor network."
msgstr ""
+"إختر \"نعم\" عند ظهور السؤال \"هل يحجب مزوّد الإنترنت الخاص بك التواصل مع "
+"شبكة Tor؟\""
#. This is a reference to an external file such as an image or video. When
#. the file changes, the md5 hash will change to let you know you need to
@@ -287,16 +299,20 @@ msgid ""
"external ref='media/circumvention/bridges.png' "
"md5='910cdd5e45860b81a1ad4739c589a195'"
msgstr ""
+"المرجع الخارجي='media/circumvention/bridges.png' "
+"md5='910cdd5e45860b81a1ad4739c589a195'"
#: circumvention.page:51
msgid ""
"Select “Connect with provided bridges”. Tor Browser currently has six "
"pluggable transport options to choose from."
msgstr ""
+"إختر \"التواصل مع الجسور المزوّدة\". يسمح متصفّح Tor باختيار الى حد 6 نواقل "
+"موصولة."
#: circumvention.page:60
msgid "Which transport should I use?"
-msgstr ""
+msgstr "أي ناقل عليّ استخامه؟"
#: circumvention.page:61
msgid ""
@@ -305,6 +321,9 @@ msgid ""
"Transports</link> page), and their effectiveness depends on your individual "
"circumstances."
msgstr ""
+"تعمل كل من النواقل المذكورة في قائمة برنامج إطلاق Tor بطريقة مختلفة (للمزيد "
+"من المعلومات توجّه الى صفحة <link xref=\"transports\"> النواقل "
+"الموصولة</link> )، وتعتمد فعّالية كل منها على ظروفك الفرديّة."
#: circumvention.page:67
msgid ""
@@ -312,6 +331,8 @@ msgid ""
" should try the different transports: obfs3, obfs4, ScrambleSuit, fte, meek-"
"azure, meek-amazon."
msgstr ""
+"إن كانت أوّل محاولة لك بالالتفاف حول الحجب، عليك تجربة النواقل المختلفة: "
+"obfs3, obfs4, ScambleSuit, fte, meek-azure, meek-amazon."
#: circumvention.page:72
msgid ""
@@ -320,6 +341,9 @@ msgid ""
"xref=\"bridges\">Bridges</link> section to learn what bridges are and how to"
" obtain them."
msgstr ""
+"إذا جرّبت كل هذه الخيارات ولم تتمكّن من الوصول الى الإنترنت، سيكون عليك "
+"إدخال العناوين الجسر يدوياً. إقرأ قسم<link xref=\"bridges\"> الجسور </link> "
+"لتتعلّم ماهيّة الجسور وكيفية الحصول عليها."
#: downloading.page:7
msgid "How to download Tor Browser"
1
0

[tor/master] hs: Refactor circuitmap to use circuit_t instead of or_circuit_t.
by nickm@torproject.org 13 Apr '17
by nickm@torproject.org 13 Apr '17
13 Apr '17
commit 037ce360bd0a7b0db1d6b6e441c90b1773b4cb06
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Wed Jan 18 12:01:49 2017 +0200
hs: Refactor circuitmap to use circuit_t instead of or_circuit_t.
---
src/or/circuitlist.c | 9 +++---
src/or/hs_circuitmap.c | 72 +++++++++++++++++++++++++++++----------------
src/or/hs_circuitmap.h | 4 +--
src/or/or.h | 14 ++++-----
src/or/rendmid.c | 2 +-
src/test/test_circuitlist.c | 10 +++----
6 files changed, 66 insertions(+), 45 deletions(-)
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 738119f..80bb7f6 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -943,10 +943,6 @@ circuit_free(circuit_t *circ)
crypto_cipher_free(ocirc->n_crypto);
crypto_digest_free(ocirc->n_digest);
- if (ocirc->hs_token) {
- hs_circuitmap_remove_circuit(ocirc);
- }
-
if (ocirc->rend_splice) {
or_circuit_t *other = ocirc->rend_splice;
tor_assert(other->base_.magic == OR_CIRCUIT_MAGIC);
@@ -978,6 +974,11 @@ circuit_free(circuit_t *circ)
/* Remove from map. */
circuit_set_n_circid_chan(circ, 0, NULL);
+ /* Clear HS circuitmap token from this circ (if any) */
+ if (circ->hs_token) {
+ hs_circuitmap_remove_circuit(circ);
+ }
+
/* Clear cell queue _after_ removing it from the map. Otherwise our
* "active" checks will be violated. */
cell_queue_clear(&circ->n_chan_cells);
diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c
index 32017f1..4d5c893 100644
--- a/src/or/hs_circuitmap.c
+++ b/src/or/hs_circuitmap.c
@@ -25,8 +25,8 @@ static struct hs_circuitmap_ht *the_hs_circuitmap = NULL;
/* This is a helper function used by the hash table code (HT_). It returns 1 if
* two circuits have the same HS token. */
static int
-hs_circuits_have_same_token(const or_circuit_t *first_circuit,
- const or_circuit_t *second_circuit)
+hs_circuits_have_same_token(const circuit_t *first_circuit,
+ const circuit_t *second_circuit)
{
const hs_token_t *first_token;
const hs_token_t *second_token;
@@ -57,7 +57,7 @@ hs_circuits_have_same_token(const or_circuit_t *first_circuit,
/* This is a helper function for the hash table code (HT_). It hashes a circuit
* HS token into an unsigned int for use as a key by the hash table routines.*/
static inline unsigned int
-hs_circuit_hash_token(const or_circuit_t *circuit)
+hs_circuit_hash_token(const circuit_t *circuit)
{
tor_assert(circuit->hs_token);
@@ -67,11 +67,11 @@ hs_circuit_hash_token(const or_circuit_t *circuit)
/* Register the circuitmap hash table */
HT_PROTOTYPE(hs_circuitmap_ht, // The name of the hashtable struct
- or_circuit_t, // The name of the element struct,
+ circuit_t, // The name of the element struct,
hs_circuitmap_node, // The name of HT_ENTRY member
hs_circuit_hash_token, hs_circuits_have_same_token)
-HT_GENERATE2(hs_circuitmap_ht, or_circuit_t, hs_circuitmap_node,
+HT_GENERATE2(hs_circuitmap_ht, circuit_t, hs_circuitmap_node,
hs_circuit_hash_token, hs_circuits_have_same_token,
0.6, tor_reallocarray, tor_free_)
@@ -116,13 +116,13 @@ hs_token_free(hs_token_t *hs_token)
}
/** Return the circuit from the circuitmap with token <b>search_token</b>. */
-static or_circuit_t *
+static circuit_t *
get_circuit_with_token(hs_token_t *search_token)
{
tor_assert(the_hs_circuitmap);
/* We use a dummy circuit object for the hash table search routine. */
- or_circuit_t search_circ;
+ circuit_t search_circ;
search_circ.hs_token = search_token;
return HT_FIND(hs_circuitmap_ht, the_hs_circuitmap, &search_circ);
}
@@ -130,7 +130,7 @@ get_circuit_with_token(hs_token_t *search_token)
/* Helper function that registers <b>circ</b> with <b>token</b> on the HS
circuitmap. This function steals reference of <b>token</b>. */
static void
-hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
+hs_circuitmap_register_impl(circuit_t *circ, hs_token_t *token)
{
tor_assert(circ);
tor_assert(token);
@@ -145,13 +145,12 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
take precedence over old ones, so that HSes and clients and reestablish
killed circuits without changing the HS token. */
{
- or_circuit_t *found_circ;
+ circuit_t *found_circ;
found_circ = get_circuit_with_token(token);
if (found_circ) {
hs_circuitmap_remove_circuit(found_circ);
- if (!found_circ->base_.marked_for_close) {
- circuit_mark_for_close(TO_CIRCUIT(found_circ),
- END_CIRC_REASON_FINISHED);
+ if (!found_circ->marked_for_close) {
+ circuit_mark_for_close(found_circ, END_CIRC_REASON_FINISHED);
}
}
}
@@ -165,7 +164,7 @@ hs_circuitmap_register_impl(or_circuit_t *circ, hs_token_t *token)
* circuitmap. Use the HS <b>token</b> as the key to the hash table. If
* <b>token</b> is not set, clear the circuit of any HS tokens. */
static void
-hs_circuitmap_register_circuit(or_circuit_t *circ,
+hs_circuitmap_register_circuit(circuit_t *circ,
hs_token_type_t type, size_t token_len,
const uint8_t *token)
{
@@ -182,13 +181,13 @@ hs_circuitmap_register_circuit(or_circuit_t *circ,
* Only returns a circuit with purpose equal to the <b>wanted_circ_purpose</b>
* parameter and if it is NOT marked for close. Return NULL if no such circuit
* is found. */
-static or_circuit_t *
+static circuit_t *
hs_circuitmap_get_circuit(hs_token_type_t type,
size_t token_len,
const uint8_t *token,
uint8_t wanted_circ_purpose)
{
- or_circuit_t *found_circ = NULL;
+ circuit_t *found_circ = NULL;
tor_assert(the_hs_circuitmap);
@@ -202,8 +201,8 @@ hs_circuitmap_get_circuit(hs_token_type_t type,
/* Check that the circuit is useful to us */
if (!found_circ ||
- found_circ->base_.purpose != wanted_circ_purpose ||
- found_circ->base_.marked_for_close) {
+ found_circ->purpose != wanted_circ_purpose ||
+ found_circ->marked_for_close) {
return NULL;
}
@@ -217,11 +216,18 @@ hs_circuitmap_get_circuit(hs_token_type_t type,
or_circuit_t *
hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key)
{
+ circuit_t *circ;
tor_assert(auth_key);
- return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3,
+ circ = hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3,
ED25519_PUBKEY_LEN, auth_key->pubkey,
CIRCUIT_PURPOSE_INTRO_POINT);
+ if (!circ) {
+ return NULL;
+ }
+
+ tor_assert(CIRCUIT_IS_ORCIRC(circ));
+ return TO_OR_CIRCUIT(circ);
}
/* Public function: Return v2 introduction circuit with <b>digest</b>. Return
@@ -229,11 +235,18 @@ hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key)
or_circuit_t *
hs_circuitmap_get_intro_circ_v2(const uint8_t *digest)
{
+ circuit_t *circ;
tor_assert(digest);
- return hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2,
+ circ = hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2,
REND_TOKEN_LEN, digest,
CIRCUIT_PURPOSE_INTRO_POINT);
+ if (!circ) {
+ return NULL;
+ }
+
+ tor_assert(CIRCUIT_IS_ORCIRC(circ));
+ return TO_OR_CIRCUIT(circ);
}
/* Public function: Return rendezvous circuit with rendezvous
@@ -241,11 +254,18 @@ hs_circuitmap_get_intro_circ_v2(const uint8_t *digest)
or_circuit_t *
hs_circuitmap_get_rend_circ(const uint8_t *cookie)
{
+ circuit_t *circ;
tor_assert(cookie);
- return hs_circuitmap_get_circuit(HS_TOKEN_REND,
+ circ = hs_circuitmap_get_circuit(HS_TOKEN_REND,
REND_TOKEN_LEN, cookie,
CIRCUIT_PURPOSE_REND_POINT_WAITING);
+ if (!circ) {
+ return NULL;
+ }
+
+ tor_assert(CIRCUIT_IS_ORCIRC(circ));
+ return TO_OR_CIRCUIT(circ);
}
/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
@@ -253,7 +273,7 @@ hs_circuitmap_get_rend_circ(const uint8_t *cookie)
void
hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie)
{
- hs_circuitmap_register_circuit(circ,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
HS_TOKEN_REND,
REND_TOKEN_LEN, cookie);
}
@@ -263,7 +283,7 @@ hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie)
void
hs_circuitmap_register_intro_circ_v2(or_circuit_t *circ, const uint8_t *digest)
{
- hs_circuitmap_register_circuit(circ,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
HS_TOKEN_INTRO_V2,
REND_TOKEN_LEN, digest);
}
@@ -274,7 +294,7 @@ void
hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ,
const ed25519_public_key_t *auth_key)
{
- hs_circuitmap_register_circuit(circ,
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
HS_TOKEN_INTRO_V3,
ED25519_PUBKEY_LEN, auth_key->pubkey);
}
@@ -282,7 +302,7 @@ hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ,
/** Remove this circuit from the HS circuitmap. Clear its HS token, and remove
* it from the hashtable. */
void
-hs_circuitmap_remove_circuit(or_circuit_t *circ)
+hs_circuitmap_remove_circuit(circuit_t *circ)
{
tor_assert(the_hs_circuitmap);
@@ -291,14 +311,14 @@ hs_circuitmap_remove_circuit(or_circuit_t *circ)
}
/* Remove circ from circuitmap */
- or_circuit_t *tmp;
+ circuit_t *tmp;
tmp = HT_REMOVE(hs_circuitmap_ht, the_hs_circuitmap, circ);
/* ... and ensure the removal was successful. */
if (tmp) {
tor_assert(tmp == circ);
} else {
log_warn(LD_BUG, "Could not find circuit (%u) in circuitmap.",
- circ->p_circ_id);
+ circ->n_circ_id);
}
/* Clear token from circ */
diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h
index 6e0c2d4..79dea1a 100644
--- a/src/or/hs_circuitmap.h
+++ b/src/or/hs_circuitmap.h
@@ -9,7 +9,7 @@
#ifndef TOR_HS_CIRCUITMAP_H
#define TOR_HS_CIRCUITMAP_H
-typedef HT_HEAD(hs_circuitmap_ht, or_circuit_t) hs_circuitmap_ht;
+typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht;
typedef struct hs_token_s hs_token_t;
struct or_circuit_t;
@@ -28,7 +28,7 @@ void hs_circuitmap_register_intro_circ_v2(struct or_circuit_t *circ,
void hs_circuitmap_register_intro_circ_v3(struct or_circuit_t *circ,
const ed25519_public_key_t *auth_key);
-void hs_circuitmap_remove_circuit(struct or_circuit_t *circ);
+void hs_circuitmap_remove_circuit(struct circuit_t *circ);
void hs_circuitmap_init(void);
void hs_circuitmap_free_all(void);
diff --git a/src/or/or.h b/src/or/or.h
index 8a73cc2..034cd5e 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -3064,6 +3064,13 @@ typedef struct circuit_t {
* circuit's queues; used only if CELL_STATS events are enabled and
* cleared after being sent to control port. */
smartlist_t *testing_cell_stats;
+
+ /** If set, points to an HS token that this circuit might be carrying.
+ * Used by the HS circuitmap. */
+ hs_token_t *hs_token;
+ /** Hashtable node: used to look up the circuit by its HS token using the HS
+ circuitmap. */
+ HT_ENTRY(circuit_t) hs_circuitmap_node;
} circuit_t;
/** Largest number of relay_early cells that we can send on a given
@@ -3373,13 +3380,6 @@ typedef struct or_circuit_t {
* is not marked for close. */
struct or_circuit_t *rend_splice;
- /** If set, points to an HS token that this circuit might be carrying.
- * Used by the HS circuitmap. */
- hs_token_t *hs_token;
- /** Hashtable node: used to look up the circuit by its HS token using the HS
- circuitmap. */
- HT_ENTRY(or_circuit_t) hs_circuitmap_node;
-
/** Stores KH for the handshake. */
char rend_circ_nonce[DIGEST_LEN];/* KH in tor-spec.txt */
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index a7b37c7..b581f0e 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -342,7 +342,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_ESTABLISHED);
circuit_change_purpose(TO_CIRCUIT(rend_circ),
CIRCUIT_PURPOSE_REND_ESTABLISHED);
- hs_circuitmap_remove_circuit(circ);
+ hs_circuitmap_remove_circuit(TO_CIRCUIT(circ));
rend_circ->rend_splice = circ;
circ->rend_splice = rend_circ;
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
index 61d3b43..ed18cbf 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -255,13 +255,13 @@ test_rend_token_maps(void *arg)
tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
- tt_ptr_op(c3->hs_token, OP_EQ, NULL);
- tt_ptr_op(c4->hs_token, OP_NE, NULL);
- tt_mem_op(c4->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN);
+ tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL);
+ tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL);
+ tt_mem_op(TO_CIRCUIT(c4)->hs_token->token, OP_EQ, tok3, REND_TOKEN_LEN);
/* Now clear c4's cookie. */
- hs_circuitmap_remove_circuit(c4);
- tt_ptr_op(c4->hs_token, OP_EQ, NULL);
+ hs_circuitmap_remove_circuit(TO_CIRCUIT(c4));
+ tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL);
tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
done:
1
0

13 Apr '17
commit 902672eac6dc4cbdbdd7e410a6dc7580f0df7509
Merge: 63e39b2 f02868b
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Apr 13 14:23:59 2017 -0400
Merge branch 'ticket21889_031_01_squashed'
src/or/circuitlist.c | 9 +-
src/or/hs_circuitmap.c | 296 ++++++++++++++++++++++++++++++++----------
src/or/hs_circuitmap.h | 69 +++++++---
src/or/hs_intropoint.c | 4 +-
src/or/or.h | 14 +-
src/or/rendmid.c | 16 ++-
src/test/test_circuitlist.c | 136 ++++++++++++++-----
src/test/test_hs_intropoint.c | 11 +-
8 files changed, 416 insertions(+), 139 deletions(-)
diff --cc src/test/test_hs_intropoint.c
index 6e68e2c,40d1f25..5caa550
--- a/src/test/test_hs_intropoint.c
+++ b/src/test/test_hs_intropoint.c
@@@ -788,9 -789,9 +789,9 @@@ test_received_introduce1_handling(void
/* Register the circuit in the map for the auth key of the cell. */
ed25519_public_key_t auth_key;
const uint8_t *cell_auth_key =
- hs_cell_introduce1_getconstarray_auth_key(cell);
+ trn_cell_introduce1_getconstarray_auth_key(cell);
memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN);
- hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key);
+ hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key);
ret = hs_intro_received_introduce1(circ, request, request_len);
circuit_free(TO_CIRCUIT(circ));
circuit_free(TO_CIRCUIT(service_circ));
1
0
commit ba8952059323c614d7a1693228e349820fd1c50a
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Thu Apr 13 14:36:57 2017 -0400
fix wide lines
---
src/test/test_circuitlist.c | 7 ++++---
src/test/test_hs_intropoint.c | 3 ++-
2 files changed, 6 insertions(+), 4 deletions(-)
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
index 14c65ab..520aaf3 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -420,7 +420,8 @@ test_hs_circuitmap_isolation(void *arg)
hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2);
/* Check that the getters work */
- tt_ptr_op(circ2, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok2));
+ tt_ptr_op(circ2, OP_EQ,
+ hs_circuitmap_get_intro_circ_v2_service_side(tok2));
tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
/* Register circ4 with tok2: it should override circ2 */
@@ -431,7 +432,8 @@ test_hs_circuitmap_isolation(void *arg)
/* Check that the getter returns circ4; the last circuit registered with
* that token. */
- tt_ptr_op(circ4, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok2));
+ tt_ptr_op(circ4, OP_EQ,
+ hs_circuitmap_get_intro_circ_v2_service_side(tok2));
}
done:
@@ -445,7 +447,6 @@ test_hs_circuitmap_isolation(void *arg)
circuit_free(TO_CIRCUIT(circ4));
}
-
struct testcase_t circuitlist_tests[] = {
{ "maps", test_clist_maps, TT_FORK, NULL, NULL },
{ "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL },
diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c
index 5caa550..7bcd568 100644
--- a/src/test/test_hs_intropoint.c
+++ b/src/test/test_hs_intropoint.c
@@ -548,7 +548,8 @@ test_intro_point_registration(void *arg)
tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap));
get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO,
establish_intro_cell);
- returned_intro_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
+ returned_intro_circ =
+ hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
tt_ptr_op(intro_circ, ==, returned_intro_circ);
}
1
0
commit f02868bb53f57e416094c7ebc9f6632ce6a3d007
Author: George Kadianakis <desnacked(a)riseup.net>
Date: Fri Jan 20 13:55:06 2017 +0200
hs: Add service-side circuitmap API.
Now we have separate getters and setters for service-side and relay-side. I
took this approach over adding arguments to the already existing methods to
have more explicit type-checking, and also because some functions would grow
too large and dirty.
This commit also fixes every callsite to use the new function names which
modifies the legacy HS (v2) and the prop224 (v3) code.
Signed-off-by: David Goulet <dgoulet(a)torproject.org>
---
src/or/hs_circuitmap.c | 250 +++++++++++++++++++++++++++++++++---------
src/or/hs_circuitmap.h | 65 ++++++++---
src/or/hs_intropoint.c | 4 +-
src/or/rendmid.c | 14 ++-
src/test/test_circuitlist.c | 126 +++++++++++++++++----
src/test/test_hs_intropoint.c | 11 +-
6 files changed, 363 insertions(+), 107 deletions(-)
diff --git a/src/or/hs_circuitmap.c b/src/or/hs_circuitmap.c
index 4d5c893..ea66fb5 100644
--- a/src/or/hs_circuitmap.c
+++ b/src/or/hs_circuitmap.c
@@ -4,8 +4,9 @@
/**
* \file hs_circuitmap.c
*
- * \brief Manage the hidden service circuitmap: A hash table that maps binary
- * tokens to introduction and rendezvous circuits.
+ * \brief Hidden service circuitmap: A hash table that maps binary tokens to
+ * introduction and rendezvous circuits; it's used both by relays acting as
+ * intro points and rendezvous points, and also by hidden services themselves.
**/
#define HS_CIRCUITMAP_PRIVATE
@@ -177,15 +178,17 @@ hs_circuitmap_register_circuit(circuit_t *circ,
hs_circuitmap_register_impl(circ, hs_token);
}
-/* Query circuitmap for circuit with <b>token</b> of size <b>token_len</b>.
- * Only returns a circuit with purpose equal to the <b>wanted_circ_purpose</b>
- * parameter and if it is NOT marked for close. Return NULL if no such circuit
- * is found. */
+/* Helper function for hs_circuitmap_get_origin_circuit() and
+ * hs_circuitmap_get_or_circuit(). Because only circuit_t are indexed in the
+ * circuitmap, this function returns object type so the specialized functions
+ * using this helper can upcast it to the right type.
+ *
+ * Return NULL if not such circuit is found. */
static circuit_t *
-hs_circuitmap_get_circuit(hs_token_type_t type,
- size_t token_len,
- const uint8_t *token,
- uint8_t wanted_circ_purpose)
+hs_circuitmap_get_circuit_impl(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
{
circuit_t *found_circ = NULL;
@@ -209,38 +212,46 @@ hs_circuitmap_get_circuit(hs_token_type_t type,
return found_circ;
}
-/************** Public circuitmap API ****************************************/
-
-/* Public function: Return v3 introduction circuit with <b>auth_key</b>. Return
- * NULL if no such circuit is found in the circuitmap. */
-or_circuit_t *
-hs_circuitmap_get_intro_circ_v3(const ed25519_public_key_t *auth_key)
+/* Helper function: Query circuitmap for origin circuit with <b>token</b> of
+ * size <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose
+ * equal to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked
+ * for close. Return NULL if no such circuit is found. */
+static origin_circuit_t *
+hs_circuitmap_get_origin_circuit(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
{
circuit_t *circ;
- tor_assert(auth_key);
+ tor_assert(token);
+ tor_assert(CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose));
- circ = hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V3,
- ED25519_PUBKEY_LEN, auth_key->pubkey,
- CIRCUIT_PURPOSE_INTRO_POINT);
+ circ = hs_circuitmap_get_circuit_impl(type, token_len, token,
+ wanted_circ_purpose);
if (!circ) {
return NULL;
}
- tor_assert(CIRCUIT_IS_ORCIRC(circ));
- return TO_OR_CIRCUIT(circ);
+ tor_assert(CIRCUIT_IS_ORIGIN(circ));
+ return TO_ORIGIN_CIRCUIT(circ);
}
-/* Public function: Return v2 introduction circuit with <b>digest</b>. Return
- * NULL if no such circuit is found in the circuitmap. */
-or_circuit_t *
-hs_circuitmap_get_intro_circ_v2(const uint8_t *digest)
+/* Helper function: Query circuitmap for OR circuit with <b>token</b> of size
+ * <b>token_len</b> and <b>type</b>. Only returns a circuit with purpose equal
+ * to the <b>wanted_circ_purpose</b> parameter and if it is NOT marked for
+ * close. Return NULL if no such circuit is found. */
+static or_circuit_t *
+hs_circuitmap_get_or_circuit(hs_token_type_t type,
+ size_t token_len,
+ const uint8_t *token,
+ uint8_t wanted_circ_purpose)
{
circuit_t *circ;
- tor_assert(digest);
+ tor_assert(token);
+ tor_assert(!CIRCUIT_PURPOSE_IS_ORIGIN(wanted_circ_purpose));
- circ = hs_circuitmap_get_circuit(HS_TOKEN_INTRO_V2,
- REND_TOKEN_LEN, digest,
- CIRCUIT_PURPOSE_INTRO_POINT);
+ circ = hs_circuitmap_get_circuit_impl(type, token_len, token,
+ wanted_circ_purpose);
if (!circ) {
return NULL;
}
@@ -249,58 +260,189 @@ hs_circuitmap_get_intro_circ_v2(const uint8_t *digest)
return TO_OR_CIRCUIT(circ);
}
-/* Public function: Return rendezvous circuit with rendezvous
- * <b>cookie</b>. Return NULL if no such circuit is found in the circuitmap. */
+/************** Public circuitmap API ****************************************/
+
+/**** Public relay-side getters: */
+
+/* Public function: Return a v3 introduction circuit to this relay with
+ * <b>auth_key</b>. Return NULL if no such circuit is found in the
+ * circuitmap. */
or_circuit_t *
-hs_circuitmap_get_rend_circ(const uint8_t *cookie)
+hs_circuitmap_get_intro_circ_v3_relay_side(
+ const ed25519_public_key_t *auth_key)
{
- circuit_t *circ;
- tor_assert(cookie);
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V3_RELAY_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_INTRO_POINT);
+}
- circ = hs_circuitmap_get_circuit(HS_TOKEN_REND,
- REND_TOKEN_LEN, cookie,
- CIRCUIT_PURPOSE_REND_POINT_WAITING);
- if (!circ) {
- return NULL;
- }
+/* Public function: Return v2 introduction circuit to this relay with
+ * <b>digest</b>. Return NULL if no such circuit is found in the circuitmap. */
+or_circuit_t *
+hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest)
+{
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_INTRO_POINT);
+}
- tor_assert(CIRCUIT_IS_ORCIRC(circ));
- return TO_OR_CIRCUIT(circ);
+/* Public function: Return rendezvous circuit to this relay with rendezvous
+ * <b>cookie</b>. Return NULL if no such circuit is found in the circuitmap. */
+or_circuit_t *
+hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie)
+{
+ return hs_circuitmap_get_or_circuit(HS_TOKEN_REND_RELAY_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_REND_POINT_WAITING);
}
+/** Public relay-side setters: */
+
/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
* circuitmap. */
void
-hs_circuitmap_register_rend_circ(or_circuit_t *circ, const uint8_t *cookie)
+hs_circuitmap_register_rend_circ_relay_side(or_circuit_t *circ,
+ const uint8_t *cookie)
{
hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
- HS_TOKEN_REND,
+ HS_TOKEN_REND_RELAY_SIDE,
REND_TOKEN_LEN, cookie);
}
+/* Public function: Register v2 intro circuit with key <b>digest</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_intro_circ_v2_relay_side(or_circuit_t *circ,
+ const uint8_t *digest)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ REND_TOKEN_LEN, digest);
+}
+
+/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_intro_circ_v3_relay_side(or_circuit_t *circ,
+ const ed25519_public_key_t *auth_key)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_INTRO_V3_RELAY_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey);
+}
+
+/**** Public servide-side getters: */
+
+/* Public function: Return v3 introduction circuit with <b>auth_key</b>
+ * originating from this hidden service. Return NULL if no such circuit is
+ * found in the circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_intro_circ_v3_service_side(const
+ ed25519_public_key_t *auth_key)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Check first for established intro circuits */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_S_INTRO);
+ if (circ) {
+ return circ;
+ }
+
+ /* ...if nothing found, check for pending intro circs */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V3_SERVICE_SIDE,
+ ED25519_PUBKEY_LEN, auth_key->pubkey,
+ CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
+
+ return circ;
+}
+
+/* Public function: Return v2 introduction circuit originating from this hidden
+ * service with <b>digest</b>. Return NULL if no such circuit is found in the
+ * circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Check first for established intro circuits */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_S_INTRO);
+ if (circ) {
+ return circ;
+ }
+
+ /* ...if nothing found, check for pending intro circs */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ REND_TOKEN_LEN, digest,
+ CIRCUIT_PURPOSE_S_ESTABLISH_INTRO);
+
+ return circ;
+}
+
+/* Public function: Return rendezvous circuit originating from this hidden
+ * service with rendezvous <b>cookie</b>. Return NULL if no such circuit is
+ * found in the circuitmap. */
+origin_circuit_t *
+hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie)
+{
+ origin_circuit_t *circ = NULL;
+
+ /* Try to check if we have a connecting circuit. */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_S_CONNECT_REND);
+ if (circ) {
+ return circ;
+ }
+
+ /* Then try for connected circuit. */
+ circ = hs_circuitmap_get_origin_circuit(HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie,
+ CIRCUIT_PURPOSE_S_REND_JOINED);
+ return circ;
+}
+
+/**** Public servide-side setters: */
/* Public function: Register v2 intro circuit with key <b>digest</b> to the
* circuitmap. */
void
-hs_circuitmap_register_intro_circ_v2(or_circuit_t *circ, const uint8_t *digest)
+hs_circuitmap_register_intro_circ_v2_service_side(origin_circuit_t *circ,
+ const uint8_t *digest)
{
hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
- HS_TOKEN_INTRO_V2,
+ HS_TOKEN_INTRO_V2_SERVICE_SIDE,
REND_TOKEN_LEN, digest);
}
/* Public function: Register v3 intro circuit with key <b>auth_key</b> to the
* circuitmap. */
void
-hs_circuitmap_register_intro_circ_v3(or_circuit_t *circ,
- const ed25519_public_key_t *auth_key)
+hs_circuitmap_register_intro_circ_v3_service_side(origin_circuit_t *circ,
+ const ed25519_public_key_t *auth_key)
{
hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
- HS_TOKEN_INTRO_V3,
+ HS_TOKEN_INTRO_V3_SERVICE_SIDE,
ED25519_PUBKEY_LEN, auth_key->pubkey);
}
-/** Remove this circuit from the HS circuitmap. Clear its HS token, and remove
- * it from the hashtable. */
+/* Public function: Register rendezvous circuit with key <b>cookie</b> to the
+ * circuitmap. */
+void
+hs_circuitmap_register_rend_circ_service_side(origin_circuit_t *circ,
+ const uint8_t *cookie)
+{
+ hs_circuitmap_register_circuit(TO_CIRCUIT(circ),
+ HS_TOKEN_REND_SERVICE_SIDE,
+ REND_TOKEN_LEN, cookie);
+}
+
+/**** Misc public functions: */
+
+/** Public function: Remove this circuit from the HS circuitmap. Clear its HS
+ * token, and remove it from the hashtable. */
void
hs_circuitmap_remove_circuit(circuit_t *circ)
{
@@ -326,7 +468,7 @@ hs_circuitmap_remove_circuit(circuit_t *circ)
circ->hs_token = NULL;
}
-/* Initialize the global HS circuitmap. */
+/* Public function: Initialize the global HS circuitmap. */
void
hs_circuitmap_init(void)
{
@@ -336,7 +478,7 @@ hs_circuitmap_init(void)
HT_INIT(hs_circuitmap_ht, the_hs_circuitmap);
}
-/* Free all memory allocated by the global HS circuitmap. */
+/* Public function: Free all memory allocated by the global HS circuitmap. */
void
hs_circuitmap_free_all(void)
{
diff --git a/src/or/hs_circuitmap.h b/src/or/hs_circuitmap.h
index 79dea1a..33d5b64 100644
--- a/src/or/hs_circuitmap.h
+++ b/src/or/hs_circuitmap.h
@@ -13,21 +13,47 @@ typedef HT_HEAD(hs_circuitmap_ht, circuit_t) hs_circuitmap_ht;
typedef struct hs_token_s hs_token_t;
struct or_circuit_t;
+struct origin_circuit_t;
/** Public HS circuitmap API: */
-struct or_circuit_t *hs_circuitmap_get_rend_circ(const uint8_t *cookie);
-struct or_circuit_t *hs_circuitmap_get_intro_circ_v3(
- const ed25519_public_key_t *auth_key);
-struct or_circuit_t *hs_circuitmap_get_intro_circ_v2(const uint8_t *digest);
-
-void hs_circuitmap_register_rend_circ(struct or_circuit_t *circ,
- const uint8_t *cookie);
-void hs_circuitmap_register_intro_circ_v2(struct or_circuit_t *circ,
- const uint8_t *digest);
-void hs_circuitmap_register_intro_circ_v3(struct or_circuit_t *circ,
+/** Public relay-side API: */
+
+struct or_circuit_t *
+hs_circuitmap_get_intro_circ_v3_relay_side(const
+ ed25519_public_key_t *auth_key);
+struct or_circuit_t *
+hs_circuitmap_get_intro_circ_v2_relay_side(const uint8_t *digest);
+struct or_circuit_t *
+hs_circuitmap_get_rend_circ_relay_side(const uint8_t *cookie);
+
+void hs_circuitmap_register_rend_circ_relay_side(struct or_circuit_t *circ,
+ const uint8_t *cookie);
+void hs_circuitmap_register_intro_circ_v2_relay_side(struct or_circuit_t *circ,
+ const uint8_t *digest);
+void hs_circuitmap_register_intro_circ_v3_relay_side(struct or_circuit_t *circ,
const ed25519_public_key_t *auth_key);
+/** Public service-side API: */
+
+struct origin_circuit_t *
+hs_circuitmap_get_intro_circ_v3_service_side(const
+ ed25519_public_key_t *auth_key);
+struct origin_circuit_t *
+hs_circuitmap_get_intro_circ_v2_service_side(const uint8_t *digest);
+struct origin_circuit_t *
+hs_circuitmap_get_rend_circ_service_side(const uint8_t *cookie);
+
+void hs_circuitmap_register_intro_circ_v2_service_side(
+ struct origin_circuit_t *circ,
+ const uint8_t *digest);
+void hs_circuitmap_register_intro_circ_v3_service_side(
+ struct origin_circuit_t *circ,
+ const ed25519_public_key_t *auth_key);
+void hs_circuitmap_register_rend_circ_service_side(
+ struct origin_circuit_t *circ,
+ const uint8_t *cookie);
+
void hs_circuitmap_remove_circuit(struct circuit_t *circ);
void hs_circuitmap_init(void);
@@ -37,12 +63,19 @@ void hs_circuitmap_free_all(void);
/** Represents the type of HS token. */
typedef enum {
- /** A rendezvous cookie (128bit)*/
- HS_TOKEN_REND,
- /** A v2 introduction point pubkey (160bit) */
- HS_TOKEN_INTRO_V2,
- /** A v3 introduction point pubkey (256bit) */
- HS_TOKEN_INTRO_V3,
+ /** A rendezvous cookie on a relay (128bit)*/
+ HS_TOKEN_REND_RELAY_SIDE,
+ /** A v2 introduction point pubkey on a relay (160bit) */
+ HS_TOKEN_INTRO_V2_RELAY_SIDE,
+ /** A v3 introduction point pubkey on a relay (256bit) */
+ HS_TOKEN_INTRO_V3_RELAY_SIDE,
+
+ /** A rendezvous cookie on a hidden service (128bit)*/
+ HS_TOKEN_REND_SERVICE_SIDE,
+ /** A v2 introduction point pubkey on a hidden service (160bit) */
+ HS_TOKEN_INTRO_V2_SERVICE_SIDE,
+ /** A v3 introduction point pubkey on a hidden service (256bit) */
+ HS_TOKEN_INTRO_V3_SERVICE_SIDE,
} hs_token_type_t;
/** Represents a token used in the HS protocol. Each such token maps to a
diff --git a/src/or/hs_intropoint.c b/src/or/hs_intropoint.c
index a7282ab..6a63fd6 100644
--- a/src/or/hs_intropoint.c
+++ b/src/or/hs_intropoint.c
@@ -195,7 +195,7 @@ handle_verified_establish_intro_cell(or_circuit_t *circ,
}
/* Associate intro point auth key with this circuit. */
- hs_circuitmap_register_intro_circ_v3(circ, &auth_key);
+ hs_circuitmap_register_intro_circ_v3_relay_side(circ, &auth_key);
/* Repurpose this circuit into an intro circuit. */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT);
@@ -461,7 +461,7 @@ handle_introduce1(or_circuit_t *client_circ, const uint8_t *request,
{
ed25519_public_key_t auth_key;
get_auth_key_from_cell(&auth_key, RELAY_COMMAND_INTRODUCE1, parsed_cell);
- service_circ = hs_circuitmap_get_intro_circ_v3(&auth_key);
+ service_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
if (service_circ == NULL) {
char b64_key[ED25519_BASE64_LEN + 1];
ed25519_public_to_base64(b64_key, &auth_key);
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index b581f0e..23c3ded 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -96,7 +96,8 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request,
/* Close any other intro circuits with the same pk. */
c = NULL;
- while ((c = hs_circuitmap_get_intro_circ_v2((const uint8_t *)pk_digest))) {
+ while ((c = hs_circuitmap_get_intro_circ_v2_relay_side(
+ (const uint8_t *)pk_digest))) {
log_info(LD_REND, "Replacing old circuit for service %s",
safe_str(serviceid));
circuit_mark_for_close(TO_CIRCUIT(c), END_CIRC_REASON_FINISHED);
@@ -111,7 +112,7 @@ rend_mid_establish_intro_legacy(or_circuit_t *circ, const uint8_t *request,
/* Now, set up this circuit. */
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_INTRO_POINT);
- hs_circuitmap_register_intro_circ_v2(circ, (uint8_t *)pk_digest);
+ hs_circuitmap_register_intro_circ_v2_relay_side(circ, (uint8_t *)pk_digest);
log_info(LD_REND,
"Established introduction point on circuit %u for service %s",
@@ -165,7 +166,8 @@ rend_mid_introduce_legacy(or_circuit_t *circ, const uint8_t *request,
/* The first 20 bytes are all we look at: they have a hash of the service's
* PK. */
- intro_circ = hs_circuitmap_get_intro_circ_v2((const uint8_t*)request);
+ intro_circ = hs_circuitmap_get_intro_circ_v2_relay_side(
+ (const uint8_t*)request);
if (!intro_circ) {
log_info(LD_REND,
"No intro circ found for INTRODUCE1 cell (%s) from circuit %u; "
@@ -242,7 +244,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
goto err;
}
- if (hs_circuitmap_get_rend_circ(request)) {
+ if (hs_circuitmap_get_rend_circ_relay_side(request)) {
log_warn(LD_PROTOCOL,
"Duplicate rendezvous cookie in ESTABLISH_RENDEZVOUS.");
goto err;
@@ -258,7 +260,7 @@ rend_mid_establish_rendezvous(or_circuit_t *circ, const uint8_t *request,
}
circuit_change_purpose(TO_CIRCUIT(circ), CIRCUIT_PURPOSE_REND_POINT_WAITING);
- hs_circuitmap_register_rend_circ(circ, request);
+ hs_circuitmap_register_rend_circ_relay_side(circ, request);
base16_encode(hexid,9,(char*)request,4);
@@ -307,7 +309,7 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
"Got request for rendezvous from circuit %u to cookie %s.",
(unsigned)circ->p_circ_id, hexid);
- rend_circ = hs_circuitmap_get_rend_circ(request);
+ rend_circ = hs_circuitmap_get_rend_circ_relay_side(request);
if (!rend_circ) {
log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
"Rejecting RENDEZVOUS1 cell with unrecognized rendezvous cookie %s.",
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
index ed18cbf..14c65ab 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -201,59 +201,59 @@ test_rend_token_maps(void *arg)
tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.');
/* No maps; nothing there. */
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1));
- hs_circuitmap_register_rend_circ(c1, tok1);
- hs_circuitmap_register_intro_circ_v2(c2, tok2);
+ hs_circuitmap_register_rend_circ_relay_side(c1, tok1);
+ hs_circuitmap_register_intro_circ_v2_relay_side(c2, tok2);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok3));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok3));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok1));
/* Without purpose set, we don't get the circuits */
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1));
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
/* Okay, make sure they show up now. */
- tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ(tok1));
- tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
+ tt_ptr_op(c1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
+ tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
/* Two items at the same place with the same token. */
c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
- hs_circuitmap_register_rend_circ(c3, tok2);
- tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
- tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
+ hs_circuitmap_register_rend_circ_relay_side(c3, tok2);
+ tt_ptr_op(c2, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
+ tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2));
/* Marking a circuit makes it not get returned any more */
circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
circuit_free(TO_CIRCUIT(c1));
c1 = NULL;
/* Freeing a circuit makes it not get returned any more. */
circuit_free(TO_CIRCUIT(c2));
c2 = NULL;
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok2));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
/* c3 -- are you still there? */
- tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
+ tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2));
/* Change its cookie. This never happens in Tor per se, but hey. */
c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
- hs_circuitmap_register_intro_circ_v2(c3, tok3);
+ hs_circuitmap_register_intro_circ_v2_relay_side(c3, tok3);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ(tok2));
- tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2));
+ tt_ptr_op(c3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
/* Now replace c3 with c4. */
c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
- hs_circuitmap_register_intro_circ_v2(c4, tok3);
+ hs_circuitmap_register_intro_circ_v2_relay_side(c4, tok3);
- tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
+ tt_ptr_op(c4, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
tt_ptr_op(TO_CIRCUIT(c3)->hs_token, OP_EQ, NULL);
tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_NE, NULL);
@@ -262,7 +262,7 @@ test_rend_token_maps(void *arg)
/* Now clear c4's cookie. */
hs_circuitmap_remove_circuit(TO_CIRCUIT(c4));
tt_ptr_op(TO_CIRCUIT(c4)->hs_token, OP_EQ, NULL);
- tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2(tok3));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok3));
done:
if (c1)
@@ -370,10 +370,88 @@ test_pick_circid(void *arg)
UNMOCK(channel_dump_statistics);
}
+/** Test that the circuit pools of our HS circuitmap are isolated based on
+ * their token type. */
+static void
+test_hs_circuitmap_isolation(void *arg)
+{
+ or_circuit_t *circ1 = NULL;
+ origin_circuit_t *circ2 = NULL;
+ or_circuit_t *circ3 = NULL;
+ origin_circuit_t *circ4 = NULL;
+
+ (void)arg;
+
+ hs_circuitmap_init();
+
+ {
+ const uint8_t tok1[REND_TOKEN_LEN] = "bet i got some of th";
+
+ circ1 = or_circuit_new(0, NULL);
+ circ1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
+
+ /* check that circuitmap is empty right? */
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
+
+ /* Register circ1 with tok1 as relay-side rend circ */
+ hs_circuitmap_register_rend_circ_relay_side(circ1, tok1);
+
+ /* check that service-side getters don't work */
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_service_side(tok1));
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok1));
+
+ /* Check that the right getter works. */
+ tt_ptr_op(circ1, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok1));
+ }
+
+ {
+ const uint8_t tok2[REND_TOKEN_LEN] = "you dont know anythi";
+
+ circ2 = origin_circuit_new();
+ circ2->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO;
+ circ3 = or_circuit_new(0, NULL);
+ circ3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
+ circ4 = origin_circuit_new();
+ circ4->base_.purpose = CIRCUIT_PURPOSE_S_ESTABLISH_INTRO;
+
+ /* Register circ2 with tok2 as service-side intro v2 circ */
+ hs_circuitmap_register_intro_circ_v2_service_side(circ2, tok2);
+ /* Register circ3 with tok2 again but for different purpose */
+ hs_circuitmap_register_intro_circ_v2_relay_side(circ3, tok2);
+
+ /* Check that the getters work */
+ tt_ptr_op(circ2, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok2));
+ tt_ptr_op(circ3, OP_EQ, hs_circuitmap_get_intro_circ_v2_relay_side(tok2));
+
+ /* Register circ4 with tok2: it should override circ2 */
+ hs_circuitmap_register_intro_circ_v2_service_side(circ4, tok2);
+
+ /* check that relay-side getters don't work */
+ tt_ptr_op(NULL, OP_EQ, hs_circuitmap_get_rend_circ_relay_side(tok2));
+
+ /* Check that the getter returns circ4; the last circuit registered with
+ * that token. */
+ tt_ptr_op(circ4, OP_EQ, hs_circuitmap_get_intro_circ_v2_service_side(tok2));
+ }
+
+ done:
+ if (circ1)
+ circuit_free(TO_CIRCUIT(circ1));
+ if (circ2)
+ circuit_free(TO_CIRCUIT(circ2));
+ if (circ3)
+ circuit_free(TO_CIRCUIT(circ3));
+ if (circ4)
+ circuit_free(TO_CIRCUIT(circ4));
+}
+
+
struct testcase_t circuitlist_tests[] = {
{ "maps", test_clist_maps, TT_FORK, NULL, NULL },
{ "rend_token_maps", test_rend_token_maps, TT_FORK, NULL, NULL },
{ "pick_circid", test_pick_circid, TT_FORK, NULL, NULL },
+ { "hs_circuitmap_isolation", test_hs_circuitmap_isolation,
+ TT_FORK, NULL, NULL },
END_OF_TESTCASES
};
diff --git a/src/test/test_hs_intropoint.c b/src/test/test_hs_intropoint.c
index 2de2d95..40d1f25 100644
--- a/src/test/test_hs_intropoint.c
+++ b/src/test/test_hs_intropoint.c
@@ -532,7 +532,7 @@ test_intro_point_registration(void *arg)
tt_assert(the_hs_circuitmap);
tt_int_op(0, ==, HT_SIZE(the_hs_circuitmap));
/* Do a circuitmap query in any case */
- returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key);
+ returned_intro_circ =hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
tt_ptr_op(returned_intro_circ, ==, NULL);
}
@@ -548,7 +548,7 @@ test_intro_point_registration(void *arg)
tt_int_op(1, ==, HT_SIZE(the_hs_circuitmap));
get_auth_key_from_cell(&auth_key, RELAY_COMMAND_ESTABLISH_INTRO,
establish_intro_cell);
- returned_intro_circ = hs_circuitmap_get_intro_circ_v3(&auth_key);
+ returned_intro_circ = hs_circuitmap_get_intro_circ_v3_relay_side(&auth_key);
tt_ptr_op(intro_circ, ==, returned_intro_circ);
}
@@ -569,7 +569,8 @@ test_intro_point_registration(void *arg)
/* Check that the new element is our legacy intro circuit. */
retval = crypto_pk_get_digest(legacy_auth_key, key_digest);
tt_int_op(retval, ==, 0);
- returned_intro_circ= hs_circuitmap_get_intro_circ_v2((uint8_t*)key_digest);
+ returned_intro_circ =
+ hs_circuitmap_get_intro_circ_v2_relay_side((uint8_t*)key_digest);
tt_ptr_op(legacy_intro_circ, ==, returned_intro_circ);
}
@@ -790,7 +791,7 @@ test_received_introduce1_handling(void *arg)
const uint8_t *cell_auth_key =
hs_cell_introduce1_getconstarray_auth_key(cell);
memcpy(auth_key.pubkey, cell_auth_key, ED25519_PUBKEY_LEN);
- hs_circuitmap_register_intro_circ_v3(service_circ, &auth_key);
+ hs_circuitmap_register_intro_circ_v3_relay_side(service_circ, &auth_key);
ret = hs_intro_received_introduce1(circ, request, request_len);
circuit_free(TO_CIRCUIT(circ));
circuit_free(TO_CIRCUIT(service_circ));
@@ -819,7 +820,7 @@ test_received_introduce1_handling(void *arg)
/* Register the circuit in the map for the auth key of the cell. */
uint8_t token[REND_TOKEN_LEN];
memcpy(token, legacy_key_id, sizeof(token));
- hs_circuitmap_register_intro_circ_v2(service_circ, token);
+ hs_circuitmap_register_intro_circ_v2_relay_side(service_circ, token);
ret = hs_intro_received_introduce1(circ, request, request_len);
circuit_free(TO_CIRCUIT(circ));
circuit_free(TO_CIRCUIT(service_circ));
1
0