tor-commits
Threads by month
- ----- 2026 -----
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- 215937 discussions
[tor/master] Make sure the microdesc cache is loaded before setting a v3 md consensus
by nickm@torproject.org 28 Sep '11
by nickm@torproject.org 28 Sep '11
28 Sep '11
commit 6201b8b361fb56d9d488cea4ed47d5e0819d94b8
Author: Nick Mathewson <nickm(a)torproject.org>
Date: Wed Sep 28 14:14:31 2011 -0400
Make sure the microdesc cache is loaded before setting a v3 md consensus
Otherwise, we can wind up munging our reference counts if we set it in
the middle of loading the nodes. This happens because
nodelist_set_consensus() and microdesc_reload_cache() are both in the
business of adjusting microdescriptors' references.
---
src/or/nodelist.c | 3 +++
1 files changed, 3 insertions(+), 0 deletions(-)
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 39bc082..b93b919 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -177,7 +177,10 @@ nodelist_set_consensus(networkstatus_t *ns)
{
const or_options_t *options = get_options();
int authdir = authdir_mode_v2(options) || authdir_mode_v3(options);
+
init_nodelist();
+ if (ns->flavor == FLAV_MICRODESC)
+ (void) get_microdesc_cache(); /* Make sure it exists first. */
SMARTLIST_FOREACH(the_nodelist->nodes, node_t *, node,
node->rs = NULL);
1
0
28 Sep '11
commit ad8741d5f43b0ba441d094bc1dea9aa9a4354254
Author: Damian Johnson <atagar(a)torproject.org>
Date: Wed Sep 28 10:12:27 2011 -0700
fix: forcing redraw on ctrl+L reguardless of need
The ctrl+L keybinding is suppose to perform a redraw but this was only making a
'request' rather than forcing it, so unchanged portions of the interface
weren't actually redrawn. Caught by np.
https://trac.torproject.org/projects/tor/ticket/2830
---
src/cli/controller.py | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/src/cli/controller.py b/src/cli/controller.py
index 4e6dc82..762f955 100644
--- a/src/cli/controller.py
+++ b/src/cli/controller.py
@@ -778,7 +778,7 @@ def drawTorMonitor(stdscr, startTime):
cli.wizard.showWizard()
elif key == ord('l') - 96:
# force redraw when ctrl+l is pressed
- control.redraw()
+ control.redraw(True)
else:
for panelImpl in displayPanels:
isKeystrokeConsumed = panelImpl.handleKey(key)
1
0
28 Sep '11
commit 10eb958d33de920cfbedb2cb9bfebf14f0334a0e
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Wed Sep 28 10:08:24 2011 +0200
Make a few improvements to ExoneraTor.
- Include exit lists in results along with network status entries.
Implements part of #3567.
- Relax the requirement to specify an exact timestamps by also accepting
a full day to search relays for.
- Use a new database schema that allows us to remove raw descriptors
from the Metrics database in the future.
- Prepare the ExoneraTor database for IPv6 addresses (not supported by
Tor or the ExoneraTor database importer or web interface yet).
- Use a single database connection per HTTP request.
---
build.xml | 9 +
config.template | 7 +
db/exonerator.sql | 328 +++++++
etc/context.xml.template | 10 +
etc/web.xml | 11 +
src/org/torproject/ernie/cron/Configuration.java | 14 +
.../ernie/cron/ExoneraTorDatabaseImporter.java | 528 +++++++++++
.../ernie/web/ExoneraTorBetaServlet.java | 991 ++++++++++++++++++++
8 files changed, 1898 insertions(+), 0 deletions(-)
diff --git a/build.xml b/build.xml
index 4b4a7e9..9194ccd 100644
--- a/build.xml
+++ b/build.xml
@@ -51,6 +51,15 @@
</java>
</target>
+ <!-- Import descriptors into the ExoneraTor database. -->
+ <target name="exonerator" depends="compile">
+ <java fork="true"
+ maxmemory="2048m"
+ classname="org.torproject.ernie.cron.ExoneraTorDatabaseImporter">
+ <classpath refid="classpath"/>
+ </java>
+ </target>
+
<!-- Prepare data for being displayed on the website. -->
<target name="run" depends="compile">
<java fork="true"
diff --git a/config.template b/config.template
index 7936420..e0fa743 100644
--- a/config.template
+++ b/config.template
@@ -58,4 +58,11 @@
#
## Relative path to directory where to find GetTor stats
#GetTorDirectory gettor/
+#
+## JDBC string for ExoneraTor database
+#ExoneraTorDatabaseJdbc jdbc:postgresql://localhost/exonerator?user=metrics&password=password
+#
+## Relative path to directory where to find descriptors to import into the
+## ExoneraTor database
+#ExoneraTorImportDirectory exonerator-import/
diff --git a/db/exonerator.sql b/db/exonerator.sql
new file mode 100755
index 0000000..b3c7c62
--- /dev/null
+++ b/db/exonerator.sql
@@ -0,0 +1,328 @@
+-- Copyright 2011 The Tor Project
+-- See LICENSE for licensing information
+
+-- The descriptor table holds server descriptors that we use for display
+-- purposes and to parse exit policies.
+CREATE TABLE descriptor (
+
+ -- The 40-character lower-case hex string identifies a descriptor
+ -- uniquely and is used to join statusentry and this table.
+ descriptor CHARACTER(40) NOT NULL PRIMARY KEY,
+
+ -- The raw descriptor string is used for display purposes and to check
+ -- whether the relay allowed exiting to a given target or not.
+ rawdescriptor BYTEA NOT NULL
+);
+
+-- The consensus table stores network status consensuses to be looked up
+-- by valid-after time and displayed upon request. A second purpose is
+-- to learn quickly whether the database contains status entries for a
+-- given day or not.
+CREATE TABLE consensus (
+
+ -- The unique valid-after time of the consensus.
+ validafter TIMESTAMP WITHOUT TIME ZONE NOT NULL PRIMARY KEY,
+
+ -- The raw consensus string for display purposes only.
+ rawconsensus BYTEA NOT NULL
+);
+
+-- The statusentry table stores network status consensus entries listing
+-- a relay as running at a certain point in time. Only relays with the
+-- Running flag shall be inserted into this table. If a relay advertises
+-- more than one IP address, there is a distinct entry for each address in
+-- this table.
+CREATE TABLE statusentry (
+
+ -- The valid-after time of the consensus that contains this entry.
+ validafter TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+
+ -- The 40-character lower-case hex string uniquely identifying the
+ -- relay.
+ fingerprint CHARACTER(40) NOT NULL,
+
+ -- The 40-character lower-case hex string that identifies the server
+ -- descriptor published by the relay.
+ descriptor CHARACTER(40) NOT NULL,
+
+ -- The most significant 3 bytes of the relay's onion routing address in
+ -- hex notation. This column contains the /24 network of the IPv4 or
+ -- IPv6 address. The purpose is to quickly reduce query results which
+ -- works surprisingly well.
+ oraddress24 CHARACTER(6) NOT NULL,
+
+ -- The relay's onion routing address. Can be an IPv4 or an IPv6
+ -- address. If a relay advertises more than one address, there are
+ -- multiple entries in this table for the same status entry.
+ oraddress INET NOT NULL,
+
+ -- The raw status entry string as contained in the network status
+ -- consensus for display purposes only.
+ rawstatusentry BYTEA NOT NULL,
+
+ -- A status entry is uniquely identified by its valid-after time, relay
+ -- fingerprint, and onion routing address.
+ CONSTRAINT statusentry_pkey
+ PRIMARY KEY (validafter, fingerprint, oraddress)
+);
+
+-- The index on the exact onion routing address and on the valid-after
+-- date is used to speed up ExoneraTor's query for status entries.
+CREATE INDEX statusentry_oraddress_validafterdate
+ ON statusentry (oraddress, DATE(validafter));
+
+-- The index on the most significant 3 bytes of the relay's onion routing
+-- address and on the valid-after date is used to speed up queries for
+-- other relays in the same /24 network.
+CREATE INDEX statusentry_oraddress24_validafterdate
+ ON statusentry (oraddress24, DATE(validafter));
+
+-- The exitlistentry table stores the results of the active testing,
+-- DNS-based exit list for exit nodes. An entry in this table means that
+-- a relay was scanned at a given time and found to be exiting to the
+-- Internet from a given IP address. This IP address can be different
+-- from the relay's onion routing address if the relay uses more than one
+-- IP addresses.
+CREATE TABLE exitlistentry (
+
+ -- The 40-character lower-case hex string identifying the relay.
+ fingerprint CHARACTER(40) NOT NULL,
+
+ -- The most significant 3 bytes of the relay's exit address in hex
+ -- notation. This column contains the /24 network of the IPv4 or IPv6
+ -- address. The purpose is to quickly reduce query results.
+ exitaddress24 CHARACTER(6) NOT NULL,
+
+ -- The IP address that the relay uses for exiting to the Internet. If
+ -- the relay uses more than one IP address, there are multiple entries
+ -- in this table.
+ exitaddress INET NOT NULL,
+
+ -- The time when the relay was scanned to find out its exit IP
+ -- address(es).
+ scanned TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+
+ -- The raw exit list entry containing all scan results for a given relay
+ -- for display purposes.
+ rawexitlistentry BYTEA NOT NULL,
+
+ -- An exit list entry is uniquely identified by its scan time, relay
+ -- fingerprint, and exit address.
+ CONSTRAINT exitlistentry_pkey
+ PRIMARY KEY (scanned, fingerprint, exitaddress)
+);
+
+-- The index on the exact exit address and on the valid-after date is used
+-- to speed up ExoneraTor's query for status entries referencing exit list
+-- entries.
+CREATE INDEX exitlistentry_exitaddress_scanneddate
+ ON exitlistentry (exitaddress, DATE(scanned));
+
+-- The index on the most significant 3 bytes of the relay's exit address
+-- and on the valid-after date is used to speed up queries for other
+-- relays in the same /24 network.
+CREATE INDEX exitlistentry_exitaddress24_scanneddate
+ ON exitlistentry (exitaddress24, DATE(scanned));
+
+-- Create the plpgsql language, so that we can use it below.
+CREATE LANGUAGE plpgsql;
+
+-- Insert a server descriptor into the descriptor table. Before doing so,
+-- check that there is no descriptor with the same descriptor identifier
+-- in the table yet. Return 1 if the descriptor was inserted, 0
+-- otherwise.
+CREATE OR REPLACE FUNCTION insert_descriptor (
+ insert_descriptor CHARACTER(40),
+ insert_rawdescriptor BYTEA)
+ RETURNS INTEGER AS $$
+ BEGIN
+ -- Look up if the descriptor is already contained in the descriptor
+ -- table.
+ IF (SELECT COUNT(*)
+ FROM descriptor
+ WHERE descriptor = insert_descriptor) = 0 THEN
+ -- Insert the descriptor and remember the new descriptorid to update
+ -- the foreign key in statusentry.
+ INSERT INTO descriptor (descriptor, rawdescriptor)
+ VALUES (insert_descriptor, insert_rawdescriptor);
+ -- Return 1 for a successfully inserted descriptor.
+ RETURN 1;
+ ELSE
+ -- Return 0 because we didn't change anything.
+ RETURN 0;
+ END IF;
+ END;
+$$ LANGUAGE 'plpgsql';
+
+-- Insert a status entry into the statusentry table. First check that
+-- this status entry isn't contained in the table yet. It's okay to
+-- insert the same status entry multiple times for different IP addresses
+-- though. Return 1 if it was inserted, 0 otherwise.
+CREATE OR REPLACE FUNCTION insert_statusentry (
+ insert_validafter TIMESTAMP WITHOUT TIME ZONE,
+ insert_fingerprint CHARACTER(40),
+ insert_descriptor CHARACTER(40),
+ insert_oraddress24 CHARACTER(6),
+ insert_oraddress TEXT,
+ insert_rawstatusentry BYTEA)
+ RETURNS INTEGER AS $$
+ BEGIN
+ -- Look up if the status entry is already contained in the statusentry
+ -- table.
+ IF (SELECT COUNT(*)
+ FROM statusentry
+ WHERE validafter = insert_validafter
+ AND fingerprint = insert_fingerprint
+ AND oraddress = insert_oraddress::INET) = 0 THEN
+ -- Insert the status entry.
+ INSERT INTO statusentry (validafter, fingerprint, descriptor,
+ oraddress24, oraddress, rawstatusentry)
+ VALUES (insert_validafter, insert_fingerprint,
+ insert_descriptor, insert_oraddress24, insert_oraddress::INET,
+ insert_rawstatusentry);
+ -- Return 1 for a successfully inserted status entry.
+ RETURN 1;
+ ELSE
+ -- Return 0 because we already had this status entry.
+ RETURN 0;
+ END IF;
+ END;
+$$ LANGUAGE 'plpgsql';
+
+-- Insert a consensus into the consensus table. Check that the same
+-- consensus has not been imported before. Return 1 if it was inserted, 0
+-- otherwise.
+CREATE OR REPLACE FUNCTION insert_consensus (
+ insert_validafter TIMESTAMP WITHOUT TIME ZONE,
+ insert_rawconsensus BYTEA)
+ RETURNS INTEGER AS $$
+ BEGIN
+ -- Look up if the consensus is already contained in the consensus
+ -- table.
+ IF (SELECT COUNT(*)
+ FROM consensus
+ WHERE validafter = insert_validafter) = 0 THEN
+ -- Insert the consensus.
+ INSERT INTO consensus (validafter, rawconsensus)
+ VALUES (insert_validafter, insert_rawconsensus);
+ -- Return 1 for a successful insert operation.
+ RETURN 1;
+ ELSE
+ -- Return 0 for not inserting the consensus.
+ RETURN 0;
+ END IF;
+ END;
+$$ LANGUAGE 'plpgsql';
+
+-- Insert an exit list entry into the exitlistentry table. Check that
+-- this entry hasn't been inserted before. It's okay to insert the same
+-- exit list entry multiple times for different exit addresses. Return 1
+-- if the entry was inserted, 0 otherwise.
+CREATE OR REPLACE FUNCTION insert_exitlistentry (
+ insert_fingerprint CHARACTER(40),
+ insert_exitaddress24 CHARACTER(6),
+ insert_exitaddress TEXT,
+ insert_scanned TIMESTAMP WITHOUT TIME ZONE,
+ insert_rawexitlistentry BYTEA)
+ RETURNS INTEGER AS $$
+ BEGIN
+ IF (SELECT COUNT(*)
+ FROM exitlistentry
+ WHERE fingerprint = insert_fingerprint
+ AND exitaddress = insert_exitaddress::INET
+ AND scanned = insert_scanned) = 0 THEN
+ -- This exit list entry is not in the database yet. Add it.
+ INSERT INTO exitlistentry (fingerprint, exitaddress24, exitaddress,
+ scanned, rawexitlistentry)
+ VALUES (insert_fingerprint, insert_exitaddress24,
+ insert_exitaddress::INET, insert_scanned,
+ insert_rawexitlistentry);
+ -- Return 1 for a successfully inserted exit list entry.
+ RETURN 1;
+ ELSE
+ -- Return 0 to show that we didn't add anything.
+ RETURN 0;
+ END IF;
+ END;
+$$ LANGUAGE 'plpgsql';
+
+-- Search for status entries with the given IP address as onion routing
+-- address, plus status entries of relays having an exit list entry with
+-- the given IP address as exit address.
+CREATE OR REPLACE FUNCTION search_statusentries_by_address_date (
+ select_address TEXT,
+ select_date DATE)
+ RETURNS TABLE(rawstatusentry BYTEA,
+ descriptor CHARACTER(40),
+ validafter TIMESTAMP WITHOUT TIME ZONE,
+ fingerprint CHARACTER(40),
+ oraddress TEXT,
+ exitaddress TEXT,
+ scanned TIMESTAMP WITHOUT TIME ZONE) AS $$
+ -- The first select finds all status entries of relays with the given
+ -- IP address as onion routing address.
+ SELECT rawstatusentry,
+ descriptor,
+ validafter,
+ fingerprint,
+ HOST(oraddress),
+ NULL,
+ NULL
+ FROM statusentry
+ WHERE oraddress = $1::INET
+ AND DATE(validafter) >= $2 - 1
+ AND DATE(validafter) <= $2 + 1
+ UNION
+ -- The second select finds status entries of relays having an exit list
+ -- entry with the provided IP address as the exit address.
+ SELECT statusentry.rawstatusentry,
+ statusentry.descriptor,
+ statusentry.validafter,
+ statusentry.fingerprint,
+ HOST(statusentry.oraddress),
+ HOST(exitlistentry.exitaddress),
+ -- Pick only the last scan result that took place in the 24 hours
+ -- before the valid-after time.
+ MAX(exitlistentry.scanned)
+ FROM statusentry
+ JOIN exitlistentry
+ ON statusentry.fingerprint = exitlistentry.fingerprint
+ WHERE exitlistentry.exitaddress = $1::INET
+ -- Focus on a time period from 1 day before and 1 day after the
+ -- given date. Also include a second day before the given date
+ -- for exit lists, because it can take up to 24 hours to scan a
+ -- relay again. We shouldn't miss exit list entries here.
+ AND DATE(exitlistentry.scanned) >= $2 - 2
+ AND DATE(exitlistentry.scanned) <= $2 + 1
+ AND DATE(statusentry.validafter) >= $2 - 1
+ AND DATE(statusentry.validafter) <= $2 + 1
+ -- Consider only exit list scans that took place in the 24 hours
+ -- before the relay was listed in a consensus.
+ AND statusentry.validafter >= exitlistentry.scanned
+ AND statusentry.validafter - exitlistentry.scanned <=
+ '1 day'::INTERVAL
+ GROUP BY 1, 2, 3, 4, 5, 6
+ ORDER BY 3, 4, 6;
+$$ LANGUAGE SQL;
+
+-- Look up all IP adddresses in the /24 network of a given address to
+-- suggest other addresses the user may be looking for.
+-- TODO Revisit this function when enabling IPv6.
+CREATE OR REPLACE FUNCTION search_addresses_in_same_24 (
+ select_address24 CHARACTER(6),
+ select_date DATE)
+ RETURNS TABLE(address TEXT) AS $$
+ SELECT HOST(oraddress)
+ FROM statusentry
+ WHERE oraddress24 = $1
+ AND DATE(validafter) >= $2 - 1
+ AND DATE(validafter) <= $2 + 1
+ UNION
+ SELECT HOST(exitaddress)
+ FROM exitlistentry
+ WHERE exitaddress24 = $1
+ AND DATE(scanned) >= $2 - 2
+ AND DATE(scanned) <= $2 + 1
+ ORDER BY 1;
+$$ LANGUAGE SQL;
+
diff --git a/etc/context.xml.template b/etc/context.xml.template
index 00f14fe..152f1de 100644
--- a/etc/context.xml.template
+++ b/etc/context.xml.template
@@ -1,4 +1,14 @@
<Context cookies="false">
+ <Resource name="jdbc/exonerator"
+ type="javax.sql.DataSource"
+ auth="Container"
+ username="metrics"
+ password="password"
+ driverClassName="org.postgresql.Driver"
+ url="jdbc:postgresql://localhost/exonerator"
+ maxActive="8"
+ maxIdle="4"
+ maxWait="15000"/>
<Resource name="jdbc/tordir"
type="javax.sql.DataSource"
auth="Container"
diff --git a/etc/web.xml b/etc/web.xml
index 5c48bc0..2c6752b 100644
--- a/etc/web.xml
+++ b/etc/web.xml
@@ -266,6 +266,17 @@
</servlet-mapping>
<servlet>
+ <servlet-name>ExoneraTorBeta</servlet-name>
+ <servlet-class>
+ org.torproject.ernie.web.ExoneraTorBetaServlet
+ </servlet-class>
+ </servlet>
+ <servlet-mapping>
+ <servlet-name>ExoneraTorBeta</servlet-name>
+ <url-pattern>/exonerator-beta.html</url-pattern>
+ </servlet-mapping>
+
+ <servlet>
<servlet-name>ServerDescriptor</servlet-name>
<servlet-class>
org.torproject.ernie.web.ServerDescriptorServlet
diff --git a/src/org/torproject/ernie/cron/Configuration.java b/src/org/torproject/ernie/cron/Configuration.java
index 4192f55..1c57392 100644
--- a/src/org/torproject/ernie/cron/Configuration.java
+++ b/src/org/torproject/ernie/cron/Configuration.java
@@ -31,6 +31,10 @@ public class Configuration {
private String torperfDirectory = "torperf/";
private boolean processGetTorStats = false;
private String getTorDirectory = "gettor/";
+ private String exoneraTorDatabaseJdbc = "jdbc:postgresql:"
+ + "//localhost/exonerator?user=metrics&password=password";
+ private String exoneraTorImportDirectory = "exonerator-import/";
+
public Configuration() {
/* Initialize logger. */
@@ -93,6 +97,10 @@ public class Configuration {
line.split(" ")[1]) != 0;
} else if (line.startsWith("GetTorDirectory")) {
this.getTorDirectory = line.split(" ")[1];
+ } else if (line.startsWith("ExoneraTorDatabaseJdbc")) {
+ this.exoneraTorDatabaseJdbc = line.split(" ")[1];
+ } else if (line.startsWith("ExoneraTorImportDirectory")) {
+ this.exoneraTorImportDirectory = line.split(" ")[1];
} else {
logger.severe("Configuration file contains unrecognized "
+ "configuration key in line '" + line + "'! Exiting!");
@@ -169,5 +177,11 @@ public class Configuration {
public String getGetTorDirectory() {
return this.getTorDirectory;
}
+ public String getExoneraTorDatabaseJdbc() {
+ return this.exoneraTorDatabaseJdbc;
+ }
+ public String getExoneraTorImportDirectory() {
+ return this.exoneraTorImportDirectory;
+ }
}
diff --git a/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
new file mode 100755
index 0000000..95d894b
--- /dev/null
+++ b/src/org/torproject/ernie/cron/ExoneraTorDatabaseImporter.java
@@ -0,0 +1,528 @@
+/* Copyright 2011 The Tor Project
+ * See LICENSE for licensing information */
+package org.torproject.ernie.cron;
+
+import java.io.*;
+import java.sql.*;
+import java.text.*;
+import java.util.*;
+import org.apache.commons.codec.binary.*;
+import org.apache.commons.codec.digest.*;
+
+/* Import Tor descriptors into the ExoneraTor database. */
+public class ExoneraTorDatabaseImporter {
+
+ /* Main function controlling the parsing process. */
+ public static void main(String[] args) {
+ readConfiguration();
+ openDatabaseConnection();
+ prepareDatabaseStatements();
+ createLockFile();
+ readImportHistoryToMemory();
+ parseDescriptors();
+ writeImportHistoryToDisk();
+ closeDatabaseConnection();
+ deleteLockFile();
+ }
+
+ /* JDBC string of the ExoneraTor database. */
+ private static String jdbcString;
+
+ /* Directory from which to import descriptors. */
+ private static String importDirString;
+
+ /* Learn JDBC string and directory to parse descriptors from. */
+ private static void readConfiguration() {
+ Configuration config = new Configuration();
+ jdbcString = config.getExoneraTorDatabaseJdbc();
+ importDirString = config.getExoneraTorImportDirectory();
+ }
+
+ /* Database connection. */
+ private static Connection connection;
+
+ /* Open a database connection using the JDBC string in the config. */
+ private static void openDatabaseConnection() {
+ try {
+ connection = DriverManager.getConnection(jdbcString);
+ } catch (SQLException e) {
+ System.out.println("Could not connect to database. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Callable statements to import data into the database. */
+ private static CallableStatement insertDescriptorStatement;
+ private static CallableStatement insertStatusentryStatement;
+ private static CallableStatement insertConsensusStatement;
+ private static CallableStatement insertExitlistentryStatement;
+
+ /* Prepare statements for importing data into the database. */
+ private static void prepareDatabaseStatements() {
+ try {
+ insertDescriptorStatement = connection.prepareCall(
+ "{call insert_descriptor(?, ?)}");
+ insertStatusentryStatement = connection.prepareCall(
+ "{call insert_statusentry(?, ?, ?, ?, ?, ?)}");
+ insertConsensusStatement = connection.prepareCall(
+ "{call insert_consensus(?, ?)}");
+ insertExitlistentryStatement = connection.prepareCall(
+ "{call insert_exitlistentry(?, ?, ?, ?, ?)}");
+ } catch (SQLException e) {
+ System.out.println("Could not prepare callable statements to "
+ + "import data into the database. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Create a local lock file to prevent other instances of this import
+ * tool to run concurrently. */
+ private static void createLockFile() {
+ File lockFile = new File("exonerator-lock");
+ try {
+ if (lockFile.exists()) {
+ BufferedReader br = new BufferedReader(new FileReader(lockFile));
+ long runStarted = Long.parseLong(br.readLine());
+ br.close();
+ if (System.currentTimeMillis() - runStarted
+ < 6L * 60L * 60L * 1000L) {
+ System.out.println("File 'exonerator-lock' is less than 6 "
+ + "hours old. Exiting.");
+ System.exit(1);
+ } else {
+ System.out.println("File 'exonerator-lock' is at least 6 hours "
+ + "old. Overwriting and executing anyway.");
+ }
+ }
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ "exonerator-lock"));
+ bw.append(String.valueOf(System.currentTimeMillis()) + "\n");
+ bw.close();
+ } catch (IOException e) {
+ System.out.println("Could not create 'exonerator-lock' file. "
+ + "Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Last and next parse histories containing paths of parsed files and
+ * last modified times. */
+ private static Map<String, Long>
+ lastImportHistory = new HashMap<String, Long>(),
+ nextImportHistory = new HashMap<String, Long>();
+
+ /* Read stats/exonerator-import-history file from disk and remember
+ * locally when files were last parsed. */
+ private static void readImportHistoryToMemory() {
+ File parseHistoryFile = new File("stats",
+ "exonerator-import-history");
+ if (parseHistoryFile.exists()) {
+ try {
+ BufferedReader br = new BufferedReader(new FileReader(
+ parseHistoryFile));
+ String line = null;
+ int lineNumber = 0;
+ while ((line = br.readLine()) != null) {
+ lineNumber++;
+ String[] parts = line.split(",");
+ if (parts.length != 2) {
+ System.out.println("File 'stats/exonerator-import-history' "
+ + "contains a corrupt entry in line " + lineNumber
+ + ". Ignoring parse history file entirely.");
+ lastImportHistory.clear();
+ return;
+ }
+ long lastModified = Long.parseLong(parts[0]);
+ String filename = parts[1];
+ lastImportHistory.put(filename, lastModified);
+ }
+ br.close();
+ } catch (IOException e) {
+ System.out.println("Could not read import history. Ignoring.");
+ lastImportHistory.clear();
+ }
+ }
+ }
+
+ /* Parse descriptors in the import directory and its subdirectories. */
+ private static void parseDescriptors() {
+ File file = new File(importDirString);
+ if (!file.exists()) {
+ System.out.println("File or directory " + importDirString + " does "
+ + "not exist. Exiting.");
+ return;
+ }
+ Stack<File> files = new Stack<File>();
+ files.add(file);
+ while (!files.isEmpty()) {
+ file = files.pop();
+ if (file.isDirectory()) {
+ for (File f : file.listFiles()) {
+ files.add(f);
+ }
+ } else {
+ parseFile(file);
+ }
+ }
+ }
+
+ /* Import a file if it wasn't imported before, and add it to the import
+ * history for the next execution. */
+ private static void parseFile(File file) {
+ long lastModified = file.lastModified();
+ String filename = file.getName();
+ nextImportHistory.put(filename, lastModified);
+ if (!lastImportHistory.containsKey(filename) ||
+ lastImportHistory.get(filename) < lastModified) {
+ try {
+ FileInputStream fis = new FileInputStream(file);
+ BufferedInputStream bis = new BufferedInputStream(fis);
+ ByteArrayOutputStream baos = new ByteArrayOutputStream();
+ int len;
+ byte[] bytes = new byte[1024];
+ while ((len = bis.read(bytes, 0, 1024)) >= 0) {
+ baos.write(bytes, 0, len);
+ }
+ bis.close();
+ byte[] allBytes = baos.toByteArray();
+ splitFile(file, allBytes);
+ } catch (IOException e) {
+ System.out.println("Could not read '" + file + "' to memory. "
+ + "Skipping.");
+ nextImportHistory.remove(filename);
+ }
+ }
+ }
+
+ /* Detect what descriptor type is contained in a file and split it to
+ * parse the single descriptors. */
+ private static void splitFile(File file, byte[] bytes) {
+ try {
+ String asciiString = new String(bytes, "US-ASCII");
+ BufferedReader br = new BufferedReader(new StringReader(
+ asciiString));
+ String line = br.readLine();
+ while (line != null && line.startsWith("@")) {
+ line = br.readLine();
+ }
+ if (line == null) {
+ return;
+ }
+ br.close();
+ String startToken = null;
+ if (line.startsWith("router ")) {
+ startToken = "router ";
+ } else if (line.equals("network-status-version 3")) {
+ startToken = "network-status-version 3";
+ } else if (line.startsWith("ExitNode ")) {
+ startToken = "ExitNode ";
+ } else {
+ System.out.println("Unknown descriptor type in file '" + file
+ + "'. Ignoring.");
+ return;
+ }
+ String splitToken = "\n" + startToken;
+ int length = bytes.length, start = asciiString.indexOf(startToken);
+ while (start < length) {
+ int end = asciiString.indexOf(splitToken, start);
+ if (end < 0) {
+ end = length;
+ } else {
+ end += 1;
+ }
+ byte[] descBytes = new byte[end - start];
+ System.arraycopy(bytes, start, descBytes, 0, end - start);
+ if (startToken.equals("router ")) {
+ parseServerDescriptor(file, descBytes);
+ } else if (startToken.equals("network-status-version 3")) {
+ parseConsensus(file, descBytes);
+ } else if (startToken.equals("ExitNode ")) {
+ parseExitList(file, descBytes);
+ }
+ start = end;
+ }
+ } catch (IOException e) {
+ System.out.println("Could not parse descriptor '" + file + "'. "
+ + "Skipping.");
+ }
+ }
+
+ /* Date format to parse UTC timestamps. */
+ private static SimpleDateFormat parseFormat;
+ static {
+ parseFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ parseFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ }
+
+ /* Parse a single server descriptor. */
+ private static void parseServerDescriptor(File file, byte[] bytes) {
+ String ascii = "";
+ try {
+ ascii = new String(bytes, "US-ASCII");
+ } catch (UnsupportedEncodingException e) {
+ /* We know that US-ASCII is a supported encoding. */
+ }
+ String startToken = "router ";
+ String sigToken = "\nrouter-signature\n";
+ int start = ascii.indexOf(startToken);
+ int sig = ascii.indexOf(sigToken) + sigToken.length();
+ String descriptor = null;
+ if (start >= 0 || sig >= 0 || sig > start) {
+ byte[] forDigest = new byte[sig - start];
+ System.arraycopy(bytes, start, forDigest, 0, sig - start);
+ descriptor = DigestUtils.shaHex(forDigest);
+ }
+ if (descriptor == null) {
+ System.out.println("Could not calculate descriptor digest. "
+ + "Skipping.");
+ return;
+ }
+ importDescriptor(descriptor, bytes);
+ }
+
+ /* Import a single server descriptor into the database. */
+ private static void importDescriptor(String descriptor,
+ byte[] rawDescriptor) {
+ try {
+ insertDescriptorStatement.clearParameters();
+ insertDescriptorStatement.setString(1, descriptor);
+ insertDescriptorStatement.setBytes(2, rawDescriptor);
+ insertDescriptorStatement.execute();
+ } catch (SQLException e) {
+ System.out.println("Could not import descriptor into the "
+ + "database. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Parse a consensus. */
+ private static void parseConsensus(File file, byte[] bytes) {
+ try {
+ BufferedReader br = new BufferedReader(new StringReader(new String(
+ bytes, "US-ASCII")));
+ String line, fingerprint = null, descriptor = null,
+ orAddress24 = null, orAddress = null;
+ long validAfterMillis = -1L;
+ StringBuilder rawStatusentryBuilder = null;
+ boolean isRunning = false;
+ while ((line = br.readLine()) != null) {
+ if (line.startsWith("vote-status ") &&
+ !line.equals("vote-status consensus")) {
+ System.out.println("File '" + file + "' contains network status "
+ + "*votes*, not network status *consensuses*. Skipping.");
+ return;
+ } else if (line.startsWith("valid-after ")) {
+ String validAfterTime = line.substring("valid-after ".length());
+ try {
+ validAfterMillis = parseFormat.parse(validAfterTime).
+ getTime();
+ } catch (ParseException e) {
+ System.out.println("Could not parse valid-after timestamp in "
+ + "'" + file + "'. Skipping.");
+ return;
+ }
+ importConsensus(validAfterMillis, bytes);
+ } else if (line.startsWith("r ") ||
+ line.equals("directory-footer")) {
+ if (isRunning) {
+ byte[] rawStatusentry = rawStatusentryBuilder.toString().
+ getBytes();
+ importStatusentry(validAfterMillis, fingerprint, descriptor,
+ orAddress24, orAddress, rawStatusentry);
+ }
+ if (line.equals("directory-footer")) {
+ return;
+ }
+ rawStatusentryBuilder = new StringBuilder(line + "\n");
+ String[] parts = line.split(" ");
+ if (parts.length < 9) {
+ System.out.println("Could not parse r line '" + line
+ + "'. Skipping.");
+ return;
+ }
+ fingerprint = Hex.encodeHexString(Base64.decodeBase64(parts[2]
+ + "=")).toLowerCase();
+ descriptor = Hex.encodeHexString(Base64.decodeBase64(parts[3]
+ + "=")).toLowerCase();
+ orAddress = parts[6];
+ /* TODO Extend the following code for IPv6 once Tor supports
+ * it. */
+ String[] orAddressParts = orAddress.split("\\.");
+ byte[] orAddress24Bytes = new byte[3];
+ orAddress24Bytes[0] = (byte) Integer.parseInt(
+ orAddressParts[0]);
+ orAddress24Bytes[1] = (byte) Integer.parseInt(
+ orAddressParts[1]);
+ orAddress24Bytes[2] = (byte) Integer.parseInt(
+ orAddressParts[2]);
+ orAddress24 = Hex.encodeHexString(orAddress24Bytes);
+ } else if (line.startsWith("s ") || line.equals("s")) {
+ rawStatusentryBuilder.append(line + "\n");
+ isRunning = line.contains(" Running");
+ } else if (rawStatusentryBuilder != null) {
+ rawStatusentryBuilder.append(line + "\n");
+ }
+ /* TODO Extend this code to parse additional addresses once that's
+ * implemented in Tor. */
+ }
+ } catch (IOException e) {
+ System.out.println("Could not parse consensus. Skipping.");
+ return;
+ }
+ }
+
+ /* UTC calendar for importing timestamps into the database. */
+ private static Calendar calendarUTC = Calendar.getInstance(
+ TimeZone.getTimeZone("UTC"));
+
+ /* Import a single status entry into the database. */
+ private static void importStatusentry(long validAfterMillis,
+ String fingerprint, String descriptor, String orAddress24,
+ String orAddress, byte[] rawStatusentry) {
+ try {
+ insertStatusentryStatement.clearParameters();
+ insertStatusentryStatement.setTimestamp(1,
+ new Timestamp(validAfterMillis), calendarUTC);
+ insertStatusentryStatement.setString(2, fingerprint);
+ insertStatusentryStatement.setString(3, descriptor);
+ insertStatusentryStatement.setString(4, orAddress24);
+ insertStatusentryStatement.setString(5, orAddress);
+ insertStatusentryStatement.setBytes(6, rawStatusentry);
+ insertStatusentryStatement.execute();
+ } catch (SQLException e) {
+ System.out.println("Could not import status entry. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Import a consensus into the database. */
+ private static void importConsensus(long validAfterMillis,
+ byte[] rawConsensus) {
+ try {
+ insertConsensusStatement.clearParameters();
+ insertConsensusStatement.setTimestamp(1,
+ new Timestamp(validAfterMillis), calendarUTC);
+ insertConsensusStatement.setBytes(2, rawConsensus);
+ insertConsensusStatement.execute();
+ } catch (SQLException e) {
+ System.out.println("Could not import consensus. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Parse an exit list. */
+ private static void parseExitList(File file, byte[] bytes) {
+ try {
+ BufferedReader br = new BufferedReader(new StringReader(new String(
+ bytes, "US-ASCII")));
+ String fingerprint = null;
+ Set<String> exitAddressLines = new HashSet<String>();
+ StringBuilder rawExitlistentryBuilder = new StringBuilder();
+ while (true) {
+ String line = br.readLine();
+ if ((line == null || line.startsWith("ExitNode ")) &&
+ fingerprint != null) {
+ for (String exitAddressLine : exitAddressLines) {
+ String[] parts = exitAddressLine.split(" ");
+ String exitAddress = parts[1];
+ /* TODO Extend the following code for IPv6 once the exit list
+ * format supports it. */
+ String[] exitAddressParts = exitAddress.split("\\.");
+ byte[] exitAddress24Bytes = new byte[3];
+ exitAddress24Bytes[0] = (byte) Integer.parseInt(
+ exitAddressParts[0]);
+ exitAddress24Bytes[1] = (byte) Integer.parseInt(
+ exitAddressParts[1]);
+ exitAddress24Bytes[2] = (byte) Integer.parseInt(
+ exitAddressParts[2]);
+ String exitAddress24 = Hex.encodeHexString(
+ exitAddress24Bytes);
+ String scannedTime = parts[2] + " " + parts[3];
+ long scannedMillis = -1L, publishedMillis = -1L;
+ try {
+ scannedMillis = parseFormat.parse(scannedTime).getTime();
+ } catch (ParseException e) {
+ System.out.println("Could not parse timestamp in "
+ + "'" + file + "'. Skipping.");
+ return;
+ }
+ byte[] rawExitlistentry = rawExitlistentryBuilder.toString().
+ getBytes();
+ importExitlistentry(fingerprint, exitAddress24, exitAddress,
+ scannedMillis, rawExitlistentry);
+ }
+ exitAddressLines.clear();
+ rawExitlistentryBuilder = new StringBuilder();
+ }
+ if (line == null) {
+ break;
+ }
+ rawExitlistentryBuilder.append(line + "\n");
+ if (line.startsWith("ExitNode ")) {
+ fingerprint = line.substring("ExitNode ".length()).
+ toLowerCase();
+ } else if (line.startsWith("ExitAddress ")) {
+ exitAddressLines.add(line);
+ }
+ }
+ br.close();
+ } catch (IOException e) {
+ System.out.println("Could not parse exit list. Skipping.");
+ return;
+ }
+ }
+
+ /* Import an exit list entry into the database. */
+ private static void importExitlistentry(String fingerprint,
+ String exitAddress24, String exitAddress, long scannedMillis,
+ byte[] rawExitlistentry) {
+ try {
+ insertExitlistentryStatement.clearParameters();
+ insertExitlistentryStatement.setString(1, fingerprint);
+ insertExitlistentryStatement.setString(2, exitAddress24);
+ insertExitlistentryStatement.setString(3, exitAddress);
+ insertExitlistentryStatement.setTimestamp(4,
+ new Timestamp(scannedMillis), calendarUTC);
+ insertExitlistentryStatement.setBytes(5, rawExitlistentry);
+ insertExitlistentryStatement.execute();
+ } catch (SQLException e) {
+ System.out.println("Could not import exit list entry. Exiting.");
+ System.exit(1);
+ }
+ }
+
+ /* Write parse history from memory to disk for the next execution. */
+ private static void writeImportHistoryToDisk() {
+ File parseHistoryFile = new File("stats/exonerator-import-history");
+ try {
+ BufferedWriter bw = new BufferedWriter(new FileWriter(
+ parseHistoryFile));
+ for (Map.Entry<String, Long> historyEntry :
+ nextImportHistory.entrySet()) {
+ bw.write(String.valueOf(historyEntry.getValue()) + ","
+ + historyEntry.getKey() + "\n");
+ }
+ bw.close();
+ } catch (IOException e) {
+ System.out.println("File 'stats/exonerator-import-history' could "
+ + "not be written. Ignoring.");
+ }
+ }
+
+ /* Close the database connection. */
+ private static void closeDatabaseConnection() {
+ try {
+ connection.close();
+ } catch (SQLException e) {
+ System.out.println("Could not close database connection. "
+ + "Ignoring.");
+ }
+ }
+
+ /* Delete the exonerator-lock file to allow the next executing of this
+ * tool. */
+ private static void deleteLockFile() {
+ new File("exonerator-lock").delete();
+ }
+}
+
diff --git a/src/org/torproject/ernie/web/ExoneraTorBetaServlet.java b/src/org/torproject/ernie/web/ExoneraTorBetaServlet.java
new file mode 100644
index 0000000..c2e7b96
--- /dev/null
+++ b/src/org/torproject/ernie/web/ExoneraTorBetaServlet.java
@@ -0,0 +1,991 @@
+package org.torproject.ernie.web;
+
+import java.io.*;
+import java.math.*;
+import java.sql.*;
+import java.text.*;
+import java.util.*;
+import java.util.logging.*;
+import java.util.regex.*;
+
+import javax.naming.*;
+import javax.servlet.*;
+import javax.servlet.http.*;
+import javax.sql.*;
+
+import org.apache.commons.codec.binary.*;
+import org.apache.commons.lang.*;
+
+public class ExoneraTorBetaServlet extends HttpServlet {
+
+ private DataSource ds;
+
+ private Logger logger;
+
+ public void init() {
+
+ /* Initialize logger. */
+ this.logger = Logger.getLogger(
+ ExoneraTorBetaServlet.class.toString());
+
+ /* Look up data source. */
+ try {
+ Context cxt = new InitialContext();
+ this.ds = (DataSource) cxt.lookup("java:comp/env/jdbc/exonerator");
+ this.logger.info("Successfully looked up data source.");
+ } catch (NamingException e) {
+ this.logger.log(Level.WARNING, "Could not look up data source", e);
+ }
+ }
+
+ private void writeHeader(PrintWriter out) throws IOException {
+ out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 "
+ + "Transitional//EN\">\n"
+ + "<html>\n"
+ + " <head>\n"
+ + " <title>Tor Metrics Portal: ExoneraTor</title>\n"
+ + " <meta http-equiv=\"content-type\" content=\"text/html; "
+ + "charset=ISO-8859-1\">\n"
+ + " <link href=\"/css/stylesheet-ltr.css\" type=\"text/css\" "
+ + "rel=\"stylesheet\">\n"
+ + " <link href=\"/images/favicon.ico\" "
+ + "type=\"image/x-icon\" rel=\"shortcut icon\">\n"
+ + " </head>\n"
+ + " <body>\n"
+ + " <div class=\"center\">\n"
+ + " <table class=\"banner\" border=\"0\" cellpadding=\"0\" "
+ + "cellspacing=\"0\" summary=\"\">\n"
+ + " <tr>\n"
+ + " <td class=\"banner-left\"><a "
+ + "href=\"/index.html\"><img src=\"/images/top-left.png\" "
+ + "alt=\"Click to go to home page\" width=\"193\" "
+ + "height=\"79\"></a></td>\n"
+ + " <td class=\"banner-middle\">\n"
+ + " <a href=\"/\">Home</a>\n"
+ + " <a href=\"graphs.html\">Graphs</a>\n"
+ + " <a href=\"research.html\">Research</a>\n"
+ + " <a href=\"status.html\">Status</a>\n"
+ + " <br>\n"
+ + " <font size=\"2\">\n"
+ + " <a href=\"networkstatus.html\">Network Status</a>\n"
+ + " <a class=\"current\">ExoneraTor</a>\n"
+ + " <a href=\"relay-search.html\">Relay Search</a>\n"
+ + " <a href=\"consensus-health.html\">Consensus "
+ + "Health</a>\n"
+ + " </font>\n"
+ + " </td>\n"
+ + " <td class=\"banner-right\"></td>\n"
+ + " </tr>\n"
+ + " </table>\n"
+ + " <div class=\"main-column\" style=\"margin:5; "
+ + "Padding:0;\">\n"
+ + " <h2>ExoneraTor</h2>\n"
+ + " <h3>or: a website that tells you whether some IP "
+ + "address was a Tor relay</h3>\n"
+ + " <p>ExoneraTor tells you whether there was a Tor relay "
+ + "running on a given IP address at a given time. ExoneraTor "
+ + "can further find out whether this relay permitted exiting "
+ + "to a given server and/or TCP port. ExoneraTor learns about "
+ + "these facts from parsing the public relay lists and relay "
+ + "descriptors that are collected from the Tor directory "
+ + "authorities and the exit lists collected by TorDNSEL.</p>\n"
+ + " <br>\n"
+ + " <p>This is a <b>BETA</b> version of ExoneraTor. "
+ + "Beware of bugs. The stable version of ExoneraTor is still "
+ + "available <a href=\"exonerator.html\">here</a>. The "
+ + "visible changes in this BETA version are:</p>\n"
+ + " <ul>\n"
+ + " <li>Results now include IP addresses from exit "
+ + "lists, too.</li>\n"
+ + " <li>It's not required anymore to specify an exact "
+ + "timestamp, but now a date is enough.</li>\n"
+ + " </ul><br>\n"
+ + " <p><font color=\"red\"><b>Notice:</b> Note that the "
+ + "information you are providing below may be leaked to anyone "
+ + "who can read the network traffic between you and this web "
+ + "server or who has access to this web server. If you need to "
+ + "keep the IP addresses and incident times confidential, you "
+ + "should download the <a href=\"tools.html#exonerator\">Java "
+ + "or Python version of ExoneraTor</a> and run it on your "
+ + "local machine.</font></p>\n"
+ + " <br>\n");
+ }
+
+ private void writeFooter(PrintWriter out) throws IOException {
+ out.println(" <br>\n"
+ + " </div>\n"
+ + " </div>\n"
+ + " <div class=\"bottom\" id=\"bottom\">\n"
+ + " <p>This material is supported in part by the National "
+ + "Science Foundation under Grant No. CNS-0959138. Any "
+ + "opinions, finding, and conclusions or recommendations "
+ + "expressed in this material are those of the author(s) and "
+ + "do not necessarily reflect the views of the National "
+ + "Science Foundation.</p>\n"
+ + " <p>\"Tor\" and the \"Onion Logo\" are <a "
+ + "href=\"https://www.torproject.org/docs/trademark-faq.html.en"
+ + "\">registered trademarks</a> of The Tor Project, Inc.</p>\n"
+ + " <p>Data on this site is freely available under a <a "
+ + "href=\"http://creativecommons.org/publicdomain/zero/1.0/\">"
+ + "CC0 no copyright declaration</a>: To the extent possible "
+ + "under law, the Tor Project has waived all copyright and "
+ + "related or neighboring rights in the data. Graphs are "
+ + "licensed under a <a "
+ + "href=\"http://creativecommons.org/licenses/by/3.0/us/\">"
+ + "Creative Commons Attribution 3.0 United States "
+ + "License</a>.</p>\n"
+ + " </div>\n"
+ + " </body>\n"
+ + "</html>");
+ out.close();
+ }
+
+ public void doGet(HttpServletRequest request,
+ HttpServletResponse response) throws IOException,
+ ServletException {
+
+ /* Start writing response. */
+ PrintWriter out = response.getWriter();
+ writeHeader(out);
+
+ /* Open a database connection that we'll use to handle the whole
+ * request. */
+ Connection conn = null;
+ try {
+ conn = this.ds.getConnection();
+ } catch (SQLException e) {
+ out.println("<p><font color=\"red\"><b>Warning: </b></font>Unable "
+ + "to connect to the database. If this problem persists, "
+ + "please <a href=\"mailto:tor-assistants@torproject.org\">let "
+ + "us know</a>!</p>\n");
+ writeFooter(out);
+ return;
+ }
+
+ /* Look up first and last consensus in the database. */
+ long firstValidAfter = -1L, lastValidAfter = -1L;
+ try {
+ Statement statement = conn.createStatement();
+ String query = "SELECT MIN(validafter) AS first, "
+ + "MAX(validafter) AS last FROM consensus";
+ ResultSet rs = statement.executeQuery(query);
+ if (rs.next()) {
+ firstValidAfter = rs.getTimestamp(1).getTime();
+ lastValidAfter = rs.getTimestamp(2).getTime();
+ }
+ rs.close();
+ statement.close();
+ } catch (SQLException e) {
+ /* Looks like we don't have any consensuses. */
+ }
+ if (firstValidAfter < 0L || lastValidAfter < 0L) {
+ out.println("<p><font color=\"red\"><b>Warning: </b></font>This "
+ + "server doesn't have any relay lists available. If this "
+ + "problem persists, please "
+ + "<a href=\"mailto:tor-assistants@torproject.org\">let us "
+ + "know</a>!</p>\n");
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+
+ out.println("<a name=\"relay\"></a><h3>Was there a Tor relay running "
+ + "on this IP address?</h3>");
+
+ /* Parse IP parameter. */
+ /* TODO Extend the parsing code to accept IPv6 addresses, too. */
+ Pattern ipAddressPattern = Pattern.compile(
+ "^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\." +
+ "([01]?\\d\\d?|2[0-4]\\d|25[0-5])$");
+ String ipParameter = request.getParameter("ip");
+ String relayIP = "", ipWarning = "";
+ if (ipParameter != null && ipParameter.length() > 0) {
+ Matcher ipParameterMatcher = ipAddressPattern.matcher(ipParameter);
+ if (ipParameterMatcher.matches()) {
+ String[] ipParts = ipParameter.split("\\.");
+ relayIP = Integer.parseInt(ipParts[0]) + "."
+ + Integer.parseInt(ipParts[1]) + "."
+ + Integer.parseInt(ipParts[2]) + "."
+ + Integer.parseInt(ipParts[3]);
+ } else {
+ ipWarning = "\"" + (ipParameter.length() > 20 ?
+ StringEscapeUtils.escapeHtml(ipParameter.substring(0, 20))
+ + "[...]" : StringEscapeUtils.escapeHtml(ipParameter))
+ + "\" is not a valid IP address.";
+ }
+ }
+
+ /* Parse timestamp parameter. */
+ String timestampParameter = request.getParameter("timestamp");
+ long timestamp = 0L;
+ boolean timestampIsDate = false;
+ String timestampStr = "", timestampWarning = "";
+ SimpleDateFormat shortDateTimeFormat = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm");
+ shortDateTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ dateFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ if (timestampParameter != null && timestampParameter.length() > 0) {
+ try {
+ if (timestampParameter.split(" ").length == 1) {
+ timestamp = dateFormat.parse(timestampParameter).getTime();
+ timestampStr = dateFormat.format(timestamp);
+ timestampIsDate = true;
+ } else {
+ timestamp = shortDateTimeFormat.parse(timestampParameter).
+ getTime();
+ timestampStr = shortDateTimeFormat.format(timestamp);
+ }
+ if (timestamp < firstValidAfter || timestamp > lastValidAfter) {
+ timestampWarning = "Please pick a date or timestamp between \""
+ + shortDateTimeFormat.format(firstValidAfter) + "\" and \""
+ + shortDateTimeFormat.format(lastValidAfter) + "\".";
+ timestamp = 0L;
+ }
+ } catch (ParseException e) {
+ /* We have no way to handle this exception, other than leaving
+ timestampStr at "". */
+ timestampWarning = "\"" + (timestampParameter.length() > 20 ?
+ StringEscapeUtils.escapeHtml(timestampParameter.
+ substring(0, 20)) + "[...]" :
+ StringEscapeUtils.escapeHtml(timestampParameter))
+ + "\" is not a valid date or timestamp.";
+ }
+ }
+
+ /* If either IP address or timestamp is provided, the other one must
+ * be provided, too. */
+ if (relayIP.length() < 1 && timestampStr.length() > 0 &&
+ ipWarning.length() < 1) {
+ ipWarning = "Please provide an IP address.";
+ }
+ if (relayIP.length() > 0 && timestamp < 1 &&
+ timestampWarning.length() < 1) {
+ timestampWarning = "Please provide a date or timestamp.";
+ }
+
+ /* Parse target IP parameter. */
+ String targetIP = "", targetPort = "", target = "";
+ String[] targetIPParts = null;
+ String targetAddrParameter = request.getParameter("targetaddr");
+ String targetAddrWarning = "";
+ if (targetAddrParameter != null && targetAddrParameter.length() > 0) {
+ Matcher targetAddrParameterMatcher =
+ ipAddressPattern.matcher(targetAddrParameter);
+ if (targetAddrParameterMatcher.matches()) {
+ String[] targetAddrParts = targetAddrParameter.split("\\.");
+ targetIP = Integer.parseInt(targetAddrParts[0]) + "."
+ + Integer.parseInt(targetAddrParts[1]) + "."
+ + Integer.parseInt(targetAddrParts[2]) + "."
+ + Integer.parseInt(targetAddrParts[3]);
+ target = targetIP;
+ targetIPParts = targetIP.split("\\.");
+ } else {
+ targetAddrWarning = "\"" + (targetAddrParameter.length() > 20 ?
+ StringEscapeUtils.escapeHtml(targetAddrParameter.substring(
+ 0, 20)) + "[...]" : StringEscapeUtils.escapeHtml(
+ targetAddrParameter)) + "\" is not a valid IP address.";
+ }
+ }
+
+ /* Parse target port parameter. */
+ String targetPortParameter = request.getParameter("targetport");
+ String targetPortWarning = "";
+ if (targetPortParameter != null && targetPortParameter.length() > 0) {
+ Pattern targetPortPattern = Pattern.compile("\\d+");
+ if (targetPortParameter.length() < 5 &&
+ targetPortPattern.matcher(targetPortParameter).matches() &&
+ !targetPortParameter.equals("0") &&
+ Integer.parseInt(targetPortParameter) < 65536) {
+ targetPort = targetPortParameter;
+ if (target != null) {
+ target += ":" + targetPort;
+ } else {
+ target = targetPort;
+ }
+ } else {
+ targetPortWarning = "\"" + (targetPortParameter.length() > 8 ?
+ StringEscapeUtils.escapeHtml(targetPortParameter.
+ substring(0, 8)) + "[...]" :
+ StringEscapeUtils.escapeHtml(targetPortParameter))
+ + "\" is not a valid TCP port.";
+ }
+ }
+
+ /* If target port is provided, a target address must be provided,
+ * too. */
+ /* TODO Relax this requirement. */
+ if (targetPort.length() > 0 && targetIP.length() < 1 &&
+ targetAddrWarning.length() < 1) {
+ targetAddrWarning = "Please provide an IP address.";
+ }
+
+ /* Write form with IP address and timestamp. */
+ out.println(" <form action=\"#relay\">\n"
+ + " <input type=\"hidden\" name=\"targetaddr\" "
+ + (targetIP.length() > 0 ? " value=\"" + targetIP + "\"" : "")
+ + ">\n"
+ + " <input type=\"hidden\" name=\"targetPort\""
+ + (targetPort.length() > 0 ? " value=\"" + targetPort + "\"" : "")
+ + ">\n"
+ + " <table>\n"
+ + " <tr>\n"
+ + " <td align=\"right\">IP address in question:"
+ + "</td>\n"
+ + " <td><input type=\"text\" name=\"ip\""
+ + (relayIP.length() > 0 ? " value=\"" + relayIP + "\""
+ : "")
+ + ">"
+ + (ipWarning.length() > 0 ? "<br><font color=\"red\">"
+ + ipWarning + "</font>" : "")
+ + "</td>\n"
+ + " <td><i>(Ex.: 1.2.3.4)</i></td>\n"
+ + " </tr>\n"
+ + " <tr>\n"
+ + " <td align=\"right\">Date or timestamp, in "
+ + "UTC:</td>\n"
+ + " <td><input type=\"text\" name=\"timestamp\""
+ + (timestampStr.length() > 0 ? " value=\"" + timestampStr + "\""
+ : "")
+ + ">"
+ + (timestampWarning.length() > 0 ? "<br><font color=\"red\">"
+ + timestampWarning + "</font>" : "")
+ + "</td>\n"
+ + " <td><i>(Ex.: 2010-01-01 or 2010-01-01 12:00)"
+ + "</i></td>\n"
+ + " </tr>\n"
+ + " <tr>\n"
+ + " <td></td>\n"
+ + " <td>\n"
+ + " <input type=\"submit\">\n"
+ + " <input type=\"reset\">\n"
+ + " </td>\n"
+ + " <td></td>\n"
+ + " </tr>\n"
+ + " </table>\n"
+ + " </form>\n");
+
+ if (relayIP.length() < 1 || timestamp < 1) {
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+
+ out.printf("<p>Looking up IP address %s in the relay lists "
+ + "published ", relayIP);
+ long timestampFrom, timestampTo;
+ if (timestampIsDate) {
+ /* If we only have a date, consider all consensuses published on the
+ * given date, plus the ones published 3 hours before the given date
+ * and until 23:59:59. */
+ timestampFrom = timestamp - 3L * 60L * 60L * 1000L;
+ timestampTo = timestamp + (24L * 60L * 60L - 1L) * 1000L;
+ out.printf("on %s", timestampStr);
+ } else {
+ /* If we have an exact timestamp, consider the consensuses published
+ * in the 3 hours preceding the UTC timestamp. */
+ timestampFrom = timestamp - 3L * 60L * 60L * 1000L;
+ timestampTo = timestamp;
+ out.printf("between %s and %s UTC",
+ shortDateTimeFormat.format(timestampFrom),
+ shortDateTimeFormat.format(timestampTo));
+ }
+ /* If we don't find any relays in the given time interval, also look
+ * at consensuses published 12 hours before and 12 hours after the
+ * interval, in case the user got the "UTC" bit wrong. */
+ long timestampTooOld = timestampFrom - 12L * 60L * 60L * 1000L;
+ long timestampTooNew = timestampTo + 12L * 60L * 60L * 1000L;
+ out.print(" as well as in the relevant exit lists. Clients could "
+ + "have selected any of these relays to build circuits. "
+ + "You may follow the links to relay lists and relay descriptors "
+ + "to grep for the lines printed below and confirm that results "
+ + "are correct.<br>");
+ SimpleDateFormat validAfterTimeFormat = new SimpleDateFormat(
+ "yyyy-MM-dd HH:mm:ss");
+ validAfterTimeFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ String fromValidAfter = validAfterTimeFormat.format(timestampTooOld);
+ String toValidAfter = validAfterTimeFormat.format(timestampTooNew);
+ SortedSet<Long> tooOldConsensuses = new TreeSet<Long>();
+ SortedSet<Long> relevantConsensuses = new TreeSet<Long>();
+ SortedSet<Long> tooNewConsensuses = new TreeSet<Long>();
+ try {
+ Statement statement = conn.createStatement();
+ String query = "SELECT validafter FROM consensus "
+ + "WHERE validafter >= '" + fromValidAfter
+ + "' AND validafter <= '" + toValidAfter + "'";
+ ResultSet rs = statement.executeQuery(query);
+ while (rs.next()) {
+ long consensusTime = rs.getTimestamp(1).getTime();
+ if (consensusTime < timestampFrom) {
+ tooOldConsensuses.add(consensusTime);
+ } else if (consensusTime > timestampTo) {
+ tooNewConsensuses.add(consensusTime);
+ } else {
+ relevantConsensuses.add(consensusTime);
+ }
+ }
+ rs.close();
+ statement.close();
+ } catch (SQLException e) {
+ /* Looks like we don't have any consensuses in the requested
+ * interval. */
+ }
+ SortedSet<Long> allConsensuses = new TreeSet<Long>();
+ allConsensuses.addAll(tooOldConsensuses);
+ allConsensuses.addAll(relevantConsensuses);
+ allConsensuses.addAll(tooNewConsensuses);
+ if (allConsensuses.isEmpty()) {
+ out.println(" <p>No relay lists found!</p>\n"
+ + " <p>Result is INDECISIVE!</p>\n"
+ + " <p>We cannot make any statement whether there was "
+ + "a Tor relay running on IP address " + relayIP
+ + (timestampIsDate ? " on " : " at ") + timestampStr + "! We "
+ + "did not find any relevant relay lists at the given time. If "
+ + "you think this is an error on our side, please "
+ + "<a href=\"mailto:tor-assistants@torproject.org\">contact "
+ + "us</a>!</p>\n");
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+
+ /* Search for status entries with the given IP address as onion
+ * routing address, plus status entries of relays having an exit list
+ * entry with the given IP address as exit address. */
+ SortedMap<Long, SortedMap<String, String>> statusEntries =
+ new TreeMap<Long, SortedMap<String, String>>();
+ SortedSet<Long> positiveConsensusesNoTarget = new TreeSet<Long>();
+ SortedMap<String, Set<Long>> relevantDescriptors =
+ new TreeMap<String, Set<Long>>();
+ try {
+ CallableStatement cs = conn.prepareCall(
+ "{call search_statusentries_by_address_date(?, ?)}");
+ cs.setString(1, relayIP);
+ cs.setDate(2, new java.sql.Date(timestamp));
+ ResultSet rs = cs.executeQuery();
+ while (rs.next()) {
+ byte[] rawstatusentry = rs.getBytes(1);
+ String descriptor = rs.getString(2);
+ long validafter = rs.getTimestamp(3).getTime();
+ positiveConsensusesNoTarget.add(validafter);
+ if (!relevantDescriptors.containsKey(descriptor)) {
+ relevantDescriptors.put(descriptor, new HashSet<Long>());
+ }
+ relevantDescriptors.get(descriptor).add(validafter);
+ String fingerprint = rs.getString(4);
+ boolean orAddressMatches = rs.getString(5).equals(relayIP);
+ String exitaddress = rs.getString(6);
+ String rLine = new String(rawstatusentry);
+ rLine = rLine.substring(0, rLine.indexOf("\n"));
+ String[] parts = rLine.split(" ");
+ String htmlString = "r " + parts[1] + " " + parts[2] + " "
+ + "<a href=\"serverdesc?desc-id=" + descriptor + "\" "
+ + "target=\"_blank\">" + parts[3] + "</a> " + parts[4]
+ + " " + parts[5] + " " + (orAddressMatches ? "<b>" : "")
+ + parts[6] + (orAddressMatches ? "</b>" : "") + " " + parts[7]
+ + " " + parts[8] + "\n";
+ if (exitaddress != null && exitaddress.length() > 0) {
+ long scanned = rs.getTimestamp(7).getTime();
+ htmlString += " [ExitAddress <b>" + exitaddress
+ + "</b> " + validAfterTimeFormat.format(scanned)
+ + "]\n";
+ }
+ if (!statusEntries.containsKey(validafter)) {
+ statusEntries.put(validafter, new TreeMap<String, String>());
+ }
+ statusEntries.get(validafter).put(fingerprint, htmlString);
+ }
+ rs.close();
+ cs.close();
+ } catch (SQLException e) {
+ /* Nothing found. */
+ }
+
+ /* Print out what we found. */
+ SimpleDateFormat validAfterUrlFormat = new SimpleDateFormat(
+ "yyyy-MM-dd-HH-mm-ss");
+ validAfterUrlFormat.setTimeZone(TimeZone.getTimeZone("UTC"));
+ out.print("<pre><code>");
+ for (long consensus : allConsensuses) {
+ if (relevantConsensuses.contains(consensus)) {
+ String validAfterDatetime = validAfterTimeFormat.format(
+ consensus);
+ String validAfterString = validAfterUrlFormat.format(consensus);
+ out.print("valid-after <b>"
+ + "<a href=\"consensus?valid-after="
+ + validAfterString + "\" target=\"_blank\">"
+ + validAfterDatetime + "</b></a>\n");
+ if (statusEntries.containsKey(consensus)) {
+ for (String htmlString :
+ statusEntries.get(consensus).values()) {
+ out.print(htmlString);
+ }
+ }
+ out.print("\n");
+ }
+ }
+ out.print("</code></pre>");
+ if (relevantDescriptors.isEmpty()) {
+ out.printf(" <p>None found!</p>\n"
+ + " <p>Result is NEGATIVE with high certainty!</p>\n"
+ + " <p>We did not find IP "
+ + "address " + relayIP + " in any of the relay or exit lists "
+ + "that were published between %s and %s.</p>\n",
+ dateFormat.format(timestampTooOld),
+ dateFormat.format(timestampTooNew));
+ /* Run another query to find out if there are relays running on
+ * other IP addresses in the same /24 network and tell the user
+ * about it. */
+ SortedSet<String> addressesInSameNetwork = new TreeSet<String>();
+ String[] relayIPParts = relayIP.split("\\.");
+ byte[] address24Bytes = new byte[3];
+ address24Bytes[0] = (byte) Integer.parseInt(relayIPParts[0]);
+ address24Bytes[1] = (byte) Integer.parseInt(relayIPParts[1]);
+ address24Bytes[2] = (byte) Integer.parseInt(relayIPParts[2]);
+ String address24 = Hex.encodeHexString(address24Bytes);
+ try {
+ CallableStatement cs = conn.prepareCall(
+ "{call search_addresses_in_same_24 (?, ?)}");
+ cs.setString(1, address24);
+ cs.setDate(2, new java.sql.Date(timestamp));
+ ResultSet rs = cs.executeQuery();
+ while (rs.next()) {
+ Map<String, String> resultEntry = new HashMap<String, String>();
+ String address = rs.getString(1);
+ addressesInSameNetwork.add(address);
+ }
+ rs.close();
+ cs.close();
+ } catch (SQLException e) {
+ /* No other addresses in the same /24 found. */
+ }
+ if (!addressesInSameNetwork.isEmpty()) {
+ out.print(" <p>The following other IP addresses of Tor "
+ + "relays in the same /24 network were found in relay and/or "
+ + "exit lists around the time that could be related to IP "
+ + "address " + relayIP + ":</p>\n");
+ out.print(" <ul>\n");
+ for (String s : addressesInSameNetwork) {
+ out.print(" <li>" + s + "</li>\n");
+ }
+ out.print(" </ul>\n");
+ }
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+
+ /* Print out result. */
+ boolean inMostRelevantConsensuses = false,
+ inOtherRelevantConsensus = false,
+ inTooOldConsensuses = false,
+ inTooNewConsensuses = false;
+ for (long match : positiveConsensusesNoTarget) {
+ if (timestampIsDate &&
+ dateFormat.format(match).equals(timestampStr)) {
+ inMostRelevantConsensuses = true;
+ } else if (!timestampIsDate &&
+ match == relevantConsensuses.last()) {
+ inMostRelevantConsensuses = true;
+ } else if (relevantConsensuses.contains(match)) {
+ inOtherRelevantConsensus = true;
+ } else if (tooOldConsensuses.contains(match)) {
+ inTooOldConsensuses = true;
+ } else if (tooNewConsensuses.contains(match)) {
+ inTooNewConsensuses = true;
+ }
+ }
+ if (inMostRelevantConsensuses) {
+ out.print(" <p>Result is POSITIVE with high certainty!"
+ + "</p>\n"
+ + " <p>We found one or more relays on IP address "
+ + relayIP + " in ");
+ if (timestampIsDate) {
+ out.print("relay list published on " + timestampStr);
+ } else {
+ out.print("the most recent relay list preceding " + timestampStr);
+ }
+ out.print(" that clients were likely to know.</p>\n");
+ } else {
+ if (inOtherRelevantConsensus) {
+ out.println(" <p>Result is POSITIVE "
+ + "with moderate certainty!</p>\n");
+ out.println("<p>We found one or more relays on IP address "
+ + relayIP + ", but not in ");
+ if (timestampIsDate) {
+ out.print("a relay list published on " + timestampStr);
+ } else {
+ out.print("the most recent relay list preceding " + timestampStr);
+ }
+ out.print(". A possible reason for the relay being missing in a "
+ + "relay list might be that some of the directory "
+ + "authorities had difficulties connecting to the relay. "
+ + "However, clients might still have used the relay.</p>\n");
+ } else {
+ out.println(" <p>Result is NEGATIVE "
+ + "with high certainty!</p>\n");
+ out.println(" <p>We did not find any relay on IP address "
+ + relayIP
+ + " in the relay lists 3 hours preceding " + timestampStr
+ + ".</p>\n");
+ if (inTooOldConsensuses || inTooNewConsensuses) {
+ if (inTooOldConsensuses && !inTooNewConsensuses) {
+ out.println(" <p>Note that we found a matching relay "
+ + "in relay lists that were published between 15 and 3 "
+ + "hours before " + timestampStr + ".</p>\n");
+ } else if (!inTooOldConsensuses && inTooNewConsensuses) {
+ out.println(" <p>Note that we found a matching relay "
+ + "in relay lists that were published up to 12 hours "
+ + "after " + timestampStr + ".</p>\n");
+ } else {
+ out.println(" <p>Note that we found a matching relay "
+ + "in relay lists that were published between 15 and 3 "
+ + "hours before and in relay lists that were published "
+ + "up to 12 hours after " + timestampStr + ".</p>\n");
+ }
+ if (timestampIsDate) {
+ out.println("<p>Be sure to try out the previous/next day or "
+ + "provide an exact timestamp in UTC.</p>");
+ } else {
+ out.println("<p>Make sure that the timestamp you "
+ + "provided is correctly converted to the UTC "
+ + "timezone.</p>");
+ }
+ }
+ /* We didn't find any descriptor. No need to look up targets. */
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+ }
+
+ /* Second part: target */
+ out.println("<br><a name=\"exit\"></a><h3>Was this relay configured "
+ + "to permit exiting to a given target?</h3>");
+
+ out.println(" <form action=\"#exit\">\n"
+ + " <input type=\"hidden\" name=\"timestamp\"\n"
+ + " value=\"" + timestampStr + "\">\n"
+ + " <input type=\"hidden\" name=\"ip\" "
+ + "value=\"" + relayIP + "\">\n"
+ + " <table>\n"
+ + " <tr>\n"
+ + " <td align=\"right\">Target address:</td>\n"
+ + " <td><input type=\"text\" name=\"targetaddr\""
+ + (targetIP.length() > 0 ? " value=\"" + targetIP + "\"" : "")
+ + "\">"
+ + (targetAddrWarning.length() > 0 ? "<br><font color=\"red\">"
+ + targetAddrWarning + "</font>" : "")
+ + "</td>\n"
+ + " <td><i>(Ex.: 4.3.2.1)</i></td>\n"
+ + " </tr>\n"
+ + " <tr>\n"
+ + " <td align=\"right\">Target port:</td>\n"
+ + " <td><input type=\"text\" name=\"targetport\""
+ + (targetPort.length() > 0 ? " value=\"" + targetPort + "\""
+ : "")
+ + ">"
+ + (targetPortWarning.length() > 0 ? "<br><font color=\"red\">"
+ + targetPortWarning + "</font>" : "")
+ + "</td>\n"
+ + " <td><i>(Ex.: 80)</i></td>\n"
+ + " </tr>\n"
+ + " <tr>\n"
+ + " <td></td>\n"
+ + " <td>\n"
+ + " <input type=\"submit\">\n"
+ + " <input type=\"reset\">\n"
+ + " </td>\n"
+ + " <td></td>\n"
+ + " </tr>\n"
+ + " </table>\n"
+ + " </form>\n");
+
+ if (targetIP.length() < 1) {
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+
+ /* Parse router descriptors to check exit policies. */
+ out.println("<p>Searching the relay descriptors published by the "
+ + "relay on IP address " + relayIP + " to find out whether this "
+ + "relay permitted exiting to " + target + ". You may follow the "
+ + "links above to the relay descriptors and grep them for the "
+ + "lines printed below to confirm that results are correct.</p>");
+ SortedSet<Long> positiveConsensuses = new TreeSet<Long>();
+ Set<String> missingDescriptors = new HashSet<String>();
+ Set<String> descriptors = relevantDescriptors.keySet();
+ for (String descriptor : descriptors) {
+ byte[] rawDescriptor = null;
+ try {
+ String query = "SELECT rawdescriptor FROM descriptor "
+ + "WHERE descriptor = '" + descriptor + "'";
+ Statement statement = conn.createStatement();
+ ResultSet rs = statement.executeQuery(query);
+ if (rs.next()) {
+ rawDescriptor = rs.getBytes(1);
+ }
+ rs.close();
+ statement.close();
+ } catch (SQLException e) {
+ /* Consider this descriptors as 'missing'. */
+ continue;
+ }
+ if (rawDescriptor != null && rawDescriptor.length > 0) {
+ missingDescriptors.remove(descriptor);
+ String rawDescriptorString = new String(rawDescriptor,
+ "US-ASCII");
+ try {
+ BufferedReader br = new BufferedReader(
+ new StringReader(rawDescriptorString));
+ String line = null, routerLine = null, publishedLine = null;
+ StringBuilder acceptRejectLines = new StringBuilder();
+ boolean foundMatch = false;
+ while ((line = br.readLine()) != null) {
+ if (line.startsWith("router ")) {
+ routerLine = line;
+ } else if (line.startsWith("published ")) {
+ publishedLine = line;
+ } else if (line.startsWith("reject ") ||
+ line.startsWith("accept ")) {
+ if (foundMatch) {
+ out.println(line);
+ continue;
+ }
+ boolean ruleAccept = line.split(" ")[0].equals("accept");
+ String ruleAddress = line.split(" ")[1].split(":")[0];
+ if (!ruleAddress.equals("*")) {
+ if (!ruleAddress.contains("/") &&
+ !ruleAddress.equals(targetIP)) {
+ /* IP address does not match. */
+ acceptRejectLines.append(line + "\n");
+ continue;
+ }
+ String[] ruleIPParts = ruleAddress.split("/")[0].
+ split("\\.");
+ int ruleNetwork = ruleAddress.contains("/") ?
+ Integer.parseInt(ruleAddress.split("/")[1]) : 32;
+ for (int i = 0; i < 4; i++) {
+ if (ruleNetwork == 0) {
+ break;
+ } else if (ruleNetwork >= 8) {
+ if (ruleIPParts[i].equals(targetIPParts[i])) {
+ ruleNetwork -= 8;
+ } else {
+ break;
+ }
+ } else {
+ int mask = 255 ^ 255 >>> ruleNetwork;
+ if ((Integer.parseInt(ruleIPParts[i]) & mask) ==
+ (Integer.parseInt(targetIPParts[i]) & mask)) {
+ ruleNetwork = 0;
+ }
+ break;
+ }
+ }
+ if (ruleNetwork > 0) {
+ /* IP address does not match. */
+ acceptRejectLines.append(line + "\n");
+ continue;
+ }
+ }
+ String rulePort = line.split(" ")[1].split(":")[1];
+ if (targetPort.length() < 1 && !ruleAccept &&
+ !rulePort.equals("*")) {
+ /* With no port given, we only consider reject :* rules as
+ matching. */
+ acceptRejectLines.append(line + "\n");
+ continue;
+ }
+ if (targetPort.length() > 0 && !rulePort.equals("*") &&
+ rulePort.contains("-")) {
+ int fromPort = Integer.parseInt(rulePort.split("-")[0]);
+ int toPort = Integer.parseInt(rulePort.split("-")[1]);
+ int targetPortInt = Integer.parseInt(targetPort);
+ if (targetPortInt < fromPort ||
+ targetPortInt > toPort) {
+ /* Port not contained in interval. */
+ continue;
+ }
+ }
+ if (targetPort.length() > 0) {
+ if (!rulePort.equals("*") &&
+ !rulePort.contains("-") &&
+ !targetPort.equals(rulePort)) {
+ /* Ports do not match. */
+ acceptRejectLines.append(line + "\n");
+ continue;
+ }
+ }
+ boolean relevantMatch = false;
+ for (long match : relevantDescriptors.get(descriptor)) {
+ if (relevantConsensuses.contains(match)) {
+ relevantMatch = true;
+ }
+ }
+ if (relevantMatch) {
+ String[] routerParts = routerLine.split(" ");
+ out.println("<pre><code>" + routerParts[0] + " "
+ + routerParts[1] + " <b>" + routerParts[2] + "</b> "
+ + routerParts[3] + " " + routerParts[4] + " "
+ + routerParts[5]);
+ String[] publishedParts = publishedLine.split(" ");
+ out.println(publishedParts[0] + " <b>"
+ + publishedParts[1] + " " + publishedParts[2]
+ + "</b>");
+ out.print(acceptRejectLines.toString());
+ out.println("<b>" + line + "</b>");
+ foundMatch = true;
+ }
+ if (ruleAccept) {
+ positiveConsensuses.addAll(
+ relevantDescriptors.get(descriptor));
+ }
+ }
+ }
+ br.close();
+ if (foundMatch) {
+ out.println("</code></pre>");
+ }
+ } catch (IOException e) {
+ /* Could not read descriptor string. */
+ continue;
+ }
+ }
+ }
+
+ /* Print out result. */
+ inMostRelevantConsensuses = false;
+ inOtherRelevantConsensus = false;
+ inTooOldConsensuses = false;
+ inTooNewConsensuses = false;
+ for (long match : positiveConsensuses) {
+ if (timestampIsDate &&
+ dateFormat.format(match).equals(timestampStr)) {
+ inMostRelevantConsensuses = true;
+ } else if (!timestampIsDate && match == relevantConsensuses.last()) {
+ inMostRelevantConsensuses = true;
+ } else if (relevantConsensuses.contains(match)) {
+ inOtherRelevantConsensus = true;
+ } else if (tooOldConsensuses.contains(match)) {
+ inTooOldConsensuses = true;
+ } else if (tooNewConsensuses.contains(match)) {
+ inTooNewConsensuses = true;
+ }
+ }
+ if (inMostRelevantConsensuses) {
+ out.print(" <p>Result is POSITIVE with high certainty!"
+ + "</p>\n"
+ + " <p>We found one or more relays on IP address "
+ + relayIP + " permitting exit to " + target + " in ");
+ if (timestampIsDate) {
+ out.print("relay list published on " + timestampStr);
+ } else {
+ out.print("the most recent relay list preceding " + timestampStr);
+ }
+ out.print(" that clients were likely to know.</p>\n");
+ writeFooter(out);
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ return;
+ }
+ boolean resultIndecisive = target.length() > 0
+ && !missingDescriptors.isEmpty();
+ if (resultIndecisive) {
+ out.println(" <p>Result is INDECISIVE!</p>\n"
+ + " <p>At least one referenced descriptor could not be "
+ + "found. This is a rare case, but one that (apparently) "
+ + "happens. We cannot make any good statement about exit "
+ + "relays without these descriptors. The following descriptors "
+ + "are missing:</p>");
+ for (String desc : missingDescriptors)
+ out.println(" <p>" + desc + "</p>\n");
+ }
+ if (inOtherRelevantConsensus) {
+ if (!resultIndecisive) {
+ out.println(" <p>Result is POSITIVE "
+ + "with moderate certainty!</p>\n");
+ }
+ out.println("<p>We found one or more relays on IP address "
+ + relayIP + " permitting exit to " + target + ", but not in ");
+ if (timestampIsDate) {
+ out.print("a relay list published on " + timestampStr);
+ } else {
+ out.print("the most recent relay list preceding " + timestampStr);
+ }
+ out.print(". A possible reason for the relay being missing in a "
+ + "relay list might be that some of the directory authorities "
+ + "had difficulties connecting to the relay. However, clients "
+ + "might still have used the relay.</p>\n");
+ } else {
+ if (!resultIndecisive) {
+ out.println(" <p>Result is NEGATIVE "
+ + "with high certainty!</p>\n");
+ }
+ out.println(" <p>We did not find any relay on IP address "
+ + relayIP + " permitting exit to " + target
+ + " in the relay list 3 hours preceding " + timestampStr
+ + ".</p>\n");
+ if (inTooOldConsensuses || inTooNewConsensuses) {
+ if (inTooOldConsensuses && !inTooNewConsensuses) {
+ out.println(" <p>Note that we found a matching relay in "
+ + "relay lists that were published between 15 and 3 "
+ + "hours before " + timestampStr + ".</p>\n");
+ } else if (!inTooOldConsensuses && inTooNewConsensuses) {
+ out.println(" <p>Note that we found a matching relay in "
+ + "relay lists that were published up to 12 hours after "
+ + timestampStr + ".</p>\n");
+ } else {
+ out.println(" <p>Note that we found a matching relay in "
+ + "relay lists that were published between 15 and 3 "
+ + "hours before and in relay lists that were published up "
+ + "to 12 hours after " + timestampStr + ".</p>\n");
+ }
+ if (timestampIsDate) {
+ out.println("<p>Be sure to try out the previous/next day or "
+ + "provide an exact timestamp in UTC.</p>");
+ } else {
+ out.println("<p>Make sure that the timestamp you provided is "
+ + "correctly converted to the UTC timezone.</p>");
+ }
+ }
+ }
+ if (target != null) {
+ if (positiveConsensuses.isEmpty() &&
+ !positiveConsensusesNoTarget.isEmpty()) {
+ out.println(" <p>Note that although the found relay(s) did "
+ + "not permit exiting to " + target + ", there have been one "
+ + "or more relays running at the given time.</p>");
+ }
+ }
+ try {
+ conn.close();
+ } catch (SQLException e) {
+ }
+ writeFooter(out);
+ }
+}
+
1
0
28 Sep '11
commit ed4bee53a3dd4258ced3168819656bff7d8f211f
Author: Damian Johnson <atagar(a)torproject.org>
Date: Wed Sep 28 07:31:43 2011 -0700
fix: crash from esc in interpretor panel prompt
When the user presses 'esc' in the interpretor panel prompt the getstr result
is None. I didn't account for this, causing a stacktrace. Caught by Sebastian.
https://trac.torproject.org/projects/tor/ticket/4098
---
src/cli/interpretorPanel.py | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/src/cli/interpretorPanel.py b/src/cli/interpretorPanel.py
index 37b9e58..246636c 100644
--- a/src/cli/interpretorPanel.py
+++ b/src/cli/interpretorPanel.py
@@ -70,6 +70,7 @@ class InterpretorPanel(panel.Panel):
inputLine = min(self.maxY - 1, displayLength)
inputFormat = getFormat(torInterpretor.INPUT_FORMAT)
input = self.getstr(inputLine, xOffset, "", inputFormat, validator = validator)
+ if input == None: input = ""
input, isDone = input.strip(), False
if not input:
1
0
r25133: {website} remove webersiedlung mirror and update the table. (in website/trunk: . include)
by Andrew Lewman 28 Sep '11
by Andrew Lewman 28 Sep '11
28 Sep '11
Author: phobos
Date: 2011-09-28 13:12:45 +0000 (Wed, 28 Sep 2011)
New Revision: 25133
Modified:
website/trunk/include/mirrors-table.wmi
website/trunk/update-mirrors.pl
Log:
remove webersiedlung mirror and update the table.
Modified: website/trunk/include/mirrors-table.wmi
===================================================================
--- website/trunk/include/mirrors-table.wmi 2011-09-28 12:51:22 UTC (rev 25132)
+++ website/trunk/include/mirrors-table.wmi 2011-09-28 13:12:45 UTC (rev 25133)
@@ -1,15 +1,15 @@
<tr>
- <td>NL</td>
+ <td>IS</td>
- <td>CCC</td>
+ <td>torproject.is</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.ccc.de/dist/">http</a></td>
- <td><a href="http://tor.ccc.de/">http</a></td>
+ <td><a href="http://torproject.is/dist">http</a></td>
+ <td><a href="http://torproject.is/">http</a></td>
<td> - </td>
<td> - </td>
<td> - </td>
@@ -18,49 +18,83 @@
<tr>
- <td>DK</td>
+ <td>AT</td>
- <td>Zentrum der Gesundheit</td>
+ <td>FoDT.IT</td>
<td>Up to date</td>
+ <td><a href="ftp://ftp.fodt.it/pub/mirror/tor/">ftp</a></td>
+ <td><a href="http://tor.fodt.it/dist/">http</a></td>
+ <td><a href="http://tor.fodt.it/">http</a></td>
+ <td><a href="https://tor.fodt.it/dist/">https</a></td>
+ <td><a href="https://tor.fodt.it/">https</a></td>
<td> - </td>
- <td><a href="http://tor.idnr.ws/dist/">http</a></td>
- <td><a href="http://tor.idnr.ws/">http</a></td>
<td> - </td>
+</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>searchprivate</td>
+
+ <td>Up to date</td>
+
<td> - </td>
+ <td><a href="http://tor.searchprivate.com/dist">http</a></td>
+ <td><a href="http://tor.searchprivate.com">http</a></td>
<td> - </td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>EE</td>
+ <td>DE</td>
- <td>CyberSIDE</td>
+ <td>beme it</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://cyberside.net.ee/tor/">http</a></td>
- <td><a href="http://cyberside.planet.ee/tor/">http</a></td>
+ <td><a href="http://tor.beme-it.de/dist/">http</a></td>
+ <td><a href="http://tor.beme-it.de/">http</a></td>
+ <td><a href="https://tor.beme-it.de/dist/">https</a></td>
+ <td><a href="https://tor.beme-it.de/">https</a></td>
<td> - </td>
+ <td><a href="rsync://tor.beme-it.de/tor">rsync</a></td>
+</tr>
+
+<tr>
+
+ <td>US</td>
+
+ <td>NW Linux</td>
+
+ <td>Up to date</td>
+
<td> - </td>
+ <td><a href="http://torproject.nwlinux.us/dist">http</a></td>
+ <td><a href="http://torproject.nwlinux.us">http</a></td>
<td> - </td>
<td> - </td>
+ <td> - </td>
+ <td><a href="rsync://nwlinux.us/tor-web">rsync</a></td>
</tr>
<tr>
<td>IS</td>
- <td>torproject.is</td>
+ <td>TheOnionRouter</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://torproject.is/dist">http</a></td>
- <td><a href="http://torproject.is/">http</a></td>
+ <td><a href="http://theonionrouter.com/dist/">http</a></td>
+ <td><a href="http://theonionrouter.com/">http</a></td>
<td> - </td>
<td> - </td>
<td> - </td>
@@ -69,19 +103,19 @@
<tr>
- <td>US</td>
+ <td>NL</td>
- <td>BarkerJr</td>
+ <td>CCC</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://www.torproject.us/dist/">http</a></td>
- <td><a href="http://www.torproject.us/">http</a></td>
- <td><a href="https://www.torproject.us/dist/">https</a></td>
- <td><a href="https://www.torproject.us/">https</a></td>
+ <td><a href="http://tor.ccc.de/dist/">http</a></td>
+ <td><a href="http://tor.ccc.de/">http</a></td>
<td> - </td>
- <td><a href="rsync://rsync.torproject.us/tor">rsync</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
@@ -120,83 +154,83 @@
<tr>
- <td>AT</td>
+ <td>DE</td>
- <td></td>
+ <td>CCC-Hanau</td>
<td>Up to date</td>
+ <td><a href="ftp://key-server.org/tor">ftp</a></td>
+ <td><a href="http://tor.key-server.org/dist">http</a></td>
+ <td><a href="http://tor.key-server.org">http</a></td>
+ <td><a href="https://tor.key-server.org/dist">https</a></td>
+ <td><a href="https://tor.key-server.org">https</a></td>
<td> - </td>
- <td><a href="http://tor.webersiedlung.at/dist/">http</a></td>
- <td><a href="http://tor.webersiedlung.at/">http</a></td>
<td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
</tr>
<tr>
- <td>DE</td>
+ <td>FR</td>
- <td>CCC-Hanau</td>
+ <td>BarkerJr</td>
<td>Up to date</td>
- <td><a href="ftp://key-server.org/tor">ftp</a></td>
- <td><a href="http://tor.key-server.org/dist">http</a></td>
- <td><a href="http://tor.key-server.org">http</a></td>
- <td><a href="https://tor.key-server.org/dist">https</a></td>
- <td><a href="https://tor.key-server.org">https</a></td>
<td> - </td>
+ <td><a href="http://www.oignon.net/dist/">http</a></td>
+ <td><a href="http://www.oignon.net/">http</a></td>
+ <td><a href="https://www.oignon.net/dist/">https</a></td>
+ <td><a href="https://www.oignon.net/">https</a></td>
<td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>AT</td>
+ <td>NL</td>
- <td>FoDT.IT</td>
+ <td>Amorphis</td>
<td>Up to date</td>
- <td><a href="ftp://ftp.fodt.it/pub/mirror/tor/">ftp</a></td>
- <td><a href="http://tor.fodt.it/dist/">http</a></td>
- <td><a href="http://tor.fodt.it/">http</a></td>
- <td><a href="https://tor.fodt.it/dist/">https</a></td>
- <td><a href="https://tor.fodt.it/">https</a></td>
<td> - </td>
+ <td><a href="http://tor.amorphis.eu/dist/">http</a></td>
+ <td><a href="http://tor.amorphis.eu/">http</a></td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>FR</td>
+ <td>DK</td>
- <td>BarkerJr</td>
+ <td>Zentrum der Gesundheit</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://www.oignon.net/dist/">http</a></td>
- <td><a href="http://www.oignon.net/">http</a></td>
- <td><a href="https://www.oignon.net/dist/">https</a></td>
- <td><a href="https://www.oignon.net/">https</a></td>
+ <td><a href="http://tor.idnr.ws/dist/">http</a></td>
+ <td><a href="http://tor.idnr.ws/">http</a></td>
<td> - </td>
<td> - </td>
+ <td> - </td>
+ <td> - </td>
</tr>
<tr>
- <td>AT</td>
+ <td>EE</td>
- <td>cyberarmy</td>
+ <td>CyberSIDE</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.cyberarmy.at/dist">http</a></td>
- <td><a href="http://tor.cyberarmy.at">http</a></td>
+ <td><a href="http://cyberside.net.ee/tor/">http</a></td>
+ <td><a href="http://cyberside.planet.ee/tor/">http</a></td>
<td> - </td>
<td> - </td>
<td> - </td>
@@ -207,17 +241,17 @@
<td>US</td>
- <td>searchprivate</td>
+ <td>BarkerJr</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.searchprivate.com/dist">http</a></td>
- <td><a href="http://tor.searchprivate.com">http</a></td>
+ <td><a href="http://www.torproject.us/dist/">http</a></td>
+ <td><a href="http://www.torproject.us/">http</a></td>
+ <td><a href="https://www.torproject.us/dist/">https</a></td>
+ <td><a href="https://www.torproject.us/">https</a></td>
<td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
+ <td><a href="rsync://rsync.torproject.us/tor">rsync</a></td>
</tr>
<tr>
@@ -273,42 +307,8 @@
<tr>
- <td>DE</td>
-
- <td>beme it</td>
-
- <td>Up to date</td>
-
- <td> - </td>
- <td><a href="http://tor.beme-it.de/dist/">http</a></td>
- <td><a href="http://tor.beme-it.de/">http</a></td>
- <td><a href="https://tor.beme-it.de/dist/">https</a></td>
- <td><a href="https://tor.beme-it.de/">https</a></td>
- <td> - </td>
- <td><a href="rsync://tor.beme-it.de/tor">rsync</a></td>
-</tr>
-
-<tr>
-
<td>US</td>
- <td>NW Linux</td>
-
- <td>Up to date</td>
-
- <td> - </td>
- <td><a href="http://torproject.nwlinux.us/dist">http</a></td>
- <td><a href="http://torproject.nwlinux.us">http</a></td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
- <td><a href="rsync://nwlinux.us/tor-web">rsync</a></td>
-</tr>
-
-<tr>
-
- <td>US</td>
-
<td>Xpdm</td>
<td>Up to date</td>
@@ -341,15 +341,15 @@
<tr>
- <td>FR</td>
+ <td>US</td>
- <td>LazyTiger</td>
+ <td>AskApache</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.taiga-san.net/dist">http</a></td>
- <td><a href="http://tor.taiga-san.net/">http</a></td>
+ <td><a href="http://tor.askapache.com/dist/">http</a></td>
+ <td><a href="http://tor.askapache.com/">http</a></td>
<td> - </td>
<td> - </td>
<td> - </td>
@@ -358,15 +358,15 @@
<tr>
- <td>IS</td>
+ <td>FR</td>
- <td>TheOnionRouter</td>
+ <td>LazyTiger</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://theonionrouter.com/dist/">http</a></td>
- <td><a href="http://theonionrouter.com/">http</a></td>
+ <td><a href="http://tor.taiga-san.net/dist">http</a></td>
+ <td><a href="http://tor.taiga-san.net/">http</a></td>
<td> - </td>
<td> - </td>
<td> - </td>
@@ -375,91 +375,40 @@
<tr>
- <td>DE</td>
+ <td>SE</td>
- <td>[[:bbs:]]</td>
+ <td>homosu</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.blingblingsquad.net/dist">http</a></td>
- <td><a href="http://tor.blingblingsquad.net/">http</a></td>
- <td><a href="https://tor.blingblingsquad.net/dist">https</a></td>
- <td><a href="https://tor.blingblingsquad.net/">https</a></td>
+ <td><a href="http://tor.homosu.net/dist">http</a></td>
+ <td><a href="http://tor.homosu.net/">http</a></td>
<td> - </td>
<td> - </td>
-</tr>
-
-<tr>
-
- <td>INT</td>
-
- <td>CoralCDN</td>
-
- <td>Up to date</td>
-
<td> - </td>
- <td><a href="http://www.torproject.org.nyud.net/dist/">http</a></td>
- <td><a href="http://www.torproject.org.nyud.net/">http</a></td>
<td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
</tr>
<tr>
- <td>NL</td>
+ <td>DE</td>
- <td>Amorphis</td>
+ <td>[[:bbs:]]</td>
<td>Up to date</td>
<td> - </td>
- <td><a href="http://tor.amorphis.eu/dist/">http</a></td>
- <td><a href="http://tor.amorphis.eu/">http</a></td>
+ <td><a href="http://tor.blingblingsquad.net/dist">http</a></td>
+ <td><a href="http://tor.blingblingsquad.net/">http</a></td>
+ <td><a href="https://tor.blingblingsquad.net/dist">https</a></td>
+ <td><a href="https://tor.blingblingsquad.net/">https</a></td>
<td> - </td>
<td> - </td>
- <td> - </td>
- <td> - </td>
</tr>
<tr>
- <td>US</td>
-
- <td>AskApache</td>
-
- <td>Up to date</td>
-
- <td> - </td>
- <td><a href="http://tor.askapache.com/dist/">http</a></td>
- <td><a href="http://tor.askapache.com/">http</a></td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
-</tr>
-
-<tr>
-
- <td>SE</td>
-
- <td>homosu</td>
-
- <td>Up to date</td>
-
- <td> - </td>
- <td><a href="http://tor.homosu.net/dist">http</a></td>
- <td><a href="http://tor.homosu.net/">http</a></td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
- <td> - </td>
-</tr>
-
-<tr>
-
<td>DE</td>
<td></td>
@@ -545,6 +494,23 @@
<tr>
+ <td>AT</td>
+
+ <td>cyberarmy</td>
+
+ <td>Unknown</td>
+
+ <td> - </td>
+ <td><a href="http://tor.cyberarmy.at/dist">http</a></td>
+ <td><a href="http://tor.cyberarmy.at">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>NL</td>
<td></td>
@@ -562,6 +528,23 @@
<tr>
+ <td>INT</td>
+
+ <td>CoralCDN</td>
+
+ <td>Unknown</td>
+
+ <td> - </td>
+ <td><a href="http://www.torproject.org.nyud.net/dist/">http</a></td>
+ <td><a href="http://www.torproject.org.nyud.net/">http</a></td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+ <td> - </td>
+</tr>
+
+<tr>
+
<td>IS</td>
<td>crypto.is</td>
Modified: website/trunk/update-mirrors.pl
===================================================================
--- website/trunk/update-mirrors.pl 2011-09-28 12:51:22 UTC (rev 25132)
+++ website/trunk/update-mirrors.pl 2011-09-28 13:12:45 UTC (rev 25133)
@@ -553,24 +553,6 @@
rsyncDistMirror => "",
hiddenServiceMirror => "http://hbpvnydyyjbmhx6b.onion/mirrors/torproject.org/",
},
- mirror034 => {
- adminContact => "",
- orgName => "",
- isoCC => "AT",
- subRegion => "",
- region => "AT",
- ipv4 => "True",
- ipv6 => "False",
- loadBalanced => "No",
- httpWebsiteMirror => "http://tor.webersiedlung.at/",
- httpsWebsiteMirror => "",
- rsyncWebsiteMirror => "",
- ftpWebsiteMirror => "",
- httpDistMirror => "http://tor.webersiedlung.at/dist/",
- httpsDistMirror => "",
- rsyncDistMirror => "",
- hiddenServiceMirror => "",
- },
mirror036 => {
adminContact => "",
orgName => "",
1
0
28 Sep '11
Author: phobos
Date: 2011-09-28 12:51:22 +0000 (Wed, 28 Sep 2011)
New Revision: 25132
Added:
website/trunk/images/easy-bg.png
website/trunk/images/easy-tbb.png
website/trunk/images/table-title-hover.jpg
Log:
add the images for svn commit 25131.
Added: website/trunk/images/easy-bg.png
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/easy-bg.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: website/trunk/images/easy-tbb.png
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/easy-tbb.png
___________________________________________________________________
Added: svn:mime-type
+ image/png
Added: website/trunk/images/table-title-hover.jpg
===================================================================
(Binary files differ)
Property changes on: website/trunk/images/table-title-hover.jpg
___________________________________________________________________
Added: svn:mime-type
+ image/jpeg
1
0
r25131: {website} and we have a new download-easy page from ticket 3926. (in website/trunk: css download/en include js)
by Andrew Lewman 28 Sep '11
by Andrew Lewman 28 Sep '11
28 Sep '11
Author: phobos
Date: 2011-09-28 12:48:57 +0000 (Wed, 28 Sep 2011)
New Revision: 25131
Modified:
website/trunk/css/layout-rtl.css
website/trunk/css/layout.css
website/trunk/css/typography.css
website/trunk/download/en/download-easy.wml
website/trunk/download/en/download.wml
website/trunk/include/dlhead.wmi
website/trunk/js/dlpage01.js
website/trunk/js/jquery.accordion.min.js
Log:
and we have a new download-easy page from ticket 3926.
Modified: website/trunk/css/layout-rtl.css
===================================================================
--- website/trunk/css/layout-rtl.css 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/css/layout-rtl.css 2011-09-28 12:48:57 UTC (rev 25131)
@@ -269,6 +269,29 @@
/* END DL PAGE ------------*/
+/* DOWNLOAD-EASY ----------*/
+
+.easy .package p {
+ padding-right: 0px;
+ }
+
+.easy .package p.alt-dl {
+ padding-right: 0px;
+ }
+
+.easy .downloads {
+ margin-left: 0px;
+ margin-right: 30px;
+ }
+
+.lang-alt {
+ float: left;
+ margin-right: 0px;
+ margin-left: 10px;
+}
+
+/* END DOWNLOAD-EASY ----------*/
+
.title {
background: url(../images/table-title-arrow-rtl.jpg) right top no-repeat;
padding: 10px 10px 0 25px;
Modified: website/trunk/css/layout.css
===================================================================
--- website/trunk/css/layout.css 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/css/layout.css 2011-09-28 12:48:57 UTC (rev 25131)
@@ -518,6 +518,7 @@
}
.accordionButton:hover {
+ background: url("../images/table-title-hover.jpg") repeat-x left bottom #885CA4;
text-shadow: 1px 1px 0px rgba(17, 17, 17, 1);
}
@@ -636,7 +637,102 @@
margin: 3px 0px 20px 0px;
}
+/* DOWNLOAD-EASY ---*/
+.easy {
+ width: 710px;
+ height: 241px;
+ background: url(../images/easy-bg.png) repeat-x scroll left 85px;
+ margin-bottom: 10px;
+ }
+
+.easy .package h2,
+.easy .package em {
+ display: block;
+ width: 100%;
+ text-align: center;
+ }
+
+.easy .package h2 {
+ font-size: 30px;
+ font-weight: normal;
+ padding-top: 10px;
+ padding-bottom: 5px;
+ }
+
+.easy .package em {
+ font-size: 12px;
+ padding-bottom: 30px;
+ }
+
+.easy .package p {
+ padding-left: 0px;
+ font-size: 15px;
+ text-align: justify;
+ }
+
+.easy .package p.alt-dl {
+ text-align: center;
+ text-indent: 0px;
+ padding-left: 0px;
+ margin-top: 32px;
+ }
+
+.all-dl {
+ display: block;
+ text-align: center;
+ width: 100%;
+ font-size: 15px;
+}
+
+.all-dl a{
+ text-decoration: none;
+ font-weight: bold;
+}
+
+.all-dl a:hover{
+ text-decoration: underline;
+}
+
+.easy .package {
+ float: none;
+ padding-left: 30px;
+ padding-right: 30px;
+ width: 651px;
+ }
+
+.easy .downloads {
+ margin-left: 30px;
+ padding-top: 125px;
+ background: url(../images/easy-tbb.png) no-repeat scroll center 10px;
+ }
+
+.easy.windows,
+.easy.linux,
+.easy.mac {
+ border: 1px solid #885CA4;
+ border-radius: 10px;
+ }
+
+.open {
+ display: block;
+ }
+
+.lang-alt {
+ line-height: 15px;
+ font-size: 10px;
+ float: right;
+ margin-right: 10px;
+}
+
+.expander {
+ text-align: right;
+ float: right;
+ padding: 10px 20px 0 0px;
+ font-size: 15px;
+ display: none;
+}
+
/* MISC ------------*/
.title {
Modified: website/trunk/css/typography.css
===================================================================
--- website/trunk/css/typography.css 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/css/typography.css 2011-09-28 12:48:57 UTC (rev 25131)
@@ -250,7 +250,7 @@
}
.package p {
- text-indent: 5px;
+ text-indent: 0px;
line-height: 18px;
}
Modified: website/trunk/download/en/download-easy.wml
===================================================================
--- website/trunk/download/en/download-easy.wml 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/download/en/download-easy.wml 2011-09-28 12:48:57 UTC (rev 25131)
@@ -1,196 +1,265 @@
## translation metadata
# Revision: $Revision$
-# Translation-Priority: 1-high
+# Translation-Priority: 3-low
-#include "head.wmi" TITLE="Tor: Easy Download Selector" CHARSET="UTF-8" ANNOUNCE_RSS="yes"
+#<!-- ATTENTION TRANSLATOR -->
+#<!-- You MUST copy '/include/lang.wmi' along with this file! -->
+#<!-- TBB DEFAULT LANGUAGE: Change 'en-US' below to your language code (if package exists)-->
+#<!-- IMPORTANT: You MUST also change the default selection in 'lang.wmi' -->
+<define-tag lang>en-US</define-tag>
+
+#<!-- Download button text for language enabled packages -->
+<define-tag button-win-tbb32>Tor Browser Bundle</define-tag>
+<define-tag button-win-tbb64>Currently Unused</define-tag>
+<define-tag button-osx-tbb32>Tor Browser Bundle (Beta)</define-tag>
+<define-tag button-osx-tbb64>64-bit (Beta)</define-tag>
+<define-tag button-lin-tbb32>Tor Browser Bundle (Beta)</define-tag>
+<define-tag button-lin-tbb64>64-bit (Beta)</define-tag>
+
+#include "dlhead.wmi" TITLE="Download Tor" CHARSET="UTF-8" ANNOUNCE_RSS="yes"
+
<div id="content" class="clearfix">
-<div id="breadcrumbs"><a href="<page index>">Home » </a><a href="<page download/download-easy>">Easy Download Selector</a></div>
-<div id="maincol-left">
+ <div id="breadcrumbs"><a href="<page index>">Home » </a><a href="<page download/download>">Download</a></div>
+ <div id="maincol-left">
<!-- BEGIN TEASER WARNING -->
+ <div class="warning-top">
+ <h2>Want Tor to really work?</h2>
+ <p>...then please don't just install it and go on. You need to change some of your habits, and reconfigure your software! Tor by itself is <em>NOT</em> all you need to maintain your anonymity. Read the <a href="#warning">full list of warnings</a>.
+ </p>
+ </div>
+<!-- END TEASER WARNING -->
+<!-- START DOWNLOADS -->
+<!-- START DOWNLOADS -->
+<!-- START WINDOWS -->
+ <div class="easy windows">
+ <div class="package" style="padding-top: 13px; border-top: 0px;">
+ <form class="downloads">
+ <a class="button win-tbb" href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_<lang>.exe"><span class="strong">Download</span><span class="normal"><button-win-tbb32></span></a>
+ <select name="language" id="win-tbb" class="lang">
+#include <lang.wmi>
+ </select>
+ <div class="sig" style="margin-bottom: 5px;">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundle">Other Languages</a>
+ (<a class="win-tbb-sig" href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_<lang>.exe.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
+ </div>
+ </form>
+ <h2>Tor Browser Bundle for Windows</h2>
+ <em>Version <version-torbrowserbundle> - Windows 7, Vista, and XP</em>
+ <p>Everything you need to safely browse the Internet. This package requires no installation. Just extract it and run. <a href="<page projects/torbrowser>">Learn more »</a></p>
+ <p class="alt-dl">Not Using Windows? Download for <a class="mac-alt" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-<lang>.zip">Mac</a> or <a class="lin-alt" href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-<lang>.tar.gz">Linux</a></p>
+ </div>
+ </div>
+<!-- START MAC -->
+ <div class="easy mac">
+ <div class="package" style="padding-top: 13px; border-top: 0px;">
+ <form class="downloads">
+ <a class="button mac-tbb" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-<lang>.zip"><span class="strong">Download</span><span class="normal"><button-osx-tbb32></span></a>
+ <select name="language" id="mac-tbb" class="lang">
+#include <lang.wmi>
+ </select>
+ <div class="sig" style="margin-bottom: 5px;">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundleosx">Other Languages</a>
+ (<a class="mac-tbb-sig" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-<lang>.zip.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
+ </div>
+ </form>
+ <h2>Tor Browser Bundle for Mac</h2>
+ <em>Version <version-torbrowserbundleosx> - OS X</em>
+ <p>Everything you need to safely browse the Internet. This package requires no installation. Just extract it and run. <a href="<page projects/torbrowser>">Learn more »</a></p>
+ <p class="alt-dl">Not Using Mac? Download for <a class="win-alt" href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_<lang>.exe">Windows</a> or <a class="lin-alt" href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-<lang>.tar.gz">Linux</a></p>
+ </div>
+ </div>
+<!-- START LINUX -->
+ <div class="easy linux">
+ <div class="package" style="padding-top: 13px; border-top: 0px;">
+ <form class="downloads">
+ <a class="button lin-tbb32" href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-<lang>.tar.gz"><span class="strong">Download</span><span class="normal"><button-lin-tbb32></span></a>
+ <select name="language" id="lin-tbb32" class="lang">
+#include <lang.wmi>
+ </select>
+ <div class="sig" style="margin-bottom: 5px;">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundlelinux">Other Languages</a>
+ (<a class="lin-tbb32-sig" href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-<lang>.tar.gz.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
+ </div>
+ </form>
+ <h2>Tor Browser Bundle for Linux</h2>
+ <em>Version <version-torbrowserbundlelinux32> - Linux, Unix, BSD</em>
+ <p>Everything you need to safely browse the Internet. This package requires no installation. Just extract it and run. <a href="<page projects/torbrowser>">Learn more »</a></p>
+ <p class="alt-dl">Not Using Linux? Download for <a class="mac-alt" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-<lang>.zip">Mac</a> or <a class="win-alt" href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_<lang>.exe">Windows</a></p>
+ </div>
+ </div>
+ <p class="all-dl">Looking For Something Else? <a href="<page download/download>">View All Downloads</a></p>
+<!-- END DOWNLOADS --><br>
+<!-- BEGIN WARNING -->
<div class="warning">
-<h2>Want Tor to really work?</h2>
-<p>...then please don't just install it and go on. You need to change some of
-your habits, and reconfigure your software! Tor by itself is <em>NOT</em> all
-you need to maintain your anonymity. Read the <a
-href="<page download/download>#warning">full list of warnings</a>.
+<a name="warning"></a>
+<a name="Warning"></a>
+<h2><a class="anchor" href="#warning">Want Tor to really work?</a></h2>
+<p>...then please don't just install it and go on. You need to change some of your habits, and reconfigure your software! Tor by itself is <em>NOT</em> all you need to maintain your anonymity. There are several major pitfalls to watch out for:
</p>
-</div>
-<!-- END TEASER WARNING -->
-<br>
-<table class="toppad" summary="">
-<tbody>
-<tr style="vertical-align:top;">
-<td class="nopad" height="1" style="vertical-align:top;">
-<h2>Tor Browser Bundle</h2>
+<ol>
+<li>
+Tor only protects Internet applications that are configured to
+send their traffic through Tor — it doesn't magically anonymize
+all your traffic just because you install it. We recommend you
+use <a href="http://www.mozilla.com/en-US/firefox/all-older.html">Firefox</a> with the <a
+href="<page torbutton/index>">Torbutton</a> extension.
+</li>
-</td>
+<li>
+Torbutton blocks browser plugins such as Java, Flash, ActiveX, RealPlayer,
+Quicktime, Adobe's PDF plugin, and others: they can be manipulated
+into revealing your IP address. For example, that means Youtube is
+disabled. If you really need your Youtube, you can <a href="<page
+torbutton/torbutton-faq>#noflash">reconfigure Torbutton</a> to allow it; but
+be aware that you're opening yourself up to potential attack. Also,
+extensions like Google toolbar look up more information about the
+websites you type in: they may bypass Tor and/or broadcast sensitive
+information. Some people prefer using two browsers (one for Tor, one
+for non-Tor browsing).
+</li>
- <!-- DONATION WIDGET BEGIN -->
-<script type="text/javascript" src="$(DOCROOT)/jquery.min.js"></script>
-<script type="text/javascript">
-function displayVals() {
- var t3 = jQuery("#t3").val();
- var amount = jQuery("#amount").val();
- if(t3 != 0){
- jQuery('#a3').val(amount);
- jQuery('#p3').val(1);
- jQuery('#cmd').val('_xclick-subscriptions');
- jQuery('#item_name').val('Tor Project Membership');
- jQuery('#ppinfo').replaceWith('<h6 id="ppinfo"><small>(Requires a PayPal Account)</small></h6>');
- }else{
- jQuery('#a3').val(0);
- jQuery('#p3').val(0);
- jQuery('#cmd').val('_donations');
- jQuery('#item_name').val('Donation to the Tor Project');
- jQuery('#ppinfo').replaceWith('<h6 id="ppinfo" style="height:0px;"></h6>');
- }
- if( !t3 ) {
- jQuery('#cmd').val('_donations');
- jQuery('#item_name').val('Donation to the Tor Project');
- jQuery('#ppinfo').replaceWith('<h6 id="ppinfo" style="height:0px;"></h6>');
- }
-}
+<li>
+Beware of cookies: if you ever browse without Tor and a site gives
+you a cookie, that cookie could identify you even when you start
+using Tor again. Torbutton tries to handle your cookies safely. <a
+href="https://addons.mozilla.org/firefox/82/">CookieCuller</a> can help
+protect any cookies you do not want to lose.
+</li>
-jQuery(function(){
- jQuery("#amount").change(displayVals);
- jQuery("#t3").change(displayVals);
- displayVals();
-});
+<li>
+Tor anonymizes the origin of your traffic, and it encrypts everything
+between you and the Tor network and everything inside the Tor network,
+but <a href="<wikifaq>#SoImtotallyanonymousifIuseTor">it
+can't encrypt your traffic between the Tor network and its final
+destination.</a> If you are communicating sensitive information, you
+should use as much care as you would on the normal scary Internet —
+use HTTPS or other end-to-end encryption and authentication. <a
+href="https://www.eff.org/https-everywhere">HTTPS Everywhere</a> is a
+Firefox extension produced as a collaboration between The Tor Project
+and the Electronic Frontier Foundation. It encrypts your communications
+with a number of major websites.
+</li>
-</script>
-<td class="nopad" rowspan="8" style="width:220px;vertical-align:top;">
- <form class="dbox" action="https://www.paypal.com/cgi-bin/webscr" method="post">
- <h2>Donate to Tor</h2>
- <p>
- <select name="currency_code" class="cur">
- <option value="USD" selected="selected">$</option>
- <option value="EUR">€</option>
- <option value="GBP">£</option>
- <option value="YEN">¥</option>
- </select>
- <input type="text" id="amount" class="amount" name="amount" value="5" size="10">
- </p>
- <p>
- <input type="hidden" id="a3" name="a3" value="0">
- <select id="t3" name="t3">
- <option value="0">One-time Donation</option>
- <option value="M">Monthly Subscription</option>
- </select>
- </p>
- <p>
- <input type="hidden" id="p3" name="p3" value="1">
- <input type="hidden" name="sra" value="1">
- <input type="hidden" name="src" value="1">
- <input type="hidden" name="no_shipping" value="1">
- <input type="hidden" name="no_note" value="1">
- <input type="hidden" id="cmd" name="cmd" value="_donations">
- <input type="hidden" name="business" value="donations(a)torproject.org">
- <input type="hidden" id="item_name" name="item_name" value="Donation to the Tor Project">
- <input type="hidden" name="return" value="https://www.torproject.org/donate/thankyou">
- <input type="hidden" name="cancel_return" value="https://www.torproject.org/download-easy">
- </p>
- <h6 id="ppinfo" style="height:0px;"></h6>
- <p>
- <input class="donate-btn" type="submit" name="donate" value="Donate">
- </p>
- <p>
- <a href="<page donate/donate>">Other donation options...</a>
- </p>
- </form>
-</td>
- <!-- DONATION WIDGET END -->
+<li>
+While Tor blocks attackers on your local network from discovering
+or influencing your destination, it opens new risks: malicious or
+misconfigured Tor exit nodes can send you the wrong page, or even send
+you embedded Java applets disguised as domains you trust. Be careful
+opening documents or applications you download through Tor, unless you've
+verified their integrity.
+</li>
-</tr>
-<tr>
-<td>The <strong>Tor Browser Bundle</strong> contains everything you need
-to safely browse the Internet. This package requires no installation.
-Just extract it and run. <a href="<page projects/torbrowser>">Learn more
-& other languages »</a></td>
+<li>
+Tor tries to prevent attackers from learning what destinations you connect
+to. It doesn't prevent somebody watching your traffic from learning that
+you're using Tor. You can mitigate (but not fully resolve) the risk
+by using a <a href="<page docs/bridges>">Tor bridge relay</a> rather than
+connecting directly to the public Tor network, but ultimately the best
+protection here is a social approach: the more Tor users there are near
+you and the more <a href="<page about/torusers>">diverse</a> their interests,
+the less dangerous it will be that you are one of them.
+</li>
-</tr>
-<tr class="gray">
-<td><span class="windows">
-# Translators: please point to the version of TBB in your language, if there is one.
-<a href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_en-US.exe">Windows 7, Vista, XP</a>
-(<a href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_en-US.exe.asc">sig</a>)
-</span>
-</td>
-</tr>
-<tr>
-<td><span class="mac">
-# Translators: please point to the version of TBB in your language, if there is one.
-<a href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-en-US.zip">Apple OS X Intel</a>
-(<a href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-en-US.zip.asc">sig</a>)
-</span>
-</td>
-</tr>
-<tr class="gray">
-<td><span class="linux">
-# Translators: please point to the version of TBB in your language, if there is one.
-<a href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-en-US.tar.gz">GNU/Linux i686</a>
-(<a href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-en-US.tar.gz.asc">sig</a>)
-</span>
-</td>
-</tr>
-<tr>
-<td>
-<p>Looking for something else? <a href="<page download/download>">View All Downloads</a>.</p>
-</td>
-</tr>
-<tr class="gray">
-<td colspan="2">
-<p>To keep informed of security advisories and new stable releases, subscribe to the <a
-href="https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-announce">tor-announce
-mailing list</a>. You can also <a
-href="http://rss.gmane.org/gmane.network.onion-routing.announce">watch
-the list's RSS feed</a>.</p>
-<p>Interested in <a href="<page about/overview>">learning more about Tor in general</a>?</p>
-</td>
-</tr>
-</tbody>
-</table>
+<li> Do not use <a
+href="https://blog.torproject.org/blog/bittorrent-over-tor-isnt-good-idea">BitTorrent
+and Tor</a> together.
+</li>
+</ol>
+<br>
+<p>
+Be smart and learn more. Understand what Tor does and does not offer.
+This list of pitfalls isn't complete, and we need your
+help <a href="<page getinvolved/volunteer>#Documentation">identifying and documenting
+all the issues</a>.
+</p>
</div>
+<!-- END WARNING -->
+</div>
<!-- END MAINCOL -->
+<!-- START SIDECOL -->
<div id="sidecol-right">
+<!-- START DONATION WIDGET -->
+ <script async type="text/javascript">
+ function displayVals() {
+ var t3 = $("#t3").val();
+ var amount = $("#amount").val();
+ if(t3 != 0){
+ $('#a3').val(amount);
+ $('#p3').val(1);
+ $('#cmd').val('_xclick-subscriptions');
+ $('#item_name').val('Tor Project Membership');
+ $('#ppinfo').replaceWith('<h6 id="ppinfo"><small>(Requires a PayPal Account)</small></h6>');
+ }else{
+ $('#a3').val(0);
+ $('#p3').val(0);
+ $('#cmd').val('_donations');
+ $('#item_name').val('Donation to the Tor Project');
+ $('#ppinfo').replaceWith('<h6 id="ppinfo" style="height:0px;"></h6>');
+ }
+ if( !t3 ) {
+ $('#cmd').val('_donations');
+ $('#item_name').val('Donation to the Tor Project');
+ $('#ppinfo').replaceWith('<h6 id="ppinfo" style="height:0px;"></h6>');
+ }
+ }
+ $(function(){
+ $("#amount").change(displayVals);
+ $("#t3").change(displayVals);
+ displayVals();
+ });
+ </script>
+<form class="dbox dl" action="https://www.paypal.com/cgi-bin/webscr" method="post">
+ <h2>Donate to Tor</h2>
+ <p>
+ <select name="currency_code" class="cur">
+ <option value="USD" selected="selected">$</option>
+ <option value="EUR">€</option>
+ <option value="GBP">£</option>
+ <option value="YEN">¥</option>
+ </select>
+ <input type="text" id="amount" class="amount" name="amount" value="5" size="10">
+ </p>
+ <p>
+ <input type="hidden" id="a3" name="a3" value="0">
+ <select id="t3" name="t3">
+ <option value="0">One-time Donation</option>
+ <option value="M">Monthly Subscription</option>
+ </select>
+ </p>
+ <p>
+ <input type="hidden" id="p3" name="p3" value="1">
+ <input type="hidden" name="sra" value="1">
+ <input type="hidden" name="src" value="1">
+ <input type="hidden" name="no_shipping" value="1">
+ <input type="hidden" name="no_note" value="1">
+ <input type="hidden" id="cmd" name="cmd" value="_donations">
+ <input type="hidden" name="business" value="donations(a)torproject.org">
+ <input type="hidden" id="item_name" name="item_name" value="Donation to the Tor Project">
+ <input type="hidden" name="return" value="https://www.torproject.org/donate/thankyou.html">
+ <input type="hidden" name="cancel_return" value="https://www.torproject.org/download/download.html">
+ </p>
+ <h6 id="ppinfo" style="height:0px;"></h6>
+ <p>
+ <input class="donate-btn" type="submit" name="donate" value="Donate">
+ </p>
+ <p><a href="<page donate/donate>">Other donation options...</a></p>
+</form>
+<!-- END DONATION WIDGET -->
+<!-- START INFO -->
<div class="img-shadow">
<div class="sidenav-sub">
-<h2>Advanced Choices:</h2>
-<ul>
-<li class="dropdown"><a href="<page download/download>#Windows">Microsoft Windows</a></li>
-<li class="dropdown"><a href="<page download/download>#mac">Apple OS X</a></li>
-<li class="dropdown"><a href="<page download/download>#linux">Linux/Unix</a></li>
-<li class="dropdown"><a href="<page download/download>#smartphones">Smartphones</a></li>
-<li class="dropdown"><a href="<page download/download>#source">Source Code</a></li>
-</ul>
-</div>
-</div>
-<!-- END SIDENAV -->
-<div class="img-shadow">
-<div class="infoblock">
-<h2>What is the (sig) link?</h2>
-<p>These are GPG signatures to allow you to verify that
-your downloaded file is really from The Tor Project and not
-an imposter.</p>
-<a href="<page docs/verifying-signatures>">Learn more »</a>
-</div>
-</div>
-<!-- END INFOBLOCK -->
-<div class="img-shadow">
-<div class="sidenav-sub">
<h2>Having Trouble?</h2>
<ul>
<li class="dropdown"><a href="<page docs/documentation>">Read the fine manuals</a></li>
</ul>
</div>
</div>
-<!-- END SIDENAV -->
+<!-- END INFO -->
</div>
-</div><!-- #main -->
-<div class="">
-<p><small>All trademarks are the property of their respective owners.</small></p>
+<!-- END SIDECOL -->
</div>
+<!-- END CONTENT -->
#include <foot.wmi>
-
Modified: website/trunk/download/en/download.wml
===================================================================
--- website/trunk/download/en/download.wml 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/download/en/download.wml 2011-09-28 12:48:57 UTC (rev 25131)
@@ -45,6 +45,7 @@
#include <lang.wmi>
</select>
<div class="sig">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundle">Other Languages</a>
(<a class="win-tbb-sig" href="../dist/torbrowser/tor-browser-<version-torbrowserbundle>_<lang>.exe.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
</div>
<a class="additional" href="<page projects/torbrowser-details>#build">Source Code</a>
@@ -140,6 +141,7 @@
#include <lang.wmi>
</select>
<div class="sig">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundleosx">Other Languages</a>
(<a class="osx-tbb-sig" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-i386-<lang>.zip.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
</div>
<a class="button osx-tbb64" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-x86_64-<lang>.zip"><span class="strong">Download</span><span class="normal"><button-osx-tbb64></span></a>
@@ -147,6 +149,7 @@
#include <lang.wmi>
</select>
<div class="sig">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundleosx">Other Languages</a>
(<a class="osx-tbb64-sig" href="../dist/torbrowser/osx/TorBrowser-<version-torbrowserbundleosx>-dev-osx-x86_64-<lang>.zip.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
</div>
<a href="<page projects/torbrowser-details>#build">Source Code</a>
@@ -190,6 +193,7 @@
#include <lang.wmi>
</select>
<div class="sig">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundlelinux">Other Languages</a>
(<a class="lin-tbb32-sig" href="../dist/torbrowser/linux/tor-browser-gnu-linux-i686-<version-torbrowserbundlelinux32>-dev-<lang>.tar.gz.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
</div>
@@ -198,6 +202,7 @@
#include <lang.wmi>
</select>
<div class="sig">
+ <a class="lang-alt" href="<page projects/torbrowser>#Download-torbrowserbundlelinux">Other Languages</a>
(<a class="lin-tbb64-sig" href="../dist/torbrowser/linux/tor-browser-gnu-linux-x86_64-<version-torbrowserbundlelinux64>-dev-<lang>.tar.gz.asc">sig</a>) <a class="siginfo" href="<page docs/verifying-signatures>">What's This?</a>
</div>
<a class="additional" href="<page projects/torbrowser-details>#build">Source Code</a>
@@ -267,6 +272,7 @@
<p>The current unstable/alpha version of Tor is <version-alpha>. Its <a href="https://gitweb.torproject.org/tor.git/blob/HEAD:/ChangeLog">Changelog</a> is available.</p>
</div>
</div>
+ <div class="expander"><a href="javascript:void(0)" class="switch">Expand All</a></div>
<!-- END SOURCE -->
<!-- END DOWNLOADS -->
<br>
@@ -360,6 +366,18 @@
<!-- END MAINCOL -->
<!-- START SIDECOL -->
<div id="sidecol-right">
+<div class="img-shadow sidenav">
+<div class="sidenav-sub">
+<h2>Jump To:</h2>
+<ul>
+<li class="dropdown"><a href="<page download/download>#windows">Microsoft Windows</a></li>
+<li class="dropdown"><a href="<page download/download>#apple">Apple OS X</a></li>
+<li class="dropdown"><a href="<page download/download>#linux">Linux/Unix</a></li>
+<li class="dropdown"><a href="<page download/download>#smartphone">Smartphones</a></li>
+<li class="dropdown"><a href="<page download/download>#source">Source Code</a></li>
+</ul>
+</div>
+</div>
<!-- START DONATION WIDGET -->
<script async type="text/javascript">
function displayVals() {
@@ -390,7 +408,7 @@
displayVals();
});
</script>
-<form class="dbox dl" action="https://www.paypal.com/cgi-bin/webscr" method="post">
+<form class="dbox dl" action="https://www.paypal.com/cgi-bin/webscr" method="post" style="float:left; margin-bottom:10px;">
<h2>Donate to Tor</h2>
<p>
<select name="currency_code" class="cur">
Modified: website/trunk/include/dlhead.wmi
===================================================================
--- website/trunk/include/dlhead.wmi 2011-09-28 10:14:02 UTC (rev 25130)
+++ website/trunk/include/dlhead.wmi 2011-09-28 12:48:57 UTC (rev 25131)
@@ -67,15 +67,21 @@
if(pkg == 'win-tbb'){
$('.'+pkg).replaceWith('<a class="button win-tbb" href="'+wintbb+'"><span class="strong">Download</span><span class="normal"><button-win-tbb32></span></a>');
$('.'+pkg+'-sig').replaceWith('<a class="win-tbb-sig" href="'+wintbb+'.asc">sig</a>');
+ $('.mac-alt').replaceWith('<a class="mac-alt" href="'+osxtbb+'">Mac</a>');
+ $('.lin-alt').replaceWith('<a class="lin-alt" href="'+lintbb32+'">Linux</a>');
}else if(pkg == 'osx-tbb'){
$('.'+pkg).replaceWith('<a class="button osx-tbb" href="'+osxtbb+'"><span class="strong">Download</span><span class="normal"><button-osx-tbb32></span></a>');
$('.'+pkg+'-sig').replaceWith('<a class="osx-tbb-sig" href="'+osxtbb+'.asc">sig</a>');
+ $('.win-alt').replaceWith('<a class="lin-win" href="'+wintbb+'">Windows</a>');
+ $('.lin-alt').replaceWith('<a class="lin-alt" href="'+lintbb32+'">Linux</a>');
}else if(pkg == 'osx-tbb64'){
$('.'+pkg).replaceWith('<a class="button osx-tbb64" href="'+osxtbb64+'"><span class="strong">Download</span><span class="normal"><button-osx-tbb64></span></a>');
$('.'+pkg+'-sig').replaceWith('<a class="osx-tbb64-sig" href="'+osxtbb64+'.asc">sig</a>');
}else if(pkg == 'lin-tbb32'){
$('.'+pkg).replaceWith('<a class="button lin-tbb32" href="'+lintbb32+'"><span class="strong">Download</span><span class="normal"><button-lin-tbb32></span></a>');
$('.'+pkg+'-sig').replaceWith('<a class="lin-tbb32-sig" href="'+lintbb32+'.asc">sig</a>');
+ $('.mac-alt').replaceWith('<a class="lin-mac" href="'+osxtbb+'">Mac</a>');
+ $('.win-alt').replaceWith('<a class="lin-win" href="'+wintbb+'">Windows</a>');
}else if(pkg == 'lin-tbb64'){
$('.'+pkg).replaceWith('<a class="button lin-tbb64" href="'+lintbb64+'"><span class="strong">Download</span><span class="normal"><button-lin-tbb64></span></a>');
$('.'+pkg+'-sig').replaceWith('<a class="lin-tbb64-sig" href="'+lintbb64+'.asc">sig</a>');
Modified: website/trunk/js/dlpage01.js
===================================================================
(Binary files differ)
Modified: website/trunk/js/jquery.accordion.min.js
===================================================================
(Binary files differ)
1
0
28 Sep '11
commit 894c0bce3f19ebeea8a6a4438beb699104d71d0d
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Sep 28 11:15:09 2011 +0000
Update translations for orbot
---
values-ar/strings.xml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
values-ca/strings.xml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
values-de/strings.xml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
values-es/strings.xml | 103 +++++++++++++++++++++++++++++++++++++++++++++++++
values-fa/strings.xml | 91 +++++++++++++++++++++++++++++++++++++++++++
values-fr/strings.xml | 95 +++++++++++++++++++++++++++++++++++++++++++++
values-it/strings.xml | 91 +++++++++++++++++++++++++++++++++++++++++++
values-mk/strings.xml | 95 +++++++++++++++++++++++++++++++++++++++++++++
values-nb/strings.xml | 91 +++++++++++++++++++++++++++++++++++++++++++
values-nl/strings.xml | 102 ++++++++++++++++++++++++++++++++++++++++++++++++
values-pl/strings.xml | 95 +++++++++++++++++++++++++++++++++++++++++++++
values-pt/strings.xml | 91 +++++++++++++++++++++++++++++++++++++++++++
values-ru/strings.xml | 95 +++++++++++++++++++++++++++++++++++++++++++++
values-sv/strings.xml | 91 +++++++++++++++++++++++++++++++++++++++++++
values-zh/strings.xml | 94 ++++++++++++++++++++++++++++++++++++++++++++
values/strings.xml | 95 +++++++++++++++++++++++++++++++++++++++++++++
16 files changed, 1538 insertions(+), 0 deletions(-)
diff --git a/values-ar/strings.xml b/values-ar/strings.xml
new file mode 100644
index 0000000..e43e865
--- /dev/null
+++ b/values-ar/strings.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">اوربوت (Orbot)</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">بدء وإيقاف تور</string>
+ <string name="tor_proxy_service_process">خدمة وكيل تور</string>
+ <string name="status_starting_up">اوربوت يبدأ...</string>
+ <string name="status_activated">أنا متصل بشبكة تور</string>
+ <string name="status_disabled">\"تم إيقاف اوربوت</string>
+ <string name="status_shutting_down">جاري إغلاق اوربوت</string>
+ <string name="tor_process_connecting">بدء تور...</string>
+ <string name="tor_process_connecting_step2">ضبط التحكم...</string>
+ <string name="tor_process_connecting_step3">مكتمل.</string>
+ <string name="tor_process_connecting_step4">انتظار.</string>
+ <string name="not_anonymous_yet">تحذير: حركة مرورك ليست خفية الى الآن! من فضلك قم بتكوين التطبيقات الخاصة بك لإستخدام HTTP proxy 127.0.0.1:8118 أو SOCK4A أو SOKS5 127.0.0.1:9050</string>
+ <string name="menu_home">الصفحة الرئيسية</string>
+ <string name="menu_browse">تصفّح</string>
+ <string name="menu_settings">إعدادات</string>
+ <string name="menu_log">السجل</string>
+ <string name="menu_info">مساعدة</string>
+ <string name="menu_apps">تطبيقات</string>
+ <string name="menu_start">بدء</string>
+ <string name="menu_stop">إيقاف</string>
+ <string name="menu_about">حول</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">مساعدة</string>
+ <string name="button_close">إغلاق</string>
+ <string name="button_about">حول</string>
+ <string name="button_clear_log">مسح السجل</string>
+ <string name="menu_verify">فحص</string>
+ <string name="menu_exit">خروج</string>
+ <string name="powered_by">بدعم من مشروع تور</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">عملية توكيل غير مرئية أو ضمنية (يتطلب حقوق المسؤول- Root-)</string>
+ <string name="pref_trans_proxy_title">عملية توكيل غير مرئية أو ضمنية</string>
+ <string name="pref_trans_proxy_summary">عملية توريفاي أوتوماتيكية للتطبيقات</string>
+ <string name="pref_transparent_all_title">تور كل شيء</string>
+ <string name="pref_transparent_all_summary">حركة مرور الوكيل لجميع التطبيقات عبر تور</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">تم تثبيت ثنائيات تور بنجاح!</string>
+ <string name="status_install_fail">غير قادر على تثبيت ملفات ثنائيات تور. يرجى التحقق من السجل وإعلامنا على البريد الإلكتروني tor-assistants(a)torproject.org</string>
+ <string name="title_error">خطأ في التطبيق</string>
+ <string name="wizard_title">مرحبا بك في أوربوت</string>
+ <string name="wizard_btn_tell_me_more">عن أوربوت</string>
+ <string name="btn_next">التالي</string>
+ <string name="btn_back">رجوع</string>
+ <string name="btn_finish">إنهاء</string>
+ <string name="btn_okay">موافق</string>
+ <string name="btn_cancel">إلغاء</string>
+ <string name="wizard_welcome_msg">بفضل أوربوت، صار ممكنا استعمال تور في أندرويد. تور هو برنامج مجاني وشبكة مفتوحة تساعد على حمايتك من مراقبة الشبكات التي تهدد الخصوصية والحرية الشخصية والعلاقات والأنشطة التجارية السرية ورقابة الدول المعروفة بإسم تحليل حركة المرور.
+
+*تحذير: *تثبيت أوربوت على جهازك_لن_يقوم بإخفاء تحركات حركة مرورك بشكل سحري! سوف يساعدك هذا المعالج على البدء.</string>
+ <string name="wizard_details">بعض التفاصيل عن أوربوت</string>
+ <string name="wizard_details_msg">أوربوت هو تطبيق مفتوح المصدر والذي يضم تور, LibEvent وPrixovy. يعمل على توفير وكيل HTTP محلي (8118) ووكيل SOCKS (9050) إلى شبكة تور. يتوفر لدى أوربوت القدرة على إرسال جميع حركات مرور الانترنت من خلال تور على الجهاز ذات حقوق المسؤول (root). </string>
+ <string name="wizard_permissions_root">تم منح الإذن</string>
+ <string name="wizard_permissions_stock">أذونات أوربوت</string>
+ <string name="wizard_premissions_msg_root">ممتاز! لقد وجدنا بأنه لديك أذونات حقوق المسؤول (root) لتمكين أوربوت. سوف نستخدم هذه السلطة بحكمة.</string>
+ <string name="wizard_permissions_msg_stock">رغم أنه ليس ضروريا، يمكن ان يصبح أوربوت أداة قوية إذا كان لدى جهازك صلاحية حقوق المسؤول (root). استخدم الزر بالأسفل لمنح أوربوت قوة أكبر!</string>
+ <string name="wizard_permissions_no_root">إذا لم يكن لديك صلاحية حقوق المسؤول (root) أو ليست لديك أدنى فكرة عما نتحدث عنه، تأكد فقط من استخدام تطبيقات تعمل مع أوربوت.</string>
+ <string name="wizard_permissions_consent">أفهم ذلك وأود أن أستمر بدون حقوق المسؤول (root)</string>
+ <string name="wizard_permission_enable_root">منح أوربوت حقوق المسؤول (root)</string>
+ <string name="wizard_configure">تكوين توريفاي</string>
+ <string name="wizard_configure_msg">أوربوت يعطيك الخيار لتوجيه جميع حركات مرور التطبيقات عبر تور OR لإختيار تطبيقاتك بشكل فردي.</string>
+ <string name="wizard_configure_all">توكيل جميع التطبيقات عبر تور</string>
+ <string name="wizard_configure_select_apps">اختر التطبيقات الفردية لتور</string>
+ <string name="wizard_tips_tricks">تطبيقات مهيئة لأوربوت</string>
+ <string name="wizard_tips_msg">نشجعكم على تحميل واستخدام التطبيقات التي تعرف كيفية الاتصال مباشرة بأوربوت. اضغط على الأزرار في الأسفل للتثبيت.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (أندرويد 1.x فقط) - متصفح مصمّم للخصوصية لأوربوت </string>
+ <string name="wizard_tips_proxy">إعدادات الوكيل - تعلم كيفية تكوين التطبيقات لتعمل مع أوربوت</string>
+ <string name="wizard_proxy_help_info">إعدادات الوكيل</string>
+ <string name="wizard_proxy_help_msg">اذا كان تطبيق أندرويد الذي تستخدمه يمكن ان يدعم استخدام وكيل HTTP او SOCKS , عندها يمكنك تكوينه للإتصال بأوربوت واستخدام تور.
+
+
+ اعدادات المستضيف هي 127.0.0.1 او \"المستضيف المحلي\". بالنسبة الى HTTP, فإن ضبط المنفذ هو 8118. بالنسبة الى SOCKS, فإن الوكيل هو 9050. يجب عليك استخدام SOCKS4A او SOCKS5 اذا امكن.
+
+
+
+ يمكنك معرفة المزيد عن عملية توكيل غير مرئية للأندرويد عن طريق الأسئلة المتداولة (FAQ) في: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">أوربوت جاهز!</string>
+ <string name="wizard_final_msg">مئات الآلاف من الناس في جميع أنحاء العالم يستخدمون تور لأسباب عديدة: الصحفيين والمدونين، والعاملين في مجال حقوق الإنسان، والجنود والشركات والمواطنين من الأنظمة القمعية، والمواطنين العاديين ... والآن أنت مستعد لأن تستخدمه كذلك!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time"> لقد قمت بإتصال ناجح الى شبكة تور - لكن هذا لا يعني بأن جهازك في مأمن. يمكنك استخدام خيار \'تحقق\' من القائمة لإختبار المتصفح الخاص بك.
+
+ قم بزيارتنا على https://guardianproject.info/apps/orbot او ارسل رسالة الكترونية الى help(a)guardianproject.info لمعرفة المزيد.</string>
+ <string name="tor_check">سيؤدي هذا إلى فتح المتصفح الافتراضي الخاص بك على العنوان https://check.torproject.org من اجل التحقق من تكوين أوربوت بشكل صحيح وبأنك متصل بتور.</string>
+ <string name="pref_hs_group">خدمات خفية</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-ca/strings.xml b/values-ca/strings.xml
new file mode 100644
index 0000000..d4bc6d7
--- /dev/null
+++ b/values-ca/strings.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">Engega o atura Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot s\'està iniciant...</string>
+ <string name="status_activated">Connectat a la xarxa Tor</string>
+ <string name="status_disabled">Orbot està desactivat</string>
+ <string name="status_shutting_down">Orbot s\'està aturant</string>
+ <string name="tor_process_connecting">Iniciant Tor...</string>
+ <string name="tor_process_connecting_step2">Preparant el control...</string>
+ <string name="tor_process_connecting_step3">acomplert.</string>
+ <string name="tor_process_connecting_step4">esperant.</string>
+ <string name="not_anonymous_yet">ATENCIÓ : El trànsit de la teva connexió ja no es anònim! Siusplau, configura les teves aplicacions per a usar HTTP proxy 127.0.0.1:8118, per SOCKS4A o SOCKS5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Lloc d\'inici</string>
+ <string name="menu_browse">Navega</string>
+ <string name="menu_settings">Preferències</string>
+ <string name="menu_log">Registre</string>
+ <string name="menu_info">Ajut</string>
+ <string name="menu_apps">Aplicacions</string>
+ <string name="menu_start">Inici</string>
+ <string name="menu_stop">Atura</string>
+ <string name="menu_about">Quant a...</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Ajut</string>
+ <string name="button_close">Tanca</string>
+ <string name="button_about">Quant a...</string>
+ <string name="button_clear_log">Esborra el registre</string>
+ <string name="menu_verify">Prova</string>
+ <string name="menu_exit">Surt</string>
+ <string name="powered_by">Funciona gràcies al Projecte Tor</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Utilitza un proxy transparent (requereix accés)</string>
+ <string name="pref_trans_proxy_title">Utilitza un proxy transparent</string>
+ <string name="pref_trans_proxy_summary">Automatitza Tor per a les aplicacions</string>
+ <string name="pref_transparent_all_title">Automatitza Tor per a tot</string>
+ <string name="pref_transparent_all_summary">Canalitza tot el trànsit de proxy de les aplicacions per Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Binaris de Tor instal·lats correctament!</string>
+ <string name="status_install_fail">Els fitxers binaris de Tor no s\'han pogut instalar. Per favor, comprova el registre i notifica-ho a tor-assistants(a)torproject.org</string>
+ <string name="title_error">Error de l\'aplicació</string>
+ <string name="wizard_title">Benvingut/da a Orbot</string>
+ <string name="wizard_btn_tell_me_more">Quant a Orbot...</string>
+ <string name="btn_next">Següent</string>
+ <string name="btn_back">Enrere</string>
+ <string name="btn_finish">Fi</string>
+ <string name="btn_okay">D\'acord</string>
+ <string name="btn_cancel">Cancel·la</string>
+ <string name="wizard_welcome_msg">Orbot et porta Tor a l\'Android. Tor és programari lliure i una xarxa oberta que t\'ajuda a defensar-te d\'una vigilància a través de la xarxa, amenaçant la teva privacitat i llibertat personal, informació confidencial, activitats i relacions, i seguretat estatal coneguda com anàlisi de trànsit.
+
+*ALERTA:* Instal·lar Orbot _no_ convertirà la teva connexió en anònima instantàniament! Aquest assistent t\'ajudarà a començar.</string>
+ <string name="wizard_details">Alguns detalls d\'Orbot...</string>
+ <string name="wizard_details_msg">Orbot és una aplicació de codi lliure que conté Tor, LibEvent i Privoxy. Proporciona un Proxy HTTP local (8118) i un proxy SOCKS (9050) a la xarxa Tor. Orbot també té capacitat d\'enviar tot el trànsit de dades d\'internet a través de Tor.</string>
+ <string name="wizard_permissions_root">Permís concedit</string>
+ <string name="wizard_permissions_stock">Permisos d\'Orbot</string>
+ <string name="wizard_premissions_msg_root">Perfecte! Hem detectat que tens els permisos matriu activats per a Orbot. Utilitzarem aquest poder sàviament.</string>
+ <string name="wizard_permissions_msg_stock">Encara que no és imprescindible, Orbot pot esdevenir una eina molt més potent si el teu terminal té accés complet. Utilitza el botó d\'aquí sota per conferir superpoders a Orbot!</string>
+ <string name="wizard_permissions_no_root">Si no tens accés complet, o no tens ni idea del què t\'estem parlant, simplement assegura\'t d\'utilitzar aplicacions fetes per a funcionar amb Orbot.</string>
+ <string name="wizard_permissions_consent">Ho entenc i vull continuar sense accés complet.</string>
+ <string name="wizard_permission_enable_root">Concedeix accés complet a Orbot</string>
+ <string name="wizard_configure">Configura la connexió a Tor</string>
+ <string name="wizard_configure_msg">Orbot t\'ofereix l\'opció de conduir el trànsit de totes les aplicacions per Tor o bé escollir quines aplicacions vols utilitzar amb Tor.</string>
+ <string name="wizard_configure_all">Connecta totes les aplicacions per Proxy per Tor.</string>
+ <string name="wizard_configure_select_apps">Selecciona aplicacions individuals per a funcionar amb Tor</string>
+ <string name="wizard_tips_tricks">Aplicacions per a usar-se amb Orbot</string>
+ <string name="wizard_tips_msg">T\'animem a descarregar-te &amp; utilitza aplicacions que sàpiguen com connectar-se directament a Orbot. Fes clic als botons de sota per instal·lar.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Només Android 1.x) - Navegador dissenyat per la privacitat &amp; per a Orbot</string>
+ <string name="wizard_tips_proxy">Coniguració de Proxy - Aprèn a configurar aplicacions per a què funcionin amb Orbot</string>
+ <string name="wizard_proxy_help_info">Configuració de Proxy</string>
+ <string name="wizard_proxy_help_msg">Si l\'aplicació d\'Android que estàs utilitzant admet l\'ús d\'un proxy HTTP o SOCKS, pots configurar-la per a connectar-se a Orbot i utilitzar Tor.
+
+
+La configuració de l\'amfitrió és 127.0.0.1 o \"localhost\". Per a HTTP, el port actiu és 8118. Per a SOCKS, el proxy és 9050. Hauries d\'utlitzar SOCKS4A o SOCKS5 si és possible.
+
+
+
+Pots aprendre més coses sobre l\'ús dels proxys a Android al FAQ de: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Orbot és a punt!</string>
+ <string name="wizard_final_msg">Centenars de milers de persones arreu del món utilitzen Tor per un gran ventall de raons: periodistes i blocaires, treballadors pels drets humans, agents de l\'autoritat, soldats, corporacions, ciutadans de règims opressors, i ciutadans qualssevol... I ara tu també ho pots fer!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">T\'has connectat correctament a la xarxa Tor, però això NO vol dir que el teu dispositiu sigui segur. Pots utilitzar la opció \'Comprova\' del menú per provar el teu navegador.
+
+Visita\'ns a https://guardianproject.info/apps/orbot o envia\'ns un correu electrònic a help(a)guardianproject.info per a saber-ne més.</string>
+ <string name="tor_check">Això obrirà el teu navegador web per defecte i es connectarà a https://check.torproject.org per tal de comprovar si Orbot està configurat correctament i estàs connectat/da a Tor.</string>
+ <string name="pref_hs_group">Serveis ocults</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-de/strings.xml b/values-de/strings.xml
new file mode 100644
index 0000000..0cd9792
--- /dev/null
+++ b/values-de/strings.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">starte und beende Tor</string>
+ <string name="tor_proxy_service_process">Tor Proxydienst</string>
+ <string name="status_starting_up">Orbot startet...</string>
+ <string name="status_activated">Verbunden mit dem Tor-Netzwerk</string>
+ <string name="status_disabled">\"Orbot ist deaktiviert</string>
+ <string name="status_shutting_down">Orbot wird beendet</string>
+ <string name="tor_process_connecting">Starte Tor...</string>
+ <string name="tor_process_connecting_step2">Baue Kontrollverbindung auf...</string>
+ <string name="tor_process_connecting_step3">erfolgreich abgeschlossen.</string>
+ <string name="tor_process_connecting_step4">warte.</string>
+ <string name="not_anonymous_yet">WARNUNG: Ihr Datenverkehr ist noch nicht anonymisiert! Bitte stellen Sie Ihre Programme so ein, dass sie entweder den HTTP Proxy 127.0.0.1:8118 oder den SOCKS4A bzw. SOCKS5 Proxy 127.0.0.1:9050 nutzen.</string>
+ <string name="menu_home">Home</string>
+ <string name="menu_browse">Durchstöbern</string>
+ <string name="menu_settings">Einstellungen</string>
+ <string name="menu_log">Log</string>
+ <string name="menu_info">Hilfe</string>
+ <string name="menu_apps">Apps</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stop</string>
+ <string name="menu_about">Über</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Hilfe</string>
+ <string name="button_close">Schließen</string>
+ <string name="button_about">Über</string>
+ <string name="button_clear_log">Log löschen</string>
+ <string name="menu_verify">Überprüfen</string>
+ <string name="menu_exit">Beenden</string>
+ <string name="powered_by">ermöglicht durch das Tor Projekt</string>
+ <string name="press_to_start">- Lang drücken zum starten -</string>
+ <string name="pref_trans_proxy_group">Transparenter Proxy (benötigt Administratorrechte)</string>
+ <string name="pref_trans_proxy_title">Transparenter Proxy</string>
+ <string name="pref_trans_proxy_summary">Anwendungen automatisch durch Tor leiten</string>
+ <string name="pref_transparent_all_title">Alles durch Tor leiten</string>
+ <string name="pref_transparent_all_summary">Verbindungen aller Anwendungen durch Tor leiten</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNUNG: Umgeht öffentliche Ports (80, 443, etc). *NUR BENUTZEN* wenn \'All\' oder \'App\' modus nicht funktioniert.</string>
+ <string name="pref_transparent_port_title">Port-Liste</string>
+ <string name="pref_transparent_port_summary">Liste von Ports für Proxy. *NUR BENUTZEN* wenn \'All\' oder \'App\' modus nicht funktioniert</string>
+ <string name="pref_transparent_port_dialog">Eingabe der Ports für Proxy</string>
+ <string name="pref_has_root">Anfrage auf Root Zugriff</string>
+ <string name="pref_has_root_summary">Anfrage auf Root Zugriff für Transperente Proxys</string>
+ <string name="status_install_success">Die Tor-Pakete wurden erfolgreich installiert!</string>
+ <string name="status_install_fail">Die Tor-Pakete konnten nicht erfolgreich installiert werden. Bitte prüfen Sie das Logfile und wenden Sie sich an tor-assistants(a)torproject.org.</string>
+ <string name="title_error">Anwendungsfehler</string>
+ <string name="wizard_title">Willkommen bei Orbot</string>
+ <string name="wizard_btn_tell_me_more">Über Orbot</string>
+ <string name="btn_next">Weiter</string>
+ <string name="btn_back">Zurück</string>
+ <string name="btn_finish">Fertigstellen</string>
+ <string name="btn_okay">OK</string>
+ <string name="btn_cancel">Abbrechen</string>
+ <string name="wizard_welcome_msg">Orbot bringt Tor auf Android Geräte. Tor ist ein freies Programm und ein offenes Netzwerk, dass Ihnen hilft sich gegen Datenverkehrsüberwachung zu wehren, eine Form der Onlineüberwachung, die Ihre persönliche Freiheit, Privatsphäre, vertrauliche Geschäfte und Geschäftseziehungen bedroht.
+
+*WARNUNG:* Durch die Installation von Orbot wird _nicht_ sofort Ihr kompletter Datenverkehr anonymisiert! Hilfestellung erhalten Sie von diesem Assistenten.</string>
+ <string name="wizard_details">Nähere Informationen zu Orbot</string>
+ <string name="wizard_details_msg">Orbot ist eine quelloffene Anwendung die Tor, LibEvent und Privoxy enthält. Es stellt einen lokalen HTTP Proxy (8118) und einen SOCKS Proxy (9050) zum Tor-Netzwerk zur Verfügung. Orbot hat auf einem System mit Administrationsrechten auch die Fähigkeit, jeglichen Internetverkehr über das Tor-Netzwerk abzuwickeln.</string>
+ <string name="wizard_permissions_root">Erlaubnis erteilt</string>
+ <string name="wizard_permissions_stock">Orbot Rechte</string>
+ <string name="wizard_premissions_msg_root">Exzellent! Wir haben festgestellt, dass Sie Orbot Administrator-Rechte eingeräumt haben. Wir werden diese Macht weise nutzen.</string>
+ <string name="wizard_permissions_msg_stock">Obwohl es nicht nötig ist, kann Orbot ein mächtigeres Tool werden, wenn Sie ihm Administrator-Rechte einräumen. Drücken Sie auf den Kopf unten um Orbot diese Superkräfte einzuräumen.</string>
+ <string name="wizard_permissions_no_root">Falls Sie keinen Administrator-Zugang haben oder nicht wissen was das ist, stellen Sie sicher, dass Sie Anwendungen benutzen die mit Orbot kompatibel können.</string>
+ <string name="wizard_permissions_consent">Ich habe verstanden und möchte ohne Administrator-Rechte weitermachen.</string>
+ <string name="wizard_permission_enable_root">Orbot Administrator-Rechte einräumen</string>
+ <string name="wizard_configure">Torification konfigurieren</string>
+ <string name="wizard_configure_msg">Orbot gibt Ihnen die Wahl den Datenverkehr aller Programme durch Tor zu leiten ODER die Wahl für alle Programme einzeln zu treffen.</string>
+ <string name="wizard_configure_all">Den Verkehr aller Programme durch Tor leiten</string>
+ <string name="wizard_configure_select_apps">Programme einzeln wählen</string>
+ <string name="wizard_tips_tricks">Programme, für die Orbot aktiviert ist</string>
+ <string name="wizard_tips_msg">Wir raten Ihnen Programme herunterzuladen &amp; zu nutzen, die wissen, wie sie sich direkt mit Orbot verbinden. Klicken Sie zum Installieren auf den Knopf unten.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Ein sicheres Instant-Messaging Programm für Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Nur Android 1.x) - Ein für Privatsphäre &amp; Orbot entworfener Browser</string>
+ <string name="wizard_tips_proxy">Proxy-Einstellungen - Lernen Sie Anwendungen so zu konfigurieren, dass sie mit Orbot zusammenarbeiten.</string>
+ <string name="wizard_proxy_help_info">Proxy-Einstellungen</string>
+ <string name="wizard_proxy_help_msg">Wenn das Android-Programm, das Sie benutzten die Verwendung von HTTP- oder SOCKS-Proxys unterstützt, können Sie es konfigurieren sich mit Orbot zu verbinden und Tor zu nutzen.
+
+
+Die Host-Einstellungen sind 127.0.0.1 oder \"localhost\". Die Port-Einstellungen sind 8118 für HTTP und 9050 für SOCKS. Sie sollten versuchen SOCKS4A oder SOCKS5 zu benutzen.
+
+
+
+Erfahren Sie mehr über die Verwendung von Proxys unter Android in den FAQ unter http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Orbot ist bereit!</string>
+ <string name="wizard_final_msg">Hunderttausende Menschen auf der ganzen Welt nutzen Tor aus einer Vielzahl von Gründen: Journalisten und Blogger, Menschenrechtsaktivisten, Strafverfolgungsbehörden, Soldaten, Unternehmen, Bürger repressiver Regime und ganz normale Menschen... und sind Sie ebenfalls bereit!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">Sie haben sich erfolgreich mit dem Tor-Netzwerk verbunden - das bedeutet aber NICHT, dass Ihr Gerät sicher ist. Sie können die \'Überprüfen\'-Option aus dem Menü benutzen, um Ihren Browser zu testen.
+
+Besuchen Sie https://guardianproject.info/apps/orbot oder senden Sie eine E-Mail an help(a)guardianproject.info um mehr darüber zu erfahren.</string>
+ <string name="tor_check">Hiermit wird die Seite https://check.torproject.org in Ihrem Webbrowser geöffnet, so dass Sie überprüfen können, ob Orbot richtig configuriert ist und Sie mit Tor verbunden sind.</string>
+ <string name="pref_hs_group">Versteckte Dienste</string>
+ <string name="pref_general_group">Allgemein</string>
+ <string name="pref_start_boot_title">Orbot beim Systemstart ausführen</string>
+ <string name="pref_start_boot_summary">Automatisches starten von Orbor und verbinden von Tor, wenn dein Android-Gerät startet</string>
+</resources>
diff --git a/values-es/strings.xml b/values-es/strings.xml
new file mode 100644
index 0000000..065c81d
--- /dev/null
+++ b/values-es/strings.xml
@@ -0,0 +1,103 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">iniciar y detener Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot está iniciando...</string>
+ <string name="status_activated">Conectado a la Red de Tor</string>
+ <string name="status_disabled">\"Orbot está desactivado</string>
+ <string name="status_shutting_down">Orbot se está cerrando</string>
+ <string name="tor_process_connecting">Iniciando Tor...</string>
+ <string name="tor_process_connecting_step2">Configurción de control...</string>
+ <string name="tor_process_connecting_step3">completo.</string>
+ <string name="tor_process_connecting_step4">esperando.</string>
+ <string name="not_anonymous_yet">ADVERTENCIA: ¡Su tráfico no es anónimo aún! Por favor, configure sus aplicaciones para usar el Proxy HTTP 127.0.0.1:8118, el SOCKS4A o el Proxy SOCKS5 127.0.0.1:9050</string>
+ <string name="menu_home">Principal</string>
+ <string name="menu_browse">Examinar</string>
+ <string name="menu_settings">Configuración</string>
+ <string name="menu_log">Historial</string>
+ <string name="menu_info">Ayuda</string>
+ <string name="menu_apps">Aplicaciones</string>
+ <string name="menu_start">Iniciar</string>
+ <string name="menu_stop">Detener</string>
+ <string name="menu_about">Acerca de</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Ayuda</string>
+ <string name="button_close">Cerrar</string>
+ <string name="button_about">Acerca de</string>
+ <string name="button_clear_log">Limpiar Historial</string>
+ <string name="menu_verify">Comprobar</string>
+ <string name="menu_exit">Salir</string>
+ <string name="powered_by">potenciado por Tor Project</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Proxy transparente (Requiere ser Administrador)</string>
+ <string name="pref_trans_proxy_title">Proxy transparente</string>
+ <string name="pref_trans_proxy_summary">Torificado automático de las Aplicaciones</string>
+ <string name="pref_transparent_all_title">Pasar todo el tráfico por Tor</string>
+ <string name="pref_transparent_all_summary">Tráfico Proxy para todas las aplicaciones mediante Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">¡Binarios de Tor instalados con éxito!</string>
+ <string name="status_install_fail">Los archivos binarios de Tor no se han podido instalar. Por favor, verifique el Historial y notifique a: tor-assistants(a)torproject.org</string>
+ <string name="title_error">Error de aplicación</string>
+ <string name="wizard_title">Bienvenido a Orbot</string>
+ <string name="wizard_btn_tell_me_more">Acerca de Orbot</string>
+ <string name="btn_next">Siguiente</string>
+ <string name="btn_back">Atrás</string>
+ <string name="btn_finish">Finalizar</string>
+ <string name="btn_okay">OK</string>
+ <string name="btn_cancel">Cancelar</string>
+ <string name="wizard_welcome_msg">Orbot proporciona Tor a Android. Tor es un software libre y una red abierta que le ayuda a defenderse contra una forma de vigilancia que amenaza su libertad y privacidad personal, la confidencialidad en los negocios y en las relaciones, y la seguridad del Estado conocida como análisis de tráfico.
+
+*ADVERTENCIA:* ¡Instalando Orbot _NO_ anonimizará mágicamente su tráfico del móvil! Este assitente le ayudará a empezar.</string>
+ <string name="wizard_details">Algunos detalles de Orbot</string>
+ <string name="wizard_details_msg">Orbot es una aplicación de código abierto que contiene Tor, LibEvent y Privoxy. Provee un Proxy HTTP local (8118) y un Proxy SOCKS (9050) en la red Tor. Orbot también tiene la habilidad, en un dispositivo enrutador, de enviar todo el tráfico de Internet a través de Tor.</string>
+ <string name="wizard_permissions_root">Permiso Concedido</string>
+ <string name="wizard_permissions_stock">Permisos de Orbot</string>
+ <string name="wizard_premissions_msg_root">¡Excelente! Hemos detectado que usted tiene permisos administravitos activados para Orbot. Utilizaremos estos poderes sabiamente.</string>
+ <string name="wizard_permissions_msg_stock">Mientras no sea requerido, Orbot puede convertirse en una herramienta aún más poderosa si su dispositivo tiene acceso de administrador. Utilice el botón a continuación para conceder superpoderes a Orbot</string>
+ <string name="wizard_permissions_no_root">Si no tiene acceso de admnistrador o no tiene idea de qué estamos hablando, sólo asegúrese de utilizar aplicaciones hechas para trabajar con Orbot.</string>
+ <string name="wizard_permissions_consent">Comprendo y quiero continuar sin poderes administrativos</string>
+ <string name="wizard_permission_enable_root">Conceder poderes administrativos a Orbot</string>
+ <string name="wizard_configure">Configurar Torificación</string>
+ <string name="wizard_configure_msg">Orbot le da la opción de dirigir todo el tráfico de las aplicaciones a través de Tor O de seleccionar sus aplicaciones individualmente.</string>
+ <string name="wizard_configure_all">Configurar Proxy para todas las aplicaciones a través de Tor</string>
+ <string name="wizard_configure_select_apps">Seleccionar aplicaciones individualmente para Tor</string>
+ <string name="wizard_tips_tricks">Aplicaciones activas en Orbot</string>
+ <string name="wizard_tips_msg">Le invitamos a descargar y utilizar aplicaciones que saben cómo conectarse directamente a Orbot. Haga clic en los botones a continuación para Instalar.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Sólo Android 1.x) - Navegador diseñado para la privacidad y para Orbot</string>
+ <string name="wizard_tips_proxy">Configuraciones Proxy - Aprenda cómo configurar aplicaciones para que trabajen con Orbot</string>
+ <string name="wizard_proxy_help_info">Configuraciones Proxy</string>
+ <string name="wizard_proxy_help_msg">Si la aplicación Android que está utilizando puede soportar el uso de un Proxy HTTP o SOCKS, entonces puede configurarla para conectar a Orbot y utilizar Tor.
+
+
+La configuración del dominio es 127.0.0.1 o \"localhost\". Para HTTP, la configuración del puerto es 8118. Para SOCKS, el proxy es 9050. Puede utilizar SOCKS4A o SOCKS5 si es posible.
+
+
+
+Puede aprender más acerca de los proxys en Android a través de las Preguntas Frecuentes ubicadas en: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">¡Orbot está listo!</string>
+ <string name="wizard_final_msg">Cientos de miles de personas alrededor del mundo usan Tor por una amplia variedad de razones: periodistas y bloggers, trabajadores de los derechos humanos, oficiales de policía, soldados, corporaciones, ciudadanos de regímenes represivos y ciudadanos ordinarios... ¡y ahora también lo estás!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">Se ha conectado con éxito a la red Tor, pero eso NO significa que su dispositivo es seguro. Puede utilizar la opción \'Comprobar\' desde el menú para probar su navegador.
+
+Visítenos en https://guardianproject.info/apps/orbot o envíenos un correo electrónico a help(a)guardianproject.info para aprender más.</string>
+ <string name="tor_check">Esto abrirá https://check.torproject.org en su navegador predeterminado con el fin de comprobar si Orbot está configurado y si está conectado a Tor.</string>
+ <string name="pref_hs_group">Servicios Ocultados</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-fa/strings.xml b/values-fa/strings.xml
new file mode 100644
index 0000000..ee5a5f5
--- /dev/null
+++ b/values-fa/strings.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">اوربات</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">شروع و پایان Tor</string>
+ <string name="tor_proxy_service_process">سرويس پروكسي تُر</string>
+ <string name="status_starting_up">Orbat آغاز می شود..</string>
+ <string name="status_activated">پیوسته به شبکه ی Tor</string>
+ <string name="status_disabled">اوربات غیرفعال شده است.</string>
+ <string name="status_shutting_down">اوربات در حال بسته شدن است.</string>
+ <string name="tor_process_connecting">شروع تُر ...</string>
+ <string name="tor_process_connecting_step2">راه اندازی نظارت...</string>
+ <string name="tor_process_connecting_step3">كامل شد.</string>
+ <string name="tor_process_connecting_step4">در انتظار.</string>
+ <string name="not_anonymous_yet">هشدار: فعالیت شما هنوز \"گمنام\" نیست! لطفن اپلیکیشن خود را تنظیم کنید تا از HTTP پروکسی 127.0.0.1:8118 و یا SOCKS4A و یا SOCKS5 پروکسی 127.0.01:9050 استفاده کند.</string>
+ <string name="menu_home">خانه</string>
+ <string name="menu_browse">جستجو</string>
+ <string name="menu_settings">تنظیمات</string>
+ <string name="menu_log">ورود</string>
+ <string name="menu_info">کمک</string>
+ <string name="menu_apps">واژ ه نامه</string>
+ <string name="menu_start">آغاز</string>
+ <string name="menu_stop">ایست</string>
+ <string name="menu_about">درباره</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">کمک</string>
+ <string name="button_close">بسته</string>
+ <string name="button_about">درباره</string>
+ <string name="button_clear_log">Clear Log</string>
+ <string name="menu_verify">بررسی</string>
+ <string name="menu_exit">خروج</string>
+ <string name="powered_by">فعال شده توسط Tor Project</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">پروکسیدن شفاف (نیاز به Root دارد)</string>
+ <string name="pref_trans_proxy_title">پروکسیدن شفاف</string>
+ <string name="pref_trans_proxy_summary">Tori-نمایی اتوماتیک اپلیکیشن ها</string>
+ <string name="pref_transparent_all_title">شامل همه</string>
+ <string name="pref_transparent_all_summary">فعالیت همه اپلیکیشن ها را از طریق Tor پروکسی کنید.</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">دوتایی های Tor با موفقیت نصب شدند!</string>
+ <string name="status_install_fail">نصب فایل های دوتایی Tor ممکن نبود. لطفن قطعه را وارسی کنید و به tor-assistance(a)torproject.org اطلاع دهید.</string>
+ <string name="title_error">خطای اپلیکیشین</string>
+ <string name="wizard_title">به اوربات خوش آمدید</string>
+ <string name="wizard_btn_tell_me_more">درباره اوربات</string>
+ <string name="btn_next">بعدی</string>
+ <string name="btn_back">بازگشت</string>
+ <string name="btn_finish">پایان</string>
+ <string name="btn_okay">لغو</string>
+ <string name="btn_cancel">لغو</string>
+ <string name="wizard_welcome_msg">اوربات Tor را به آندرونید وارد می کند. Tor نرم افزاری رایگان و شبکه ای باز است که در مقابل تهدید شبکه های نظارتی علیه آزادی و حریم فردی، فعالیت ها و روابط محرمانه شرکت ها، و امنیت ملی، که \"کاوش فعالیت\" معروف است، به شما کمک می کند. *هشدار:* نصب اوربات به تنهایی قادر نیست معجزه ای صورت دهد و فعالیت آنلاین شما را مخفی کند! این ابزار تنها کمک می کند که قدم اول را بردارید.</string>
+ <string name="wizard_details">برخی جزئیات در مورد اوربات</string>
+ <string name="wizard_details_msg">اوربات اپلیکیشنی با متن-باز است که شامل Tor, LibEvent و Privoxy. این اپلیکیشن، HTTP پروکسی (8118) محلی و SOCKS پروکسی (9050) را در شبکه Tor در دسترس قرار می دهد. اوربات همچنین قادر است بر روی ابزار root شده، تمام ترافیک اینترنت را از Tor ارسال کند.</string>
+ <string name="wizard_permissions_root">مجوز صادر گردید</string>
+ <string name="wizard_permissions_stock">مجوزهای اوربات</string>
+ <string name="wizard_premissions_msg_root">بسیار عالی! اینطور که معلوم است شما دارای مجوز root برای فعال کردن اوربات هستید. این امکان را بخوبی مورد استفاده قرار خواهیم داد. </string>
+ <string name="wizard_permissions_msg_stock">هرچند ضرورت ندارد اما اگر سیستم شما دارای دسترسی root باشد اوربات با ظرفیت بسیار بیشتری عمل خواهد کرد. دکمه زیر را فشار دهید تا اوربات دارای ظرفیت حداکثری بشود.</string>
+ <string name="wizard_permissions_no_root">اگر سیستم شما دارای دسترسی root نیست و یا اصلن چیزی از این عبارت متوجه نمی شوید، حتمن سعی کنید از اپلکیشن هایی استفاده کنید که ویژه اوربات تهیه شده اند. </string>
+ <string name="wizard_permissions_consent">متوجه هستم و ترجیح می دهم بدون root ادامه بدهم.</string>
+ <string name="wizard_permission_enable_root">واگذاری root برای اوربات</string>
+ <string name="wizard_configure">تنظیمات تبدیل به Tor</string>
+ <string name="wizard_configure_msg">اوربات به شما امکان می دهد که تمام اپلیکشین ها را از طریق Tor منتقل کنید و یا اپلیکیشن مورد نظر خود را شخصن انتخاب کنید.</string>
+ <string name="wizard_configure_all">تمام اپلیکیشن ها را از طریق Tor منتقل کنید.</string>
+ <string name="wizard_configure_select_apps">اپلیکیشن های منفرد برای Tor انتخاب کنید.</string>
+ <string name="wizard_tips_tricks">اپلیکیشن هایی که برای اوربات تنظیم شده اند</string>
+ <string name="wizard_tips_msg">توصیه می کنیم داون لود و فعال کنید؛ اپلیکیشن هایی را استفاده کنید که مستقیم به اوربات وصل می شوند. دکمه های زیر را فشار دهید تا نصب شود. </string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (فقط آندروید 1.x) - مرورگر طراحی شده برای حفظ حریم خصوصی و افزونساز اوربات</string>
+ <string name="wizard_tips_proxy">تنظیمات پروکسی - یادگیری تنظیم اپلیکیشن ها برای کار با اوربات</string>
+ <string name="wizard_proxy_help_info">تنظیمات پروکسی</string>
+ <string name="wizard_proxy_help_msg">اگر اپلیکشین آندرونوید مورد استفاده شما قابلیت کار با HTTP و یا SOCKS پروکسی دارد می توانید تنظیمش کنید تا به اوربات وصل شود و از Tor استفاده کند. تنظیمات سرویس دهنده 127.0.0.1 و یا \"سرویس-ده محلی\" است. برای HTTP تنظیمات درگاه (port) 8118 است. برای SOCKS، پروکسی مناسب، 9050 است. شما می بایست SOCKS4A و یا در صورت امکان از socks5 استفاده کنید. در صورت نیاز به اطلاعات بیشتر در مورد انتقالده آندروید، می توانید به FAQ (سوالهای معمول) در http://tinyurl.com/proxyandroid مراجعه کنید.</string>
+ <string name="wizard_final">اوربات آماده استفاده میباشد!</string>
+ <string name="wizard_final_msg">صدها هزار نفر در سراسر جهان به دلایل گوناگون از Tor استفاده می کنند: روزنامه نویسها و بلاگرها، کارکنان حقوق بشر، ماموران انتظامی، سربازان، شرکتها، شهروندان دولتهای سرکوبگر، و شهروندان عادی، و حالا شما نیز آماده استفاده از آن هستید!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">اکنون با موفقیت به شبکه Tor وصل شده اید اما به آن معنا نیست که سیستم شما ایمن است. می توانید از منیو گزینه /\"Check/\" را برای آزمایش مرورگر انتخاب کنید. به ما در صفحه https://guardianproject.info/apps/orbot مراجعه کنید و به آدرس help(a)guardianproject.info ایمیلی بفرستید تا اطلاعات بیشتری دریافت کنید. </string>
+ <string name="tor_check">با این قدم پیشفرض مرورگر وب شما به صفحه https://check.torproject.org باز می شود تا شما مشاهده کنید آیا اوربات تنظیم شده است و آیا شما به Tor وصل شده اید یا نه.</string>
+ <string name="pref_hs_group">سرويس هاي مخفي</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-fr/strings.xml b/values-fr/strings.xml
new file mode 100644
index 0000000..78b44b3
--- /dev/null
+++ b/values-fr/strings.xml
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">démarrer et arrêter Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot démarre...</string>
+ <string name="status_activated">Connecté au réseau Tor</string>
+ <string name="status_disabled">\"Orbot est désactivé</string>
+ <string name="status_shutting_down">Orbot s\'arrête</string>
+ <string name="tor_process_connecting">Démarrage de Tor...</string>
+ <string name="tor_process_connecting_step2">Configuration en cours...</string>
+ <string name="tor_process_connecting_step3">effectué.</string>
+ <string name="tor_process_connecting_step4">en attente.</string>
+ <string name="not_anonymous_yet">AVERTISSEMENT: Votre traffic n\'est pas encore anonyme ! Veuillez configurer vos applications pour qu\'elles utilisent le proxy HTTP à 127.0.0.1:8118 ou le proxy SOCKS4A ou SOCKS5 à 127.0.0.1:9050</string>
+ <string name="menu_home">Accueil</string>
+ <string name="menu_browse">Parcourir</string>
+ <string name="menu_settings">Paramètres</string>
+ <string name="menu_log">Journal</string>
+ <string name="menu_info">Aide</string>
+ <string name="menu_apps">Applications</string>
+ <string name="menu_start">Démarrer</string>
+ <string name="menu_stop">Arrêter</string>
+ <string name="menu_about">À propos</string>
+ <string name="menu_wizard">Assistant</string>
+ <string name="button_help">Aide</string>
+ <string name="button_close">Fermer</string>
+ <string name="button_about">À propos</string>
+ <string name="button_clear_log">Effacer le journal</string>
+ <string name="menu_verify">Vérifier</string>
+ <string name="menu_exit">Sortie</string>
+ <string name="powered_by">propulsé par le Projet Tor </string>
+ <string name="press_to_start">- appuyez longtemps pour démarrer -</string>
+ <string name="pref_trans_proxy_group">Proxy transparent (accès privilègié requis) </string>
+ <string name="pref_trans_proxy_title">Proxy transparent</string>
+ <string name="pref_trans_proxy_summary">Torifaction automatique des applications</string>
+ <string name="pref_transparent_all_title">Tout passer par Tor</string>
+ <string name="pref_transparent_all_summary">Passer le trafic de toutes les applications par Tor</string>
+ <string name="pref_transparent_port_fallback_title">Mode proxy de secours</string>
+ <string name="pref_transparent_port_fallback_summary">ATTENTION : Contourne les ports communs (80, 443, etc). *À N\'UTILISER QUE* si les modes \'Tout \' ou \'Application\' ne fonctionnent pas.</string>
+ <string name="pref_transparent_port_title">Liste des ports</string>
+ <string name="pref_transparent_port_summary">Liste des ports vers le proxy. *À N\'UTILISER QUE* si les modes \'Tout \' ou \'Application\' ne fonctionnent pas.</string>
+ <string name="pref_transparent_port_dialog">Entrez les ports vers le proxy</string>
+ <string name="pref_has_root">Demander un accès privilégié</string>
+ <string name="pref_has_root_summary">Demande un accès privilégié pour le proxy transparent</string>
+ <string name="status_install_success">Tor a été installé avec succès !</string>
+ <string name="status_install_fail">Tor n\'a pas pu installé. S\'il vous plaît, vérifiez le fichier journal et contactez tor-assistants(a)torproject.org</string>
+ <string name="title_error">Erreur de l\'application</string>
+ <string name="wizard_title">Bienvenue dans Orbot</string>
+ <string name="wizard_btn_tell_me_more">À propos de Orbot</string>
+ <string name="btn_next">Suivant</string>
+ <string name="btn_back">Précédent</string>
+ <string name="btn_finish">Fin</string>
+ <string name="btn_okay">Valider</string>
+ <string name="btn_cancel">Annuler</string>
+ <string name="wizard_welcome_msg">Orbot permet de fournir les services de Tor à Android. Tor est un logiciel libre et un réseau ouvert qui aide à vous défendre contre une forme de surveillance des réseaux informatiques qui menace les libertés individuelles et l\'anonymat, la confidentialité des activités d\'affaires et des relations interpersonnelles, et la sécurité des gouvernements, connu sous le nom d\'analyse de trafic \ n \ n * AVERTISSEMENT : * Il ne suffit pas d\'installer Orbot pour que votre trafic mobile soit anonymisé ! Cet assistant va vous y aider.</string>
+ <string name="wizard_details">Quelques détails sur Orbot</string>
+ <string name="wizard_details_msg">Orbot est une application logicielle libre qui contient Tor, LibEvent et Privoxy. Il fournit un proxy local HTTP (8118) et un proxy SOCKS (9050) dans le réseau Tor. Orbot a aussi la capacité, avec les droits administrateurs, d\'envoyer tout le trafic Internet à travers Tor.</string>
+ <string name="wizard_permissions_root">Permission accordée</string>
+ <string name="wizard_permissions_stock">Permissions d\'Orbot</string>
+ <string name="wizard_premissions_msg_root">Excellent ! Nous avons détecté que vous avez donné les droits privilégiés pour Orbot. Nous utiliserions ces droits avec sagesse.</string>
+ <string name="wizard_permissions_msg_stock"> Bien que cela ne soit pas nécessaire, Orbot peut devenir un outil bien plus utile si vous lui donnez un accès privilégié. Utilisez le bouton ci-dessous pour donner à Orbot de grands pouvoirs ! </string>
+ <string name="wizard_permissions_no_root">Si vous n\'avez pas d\'accès privilégié ou n\'avez pas idée de ce que cela est, vérifiez bien que vous utilisez des applications conçues pour fonctionner avec Orbot.</string>
+ <string name="wizard_permissions_consent">Je comprends et je souhaite continuer sans les droits privilégiés</string>
+ <string name="wizard_permission_enable_root">Donner les droits privilégiés à Orbot</string>
+ <string name="wizard_configure">Configurer la Torification</string>
+ <string name="wizard_configure_msg">Orbot vous donne le choix entre faire passer le trafic de toutes les applications à travers Tor OU de choisir pour chaque application</string>
+ <string name="wizard_configure_all">Toutes les applications par Tor</string>
+ <string name="wizard_configure_select_apps">Choisir les applications utilisant Tor</string>
+ <string name="wizard_tips_tricks">Applications avec Orbot</string>
+ <string name="wizard_tips_msg">Nous vous encouragons à télécharger &amp; utiliser les applications conçues pour se connecter directement à Orbot. Cliquez sur les boutons ci-dessous pour installer.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Client de messagerie instantanée pour Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Android 1.x seulement) - navigateur créé pour protéger votre vie privée &amp; pour Orbot</string>
+ <string name="wizard_tips_proxy">Configuration du proxy - Apprendre comment configurer les applications pour qu\'elles fonctionnent avec Orbot</string>
+ <string name="wizard_proxy_help_info">Configuration du proxy</string>
+ <string name="wizard_proxy_help_msg">Si l\'application Android que vous utilisez peut supporter un proxy HTTP ou un proxy SOCKS, vous pouvez la configurer pour se connecter à Orbot et utiliser Tor./n/n
+ La configuration de l\'hôte est 127.0.0.1 ou \"localhost\". Pour le HTTP, le port utilisé est le 8118. Pour SOCKS, le port utilisé est 9050. Vous devriez, si possible, utiliser SOCKS4A ou SOCKS5.
+ /n/n
+ Vous pouvez en apprendre plus sur la configuration de proxy sous Android sur la FAQ à : http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Orbot est prêt!</string>
+ <string name="wizard_final_msg">Des milliers de personnes dans le monde utilisent Tor pour une grande variétés de raisons : journalistes et bloggers, défenseurs des droits de l\'homme, policiers, soldats, entreprises, les citoyens de régimes répressifs, et aussi de simples citoyens ... et maintenant vous êtes prêts aussi !</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time"> Vous êtes connectés avec succés au réseau Tor - mais cela ne signifie PAS que votre appareil est sécurisé. Vous pouvez utiliser l\'option \'Vérifier\' du menu pour vérifier avec votre navigateur. \n\nAllez à la page https://guardianproject.info/apps/orbot ou envoyez un courriel à help(a)guardianproject.info pour en savoir plus.</string>
+ <string name="tor_check">Ceci va ouvrir la page https://check.torproject.org avec le navigateur web par défaut pour vérifier si Orbot est suffisamment configuré pour vous connecter à Tor.</string>
+ <string name="pref_hs_group">Services cachés</string>
+ <string name="pref_general_group">Général</string>
+ <string name="pref_start_boot_title">Exécuter Orbot automatiquement</string>
+ <string name="pref_start_boot_summary">Démarrer automatiquement Orbot et se connecter à Tor quand votre périphérique Android démarre</string>
+</resources>
diff --git a/values-it/strings.xml b/values-it/strings.xml
new file mode 100644
index 0000000..a3bf94b
--- /dev/null
+++ b/values-it/strings.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name"></string>
+ <string name="app_version"></string>
+ <string name="internal_web_url"></string>
+ <string name="default_web_url"></string>
+ <string name="secure_default_web_url"></string>
+ <string name="tor_check_api_url"></string>
+ <string name="control_permission_label"></string>
+ <string name="tor_proxy_service_process"></string>
+ <string name="status_starting_up"></string>
+ <string name="status_activated"></string>
+ <string name="status_disabled"></string>
+ <string name="status_shutting_down"></string>
+ <string name="tor_process_connecting"></string>
+ <string name="tor_process_connecting_step2"></string>
+ <string name="tor_process_connecting_step3"></string>
+ <string name="tor_process_connecting_step4"></string>
+ <string name="not_anonymous_yet"></string>
+ <string name="menu_home"></string>
+ <string name="menu_browse"></string>
+ <string name="menu_settings"></string>
+ <string name="menu_log"></string>
+ <string name="menu_info"></string>
+ <string name="menu_apps"></string>
+ <string name="menu_start"></string>
+ <string name="menu_stop"></string>
+ <string name="menu_about"></string>
+ <string name="menu_wizard"></string>
+ <string name="button_help"></string>
+ <string name="button_close"></string>
+ <string name="button_about"></string>
+ <string name="button_clear_log"></string>
+ <string name="menu_verify"></string>
+ <string name="menu_exit"></string>
+ <string name="powered_by"></string>
+ <string name="press_to_start"></string>
+ <string name="pref_trans_proxy_group"></string>
+ <string name="pref_trans_proxy_title"></string>
+ <string name="pref_trans_proxy_summary"></string>
+ <string name="pref_transparent_all_title"></string>
+ <string name="pref_transparent_all_summary"></string>
+ <string name="pref_transparent_port_fallback_title"></string>
+ <string name="pref_transparent_port_fallback_summary"></string>
+ <string name="pref_transparent_port_title"></string>
+ <string name="pref_transparent_port_summary"></string>
+ <string name="pref_transparent_port_dialog"></string>
+ <string name="pref_has_root"></string>
+ <string name="pref_has_root_summary"></string>
+ <string name="status_install_success"></string>
+ <string name="status_install_fail"></string>
+ <string name="title_error"></string>
+ <string name="wizard_title"></string>
+ <string name="wizard_btn_tell_me_more"></string>
+ <string name="btn_next"></string>
+ <string name="btn_back"></string>
+ <string name="btn_finish"></string>
+ <string name="btn_okay"></string>
+ <string name="btn_cancel"></string>
+ <string name="wizard_welcome_msg"></string>
+ <string name="wizard_details"></string>
+ <string name="wizard_details_msg"></string>
+ <string name="wizard_permissions_root"></string>
+ <string name="wizard_permissions_stock"></string>
+ <string name="wizard_premissions_msg_root"></string>
+ <string name="wizard_permissions_msg_stock"></string>
+ <string name="wizard_permissions_no_root"></string>
+ <string name="wizard_permissions_consent"></string>
+ <string name="wizard_permission_enable_root"></string>
+ <string name="wizard_configure"></string>
+ <string name="wizard_configure_msg"></string>
+ <string name="wizard_configure_all"></string>
+ <string name="wizard_configure_select_apps"></string>
+ <string name="wizard_tips_tricks"></string>
+ <string name="wizard_tips_msg"></string>
+ <string name="wizard_tips_otrchat"></string>
+ <string name="wizard_tips_orweb"></string>
+ <string name="wizard_tips_proxy"></string>
+ <string name="wizard_proxy_help_info"></string>
+ <string name="wizard_proxy_help_msg"></string>
+ <string name="wizard_final"></string>
+ <string name="wizard_final_msg"></string>
+ <string name="otrchat_apk_url"></string>
+ <string name="orweb_apk_url"></string>
+ <string name="connect_first_time"></string>
+ <string name="tor_check"></string>
+ <string name="pref_hs_group"></string>
+ <string name="pref_general_group"></string>
+ <string name="pref_start_boot_title"></string>
+ <string name="pref_start_boot_summary"></string>
+</resources>
diff --git a/values-mk/strings.xml b/values-mk/strings.xml
new file mode 100644
index 0000000..d6fdf98
--- /dev/null
+++ b/values-mk/strings.xml
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Орбот</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">вклучи и исклучи го Тор</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Орбот се вклучува...</string>
+ <string name="status_activated">Поврзан на мрежата Тор</string>
+ <string name="status_disabled">\"Орбот е дезактивиран</string>
+ <string name="status_shutting_down">Орбот се исклучува</string>
+ <string name="tor_process_connecting">Вклучување на Тор...</string>
+ <string name="tor_process_connecting_step2">Воспоставување контрола...</string>
+ <string name="tor_process_connecting_step3">готово.</string>
+ <string name="tor_process_connecting_step4">чекање.</string>
+ <string name="not_anonymous_yet">ВНИМАНИЕ: Вашиот сообраќај сеуште не е анонимен! Треба да ги конфигурирате Вашите апликации да го користат проксито за HTTP, 127.0.0.1:8118, или проксито за SOCKS4A или SOCKS5, 127.0.0.1:9050</string>
+ <string name="menu_home">Дома</string>
+ <string name="menu_browse">Прелистување</string>
+ <string name="menu_settings">Подесувања</string>
+ <string name="menu_log">Лог</string>
+ <string name="menu_info">Помош</string>
+ <string name="menu_apps">Апликации</string>
+ <string name="menu_start">Вклучи</string>
+ <string name="menu_stop">Исклучи</string>
+ <string name="menu_about">За</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Помош</string>
+ <string name="button_close">Затвори</string>
+ <string name="button_about">За</string>
+ <string name="button_clear_log">Избриши лог</string>
+ <string name="menu_verify">Провери</string>
+ <string name="menu_exit">Излез</string>
+ <string name="powered_by">напојувано од проектот Тор</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Транспарентно прокси (бара root пристап)</string>
+ <string name="pref_trans_proxy_title">Транспарентно прокси</string>
+ <string name="pref_trans_proxy_summary">Автоматско торифицирање на апликациите</string>
+ <string name="pref_transparent_all_title">Целосно торифицирање</string>
+ <string name="pref_transparent_all_summary">Проксирај го сообраќајот на сите апликации низ Тор</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Извршните програми за Тор се успешно инсталирани!</string>
+ <string name="status_install_fail">Извршните фајлови на Тор не можеа да се инсталираат. Видете го логот и известете нè за ова на tor-assistants(a)torproject.org</string>
+ <string name="title_error">Апликациска грешка</string>
+ <string name="wizard_title">Добредојдовте во Орбот</string>
+ <string name="wizard_btn_tell_me_more">За Орбот</string>
+ <string name="btn_next">Напред</string>
+ <string name="btn_back">Назад</string>
+ <string name="btn_finish">Крај</string>
+ <string name="btn_okay">Во ред</string>
+ <string name="btn_cancel">Откажи се</string>
+ <string name="wizard_welcome_msg">Орбот овозможува работа со Тор на Андроид. Тор е слободен софтвер и отворена мрежа којашто Ви помага да се заштитите од одреден вид мрежно прислушкување, познат како анализа на сообраќај (traffic analysis), кој претставуваат закана за личната слобода и приватност, за стопанските дејности и односи од доверлив карактер, како и за државната безбедност.\n\n*ВНИМАНИЕ:*Самиот факт што сте го инсталирале Орбот _нема_ автоматски да го направи Вашиот мобилен сообраќај анонимен! Но, овој прозор ќе Ви помогне да се иницирате.</string>
+ <string name="wizard_details">Некои детали за Орбот</string>
+ <string name="wizard_details_msg">Орбот е апликација со отворен код којашто го содржи Тор, LibEvent и Privoxy. Таа Ви нуди локални проксиња за HTTP (порт 8118) и SOCKS (порт 9050) за поврзување со мрежата Тор. Орбот исто така нуди можност, на уреди со root пристап, целиот сообраќај да се пренасочи преку Тор.</string>
+ <string name="wizard_permissions_root">Дозволата е издадена</string>
+ <string name="wizard_permissions_stock">Дозволи на орбот</string>
+ <string name="wizard_premissions_msg_root">Одлично! Детектиравме дека сте овозможиле root пристап за Орбот. Внимателно ќе се користиме со таа можност.</string>
+ <string name="wizard_permissions_msg_stock"> Иако тоа не е задолжително, Орбот може да стане помоќна алатка доколку вашиот уред има root пристап. Со копчето подолу можете на Орбот да му дадете таква супер-моќ.</string>
+ <string name="wizard_permissions_no_root">Ако немате root пристап или ако не разбирате за што зборуваме, единствено осигурајте се дека користите апликации кои што работат со Орбот.</string>
+ <string name="wizard_permissions_consent">Разбирам и сакам да продолжам без root пристап</string>
+ <string name="wizard_permission_enable_root">Дозволи root за Орбот</string>
+ <string name="wizard_configure">Подесување на торифицињето</string>
+ <string name="wizard_configure_msg">Орбот ви овозможува, или да го рутирате сиот сообраќај на сите апликации низ Тор, или поединечно да ги избирате апликациите.</string>
+ <string name="wizard_configure_all">Проксирај ги сите апликации низ Тор</string>
+ <string name="wizard_configure_select_apps">Избери поединечно апликации за Тор</string>
+ <string name="wizard_tips_tricks">Орбот-вклучени апликации</string>
+ <string name="wizard_tips_msg">Ви препорачуваме да презимате и користите апликации кои што знаат како директно да се поврзат со Орбот. Притиснете на копчињата подолу за инсталирање.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (само Андроид 1.x) - Браусер дизајниран за приватност и за Орбот</string>
+ <string name="wizard_tips_proxy">Подесувања на прокси - Научете како да ги конфигурирате апликациите да работат со Орбот</string>
+ <string name="wizard_proxy_help_info">Подесувања на прокси</string>
+ <string name="wizard_proxy_help_msg">Ако апликацијата за Андроид што ја користите поддржува употреба на прокси за HTTP или SOCKS, тогаш може да ја конфигурирате да се поврзе со Орбот и да користи Тор. \n\n
+ Подесувањето за хост е 127.0.0.1 или „localhost“. За HTTP, подесувањето на порт е 8118. За SOCKS, портот е 9050. Доколку можете, користете SOCKS4A или SOCKS5.
+ \n\n
+ Можете да научите повеќе за проксирањето на Андроид преку ЧПП на: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Орбот е спремен!</string>
+ <string name="wizard_final_msg">Стотици илјади луѓе низ целиот Свет го користат Тор од многу различни причини: новинари и блогери, борци за човекови права, полицајци, војници, корпорации, граѓани на репресивни режими, и обични граѓани... а сега и Вие сте спремин да го користите!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time"> Успешно се поврзавте на мрежата Тор - но ова НЕ значи дека важиот уред е сигурен. За да го проверите Вашиот браусер, изберете ја опцијата „Провери“ во менито. \n\nПосетете нѐ на https://guardianproject.info/apps/orbot или испратете порака на help(a)guardianproject.info за повеќе информации.</string>
+ <string name="tor_check">Ова ќе ја отвори страницата https://check.torproject.org во Вашиот веб браусер за да видите дали Орбот е правилно конфигуриран и дали сте поврзани на Тор.</string>
+ <string name="pref_hs_group">Скриени сервиси </string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-nb/strings.xml b/values-nb/strings.xml
new file mode 100644
index 0000000..b257a3c
--- /dev/null
+++ b/values-nb/strings.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">start og stopp Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot starter...</string>
+ <string name="status_activated">Tilkoblet Tor-nettverket</string>
+ <string name="status_disabled">\"Orbot er deaktivert</string>
+ <string name="status_shutting_down">Orbot skrur seg av</string>
+ <string name="tor_process_connecting">Starter Tor...</string>
+ <string name="tor_process_connecting_step2">autentiserer kontrolltilkobling...</string>
+ <string name="tor_process_connecting_step3">ferdig.</string>
+ <string name="tor_process_connecting_step4">venter.</string>
+ <string name="not_anonymous_yet">ADVARSEL: Trafikken din er ikke anonym helt enda! Vær vennlig og konfigurer applikasjonene dine til å bruke HTTP proxy 127.0.0.1:8118 eller SOCKS4A eller SOCKS5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Hjem</string>
+ <string name="menu_browse">Gå til</string>
+ <string name="menu_settings">Innstillinger</string>
+ <string name="menu_log">Logg</string>
+ <string name="menu_info">Hjelp</string>
+ <string name="menu_apps">Applikasjoner</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stopp</string>
+ <string name="menu_about">About</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Hjelp</string>
+ <string name="button_close">Avslutt</string>
+ <string name="button_about">Om</string>
+ <string name="button_clear_log"></string>
+ <string name="menu_verify">Check</string>
+ <string name="menu_exit">Exit</string>
+ <string name="powered_by"></string>
+ <string name="press_to_start"></string>
+ <string name="pref_trans_proxy_group"></string>
+ <string name="pref_trans_proxy_title"></string>
+ <string name="pref_trans_proxy_summary"></string>
+ <string name="pref_transparent_all_title"></string>
+ <string name="pref_transparent_all_summary"></string>
+ <string name="pref_transparent_port_fallback_title"></string>
+ <string name="pref_transparent_port_fallback_summary"></string>
+ <string name="pref_transparent_port_title"></string>
+ <string name="pref_transparent_port_summary"></string>
+ <string name="pref_transparent_port_dialog"></string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">&gt;Request root access for transparent proxying</string>
+ <string name="status_install_success"></string>
+ <string name="status_install_fail"></string>
+ <string name="title_error"></string>
+ <string name="wizard_title"></string>
+ <string name="wizard_btn_tell_me_more"></string>
+ <string name="btn_next"></string>
+ <string name="btn_back"></string>
+ <string name="btn_finish"></string>
+ <string name="btn_okay"></string>
+ <string name="btn_cancel"></string>
+ <string name="wizard_welcome_msg"></string>
+ <string name="wizard_details"></string>
+ <string name="wizard_details_msg"></string>
+ <string name="wizard_permissions_root"></string>
+ <string name="wizard_permissions_stock"></string>
+ <string name="wizard_premissions_msg_root"></string>
+ <string name="wizard_permissions_msg_stock"></string>
+ <string name="wizard_permissions_no_root"></string>
+ <string name="wizard_permissions_consent"></string>
+ <string name="wizard_permission_enable_root"></string>
+ <string name="wizard_configure"></string>
+ <string name="wizard_configure_msg"></string>
+ <string name="wizard_configure_all"></string>
+ <string name="wizard_configure_select_apps"></string>
+ <string name="wizard_tips_tricks"></string>
+ <string name="wizard_tips_msg"></string>
+ <string name="wizard_tips_otrchat"></string>
+ <string name="wizard_tips_orweb"></string>
+ <string name="wizard_tips_proxy"></string>
+ <string name="wizard_proxy_help_info"></string>
+ <string name="wizard_proxy_help_msg"></string>
+ <string name="wizard_final"></string>
+ <string name="wizard_final_msg"></string>
+ <string name="otrchat_apk_url"></string>
+ <string name="orweb_apk_url"></string>
+ <string name="connect_first_time"></string>
+ <string name="tor_check"></string>
+ <string name="pref_hs_group"></string>
+ <string name="pref_general_group"></string>
+ <string name="pref_start_boot_title"></string>
+ <string name="pref_start_boot_summary"></string>
+</resources>
diff --git a/values-nl/strings.xml b/values-nl/strings.xml
new file mode 100644
index 0000000..6db3b0e
--- /dev/null
+++ b/values-nl/strings.xml
@@ -0,0 +1,102 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">start en stop Tor</string>
+ <string name="tor_proxy_service_process">torproxydienst</string>
+ <string name="status_starting_up">Orbot is aan het starten...</string>
+ <string name="status_activated">Aangesloten op het Tor netwerk</string>
+ <string name="status_disabled">Orbot is uitgeschakeld</string>
+ <string name="status_shutting_down">Orbot is aan het afsluiten</string>
+ <string name="tor_process_connecting">Bezig met opstarten van Tor...</string>
+ <string name="tor_process_connecting_step2">Bezig met instellen aansturing</string>
+ <string name="tor_process_connecting_step3">klaar.</string>
+ <string name="tor_process_connecting_step4">aan het wachten.</string>
+ <string name="not_anonymous_yet">WAARSCHUWING: Uw verkeer is nog niet anononiem! Stel uw programma\'s alstublieft in dat ze gebruik maken van HTTP proxy 127.0.0.1:8118 of SOCKS4A of SOCKS5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Thuis</string>
+ <string name="menu_browse">Bladeren</string>
+ <string name="menu_settings">Instellingen</string>
+ <string name="menu_log">Logboek</string>
+ <string name="menu_info">Hulp</string>
+ <string name="menu_apps">Applicaties</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stop</string>
+ <string name="menu_about">Over</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Hulp</string>
+ <string name="button_close">Afsluiten</string>
+ <string name="button_about">Over</string>
+ <string name="button_clear_log">Wis logboek</string>
+ <string name="menu_verify">Controleer</string>
+ <string name="menu_exit">Verlaten</string>
+ <string name="powered_by">aangedreven door het Tor Project</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Transparant Proxyen (Vereist Root)</string>
+ <string name="pref_trans_proxy_title">Transparant Proxyen</string>
+ <string name="pref_trans_proxy_summary">Automatisch Tor forceren van aplicaties</string>
+ <string name="pref_transparent_all_title">Tor Alles</string>
+ <string name="pref_transparent_all_summary">Proxy verkeer voor alle toepasingen door Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Tor\'s binaire bestanden succesvol geïnstalleerd</string>
+ <string name="status_install_fail">The binaire bestanden konden niet worden geïnstalleerd. Gelieve het log te raadplegen en tor-assistants(a)torproject.org op de hoogte te stellen</string>
+ <string name="title_error">Toepassingsfout</string>
+ <string name="wizard_title">Welkom bij Orbot</string>
+ <string name="wizard_btn_tell_me_more">Over Orbot</string>
+ <string name="btn_next">Volgende</string>
+ <string name="btn_back">Terug</string>
+ <string name="btn_finish">Einde</string>
+ <string name="btn_okay">OK</string>
+ <string name="btn_cancel">Annuleren</string>
+ <string name="wizard_welcome_msg">Orbot brengt Tor naar de Android. Tor is vrije software en een open netwerk dat u helpt te verdedigen tegen netwerk toezicht welke aanvallen zijn op uw vrijheid en privacy, geheime zakelijke documenten en zaken relaties.
+
+*WAARSCHUWING:* Door het installeren van Orbot word uw verkeer _niet_ automatisch geproxyt! Deze wizard helpt u hier mee.</string>
+ <string name="wizard_details">Enkele Orbot Details</string>
+ <string name="wizard_details_msg">Orbot is een open-source applicatie waarin Tor, LibEvent en Privoxy zich bevinden. Het creeërt een lokale HTTP proxy (8118) en een SOCKS proxy (9050) naar het Tor netwerk. Orbot heeft ook de mogelijkheid om al het internet verkeer over het Tor netwerk te sturen.</string>
+ <string name="wizard_permissions_root">Toelating toegestaan</string>
+ <string name="wizard_permissions_stock">Orbot Rechten</string>
+ <string name="wizard_premissions_msg_root">Uitstekend! We hebben gedetecteerd dat je root rechten hebt aangezet voor Orbot. We gebruiken deze kracht met verstand.</string>
+ <string name="wizard_permissions_msg_stock">Alhoewel het niet verplicht is kan Orbot ook nog krachtiger worden. Als u root rechten heeft kunt u op de knop onderaan Orbot super krachten toewijzen.</string>
+ <string name="wizard_permissions_no_root">Als u niet over root toegang beschikt en geen idee hebt waar u mee bezig bent zult u zeker moeten zijn dat de applicaties die u gebruikt geschikt voor Orbot zijn.</string>
+ <string name="wizard_permissions_consent">Ik begrijp dit en wil verdergaan zonder root</string>
+ <string name="wizard_permission_enable_root">Root toestaan voor Orbot</string>
+ <string name="wizard_configure">Torificatie Configureren</string>
+ <string name="wizard_configure_msg">Orbot geeft u de mogelijkheid om induvidueel te bepalen welk van uw applicaties over het Tor netwerk gaan.</string>
+ <string name="wizard_configure_all">Proxy alle toepasingen door Tor</string>
+ <string name="wizard_configure_select_apps">Selecteer individuele toepasingen voor Tor</string>
+ <string name="wizard_tips_tricks">Orbot-beschikbare Apps</string>
+ <string name="wizard_tips_msg">We raden u aan om te apps te downloaden welke zich zich automatisch verbinden met Orbot. Klik op de buttons hier beneden om te installeren.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Alleen Android 1.x) - Browser gemaakt voor privacy &amp; voor Orbot</string>
+ <string name="wizard_tips_proxy">Proxy Instellingen - Leer hoe u uw apps kunt configureren voor Orbot</string>
+ <string name="wizard_proxy_help_info">Proxy Instellingen</string>
+ <string name="wizard_proxy_help_msg">Als de Android app welke u gebruikt beschikt over een HTTP of SOCKS proxy instelling, dan kunt u het configureren zodat het via Orbot over het Tor netwerk gaat.
+
+
+De host instelling is 127.0.0.1 of \"localhost\". De poort voor SOCS is 9050 en voor HTTP 8118. Gebruik SOCKS4A or SOCKS5 indien nodig.
+
+
+U kunt meer leren over het proxyen op Android door naar de FAQ op http://tinyurl.com/proxyandroid te gaan
+ </string>
+ <string name="wizard_final">Orbot is klaar!</string>
+ <string name="wizard_final_msg">Honderdduizenden verschillende mensen over de wereld gebruiken Tor, zoals: journalisten, bloggers, mensen rechten medewerkers, soldaten, bedrijven, burgers met onderdrukte religies, en natuurlijk normale mensen... En nu bent u ook klaar om te gaan!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">U bent succesvol verbonden met het Tor netwerk, maar dit betekent NIET dat u apparaat volledig veilig is. Gebruik te \'Check\' optie vanuit het menu om u browser te testen.
+
+Bezoek onze website op https://guardianproject.info/apps/orbot of stuuf een email naar help(a)guardianproject.info voor vragen.</string>
+ <string name="tor_check">Dit opent uw standaard browser naar https://check.torproject.org om te controleren of Orbot succesvol is geconfigureerd om te verbinden met het Tor netwerk.</string>
+ <string name="pref_hs_group">Verborgen diensten</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-pl/strings.xml b/values-pl/strings.xml
new file mode 100644
index 0000000..21d4173
--- /dev/null
+++ b/values-pl/strings.xml
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">włącz i wyłącz Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot startuje...</string>
+ <string name="status_activated">Podłączony do sieci Tor</string>
+ <string name="status_disabled">Orbot wyłączony</string>
+ <string name="status_shutting_down">Orbot wyłącza się</string>
+ <string name="tor_process_connecting">Tor startuje...</string>
+ <string name="tor_process_connecting_step2">Ustawianie sterowania...</string>
+ <string name="tor_process_connecting_step3">zakończono.</string>
+ <string name="tor_process_connecting_step4">oczekiwanie.</string>
+ <string name="not_anonymous_yet">UWAGA: Twoja komunikacja nie jest jeszcze anonimowa! Proszę skonfiguruj aplikacje aby używały serwera proxy HTTP 127.0.0.1:8118 lub SOCKS4A lub SOCKS5 127.0.0.1:9050</string>
+ <string name="menu_home">Start</string>
+ <string name="menu_browse">Przeglądaj</string>
+ <string name="menu_settings">Ustawienia</string>
+ <string name="menu_log">Logi</string>
+ <string name="menu_info">Pomoc</string>
+ <string name="menu_apps">Aplikacje</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stop</string>
+ <string name="menu_about">O programie</string>
+ <string name="menu_wizard">Kreator</string>
+ <string name="button_help">Pomoc</string>
+ <string name="button_close">Zamknij</string>
+ <string name="button_about">O programie</string>
+ <string name="button_clear_log">Czyść dziennik</string>
+ <string name="menu_verify">Sprawdź</string>
+ <string name="menu_exit">Wyjście</string>
+ <string name="powered_by">napędzane oprogramowaniem Projektu Tor</string>
+ <string name="press_to_start">- wciśnij na dłużej, by uruchomić -</string>
+ <string name="pref_trans_proxy_group">Przekierowanie przezroczyste (Wymaga uprawnień administratora)</string>
+ <string name="pref_trans_proxy_title">Przekierowanie przezroczyste</string>
+ <string name="pref_trans_proxy_summary">Automatyczne toryfikowanie aplikacji</string>
+ <string name="pref_transparent_all_title">Przepuść wszystko przez Tora</string>
+ <string name="pref_transparent_all_summary">Przekierowanie ruchu wszystkich aplikacji przez Tora</string>
+ <string name="pref_transparent_port_fallback_title">Zapasowy Port Proxy</string>
+ <string name="pref_transparent_port_fallback_summary">UWAGA: Unika powszechnych portów (80, 443, etc). *UŻYWAĆ TYLKO* gdy \'All\' lub tryb \'App\' nie działa.</string>
+ <string name="pref_transparent_port_title">Lista Portów</string>
+ <string name="pref_transparent_port_summary">Lista portów, które przechwytywać. *UŻYWAĆ TYLKO* gdy \'All\' lub tryb \'App\' nie działa.</string>
+ <string name="pref_transparent_port_dialog">Wpisz porty do przechwytywania</string>
+ <string name="pref_has_root">Żądaj dostępu administratora</string>
+ <string name="pref_has_root_summary">Żądaj dostępu administratora dla przezroczystego przekierowania</string>
+ <string name="status_install_success">Binarki Tora pomyslnie zainstalowane!</string>
+ <string name="status_install_fail">Nie można zainstalować plików binarnych Tora. Zajrzyj do dziennika i powiadom tor-assistants(a)torproject.org</string>
+ <string name="title_error">Błąd Aplikacji</string>
+ <string name="wizard_title">Witamy w Orbocie</string>
+ <string name="wizard_btn_tell_me_more">O Orbocie</string>
+ <string name="btn_next">Dalej</string>
+ <string name="btn_back">wstecz</string>
+ <string name="btn_finish">Koniec</string>
+ <string name="btn_okay">OK</string>
+ <string name="btn_cancel">Anuluj</string>
+ <string name="wizard_welcome_msg">Orbot daje Tora Androidowi. Tor jest otwartym oprogramowaniem i otwartą siecią, która pomaga bronić się przed podsłuchem sieci znanym jako analiza ruchu, który zagraża wolności osobistej i prywatności, poufnym działaniom biznesowym i relacjami oraz bezpieczeństwu państwa.\n\n*UWAGA:* Sama instalacja Orbota _nie_ zanonimizuje magicznie Twojego ruchu! Ten kreator pozwoli Ci w pierwszych krokach.</string>
+ <string name="wizard_details">Niektóre szczegóły o Orbocie</string>
+ <string name="wizard_details_msg">Orbot jest otwartą aplikacją zawierającą Tora, LibEvent i Privoxy. Dostarcza lokalnego pośrednika HTTP (8118) i SOCKS (9050) do sieci Tora. Orbot ma możliwość, na urządzeniu uruchomionym z prawami administratora, wysyłać cały ruch internetowy przez Tora.</string>
+ <string name="wizard_permissions_root">Dostęp zezwolony</string>
+ <string name="wizard_permissions_stock">Prawa dostepu Orbota</string>
+ <string name="wizard_premissions_msg_root">Doskonale! Odkryliśmy, że masz uprawnienia administratora włączone dla Orbota. Będziemy mądrze korzystać z tej władzy.</string>
+ <string name="wizard_permissions_msg_stock"> Podczas gdy nie jest to wymagane, Orbot może stać się znacznie potężniejszym narzędziem, gdy masz prawa administratora na swoim urządzeniu. Użyj przycisku poniżej, by dać Orbotowi duży uprawnienia.</string>
+ <string name="wizard_permissions_no_root">Jeśli nie masz uprawnień administratora lub nie masz pojęcia, o czym mówimy, używaj aplikacji skonfigurowanych do pracy z Orbotem.</string>
+ <string name="wizard_permissions_consent">Rozumiem i chcę kontynuować bez uprawnień administratora</string>
+ <string name="wizard_permission_enable_root">Daj uprawnienia administratora Orbotowi</string>
+ <string name="wizard_configure">Skonfiguruj Toryfikację</string>
+ <string name="wizard_configure_msg">Orbot daje Ci możliwość przekierowania całego ruchu aplikacji przez Tora ALBO wybrania aplikacji pojedynczo.</string>
+ <string name="wizard_configure_all">Przekierowuj wszystkie aplikacje przez Tora</string>
+ <string name="wizard_configure_select_apps">Wybierz poszczególne aplikacje dla Tora</string>
+ <string name="wizard_tips_tricks">Aplikacje skonfigurowane dla Orbota</string>
+ <string name="wizard_tips_msg">Zachęcamy do pobierania i używania aplikacji, które wiedzą, jak łączyć się bezpośrednio z Orbotem. Kliknij na poniższe przyciski, by zainstalować.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Bezpieczny komunikator dla Androida</string>
+ <string name="wizard_tips_orweb">ORWEB (tylko Android 1.x) - Przeglądarka zaprojektowana do prywatności i dla Orbota</string>
+ <string name="wizard_tips_proxy">Ustawienia Proxy - NDowiedz się, jak konfiguroać aplikacje do współpracy z Orbotem</string>
+ <string name="wizard_proxy_help_info">Ustawienia Proxy</string>
+ <string name="wizard_proxy_help_msg">Jeśli aplikacja na Androida, której używasz ma obsługę proxy HTTP lub SOCKS, możesz skonfigurować ją do łączenia się z Orbotem i używania Tora.\n\n
+ Ustawienie hosta to 127.0.0.1 lub \"localhost\". Dla HTTP, numer portu to 8118. Dla SOCKS pośrednik to 9050. Powinno się używać SOCKS4A lub SOCKS5, jeśli to możliwe.
+ \n\n
+ Możesz dowiedzieć się więcej o przekierowaniu ruchu na Androidzie z FAQ pod adresem: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Orbot jest gotowy!</string>
+ <string name="wizard_final_msg">Setki tysięcy ludzi na całym świecie używają Tora z różnych powodów: dziennikarze i blogerzy, działacze na rzecz praw człowieka, stróże prawa, żołnierze, korporacje, obywatele represyjnych reżimów i zwykli obywatele... teraz Ty też możesz!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">Pomyślnie połaczono z siecią Tora - ale to NIE oznacza, że Twoje urządzenie jest bezpieczne. Możesz użyć opcji \'Sprawdź\' w menu, aby przetestować swoją przeglądarkę. \n\nOdwiedź nas na https://guardianproject.info/apps/orbot lub wyślij email na help(a)guardianproject.info, by dowiedzieć się więcej.</string>
+ <string name="tor_check">To otworzy Twoją domyślną przeglądarkę na adresie https://check.torproject.org w celu sprawdzenia, czy Orbot jest skonfigurowany i jest poąłczenie z Torem.</string>
+ <string name="pref_hs_group">Usługi ukryte</string>
+ <string name="pref_general_group">Ogólne</string>
+ <string name="pref_start_boot_title">Uruchamiaj Orbota przy starcie</string>
+ <string name="pref_start_boot_summary">Automatycznie uruchamiaj Orbota i łącz się z Torem, gdy Twoje urządzenie z Androidem się uruchomi</string>
+</resources>
diff --git a/values-pt/strings.xml b/values-pt/strings.xml
new file mode 100644
index 0000000..f9e06b8
--- /dev/null
+++ b/values-pt/strings.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">iniciar e parar Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">O Orbot está a iniciar...</string>
+ <string name="status_activated">Ligação estabelecida à rede Tor</string>
+ <string name="status_disabled">\"Orbot está Desactivado</string>
+ <string name="status_shutting_down">Orbot a encerrar</string>
+ <string name="tor_process_connecting">A iniciar Tor...</string>
+ <string name="tor_process_connecting_step2">a autenticar a ligação de controlo...</string>
+ <string name="tor_process_connecting_step3">completo.</string>
+ <string name="tor_process_connecting_step4">a aguardar.</string>
+ <string name="not_anonymous_yet">ATENÇÃO: A sua ligação ainda não é anónima! Por favor configure as suas aplicações para utilizarem o proxy HTTP 127.0.0.1:8118 ou o proxy SOCKS4A ou SOCKS5 127.0.0.1:9050</string>
+ <string name="menu_home">Início</string>
+ <string name="menu_browse">Explorar</string>
+ <string name="menu_settings">Definições</string>
+ <string name="menu_log">Relatório</string>
+ <string name="menu_info">Ajuda</string>
+ <string name="menu_apps">Aplicações</string>
+ <string name="menu_start">Iniciar</string>
+ <string name="menu_stop">Parar</string>
+ <string name="menu_about">About</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Ajuda</string>
+ <string name="button_close">Encerrar</string>
+ <string name="button_about">Sobre</string>
+ <string name="button_clear_log"></string>
+ <string name="menu_verify">Check</string>
+ <string name="menu_exit">Exit</string>
+ <string name="powered_by"></string>
+ <string name="press_to_start"></string>
+ <string name="pref_trans_proxy_group"></string>
+ <string name="pref_trans_proxy_title"></string>
+ <string name="pref_trans_proxy_summary"></string>
+ <string name="pref_transparent_all_title"></string>
+ <string name="pref_transparent_all_summary"></string>
+ <string name="pref_transparent_port_fallback_title"></string>
+ <string name="pref_transparent_port_fallback_summary"></string>
+ <string name="pref_transparent_port_title"></string>
+ <string name="pref_transparent_port_summary"></string>
+ <string name="pref_transparent_port_dialog"></string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">&gt;Request root access for transparent proxying</string>
+ <string name="status_install_success"></string>
+ <string name="status_install_fail"></string>
+ <string name="title_error"></string>
+ <string name="wizard_title"></string>
+ <string name="wizard_btn_tell_me_more"></string>
+ <string name="btn_next"></string>
+ <string name="btn_back"></string>
+ <string name="btn_finish"></string>
+ <string name="btn_okay"></string>
+ <string name="btn_cancel"></string>
+ <string name="wizard_welcome_msg"></string>
+ <string name="wizard_details"></string>
+ <string name="wizard_details_msg"></string>
+ <string name="wizard_permissions_root"></string>
+ <string name="wizard_permissions_stock"></string>
+ <string name="wizard_premissions_msg_root"></string>
+ <string name="wizard_permissions_msg_stock"></string>
+ <string name="wizard_permissions_no_root"></string>
+ <string name="wizard_permissions_consent"></string>
+ <string name="wizard_permission_enable_root"></string>
+ <string name="wizard_configure"></string>
+ <string name="wizard_configure_msg"></string>
+ <string name="wizard_configure_all"></string>
+ <string name="wizard_configure_select_apps"></string>
+ <string name="wizard_tips_tricks"></string>
+ <string name="wizard_tips_msg"></string>
+ <string name="wizard_tips_otrchat"></string>
+ <string name="wizard_tips_orweb"></string>
+ <string name="wizard_tips_proxy"></string>
+ <string name="wizard_proxy_help_info"></string>
+ <string name="wizard_proxy_help_msg"></string>
+ <string name="wizard_final"></string>
+ <string name="wizard_final_msg"></string>
+ <string name="otrchat_apk_url"></string>
+ <string name="orweb_apk_url"></string>
+ <string name="connect_first_time"></string>
+ <string name="tor_check"></string>
+ <string name="pref_hs_group"></string>
+ <string name="pref_general_group"></string>
+ <string name="pref_start_boot_title"></string>
+ <string name="pref_start_boot_summary"></string>
+</resources>
diff --git a/values-ru/strings.xml b/values-ru/strings.xml
new file mode 100644
index 0000000..b6e6318
--- /dev/null
+++ b/values-ru/strings.xml
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">запуск и остановка Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Запуск Orbot...</string>
+ <string name="status_activated">Подключен к сети Tor</string>
+ <string name="status_disabled">\"Orbot Отключен</string>
+ <string name="status_shutting_down">Orbot выключается</string>
+ <string name="tor_process_connecting">Запуск Tor...</string>
+ <string name="tor_process_connecting_step2">Настройка управления...</string>
+ <string name="tor_process_connecting_step3">готово.</string>
+ <string name="tor_process_connecting_step4">ожидание.</string>
+ <string name="not_anonymous_yet">ВНИМАНИЕ! Ваш поток данных еще не анонимен! Пожалуйста, настройте свои приложения на использование HTTP прокси 127.0.0.1:8118 или SOCKS4A или SOCKS5 прокси 127.0.0.1:9050</string>
+ <string name="menu_home">Домашняя страница</string>
+ <string name="menu_browse">Просмотр</string>
+ <string name="menu_settings">Параметры</string>
+ <string name="menu_log">Журнал</string>
+ <string name="menu_info">Справка</string>
+ <string name="menu_apps">Приложения</string>
+ <string name="menu_start">Запустить</string>
+ <string name="menu_stop">Остановить</string>
+ <string name="menu_about">О программе</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Справка</string>
+ <string name="button_close">Закрыть</string>
+ <string name="button_about">О программе</string>
+ <string name="button_clear_log">Очистить журнал</string>
+ <string name="menu_verify">Проверка</string>
+ <string name="menu_exit">Выход</string>
+ <string name="powered_by">powered by the Tor Project</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Прозрачный прокси (Требуются привилегии root)</string>
+ <string name="pref_trans_proxy_title">Прозрачный прокси</string>
+ <string name="pref_trans_proxy_summary">Автоматическая торификация приложений</string>
+ <string name="pref_transparent_all_title">Направлять все через Tor</string>
+ <string name="pref_transparent_all_summary">Трафик всех приложений будет проходить через Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Программа Tor успешно установлена!</string>
+ <string name="status_install_fail">Не удалось установить программу Tor. Пожалуйста, проверьте системный журнал и сообщите нам: tor-assistants(a)torproject.org</string>
+ <string name="title_error">Ошибка приложения</string>
+ <string name="wizard_title">Добро пожаловать в Orbot</string>
+ <string name="wizard_btn_tell_me_more">Об Orbot</string>
+ <string name="btn_next">Вперед</string>
+ <string name="btn_back">Назад</string>
+ <string name="btn_finish">Завершить</string>
+ <string name="btn_okay">Ok</string>
+ <string name="btn_cancel">Отмена</string>
+ <string name="wizard_welcome_msg">Orbot, и Tor на Android. Tor - это бесплатное программное обеспечение и открытая сеть, которая позволяет вам сберечься от прослушивания в сети, которое угрожает вашей свободе и конфиденциальности в бизнесе, отношениях, Tor позволяет защититься от анализа трафика.\n\n*ВНИМАНИЕ:* Установка Orbot не может магическим образом анонимизировать весь ваш мобильный трафик! Этот мастер поможет вам начать.</string>
+ <string name="wizard_details">Некоторые сведенья о программе Orbot</string>
+ <string name="wizard_details_msg">Orbot - это приложение с открытым кодом, которое содержит Tor, LibEvent и Privoxy. Она обеспечивает работу локального HTTP прокси (8118) и SOCKS прокси (9050) в сети Tor. Orbot также позволяет, из корня устройсва, пересылать весь интернет трафик через Tor.</string>
+ <string name="wizard_permissions_root">Разрешение получено</string>
+ <string name="wizard_permissions_stock">Разрешения Orbot</string>
+ <string name="wizard_premissions_msg_root">Отлично! Мы определили, что доступ к корневому каталогу в Orbot разрешен. Мы будем использовать это с умом.</string>
+ <string name="wizard_permissions_msg_stock">Хотя это не требуется, Orbot может быть более мощным инструментом, если доступ к корневому каталогу устройства разрешен. Нажимите на кнопку ниже и дайте Orbot суперсилу!</string>
+ <string name="wizard_permissions_no_root">Если у вас нет доступа к корневому каталогу или вы понятия не имеете о чем мы говорим, просто убедитесь, что используете приложения, разработанные для Orbot.</string>
+ <string name="wizard_permissions_consent">Я все понял, продолжу без доступа к корню</string>
+ <string name="wizard_permission_enable_root">Дать доступ к корю программе Orbot</string>
+ <string name="wizard_configure">Настроить Торификацию</string>
+ <string name="wizard_configure_msg">Программа Orbot дает вам возможность маршрутизировать трафик всех приложений через Tor ИЛИ выбрать приложения для маршрутизации самостоятельно.</string>
+ <string name="wizard_configure_all">Маршрутизировать все приложения через Tor</string>
+ <string name="wizard_configure_select_apps">Выберите приложения для маршрутизации через Tor</string>
+ <string name="wizard_tips_tricks">Orbot-задействованные приложения</string>
+ <string name="wizard_tips_msg">Мы советуем вам скачать и использовать приложения, которые умеют работать напрямую через Orbot. Нажмите на кнопки ниже, чтобы запустить процесс установки.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Только для версии Android 1.x) - Браузер, разработанный для обеспечения безопасности и для Orbot</string>
+ <string name="wizard_tips_proxy">Настройки прокси - узнайте как настроить приложения для работы с Orbot</string>
+ <string name="wizard_proxy_help_info">Настройки Прокси</string>
+ <string name="wizard_proxy_help_msg">Если используемое вами приложение для Android поддерживает HTTP или SOCKS, то вы можете настоить его на подключение к Orbot и использование Tor.\n\n
+ Настройки хоста (или localhost) - 127.0.0.1. Для HTTP, номер порта - 8118. Для SOCKS прокси - 9050. По возможности используйте SOCKS4A или SOCKS5.
+ \n\n
+ Вы можете узнать больше о работе через прокси на Android, прочитав этот FAQ: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Программа Orbot готова к использованию!</string>
+ <string name="wizard_final_msg">Сотни тысяч людей по всему миру используют Tor по различным причинам: журналисты и блоггеры, активисты организаций, выступающих в защиту прав человека, судебные исполнители, солдаты, корпорации, граждане стран с репрессивным режимом, и простые люди... а теперь готовы и вы!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time"> Вы успешно подключились к сети Tor, но это НЕ значит, что ваше устройство безопасно. Вы можете воспользоваться функцией \'Проверки\' из меню, чтобы потестировать ваш браузер. \n\nПосетите наш сайт: https://guardianproject.info/apps/orbot или отправьте нам письмо на адрес: help(a)guardianproject.info, чтобы узнать больше.</string>
+ <string name="tor_check">Это приведет к запуску веб-браузера, выбранного на вашем компьютере по-умолчанию, и подключению к сайту https://check.torproject.org, с целью проверки правильности работы Orbot и определения, подключены ли вы к сети Tor.</string>
+ <string name="pref_hs_group">Скрытые сервисы</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values-sv/strings.xml b/values-sv/strings.xml
new file mode 100644
index 0000000..2ad858d
--- /dev/null
+++ b/values-sv/strings.xml
@@ -0,0 +1,91 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">start and stop Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot startar...</string>
+ <string name="status_activated">Uppkopplad till Tor nätverket</string>
+ <string name="status_disabled">\"Orbot är inaktiverad</string>
+ <string name="status_shutting_down">Orbot avslutas</string>
+ <string name="tor_process_connecting">Startar Tor...</string>
+ <string name="tor_process_connecting_step2">verifierar kontroll uppkopplingen...</string>
+ <string name="tor_process_connecting_step3">klar.</string>
+ <string name="tor_process_connecting_step4">väntar.</string>
+ <string name="not_anonymous_yet">VARNING: Din trafik är inte anonym än! Vänligen konfigurera dina apps att använda HTTP proxy 127.0.0.1:8118 eller SOCKS4A/5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Hem</string>
+ <string name="menu_browse">Browse</string>
+ <string name="menu_settings">Inställningar</string>
+ <string name="menu_log">Logg</string>
+ <string name="menu_info">Hjälp</string>
+ <string name="menu_apps">Apps</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stopp</string>
+ <string name="menu_about">About</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Hjälp</string>
+ <string name="button_close">Stäng</string>
+ <string name="button_about">Om</string>
+ <string name="button_clear_log"></string>
+ <string name="menu_verify"></string>
+ <string name="menu_exit"></string>
+ <string name="powered_by"></string>
+ <string name="press_to_start"></string>
+ <string name="pref_trans_proxy_group"></string>
+ <string name="pref_trans_proxy_title"></string>
+ <string name="pref_trans_proxy_summary"></string>
+ <string name="pref_transparent_all_title"></string>
+ <string name="pref_transparent_all_summary"></string>
+ <string name="pref_transparent_port_fallback_title"></string>
+ <string name="pref_transparent_port_fallback_summary"></string>
+ <string name="pref_transparent_port_title"></string>
+ <string name="pref_transparent_port_summary"></string>
+ <string name="pref_transparent_port_dialog"></string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">&gt;Request root access for transparent proxying</string>
+ <string name="status_install_success"></string>
+ <string name="status_install_fail"></string>
+ <string name="title_error"></string>
+ <string name="wizard_title"></string>
+ <string name="wizard_btn_tell_me_more"></string>
+ <string name="btn_next"></string>
+ <string name="btn_back"></string>
+ <string name="btn_finish"></string>
+ <string name="btn_okay"></string>
+ <string name="btn_cancel"></string>
+ <string name="wizard_welcome_msg"></string>
+ <string name="wizard_details"></string>
+ <string name="wizard_details_msg"></string>
+ <string name="wizard_permissions_root"></string>
+ <string name="wizard_permissions_stock"></string>
+ <string name="wizard_premissions_msg_root"></string>
+ <string name="wizard_permissions_msg_stock"></string>
+ <string name="wizard_permissions_no_root"></string>
+ <string name="wizard_permissions_consent"></string>
+ <string name="wizard_permission_enable_root"></string>
+ <string name="wizard_configure"></string>
+ <string name="wizard_configure_msg"></string>
+ <string name="wizard_configure_all"></string>
+ <string name="wizard_configure_select_apps"></string>
+ <string name="wizard_tips_tricks"></string>
+ <string name="wizard_tips_msg"></string>
+ <string name="wizard_tips_otrchat"></string>
+ <string name="wizard_tips_orweb"></string>
+ <string name="wizard_tips_proxy"></string>
+ <string name="wizard_proxy_help_info"></string>
+ <string name="wizard_proxy_help_msg"></string>
+ <string name="wizard_final"></string>
+ <string name="wizard_final_msg"></string>
+ <string name="otrchat_apk_url"></string>
+ <string name="orweb_apk_url"></string>
+ <string name="connect_first_time"></string>
+ <string name="tor_check"></string>
+ <string name="pref_hs_group"></string>
+ <string name="pref_general_group"></string>
+ <string name="pref_start_boot_title"></string>
+ <string name="pref_start_boot_summary"></string>
+</resources>
diff --git a/values-zh/strings.xml b/values-zh/strings.xml
new file mode 100644
index 0000000..2564fcf
--- /dev/null
+++ b/values-zh/strings.xml
@@ -0,0 +1,94 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">启动和停止 Tor</string>
+ <string name="tor_proxy_service_process">Tor 代理服务</string>
+ <string name="status_starting_up">Orbot 正在启动...</string>
+ <string name="status_activated">已连接到 Tor 网络</string>
+ <string name="status_disabled">Orbot 已停用</string>
+ <string name="status_shutting_down">Orbot 正在关闭</string>
+ <string name="tor_process_connecting">正在启动Tor....</string>
+ <string name="tor_process_connecting_step2">设置控制...</string>
+ <string name="tor_process_connecting_step3">完毕。</string>
+ <string name="tor_process_connecting_step4">等待中。</string>
+ <string name="not_anonymous_yet">警告: 您的通讯还不是匿名的! 请设置您的应用程序使用代理服务器 127.0.0.1:8118 或者 SOCKS4A 或者 SOCKS5 代理服务器 127.0.0.1:9050</string>
+ <string name="menu_home">首页</string>
+ <string name="menu_browse">浏览</string>
+ <string name="menu_settings">设置</string>
+ <string name="menu_log">日志</string>
+ <string name="menu_info">帮助</string>
+ <string name="menu_apps">应用</string>
+ <string name="menu_start">启动</string>
+ <string name="menu_stop">停止</string>
+ <string name="menu_about">关于</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">帮助</string>
+ <string name="button_close">关闭</string>
+ <string name="button_about">关于</string>
+ <string name="button_clear_log">Clear Log</string>
+ <string name="menu_verify">检查</string>
+ <string name="menu_exit">退出</string>
+ <string name="powered_by">由 Tor 项目强力驱动</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">透明代理(需要 root)</string>
+ <string name="pref_trans_proxy_title">透明代理</string>
+ <string name="pref_trans_proxy_summary">自动对应用程序使用 Tor</string>
+ <string name="pref_transparent_all_title">对所有应用使用 Tor</string>
+ <string name="pref_transparent_all_summary">使用 Tor 代理所有程序的流量</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Tor 二进制程序安装成功!</string>
+ <string name="status_install_fail">Tor 二进制程序无法安装。请查看日志 tor-assistants(a)torproject.org</string>
+ <string name="title_error">应用程序错误</string>
+ <string name="wizard_title">欢迎使用 Orbot</string>
+ <string name="wizard_btn_tell_me_more">关于 Orbot</string>
+ <string name="btn_next">下一步</string>
+ <string name="btn_back">上一步</string>
+ <string name="btn_finish">完成</string>
+ <string name="btn_okay">确定</string>
+ <string name="btn_cancel">取消</string>
+ <string name="wizard_welcome_msg">Orbot 将 Tor 带到 Android 之上。Tor 是自由软件,致力于构建开放网络,帮助保护网络访问的自由和隐私,可以抵御秘密的商业活动、关系以及已知的流量分析技术。\n\n*警告:*仅仅安装 Orbot 不会自动使您的移动流量匿名化!这个向导将带您入门。</string>
+ <string name="wizard_details">一些 Orbot 详情</string>
+ <string name="wizard_details_msg">Orbot 是包含 Tor、LibEvent 和 Privoxy 的开源软件。它包含了一个本地 HTTP 代理(8118)和 SOCKS 代理(9050),使您接入 Tor 网络。Orbot 在可以获得 root 权限的设备上接管所有流量经由 Tor 网络。</string>
+ <string name="wizard_permissions_root">已赋予权限</string>
+ <string name="wizard_permissions_stock">Orbot 权限</string>
+ <string name="wizard_premissions_msg_root">非常好!我们检测到您已经为 Orbot 配置了 root 权限。我们会聪明地使用这个特权。</string>
+ <string name="wizard_permissions_msg_stock">虽然并非必须,如果你的设备有 root 权限,Orbot 可以表现得更为强大。使用以下按钮来赋予 Orbot 超级能力!</string>
+ <string name="wizard_permissions_no_root">如果你没有 root 权限,或不明白上面说的是什么,那么只需使用可与 Orbot 工作的应用程序。</string>
+ <string name="wizard_permissions_consent">我明白并会以非 root 继续</string>
+ <string name="wizard_permission_enable_root">为 Orbot 赋予 root 权限</string>
+ <string name="wizard_configure">配置 Tor 使用</string>
+ <string name="wizard_configure_msg">Orbot 给予您路由所有应用程序流量通过 Tor 或者为单个程序设置选择的选项。</string>
+ <string name="wizard_configure_all">通过 Tor 代理全部应用程序</string>
+ <string name="wizard_configure_select_apps">选择使用 Tor 的单个应用程序</string>
+ <string name="wizard_tips_tricks">可用 Orbot 的应用程序</string>
+ <string name="wizard_tips_msg">我们建议您下载和使用能直接连接到 Orbot 的应用程序。点击以下按钮安装。</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (仅 Android 1.x) - 着重隐私设计的浏览器</string>
+ <string name="wizard_tips_proxy">代理设置 - 学习如何配置应用程序使用 Orbot</string>
+ <string name="wizard_proxy_help_info">代理设置</string>
+ <string name="wizard_proxy_help_msg">如果您正在使用的 Android 应用程序支持使用 HTTP 或 SOCKS 代理,您可以配置它连接到 Orbot 并使用 Tor。\n\n
+ 主机设置为 127.0.0.1 或 localhost。对于 HTTP,端口为 8118,对于 SOCKS 端口为 9050。如果可能,应当使用 SOCKS4A 或 SOCKS5。
+ \n\n
+ 您可以通过 http://tinyurl.com/proxyandroid 了解更多 Android 上使用代理的知识。</string>
+ <string name="wizard_final">Orbot 已就绪!</string>
+ <string name="wizard_final_msg">数以万计的各国人们因为各种原因使用 Tor:记者、人权工作者、法律工作者、士兵、公司、迫于实际情况使用的市民,当然也有普通的市民。现在你也即将成为其中的一员!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time">您已成功连接至 Tor 网络 - 但这并不意味着您的设备安全。您可以使用“检查”选项测试您的浏览器。\n\n访问 https://guardianproject.info/apps/orbot 或发送邮件到 help(a)guardianproject.info 以了解更多信息。</string>
+ <string name="tor_check">这将启动默认浏览器并访问 https://check.torproject.org 以测试是否正确配置了 Orbot 并确认您是否已经连接到 Tor。</string>
+ <string name="pref_hs_group">隐藏服务</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
diff --git a/values/strings.xml b/values/strings.xml
new file mode 100644
index 0000000..d5b3c50
--- /dev/null
+++ b/values/strings.xml
@@ -0,0 +1,95 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="app_name">Orbot</string>
+ <string name="app_version">1.0.5.2</string>
+ <string name="internal_web_url">http://orbot/</string>
+ <string name="default_web_url">http://check.torproject.org</string>
+ <string name="secure_default_web_url">https://check.torproject.org</string>
+ <string name="tor_check_api_url">https://check.torproject.org/?TorButton=true</string>
+ <string name="control_permission_label">start and stop Tor</string>
+ <string name="tor_proxy_service_process">torproxyservice</string>
+ <string name="status_starting_up">Orbot is starting...</string>
+ <string name="status_activated">Connected to the Tor network</string>
+ <string name="status_disabled">\"Orbot is Deactivated</string>
+ <string name="status_shutting_down">Orbot is shutting down</string>
+ <string name="tor_process_connecting">Starting Tor...</string>
+ <string name="tor_process_connecting_step2">Setting up control...</string>
+ <string name="tor_process_connecting_step3">complete.</string>
+ <string name="tor_process_connecting_step4">waiting.</string>
+ <string name="not_anonymous_yet">WARNING: Your traffic is not anonymous yet! Please configure your applications to use HTTP proxy 127.0.0.1:8118 or SOCKS4A or SOCKS5 proxy 127.0.0.1:9050</string>
+ <string name="menu_home">Home</string>
+ <string name="menu_browse">Browse</string>
+ <string name="menu_settings">Settings</string>
+ <string name="menu_log">Log</string>
+ <string name="menu_info">Help</string>
+ <string name="menu_apps">Apps</string>
+ <string name="menu_start">Start</string>
+ <string name="menu_stop">Stop</string>
+ <string name="menu_about">About</string>
+ <string name="menu_wizard">Wizard</string>
+ <string name="button_help">Help</string>
+ <string name="button_close">Close</string>
+ <string name="button_about">About</string>
+ <string name="button_clear_log">Clear Log</string>
+ <string name="menu_verify">Check</string>
+ <string name="menu_exit">Exit</string>
+ <string name="powered_by">powered by the Tor Project</string>
+ <string name="press_to_start">- long press to start -</string>
+ <string name="pref_trans_proxy_group">Transparent Proxying (Requires Root)</string>
+ <string name="pref_trans_proxy_title">Transparent Proxying</string>
+ <string name="pref_trans_proxy_summary">Automatic Torifying of Apps</string>
+ <string name="pref_transparent_all_title">Tor Everything</string>
+ <string name="pref_transparent_all_summary">Proxy traffic for all apps through Tor</string>
+ <string name="pref_transparent_port_fallback_title">Port Proxy Fallback</string>
+ <string name="pref_transparent_port_fallback_summary">WARNING: Circumvents common ports (80, 443, etc). *USE ONLY* if \'All\' or \'App\' mode doesn\'t work.</string>
+ <string name="pref_transparent_port_title">Port List</string>
+ <string name="pref_transparent_port_summary">List of ports to proxy. *USE ONLY* if \'All\' or \'App\' mode doesn\'t work</string>
+ <string name="pref_transparent_port_dialog">Enter ports to proxy</string>
+ <string name="pref_has_root">Request Root Access</string>
+ <string name="pref_has_root_summary">Request root access for transparent proxying</string>
+ <string name="status_install_success">Tor binaries successfully installed!</string>
+ <string name="status_install_fail">The Tor binary files were unable to be installed. Please check the log and notify tor-assistants(a)torproject.org</string>
+ <string name="title_error">Application Error</string>
+ <string name="wizard_title">Welcome to Orbot</string>
+ <string name="wizard_btn_tell_me_more">About Orbot</string>
+ <string name="btn_next">Next</string>
+ <string name="btn_back">Back</string>
+ <string name="btn_finish">Finish</string>
+ <string name="btn_okay">Okay</string>
+ <string name="btn_cancel">Cancel</string>
+ <string name="wizard_welcome_msg">Orbot brings Tor to Android. Tor is free software and an open network that helps you defend against a form of network surveillance that threatens personal freedom and privacy, confidential business activities and relationships, and state security known as traffic analysis.\n\n*WARNING:* Simply installing Orbot will _not_ magically anonymize your mobile traffic! This wizard will help you get started.</string>
+ <string name="wizard_details">Some Orbot Details</string>
+ <string name="wizard_details_msg">Orbot is an open-source application that contains Tor, LibEvent and Privoxy. It provides a local HTTP proxy (8118) and a SOCKS proxy (9050) into the Tor network. Orbot also has the ability, on rooted device, to send all internet traffic through Tor.</string>
+ <string name="wizard_permissions_root">Permission Granted</string>
+ <string name="wizard_permissions_stock">Orbot Permissions</string>
+ <string name="wizard_premissions_msg_root">Excellent! We\'ve detected that you have root permissions enabled for Orbot. We will use this power wisely.</string>
+ <string name="wizard_permissions_msg_stock"> While it is not required, Orbot can become a more powerful tool if your device has root access. Use the button below to grant Orbot superpowers! </string>
+ <string name="wizard_permissions_no_root">If you don\'t have root access or have no idea what we\'re talking about, just be sure to use apps made to work with Orbot.</string>
+ <string name="wizard_permissions_consent">I understand and would like to continue without root</string>
+ <string name="wizard_permission_enable_root">Grant Root for Orbot</string>
+ <string name="wizard_configure">Configure Torification</string>
+ <string name="wizard_configure_msg">Orbot gives you the option to route all application traffic through Tor OR to choose your applications individually.</string>
+ <string name="wizard_configure_all">Proxy All Apps Through Tor</string>
+ <string name="wizard_configure_select_apps">Select Individual Apps for Tor</string>
+ <string name="wizard_tips_tricks">Orbot-enabled Apps</string>
+ <string name="wizard_tips_msg">We encourage you to download &amp; use apps that know how to connect directly to Orbot. Click on the buttons below to install.</string>
+ <string name="wizard_tips_otrchat">Gibberbot - Secure instant messaging client for Android</string>
+ <string name="wizard_tips_orweb">ORWEB (Android 1.x Only) - Browser designed for privacy &amp; for Orbot</string>
+ <string name="wizard_tips_proxy">Proxy Settings - Learn how to configure apps to work with Orbot</string>
+ <string name="wizard_proxy_help_info">Proxy Settings</string>
+ <string name="wizard_proxy_help_msg">If the Android app you are using can support the use of an HTTP or SOCKS proxy, then you can configure it to connect to Orbot and use Tor.\n\n
+ The host settings is 127.0.0.1 or \"localhost\". For HTTP, the port setting is 8118. For SOCKS, the proxy is 9050. You should use SOCKS4A or SOCKS5 if possible.
+ \n\n
+ You can learn more about proxying on Android via the FAQ at: http://tinyurl.com/proxyandroid
+ </string>
+ <string name="wizard_final">Orbot is ready!</string>
+ <string name="wizard_final_msg">Hundreds of thousands of people around the world use Tor for a wide variety of reasons: journalists and bloggers, human rights workers, law enforcement officers, soldiers, corporations, citizens of repressive regimes, and just ordinary citizens... and now you are ready to, as well!</string>
+ <string name="otrchat_apk_url">market://search?q=pname:info.guardianproject.otr.app.im</string>
+ <string name="orweb_apk_url">market://search?q=pname:nfo.guardianproject.browser</string>
+ <string name="connect_first_time"> You\'ve successfully connected to the Tor network - but this does NOT mean your device is secure. You can use the \'Check\' option from the menu to test your browser. \n\nVisit us at https://guardianproject.info/apps/orbot or send an email to help(a)guardianproject.info to learn more.</string>
+ <string name="tor_check">This will open your default web browser to https://check.torproject.org in order to see if Orbot is probably configured and you are connected to Tor.</string>
+ <string name="pref_hs_group">Hidden Services</string>
+ <string name="pref_general_group">General</string>
+ <string name="pref_start_boot_title">Start Orbot on Boot</string>
+ <string name="pref_start_boot_summary">Automatically start Orbot and connect Tor when your Android device boots</string>
+</resources>
1
0
28 Sep '11
commit 483b6897b714efe7d50f6248e7d876fa322d35bc
Author: Sebastian Hahn <sebastian(a)torproject.org>
Date: Wed Sep 28 12:45:45 2011 +0200
Fix the pid check to work with -e
---
update_translations | 2 +-
1 files changed, 1 insertions(+), 1 deletions(-)
diff --git a/update_translations b/update_translations
index 79a4913..520aef3 100755
--- a/update_translations
+++ b/update_translations
@@ -8,7 +8,7 @@ SCRIPT=`basename $0`
if [ -f ${PIDFILE} ]; then
OLDPID=`cat ${PIDFILE}`
- STILL_RUNNING=`ps -ef | grep ${OLDPID} | grep ${SCRIPT}`
+ STILL_RUNNING=`ps -ef | grep ${OLDPID} | grep ${SCRIPT}` || test $? = 1;
if [ -n "${STILL_RUNNING}" ]; then
exit 2
fi
1
0
28 Sep '11
commit 5a46dc1d3cf6dc99cdd26b07343fa40fd841438f
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Sep 28 10:36:55 2011 +0000
Update translations for bridgedb
---
hu/bridgedb.po | 14 ++++++++++++--
1 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/hu/bridgedb.po b/hu/bridgedb.po
index 2dfd245..4bf965b 100644
--- a/hu/bridgedb.po
+++ b/hu/bridgedb.po
@@ -2,13 +2,15 @@
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#
+# Translators:
+# <viktor.varga(a)gmail.com>, 2011.
msgid ""
msgstr ""
"Project-Id-Version: The Tor Project\n"
"Report-Msgid-Bugs-To: https://trac.torproject.org/projects/tor\n"
"POT-Creation-Date: 2011-01-01 07:48-0800\n"
-"PO-Revision-Date: 2011-08-30 07:31+0000\n"
-"Last-Translator: runasand <runa.sandvik(a)gmail.com>\n"
+"PO-Revision-Date: 2011-09-17 09:17+0000\n"
+"Last-Translator: vargaviktor <viktor.varga(a)gmail.com>\n"
"Language-Team: LANGUAGE <LL(a)li.org>\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -38,6 +40,9 @@ msgid ""
"\"My ISP blocks connections to the Tor network\". Then add each bridge\n"
"address one at a time."
msgstr ""
+"A fenti sorok használatához navigáljon a Vidalia Hálózati beállítások "
+"oldalára, és kattintson \"Az Internet szolgáltatóm blokkolja a Tor hálózat "
+"elérését\" opcióra, majd adja hozzá egyesével az összes hídkapcsolatot."
#: lib/bridgedb/I18n.py:32
msgid ""
@@ -55,6 +60,9 @@ msgid ""
"lots of bridge addresses, you must send this request from an email address at\n"
"one of the following domains:"
msgstr ""
+"Másik lehetőség elérhető hídkapcsolat keresésére a egy levél küldése a \n"
+"bridges(a)torproject.org címre \"get bridges\" tartalommal a levél szövegében.\n"
+"Hogy még nehezebbé tegyük a támadó számára a hídkapcsolati címek megtanulását, a levelet az alábbi domainek valamelyikéről kell küldenie:"
#: lib/bridgedb/I18n.py:41
msgid "[This is an automated message; please do not reply.]"
@@ -67,6 +75,8 @@ msgid ""
"will change every few days, so check back periodically if you need more\n"
"bridge addresses."
msgstr ""
+"Másik lehetőség elérhető hídkapcsolat keresésére, ha ellátogat a \n"
+"https://bridges.torproject.org/ oldalra. Az itt található lista néhány naponta változik, szóval látogasson vissza ha több hídkapcsolati címre van szüksége."
#: lib/bridgedb/I18n.py:48
msgid "(no bridges currently available)"
1
0