tbb-commits
Threads by month
- ----- 2025 -----
- 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
- 1 participants
- 18429 discussions

[tor-browser-bundle/hardened-builds] Bug 17801: Remove special tor patches
by gk@torproject.org 10 Dec '15
by gk@torproject.org 10 Dec '15
10 Dec '15
commit fe0fbddde4c008ceba36abe826daf75fd63b403d
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 10 09:04:42 2015 +0000
Bug 17801: Remove special tor patches
---
gitian/descriptors/linux/gitian-tor.yml | 14 -
gitian/descriptors/mac/gitian-tor.yml | 14 -
gitian/descriptors/windows/gitian-tor.yml | 14 -
gitian/patches/bug15482.patch | 40 --
gitian/patches/bug16430.patch | 93 ----
gitian/patches/bug16674.patch | 74 ---
gitian/patches/bug8402-master.patch | 732 -----------------------------
gitian/patches/bug8405.patch | 84 ----
8 files changed, 1065 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index f31aac9..630c2e0 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -23,11 +23,6 @@ files:
- "openssl-linux64-utils.zip"
- "libevent-linux64-utils.zip"
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "dzip.sh"
script: |
INSTDIR="$HOME/install"
@@ -73,15 +68,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index 857b5de..a6824c0 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
@@ -54,15 +49,6 @@ script: |
export LDFLAGS="-m64 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -mmacosx-version-min=10.5"
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 601dc4e..63b527a 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "binutils.tar.bz2"
- "dzip.sh"
- "mingw-w64-win32-utils.zip"
@@ -54,15 +49,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
# We are building normal bundles without the console popping up and expert
diff --git a/gitian/patches/bug15482.patch b/gitian/patches/bug15482.patch
deleted file mode 100644
index df8a156..0000000
--- a/gitian/patches/bug15482.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 748414784f71126b093aa7466908e00f71a7b046 Mon Sep 17 00:00:00 2001
-From: Mike Perry <mikeperry-git(a)torproject.org>
-Date: Fri, 27 Mar 2015 12:57:37 -0700
-Subject: [PATCH] Bug 15482: Don't abandon circuits that are still in use for
- browsing.
-
-Only applies to connections with SOCKS auth set, so that non-web Tor
-activity is not affected.
-
-Simpler version of Nick's patch because the randomness worried me, and I'm not
-otherwise sure why we want a max here.
----
- src/or/circuituse.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/src/or/circuituse.c b/src/or/circuituse.c
-index d0d31ad..6cce4bf 100644
---- a/src/or/circuituse.c
-+++ b/src/or/circuituse.c
-@@ -2264,8 +2264,15 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn,
-
- base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
-
-- if (!circ->base_.timestamp_dirty)
-- circ->base_.timestamp_dirty = time(NULL);
-+ if (!circ->base_.timestamp_dirty) {
-+ circ->base_.timestamp_dirty = approx_time();
-+ } else if ((conn->entry_cfg.isolation_flags & ISO_SOCKSAUTH) &&
-+ (conn->socks_request->usernamelen ||
-+ conn->socks_request->passwordlen)) {
-+ /* When stream isolation is in use and controlled by an application
-+ * we are willing to keep using the stream. */
-+ circ->base_.timestamp_dirty = approx_time();
-+ }
-
- pathbias_count_use_attempt(circ);
-
---
-1.9.1
-
diff --git a/gitian/patches/bug16430.patch b/gitian/patches/bug16430.patch
deleted file mode 100644
index 81bbe3e..0000000
--- a/gitian/patches/bug16430.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 3f336966a264d7cd7c6dab08fb85d85273f06d68 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Wed, 24 Jun 2015 13:52:29 +0000
-Subject: [PATCH] Work around nytimes.com's broken hostnames in our SOCKS
- checks.
-
-RFC 952 is approximately 30 years old, and people are failing to comply,
-by serving A records with '_' as part of the hostname. Since relaxing
-the check is a QOL improvement for our userbase, relax the check to
-allow such abominations as destinations, especially since there are
-likely to be other similarly misconfigured domains out there.
----
- changes/bug16430 | 4 ++++
- src/common/util.c | 7 +++++--
- src/test/test_util.c | 9 +++++++--
- 3 files changed, 16 insertions(+), 4 deletions(-)
- create mode 100644 changes/bug16430
-
-diff --git a/changes/bug16430 b/changes/bug16430
-new file mode 100644
-index 0000000..ca7b874
---- /dev/null
-+++ b/changes/bug16430
-@@ -0,0 +1,4 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ '_' to cope with domains observed in the wild that are serving non-RFC
-+ compliant records. Resolves ticket 16430.
-diff --git a/src/common/util.c b/src/common/util.c
-index 942d0c2..4490150 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1036,6 +1036,9 @@ string_is_valid_ipv6_address(const char *string)
-
- /** Return true iff <b>string</b> matches a pattern of DNS names
- * that we allow Tor clients to connect to.
-+ *
-+ * Note: This allows certain technically invalid characters ('_') to cope
-+ * with misconfigured zones that have been encountered in the wild.
- */
- int
- string_is_valid_hostname(const char *string)
-@@ -1048,7 +1051,7 @@ string_is_valid_hostname(const char *string)
- smartlist_split_string(components,string,".",0,0);
-
- SMARTLIST_FOREACH_BEGIN(components, char *, c) {
-- if (c[0] == '-') {
-+ if ((c[0] == '-') || (*c == '_')) {
- result = 0;
- break;
- }
-@@ -1057,7 +1060,7 @@ string_is_valid_hostname(const char *string)
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
- (*c >= '0' && *c <= '9') ||
-- (*c == '-'))
-+ (*c == '-') || (*c == '_'))
- c++;
- else
- result = 0;
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index b0366db..0f64c26 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4268,18 +4268,23 @@ test_util_hostname_validation(void *arg)
- tt_assert(string_is_valid_hostname("stanford.edu"));
- tt_assert(string_is_valid_hostname("multiple-words-with-hypens.jp"));
-
-- // Subdomain name cannot start with '-'.
-+ // Subdomain name cannot start with '-' or '_'.
- tt_assert(!string_is_valid_hostname("-torproject.org"));
- tt_assert(!string_is_valid_hostname("subdomain.-domain.org"));
- tt_assert(!string_is_valid_hostname("-subdomain.domain.org"));
-+ tt_assert(!string_is_valid_hostname("___abc.org"));
-
- // Hostnames cannot contain non-alphanumeric characters.
- tt_assert(!string_is_valid_hostname("%%domain.\\org."));
- tt_assert(!string_is_valid_hostname("***x.net"));
-- tt_assert(!string_is_valid_hostname("___abc.org"));
- tt_assert(!string_is_valid_hostname("\xff\xffxyz.org"));
- tt_assert(!string_is_valid_hostname("word1 word2.net"));
-
-+ // Test workaround for nytimes.com stupidity, technically invalid,
-+ // but we allow it since they are big, even though they are failing to
-+ // comply with a ~30 year old standard.
-+ tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-+
- // XXX: do we allow single-label DNS names?
-
- done:
---
-1.9.1
-
diff --git a/gitian/patches/bug16674.patch b/gitian/patches/bug16674.patch
deleted file mode 100644
index 9497684..0000000
--- a/gitian/patches/bug16674.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From da6aa7bfa5014b980a93b38024d16b32720dc67a Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 27 Jul 2015 12:58:40 +0000
-Subject: [PATCH] Allow a single trailing `.` when validating FQDNs from SOCKS.
-
-URI syntax (and DNS syntax) allows for a single trailing `.` to
-explicitly distinguish between a relative and absolute
-(fully-qualified) domain name. While this is redundant in that RFC 1928
-DOMAINNAME addresses are *always* fully-qualified, certain clients
-blindly pass the trailing `.` along in the request.
-
-Fixes bug 16674; bugfix on 0.2.6.2-alpha.
----
- changes/bug16674 | 5 +++++
- src/common/util.c | 6 ++++++
- src/test/test_util.c | 12 ++++++++++++
- 3 files changed, 23 insertions(+)
- create mode 100644 changes/bug16674
-
-diff --git a/changes/bug16674 b/changes/bug16674
-new file mode 100644
-index 0000000..de55523
---- /dev/null
-+++ b/changes/bug16674
-@@ -0,0 +1,5 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ a single trailing '.' to cope with clients that pass FQDNs using that
-+ syntax to explicitly indicate that the domain name is
-+ fully-qualified. Fixes bug 16674; bugfix on 0.2.6.2-alpha.
-diff --git a/src/common/util.c b/src/common/util.c
-index 618e6a1..1aac4fc 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1056,6 +1056,12 @@ string_is_valid_hostname(const char *string)
- break;
- }
-
-+ /* Allow a single terminating '.' used rarely to indicate domains
-+ * are FQDNs rather than relative. */
-+ if ((c_sl_idx > 0) && (c_sl_idx + 1 == c_sl_len) && !*c) {
-+ continue;
-+ }
-+
- do {
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index 0f64c26..2bffb17 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4285,7 +4285,19 @@ test_util_hostname_validation(void *arg)
- // comply with a ~30 year old standard.
- tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-
-+ // Firefox passes FQDNs with trailing '.'s directly to the SOCKS proxy,
-+ // which is redundant since the spec states DOMAINNAME addresses are fully
-+ // qualified. While unusual, this should be tollerated.
-+ tt_assert(string_is_valid_hostname("core9_euw1.fabrik.nytimes.com."));
-+ tt_assert(!string_is_valid_hostname("..washingtonpost.is.better.com"));
-+ tt_assert(!string_is_valid_hostname("so.is..ft.com"));
-+ tt_assert(!string_is_valid_hostname("..."));
-+
- // XXX: do we allow single-label DNS names?
-+ // We shouldn't for SOCKS (spec says "contains a fully-qualified domain name"
-+ // but only test pathologically malformed traling '.' cases for now.
-+ tt_assert(!string_is_valid_hostname("."));
-+ tt_assert(!string_is_valid_hostname(".."));
-
- done:
- return;
---
-1.9.1
-
diff --git a/gitian/patches/bug8402-master.patch b/gitian/patches/bug8402-master.patch
deleted file mode 100644
index 5a6386a..0000000
--- a/gitian/patches/bug8402-master.patch
+++ /dev/null
@@ -1,732 +0,0 @@
-From 9d7410ac5837658efa9b2d7d85c0c71f09a7a759 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Tue, 25 Mar 2014 07:21:22 +0000
-Subject: [PATCH 1/5] Allow ClientTransportPlugins to use proxies
-
-This change allows using Socks4Proxy, Socks5Proxy and HTTPSProxy with
-ClientTransportPlugins via the TOR_PT_PROXY extension to the
-pluggable transport specification.
-
-This fixes bug #8402.
----
- src/or/config.c | 13 ++++--
- src/or/connection.c | 62 +++++++++++++++++++++--------
- src/or/transports.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++--
- src/or/transports.h | 6 +++
- src/test/test_pt.c | 81 +++++++++++++++++++++++++++++++++++++
- 5 files changed, 251 insertions(+), 23 deletions(-)
-
-diff --git a/src/or/config.c b/src/or/config.c
-index 0f7b1d2..b33098e 100644
---- a/src/or/config.c
-+++ b/src/or/config.c
-@@ -3174,11 +3174,11 @@ options_validate(or_options_t *old_options, or_options_t *options,
- }
- }
-
-- /* Check if more than one proxy type has been enabled. */
-+ /* Check if more than one exclusive proxy type has been enabled. */
- if (!!options->Socks4Proxy + !!options->Socks5Proxy +
-- !!options->HTTPSProxy + !!options->ClientTransportPlugin > 1)
-+ !!options->HTTPSProxy > 1)
- REJECT("You have configured more than one proxy type. "
-- "(Socks4Proxy|Socks5Proxy|HTTPSProxy|ClientTransportPlugin)");
-+ "(Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-
- /* Check if the proxies will give surprising behavior. */
- if (options->HTTPProxy && !(options->Socks4Proxy ||
-@@ -4842,6 +4842,13 @@ parse_client_transport_line(const or_options_t *options,
- pt_kickstart_client_proxy(transport_list, proxy_argv);
- }
- } else { /* external */
-+ /* ClientTransportPlugins connecting through a proxy is managed only. */
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ log_warn(LD_CONFIG, "You have configured an external proxy with another "
-+ "proxy type. (Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-+ goto err;
-+ }
-+
- if (smartlist_len(transport_list) != 1) {
- log_warn(LD_CONFIG, "You can't have an external proxy with "
- "more than one transports.");
-diff --git a/src/or/connection.c b/src/or/connection.c
-index cef9172..b32cddf 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,6 +86,8 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
-+static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-+ int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -1689,14 +1691,14 @@ get_proxy_type(void)
- {
- const or_options_t *options = get_options();
-
-- if (options->HTTPSProxy)
-+ if (options->ClientTransportPlugin)
-+ return PROXY_PLUGGABLE;
-+ else if (options->HTTPSProxy)
- return PROXY_CONNECT;
- else if (options->Socks4Proxy)
- return PROXY_SOCKS4;
- else if (options->Socks5Proxy)
- return PROXY_SOCKS5;
-- else if (options->ClientTransportPlugin)
-- return PROXY_PLUGGABLE;
- else
- return PROXY_NONE;
- }
-@@ -4771,6 +4773,35 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-+ * pluggable transport or bridge we are using.
-+ * <b>conn</b> contains the connection we are using the PT/bridge for.
-+ *
-+ * Return 0 on success, -1 on failure.
-+ */
-+static int
-+get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-+ const connection_t *conn)
-+{
-+ const or_options_t *options = get_options();
-+
-+ if (options->ClientTransportPlugin || options->Bridges) {
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
-+ return 0;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4782,6 +4813,16 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- {
- const or_options_t *options = get_options();
-
-+ /* Client Transport Plugins can use another proxy, but that should be hidden
-+ * from the rest of tor (as the plugin is responsible for dealing with the
-+ * proxy), check it first, then check the rest of the proxy types to allow
-+ * the config to have unused ClientTransportPlugin entries.
-+ */
-+ if (options->ClientTransportPlugin) {
-+ if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ return 0;
-+ }
-+
- if (options->HTTPSProxy) {
- tor_addr_copy(addr, &options->HTTPSProxyAddr);
- *port = options->HTTPSProxyPort;
-@@ -4797,19 +4838,8 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->ClientTransportPlugin ||
-- options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-+ } else if (options->Bridges) {
-+ return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
-diff --git a/src/or/transports.c b/src/or/transports.c
-index dc30754..b810315 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -124,6 +124,8 @@ static INLINE void free_execve_args(char **arg);
- #define PROTO_SMETHOD_ERROR "SMETHOD-ERROR"
- #define PROTO_CMETHODS_DONE "CMETHODS DONE"
- #define PROTO_SMETHODS_DONE "SMETHODS DONE"
-+#define PROTO_PROXY_DONE "PROXY DONE"
-+#define PROTO_PROXY_ERROR "PROXY-ERROR"
-
- /** The first and only supported - at the moment - configuration
- protocol version. */
-@@ -439,6 +441,17 @@ add_transport_to_proxy(const char *transport, managed_proxy_t *mp)
- static int
- proxy_needs_restart(const managed_proxy_t *mp)
- {
-+ int ret = 1;
-+ char* proxy_uri;
-+
-+ /* If the PT proxy config has changed, then all existing pluggable transports
-+ * should be restarted.
-+ */
-+
-+ proxy_uri = get_pt_proxy_uri();
-+ if (strcmp_opt(proxy_uri, mp->proxy_uri) != 0)
-+ goto needs_restart;
-+
- /* mp->transport_to_launch is populated with the names of the
- transports that must be launched *after* the SIGHUP.
- mp->transports is populated with the transports that were
-@@ -459,10 +472,10 @@ proxy_needs_restart(const managed_proxy_t *mp)
-
- } SMARTLIST_FOREACH_END(t);
-
-- return 0;
--
-- needs_restart:
-- return 1;
-+ ret = 0;
-+needs_restart:
-+ tor_free(proxy_uri);
-+ return ret;
- }
-
- /** Managed proxy <b>mp</b> must be restarted. Do all the necessary
-@@ -493,6 +506,11 @@ proxy_prepare_for_restart(managed_proxy_t *mp)
- SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t));
- smartlist_clear(mp->transports);
-
-+ /* Reset the proxy's HTTPS/SOCKS proxy */
-+ tor_free(mp->proxy_uri);
-+ mp->proxy_uri = get_pt_proxy_uri();
-+ mp->proxy_supported = 0;
-+
- /* flag it as an infant proxy so that it gets launched on next tick */
- mp->conf_state = PT_PROTO_INFANT;
- unconfigured_proxies_n++;
-@@ -727,12 +745,52 @@ managed_proxy_destroy(managed_proxy_t *mp,
- /* free the argv */
- free_execve_args(mp->argv);
-
-+ /* free the outgoing proxy URI */
-+ tor_free(mp->proxy_uri);
-+
- tor_process_handle_destroy(mp->process_handle, also_terminate_process);
- mp->process_handle = NULL;
-
- tor_free(mp);
- }
-
-+/** Convert the tor proxy options to a URI suitable for TOR_PT_PROXY. */
-+STATIC char *
-+get_pt_proxy_uri(void)
-+{
-+ const or_options_t *options = get_options();
-+ char *uri = NULL;
-+
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ char addr[TOR_ADDR_BUF_LEN+1];
-+
-+ if (options->Socks4Proxy) {
-+ tor_addr_to_str(addr, &options->Socks4ProxyAddr, sizeof(addr), 1);
-+ tor_asprintf(&uri, "socks4a://%s:%d", addr, options->Socks4ProxyPort);
-+ } else if (options->Socks5Proxy) {
-+ tor_addr_to_str(addr, &options->Socks5ProxyAddr, sizeof(addr), 1);
-+ if (!options->Socks5ProxyUsername && !options->Socks5ProxyPassword) {
-+ tor_asprintf(&uri, "socks5://%s:%d", addr, options->Socks5ProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "socks5://%s:%s@%s:%d",
-+ options->Socks5ProxyUsername,
-+ options->Socks5ProxyPassword,
-+ addr, options->Socks5ProxyPort);
-+ }
-+ } else if (options->HTTPSProxy) {
-+ tor_addr_to_str(addr, &options->HTTPSProxyAddr, sizeof(addr), 1);
-+ if (!options->HTTPSProxyAuthenticator) {
-+ tor_asprintf(&uri, "http://%s:%d", addr, options->HTTPSProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "http://%s@%s:%d", options->HTTPSProxyAuthenticator,
-+ addr, options->HTTPSProxyPort);
-+ }
-+ }
-+ }
-+
-+ return uri;
-+}
-+
- /** Handle a configured or broken managed proxy <b>mp</b>. */
- static void
- handle_finished_proxy(managed_proxy_t *mp)
-@@ -745,6 +803,12 @@ handle_finished_proxy(managed_proxy_t *mp)
- managed_proxy_destroy(mp, 0); /* destroy it but don't terminate */
- break;
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
-+ if (mp->proxy_uri && !mp->proxy_supported) {
-+ log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-+ "specified outgoing proxy.", mp->argv[0]);
-+ managed_proxy_destroy(mp, 1); /* annihilate it. */
-+ break;
-+ }
- register_proxy(mp); /* register its transports */
- mp->conf_state = PT_PROTO_COMPLETED; /* and mark it as completed. */
- break;
-@@ -862,6 +926,22 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
- goto err;
-
- return;
-+ } else if (!strcmpstart(line, PROTO_PROXY_DONE)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ if (mp->proxy_uri) {
-+ mp->proxy_supported = 1;
-+ return;
-+ }
-+
-+ /* No proxy was configured, this should log */
-+ } else if (!strcmpstart(line, PROTO_PROXY_ERROR)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ parse_proxy_error(line);
-+ goto err;
- } else if (!strcmpstart(line, SPAWN_ERROR_MESSAGE)) {
- /* managed proxy launch failed: parse error message to learn why. */
- int retval, child_state, saved_errno;
-@@ -1128,6 +1208,21 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
- return r;
- }
-
-+/** Parses an PROXY-ERROR <b>line</b> and warns the user accordingly. */
-+STATIC void
-+parse_proxy_error(const char *line)
-+{
-+ /* (Length of the protocol string) plus (a space) and (the first char of
-+ the error message) */
-+ if (strlen(line) < (strlen(PROTO_PROXY_ERROR) + 2))
-+ log_notice(LD_CONFIG, "Managed proxy sent us an %s without an error "
-+ "message.", PROTO_PROXY_ERROR);
-+
-+ log_warn(LD_CONFIG, "Managed proxy failed to configure the "
-+ "pluggable transport's outgoing proxy. (%s)",
-+ line+strlen(PROTO_PROXY_ERROR)+1);
-+}
-+
- /** Return a newly allocated string that tor should place in
- * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
- * manged proxy in <b>mp</b>. Return NULL if no such options are found. */
-@@ -1292,6 +1387,14 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
- } else {
- smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=");
- }
-+ } else {
-+ /* If ClientTransportPlugin has a HTTPS/SOCKS proxy configured, set the
-+ * TOR_PT_PROXY line.
-+ */
-+
-+ if (mp->proxy_uri) {
-+ smartlist_add_asprintf(envs, "TOR_PT_PROXY=%s", mp->proxy_uri);
-+ }
- }
-
- SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) {
-@@ -1324,6 +1427,7 @@ managed_proxy_create(const smartlist_t *transport_list,
- mp->is_server = is_server;
- mp->argv = proxy_argv;
- mp->transports = smartlist_new();
-+ mp->proxy_uri = get_pt_proxy_uri();
-
- mp->transports_to_launch = smartlist_new();
- SMARTLIST_FOREACH(transport_list, const char *, transport,
-diff --git a/src/or/transports.h b/src/or/transports.h
-index 1365ead..bc2331d 100644
---- a/src/or/transports.h
-+++ b/src/or/transports.h
-@@ -81,6 +81,9 @@ typedef struct {
- char **argv; /* the cli arguments of this proxy */
- int conf_protocol; /* the configuration protocol version used */
-
-+ char *proxy_uri; /* the outgoing proxy in TOR_PT_PROXY URI format */
-+ int proxy_supported : 1; /* the proxy claims to honor TOR_PT_PROXY */
-+
- int is_server; /* is it a server proxy? */
-
- /* A pointer to the process handle of this managed proxy. */
-@@ -112,6 +115,7 @@ STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp);
-
- STATIC int parse_version(const char *line, managed_proxy_t *mp);
- STATIC void parse_env_error(const char *line);
-+STATIC void parse_proxy_error(const char *line);
- STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
- STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
-
-@@ -123,6 +127,8 @@ STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
-
- STATIC int configure_proxy(managed_proxy_t *mp);
-
-+STATIC char* get_pt_proxy_uri(void);
-+
- #endif
-
- #endif
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index f71627d..788d420 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -450,6 +450,85 @@ test_pt_configure_proxy(void *arg)
- tor_free(mp);
- }
-
-+/* Test the get_pt_proxy_uri() function. */
-+static void
-+test_get_pt_proxy_uri(void *arg)
-+{
-+ or_options_t *options = get_options_mutable();
-+ char *uri = NULL;
-+ int ret;
-+ (void) arg;
-+
-+ /* Test with no proxy. */
-+ uri = get_pt_proxy_uri();
-+ tt_assert(uri == NULL);
-+
-+ /* Test with a SOCKS4 proxy. */
-+ options->Socks4Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks4Proxy = NULL;
-+
-+ /* Test with a SOCKS5 proxy, no username/password. */
-+ options->Socks5Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks5Proxy,
-+ &options->Socks5ProxyAddr,
-+ &options->Socks5ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ /* Test with a SOCKS5 proxy, with username/password. */
-+ options->Socks5ProxyUsername = "hwest";
-+ options->Socks5ProxyPassword = "r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks5Proxy = NULL;
-+
-+ /* Test with a HTTPS proxy, no authenticator. */
-+ options->HTTPSProxy = "192.0.2.1:80";
-+ ret = tor_addr_port_lookup(options->HTTPSProxy,
-+ &options->HTTPSProxyAddr,
-+ &options->HTTPSProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://192.0.2.1:80");
-+ tor_free(uri);
-+
-+ /* Test with a HTTPS proxy, with authenticator. */
-+ options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
-+ tor_free(uri);
-+
-+ options->HTTPSProxy = NULL;
-+
-+ /* Token nod to the fact that IPv6 exists. */
-+ options->Socks4Proxy = "[2001:db8::1]:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
-+ tor_free(uri);
-+
-+
-+ done:
-+ if (uri)
-+ tor_free(uri);
-+}
-+
-+
- #define PT_LEGACY(name) \
- { #name, legacy_test_helper, 0, &legacy_setup, test_pt_ ## name }
-
-@@ -462,6 +541,8 @@ struct testcase_t pt_tests[] = {
- NULL, NULL },
- { "configure_proxy",test_pt_configure_proxy, TT_FORK,
- NULL, NULL },
-+ { "get_pt_proxy_uri", test_get_pt_proxy_uri, TT_FORK,
-+ NULL, NULL },
- END_OF_TESTCASES
- };
-
---
-2.0.0.rc2
-
-
-From 92eecbfee128b22b07bcc97ac36ecdd5183c2da7 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 14 Apr 2014 21:51:34 +0000
-Subject: [PATCH 2/5] Fixed the test build with --enable-gcc-warnings
-
----
- src/test/test_pt.c | 28 ++++++++++++++--------------
- 1 file changed, 14 insertions(+), 14 deletions(-)
-
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index 788d420..cfbd084 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -464,7 +464,7 @@ test_get_pt_proxy_uri(void *arg)
- tt_assert(uri == NULL);
-
- /* Test with a SOCKS4 proxy. */
-- options->Socks4Proxy = "192.0.2.1:1080";
-+ options->Socks4Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -472,11 +472,10 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks4Proxy = NULL;
-+ tor_free(options->Socks4Proxy);
-
- /* Test with a SOCKS5 proxy, no username/password. */
-- options->Socks5Proxy = "192.0.2.1:1080";
-+ options->Socks5Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks5Proxy,
- &options->Socks5ProxyAddr,
- &options->Socks5ProxyPort);
-@@ -486,16 +485,17 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a SOCKS5 proxy, with username/password. */
-- options->Socks5ProxyUsername = "hwest";
-- options->Socks5ProxyPassword = "r34n1m470r";
-+ options->Socks5ProxyUsername = tor_strdup("hwest");
-+ options->Socks5ProxyPassword = tor_strdup("r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks5Proxy = NULL;
-+ tor_free(options->Socks5Proxy);
-+ tor_free(options->Socks5ProxyUsername);
-+ tor_free(options->Socks5ProxyPassword);
-
- /* Test with a HTTPS proxy, no authenticator. */
-- options->HTTPSProxy = "192.0.2.1:80";
-+ options->HTTPSProxy = tor_strdup("192.0.2.1:80");
- ret = tor_addr_port_lookup(options->HTTPSProxy,
- &options->HTTPSProxyAddr,
- &options->HTTPSProxyPort);
-@@ -505,15 +505,15 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a HTTPS proxy, with authenticator. */
-- options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
- tor_free(uri);
--
-- options->HTTPSProxy = NULL;
-+ tor_free(options->HTTPSProxy);
-+ tor_free(options->HTTPSProxyAuthenticator);
-
- /* Token nod to the fact that IPv6 exists. */
-- options->Socks4Proxy = "[2001:db8::1]:1080";
-+ options->Socks4Proxy = tor_strdup("[2001:db8::1]:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -521,7 +521,7 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
- tor_free(uri);
--
-+ tor_free(options->Socks4Proxy);
-
- done:
- if (uri)
---
-2.0.0.rc2
-
-
-From 8361223c10eb929b570e72853a5d9e51b67fd6c3 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:30:09 +0000
-Subject: [PATCH 3/5] Remove get_bridge_pt_addrport().
-
-The code was not disambiguating ClientTransportPlugin configured and
-not used, and ClientTransportPlugin configured, but in a failed state.
-
-The right thing to do is to undo moving the get_transport_by_addrport()
-call back into get_proxy_addrport(), and remove and explicit check for
-using a Bridge since by the time the check is made, if a Bridge is
-being used, it is PT/proxy-less.
----
- src/or/connection.c | 46 ++++++++++++----------------------------------
- 1 file changed, 12 insertions(+), 34 deletions(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index b32cddf..ff8cdf1 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,8 +86,6 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
--static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-- int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -4773,35 +4771,6 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-- * pluggable transport or bridge we are using.
-- * <b>conn</b> contains the connection we are using the PT/bridge for.
-- *
-- * Return 0 on success, -1 on failure.
-- */
--static int
--get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-- const connection_t *conn)
--{
-- const or_options_t *options = get_options();
--
-- if (options->ClientTransportPlugin || options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-- }
--
-- return -1;
--}
--
--/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4819,8 +4788,19 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- * the config to have unused ClientTransportPlugin entries.
- */
- if (options->ClientTransportPlugin) {
-- if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
- return 0;
-+ }
-+
-+ /* Unused ClientTransportPlugin. */
- }
-
- if (options->HTTPSProxy) {
-@@ -4838,8 +4818,6 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->Bridges) {
-- return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
---
-2.0.0.rc2
-
-
-From 68184b317d3f4dc14e758e451377e4e3996bd0ab Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:43:53 +0000
-Subject: [PATCH 4/5] Log the correct proxy type on failure.
-
-get_proxy_addrport fills in proxy_type with the correct value, so there
-is no point in logging something that's a "best guess" based off the
-config.
----
- src/or/connection.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index ff8cdf1..5069ed6 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -4841,7 +4841,7 @@ log_failed_proxy_connection(connection_t *conn)
- log_warn(LD_NET,
- "The connection to the %s proxy server at %s just failed. "
- "Make sure that the proxy server is up and running.",
-- proxy_type_to_string(get_proxy_type()),
-+ proxy_type_to_string(proxy_type),
- fmt_addrport(&proxy_addr, proxy_port));
- }
-
---
-2.0.0.rc2
-
-
-From 34200a44fbbd3f158ea17043c2bcd21d0e382b89 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 18:58:53 +0000
-Subject: [PATCH 5/5] Improve the log message when a transport doesn't support
- proxies.
-
-Per feedback, explicltly note that the transport will be killed when it
-does not acknowledge the configured outgoing proxy.
----
- src/or/transports.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/or/transports.c b/src/or/transports.c
-index b810315..eee159d 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -805,7 +805,8 @@ handle_finished_proxy(managed_proxy_t *mp)
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
- if (mp->proxy_uri && !mp->proxy_supported) {
- log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-- "specified outgoing proxy.", mp->argv[0]);
-+ "specified outgoing proxy and will be terminated.",
-+ mp->argv[0]);
- managed_proxy_destroy(mp, 1); /* annihilate it. */
- break;
- }
---
-2.0.0.rc2
-
diff --git a/gitian/patches/bug8405.patch b/gitian/patches/bug8405.patch
deleted file mode 100644
index 3c40632..0000000
--- a/gitian/patches/bug8405.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From a298c77f7eba232154ff08ca1119b05ccd9eee9e Mon Sep 17 00:00:00 2001
-From: Arthur Edelstein <arthuredelstein(a)gmail.com>
-Date: Tue, 15 Jul 2014 21:27:59 -0700
-Subject: [PATCH] Bug #8405: Report SOCKS username/password in CIRC status
- events
-
-Introduces two new circuit status name-value parameters: SOCKS_USERNAME
-and SOCKS_PASSWORD. Values are enclosing in quotes and unusual characters
-are escaped.
-
-Example:
-
- 650 CIRC 5 EXTENDED [...] SOCKS_USERNAME="my_username" SOCKS_PASSWORD="my_password"
----
- src/common/util.c | 14 ++++++++++++++
- src/common/util.h | 1 +
- src/or/control.c | 14 ++++++++++++++
- 3 files changed, 29 insertions(+)
-
-diff --git a/src/common/util.c b/src/common/util.c
-index 8589344..64cee56 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1222,6 +1222,20 @@ esc_for_log(const char *s)
- return result;
- }
-
-+/** Similar to esc_for_log. Allocate and return a new string representing
-+ * the first n characters in <b>chars</b>, surround by quotes and using
-+ * standard C escapes. If a NUL character is encountered in <b>chars</b>,
-+ * the resulting string will be terminated there.
-+ */
-+char *
-+esc_for_log_len(const char *chars, size_t n)
-+{
-+ char *string = tor_strndup(chars, n);
-+ char *string_escaped = esc_for_log(string);
-+ tor_free(string);
-+ return string_escaped;
-+}
-+
- /** Allocate and return a new string representing the contents of <b>s</b>,
- * surrounded by quotes and using standard C escapes.
- *
-diff --git a/src/common/util.h b/src/common/util.h
-index 97367a9..50c5a3d 100644
---- a/src/common/util.h
-+++ b/src/common/util.h
-@@ -229,6 +229,7 @@ int tor_mem_is_zero(const char *mem, size_t len);
- int tor_digest_is_zero(const char *digest);
- int tor_digest256_is_zero(const char *digest);
- char *esc_for_log(const char *string) ATTR_MALLOC;
-+char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC;
- const char *escaped(const char *string);
-
- char *tor_escape_str_for_pt_args(const char *string,
-diff --git a/src/or/control.c b/src/or/control.c
-index 9285fc5..aa46df6 100644
---- a/src/or/control.c
-+++ b/src/or/control.c
-@@ -1862,6 +1862,20 @@ circuit_describe_status_for_controller(origin_circuit_t *circ)
- smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf);
- }
-
-+ // Show username and/or password if available.
-+ if (circ->socks_username_len > 0) {
-+ char* socks_username_escaped = esc_for_log_len(circ->socks_username,
-+ (size_t) circ->socks_username_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", socks_username_escaped);
-+ tor_free(socks_username_escaped);
-+ }
-+ if (circ->socks_password_len > 0) {
-+ char* socks_password_escaped = esc_for_log_len(circ->socks_password,
-+ (size_t) circ->socks_password_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", socks_password_escaped);
-+ tor_free(socks_password_escaped);
-+ }
-+
- rv = smartlist_join_strings(descparts, " ", 0, NULL);
-
- SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp));
---
-1.8.3.4 (Apple Git-47)
-
1
0

10 Dec '15
commit 9fc1f843da2a43bc7d3a8b53964e984dd86476e3
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 10 09:04:42 2015 +0000
Bug 17801: Remove special tor patches
---
gitian/descriptors/linux/gitian-tor.yml | 14 -
gitian/descriptors/mac/gitian-tor.yml | 14 -
gitian/descriptors/windows/gitian-tor.yml | 14 -
gitian/patches/bug15482.patch | 40 --
gitian/patches/bug16430.patch | 93 ----
gitian/patches/bug16674.patch | 74 ---
gitian/patches/bug8402-master.patch | 732 -----------------------------
gitian/patches/bug8405.patch | 84 ----
8 files changed, 1065 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index d8e3557..0e35d2f 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -19,11 +19,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "dzip.sh"
- "openssl-linux32-utils.zip"
- "openssl-linux64-utils.zip"
@@ -76,15 +71,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index 857b5de..a6824c0 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
@@ -54,15 +49,6 @@ script: |
export LDFLAGS="-m64 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -mmacosx-version-min=10.5"
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 601dc4e..63b527a 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "binutils.tar.bz2"
- "dzip.sh"
- "mingw-w64-win32-utils.zip"
@@ -54,15 +49,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
# We are building normal bundles without the console popping up and expert
diff --git a/gitian/patches/bug15482.patch b/gitian/patches/bug15482.patch
deleted file mode 100644
index df8a156..0000000
--- a/gitian/patches/bug15482.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 748414784f71126b093aa7466908e00f71a7b046 Mon Sep 17 00:00:00 2001
-From: Mike Perry <mikeperry-git(a)torproject.org>
-Date: Fri, 27 Mar 2015 12:57:37 -0700
-Subject: [PATCH] Bug 15482: Don't abandon circuits that are still in use for
- browsing.
-
-Only applies to connections with SOCKS auth set, so that non-web Tor
-activity is not affected.
-
-Simpler version of Nick's patch because the randomness worried me, and I'm not
-otherwise sure why we want a max here.
----
- src/or/circuituse.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/src/or/circuituse.c b/src/or/circuituse.c
-index d0d31ad..6cce4bf 100644
---- a/src/or/circuituse.c
-+++ b/src/or/circuituse.c
-@@ -2264,8 +2264,15 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn,
-
- base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
-
-- if (!circ->base_.timestamp_dirty)
-- circ->base_.timestamp_dirty = time(NULL);
-+ if (!circ->base_.timestamp_dirty) {
-+ circ->base_.timestamp_dirty = approx_time();
-+ } else if ((conn->entry_cfg.isolation_flags & ISO_SOCKSAUTH) &&
-+ (conn->socks_request->usernamelen ||
-+ conn->socks_request->passwordlen)) {
-+ /* When stream isolation is in use and controlled by an application
-+ * we are willing to keep using the stream. */
-+ circ->base_.timestamp_dirty = approx_time();
-+ }
-
- pathbias_count_use_attempt(circ);
-
---
-1.9.1
-
diff --git a/gitian/patches/bug16430.patch b/gitian/patches/bug16430.patch
deleted file mode 100644
index 81bbe3e..0000000
--- a/gitian/patches/bug16430.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 3f336966a264d7cd7c6dab08fb85d85273f06d68 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Wed, 24 Jun 2015 13:52:29 +0000
-Subject: [PATCH] Work around nytimes.com's broken hostnames in our SOCKS
- checks.
-
-RFC 952 is approximately 30 years old, and people are failing to comply,
-by serving A records with '_' as part of the hostname. Since relaxing
-the check is a QOL improvement for our userbase, relax the check to
-allow such abominations as destinations, especially since there are
-likely to be other similarly misconfigured domains out there.
----
- changes/bug16430 | 4 ++++
- src/common/util.c | 7 +++++--
- src/test/test_util.c | 9 +++++++--
- 3 files changed, 16 insertions(+), 4 deletions(-)
- create mode 100644 changes/bug16430
-
-diff --git a/changes/bug16430 b/changes/bug16430
-new file mode 100644
-index 0000000..ca7b874
---- /dev/null
-+++ b/changes/bug16430
-@@ -0,0 +1,4 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ '_' to cope with domains observed in the wild that are serving non-RFC
-+ compliant records. Resolves ticket 16430.
-diff --git a/src/common/util.c b/src/common/util.c
-index 942d0c2..4490150 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1036,6 +1036,9 @@ string_is_valid_ipv6_address(const char *string)
-
- /** Return true iff <b>string</b> matches a pattern of DNS names
- * that we allow Tor clients to connect to.
-+ *
-+ * Note: This allows certain technically invalid characters ('_') to cope
-+ * with misconfigured zones that have been encountered in the wild.
- */
- int
- string_is_valid_hostname(const char *string)
-@@ -1048,7 +1051,7 @@ string_is_valid_hostname(const char *string)
- smartlist_split_string(components,string,".",0,0);
-
- SMARTLIST_FOREACH_BEGIN(components, char *, c) {
-- if (c[0] == '-') {
-+ if ((c[0] == '-') || (*c == '_')) {
- result = 0;
- break;
- }
-@@ -1057,7 +1060,7 @@ string_is_valid_hostname(const char *string)
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
- (*c >= '0' && *c <= '9') ||
-- (*c == '-'))
-+ (*c == '-') || (*c == '_'))
- c++;
- else
- result = 0;
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index b0366db..0f64c26 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4268,18 +4268,23 @@ test_util_hostname_validation(void *arg)
- tt_assert(string_is_valid_hostname("stanford.edu"));
- tt_assert(string_is_valid_hostname("multiple-words-with-hypens.jp"));
-
-- // Subdomain name cannot start with '-'.
-+ // Subdomain name cannot start with '-' or '_'.
- tt_assert(!string_is_valid_hostname("-torproject.org"));
- tt_assert(!string_is_valid_hostname("subdomain.-domain.org"));
- tt_assert(!string_is_valid_hostname("-subdomain.domain.org"));
-+ tt_assert(!string_is_valid_hostname("___abc.org"));
-
- // Hostnames cannot contain non-alphanumeric characters.
- tt_assert(!string_is_valid_hostname("%%domain.\\org."));
- tt_assert(!string_is_valid_hostname("***x.net"));
-- tt_assert(!string_is_valid_hostname("___abc.org"));
- tt_assert(!string_is_valid_hostname("\xff\xffxyz.org"));
- tt_assert(!string_is_valid_hostname("word1 word2.net"));
-
-+ // Test workaround for nytimes.com stupidity, technically invalid,
-+ // but we allow it since they are big, even though they are failing to
-+ // comply with a ~30 year old standard.
-+ tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-+
- // XXX: do we allow single-label DNS names?
-
- done:
---
-1.9.1
-
diff --git a/gitian/patches/bug16674.patch b/gitian/patches/bug16674.patch
deleted file mode 100644
index 9497684..0000000
--- a/gitian/patches/bug16674.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From da6aa7bfa5014b980a93b38024d16b32720dc67a Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 27 Jul 2015 12:58:40 +0000
-Subject: [PATCH] Allow a single trailing `.` when validating FQDNs from SOCKS.
-
-URI syntax (and DNS syntax) allows for a single trailing `.` to
-explicitly distinguish between a relative and absolute
-(fully-qualified) domain name. While this is redundant in that RFC 1928
-DOMAINNAME addresses are *always* fully-qualified, certain clients
-blindly pass the trailing `.` along in the request.
-
-Fixes bug 16674; bugfix on 0.2.6.2-alpha.
----
- changes/bug16674 | 5 +++++
- src/common/util.c | 6 ++++++
- src/test/test_util.c | 12 ++++++++++++
- 3 files changed, 23 insertions(+)
- create mode 100644 changes/bug16674
-
-diff --git a/changes/bug16674 b/changes/bug16674
-new file mode 100644
-index 0000000..de55523
---- /dev/null
-+++ b/changes/bug16674
-@@ -0,0 +1,5 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ a single trailing '.' to cope with clients that pass FQDNs using that
-+ syntax to explicitly indicate that the domain name is
-+ fully-qualified. Fixes bug 16674; bugfix on 0.2.6.2-alpha.
-diff --git a/src/common/util.c b/src/common/util.c
-index 618e6a1..1aac4fc 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1056,6 +1056,12 @@ string_is_valid_hostname(const char *string)
- break;
- }
-
-+ /* Allow a single terminating '.' used rarely to indicate domains
-+ * are FQDNs rather than relative. */
-+ if ((c_sl_idx > 0) && (c_sl_idx + 1 == c_sl_len) && !*c) {
-+ continue;
-+ }
-+
- do {
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index 0f64c26..2bffb17 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4285,7 +4285,19 @@ test_util_hostname_validation(void *arg)
- // comply with a ~30 year old standard.
- tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-
-+ // Firefox passes FQDNs with trailing '.'s directly to the SOCKS proxy,
-+ // which is redundant since the spec states DOMAINNAME addresses are fully
-+ // qualified. While unusual, this should be tollerated.
-+ tt_assert(string_is_valid_hostname("core9_euw1.fabrik.nytimes.com."));
-+ tt_assert(!string_is_valid_hostname("..washingtonpost.is.better.com"));
-+ tt_assert(!string_is_valid_hostname("so.is..ft.com"));
-+ tt_assert(!string_is_valid_hostname("..."));
-+
- // XXX: do we allow single-label DNS names?
-+ // We shouldn't for SOCKS (spec says "contains a fully-qualified domain name"
-+ // but only test pathologically malformed traling '.' cases for now.
-+ tt_assert(!string_is_valid_hostname("."));
-+ tt_assert(!string_is_valid_hostname(".."));
-
- done:
- return;
---
-1.9.1
-
diff --git a/gitian/patches/bug8402-master.patch b/gitian/patches/bug8402-master.patch
deleted file mode 100644
index 5a6386a..0000000
--- a/gitian/patches/bug8402-master.patch
+++ /dev/null
@@ -1,732 +0,0 @@
-From 9d7410ac5837658efa9b2d7d85c0c71f09a7a759 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Tue, 25 Mar 2014 07:21:22 +0000
-Subject: [PATCH 1/5] Allow ClientTransportPlugins to use proxies
-
-This change allows using Socks4Proxy, Socks5Proxy and HTTPSProxy with
-ClientTransportPlugins via the TOR_PT_PROXY extension to the
-pluggable transport specification.
-
-This fixes bug #8402.
----
- src/or/config.c | 13 ++++--
- src/or/connection.c | 62 +++++++++++++++++++++--------
- src/or/transports.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++--
- src/or/transports.h | 6 +++
- src/test/test_pt.c | 81 +++++++++++++++++++++++++++++++++++++
- 5 files changed, 251 insertions(+), 23 deletions(-)
-
-diff --git a/src/or/config.c b/src/or/config.c
-index 0f7b1d2..b33098e 100644
---- a/src/or/config.c
-+++ b/src/or/config.c
-@@ -3174,11 +3174,11 @@ options_validate(or_options_t *old_options, or_options_t *options,
- }
- }
-
-- /* Check if more than one proxy type has been enabled. */
-+ /* Check if more than one exclusive proxy type has been enabled. */
- if (!!options->Socks4Proxy + !!options->Socks5Proxy +
-- !!options->HTTPSProxy + !!options->ClientTransportPlugin > 1)
-+ !!options->HTTPSProxy > 1)
- REJECT("You have configured more than one proxy type. "
-- "(Socks4Proxy|Socks5Proxy|HTTPSProxy|ClientTransportPlugin)");
-+ "(Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-
- /* Check if the proxies will give surprising behavior. */
- if (options->HTTPProxy && !(options->Socks4Proxy ||
-@@ -4842,6 +4842,13 @@ parse_client_transport_line(const or_options_t *options,
- pt_kickstart_client_proxy(transport_list, proxy_argv);
- }
- } else { /* external */
-+ /* ClientTransportPlugins connecting through a proxy is managed only. */
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ log_warn(LD_CONFIG, "You have configured an external proxy with another "
-+ "proxy type. (Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-+ goto err;
-+ }
-+
- if (smartlist_len(transport_list) != 1) {
- log_warn(LD_CONFIG, "You can't have an external proxy with "
- "more than one transports.");
-diff --git a/src/or/connection.c b/src/or/connection.c
-index cef9172..b32cddf 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,6 +86,8 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
-+static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-+ int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -1689,14 +1691,14 @@ get_proxy_type(void)
- {
- const or_options_t *options = get_options();
-
-- if (options->HTTPSProxy)
-+ if (options->ClientTransportPlugin)
-+ return PROXY_PLUGGABLE;
-+ else if (options->HTTPSProxy)
- return PROXY_CONNECT;
- else if (options->Socks4Proxy)
- return PROXY_SOCKS4;
- else if (options->Socks5Proxy)
- return PROXY_SOCKS5;
-- else if (options->ClientTransportPlugin)
-- return PROXY_PLUGGABLE;
- else
- return PROXY_NONE;
- }
-@@ -4771,6 +4773,35 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-+ * pluggable transport or bridge we are using.
-+ * <b>conn</b> contains the connection we are using the PT/bridge for.
-+ *
-+ * Return 0 on success, -1 on failure.
-+ */
-+static int
-+get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-+ const connection_t *conn)
-+{
-+ const or_options_t *options = get_options();
-+
-+ if (options->ClientTransportPlugin || options->Bridges) {
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
-+ return 0;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4782,6 +4813,16 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- {
- const or_options_t *options = get_options();
-
-+ /* Client Transport Plugins can use another proxy, but that should be hidden
-+ * from the rest of tor (as the plugin is responsible for dealing with the
-+ * proxy), check it first, then check the rest of the proxy types to allow
-+ * the config to have unused ClientTransportPlugin entries.
-+ */
-+ if (options->ClientTransportPlugin) {
-+ if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ return 0;
-+ }
-+
- if (options->HTTPSProxy) {
- tor_addr_copy(addr, &options->HTTPSProxyAddr);
- *port = options->HTTPSProxyPort;
-@@ -4797,19 +4838,8 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->ClientTransportPlugin ||
-- options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-+ } else if (options->Bridges) {
-+ return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
-diff --git a/src/or/transports.c b/src/or/transports.c
-index dc30754..b810315 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -124,6 +124,8 @@ static INLINE void free_execve_args(char **arg);
- #define PROTO_SMETHOD_ERROR "SMETHOD-ERROR"
- #define PROTO_CMETHODS_DONE "CMETHODS DONE"
- #define PROTO_SMETHODS_DONE "SMETHODS DONE"
-+#define PROTO_PROXY_DONE "PROXY DONE"
-+#define PROTO_PROXY_ERROR "PROXY-ERROR"
-
- /** The first and only supported - at the moment - configuration
- protocol version. */
-@@ -439,6 +441,17 @@ add_transport_to_proxy(const char *transport, managed_proxy_t *mp)
- static int
- proxy_needs_restart(const managed_proxy_t *mp)
- {
-+ int ret = 1;
-+ char* proxy_uri;
-+
-+ /* If the PT proxy config has changed, then all existing pluggable transports
-+ * should be restarted.
-+ */
-+
-+ proxy_uri = get_pt_proxy_uri();
-+ if (strcmp_opt(proxy_uri, mp->proxy_uri) != 0)
-+ goto needs_restart;
-+
- /* mp->transport_to_launch is populated with the names of the
- transports that must be launched *after* the SIGHUP.
- mp->transports is populated with the transports that were
-@@ -459,10 +472,10 @@ proxy_needs_restart(const managed_proxy_t *mp)
-
- } SMARTLIST_FOREACH_END(t);
-
-- return 0;
--
-- needs_restart:
-- return 1;
-+ ret = 0;
-+needs_restart:
-+ tor_free(proxy_uri);
-+ return ret;
- }
-
- /** Managed proxy <b>mp</b> must be restarted. Do all the necessary
-@@ -493,6 +506,11 @@ proxy_prepare_for_restart(managed_proxy_t *mp)
- SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t));
- smartlist_clear(mp->transports);
-
-+ /* Reset the proxy's HTTPS/SOCKS proxy */
-+ tor_free(mp->proxy_uri);
-+ mp->proxy_uri = get_pt_proxy_uri();
-+ mp->proxy_supported = 0;
-+
- /* flag it as an infant proxy so that it gets launched on next tick */
- mp->conf_state = PT_PROTO_INFANT;
- unconfigured_proxies_n++;
-@@ -727,12 +745,52 @@ managed_proxy_destroy(managed_proxy_t *mp,
- /* free the argv */
- free_execve_args(mp->argv);
-
-+ /* free the outgoing proxy URI */
-+ tor_free(mp->proxy_uri);
-+
- tor_process_handle_destroy(mp->process_handle, also_terminate_process);
- mp->process_handle = NULL;
-
- tor_free(mp);
- }
-
-+/** Convert the tor proxy options to a URI suitable for TOR_PT_PROXY. */
-+STATIC char *
-+get_pt_proxy_uri(void)
-+{
-+ const or_options_t *options = get_options();
-+ char *uri = NULL;
-+
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ char addr[TOR_ADDR_BUF_LEN+1];
-+
-+ if (options->Socks4Proxy) {
-+ tor_addr_to_str(addr, &options->Socks4ProxyAddr, sizeof(addr), 1);
-+ tor_asprintf(&uri, "socks4a://%s:%d", addr, options->Socks4ProxyPort);
-+ } else if (options->Socks5Proxy) {
-+ tor_addr_to_str(addr, &options->Socks5ProxyAddr, sizeof(addr), 1);
-+ if (!options->Socks5ProxyUsername && !options->Socks5ProxyPassword) {
-+ tor_asprintf(&uri, "socks5://%s:%d", addr, options->Socks5ProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "socks5://%s:%s@%s:%d",
-+ options->Socks5ProxyUsername,
-+ options->Socks5ProxyPassword,
-+ addr, options->Socks5ProxyPort);
-+ }
-+ } else if (options->HTTPSProxy) {
-+ tor_addr_to_str(addr, &options->HTTPSProxyAddr, sizeof(addr), 1);
-+ if (!options->HTTPSProxyAuthenticator) {
-+ tor_asprintf(&uri, "http://%s:%d", addr, options->HTTPSProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "http://%s@%s:%d", options->HTTPSProxyAuthenticator,
-+ addr, options->HTTPSProxyPort);
-+ }
-+ }
-+ }
-+
-+ return uri;
-+}
-+
- /** Handle a configured or broken managed proxy <b>mp</b>. */
- static void
- handle_finished_proxy(managed_proxy_t *mp)
-@@ -745,6 +803,12 @@ handle_finished_proxy(managed_proxy_t *mp)
- managed_proxy_destroy(mp, 0); /* destroy it but don't terminate */
- break;
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
-+ if (mp->proxy_uri && !mp->proxy_supported) {
-+ log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-+ "specified outgoing proxy.", mp->argv[0]);
-+ managed_proxy_destroy(mp, 1); /* annihilate it. */
-+ break;
-+ }
- register_proxy(mp); /* register its transports */
- mp->conf_state = PT_PROTO_COMPLETED; /* and mark it as completed. */
- break;
-@@ -862,6 +926,22 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
- goto err;
-
- return;
-+ } else if (!strcmpstart(line, PROTO_PROXY_DONE)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ if (mp->proxy_uri) {
-+ mp->proxy_supported = 1;
-+ return;
-+ }
-+
-+ /* No proxy was configured, this should log */
-+ } else if (!strcmpstart(line, PROTO_PROXY_ERROR)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ parse_proxy_error(line);
-+ goto err;
- } else if (!strcmpstart(line, SPAWN_ERROR_MESSAGE)) {
- /* managed proxy launch failed: parse error message to learn why. */
- int retval, child_state, saved_errno;
-@@ -1128,6 +1208,21 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
- return r;
- }
-
-+/** Parses an PROXY-ERROR <b>line</b> and warns the user accordingly. */
-+STATIC void
-+parse_proxy_error(const char *line)
-+{
-+ /* (Length of the protocol string) plus (a space) and (the first char of
-+ the error message) */
-+ if (strlen(line) < (strlen(PROTO_PROXY_ERROR) + 2))
-+ log_notice(LD_CONFIG, "Managed proxy sent us an %s without an error "
-+ "message.", PROTO_PROXY_ERROR);
-+
-+ log_warn(LD_CONFIG, "Managed proxy failed to configure the "
-+ "pluggable transport's outgoing proxy. (%s)",
-+ line+strlen(PROTO_PROXY_ERROR)+1);
-+}
-+
- /** Return a newly allocated string that tor should place in
- * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
- * manged proxy in <b>mp</b>. Return NULL if no such options are found. */
-@@ -1292,6 +1387,14 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
- } else {
- smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=");
- }
-+ } else {
-+ /* If ClientTransportPlugin has a HTTPS/SOCKS proxy configured, set the
-+ * TOR_PT_PROXY line.
-+ */
-+
-+ if (mp->proxy_uri) {
-+ smartlist_add_asprintf(envs, "TOR_PT_PROXY=%s", mp->proxy_uri);
-+ }
- }
-
- SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) {
-@@ -1324,6 +1427,7 @@ managed_proxy_create(const smartlist_t *transport_list,
- mp->is_server = is_server;
- mp->argv = proxy_argv;
- mp->transports = smartlist_new();
-+ mp->proxy_uri = get_pt_proxy_uri();
-
- mp->transports_to_launch = smartlist_new();
- SMARTLIST_FOREACH(transport_list, const char *, transport,
-diff --git a/src/or/transports.h b/src/or/transports.h
-index 1365ead..bc2331d 100644
---- a/src/or/transports.h
-+++ b/src/or/transports.h
-@@ -81,6 +81,9 @@ typedef struct {
- char **argv; /* the cli arguments of this proxy */
- int conf_protocol; /* the configuration protocol version used */
-
-+ char *proxy_uri; /* the outgoing proxy in TOR_PT_PROXY URI format */
-+ int proxy_supported : 1; /* the proxy claims to honor TOR_PT_PROXY */
-+
- int is_server; /* is it a server proxy? */
-
- /* A pointer to the process handle of this managed proxy. */
-@@ -112,6 +115,7 @@ STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp);
-
- STATIC int parse_version(const char *line, managed_proxy_t *mp);
- STATIC void parse_env_error(const char *line);
-+STATIC void parse_proxy_error(const char *line);
- STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
- STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
-
-@@ -123,6 +127,8 @@ STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
-
- STATIC int configure_proxy(managed_proxy_t *mp);
-
-+STATIC char* get_pt_proxy_uri(void);
-+
- #endif
-
- #endif
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index f71627d..788d420 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -450,6 +450,85 @@ test_pt_configure_proxy(void *arg)
- tor_free(mp);
- }
-
-+/* Test the get_pt_proxy_uri() function. */
-+static void
-+test_get_pt_proxy_uri(void *arg)
-+{
-+ or_options_t *options = get_options_mutable();
-+ char *uri = NULL;
-+ int ret;
-+ (void) arg;
-+
-+ /* Test with no proxy. */
-+ uri = get_pt_proxy_uri();
-+ tt_assert(uri == NULL);
-+
-+ /* Test with a SOCKS4 proxy. */
-+ options->Socks4Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks4Proxy = NULL;
-+
-+ /* Test with a SOCKS5 proxy, no username/password. */
-+ options->Socks5Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks5Proxy,
-+ &options->Socks5ProxyAddr,
-+ &options->Socks5ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ /* Test with a SOCKS5 proxy, with username/password. */
-+ options->Socks5ProxyUsername = "hwest";
-+ options->Socks5ProxyPassword = "r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks5Proxy = NULL;
-+
-+ /* Test with a HTTPS proxy, no authenticator. */
-+ options->HTTPSProxy = "192.0.2.1:80";
-+ ret = tor_addr_port_lookup(options->HTTPSProxy,
-+ &options->HTTPSProxyAddr,
-+ &options->HTTPSProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://192.0.2.1:80");
-+ tor_free(uri);
-+
-+ /* Test with a HTTPS proxy, with authenticator. */
-+ options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
-+ tor_free(uri);
-+
-+ options->HTTPSProxy = NULL;
-+
-+ /* Token nod to the fact that IPv6 exists. */
-+ options->Socks4Proxy = "[2001:db8::1]:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
-+ tor_free(uri);
-+
-+
-+ done:
-+ if (uri)
-+ tor_free(uri);
-+}
-+
-+
- #define PT_LEGACY(name) \
- { #name, legacy_test_helper, 0, &legacy_setup, test_pt_ ## name }
-
-@@ -462,6 +541,8 @@ struct testcase_t pt_tests[] = {
- NULL, NULL },
- { "configure_proxy",test_pt_configure_proxy, TT_FORK,
- NULL, NULL },
-+ { "get_pt_proxy_uri", test_get_pt_proxy_uri, TT_FORK,
-+ NULL, NULL },
- END_OF_TESTCASES
- };
-
---
-2.0.0.rc2
-
-
-From 92eecbfee128b22b07bcc97ac36ecdd5183c2da7 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 14 Apr 2014 21:51:34 +0000
-Subject: [PATCH 2/5] Fixed the test build with --enable-gcc-warnings
-
----
- src/test/test_pt.c | 28 ++++++++++++++--------------
- 1 file changed, 14 insertions(+), 14 deletions(-)
-
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index 788d420..cfbd084 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -464,7 +464,7 @@ test_get_pt_proxy_uri(void *arg)
- tt_assert(uri == NULL);
-
- /* Test with a SOCKS4 proxy. */
-- options->Socks4Proxy = "192.0.2.1:1080";
-+ options->Socks4Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -472,11 +472,10 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks4Proxy = NULL;
-+ tor_free(options->Socks4Proxy);
-
- /* Test with a SOCKS5 proxy, no username/password. */
-- options->Socks5Proxy = "192.0.2.1:1080";
-+ options->Socks5Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks5Proxy,
- &options->Socks5ProxyAddr,
- &options->Socks5ProxyPort);
-@@ -486,16 +485,17 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a SOCKS5 proxy, with username/password. */
-- options->Socks5ProxyUsername = "hwest";
-- options->Socks5ProxyPassword = "r34n1m470r";
-+ options->Socks5ProxyUsername = tor_strdup("hwest");
-+ options->Socks5ProxyPassword = tor_strdup("r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks5Proxy = NULL;
-+ tor_free(options->Socks5Proxy);
-+ tor_free(options->Socks5ProxyUsername);
-+ tor_free(options->Socks5ProxyPassword);
-
- /* Test with a HTTPS proxy, no authenticator. */
-- options->HTTPSProxy = "192.0.2.1:80";
-+ options->HTTPSProxy = tor_strdup("192.0.2.1:80");
- ret = tor_addr_port_lookup(options->HTTPSProxy,
- &options->HTTPSProxyAddr,
- &options->HTTPSProxyPort);
-@@ -505,15 +505,15 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a HTTPS proxy, with authenticator. */
-- options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
- tor_free(uri);
--
-- options->HTTPSProxy = NULL;
-+ tor_free(options->HTTPSProxy);
-+ tor_free(options->HTTPSProxyAuthenticator);
-
- /* Token nod to the fact that IPv6 exists. */
-- options->Socks4Proxy = "[2001:db8::1]:1080";
-+ options->Socks4Proxy = tor_strdup("[2001:db8::1]:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -521,7 +521,7 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
- tor_free(uri);
--
-+ tor_free(options->Socks4Proxy);
-
- done:
- if (uri)
---
-2.0.0.rc2
-
-
-From 8361223c10eb929b570e72853a5d9e51b67fd6c3 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:30:09 +0000
-Subject: [PATCH 3/5] Remove get_bridge_pt_addrport().
-
-The code was not disambiguating ClientTransportPlugin configured and
-not used, and ClientTransportPlugin configured, but in a failed state.
-
-The right thing to do is to undo moving the get_transport_by_addrport()
-call back into get_proxy_addrport(), and remove and explicit check for
-using a Bridge since by the time the check is made, if a Bridge is
-being used, it is PT/proxy-less.
----
- src/or/connection.c | 46 ++++++++++++----------------------------------
- 1 file changed, 12 insertions(+), 34 deletions(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index b32cddf..ff8cdf1 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,8 +86,6 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
--static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-- int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -4773,35 +4771,6 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-- * pluggable transport or bridge we are using.
-- * <b>conn</b> contains the connection we are using the PT/bridge for.
-- *
-- * Return 0 on success, -1 on failure.
-- */
--static int
--get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-- const connection_t *conn)
--{
-- const or_options_t *options = get_options();
--
-- if (options->ClientTransportPlugin || options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-- }
--
-- return -1;
--}
--
--/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4819,8 +4788,19 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- * the config to have unused ClientTransportPlugin entries.
- */
- if (options->ClientTransportPlugin) {
-- if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
- return 0;
-+ }
-+
-+ /* Unused ClientTransportPlugin. */
- }
-
- if (options->HTTPSProxy) {
-@@ -4838,8 +4818,6 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->Bridges) {
-- return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
---
-2.0.0.rc2
-
-
-From 68184b317d3f4dc14e758e451377e4e3996bd0ab Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:43:53 +0000
-Subject: [PATCH 4/5] Log the correct proxy type on failure.
-
-get_proxy_addrport fills in proxy_type with the correct value, so there
-is no point in logging something that's a "best guess" based off the
-config.
----
- src/or/connection.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index ff8cdf1..5069ed6 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -4841,7 +4841,7 @@ log_failed_proxy_connection(connection_t *conn)
- log_warn(LD_NET,
- "The connection to the %s proxy server at %s just failed. "
- "Make sure that the proxy server is up and running.",
-- proxy_type_to_string(get_proxy_type()),
-+ proxy_type_to_string(proxy_type),
- fmt_addrport(&proxy_addr, proxy_port));
- }
-
---
-2.0.0.rc2
-
-
-From 34200a44fbbd3f158ea17043c2bcd21d0e382b89 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 18:58:53 +0000
-Subject: [PATCH 5/5] Improve the log message when a transport doesn't support
- proxies.
-
-Per feedback, explicltly note that the transport will be killed when it
-does not acknowledge the configured outgoing proxy.
----
- src/or/transports.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/or/transports.c b/src/or/transports.c
-index b810315..eee159d 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -805,7 +805,8 @@ handle_finished_proxy(managed_proxy_t *mp)
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
- if (mp->proxy_uri && !mp->proxy_supported) {
- log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-- "specified outgoing proxy.", mp->argv[0]);
-+ "specified outgoing proxy and will be terminated.",
-+ mp->argv[0]);
- managed_proxy_destroy(mp, 1); /* annihilate it. */
- break;
- }
---
-2.0.0.rc2
-
diff --git a/gitian/patches/bug8405.patch b/gitian/patches/bug8405.patch
deleted file mode 100644
index 3c40632..0000000
--- a/gitian/patches/bug8405.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From a298c77f7eba232154ff08ca1119b05ccd9eee9e Mon Sep 17 00:00:00 2001
-From: Arthur Edelstein <arthuredelstein(a)gmail.com>
-Date: Tue, 15 Jul 2014 21:27:59 -0700
-Subject: [PATCH] Bug #8405: Report SOCKS username/password in CIRC status
- events
-
-Introduces two new circuit status name-value parameters: SOCKS_USERNAME
-and SOCKS_PASSWORD. Values are enclosing in quotes and unusual characters
-are escaped.
-
-Example:
-
- 650 CIRC 5 EXTENDED [...] SOCKS_USERNAME="my_username" SOCKS_PASSWORD="my_password"
----
- src/common/util.c | 14 ++++++++++++++
- src/common/util.h | 1 +
- src/or/control.c | 14 ++++++++++++++
- 3 files changed, 29 insertions(+)
-
-diff --git a/src/common/util.c b/src/common/util.c
-index 8589344..64cee56 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1222,6 +1222,20 @@ esc_for_log(const char *s)
- return result;
- }
-
-+/** Similar to esc_for_log. Allocate and return a new string representing
-+ * the first n characters in <b>chars</b>, surround by quotes and using
-+ * standard C escapes. If a NUL character is encountered in <b>chars</b>,
-+ * the resulting string will be terminated there.
-+ */
-+char *
-+esc_for_log_len(const char *chars, size_t n)
-+{
-+ char *string = tor_strndup(chars, n);
-+ char *string_escaped = esc_for_log(string);
-+ tor_free(string);
-+ return string_escaped;
-+}
-+
- /** Allocate and return a new string representing the contents of <b>s</b>,
- * surrounded by quotes and using standard C escapes.
- *
-diff --git a/src/common/util.h b/src/common/util.h
-index 97367a9..50c5a3d 100644
---- a/src/common/util.h
-+++ b/src/common/util.h
-@@ -229,6 +229,7 @@ int tor_mem_is_zero(const char *mem, size_t len);
- int tor_digest_is_zero(const char *digest);
- int tor_digest256_is_zero(const char *digest);
- char *esc_for_log(const char *string) ATTR_MALLOC;
-+char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC;
- const char *escaped(const char *string);
-
- char *tor_escape_str_for_pt_args(const char *string,
-diff --git a/src/or/control.c b/src/or/control.c
-index 9285fc5..aa46df6 100644
---- a/src/or/control.c
-+++ b/src/or/control.c
-@@ -1862,6 +1862,20 @@ circuit_describe_status_for_controller(origin_circuit_t *circ)
- smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf);
- }
-
-+ // Show username and/or password if available.
-+ if (circ->socks_username_len > 0) {
-+ char* socks_username_escaped = esc_for_log_len(circ->socks_username,
-+ (size_t) circ->socks_username_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", socks_username_escaped);
-+ tor_free(socks_username_escaped);
-+ }
-+ if (circ->socks_password_len > 0) {
-+ char* socks_password_escaped = esc_for_log_len(circ->socks_password,
-+ (size_t) circ->socks_password_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", socks_password_escaped);
-+ tor_free(socks_password_escaped);
-+ }
-+
- rv = smartlist_join_strings(descparts, " ", 0, NULL);
-
- SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp));
---
-1.8.3.4 (Apple Git-47)
-
1
0

10 Dec '15
commit c8571a07cebe902b85afd9dfac4a07805826cfe2
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 10 08:59:32 2015 +0000
Bumping tor and openssl versions
---
gitian/versions | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/gitian/versions b/gitian/versions
index 9ca1970..3fc3b04 100755
--- a/gitian/versions
+++ b/gitian/versions
@@ -9,7 +9,7 @@ FIREFOX_VERSION=38.4.0esr
TORBROWSER_UPDATE_CHANNEL=release
TORBROWSER_TAG=tor-browser-${FIREFOX_VERSION}-5.0-1-build2
-TOR_TAG=tor-0.2.6.10
+TOR_TAG=tor-0.2.7.5
TORLAUNCHER_TAG=0.2.7.7
TORBUTTON_TAG=1.9.3.5
HTTPSE_TAG=5.0.7
@@ -35,7 +35,7 @@ OBFS4_TAG=obfs4proxy-0.0.5
GITIAN_TAG=tor-browser-builder-3.x-8-gpgsux
-OPENSSL_VER=1.0.1p
+OPENSSL_VER=1.0.1q
GMP_VER=5.1.3
FIREFOX_LANG_VER=$FIREFOX_VERSION
FIREFOX_LANG_BUILD=build2
@@ -80,7 +80,7 @@ PARSLEY_PACKAGE=Parsley-${PARSLEY_VER}.tar.gz
GO_PACKAGE=go${GO_VER}.src.tar.gz
# Hashes for packages with weak sigs or no sigs
-OPENSSL_HASH=bd5ee6803165c0fb60bbecbacacf244f1f90d2aa0d71353af610c29121e9b2f1
+OPENSSL_HASH=b3658b84e9ea606a5ded3c972a5517cd785282e7ea86b20c78aa4b773a047fb7
GMP_HASH=752079520b4690531171d0f4532e40f08600215feefede70b24fabdc6f1ab160
OSXSDK_HASH=da77bb0003fcca5ea8c4e8cb2da8828ded750c54afdcac29ec6f3b46ad5e3adf
OSXSDK_OLD_HASH=6602d8d5ddb371fbc02e2a5967d9bd0cd7358d46f9417753c8234b923f2ea6fc
1
0

[tor-browser-bundle/maint-5.0] Bug 17124: No patch for tor alpha > 0.2.7.2 anymore
by gk@torproject.org 10 Dec '15
by gk@torproject.org 10 Dec '15
10 Dec '15
commit a1e91e917dab27d229c49484d89400193d2b340b
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 10 08:51:29 2015 +0000
Bug 17124: No patch for tor alpha > 0.2.7.2 anymore
---
Bundle-Data/linux/Data/Tor/torrc-defaults | 2 +-
Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults | 2 +-
Bundle-Data/windows/Data/Tor/torrc-defaults | 2 +-
gitian/descriptors/linux/gitian-tor.yml | 2 --
gitian/descriptors/mac/gitian-tor.yml | 2 --
gitian/descriptors/windows/gitian-tor.yml | 2 --
6 files changed, 3 insertions(+), 9 deletions(-)
diff --git a/Bundle-Data/linux/Data/Tor/torrc-defaults b/Bundle-Data/linux/Data/Tor/torrc-defaults
index e4c8920..4b91aae 100644
--- a/Bundle-Data/linux/Data/Tor/torrc-defaults
+++ b/Bundle-Data/linux/Data/Tor/torrc-defaults
@@ -5,6 +5,6 @@ AvoidDiskWrites 1
Log notice stdout
# Bind to this address to listen to connections from SOCKS-speaking
# applications.
-SocksPort 9150 IPv6Traffic PreferIPv6
+SocksPort 9150 IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth
ControlPort 9151
CookieAuthentication 1
diff --git a/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults b/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
index e4c8920..4b91aae 100644
--- a/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
+++ b/Bundle-Data/mac/TorBrowser/Data/Tor/torrc-defaults
@@ -5,6 +5,6 @@ AvoidDiskWrites 1
Log notice stdout
# Bind to this address to listen to connections from SOCKS-speaking
# applications.
-SocksPort 9150 IPv6Traffic PreferIPv6
+SocksPort 9150 IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth
ControlPort 9151
CookieAuthentication 1
diff --git a/Bundle-Data/windows/Data/Tor/torrc-defaults b/Bundle-Data/windows/Data/Tor/torrc-defaults
index e4c8920..4b91aae 100644
--- a/Bundle-Data/windows/Data/Tor/torrc-defaults
+++ b/Bundle-Data/windows/Data/Tor/torrc-defaults
@@ -5,6 +5,6 @@ AvoidDiskWrites 1
Log notice stdout
# Bind to this address to listen to connections from SOCKS-speaking
# applications.
-SocksPort 9150 IPv6Traffic PreferIPv6
+SocksPort 9150 IPv6Traffic PreferIPv6 KeepAliveIsolateSOCKSAuth
ControlPort 9151
CookieAuthentication 1
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index 906077b..d8e3557 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -84,8 +84,6 @@ script: |
git am ~/build/bug15482.patch
git am ~/build/bug16430.patch
git am ~/build/bug16674.patch
- else
- git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index 8e64922..1c07538 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -62,8 +62,6 @@ script: |
git am ~/build/bug15482.patch
git am ~/build/bug16430.patch
git am ~/build/bug16674.patch
- else
- git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 7320a65..9d6838c 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -62,8 +62,6 @@ script: |
git am ~/build/bug15482.patch
git am ~/build/bug16430.patch
git am ~/build/bug16674.patch
- else
- git am ~/build/bug15482.patch
fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
1
0

[tor-browser-bundle/maint-5.0] Bug 17801: Remove special tor patches
by gk@torproject.org 10 Dec '15
by gk@torproject.org 10 Dec '15
10 Dec '15
commit d6e5bee80d153d21b2e2061ead37fd264c6c3eb6
Author: Georg Koppen <gk(a)torproject.org>
Date: Thu Dec 10 09:04:42 2015 +0000
Bug 17801: Remove special tor patches
---
gitian/descriptors/linux/gitian-tor.yml | 14 -
gitian/descriptors/mac/gitian-tor.yml | 14 -
gitian/descriptors/windows/gitian-tor.yml | 14 -
gitian/patches/bug15482.patch | 40 --
gitian/patches/bug16430.patch | 93 ----
gitian/patches/bug16674.patch | 74 ---
gitian/patches/bug8402-master.patch | 732 -----------------------------
gitian/patches/bug8405.patch | 84 ----
8 files changed, 1065 deletions(-)
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index d8e3557..0e35d2f 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -19,11 +19,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "dzip.sh"
- "openssl-linux32-utils.zip"
- "openssl-linux64-utils.zip"
@@ -76,15 +71,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index 1c07538..92f7c57 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "apple-uni-sdk-10.6_20110407-0.flosoft1_i386.deb"
- "multiarch-darwin11-cctools127.2-gcc42-5666.3-llvmgcc42-2336.1-Linux-120724.tar.xz"
- "dzip.sh"
@@ -54,15 +49,6 @@ script: |
export LDFLAGS="-m64 -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/ -L/usr/lib/apple/SDKs/MacOSX10.6.sdk/usr/lib/system/ -mmacosx-version-min=10.5"
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
./autogen.sh
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 9d6838c..6fcc72b 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -15,11 +15,6 @@ remotes:
"dir": "tor"
files:
- "versions"
-- "bug8402-master.patch"
-- "bug8405.patch"
-- "bug15482.patch"
-- "bug16430.patch"
-- "bug16674.patch"
- "binutils.tar.bz2"
- "dzip.sh"
- "mingw-w64-win32-utils.zip"
@@ -54,15 +49,6 @@ script: |
# Building tor
cd tor
git update-index --refresh -q
- export GIT_COMMITTER_NAME="nobody"
- export GIT_COMMITTER_EMAIL="nobody@localhost"
- export GIT_COMMITTER_DATE="$REFERENCE_DATETIME"
- if [ ${TOR_TAG::9} == "tor-0.2.6" ];
- then
- git am ~/build/bug15482.patch
- git am ~/build/bug16430.patch
- git am ~/build/bug16674.patch
- fi
mkdir -p $OUTDIR/src
#git archive HEAD | tar -x -C $OUTDIR/src
# Let's avoid the console window popping up.
diff --git a/gitian/patches/bug15482.patch b/gitian/patches/bug15482.patch
deleted file mode 100644
index df8a156..0000000
--- a/gitian/patches/bug15482.patch
+++ /dev/null
@@ -1,40 +0,0 @@
-From 748414784f71126b093aa7466908e00f71a7b046 Mon Sep 17 00:00:00 2001
-From: Mike Perry <mikeperry-git(a)torproject.org>
-Date: Fri, 27 Mar 2015 12:57:37 -0700
-Subject: [PATCH] Bug 15482: Don't abandon circuits that are still in use for
- browsing.
-
-Only applies to connections with SOCKS auth set, so that non-web Tor
-activity is not affected.
-
-Simpler version of Nick's patch because the randomness worried me, and I'm not
-otherwise sure why we want a max here.
----
- src/or/circuituse.c | 11 +++++++++--
- 1 file changed, 9 insertions(+), 2 deletions(-)
-
-diff --git a/src/or/circuituse.c b/src/or/circuituse.c
-index d0d31ad..6cce4bf 100644
---- a/src/or/circuituse.c
-+++ b/src/or/circuituse.c
-@@ -2264,8 +2264,15 @@ connection_ap_handshake_attach_chosen_circuit(entry_connection_t *conn,
-
- base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
-
-- if (!circ->base_.timestamp_dirty)
-- circ->base_.timestamp_dirty = time(NULL);
-+ if (!circ->base_.timestamp_dirty) {
-+ circ->base_.timestamp_dirty = approx_time();
-+ } else if ((conn->entry_cfg.isolation_flags & ISO_SOCKSAUTH) &&
-+ (conn->socks_request->usernamelen ||
-+ conn->socks_request->passwordlen)) {
-+ /* When stream isolation is in use and controlled by an application
-+ * we are willing to keep using the stream. */
-+ circ->base_.timestamp_dirty = approx_time();
-+ }
-
- pathbias_count_use_attempt(circ);
-
---
-1.9.1
-
diff --git a/gitian/patches/bug16430.patch b/gitian/patches/bug16430.patch
deleted file mode 100644
index 81bbe3e..0000000
--- a/gitian/patches/bug16430.patch
+++ /dev/null
@@ -1,93 +0,0 @@
-From 3f336966a264d7cd7c6dab08fb85d85273f06d68 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Wed, 24 Jun 2015 13:52:29 +0000
-Subject: [PATCH] Work around nytimes.com's broken hostnames in our SOCKS
- checks.
-
-RFC 952 is approximately 30 years old, and people are failing to comply,
-by serving A records with '_' as part of the hostname. Since relaxing
-the check is a QOL improvement for our userbase, relax the check to
-allow such abominations as destinations, especially since there are
-likely to be other similarly misconfigured domains out there.
----
- changes/bug16430 | 4 ++++
- src/common/util.c | 7 +++++--
- src/test/test_util.c | 9 +++++++--
- 3 files changed, 16 insertions(+), 4 deletions(-)
- create mode 100644 changes/bug16430
-
-diff --git a/changes/bug16430 b/changes/bug16430
-new file mode 100644
-index 0000000..ca7b874
---- /dev/null
-+++ b/changes/bug16430
-@@ -0,0 +1,4 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ '_' to cope with domains observed in the wild that are serving non-RFC
-+ compliant records. Resolves ticket 16430.
-diff --git a/src/common/util.c b/src/common/util.c
-index 942d0c2..4490150 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1036,6 +1036,9 @@ string_is_valid_ipv6_address(const char *string)
-
- /** Return true iff <b>string</b> matches a pattern of DNS names
- * that we allow Tor clients to connect to.
-+ *
-+ * Note: This allows certain technically invalid characters ('_') to cope
-+ * with misconfigured zones that have been encountered in the wild.
- */
- int
- string_is_valid_hostname(const char *string)
-@@ -1048,7 +1051,7 @@ string_is_valid_hostname(const char *string)
- smartlist_split_string(components,string,".",0,0);
-
- SMARTLIST_FOREACH_BEGIN(components, char *, c) {
-- if (c[0] == '-') {
-+ if ((c[0] == '-') || (*c == '_')) {
- result = 0;
- break;
- }
-@@ -1057,7 +1060,7 @@ string_is_valid_hostname(const char *string)
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
- (*c >= '0' && *c <= '9') ||
-- (*c == '-'))
-+ (*c == '-') || (*c == '_'))
- c++;
- else
- result = 0;
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index b0366db..0f64c26 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4268,18 +4268,23 @@ test_util_hostname_validation(void *arg)
- tt_assert(string_is_valid_hostname("stanford.edu"));
- tt_assert(string_is_valid_hostname("multiple-words-with-hypens.jp"));
-
-- // Subdomain name cannot start with '-'.
-+ // Subdomain name cannot start with '-' or '_'.
- tt_assert(!string_is_valid_hostname("-torproject.org"));
- tt_assert(!string_is_valid_hostname("subdomain.-domain.org"));
- tt_assert(!string_is_valid_hostname("-subdomain.domain.org"));
-+ tt_assert(!string_is_valid_hostname("___abc.org"));
-
- // Hostnames cannot contain non-alphanumeric characters.
- tt_assert(!string_is_valid_hostname("%%domain.\\org."));
- tt_assert(!string_is_valid_hostname("***x.net"));
-- tt_assert(!string_is_valid_hostname("___abc.org"));
- tt_assert(!string_is_valid_hostname("\xff\xffxyz.org"));
- tt_assert(!string_is_valid_hostname("word1 word2.net"));
-
-+ // Test workaround for nytimes.com stupidity, technically invalid,
-+ // but we allow it since they are big, even though they are failing to
-+ // comply with a ~30 year old standard.
-+ tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-+
- // XXX: do we allow single-label DNS names?
-
- done:
---
-1.9.1
-
diff --git a/gitian/patches/bug16674.patch b/gitian/patches/bug16674.patch
deleted file mode 100644
index 9497684..0000000
--- a/gitian/patches/bug16674.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From da6aa7bfa5014b980a93b38024d16b32720dc67a Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 27 Jul 2015 12:58:40 +0000
-Subject: [PATCH] Allow a single trailing `.` when validating FQDNs from SOCKS.
-
-URI syntax (and DNS syntax) allows for a single trailing `.` to
-explicitly distinguish between a relative and absolute
-(fully-qualified) domain name. While this is redundant in that RFC 1928
-DOMAINNAME addresses are *always* fully-qualified, certain clients
-blindly pass the trailing `.` along in the request.
-
-Fixes bug 16674; bugfix on 0.2.6.2-alpha.
----
- changes/bug16674 | 5 +++++
- src/common/util.c | 6 ++++++
- src/test/test_util.c | 12 ++++++++++++
- 3 files changed, 23 insertions(+)
- create mode 100644 changes/bug16674
-
-diff --git a/changes/bug16674 b/changes/bug16674
-new file mode 100644
-index 0000000..de55523
---- /dev/null
-+++ b/changes/bug16674
-@@ -0,0 +1,5 @@
-+ o Minor features (client):
-+ - Relax the validation done to hostnames in SOCKS5 requests, and allow
-+ a single trailing '.' to cope with clients that pass FQDNs using that
-+ syntax to explicitly indicate that the domain name is
-+ fully-qualified. Fixes bug 16674; bugfix on 0.2.6.2-alpha.
-diff --git a/src/common/util.c b/src/common/util.c
-index 618e6a1..1aac4fc 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1056,6 +1056,12 @@ string_is_valid_hostname(const char *string)
- break;
- }
-
-+ /* Allow a single terminating '.' used rarely to indicate domains
-+ * are FQDNs rather than relative. */
-+ if ((c_sl_idx > 0) && (c_sl_idx + 1 == c_sl_len) && !*c) {
-+ continue;
-+ }
-+
- do {
- if ((*c >= 'a' && *c <= 'z') ||
- (*c >= 'A' && *c <= 'Z') ||
-diff --git a/src/test/test_util.c b/src/test/test_util.c
-index 0f64c26..2bffb17 100644
---- a/src/test/test_util.c
-+++ b/src/test/test_util.c
-@@ -4285,7 +4285,19 @@ test_util_hostname_validation(void *arg)
- // comply with a ~30 year old standard.
- tt_assert(string_is_valid_hostname("core3_euw1.fabrik.nytimes.com"));
-
-+ // Firefox passes FQDNs with trailing '.'s directly to the SOCKS proxy,
-+ // which is redundant since the spec states DOMAINNAME addresses are fully
-+ // qualified. While unusual, this should be tollerated.
-+ tt_assert(string_is_valid_hostname("core9_euw1.fabrik.nytimes.com."));
-+ tt_assert(!string_is_valid_hostname("..washingtonpost.is.better.com"));
-+ tt_assert(!string_is_valid_hostname("so.is..ft.com"));
-+ tt_assert(!string_is_valid_hostname("..."));
-+
- // XXX: do we allow single-label DNS names?
-+ // We shouldn't for SOCKS (spec says "contains a fully-qualified domain name"
-+ // but only test pathologically malformed traling '.' cases for now.
-+ tt_assert(!string_is_valid_hostname("."));
-+ tt_assert(!string_is_valid_hostname(".."));
-
- done:
- return;
---
-1.9.1
-
diff --git a/gitian/patches/bug8402-master.patch b/gitian/patches/bug8402-master.patch
deleted file mode 100644
index 5a6386a..0000000
--- a/gitian/patches/bug8402-master.patch
+++ /dev/null
@@ -1,732 +0,0 @@
-From 9d7410ac5837658efa9b2d7d85c0c71f09a7a759 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Tue, 25 Mar 2014 07:21:22 +0000
-Subject: [PATCH 1/5] Allow ClientTransportPlugins to use proxies
-
-This change allows using Socks4Proxy, Socks5Proxy and HTTPSProxy with
-ClientTransportPlugins via the TOR_PT_PROXY extension to the
-pluggable transport specification.
-
-This fixes bug #8402.
----
- src/or/config.c | 13 ++++--
- src/or/connection.c | 62 +++++++++++++++++++++--------
- src/or/transports.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++--
- src/or/transports.h | 6 +++
- src/test/test_pt.c | 81 +++++++++++++++++++++++++++++++++++++
- 5 files changed, 251 insertions(+), 23 deletions(-)
-
-diff --git a/src/or/config.c b/src/or/config.c
-index 0f7b1d2..b33098e 100644
---- a/src/or/config.c
-+++ b/src/or/config.c
-@@ -3174,11 +3174,11 @@ options_validate(or_options_t *old_options, or_options_t *options,
- }
- }
-
-- /* Check if more than one proxy type has been enabled. */
-+ /* Check if more than one exclusive proxy type has been enabled. */
- if (!!options->Socks4Proxy + !!options->Socks5Proxy +
-- !!options->HTTPSProxy + !!options->ClientTransportPlugin > 1)
-+ !!options->HTTPSProxy > 1)
- REJECT("You have configured more than one proxy type. "
-- "(Socks4Proxy|Socks5Proxy|HTTPSProxy|ClientTransportPlugin)");
-+ "(Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-
- /* Check if the proxies will give surprising behavior. */
- if (options->HTTPProxy && !(options->Socks4Proxy ||
-@@ -4842,6 +4842,13 @@ parse_client_transport_line(const or_options_t *options,
- pt_kickstart_client_proxy(transport_list, proxy_argv);
- }
- } else { /* external */
-+ /* ClientTransportPlugins connecting through a proxy is managed only. */
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ log_warn(LD_CONFIG, "You have configured an external proxy with another "
-+ "proxy type. (Socks4Proxy|Socks5Proxy|HTTPSProxy)");
-+ goto err;
-+ }
-+
- if (smartlist_len(transport_list) != 1) {
- log_warn(LD_CONFIG, "You can't have an external proxy with "
- "more than one transports.");
-diff --git a/src/or/connection.c b/src/or/connection.c
-index cef9172..b32cddf 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,6 +86,8 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
-+static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-+ int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -1689,14 +1691,14 @@ get_proxy_type(void)
- {
- const or_options_t *options = get_options();
-
-- if (options->HTTPSProxy)
-+ if (options->ClientTransportPlugin)
-+ return PROXY_PLUGGABLE;
-+ else if (options->HTTPSProxy)
- return PROXY_CONNECT;
- else if (options->Socks4Proxy)
- return PROXY_SOCKS4;
- else if (options->Socks5Proxy)
- return PROXY_SOCKS5;
-- else if (options->ClientTransportPlugin)
-- return PROXY_PLUGGABLE;
- else
- return PROXY_NONE;
- }
-@@ -4771,6 +4773,35 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-+ * pluggable transport or bridge we are using.
-+ * <b>conn</b> contains the connection we are using the PT/bridge for.
-+ *
-+ * Return 0 on success, -1 on failure.
-+ */
-+static int
-+get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-+ const connection_t *conn)
-+{
-+ const or_options_t *options = get_options();
-+
-+ if (options->ClientTransportPlugin || options->Bridges) {
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
-+ return 0;
-+ }
-+ }
-+
-+ return -1;
-+}
-+
-+/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4782,6 +4813,16 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- {
- const or_options_t *options = get_options();
-
-+ /* Client Transport Plugins can use another proxy, but that should be hidden
-+ * from the rest of tor (as the plugin is responsible for dealing with the
-+ * proxy), check it first, then check the rest of the proxy types to allow
-+ * the config to have unused ClientTransportPlugin entries.
-+ */
-+ if (options->ClientTransportPlugin) {
-+ if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ return 0;
-+ }
-+
- if (options->HTTPSProxy) {
- tor_addr_copy(addr, &options->HTTPSProxyAddr);
- *port = options->HTTPSProxyPort;
-@@ -4797,19 +4838,8 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->ClientTransportPlugin ||
-- options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-+ } else if (options->Bridges) {
-+ return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
-diff --git a/src/or/transports.c b/src/or/transports.c
-index dc30754..b810315 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -124,6 +124,8 @@ static INLINE void free_execve_args(char **arg);
- #define PROTO_SMETHOD_ERROR "SMETHOD-ERROR"
- #define PROTO_CMETHODS_DONE "CMETHODS DONE"
- #define PROTO_SMETHODS_DONE "SMETHODS DONE"
-+#define PROTO_PROXY_DONE "PROXY DONE"
-+#define PROTO_PROXY_ERROR "PROXY-ERROR"
-
- /** The first and only supported - at the moment - configuration
- protocol version. */
-@@ -439,6 +441,17 @@ add_transport_to_proxy(const char *transport, managed_proxy_t *mp)
- static int
- proxy_needs_restart(const managed_proxy_t *mp)
- {
-+ int ret = 1;
-+ char* proxy_uri;
-+
-+ /* If the PT proxy config has changed, then all existing pluggable transports
-+ * should be restarted.
-+ */
-+
-+ proxy_uri = get_pt_proxy_uri();
-+ if (strcmp_opt(proxy_uri, mp->proxy_uri) != 0)
-+ goto needs_restart;
-+
- /* mp->transport_to_launch is populated with the names of the
- transports that must be launched *after* the SIGHUP.
- mp->transports is populated with the transports that were
-@@ -459,10 +472,10 @@ proxy_needs_restart(const managed_proxy_t *mp)
-
- } SMARTLIST_FOREACH_END(t);
-
-- return 0;
--
-- needs_restart:
-- return 1;
-+ ret = 0;
-+needs_restart:
-+ tor_free(proxy_uri);
-+ return ret;
- }
-
- /** Managed proxy <b>mp</b> must be restarted. Do all the necessary
-@@ -493,6 +506,11 @@ proxy_prepare_for_restart(managed_proxy_t *mp)
- SMARTLIST_FOREACH(mp->transports, transport_t *, t, transport_free(t));
- smartlist_clear(mp->transports);
-
-+ /* Reset the proxy's HTTPS/SOCKS proxy */
-+ tor_free(mp->proxy_uri);
-+ mp->proxy_uri = get_pt_proxy_uri();
-+ mp->proxy_supported = 0;
-+
- /* flag it as an infant proxy so that it gets launched on next tick */
- mp->conf_state = PT_PROTO_INFANT;
- unconfigured_proxies_n++;
-@@ -727,12 +745,52 @@ managed_proxy_destroy(managed_proxy_t *mp,
- /* free the argv */
- free_execve_args(mp->argv);
-
-+ /* free the outgoing proxy URI */
-+ tor_free(mp->proxy_uri);
-+
- tor_process_handle_destroy(mp->process_handle, also_terminate_process);
- mp->process_handle = NULL;
-
- tor_free(mp);
- }
-
-+/** Convert the tor proxy options to a URI suitable for TOR_PT_PROXY. */
-+STATIC char *
-+get_pt_proxy_uri(void)
-+{
-+ const or_options_t *options = get_options();
-+ char *uri = NULL;
-+
-+ if (options->Socks4Proxy || options->Socks5Proxy || options->HTTPSProxy) {
-+ char addr[TOR_ADDR_BUF_LEN+1];
-+
-+ if (options->Socks4Proxy) {
-+ tor_addr_to_str(addr, &options->Socks4ProxyAddr, sizeof(addr), 1);
-+ tor_asprintf(&uri, "socks4a://%s:%d", addr, options->Socks4ProxyPort);
-+ } else if (options->Socks5Proxy) {
-+ tor_addr_to_str(addr, &options->Socks5ProxyAddr, sizeof(addr), 1);
-+ if (!options->Socks5ProxyUsername && !options->Socks5ProxyPassword) {
-+ tor_asprintf(&uri, "socks5://%s:%d", addr, options->Socks5ProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "socks5://%s:%s@%s:%d",
-+ options->Socks5ProxyUsername,
-+ options->Socks5ProxyPassword,
-+ addr, options->Socks5ProxyPort);
-+ }
-+ } else if (options->HTTPSProxy) {
-+ tor_addr_to_str(addr, &options->HTTPSProxyAddr, sizeof(addr), 1);
-+ if (!options->HTTPSProxyAuthenticator) {
-+ tor_asprintf(&uri, "http://%s:%d", addr, options->HTTPSProxyPort);
-+ } else {
-+ tor_asprintf(&uri, "http://%s@%s:%d", options->HTTPSProxyAuthenticator,
-+ addr, options->HTTPSProxyPort);
-+ }
-+ }
-+ }
-+
-+ return uri;
-+}
-+
- /** Handle a configured or broken managed proxy <b>mp</b>. */
- static void
- handle_finished_proxy(managed_proxy_t *mp)
-@@ -745,6 +803,12 @@ handle_finished_proxy(managed_proxy_t *mp)
- managed_proxy_destroy(mp, 0); /* destroy it but don't terminate */
- break;
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
-+ if (mp->proxy_uri && !mp->proxy_supported) {
-+ log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-+ "specified outgoing proxy.", mp->argv[0]);
-+ managed_proxy_destroy(mp, 1); /* annihilate it. */
-+ break;
-+ }
- register_proxy(mp); /* register its transports */
- mp->conf_state = PT_PROTO_COMPLETED; /* and mark it as completed. */
- break;
-@@ -862,6 +926,22 @@ handle_proxy_line(const char *line, managed_proxy_t *mp)
- goto err;
-
- return;
-+ } else if (!strcmpstart(line, PROTO_PROXY_DONE)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ if (mp->proxy_uri) {
-+ mp->proxy_supported = 1;
-+ return;
-+ }
-+
-+ /* No proxy was configured, this should log */
-+ } else if (!strcmpstart(line, PROTO_PROXY_ERROR)) {
-+ if (mp->conf_state != PT_PROTO_ACCEPTING_METHODS)
-+ goto err;
-+
-+ parse_proxy_error(line);
-+ goto err;
- } else if (!strcmpstart(line, SPAWN_ERROR_MESSAGE)) {
- /* managed proxy launch failed: parse error message to learn why. */
- int retval, child_state, saved_errno;
-@@ -1128,6 +1208,21 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
- return r;
- }
-
-+/** Parses an PROXY-ERROR <b>line</b> and warns the user accordingly. */
-+STATIC void
-+parse_proxy_error(const char *line)
-+{
-+ /* (Length of the protocol string) plus (a space) and (the first char of
-+ the error message) */
-+ if (strlen(line) < (strlen(PROTO_PROXY_ERROR) + 2))
-+ log_notice(LD_CONFIG, "Managed proxy sent us an %s without an error "
-+ "message.", PROTO_PROXY_ERROR);
-+
-+ log_warn(LD_CONFIG, "Managed proxy failed to configure the "
-+ "pluggable transport's outgoing proxy. (%s)",
-+ line+strlen(PROTO_PROXY_ERROR)+1);
-+}
-+
- /** Return a newly allocated string that tor should place in
- * TOR_PT_SERVER_TRANSPORT_OPTIONS while configuring the server
- * manged proxy in <b>mp</b>. Return NULL if no such options are found. */
-@@ -1292,6 +1387,14 @@ create_managed_proxy_environment(const managed_proxy_t *mp)
- } else {
- smartlist_add_asprintf(envs, "TOR_PT_EXTENDED_SERVER_PORT=");
- }
-+ } else {
-+ /* If ClientTransportPlugin has a HTTPS/SOCKS proxy configured, set the
-+ * TOR_PT_PROXY line.
-+ */
-+
-+ if (mp->proxy_uri) {
-+ smartlist_add_asprintf(envs, "TOR_PT_PROXY=%s", mp->proxy_uri);
-+ }
- }
-
- SMARTLIST_FOREACH_BEGIN(envs, const char *, env_var) {
-@@ -1324,6 +1427,7 @@ managed_proxy_create(const smartlist_t *transport_list,
- mp->is_server = is_server;
- mp->argv = proxy_argv;
- mp->transports = smartlist_new();
-+ mp->proxy_uri = get_pt_proxy_uri();
-
- mp->transports_to_launch = smartlist_new();
- SMARTLIST_FOREACH(transport_list, const char *, transport,
-diff --git a/src/or/transports.h b/src/or/transports.h
-index 1365ead..bc2331d 100644
---- a/src/or/transports.h
-+++ b/src/or/transports.h
-@@ -81,6 +81,9 @@ typedef struct {
- char **argv; /* the cli arguments of this proxy */
- int conf_protocol; /* the configuration protocol version used */
-
-+ char *proxy_uri; /* the outgoing proxy in TOR_PT_PROXY URI format */
-+ int proxy_supported : 1; /* the proxy claims to honor TOR_PT_PROXY */
-+
- int is_server; /* is it a server proxy? */
-
- /* A pointer to the process handle of this managed proxy. */
-@@ -112,6 +115,7 @@ STATIC int parse_smethod_line(const char *line, managed_proxy_t *mp);
-
- STATIC int parse_version(const char *line, managed_proxy_t *mp);
- STATIC void parse_env_error(const char *line);
-+STATIC void parse_proxy_error(const char *line);
- STATIC void handle_proxy_line(const char *line, managed_proxy_t *mp);
- STATIC char *get_transport_options_for_server_proxy(const managed_proxy_t *mp);
-
-@@ -123,6 +127,8 @@ STATIC managed_proxy_t *managed_proxy_create(const smartlist_t *transport_list,
-
- STATIC int configure_proxy(managed_proxy_t *mp);
-
-+STATIC char* get_pt_proxy_uri(void);
-+
- #endif
-
- #endif
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index f71627d..788d420 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -450,6 +450,85 @@ test_pt_configure_proxy(void *arg)
- tor_free(mp);
- }
-
-+/* Test the get_pt_proxy_uri() function. */
-+static void
-+test_get_pt_proxy_uri(void *arg)
-+{
-+ or_options_t *options = get_options_mutable();
-+ char *uri = NULL;
-+ int ret;
-+ (void) arg;
-+
-+ /* Test with no proxy. */
-+ uri = get_pt_proxy_uri();
-+ tt_assert(uri == NULL);
-+
-+ /* Test with a SOCKS4 proxy. */
-+ options->Socks4Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks4Proxy = NULL;
-+
-+ /* Test with a SOCKS5 proxy, no username/password. */
-+ options->Socks5Proxy = "192.0.2.1:1080";
-+ ret = tor_addr_port_lookup(options->Socks5Proxy,
-+ &options->Socks5ProxyAddr,
-+ &options->Socks5ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ /* Test with a SOCKS5 proxy, with username/password. */
-+ options->Socks5ProxyUsername = "hwest";
-+ options->Socks5ProxyPassword = "r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
-+ tor_free(uri);
-+
-+ options->Socks5Proxy = NULL;
-+
-+ /* Test with a HTTPS proxy, no authenticator. */
-+ options->HTTPSProxy = "192.0.2.1:80";
-+ ret = tor_addr_port_lookup(options->HTTPSProxy,
-+ &options->HTTPSProxyAddr,
-+ &options->HTTPSProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://192.0.2.1:80");
-+ tor_free(uri);
-+
-+ /* Test with a HTTPS proxy, with authenticator. */
-+ options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
-+ tor_free(uri);
-+
-+ options->HTTPSProxy = NULL;
-+
-+ /* Token nod to the fact that IPv6 exists. */
-+ options->Socks4Proxy = "[2001:db8::1]:1080";
-+ ret = tor_addr_port_lookup(options->Socks4Proxy,
-+ &options->Socks4ProxyAddr,
-+ &options->Socks4ProxyPort);
-+ tt_assert(ret == 0);
-+ uri = get_pt_proxy_uri();
-+ tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
-+ tor_free(uri);
-+
-+
-+ done:
-+ if (uri)
-+ tor_free(uri);
-+}
-+
-+
- #define PT_LEGACY(name) \
- { #name, legacy_test_helper, 0, &legacy_setup, test_pt_ ## name }
-
-@@ -462,6 +541,8 @@ struct testcase_t pt_tests[] = {
- NULL, NULL },
- { "configure_proxy",test_pt_configure_proxy, TT_FORK,
- NULL, NULL },
-+ { "get_pt_proxy_uri", test_get_pt_proxy_uri, TT_FORK,
-+ NULL, NULL },
- END_OF_TESTCASES
- };
-
---
-2.0.0.rc2
-
-
-From 92eecbfee128b22b07bcc97ac36ecdd5183c2da7 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Mon, 14 Apr 2014 21:51:34 +0000
-Subject: [PATCH 2/5] Fixed the test build with --enable-gcc-warnings
-
----
- src/test/test_pt.c | 28 ++++++++++++++--------------
- 1 file changed, 14 insertions(+), 14 deletions(-)
-
-diff --git a/src/test/test_pt.c b/src/test/test_pt.c
-index 788d420..cfbd084 100644
---- a/src/test/test_pt.c
-+++ b/src/test/test_pt.c
-@@ -464,7 +464,7 @@ test_get_pt_proxy_uri(void *arg)
- tt_assert(uri == NULL);
-
- /* Test with a SOCKS4 proxy. */
-- options->Socks4Proxy = "192.0.2.1:1080";
-+ options->Socks4Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -472,11 +472,10 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks4Proxy = NULL;
-+ tor_free(options->Socks4Proxy);
-
- /* Test with a SOCKS5 proxy, no username/password. */
-- options->Socks5Proxy = "192.0.2.1:1080";
-+ options->Socks5Proxy = tor_strdup("192.0.2.1:1080");
- ret = tor_addr_port_lookup(options->Socks5Proxy,
- &options->Socks5ProxyAddr,
- &options->Socks5ProxyPort);
-@@ -486,16 +485,17 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a SOCKS5 proxy, with username/password. */
-- options->Socks5ProxyUsername = "hwest";
-- options->Socks5ProxyPassword = "r34n1m470r";
-+ options->Socks5ProxyUsername = tor_strdup("hwest");
-+ options->Socks5ProxyPassword = tor_strdup("r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
- tor_free(uri);
--
-- options->Socks5Proxy = NULL;
-+ tor_free(options->Socks5Proxy);
-+ tor_free(options->Socks5ProxyUsername);
-+ tor_free(options->Socks5ProxyPassword);
-
- /* Test with a HTTPS proxy, no authenticator. */
-- options->HTTPSProxy = "192.0.2.1:80";
-+ options->HTTPSProxy = tor_strdup("192.0.2.1:80");
- ret = tor_addr_port_lookup(options->HTTPSProxy,
- &options->HTTPSProxyAddr,
- &options->HTTPSProxyPort);
-@@ -505,15 +505,15 @@ test_get_pt_proxy_uri(void *arg)
- tor_free(uri);
-
- /* Test with a HTTPS proxy, with authenticator. */
-- options->HTTPSProxyAuthenticator = "hwest:r34n1m470r";
-+ options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r");
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
- tor_free(uri);
--
-- options->HTTPSProxy = NULL;
-+ tor_free(options->HTTPSProxy);
-+ tor_free(options->HTTPSProxyAuthenticator);
-
- /* Token nod to the fact that IPv6 exists. */
-- options->Socks4Proxy = "[2001:db8::1]:1080";
-+ options->Socks4Proxy = tor_strdup("[2001:db8::1]:1080");
- ret = tor_addr_port_lookup(options->Socks4Proxy,
- &options->Socks4ProxyAddr,
- &options->Socks4ProxyPort);
-@@ -521,7 +521,7 @@ test_get_pt_proxy_uri(void *arg)
- uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
- tor_free(uri);
--
-+ tor_free(options->Socks4Proxy);
-
- done:
- if (uri)
---
-2.0.0.rc2
-
-
-From 8361223c10eb929b570e72853a5d9e51b67fd6c3 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:30:09 +0000
-Subject: [PATCH 3/5] Remove get_bridge_pt_addrport().
-
-The code was not disambiguating ClientTransportPlugin configured and
-not used, and ClientTransportPlugin configured, but in a failed state.
-
-The right thing to do is to undo moving the get_transport_by_addrport()
-call back into get_proxy_addrport(), and remove and explicit check for
-using a Bridge since by the time the check is made, if a Bridge is
-being used, it is PT/proxy-less.
----
- src/or/connection.c | 46 ++++++++++++----------------------------------
- 1 file changed, 12 insertions(+), 34 deletions(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index b32cddf..ff8cdf1 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -86,8 +86,6 @@ static int connection_read_https_proxy_response(connection_t *conn);
- static void connection_send_socks5_connect(connection_t *conn);
- static const char *proxy_type_to_string(int proxy_type);
- static int get_proxy_type(void);
--static int get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port,
-- int *proxy_type, const connection_t *conn);
-
- /** The last addresses that our network interface seemed to have been
- * binding to. We use this as one way to detect when our IP changes.
-@@ -4773,35 +4771,6 @@ assert_connection_ok(connection_t *conn, time_t now)
- }
-
- /** Fills <b>addr</b> and <b>port</b> with the details of the global
-- * pluggable transport or bridge we are using.
-- * <b>conn</b> contains the connection we are using the PT/bridge for.
-- *
-- * Return 0 on success, -1 on failure.
-- */
--static int
--get_bridge_pt_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
-- const connection_t *conn)
--{
-- const or_options_t *options = get_options();
--
-- if (options->ClientTransportPlugin || options->Bridges) {
-- const transport_t *transport = NULL;
-- int r;
-- r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-- if (r<0)
-- return -1;
-- if (transport) { /* transport found */
-- tor_addr_copy(addr, &transport->addr);
-- *port = transport->port;
-- *proxy_type = transport->socks_version;
-- return 0;
-- }
-- }
--
-- return -1;
--}
--
--/** Fills <b>addr</b> and <b>port</b> with the details of the global
- * proxy server we are using.
- * <b>conn</b> contains the connection we are using the proxy for.
- *
-@@ -4819,8 +4788,19 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- * the config to have unused ClientTransportPlugin entries.
- */
- if (options->ClientTransportPlugin) {
-- if (get_bridge_pt_addrport(addr, port, proxy_type, conn) == 0)
-+ const transport_t *transport = NULL;
-+ int r;
-+ r = get_transport_by_bridge_addrport(&conn->addr, conn->port, &transport);
-+ if (r<0)
-+ return -1;
-+ if (transport) { /* transport found */
-+ tor_addr_copy(addr, &transport->addr);
-+ *port = transport->port;
-+ *proxy_type = transport->socks_version;
- return 0;
-+ }
-+
-+ /* Unused ClientTransportPlugin. */
- }
-
- if (options->HTTPSProxy) {
-@@ -4838,8 +4818,6 @@ get_proxy_addrport(tor_addr_t *addr, uint16_t *port, int *proxy_type,
- *port = options->Socks5ProxyPort;
- *proxy_type = PROXY_SOCKS5;
- return 0;
-- } else if (options->Bridges) {
-- return get_bridge_pt_addrport(addr, port, proxy_type, conn);
- }
-
- tor_addr_make_unspec(addr);
---
-2.0.0.rc2
-
-
-From 68184b317d3f4dc14e758e451377e4e3996bd0ab Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 03:43:53 +0000
-Subject: [PATCH 4/5] Log the correct proxy type on failure.
-
-get_proxy_addrport fills in proxy_type with the correct value, so there
-is no point in logging something that's a "best guess" based off the
-config.
----
- src/or/connection.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/src/or/connection.c b/src/or/connection.c
-index ff8cdf1..5069ed6 100644
---- a/src/or/connection.c
-+++ b/src/or/connection.c
-@@ -4841,7 +4841,7 @@ log_failed_proxy_connection(connection_t *conn)
- log_warn(LD_NET,
- "The connection to the %s proxy server at %s just failed. "
- "Make sure that the proxy server is up and running.",
-- proxy_type_to_string(get_proxy_type()),
-+ proxy_type_to_string(proxy_type),
- fmt_addrport(&proxy_addr, proxy_port));
- }
-
---
-2.0.0.rc2
-
-
-From 34200a44fbbd3f158ea17043c2bcd21d0e382b89 Mon Sep 17 00:00:00 2001
-From: Yawning Angel <yawning(a)schwanenlied.me>
-Date: Thu, 1 May 2014 18:58:53 +0000
-Subject: [PATCH 5/5] Improve the log message when a transport doesn't support
- proxies.
-
-Per feedback, explicltly note that the transport will be killed when it
-does not acknowledge the configured outgoing proxy.
----
- src/or/transports.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/src/or/transports.c b/src/or/transports.c
-index b810315..eee159d 100644
---- a/src/or/transports.c
-+++ b/src/or/transports.c
-@@ -805,7 +805,8 @@ handle_finished_proxy(managed_proxy_t *mp)
- case PT_PROTO_CONFIGURED: /* if configured correctly: */
- if (mp->proxy_uri && !mp->proxy_supported) {
- log_warn(LD_CONFIG, "Managed proxy '%s' did not configure the "
-- "specified outgoing proxy.", mp->argv[0]);
-+ "specified outgoing proxy and will be terminated.",
-+ mp->argv[0]);
- managed_proxy_destroy(mp, 1); /* annihilate it. */
- break;
- }
---
-2.0.0.rc2
-
diff --git a/gitian/patches/bug8405.patch b/gitian/patches/bug8405.patch
deleted file mode 100644
index 3c40632..0000000
--- a/gitian/patches/bug8405.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From a298c77f7eba232154ff08ca1119b05ccd9eee9e Mon Sep 17 00:00:00 2001
-From: Arthur Edelstein <arthuredelstein(a)gmail.com>
-Date: Tue, 15 Jul 2014 21:27:59 -0700
-Subject: [PATCH] Bug #8405: Report SOCKS username/password in CIRC status
- events
-
-Introduces two new circuit status name-value parameters: SOCKS_USERNAME
-and SOCKS_PASSWORD. Values are enclosing in quotes and unusual characters
-are escaped.
-
-Example:
-
- 650 CIRC 5 EXTENDED [...] SOCKS_USERNAME="my_username" SOCKS_PASSWORD="my_password"
----
- src/common/util.c | 14 ++++++++++++++
- src/common/util.h | 1 +
- src/or/control.c | 14 ++++++++++++++
- 3 files changed, 29 insertions(+)
-
-diff --git a/src/common/util.c b/src/common/util.c
-index 8589344..64cee56 100644
---- a/src/common/util.c
-+++ b/src/common/util.c
-@@ -1222,6 +1222,20 @@ esc_for_log(const char *s)
- return result;
- }
-
-+/** Similar to esc_for_log. Allocate and return a new string representing
-+ * the first n characters in <b>chars</b>, surround by quotes and using
-+ * standard C escapes. If a NUL character is encountered in <b>chars</b>,
-+ * the resulting string will be terminated there.
-+ */
-+char *
-+esc_for_log_len(const char *chars, size_t n)
-+{
-+ char *string = tor_strndup(chars, n);
-+ char *string_escaped = esc_for_log(string);
-+ tor_free(string);
-+ return string_escaped;
-+}
-+
- /** Allocate and return a new string representing the contents of <b>s</b>,
- * surrounded by quotes and using standard C escapes.
- *
-diff --git a/src/common/util.h b/src/common/util.h
-index 97367a9..50c5a3d 100644
---- a/src/common/util.h
-+++ b/src/common/util.h
-@@ -229,6 +229,7 @@ int tor_mem_is_zero(const char *mem, size_t len);
- int tor_digest_is_zero(const char *digest);
- int tor_digest256_is_zero(const char *digest);
- char *esc_for_log(const char *string) ATTR_MALLOC;
-+char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC;
- const char *escaped(const char *string);
-
- char *tor_escape_str_for_pt_args(const char *string,
-diff --git a/src/or/control.c b/src/or/control.c
-index 9285fc5..aa46df6 100644
---- a/src/or/control.c
-+++ b/src/or/control.c
-@@ -1862,6 +1862,20 @@ circuit_describe_status_for_controller(origin_circuit_t *circ)
- smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf);
- }
-
-+ // Show username and/or password if available.
-+ if (circ->socks_username_len > 0) {
-+ char* socks_username_escaped = esc_for_log_len(circ->socks_username,
-+ (size_t) circ->socks_username_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", socks_username_escaped);
-+ tor_free(socks_username_escaped);
-+ }
-+ if (circ->socks_password_len > 0) {
-+ char* socks_password_escaped = esc_for_log_len(circ->socks_password,
-+ (size_t) circ->socks_password_len);
-+ smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", socks_password_escaped);
-+ tor_free(socks_password_escaped);
-+ }
-+
- rv = smartlist_join_strings(descparts, " ", 0, NULL);
-
- SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp));
---
-1.8.3.4 (Apple Git-47)
-
1
0

[tor-browser/tor-browser-38.4.0esr-5.0-1] Bug 16863: console.error on new Tor Browser window
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 916624727c1effa1987dff1cc5e37961a9e0e7f5
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Dec 9 11:47:08 2015 -0500
Bug 16863: console.error on new Tor Browser window
Improve error handling and avoid confusing error log messages
when loop.enabled is false.
---
browser/components/customizableui/CustomizableUI.jsm | 8 ++++++++
browser/components/customizableui/CustomizableWidgets.jsm | 8 +++-----
browser/components/loop/MozLoopService.jsm | 2 +-
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/browser/components/customizableui/CustomizableUI.jsm b/browser/components/customizableui/CustomizableUI.jsm
index 54c2ede..a43404e 100644
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -1186,6 +1186,11 @@ let CustomizableUIInternal = {
throw new Error("buildWidget was passed a non-widget to build.");
}
+ if (aWidget.onIsHidden && aWidget.onIsHidden()) {
+ LOG("Skipping hidden widget " + aWidget.id + " of type " + aWidget.type);
+ return undefined;
+ }
+
LOG("Building " + aWidget.id + " of type " + aWidget.type);
let node;
@@ -2180,6 +2185,7 @@ let CustomizableUIInternal = {
widget._introducedInVersion = aData.introducedInVersion || 0;
}
+ this.wrapWidgetEventHandler("onIsHidden", widget);
this.wrapWidgetEventHandler("onBeforeCreated", widget);
this.wrapWidgetEventHandler("onClick", widget);
this.wrapWidgetEventHandler("onCreated", widget);
@@ -3015,6 +3021,8 @@ this.CustomizableUI = {
* of the widget.
* - viewId: Only useful for views (and required there): the id of the
* <panelview> that should be shown when clicking the widget.
+ * - onIsHidden(): Called to check whether a widget should be hidden
+ * (optional; returns a Boolean value).
* - onBuild(aDoc): Only useful for custom widgets (and required there); a
* function that will be invoked with the document in which
* to build a widget. Should return the DOM node that has
diff --git a/browser/components/customizableui/CustomizableWidgets.jsm b/browser/components/customizableui/CustomizableWidgets.jsm
index 75f69dd..4a8bacf 100644
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -933,12 +933,10 @@ const CustomizableWidgets = [
// Not in private browsing, see bug 1108187.
showInPrivateBrowsing: false,
introducedInVersion: 4,
+ onIsHidden: function() {
+ return !Services.prefs.getBoolPref("loop.enabled");
+ },
onBuild: function(aDocument) {
- // If we're not supposed to see the button, return zip.
- if (!Services.prefs.getBoolPref("loop.enabled")) {
- return null;
- }
-
let node = aDocument.createElementNS(kNSXUL, "toolbarbutton");
node.setAttribute("id", this.id);
node.classList.add("toolbarbutton-1");
diff --git a/browser/components/loop/MozLoopService.jsm b/browser/components/loop/MozLoopService.jsm
index 3f6a77c..d915070 100644
--- a/browser/components/loop/MozLoopService.jsm
+++ b/browser/components/loop/MozLoopService.jsm
@@ -1107,7 +1107,7 @@ this.MozLoopService = {
// Don't do anything if loop is not enabled.
if (!Services.prefs.getBoolPref("loop.enabled")) {
- return Promise.reject(new Error("loop is not enabled"));
+ return Promise.resolve();
}
if (Services.prefs.getPrefType("loop.fxa.enabled") == Services.prefs.PREF_BOOL) {
1
0

[tor-browser/tor-browser-38.4.0esr-5.5-1] Bug 16863: console.error on new Tor Browser window
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit c2ce09f61101f3ac2d16d644d7fb56c035bec9ba
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Wed Dec 9 11:47:08 2015 -0500
Bug 16863: console.error on new Tor Browser window
Improve error handling and avoid confusing error log messages
when loop.enabled is false.
---
browser/components/customizableui/CustomizableUI.jsm | 8 ++++++++
browser/components/customizableui/CustomizableWidgets.jsm | 8 +++-----
browser/components/loop/MozLoopService.jsm | 2 +-
3 files changed, 12 insertions(+), 6 deletions(-)
diff --git a/browser/components/customizableui/CustomizableUI.jsm b/browser/components/customizableui/CustomizableUI.jsm
index 54c2ede..a43404e 100644
--- a/browser/components/customizableui/CustomizableUI.jsm
+++ b/browser/components/customizableui/CustomizableUI.jsm
@@ -1186,6 +1186,11 @@ let CustomizableUIInternal = {
throw new Error("buildWidget was passed a non-widget to build.");
}
+ if (aWidget.onIsHidden && aWidget.onIsHidden()) {
+ LOG("Skipping hidden widget " + aWidget.id + " of type " + aWidget.type);
+ return undefined;
+ }
+
LOG("Building " + aWidget.id + " of type " + aWidget.type);
let node;
@@ -2180,6 +2185,7 @@ let CustomizableUIInternal = {
widget._introducedInVersion = aData.introducedInVersion || 0;
}
+ this.wrapWidgetEventHandler("onIsHidden", widget);
this.wrapWidgetEventHandler("onBeforeCreated", widget);
this.wrapWidgetEventHandler("onClick", widget);
this.wrapWidgetEventHandler("onCreated", widget);
@@ -3015,6 +3021,8 @@ this.CustomizableUI = {
* of the widget.
* - viewId: Only useful for views (and required there): the id of the
* <panelview> that should be shown when clicking the widget.
+ * - onIsHidden(): Called to check whether a widget should be hidden
+ * (optional; returns a Boolean value).
* - onBuild(aDoc): Only useful for custom widgets (and required there); a
* function that will be invoked with the document in which
* to build a widget. Should return the DOM node that has
diff --git a/browser/components/customizableui/CustomizableWidgets.jsm b/browser/components/customizableui/CustomizableWidgets.jsm
index 75f69dd..4a8bacf 100644
--- a/browser/components/customizableui/CustomizableWidgets.jsm
+++ b/browser/components/customizableui/CustomizableWidgets.jsm
@@ -933,12 +933,10 @@ const CustomizableWidgets = [
// Not in private browsing, see bug 1108187.
showInPrivateBrowsing: false,
introducedInVersion: 4,
+ onIsHidden: function() {
+ return !Services.prefs.getBoolPref("loop.enabled");
+ },
onBuild: function(aDocument) {
- // If we're not supposed to see the button, return zip.
- if (!Services.prefs.getBoolPref("loop.enabled")) {
- return null;
- }
-
let node = aDocument.createElementNS(kNSXUL, "toolbarbutton");
node.setAttribute("id", this.id);
node.classList.add("toolbarbutton-1");
diff --git a/browser/components/loop/MozLoopService.jsm b/browser/components/loop/MozLoopService.jsm
index 3f6a77c..d915070 100644
--- a/browser/components/loop/MozLoopService.jsm
+++ b/browser/components/loop/MozLoopService.jsm
@@ -1107,7 +1107,7 @@ this.MozLoopService = {
// Don't do anything if loop is not enabled.
if (!Services.prefs.getBoolPref("loop.enabled")) {
- return Promise.reject(new Error("loop is not enabled"));
+ return Promise.resolve();
}
if (Services.prefs.getPrefType("loop.fxa.enabled") == Services.prefs.PREF_BOOL) {
1
0

[tor-browser/tor-browser-38.4.0esr-5.5-1] Bug 12516: Compile hardenend Tor Browser with -fwrapv
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 507be1ee78b54b23106d6e99b5d07835d34682a0
Author: Georg Koppen <gk(a)torproject.org>
Date: Tue Dec 8 10:27:03 2015 +0000
Bug 12516: Compile hardenend Tor Browser with -fwrapv
---
.mozconfig-asan | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/.mozconfig-asan b/.mozconfig-asan
index 218d2bd..9472ff2 100644
--- a/.mozconfig-asan
+++ b/.mozconfig-asan
@@ -1,7 +1,7 @@
. $topsrcdir/browser/config/mozconfig
-export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc"
-export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc"
+export CFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -fwrapv"
+export CXXFLAGS="-fsanitize=address -Dxmalloc=myxmalloc -frwapv"
# We need to add -ldl explicitely due to bug 1213698
export LDFLAGS="-fsanitize=address -ldl"
1
0

[tor-browser-bundle/hardened-builds] Bug 17747: Replace schanenlied with ndnop3
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit ce9150067e4bdf5699dc22d64bd0b532516d3292
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Dec 7 11:12:35 2015 +0000
Bug 17747: Replace schanenlied with ndnop3
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index a055d8f..f27d389 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -20,7 +20,7 @@ pref("extensions.torlauncher.default_bridge.fte-ipv6.2", "fte [2001:49f0:d00a:1:
pref("extensions.torlauncher.default_bridge.scramblesuit.1", "scramblesuit 83.212.101.3:443 A09D536DD1752D542E1FBB3C9CE4449D51298239 password=XTCXLG2JAMJKZW2POLBAOWOQETQSMASH");
-pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 178.209.52.110:443 67E72FF33D7D41BF11C569646A0A7B4B188340DF cert=Z+cv8z19Qb8RxWlkagp7SxiDQN++b7D2Tntowhf+j4D15/kLuj3EoSSGvuREGPc3h60Ofw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 109.105.109.165:24215 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.2", "obfs4 83.212.101.3:41213 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.3", "obfs4 104.131.108.182:56880 EF577C30B9F788B0E1801CF7E433B3B77792B77A cert=0SFhfDQrKjUJP8Qq6wrwSICEPf3Vl/nJRsYxWbg3QRoSqhl2EB78MPS2lQxbXY4EW1wwXA iat-mode=0");
1
0

[tor-browser-bundle/maint-5.0] Bug 17747: Replace schanenlied with ndnop3
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 0e8100faec7ec7bc38cc009f33a13988eabe90aa
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Dec 7 11:12:35 2015 +0000
Bug 17747: Replace schanenlied with ndnop3
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index 3aab4c6..4fea91b 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -26,7 +26,7 @@ pref("extensions.torlauncher.default_bridge.fte-ipv6.2", "fte [2001:49f0:d00a:1:
pref("extensions.torlauncher.default_bridge.scramblesuit.1", "scramblesuit 83.212.101.3:443 A09D536DD1752D542E1FBB3C9CE4449D51298239 password=XTCXLG2JAMJKZW2POLBAOWOQETQSMASH");
-pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 178.209.52.110:443 67E72FF33D7D41BF11C569646A0A7B4B188340DF cert=Z+cv8z19Qb8RxWlkagp7SxiDQN++b7D2Tntowhf+j4D15/kLuj3EoSSGvuREGPc3h60Ofw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 109.105.109.165:24215 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.2", "obfs4 83.212.101.3:41213 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.3", "obfs4 104.131.108.182:56880 EF577C30B9F788B0E1801CF7E433B3B77792B77A cert=0SFhfDQrKjUJP8Qq6wrwSICEPf3Vl/nJRsYxWbg3QRoSqhl2EB78MPS2lQxbXY4EW1wwXA iat-mode=0");
1
0

[tor-browser-bundle/master] Bug 17747: Replace schanenlied with ndnop3
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 52a18422300ce825e0373468084f210aedc368d7
Author: Georg Koppen <gk(a)torproject.org>
Date: Mon Dec 7 11:12:35 2015 +0000
Bug 17747: Replace schanenlied with ndnop3
---
Bundle-Data/PTConfigs/bridge_prefs.js | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Bundle-Data/PTConfigs/bridge_prefs.js b/Bundle-Data/PTConfigs/bridge_prefs.js
index a055d8f..f27d389 100644
--- a/Bundle-Data/PTConfigs/bridge_prefs.js
+++ b/Bundle-Data/PTConfigs/bridge_prefs.js
@@ -20,7 +20,7 @@ pref("extensions.torlauncher.default_bridge.fte-ipv6.2", "fte [2001:49f0:d00a:1:
pref("extensions.torlauncher.default_bridge.scramblesuit.1", "scramblesuit 83.212.101.3:443 A09D536DD1752D542E1FBB3C9CE4449D51298239 password=XTCXLG2JAMJKZW2POLBAOWOQETQSMASH");
-pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 178.209.52.110:443 67E72FF33D7D41BF11C569646A0A7B4B188340DF cert=Z+cv8z19Qb8RxWlkagp7SxiDQN++b7D2Tntowhf+j4D15/kLuj3EoSSGvuREGPc3h60Ofw iat-mode=0");
+pref("extensions.torlauncher.default_bridge.obfs4.1", "obfs4 109.105.109.165:24215 8DFCD8FB3285E855F5A55EDDA35696C743ABFC4E cert=Bvg/itxeL4TWKLP6N1MaQzSOC6tcRIBv6q57DYAZc3b2AzuM+/TfB7mqTFEfXILCjEwzVA iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.2", "obfs4 83.212.101.3:41213 A09D536DD1752D542E1FBB3C9CE4449D51298239 cert=lPRQ/MXdD1t5SRZ9MquYQNT9m5DV757jtdXdlePmRCudUU9CFUOX1Tm7/meFSyPOsud7Cw iat-mode=0");
pref("extensions.torlauncher.default_bridge.obfs4.3", "obfs4 104.131.108.182:56880 EF577C30B9F788B0E1801CF7E433B3B77792B77A cert=0SFhfDQrKjUJP8Qq6wrwSICEPf3Vl/nJRsYxWbg3QRoSqhl2EB78MPS2lQxbXY4EW1wwXA iat-mode=0");
1
0

[tor-browser/tor-browser-38.4.0esr-5.0-1] fixup! Bug 17502: Add a pref hiding the "Open with" option
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 1262b7c5a49b5de4489badf448705925fc3e467f
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Dec 9 13:44:30 2015 +0000
fixup! Bug 17502: Add a pref hiding the "Open with" option
---
browser/app/profile/000-tor-browser.js | 4 ++++
browser/app/profile/firefox.js | 1 -
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index b94b6d1..6e75298 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -172,6 +172,10 @@ pref("devtools.appmanager.enabled", false);
// restrictive DNS look-up policy. We use "127.0.0.1" instead of "localhost" as
// a workaround. See bug 16523 for more details.
pref("devtools.debugger.chrome-debugging-host", "127.0.0.1");
+// Don't show the "Open with" option on the download dialog if the preference
+// is |true|. This helps to avoid confusion e.g. in case the browser is
+// sandboxed. See bug 17502 for details.
+pref("browser.download.forbid_open_with", false);
// Security slider
pref("svg.in-content.enabled", true);
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 95bbe97..53fd8d2 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -354,7 +354,6 @@ pref("browser.download.useDownloadDir", true);
pref("browser.download.folderList", 1);
pref("browser.download.manager.addToRecentDocs", true);
pref("browser.download.manager.resumeOnWakeDelay", 10000);
-pref("browser.download.forbid_open_with", false);
// This allows disabling the animated notifications shown by
// the Downloads Indicator when a download starts or completes.
1
0

[tor-browser/tor-browser-38.4.0esr-5.0-1] Bug 17502: Add a pref hiding the "Open with" option
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 177885fd3e8ee230f2bc03ed78dbe1a699068429
Author: anonym <anonym(a)riseup.net>
Date: Sun Nov 1 23:57:59 2015 +0100
Bug 17502: Add a pref hiding the "Open with" option
If browser.download.forbid_open_with is set to true (default: false)
the download dialog will not ever show the "Open with" option for
opening the file with an external application; only the "Save" and
"Cancel" options will be available.
This is very useful to enable when the browser is sandboxed (e.g. via
AppArmor) in such a way that it is forbidden to run external
applications, since users then are not presented with this choice
which will not work and only cause confusion.
---
browser/app/profile/firefox.js | 1 +
toolkit/mozapps/downloads/nsHelperAppDlg.js | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 53fd8d2..95bbe97 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -354,6 +354,7 @@ pref("browser.download.useDownloadDir", true);
pref("browser.download.folderList", 1);
pref("browser.download.manager.addToRecentDocs", true);
pref("browser.download.manager.resumeOnWakeDelay", 10000);
+pref("browser.download.forbid_open_with", false);
// This allows disabling the animated notifications shown by
// the Downloads Indicator when a download starts or completes.
diff --git a/toolkit/mozapps/downloads/nsHelperAppDlg.js b/toolkit/mozapps/downloads/nsHelperAppDlg.js
index 43653f9..abb7ca2 100644
--- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
@@ -458,7 +458,8 @@ nsUnknownContentTypeDialog.prototype = {
var shouldntRememberChoice = (mimeType == "application/octet-stream" ||
mimeType == "application/x-msdownload" ||
this.mLauncher.targetFileIsExecutable);
- if (shouldntRememberChoice && !this.openWithDefaultOK()) {
+ if ((shouldntRememberChoice && !this.openWithDefaultOK()) ||
+ Services.prefs.getBoolPref("browser.download.forbid_open_with")) {
// hide featured choice
this.dialogElement("normalBox").collapsed = true;
// show basic choice
1
0

[tor-browser/tor-browser-38.4.0esr-5.5-1] fixup! Bug 17502: Add a pref hiding the "Open with" option
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 721f255ca93675c6a3caf2e75678978c8a4db72c
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Dec 9 13:44:30 2015 +0000
fixup! Bug 17502: Add a pref hiding the "Open with" option
---
browser/app/profile/000-tor-browser.js | 4 ++++
browser/app/profile/firefox.js | 1 -
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/browser/app/profile/000-tor-browser.js b/browser/app/profile/000-tor-browser.js
index 1de3ed1..dc38ee4 100644
--- a/browser/app/profile/000-tor-browser.js
+++ b/browser/app/profile/000-tor-browser.js
@@ -177,6 +177,10 @@ pref("devtools.appmanager.enabled", false);
// restrictive DNS look-up policy. We use "127.0.0.1" instead of "localhost" as
// a workaround. See bug 16523 for more details.
pref("devtools.debugger.chrome-debugging-host", "127.0.0.1");
+// Don't show the "Open with" option on the download dialog if the preference
+// is |true|. This helps to avoid confusion e.g. in case the browser is
+// sandboxed. See bug 17502 for details.
+pref("browser.download.forbid_open_with", false);
// Security slider
pref("svg.in-content.enabled", true);
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index 6c30b7d..a827f52 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -324,7 +324,6 @@ pref("browser.download.useDownloadDir", true);
pref("browser.download.folderList", 1);
pref("browser.download.manager.addToRecentDocs", true);
pref("browser.download.manager.resumeOnWakeDelay", 10000);
-pref("browser.download.forbid_open_with", false);
// This allows disabling the animated notifications shown by
// the Downloads Indicator when a download starts or completes.
1
0

[tor-browser/tor-browser-38.4.0esr-5.5-1] Bug 17502: Add a pref hiding the "Open with" option
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit c3aafe32d28271e04b616eaf92f826fc70c4627a
Author: anonym <anonym(a)riseup.net>
Date: Sun Nov 1 23:57:59 2015 +0100
Bug 17502: Add a pref hiding the "Open with" option
If browser.download.forbid_open_with is set to true (default: false)
the download dialog will not ever show the "Open with" option for
opening the file with an external application; only the "Save" and
"Cancel" options will be available.
This is very useful to enable when the browser is sandboxed (e.g. via
AppArmor) in such a way that it is forbidden to run external
applications, since users then are not presented with this choice
which will not work and only cause confusion.
---
browser/app/profile/firefox.js | 1 +
toolkit/mozapps/downloads/nsHelperAppDlg.js | 3 ++-
2 files changed, 3 insertions(+), 1 deletion(-)
diff --git a/browser/app/profile/firefox.js b/browser/app/profile/firefox.js
index a827f52..6c30b7d 100644
--- a/browser/app/profile/firefox.js
+++ b/browser/app/profile/firefox.js
@@ -324,6 +324,7 @@ pref("browser.download.useDownloadDir", true);
pref("browser.download.folderList", 1);
pref("browser.download.manager.addToRecentDocs", true);
pref("browser.download.manager.resumeOnWakeDelay", 10000);
+pref("browser.download.forbid_open_with", false);
// This allows disabling the animated notifications shown by
// the Downloads Indicator when a download starts or completes.
diff --git a/toolkit/mozapps/downloads/nsHelperAppDlg.js b/toolkit/mozapps/downloads/nsHelperAppDlg.js
index 43653f9..abb7ca2 100644
--- a/toolkit/mozapps/downloads/nsHelperAppDlg.js
+++ b/toolkit/mozapps/downloads/nsHelperAppDlg.js
@@ -458,7 +458,8 @@ nsUnknownContentTypeDialog.prototype = {
var shouldntRememberChoice = (mimeType == "application/octet-stream" ||
mimeType == "application/x-msdownload" ||
this.mLauncher.targetFileIsExecutable);
- if (shouldntRememberChoice && !this.openWithDefaultOK()) {
+ if ((shouldntRememberChoice && !this.openWithDefaultOK()) ||
+ Services.prefs.getBoolPref("browser.download.forbid_open_with")) {
// hide featured choice
this.dialogElement("normalBox").collapsed = true;
// show basic choice
1
0

[torbutton/maint-1.9.3] Bug 17770: Fix alignments on donation banner
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit b2be87834a9f7bde1e1366d6f395d5c068b53ed4
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Mon Dec 7 17:07:39 2015 -0800
Bug 17770: Fix alignments on donation banner
---
src/chrome/content/aboutTor/aboutTor.xhtml | 2 +-
src/chrome/skin/aboutTor.css | 14 ++++++++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index dbfca72..d9e7704 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -217,7 +217,7 @@ function setupDonationBanner() {
return;
}
// Now we can show the banner.
- document.getElementById("donation-banner").style.display = "inline";
+ document.getElementById("donation-banner").style.display = "block";
}
]]>
</script>
diff --git a/src/chrome/skin/aboutTor.css b/src/chrome/skin/aboutTor.css
index 038d470..5f43f8c 100644
--- a/src/chrome/skin/aboutTor.css
+++ b/src/chrome/skin/aboutTor.css
@@ -351,12 +351,21 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
display: none;
}
+#donation-banner > a {
+ display: block;
+}
+
#donation-banner-inner {
margin: 0px auto;
position: relative;
text-align: left;
width: 700px;
z-index: -1;
+ display: block;
+}
+
+#donation-banner-image {
+ display: block;
}
#donation-banner-text {
@@ -369,6 +378,7 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
#donation-banner-quote {
color: darkgreen;
+ font-family: serif;
font-size: 18px;
text-align: start;
white-space: normal;
@@ -407,11 +417,11 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
color: white;
font-family: sans-serif;
font-size: 20px;
- left: 600px;
+ left: 490px;
padding: 10px;
position: absolute;
text-align: center;
- top: 153px;
+ top: 144px;
vertical-align: middle;
width: 110px;
}
1
0

09 Dec '15
commit 63699e3da2731c89d1a4e0fbd5e4ba05ea21ff13
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Mon Dec 7 17:07:39 2015 -0800
Bug 17770: Fix alignments on donation banner
---
src/chrome/content/aboutTor/aboutTor.xhtml | 2 +-
src/chrome/skin/aboutTor.css | 14 ++++++++++++--
2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index 6331997..a95ae6f 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -217,7 +217,7 @@ function setupDonationBanner() {
return;
}
// Now we can show the banner.
- document.getElementById("donation-banner").style.display = "inline";
+ document.getElementById("donation-banner").style.display = "block";
}
]]>
</script>
diff --git a/src/chrome/skin/aboutTor.css b/src/chrome/skin/aboutTor.css
index 2776a0e..806fec5 100644
--- a/src/chrome/skin/aboutTor.css
+++ b/src/chrome/skin/aboutTor.css
@@ -309,12 +309,21 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
display: none;
}
+#donation-banner > a {
+ display: block;
+}
+
#donation-banner-inner {
margin: 0px auto;
position: relative;
text-align: left;
width: 700px;
z-index: -1;
+ display: block;
+}
+
+#donation-banner-image {
+ display: block;
}
#donation-banner-text {
@@ -327,6 +336,7 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
#donation-banner-quote {
color: darkgreen;
+ font-family: serif;
font-size: 18px;
text-align: start;
white-space: normal;
@@ -365,11 +375,11 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
color: white;
font-family: sans-serif;
font-size: 20px;
- left: 600px;
+ left: 490px;
padding: 10px;
position: absolute;
text-align: center;
- top: 153px;
+ top: 144px;
vertical-align: middle;
width: 110px;
}
1
0
commit 91dc453849badd95e4ae845b80059d15fa87e287
Author: Georg Koppen <gk(a)torproject.org>
Date: Wed Dec 9 09:14:14 2015 +0000
Update translations
---
src/chrome/locale/ar/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/ar/aboutTor.dtd | 9 +-
src/chrome/locale/ar/aboutTor.properties | 12 +++
src/chrome/locale/ar/torbutton.dtd | 16 +--
src/chrome/locale/de/aboutDialog.dtd | 2 +-
src/chrome/locale/de/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/de/aboutTor.dtd | 11 +-
src/chrome/locale/de/aboutTor.properties | 12 +++
src/chrome/locale/es/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/es/aboutTor.dtd | 9 +-
src/chrome/locale/es/aboutTor.properties | 12 +++
src/chrome/locale/eu/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/eu/aboutTor.dtd | 9 +-
src/chrome/locale/eu/aboutTor.properties | 12 +++
src/chrome/locale/fa/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/fa/aboutTor.dtd | 9 +-
src/chrome/locale/fa/aboutTor.properties | 12 +++
src/chrome/locale/fr/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/fr/aboutTor.dtd | 9 +-
src/chrome/locale/fr/aboutTor.properties | 12 +++
src/chrome/locale/fr/torbutton.dtd | 16 +--
src/chrome/locale/it/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/it/aboutTor.dtd | 9 +-
src/chrome/locale/it/aboutTor.properties | 12 +++
src/chrome/locale/ja/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/ja/aboutTor.dtd | 9 +-
src/chrome/locale/ja/aboutTor.properties | 12 +++
src/chrome/locale/ko/aboutDialog.dtd | 4 +-
src/chrome/locale/ko/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/ko/aboutTor.dtd | 9 +-
src/chrome/locale/ko/aboutTor.properties | 12 +++
src/chrome/locale/ko/torbutton.dtd | 14 +--
src/chrome/locale/nl/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/nl/aboutTor.dtd | 9 +-
src/chrome/locale/nl/aboutTor.properties | 12 +++
src/chrome/locale/pl/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/pl/aboutTor.dtd | 9 +-
src/chrome/locale/pl/aboutTor.properties | 12 +++
src/chrome/locale/pt/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/pt/aboutTor.dtd | 21 ++--
src/chrome/locale/pt/aboutTor.properties | 12 +++
src/chrome/locale/pt/brand.dtd | 8 +-
src/chrome/locale/pt/torbutton.dtd | 154 +++++++++++++--------------
src/chrome/locale/pt/torbutton.properties | 44 ++++----
src/chrome/locale/ru/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/ru/aboutTor.dtd | 9 +-
src/chrome/locale/ru/aboutTor.properties | 12 +++
src/chrome/locale/sv/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/sv/aboutTor.dtd | 9 +-
src/chrome/locale/sv/aboutTor.properties | 12 +++
src/chrome/locale/tr/aboutDialog.dtd | 2 +-
src/chrome/locale/tr/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/tr/aboutTor.dtd | 13 ++-
src/chrome/locale/tr/aboutTor.properties | 14 ++-
src/chrome/locale/tr/torbutton.dtd | 8 +-
src/chrome/locale/vi/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/vi/aboutTor.dtd | 9 +-
src/chrome/locale/vi/aboutTor.properties | 12 +++
src/chrome/locale/zh-CN/aboutTBUpdate.dtd | 6 ++
src/chrome/locale/zh-CN/aboutTor.dtd | 9 +-
src/chrome/locale/zh-CN/aboutTor.properties | 12 +++
61 files changed, 552 insertions(+), 195 deletions(-)
diff --git a/src/chrome/locale/ar/aboutTBUpdate.dtd b/src/chrome/locale/ar/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/ar/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/ar/aboutTor.dtd b/src/chrome/locale/ar/aboutTor.dtd
index 710c264..4d3caae 100644
--- a/src/chrome/locale/ar/aboutTor.dtd
+++ b/src/chrome/locale/ar/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "عن تور">
-<!ENTITY aboutTor.outOfDateTorOn.label "ومع ذلك، هذه نسخة قديمة من المتصفح.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "أيضاً، هذه نسخة قديمة من المتصفح.">
<!ENTITY aboutTor.outOfDate2.label "اضغط على رمز البصلة ثم اختر "تحقق من تحديثات متصفح تور"">
<!ENTITY aboutTor.check.label "اختبر إعدادات شبكة تور.">
-<!ENTITY aboutTor.success.label "تهانينا!">
-<!ENTITY aboutTor.success2.label "هذا المتصفح معدّ لاستخدام شبكة تور.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "يمكنك الآن تصفح الانترنت بشكل يحمي هويتك.">
<!ENTITY aboutTor.failure.label "حدث خطأ ما!">
<!ENTITY aboutTor.failure2.label "تور لا يعمل في هذا المتصفح.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "مشروع تور هو مشروع غير ربحي (حسب US 501(c)(3)) مُكرس للبحث، والتطوير، والتوعية حول موضوع إخفاء الهوية والخصوصية.">
<!ENTITY aboutTor.learnMore.label "اقرأ المزيد عن مشروع تور »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "تبرع">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/ar/aboutTor.properties b/src/chrome/locale/ar/aboutTor.properties
index d607324..10f09a1 100644
--- a/src/chrome/locale/ar/aboutTor.properties
+++ b/src/chrome/locale/ar/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/ar/torbutton.dtd b/src/chrome/locale/ar/torbutton.dtd
index b1cc509..4908910 100644
--- a/src/chrome/locale/ar/torbutton.dtd
+++ b/src/chrome/locale/ar/torbutton.dtd
@@ -106,7 +106,7 @@
<!ENTITY torbutton.prefs.restore_defaults "استعادة الافتراضيات">
<!ENTITY torbutton.prefs.test_settings "فحص الإعدادات">
<!ENTITY torbutton.prefs.test_auto "افحص إعدادات تور بعد أول تشغيل كل مرة يتم تشغيل فيرفكس">
-<!ENTITY torbutton.prefs.disable_livemarks "Disable livemarks updates during Tor usage">
+<!ENTITY torbutton.prefs.disable_livemarks "إلغاء تحديث العلامات الحية أثناء إستعمال تور">
<!ENTITY torbutton.prefs.tor_memory_jar "لا تحفظ ملفات تعريف الارتباط (كوكيز) في القرص إذا كان التور مفعلًا">
<!ENTITY torbutton.prefs.nontor_memory_jar "لا تحفظ ملفات تعريف الارتباط (كوكيز) في القرص إن كان تور معطلًا">
<!ENTITY torbutton.prefs.session_restore "حفظ الجلسة واستعادة هذه التبويبات:">
@@ -133,7 +133,7 @@
<!ENTITY torbutton.cookiedialog.removeAllBut "إزالة الكل لكن استمر في الحماية">
<!ENTITY torbutton.cookiedialog.saveAllCookies "احم ملفات تعريف الارتباط الجديدة">
<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "لا تحم ملفات تعريف الارتباط الجديدة">
-<!ENTITY torbutton.prefs.disable_livemarks "Disable livemarks updates during Tor usage">
+<!ENTITY torbutton.prefs.disable_livemarks "إلغاء تحديث العلامات الحية أثناء إستعمال تور">
<!ENTITY torbutton.prefs.dtd_recommended "(محبّذ)">
<!ENTITY torbutton.prefs.dtd_optional "(اختياري)">
<!ENTITY torbutton.prefs.dtd_crucial "(ضروري جدا)">
@@ -152,14 +152,14 @@
<!ENTITY torbutton.prefs.resist_fingerprinting "تغيير التفاصيل التي تميزك عن المستخدمين الآخرين لمتصفح تور">
<!ENTITY torbutton.prefs.sec_caption "مستوى الأمان">
<!ENTITY torbutton.prefs.sec_low "منخفض (افتراضي)">
-<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
-<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
+<!ENTITY torbutton.prefs.sec_low_usable_desc "هذا يوفر أفضل خبرة للإستخدام">
+<!ENTITY torbutton.prefs.sec_low_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل كل صفات المتصفح">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "The SVG OpenType font rendering mechanism is disabled.">
<!ENTITY torbutton.prefs.sec_med_low "شبه منخفض">
-<!ENTITY torbutton.prefs.sec_gen_desc "At this security level, the following changes apply (mouseover for details):">
+<!ENTITY torbutton.prefs.sec_gen_desc "طبقاً لهذا المستوى من إعدادات الأمان سوف يتم تفعيل هذه التغيرات ( لمزيد من التفاصيل مرر الفأرة فوق)">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
-<!ENTITY torbutton.prefs.sec_html5_tooltip "On some sites, you might need to use the NoScript toolbar button to enable these media objects.">
-<!ENTITY torbutton.prefs.sec_some_jit_desc "Some JavaScript performance optimizations are disabled.">
+<!ENTITY torbutton.prefs.sec_html5_tooltip "في بعض المواقع من الممكن أن تحتاج لإستخدام زر تعطيل النصوص في شرط الأدوات لتفعل المحتويات المرئية">
+<!ENTITY torbutton.prefs.sec_some_jit_desc "بعض محسنات نصوص الجافا معطلة">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Type Inference, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline JIT.">
<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts on some sites may run slower.">
@@ -179,7 +179,7 @@
<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript is disabled by default on all sites.">
<!ENTITY torbutton.prefs.sec_audio_video_desc "Most audio and video formats are disabled.">
<!ENTITY torbutton.prefs.sec_audio_video_desc_tooltip "WebM is the only codec that remains enabled.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc "Some fonts and icons may display incorrectly.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc "من الممكن أن بعض الخطوط والايقونات معروضة خطأ">
<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Website-provided font files are blocked.">
<!ENTITY torbutton.prefs.sec_custom "قيم مخصصة">
<!ENTITY torbutton.circuit_display.title "دائرة تور لهذا الموقع">
diff --git a/src/chrome/locale/de/aboutDialog.dtd b/src/chrome/locale/de/aboutDialog.dtd
index 063fa21..2747418 100644
--- a/src/chrome/locale/de/aboutDialog.dtd
+++ b/src/chrome/locale/de/aboutDialog.dtd
@@ -3,7 +3,7 @@
<!ENTITY project.tpoLink "das &vendorShortName;">
<!ENTITY project.end ", eine gemeinnützige Organisation, um Ihre Privatsphäre und Freiheit im Internet zu verteidigen.">
-<!ENTITY help.start "Möchten Sie helfen? ">
+<!ENTITY help.start "Sie wollen helfen? ">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
<!ENTITY help.donateLink "Spenden">
<!ENTITY help.or "oder">
diff --git a/src/chrome/locale/de/aboutTBUpdate.dtd b/src/chrome/locale/de/aboutTBUpdate.dtd
new file mode 100644
index 0000000..e23c479
--- /dev/null
+++ b/src/chrome/locale/de/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser wurde aktualisiert.">
+<!ENTITY aboutTBUpdate.linkPrefix "Für die aktuellsten Informationen zu diesem Release, ">
+<!ENTITY aboutTBUpdate.linkLabel "besuchen Sie unsere Website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/de/aboutTor.dtd b/src/chrome/locale/de/aboutTor.dtd
index 2c9535d..1539814 100644
--- a/src/chrome/locale/de/aboutTor.dtd
+++ b/src/chrome/locale/de/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Über Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "ALLERDINGS, ist dieser Browser ist nicht mehr aktuell.">
-<!ENTITY aboutTor.outOfDateTorOff.label "DIESER Browser ist auch veraltet.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNUNG: Dieser Browser ist nicht mehr aktuell!">
+<!ENTITY aboutTor.outOfDateTorOff.label "AUSSERDEM, dieser Browser ist nicht aktuell.">
<!ENTITY aboutTor.outOfDate2.label "Klicken Sie auf die Zwiebel und wählen Sie dann Suche nach Tor-Browser-Aktualisierung.">
<!ENTITY aboutTor.check.label "Tor-Netzwerkeinstellungen testen">
-<!ENTITY aboutTor.success.label "Herzlichen Glückwunsch!">
-<!ENTITY aboutTor.success2.label "Dieser Browser ist für die Benutzung von Tor eingestellt.">
+<!ENTITY aboutTor.success.label "Willkommen im Tor Browser">
+<!ENTITY aboutTor.success2.label "Mit dem Tor-Netzwerk verbunden.">
<!ENTITY aboutTor.success3.label "Sie können jetzt anonym im Internet surfen.">
<!ENTITY aboutTor.failure.label "Irgend etwas lief schief!">
<!ENTITY aboutTor.failure2.label "Tor funktioniert mit diesem Browser nicht.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Die Organisation »The Tor Project« ist nach dem US-Gesetz US 501(c)(3) als gemeinnützig eingestuft und widmet sich der Forschung, der Entwicklung und der Schulung zum Thema Internetanonymität und Datenschutz.">
<!ENTITY aboutTor.learnMore.label "Mehr über das Tor-Projekt erfahren »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Spenden">
+<!ENTITY aboutTor.donate.supportTor "Bitte unterstützen Sie Tor!">
diff --git a/src/chrome/locale/de/aboutTor.properties b/src/chrome/locale/de/aboutTor.properties
index b7fc4bf..d73f7a3 100644
--- a/src/chrome/locale/de/aboutTor.properties
+++ b/src/chrome/locale/de/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=<a href="%1$S">Sicheres</a> Suchen mit <a href="%2$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden hätte mich nicht ohne Tor und andere kostenlose Software Verschlüsselungs-Projekte kontaktieren können. Tor ist ein wesentliches Werkzeug und es benötigt unsere Unterstützung.
+aboutTor.donationBanner.lp.speciality=Oscar-prämierte Dokumentarfilmerin, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privatsphäre und Anonymität betreffen uns alle.
+aboutTor.donationBanner.cd.speciality= Novellist, Technologie-Aktivist, Co-Editor von Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Bitte hilf dem weltweit stärksten Tool für Privatsphäre nachhaltiger zu werden.
+aboutTor.donationBanner.rd.speciality=Gründer, amtierender Geschäftsführender Direktor des Tor-Projektes
diff --git a/src/chrome/locale/es/aboutTBUpdate.dtd b/src/chrome/locale/es/aboutTBUpdate.dtd
new file mode 100644
index 0000000..6fe0c42
--- /dev/null
+++ b/src/chrome/locale/es/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Actualización del Navegador Tor">
+<!ENTITY aboutTBUpdate.updated "El Navegador Tor ha sido actualizado.">
+<!ENTITY aboutTBUpdate.linkPrefix "Para ver la información mas actualizada de esta versión, ">
+<!ENTITY aboutTBUpdate.linkLabel "visite nuestro sitio web">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Registro de cambios:">
diff --git a/src/chrome/locale/es/aboutTor.dtd b/src/chrome/locale/es/aboutTor.dtd
index 6ccf568..c339af6 100644
--- a/src/chrome/locale/es/aboutTor.dtd
+++ b/src/chrome/locale/es/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Acerca de Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "SIN EMBARGO, este navegador no está actualizado.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "ADEMÁS, este navegador tampoco está actualizado.">
<!ENTITY aboutTor.outOfDate2.label "Haga clic en la cebolla y luego seleccione Comprobar actualizaciones del Navegador Tor.">
<!ENTITY aboutTor.check.label "Probar las preferencias de red Tor">
-<!ENTITY aboutTor.success.label "¡Felicidades!">
-<!ENTITY aboutTor.success2.label "Este navegador está configurado para usar Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Ahora es libre de navegar por Internet anónimamente.">
<!ENTITY aboutTor.failure.label "¡Algo fue mal!">
<!ENTITY aboutTor.failure2.label "Tor no está funcionando en este navegador.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "El Projecto Tor es una US 501(c)(3) sin ánimo de lucro dedicada a la investigación, desarrollo y educación sobre anonimidad y privacidad en línea.">
<!ENTITY aboutTor.learnMore.label "Aprenda más acerca del El Proyecto Tor »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Donar">
+<!ENTITY aboutTor.donate.supportTor "Por favor ayuda a Tor!">
diff --git a/src/chrome/locale/es/aboutTor.properties b/src/chrome/locale/es/aboutTor.properties
index fb92251..ca89874 100644
--- a/src/chrome/locale/es/aboutTor.properties
+++ b/src/chrome/locale/es/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Busque <a href="%1$S">de forma segura</a> con <a href=
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/eu/aboutTBUpdate.dtd b/src/chrome/locale/eu/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/eu/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/eu/aboutTor.dtd b/src/chrome/locale/eu/aboutTor.dtd
index b055a40..e07140d 100644
--- a/src/chrome/locale/eu/aboutTor.dtd
+++ b/src/chrome/locale/eu/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Tori buruz">
-<!ENTITY aboutTor.outOfDateTorOn.label "HALA ERE, nabigatzaile hau zaharkituta dago.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "BAITA, nabigatzaile hau zaharkituta dago.">
<!ENTITY aboutTor.outOfDate2.label "Tipulan sakatu eta ondoren Tor Browser Bundlea egiaztatu hautatu">
<!ENTITY aboutTor.check.label "Tor sare ezarpenak frogatu">
-<!ENTITY aboutTor.success.label "Zorionak!">
-<!ENTITY aboutTor.success2.label "Nabigatzaile hau Tor erabiltzeko konfiguratuta dago.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Aske zara orain Internet anonimotasunez nabigatzeko.">
<!ENTITY aboutTor.failure.label "Zerbait gaizki joan da!">
<!ENTITY aboutTor.failure2.label "Tor ez da nabigatzaile honetan funtzionatzen ari.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "The Tor Project irabazi asmorik gabeko US 501(c)(3) bat da, ikerketara, garapenera, eta onlineko anonimotasuna eta pribatutasunaren hezkuntzara zuzendutakoa.">
<!ENTITY aboutTor.learnMore.label "The Tor Projecti buruz gehiago ikasi »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Egizu dohaintza">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/eu/aboutTor.properties b/src/chrome/locale/eu/aboutTor.properties
index 30a7858..32335f8 100644
--- a/src/chrome/locale/eu/aboutTor.properties
+++ b/src/chrome/locale/eu/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Bilatu<a href="%1$S">modu seguruan</a> ondokoarekin: <
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/fa/aboutTBUpdate.dtd b/src/chrome/locale/fa/aboutTBUpdate.dtd
new file mode 100644
index 0000000..a425efc
--- /dev/null
+++ b/src/chrome/locale/fa/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "بروز رسانی مرورگر تور">
+<!ENTITY aboutTBUpdate.updated "مرورگر تور بهروز شده است.">
+<!ENTITY aboutTBUpdate.linkPrefix "به منظور جدیدترین اطلاعات دربارهی این نسخه،">
+<!ENTITY aboutTBUpdate.linkLabel "از وبسایت ما دیدن کنید">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "لیست تغییرات:">
diff --git a/src/chrome/locale/fa/aboutTor.dtd b/src/chrome/locale/fa/aboutTor.dtd
index 95bbcad..27edf8b 100644
--- a/src/chrome/locale/fa/aboutTor.dtd
+++ b/src/chrome/locale/fa/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "دربارهی تور">
-<!ENTITY aboutTor.outOfDateTorOn.label "با این حال ٫ این مرورگر قدیمی می باشد.">
+<!ENTITY aboutTor.outOfDateTorOn.label "هشدار: این مرورگر به روز نیست.">
<!ENTITY aboutTor.outOfDateTorOff.label "همچنین ٫ این مرورگر قدیمی می باشد .">
<!ENTITY aboutTor.outOfDate2.label "روی پیاز کلیک کنید و سپس انتخاب کنید Check را برای به روز رسانی Tor Browser">
<!ENTITY aboutTor.check.label "تنظیمات شبکهی تور را بررسی کنید">
-<!ENTITY aboutTor.success.label "تبریک!">
-<!ENTITY aboutTor.success2.label "این مرورگر برای استفاده از تور تنظیم شده است.">
+<!ENTITY aboutTor.success.label "به مرورگر تور خوش آمدید.">
+<!ENTITY aboutTor.success2.label "اتصال با شبکهی تور برقرار شد.">
<!ENTITY aboutTor.success3.label "اکنون شما به طور ناشناس به اینترنت دسترسی دارید.">
<!ENTITY aboutTor.failure.label "خطایی پیش آمده است!">
<!ENTITY aboutTor.failure2.label "تا با این مرورگر کار نمیکند.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "پروژهٔ تور سازمان غیر انتفاعی آمریکایی 501(c)3 مختص پژوهش, توسعه و آموزش در زمین ناشناسی و حریم شخصی آنلاين هست.">
<!ENTITY aboutTor.learnMore.label "اطلاعات بیشتر در پروژهٔ تور كسب كنيد">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "اهدا">
+<!ENTITY aboutTor.donate.supportTor "لطفا از تور حمایت کنید.">
diff --git a/src/chrome/locale/fa/aboutTor.properties b/src/chrome/locale/fa/aboutTor.properties
index 54e04d9..f39d06f 100644
--- a/src/chrome/locale/fa/aboutTor.properties
+++ b/src/chrome/locale/fa/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=جستجو <a href="%1$S">ایمن</a> با <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=ادوارد اسنودن بدون تور و سایر پروژههای نرمافزاری رایگان در زمینهی رمزگذاری، قادر به تماس با من نبود. تور ابزاری ضروری است، و به پشتیبانی ما نیاز دارد.
+aboutTor.donationBanner.lp.speciality=برندهی جایزهی اسکار بهترین مستند، <i>شهروند شماره چهار</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=حریم خصوصی و همچنین گمنام ماندن، موضوع مهمی برای همهی ما بهشمار میآید.
+aboutTor.donationBanner.cd.speciality= رمان نویس، فعال زمینه فناوری، همکاری ویراستار Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=لطفا کمک کنید تا قویترین ابزار حفظ حریم شخصی، پایدارتر شود.
+aboutTor.donationBanner.rd.speciality=بنیان گذار، مدیر اجرایی فعال پروژهی تور
diff --git a/src/chrome/locale/fr/aboutTBUpdate.dtd b/src/chrome/locale/fr/aboutTBUpdate.dtd
new file mode 100644
index 0000000..22674be
--- /dev/null
+++ b/src/chrome/locale/fr/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Mise à jour du Navigateur Tor">
+<!ENTITY aboutTBUpdate.updated "Le Navigateur Tor a été mis à jour">
+<!ENTITY aboutTBUpdate.linkPrefix "Pour avoir les informations les plus récentes sur cette version,">
+<!ENTITY aboutTBUpdate.linkLabel "visiter notre site web">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog">
diff --git a/src/chrome/locale/fr/aboutTor.dtd b/src/chrome/locale/fr/aboutTor.dtd
index 67e55ef..4420599 100644
--- a/src/chrome/locale/fr/aboutTor.dtd
+++ b/src/chrome/locale/fr/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "A propos de Tor ">
-<!ENTITY aboutTor.outOfDateTorOn.label "CEPENDANT, ce navigateur n'est pas à jour.">
+<!ENTITY aboutTor.outOfDateTorOn.label "ATTENTION : ce navigateur n'est pas à jour.">
<!ENTITY aboutTor.outOfDateTorOff.label "DE PLUS, ce navigateur n'est pas à jour.">
<!ENTITY aboutTor.outOfDate2.label "Cliquez sur l'oignon et choisissez ensuite Vérifier les mises à jour du navigateur Tor">
<!ENTITY aboutTor.check.label "Tester les paramètres du réseau Tor">
-<!ENTITY aboutTor.success.label "Félicitations !">
-<!ENTITY aboutTor.success2.label "Ce navigateur est configuré pour utiliser Tor.">
+<!ENTITY aboutTor.success.label "Bienvenue dans le navigateur Tor">
+<!ENTITY aboutTor.success2.label "Connecté au réseau Tor.">
<!ENTITY aboutTor.success3.label "Vous pouvez maintenant naviguer sur Internet de manière anonyme.">
<!ENTITY aboutTor.failure.label "Une erreur s'est produite !">
<!ENTITY aboutTor.failure2.label "Tor ne fonctionne pas dans ce navigateur.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Le projet Tor est une organisation à but non lucratif (US 501(c)(3)) dédiée à la recherche, le développement et l'éducation sur l'anonymat et la vie privée en ligne.">
<!ENTITY aboutTor.learnMore.label "En savoir plus sur le projet Tor »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html">
+
+<!ENTITY aboutTor.donate.donate "Faire une donation">
+<!ENTITY aboutTor.donate.supportTor "Merci de soutenir Tor !">
diff --git a/src/chrome/locale/fr/aboutTor.properties b/src/chrome/locale/fr/aboutTor.properties
index ec59d81..d0b3c4d 100644
--- a/src/chrome/locale/fr/aboutTor.properties
+++ b/src/chrome/locale/fr/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Rechercher <a href="%1$S">de manière sécurisée</a>
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden n'aurait pas pu me contacter sans Tor et d'autres projects libres de logiciels de chiffrement. Tor est un outil essentiel, et il a besoin de notre support.
+aboutTor.donationBanner.lp.speciality=Réalisatrice Oscar du Meilleur Documentaire, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Confidentialité et anonymat nous concerne tous.
+aboutTor.donationBanner.cd.speciality= Auteur, Activiste pour la technologie, co-editeur de Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Veuillez aider l'outil d'anonymat le plus efficace dans le monde à devenir plus indépendant !
+aboutTor.donationBanner.rd.speciality=Fondateur, Directeur Exécutif Intérimaire du Projet Tor
diff --git a/src/chrome/locale/fr/torbutton.dtd b/src/chrome/locale/fr/torbutton.dtd
index 9811e4c..290505a 100644
--- a/src/chrome/locale/fr/torbutton.dtd
+++ b/src/chrome/locale/fr/torbutton.dtd
@@ -4,24 +4,24 @@
<!ENTITY torbutton.prefs.use_privoxy "Utiliser Privoxy">
<!ENTITY torbutton.prefs.use_polipo "Utiliser Polipo">
<!ENTITY torbutton.prefs.custom_settings "Utiliser des paramètres de proxy personnalisés">
-<!ENTITY torbutton.prefs.proxy.host.http "Proxy HTTP:">
-<!ENTITY torbutton.prefs.proxy.host.https "Proxy SSL:">
-<!ENTITY torbutton.prefs.proxy.host.ftp "Proxy FTP:">
-<!ENTITY torbutton.prefs.proxy.host.gopher "Proxy Gopher:">
-<!ENTITY torbutton.prefs.proxy.host.socks "Hôte SOCKS:">
-<!ENTITY torbutton.prefs.proxy.port "Port:">
+<!ENTITY torbutton.prefs.proxy.host.http "Proxy HTTP :">
+<!ENTITY torbutton.prefs.proxy.host.https "Proxy SSL :">
+<!ENTITY torbutton.prefs.proxy.host.ftp "Proxy FTP :">
+<!ENTITY torbutton.prefs.proxy.host.gopher "Proxy Gopher :">
+<!ENTITY torbutton.prefs.proxy.host.socks "Hôte SOCKS :">
+<!ENTITY torbutton.prefs.proxy.port "Port :">
<!ENTITY torbutton.about.title "À propos de Torbutton">
<!ENTITY torbutton.about.version "Version :">
<!ENTITY torbutton.about.summary "Protège l'anonymat de votre navigation avec Tor.">
<!ENTITY torbutton.about.code "Contributeurs au code :">
<!ENTITY torbutton.about.maintainer "Mainteneur :">
-<!ENTITY torbutton.about.security_review "Revue de sécurité :">
+<!ENTITY torbutton.about.security_review "Mise à jour de sécurité :">
<!ENTITY torbutton.about.donate "Si vous aimez Tor, vous devriez considérer">
<!ENTITY torbutton.about.make_donation "faire une donation.">
<!ENTITY torbutton.pref_connection.notice "Désactiver Torbutton pour modifier ces paramètres.">
<!ENTITY torbutton.pref_connection.more_info "Plus d'informations">
<!ENTITY torbutton.pref_connection_more_info.title "Aide">
-<!ENTITY torbutton.pref_connection_more_info.text "Torbutton est actuellement activé. Si vous souhaitez modifier vos paramètres proxy non-Tor, veuillez désactiver Torbutton et revenir à cette fenêtre. Si vous souhaitez modifier vos paramètres Tor, veuillez utiliser la fenêtre des préférences Torbutton.">
+<!ENTITY torbutton.pref_connection_more_info.text "Torbutton est actuellement activé. Si vous souhaitez modifier vos paramètres proxy non-Tor, veuillez désactiver Torbutton et revenir à cette fenêtre. Si vous souhaitez modifier vos paramètres Tor, veuillez utiliser la fenêtre des préférences Torbutton.">
<!ENTITY torbutton.context_menu.new_identity "Nouvelle identité">
<!ENTITY torbutton.context_menu.new_identity_key "I">
<!ENTITY torbutton.context_menu.new_circuit "Nouveau circuit Tor pour ce site">
diff --git a/src/chrome/locale/it/aboutTBUpdate.dtd b/src/chrome/locale/it/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/it/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/it/aboutTor.dtd b/src/chrome/locale/it/aboutTor.dtd
index e7d0041..d334ab7 100644
--- a/src/chrome/locale/it/aboutTor.dtd
+++ b/src/chrome/locale/it/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Info su Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "TUTTAVIA, questo browser non è aggiornato.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "INOLTRE, questo browser non è aggiornato.">
<!ENTITY aboutTor.outOfDate2.label "Clicca sulla cipolla e scegli "Scarica Aggiornamento Tor Browser Bundle".">
<!ENTITY aboutTor.check.label "Test Impostazioni della Rete Tor">
-<!ENTITY aboutTor.success.label "Congratulazioni!">
-<!ENTITY aboutTor.success2.label "Questo browser è configurato per usare Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Ora sei libero di navigare in internet anonimamente.">
<!ENTITY aboutTor.failure.label "Qualcosa è Andato Storto!">
<!ENTITY aboutTor.failure2.label "Tor non sta funzionando su questo browser.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Il Tor Project è un'organizzazione 501(c)(3) non-profit americana dedicata alla ricerca, sviluppo ed educazione sull'anonimato e privacy online.">
<!ENTITY aboutTor.learnMore.label "Maggiori info sul Tor Project »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Dona">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/it/aboutTor.properties b/src/chrome/locale/it/aboutTor.properties
index db49b15..5006a7d 100644
--- a/src/chrome/locale/it/aboutTor.properties
+++ b/src/chrome/locale/it/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Cerca <a href="%1$S"> in sicurezza </a> con <a href="%
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/ja/aboutTBUpdate.dtd b/src/chrome/locale/ja/aboutTBUpdate.dtd
new file mode 100644
index 0000000..3e57766
--- /dev/null
+++ b/src/chrome/locale/ja/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix "。">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/ja/aboutTor.dtd b/src/chrome/locale/ja/aboutTor.dtd
index 453ac4f..a093b1e 100644
--- a/src/chrome/locale/ja/aboutTor.dtd
+++ b/src/chrome/locale/ja/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Torについて">
-<!ENTITY aboutTor.outOfDateTorOn.label "しかし、このブラウザは古いバージョンです。">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "また、このブラウザは古いバージョンです。">
<!ENTITY aboutTor.outOfDate2.label "Onion をクリックして Tor Browser のアップデートを確認してください。">
<!ENTITY aboutTor.check.label "Torのネットワーク設定をテストする">
-<!ENTITY aboutTor.success.label "おめでとうございます!">
-<!ENTITY aboutTor.success2.label "このブラウザは、Torを使用するように設定されています。">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "現在、自由に匿名でインターネットをブラウズ出来ます。">
<!ENTITY aboutTor.failure.label "何かが間違っています!">
<!ENTITY aboutTor.failure2.label "Torは、このブラウザでは動作しません。">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Tor Projectは、オンラインの匿名性とプライバシーの研究・開発・教育を専門に行う米国の501(c)(3)非営利団体です。">
<!ENTITY aboutTor.learnMore.label "Tor Projectに関する詳細 »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "寄付">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/ja/aboutTor.properties b/src/chrome/locale/ja/aboutTor.properties
index ed1ecc6..290c072 100644
--- a/src/chrome/locale/ja/aboutTor.properties
+++ b/src/chrome/locale/ja/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a>で<a href="%1$S">安
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/ko/aboutDialog.dtd b/src/chrome/locale/ko/aboutDialog.dtd
index ae087b7..601fef7 100644
--- a/src/chrome/locale/ko/aboutDialog.dtd
+++ b/src/chrome/locale/ko/aboutDialog.dtd
@@ -1,14 +1,14 @@
<!ENTITY project.start "&brandShortName;의 개발자: ">
<!-- LOCALIZATION NOTE (project.tpoLink): This is a link title that links to https://www.torproject.org -->
<!ENTITY project.tpoLink "&vendorShortName;">
-<!ENTITY project.end ", a nonprofit working to defend your privacy and freedom online.">
+<!ENTITY project.end ", 여러분의 사생활과 인터넷의 자유를 위해 비영리로 운영되는 서비스">
<!ENTITY help.start "도움이 필요하신가요?">
<!-- LOCALIZATION NOTE (help.donate): This is a link title that links to https://www.torproject.org/donate/donate.html.en -->
<!ENTITY help.donateLink "후원하기">
<!ENTITY help.or "또는">
<!-- LOCALIZATION NOTE (help.getInvolvedLink): This is a link title that links to https://www.torproject.org/getinvolved/volunteer.html.en -->
-<!ENTITY help.getInvolvedLink "get involved">
+<!ENTITY help.getInvolvedLink "서비스 향상에 기여하기">
<!ENTITY help.end "!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "질문이 있으신가요?">
diff --git a/src/chrome/locale/ko/aboutTBUpdate.dtd b/src/chrome/locale/ko/aboutTBUpdate.dtd
new file mode 100644
index 0000000..545f269
--- /dev/null
+++ b/src/chrome/locale/ko/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix " ">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/ko/aboutTor.dtd b/src/chrome/locale/ko/aboutTor.dtd
index 89d3ef3..2ee34ad 100644
--- a/src/chrome/locale/ko/aboutTor.dtd
+++ b/src/chrome/locale/ko/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Tor에 대해서">
-<!ENTITY aboutTor.outOfDateTorOn.label "그 러 나, 이 브라우저는 오래되었습니다.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "또 한, 이 브라우저는 오래되었습니다.">
<!ENTITY aboutTor.outOfDate2.label "onion을 클릭하고 Tor Browser 업데이트 체크를 선택하세요.">
<!ENTITY aboutTor.check.label "Tor 네트워크 설정 테스트">
-<!ENTITY aboutTor.success.label "축하합니다!">
-<!ENTITY aboutTor.success2.label "이 브라우저는 Tor를 사용하도록 구성되었습니다.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "이제 자유롭게 익명으로 인터넷을 탐색할 수 있습니다.">
<!ENTITY aboutTor.failure.label "뭔가 잘못되었습니다!">
<!ENTITY aboutTor.failure2.label "Tor는 이 브라우저에서 작동하지 않습니다.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Tor 프로젝트란? 온라인 익명 및 개인 정보 보호의 연구, 개발 및 교육에 힘쓰는 US 501(c)(3) 비영리 단체입니다.">
<!ENTITY aboutTor.learnMore.label "Tor 프로젝트에 대해서 더 알아보기 »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "후원하기">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/ko/aboutTor.properties b/src/chrome/locale/ko/aboutTor.properties
index 60d0646..1d37de7 100644
--- a/src/chrome/locale/ko/aboutTor.properties
+++ b/src/chrome/locale/ko/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=<a href="%2$S">Diconnect.me</a>를 <a href="%1$S">안
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/ko/torbutton.dtd b/src/chrome/locale/ko/torbutton.dtd
index 95b0852..708c966 100644
--- a/src/chrome/locale/ko/torbutton.dtd
+++ b/src/chrome/locale/ko/torbutton.dtd
@@ -24,7 +24,7 @@
<!ENTITY torbutton.pref_connection_more_info.text "Torbutton이 현재 활성화되었습니다. 만약 Tor 프록시가 아닌 일반 프록시 서버 설정을 하시려면, Torbutton을 비활성화하고 이 창으로 돌아오십시오. 혹시 Tor 프록시 설정을 바꾸고 싶으시다면, Torbutton 설정 화면을 사용해 주세요.">
<!ENTITY torbutton.context_menu.new_identity "새로운 신원">
<!ENTITY torbutton.context_menu.new_identity_key "I">
-<!ENTITY torbutton.context_menu.new_circuit "New Tor Circuit for this Site">
+<!ENTITY torbutton.context_menu.new_circuit "Tor 서킷 재구축">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
<!ENTITY torbutton.context_menu.toggle "Tor 작동 상태">
<!ENTITY torbutton.context_menu.toggle.key "T">
@@ -154,22 +154,22 @@
<!ENTITY torbutton.prefs.sec_low "낮음 (기본)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "This provides the most usable experience.">
<!ENTITY torbutton.prefs.sec_low_desc "At this security level, all browser features are enabled.">
-<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "The SVG OpenType font rendering mechanism is disabled.">
+<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "SVG 폰트 렌터링 체계가 비활성화되었습니다.">
<!ENTITY torbutton.prefs.sec_med_low "중간 낮음">
<!ENTITY torbutton.prefs.sec_gen_desc "At this security level, the following changes apply (mouseover for details):">
<!ENTITY torbutton.prefs.sec_html5_desc "HTML5 video and audio media become click-to-play via NoScript.">
<!ENTITY torbutton.prefs.sec_html5_tooltip "On some sites, you might need to use the NoScript toolbar button to enable these media objects.">
-<!ENTITY torbutton.prefs.sec_some_jit_desc "Some JavaScript performance optimizations are disabled.">
+<!ENTITY torbutton.prefs.sec_some_jit_desc "일부 JavaScript 의 성능 최적화가 비활성화되었습니다.">
<!ENTITY torbutton.prefs.sec_jit_desc_tooltip "ION JIT, Type Inference, ASM.JS.">
<!ENTITY torbutton.prefs.sec_baseline_jit_desc_tooltip "Baseline (베이스라인) JIT.">
-<!ENTITY torbutton.prefs.sec_jit_slower_desc "Scripts on some sites may run slower.">
+<!ENTITY torbutton.prefs.sec_jit_slower_desc "일부 사이트의 스크립트 동작이 느려질 수 있습니다.">
<!ENTITY torbutton.prefs.sec_jar_desc "Remote JAR files are blocked.">
<!ENTITY torbutton.prefs.sec_jar_tooltip "JAR files are extremely rare on the web, but can be a source of XSS and other attacks.">
<!ENTITY torbutton.prefs.sec_mathml_desc "Some mechanisms of displaying math equations are disabled.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML가 비활성화 되었습니다.">
<!ENTITY torbutton.prefs.sec_med_high "중간 높음">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "All JavaScript performance optimizations are disabled.">
-<!ENTITY torbutton.prefs.sec_font_rend_desc "Some font rendering features are disabled.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "모든 JavaScript 의 성능 최적화가 비활성화되었습니다.">
+<!ENTITY torbutton.prefs.sec_font_rend_desc "일부 폰트의 렌터링이 비활성화되었습니다.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "The Graphite font rendering mechanism is disabled.">
<!ENTITY torbutton.prefs.sec_svg_desc "몇몇 종류의 이미지가 비활성화 되었습니다.">
<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "SVG images가 비활성화 되었습니다.">
@@ -180,7 +180,7 @@
<!ENTITY torbutton.prefs.sec_audio_video_desc "대다수 포맷의 음성, 영상 파일이 비활성화 되었습니다.">
<!ENTITY torbutton.prefs.sec_audio_video_desc_tooltip "WebM is the only codec that remains enabled.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "어떤 글씨체나 아이콘은 올바르지 않게 표시될 수 있습니다.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Website-provided font files are blocked.">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "사이트 내장 폰트가 차단되었습니다.">
<!ENTITY torbutton.prefs.sec_custom "맞춤 값">
<!ENTITY torbutton.circuit_display.title "Tor circuit for this site">
diff --git a/src/chrome/locale/nl/aboutTBUpdate.dtd b/src/chrome/locale/nl/aboutTBUpdate.dtd
new file mode 100644
index 0000000..57a8c54
--- /dev/null
+++ b/src/chrome/locale/nl/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser is bijgewerkt.">
+<!ENTITY aboutTBUpdate.linkPrefix "Voor meer info over deze release,">
+<!ENTITY aboutTBUpdate.linkLabel "bekijk onze website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Wijzigingslogboek:">
diff --git a/src/chrome/locale/nl/aboutTor.dtd b/src/chrome/locale/nl/aboutTor.dtd
index 4abee58..fcc46ec 100644
--- a/src/chrome/locale/nl/aboutTor.dtd
+++ b/src/chrome/locale/nl/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Over Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "ECHTER, deze browser is verouderd.">
+<!ENTITY aboutTor.outOfDateTorOn.label "Waarschuwing: Deze browser is verouderd!">
<!ENTITY aboutTor.outOfDateTorOff.label "BOVENDIEN is deze browser verouderd.">
<!ENTITY aboutTor.outOfDate2.label "Klik op de ui en kies Controleer op Tor Browser Update">
<!ENTITY aboutTor.check.label "Test Tor Netwerkinstellingen">
-<!ENTITY aboutTor.success.label "Gefeliciteerd!">
-<!ENTITY aboutTor.success2.label "Deze browser is ingesteld om Tor te gebruiken.">
+<!ENTITY aboutTor.success.label "Welkom bij Tor Browser">
+<!ENTITY aboutTor.success2.label "Verbonden met het Tor netwerk.">
<!ENTITY aboutTor.success3.label "Je kan nu anoniem over het internet browsen.">
<!ENTITY aboutTor.failure.label "Er ging iets mis!">
<!ENTITY aboutTor.failure2.label "Tor werkt niet in deze browser.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Het Tor Project is een US 501(c)(3) non-profit voor onderzoek, ontwikkeling, onderwijs in online anonimiteit en privacy.">
<!ENTITY aboutTor.learnMore.label "Leer meer over Het Tor Project » ">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Doneer">
+<!ENTITY aboutTor.donate.supportTor "Steun a.u.b. Tor!">
diff --git a/src/chrome/locale/nl/aboutTor.properties b/src/chrome/locale/nl/aboutTor.properties
index 63c49fa..8c2c87f 100644
--- a/src/chrome/locale/nl/aboutTor.properties
+++ b/src/chrome/locale/nl/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=<a href="%1$S">Veilig</a> zoeken met <a href="%2$S">Di
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden zou geen contact met mij kunnen hebben zonder Tor en andere gratis software encryptie projecten. Tor is essentieel, en het heeft nu onze hulp nodig.
+aboutTor.donationBanner.lp.speciality=Oscar-Winnend Documentaire Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy en anonimiteit is voor iedereen belangrijk.
+aboutTor.donationBanner.cd.speciality= Romanschrijver, technologie activist en co-redacteur van Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Help mee met het in stand houden van het sterkste privacy tool van de wereld!
+aboutTor.donationBanner.rd.speciality=Oprichter, Adjunct-directeur van het Tor Project
diff --git a/src/chrome/locale/pl/aboutTBUpdate.dtd b/src/chrome/locale/pl/aboutTBUpdate.dtd
new file mode 100644
index 0000000..151fb71
--- /dev/null
+++ b/src/chrome/locale/pl/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Aktualizacja przeglądarki Tor">
+<!ENTITY aboutTBUpdate.updated "Przeglądarka Tor została zaktualizowana.">
+<!ENTITY aboutTBUpdate.linkPrefix "Aby uzyskać najbardziej aktualne informacje o tym wydaniu,">
+<!ENTITY aboutTBUpdate.linkLabel "odwiedź naszą stronę internetową">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Lista zmian:">
diff --git a/src/chrome/locale/pl/aboutTor.dtd b/src/chrome/locale/pl/aboutTor.dtd
index ded026b..a79b973 100644
--- a/src/chrome/locale/pl/aboutTor.dtd
+++ b/src/chrome/locale/pl/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Informacje na temat Tor'a">
-<!ENTITY aboutTor.outOfDateTorOn.label "JEDNAK, ta przeglądarka jest nieaktualna.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "PONADTO, ta przeglądarka jest nieaktualna.">
<!ENTITY aboutTor.outOfDate2.label "Kliknij na ikonę cebuli, a następnie wybierz Sprawdź czy są dostępne aktualizacje.">
<!ENTITY aboutTor.check.label "Przetestuj Ustawienia Sieci Tor">
-<!ENTITY aboutTor.success.label "Gratulacje!">
-<!ENTITY aboutTor.success2.label "Ta przeglądarka jest skonfigurowana do korzystania z Tor'a.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Możesz teraz swobodnie przeglądać Internet anonimowo.">
<!ENTITY aboutTor.failure.label "Coś poszło nie tak!">
<!ENTITY aboutTor.failure2.label "Tor nie działa w tej przeglądarce.">
@@ -49,3 +49,6 @@
* 501(c)(3)">
<!ENTITY aboutTor.learnMore.label "Dowiedz się więcej na temat Tor Project »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Wspomóż finansowo">
+<!ENTITY aboutTor.donate.supportTor "Proszę wspomóż Tor!">
diff --git a/src/chrome/locale/pl/aboutTor.properties b/src/chrome/locale/pl/aboutTor.properties
index 9bf0dcd..88c79b9 100644
--- a/src/chrome/locale/pl/aboutTor.properties
+++ b/src/chrome/locale/pl/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Szukaj <a href="%1$S">bezpiecznie</a> używając wyszu
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/pt/aboutTBUpdate.dtd b/src/chrome/locale/pt/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/pt/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/pt/aboutTor.dtd b/src/chrome/locale/pt/aboutTor.dtd
index d3294cf..8fd6939 100644
--- a/src/chrome/locale/pt/aboutTor.dtd
+++ b/src/chrome/locale/pt/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Sobre o Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "CONTUDO, este navegador está desatualizado.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "TAMBÉM, este navegador está desatualizado.">
-<!ENTITY aboutTor.outOfDate2.label "Clique na cebola e escolha 'Procurar por Atualizações do Navegador Tor'">
+<!ENTITY aboutTor.outOfDate2.label "Clique na cebola e escolha 'Procurar atualizações do navegador Tor'">
<!ENTITY aboutTor.check.label "Testar as Configurações da Rede Tor">
-<!ENTITY aboutTor.success.label "Parabéns!">
-<!ENTITY aboutTor.success2.label "Este navegador está configurado para utilizar o Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Agora já está livre para navegar na Internet anonimamente.">
<!ENTITY aboutTor.failure.label "Ocorreu Algo de Errado!">
<!ENTITY aboutTor.failure2.label "O Tor não está a funcionar neste navegador.">
@@ -32,18 +32,21 @@
<!ENTITY aboutTor.torInfo3.label "Nó de saída:">
<!ENTITY aboutTor.torInfo4.label "Este servidor não regista qualquer informação sobre os visitantes.">
<!ENTITY aboutTor.whatnextQuestion.label "E a seguir?">
-<!ENTITY aboutTor.whatnextAnswer.label "O Tor NÃO é tudo o que precisa para navegar anonimamente na internet! Poderá ter que mudar alguns dos seus hábitos de navegação para ter a certeza que a sua identidade está segura.">
+<!ENTITY aboutTor.whatnextAnswer.label "O Tor NÃO é tudo o que precisa para navegar anonimamente na Internet! Poderá ter que mudar alguns dos seus hábitos de navegação para ter a certeza que a sua identidade está segura.">
<!ENTITY aboutTor.whatnext.label "Dicas Sobre Como se Manter Anónimo »">
<!ENTITY aboutTor.whatnext.link "https://www.torproject.org/download/download.html.en#warning">
<!ENTITY aboutTor.helpInfo1.label "Você Pode Ajudar!">
-<!ENTITY aboutTor.helpInfo2.label "Existem muitas maneiras para ajudar a tornar a rede Tor mais rápida e segura:">
-<!ENTITY aboutTor.helpInfo3.label "Execute um Nó de Retransmissão Tor »">
+<!ENTITY aboutTor.helpInfo2.label "Pode ajudar de muitas maneiras para tornar a Rede Tor mais rápida e segura:">
+<!ENTITY aboutTor.helpInfo3.label "Executar um Nó de Retransmissão Tor »">
<!ENTITY aboutTor.helpInfo3.link "https://www.torproject.org/docs/tor-doc-relay.html.en">
<!ENTITY aboutTor.helpInfo4.label "Voluntarie os Seus Serviços »">
<!ENTITY aboutTor.helpInfo4.link "https://www.torproject.org/getinvolved/volunteer.html.en">
<!ENTITY aboutTor.helpInfo5.label "Efetue um Donativo »">
<!ENTITY aboutTor.helpInfo5.link "https://www.torproject.org/donate/donate.html.en">
-<!ENTITY aboutTor.footer.label "O Projeto Tor é uma organização sem fins lucrativos US 501(c)(3) dedicada à investigação, desenvolvimento e promoção de anonimidade e privacidade online.">
-<!ENTITY aboutTor.learnMore.label "Saiba mais sobre o Projeto Tor »">
+<!ENTITY aboutTor.footer.label "O Projeto Tor é uma organização sem fins lucrativos US 501(c)(3) dedicada à investigação, desenvolvimento e promoção de anonimato e privacidade on-line.">
+<!ENTITY aboutTor.learnMore.label "Saber mais sobre o Projeto Tor »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Doar">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/pt/aboutTor.properties b/src/chrome/locale/pt/aboutTor.properties
index 7bf9d5d..85e9a0d 100644
--- a/src/chrome/locale/pt/aboutTor.properties
+++ b/src/chrome/locale/pt/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Procurar com <a href="%1$S">segurança</a> com <a href
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/pt/brand.dtd b/src/chrome/locale/pt/brand.dtd
index d3566f4..2a412fc 100644
--- a/src/chrome/locale/pt/brand.dtd
+++ b/src/chrome/locale/pt/brand.dtd
@@ -6,10 +6,10 @@
<!ENTITY brandShortName "Navegador Tor">
<!ENTITY brandFullName "Navegador Tor">
<!ENTITY vendorShortName "Projeto Tor">
-<!ENTITY trademarkInfo.part1 "O Firefox e os logótipos Firefox são marcas registadas da Fundação Mozilla.">
+<!ENTITY trademarkInfo.part1 "O Firefox e os logótipos do Firefox são marcas registadas da Fundação Mozilla.">
<!-- The following strings are for bug #10280's UI. We place them here for our translators -->
-<!ENTITY plugins.installed.find "Clique para carregar os plugi-ns do sistema instalados">
-<!ENTITY plugins.installed.enable "Ativar plug-ins">
+<!ENTITY plugins.installed.find "Clique para carregar os plugins do sistema instalados">
+<!ENTITY plugins.installed.enable "Ativar plugins">
<!ENTITY plugins.installed.disable "Desativar plug-ins">
-<!ENTITY plugins.installed.disable.tip "Clique para evitar o carregamento dos plugins do sistema">
+<!ENTITY plugins.installed.disable.tip "Clique para evitar o carregamento das extensões do sistema">
diff --git a/src/chrome/locale/pt/torbutton.dtd b/src/chrome/locale/pt/torbutton.dtd
index 503b4fa..9b6f323 100644
--- a/src/chrome/locale/pt/torbutton.dtd
+++ b/src/chrome/locale/pt/torbutton.dtd
@@ -1,9 +1,9 @@
-<!ENTITY torbutton.prefs.title "Preferências Torbutton">
+<!ENTITY torbutton.prefs.title "Preferências do Torbutton">
<!ENTITY torbutton.prefs.tor_settings "Configurações do Proxy">
<!ENTITY torbutton.prefs.recommended_settings "Utilize as configurações recomendadas do proxy para a minha versão do Firefox">
<!ENTITY torbutton.prefs.use_privoxy "Utilizar Privoxy">
<!ENTITY torbutton.prefs.use_polipo "Utilizar Polipo">
-<!ENTITY torbutton.prefs.custom_settings "Utilize as configurações do proxy personalizadas">
+<!ENTITY torbutton.prefs.custom_settings "Utilizar as configurações do proxy personalizadas">
<!ENTITY torbutton.prefs.proxy.host.http "Proxy HTTP:">
<!ENTITY torbutton.prefs.proxy.host.https "Proxy SSL:">
<!ENTITY torbutton.prefs.proxy.host.ftp "Proxy FTP:">
@@ -14,17 +14,17 @@
<!ENTITY torbutton.about.version "Versão:">
<!ENTITY torbutton.about.summary "Protege a privacidade da sua navegação Tor.">
<!ENTITY torbutton.about.code "Contribuidores do código:">
-<!ENTITY torbutton.about.maintainer "Mantenedor:">
-<!ENTITY torbutton.about.security_review "Revisão de Segurança:">
+<!ENTITY torbutton.about.maintainer "Defensor:">
+<!ENTITY torbutton.about.security_review "Revisão de segurança:">
<!ENTITY torbutton.about.donate "Se gosta de utilizar o Tor, poderá considerar">
-<!ENTITY torbutton.about.make_donation "efetuar uma doação">
+<!ENTITY torbutton.about.make_donation "efetuar uma doação.">
<!ENTITY torbutton.pref_connection.notice "Desativar o Torbutton para alterar estas configurações.">
<!ENTITY torbutton.pref_connection.more_info "Mais informação">
<!ENTITY torbutton.pref_connection_more_info.title "Ajuda">
-<!ENTITY torbutton.pref_connection_more_info.text "O Torbutton está ativado. Se desejar alterar as configurações do Proxy que não sejam do Tor, por favor, desative o Torbutton e volte aqui. Se desejar alterar as configurações do Tor, por favor, utilize a janela de preferências do Torbutton.">
-<!ENTITY torbutton.context_menu.new_identity "Identidade Nova">
+<!ENTITY torbutton.pref_connection_more_info.text "O Torbutton está ativado. Se desejar alterar as configurações proxy que não sejam do Tor, por favor, desative o Torbutton e volte aqui. Se desejar alterar as configurações do Tor, por favor, utilize a janela de preferências do Torbutton.">
+<!ENTITY torbutton.context_menu.new_identity "Nova Identidade">
<!ENTITY torbutton.context_menu.new_identity_key "I">
-<!ENTITY torbutton.context_menu.new_circuit "Novo circuito Tor para este sítio">
+<!ENTITY torbutton.context_menu.new_circuit "Novo Circuito Tor para este Site">
<!ENTITY torbutton.context_menu.new_circuit_key "C">
<!ENTITY torbutton.context_menu.toggle "Alterar estado do Tor">
<!ENTITY torbutton.context_menu.toggle.key "T">
@@ -34,62 +34,62 @@
<!ENTITY torbutton.context_menu.about.key "A">
<!ENTITY torbutton.context_menu.networksettings "Configurações da Rede Tor...">
<!ENTITY torbutton.context_menu.networksettings.key "S">
-<!ENTITY torbutton.context_menu.downloadUpdate "Procurar atualizações do Tor...">
+<!ENTITY torbutton.context_menu.downloadUpdate "Procurar por atualizações do Navegador Tor...">
<!ENTITY torbutton.context_menu.downloadUpdate.key "A">
-<!ENTITY torbutton.context_menu.cookieProtections "Proteções das Cookies...">
+<!ENTITY torbutton.context_menu.cookieProtections "Proteções de Cookies...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
<!ENTITY torbutton.context_menu.copyTor "Copiar URL do Tor">
<!ENTITY torbutton.context_menu.copyTor.key "P">
-<!ENTITY torbutton.context_menu.openTorTab "Abrir URL do Tor num separador novo ">
+<!ENTITY torbutton.context_menu.openTorTab "Abrir URL do Tor num novo Separador ">
<!ENTITY torbutton.context_menu.openTorTab.key "r">
-<!ENTITY torbutton.context_menu.openTorWindow "Abrir URL do Tor numa janela nova ">
+<!ENTITY torbutton.context_menu.openTorWindow "Abrir o URL do Tor numa nova Janela ">
<!ENTITY torbutton.context_menu.openTorWindow.key "d">
<!ENTITY torbutton.button.label "Torbutton">
<!ENTITY torbutton.button.tooltip "Clique para inicializar o Torbutton">
-<!ENTITY torbutton.prefs.privacy_security_settings "Privacidade e Configurações de Segurança">
-<!ENTITY torbutton.prefs.block_thread "Bloquear leitura do histórico durante a utilização do Tor (crucial)">
+<!ENTITY torbutton.prefs.privacy_security_settings "Configurações de Privacidade e Segurança">
+<!ENTITY torbutton.prefs.block_thread "Bloquear a leitura do histórico durante a utilização do Tor (crucial)">
<!ENTITY torbutton.prefs.block_thwrite "Bloquear a gravação no histórico durante a utilização do Tor (recomendado)">
<!ENTITY torbutton.prefs.block_nthread "Bloquear a leitura do histórico durante a não utilização do Tor (opcional)">
<!ENTITY torbutton.prefs.block_nthwrite "Bloquear a gravação no histórico durante a não utilização do Tor (opcional)">
-<!ENTITY torbutton.prefs.clear_history "Limpar histórico ao alternar a utilização do Tor (opcional)">
-<!ENTITY torbutton.prefs.clear_cache "Bloquear a cache do disco Tor e limpar toda a cache ao alternar a utilização do Tor">
-<!ENTITY torbutton.prefs.block_cache "Bloquear cache de memória e disco durante o uso do Tor">
-<!ENTITY torbutton.prefs.cookie_jars "Armazenar todos os cookies não-Tor num local protegido">
-<!ENTITY torbutton.prefs.cookie_protection "Usar a caixa de diálogo das Proteções dos Cookies para escolher">
-<!ENTITY torbutton.prefs.mmm_cookies "Eu manualmente administrarei os meus cookies (perigoso)">
-<!ENTITY torbutton.prefs.clear_cookies "Limpar cookies quando alterar a utilização do Tor">
-<!ENTITY torbutton.prefs.disable_plugins "Desactivar plugins durante a utilização do Tor (importante)">
-<!ENTITY torbutton.prefs.kill_bad_js "Bloquear os scripts perigosos de Java (crucial)">
-<!ENTITY torbutton.prefs.isolate_content "Isolar os conteúdos dinâmicos no arquivo de estado de Tor (crucial)">
-<!ENTITY torbutton.prefs.no_updates "Desactivar actualizações durante a utilização do Tor">
-<!ENTITY torbutton.prefs.set_uagent "Mascarar User Agent durante utilização de Tor (crucial)">
+<!ENTITY torbutton.prefs.clear_history "Limpar o histórico ao alternar a utilização do Tor (opcional)">
+<!ENTITY torbutton.prefs.clear_cache "Bloquear a cache de disco do Tor e limpar toda a cache ao alternar a utilização do Tor">
+<!ENTITY torbutton.prefs.block_cache "Bloquear a cache de memória e acesso de disco durante a utilização do Tor">
+<!ENTITY torbutton.prefs.cookie_jars "Guardar todos os cookies Não-Tor num local protegido">
+<!ENTITY torbutton.prefs.cookie_protection "Utilizar a janela das Proteções de Cookies para escolher">
+<!ENTITY torbutton.prefs.mmm_cookies "Eu irei gerir manualmente os meus cookies (perigoso)">
+<!ENTITY torbutton.prefs.clear_cookies "Limpar os cookies quando alternar a utilização do Tor">
+<!ENTITY torbutton.prefs.disable_plugins "Desativar as extensões durante a utilização do Tor (crucial)">
+<!ENTITY torbutton.prefs.kill_bad_js "Captar javascript perigosos (crucial)">
+<!ENTITY torbutton.prefs.isolate_content "Isolar o conteúdo dinâmico para o estado do Tor (crucial)">
+<!ENTITY torbutton.prefs.no_updates "Desativar as atualizações durante a utilização do Tor">
+<!ENTITY torbutton.prefs.set_uagent "Definir o agente do utilizador durante a utilização do Tor (crucial)">
<!ENTITY torbutton.prefs.dynamic "Conteúdo Dinâmico">
<!ENTITY torbutton.prefs.cookies "Cookies">
<!ENTITY torbutton.prefs.cache "Cache">
<!ENTITY torbutton.prefs.history "Histórico">
-<!ENTITY torbutton.prefs.no_search "Desactivar sugestões de pesquisa durante a utilização do Tor (recomendado)">
-<!ENTITY torbutton.prefs.shutdown "Desligar">
-<!ENTITY torbutton.prefs.tor_shutdown "Limpar cookies quando o Tor estiver activo e o navegador for fechado">
-<!ENTITY torbutton.prefs.all_shutdown "Limpar cookies quando qualquer navegador for fechado">
-<!ENTITY torbutton.prefs.no_shutdown "Não limpar meus cookies ao desligar">
-<!ENTITY torbutton.prefs.disable_sessionstore "Desactivar a função de salvar sessão (recomendado)">
-<!ENTITY torbutton.prefs.headers "Cabeçalho">
-<!ENTITY torbutton.prefs.spoof_english "Mimetizar o navegador para Inglês dos EUA">
-<!ENTITY torbutton.prefs.refererspoofing "Falsificação do referente">
+<!ENTITY torbutton.prefs.no_search "Desativar as sugestões de procura durante a utilização do Tor (recomendado)">
+<!ENTITY torbutton.prefs.shutdown "Encerrar">
+<!ENTITY torbutton.prefs.tor_shutdown "Limpar os cookies durante o encerramento do navegador Tor ativado">
+<!ENTITY torbutton.prefs.all_shutdown "Limpar os cookies durante o encerramento de qualquer navegador">
+<!ENTITY torbutton.prefs.no_shutdown "Não limpar os meus cookies ao encerrar">
+<!ENTITY torbutton.prefs.disable_sessionstore "Desativar Função de Guardar a Sessão (recomendado)">
+<!ENTITY torbutton.prefs.headers "Cabeçalhos">
+<!ENTITY torbutton.prefs.spoof_english "Enganar o Navegador em Inglês dos EUA">
+<!ENTITY torbutton.prefs.refererspoofing "Enganar remetente">
<!ENTITY torbutton.prefs.spoofblank "Spoof blank referer during Tor usage (may break some sites)">
<!ENTITY torbutton.prefs.smartspoof "Falsificação inteligente do referente durante o uso do Tor (falsifica referentes de domínios cruzados)">
<!ENTITY torbutton.prefs.nospoof "No referer spoof during Tor usage (sends referers as normal)">
-<!ENTITY torbutton.prefs.disable_domstorage "Desactivar o armazenamento DOM durante o uso do Tor (crucial)">
+<!ENTITY torbutton.prefs.disable_domstorage "Desativar o armazenamento DOM durante a utilização do Tor (crucial)">
<!ENTITY torbutton.prefs.forms "Formulários">
-<!ENTITY torbutton.prefs.block_tforms "Bloquear senhas + informações de formulários durante o uso do Tor (recomendado)">
-<!ENTITY torbutton.prefs.block_ntforms "Bloquear senhas + informações de formulários quando não usar o Tor (opcional)">
+<!ENTITY torbutton.prefs.block_tforms "Bloquear senhas + formulário durante a utilização do Tor (recomendado)">
+<!ENTITY torbutton.prefs.block_ntforms "Bloquear senha + formulário durante a utilização do Tor (opcional)">
<!ENTITY torbutton.prefs.tor "Tor">
<!ENTITY torbutton.prefs.non_tor "Não-Tor">
-<!ENTITY torbutton.prefs.restore_tor "Na sessão restaurada, ajustar o estado do Tor para:">
-<!ENTITY torbutton.prefs.startup_tor "No arranque do Browser, acertar o estado do Tor para:">
-<!ENTITY torbutton.prefs.reload_crashed_jar "Recarregar cookies/limpar cookies em caso de falha do Firefox (recomendado)">
-<!ENTITY torbutton.prefs.dual_cookie_jars "Armazene os cookies, sejam ou não do Tor, em recipientes protegidos (perigoso)">
-<!ENTITY torbutton.prefs.clear_http_auth "Limpar as sessões HTTP autenticadas (recomendado)">
+<!ENTITY torbutton.prefs.restore_tor "Na sessão restaurada do arranque, definir o estado do Tor para:">
+<!ENTITY torbutton.prefs.startup_tor "No arranque do Browser, definir o estado do Tor para:">
+<!ENTITY torbutton.prefs.reload_crashed_jar "Recarregar cookies/limpar cookies no crache do Firefox (recomendado)">
+<!ENTITY torbutton.prefs.dual_cookie_jars "Guardar ambos os cookies do Tor ou Não-Tor nos recipientes protegidos (perigoso)">
+<!ENTITY torbutton.prefs.clear_http_auth "Limpar a autorização das sessões HTTP (recomendado)">
<!ENTITY torbutton.prefs.block_js_history "Isolar o acesso ao histórico de navegação ao arquivo de estado de Tor (crucial)">
<!ENTITY torbutton.prefs.resize_on_toggle "Alterar o tamanho das páginas em múltiplos de 50px durante o uso de Tor (recomendado)">
<!ENTITY torbutton.prefs.close_tor "Fechar todas as páginas e abas abertas com Tor ao clicar no ícone do Torbutton (opcional)">
@@ -99,59 +99,59 @@
<!ENTITY torbutton.prefs.jar_ca_certs "Armazene certificados CA em arquivos de estado separados para páginas Tor e não-Tor (recomendado)">
<!ENTITY torbutton.prefs.locked_mode "Desactivar botão e atalhos para prevenir a activação/desactivação por engano">
<!ENTITY torbutton.prefs.startup_state "Na inicialização normal, definir o estado do Tor para:">
-<!ENTITY torbutton.prefs.shutdown_state "Desligar estado">
-<!ENTITY torbutton.prefs.startup "Iniciar">
-<!ENTITY torbutton.prefs.block_tor_file_net "Bloquear o acesso à rede de URLs tipo file:// (recomendado)">
-<!ENTITY torbutton.prefs.block_nontor_file_net "Bloquear o acesso Não-Tor à rede de URLs tipo file://">
-<!ENTITY torbutton.prefs.restore_defaults "Restaurar definições ">
-<!ENTITY torbutton.prefs.test_settings "Testar configurações">
+<!ENTITY torbutton.prefs.shutdown_state "Estado do encerramento">
+<!ENTITY torbutton.prefs.startup "Arranque">
+<!ENTITY torbutton.prefs.block_tor_file_net "Bloquear o acesso do Tor à rede a partir de file:// urls (recomendado)">
+<!ENTITY torbutton.prefs.block_nontor_file_net "Bloquear o acesso de Não-Tor à rede a partir de file:// urls">
+<!ENTITY torbutton.prefs.restore_defaults "Restaurar Predefinições">
+<!ENTITY torbutton.prefs.test_settings "Testar Configurações">
<!ENTITY torbutton.prefs.test_auto "Testar as minhas configurações sempre que o Firefox iniciar, após a primeira activação do Torbutton">
<!ENTITY torbutton.prefs.disable_livemarks "Disable livemarks updates during Tor usage">
-<!ENTITY torbutton.prefs.tor_memory_jar "Não escrever cookies Tor para o disco">
-<!ENTITY torbutton.prefs.nontor_memory_jar "Não escrever cookies não-Tor para o disco">
-<!ENTITY torbutton.prefs.session_restore "Salvar e restaurar estas abas:">
-<!ENTITY torbutton.prefs.nontor_tabs "Abas carregadas em estado não-Tor">
-<!ENTITY torbutton.prefs.tor_tabs "Abas carregas em estado Tor">
+<!ENTITY torbutton.prefs.tor_memory_jar "Não gravar os cookies do Tor para disco">
+<!ENTITY torbutton.prefs.nontor_memory_jar "Não gravar os cookies Não-Tor para disco">
+<!ENTITY torbutton.prefs.session_restore "Guarde a sessão e restaure estes separadores:">
+<!ENTITY torbutton.prefs.nontor_tabs "Separadores carregados na utilização de Não-Tor">
+<!ENTITY torbutton.prefs.tor_tabs "Separadores carregados na utilização do Tor">
<!ENTITY torbutton.prefs.socks_vfour "SOCKS v4">
<!ENTITY torbutton.prefs.socks_vfive "SOCKS v5">
<!ENTITY torbutton.prefs.no_proxies_on "Nenhum proxy para: ">
-<!ENTITY torbutton.prefs.no_proxy_warning "Evite utilizar o nome da máquina no campo a cima">
-<!ENTITY torbutton.prefs.spoofreresh "Refrescamento da falsificação">
+<!ENTITY torbutton.prefs.no_proxy_warning "Aviso: evite utilizar quaisquer nomes de hospedeiro acima">
+<!ENTITY torbutton.prefs.spoofreresh "Spoof Refresh">
<!ENTITY torbutton.prefs.refereroptions "Opções de falsificação do referente">
<!ENTITY torbutton.prefs.nospoof "No referer spoof during Tor usage (sends referers as normal)">
-<!ENTITY torbutton.prefs.spoofroot "Falsificar a pasta que contém a página">
-<!ENTITY torbutton.prefs.spoofdomain "Falsificar o domínio com o referente">
+<!ENTITY torbutton.prefs.spoofroot "Enganar a pasta da página">
+<!ENTITY torbutton.prefs.spoofdomain "Enganar o domínio como remetente">
<!ENTITY torbutton.prefs.spoofblank "Spoof blank referer during Tor usage (may break some sites)">
-<!ENTITY torbutton.cookiedialog.title "Gerir as Proteções dos Cookies">
+<!ENTITY torbutton.cookiedialog.title "Gerir Proteções dos Cookies">
<!ENTITY torbutton.cookiedialog.lockCol "Protegido">
-<!ENTITY torbutton.cookiedialog.domainCol "Anfitrião">
+<!ENTITY torbutton.cookiedialog.domainCol "Hospedeiro">
<!ENTITY torbutton.cookiedialog.nameCol "Nome">
<!ENTITY torbutton.cookiedialog.pathCol "Caminho">
<!ENTITY torbutton.cookiedialog.protectCookie "Proteger Cookie">
<!ENTITY torbutton.cookiedialog.removeCookie "Remover Cookie">
<!ENTITY torbutton.cookiedialog.unprotectCookie "Desproteger Cookie">
-<!ENTITY torbutton.cookiedialog.removeAllBut "Remover todos excepto os Protegidos">
-<!ENTITY torbutton.cookiedialog.saveAllCookies "Proteger os novos Cookies">
-<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Não proteger os novos Cookies">
+<!ENTITY torbutton.cookiedialog.removeAllBut "Remover Tudo Exceto Protegidos">
+<!ENTITY torbutton.cookiedialog.saveAllCookies "Proteger Novos Cookies">
+<!ENTITY torbutton.cookiedialog.doNotSaveAllCookies "Não Proteger Novos Cookies">
<!ENTITY torbutton.prefs.disable_livemarks "Disable livemarks updates during Tor usage">
<!ENTITY torbutton.prefs.dtd_recommended "(recomendado)">
<!ENTITY torbutton.prefs.dtd_optional "(opcional)">
<!ENTITY torbutton.prefs.dtd_crucial "(crucial)">
-<!ENTITY torbutton.prefs.update_torbutton_via_tor "Redirect Torbutton actualiza-se através do Tor">
-<!ENTITY torbutton.prefs.dodge_google_captcha "Usar automaticamente um motor de busca alternativo quando lhe for apresentado um Captcha Google:">
+<!ENTITY torbutton.prefs.update_torbutton_via_tor "Redirecionar as atualizações do Torbutton através do Tor">
+<!ENTITY torbutton.prefs.dodge_google_captcha "Utilizar automaticamente um mecanismo de procura alternativo quando lhe for apresentado um Captcha Google:">
<!ENTITY torbutton.prefs.engine1 "ixquick.com">
<!ENTITY torbutton.prefs.engine2 "Bing.com">
<!ENTITY torbutton.prefs.engine3 "Yahoo.com">
<!ENTITY torbutton.prefs.engine4 "startpage.com">
<!ENTITY torbutton.prefs.engine5 "duckduckgo.com">
-<!ENTITY torbutton.prefs.transparentTor "Torificação transparente (Necessita transpoxy customizado ou router Tor)">
+<!ENTITY torbutton.prefs.transparentTor "Torrificação Transparente (requer transpoxy personalizado ou encaminhamento do Tor)">
<!ENTITY torbutton.prefs.priv_caption "Configurações de Privacidade">
-<!ENTITY torbutton.prefs.block_disk "Don't record browsing history or website data (enables Private Browsing Mode)">
-<!ENTITY torbutton.prefs.restrict_thirdparty "Restrict third party cookies and other tracking data">
-<!ENTITY torbutton.prefs.block_plugins "Desabilitar plugins (como o Flash)">
-<!ENTITY torbutton.prefs.resist_fingerprinting "Change details that distinguish you from other Tor Browser users">
+<!ENTITY torbutton.prefs.block_disk "Não gravar o histórico de navegação ou os dados do site da Web (ativa o Modo de Navegação Privado)">
+<!ENTITY torbutton.prefs.restrict_thirdparty "Restringir os cookies de terceiros e outros dados de rastreamento">
+<!ENTITY torbutton.prefs.block_plugins "Desativar extensões de navegador (tal como Flash)">
+<!ENTITY torbutton.prefs.resist_fingerprinting "Alterar os detalhes que o diferencia dos outros utilizadores do Navegador Tor">
<!ENTITY torbutton.prefs.sec_caption "Nível de Segurança">
-<!ENTITY torbutton.prefs.sec_low "Baixo (pré-definido)">
+<!ENTITY torbutton.prefs.sec_low "Baixo (predefinição)">
<!ENTITY torbutton.prefs.sec_low_usable_desc "Isto proporciona a melhor experiência usável.">
<!ENTITY torbutton.prefs.sec_low_desc "Neste nível de segurança, as funções do navegador estão ativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_svg_tooltip "O mecanismo de renderização do tipo de letra OpenType SVG está desativado.">
@@ -168,19 +168,19 @@
<!ENTITY torbutton.prefs.sec_mathml_desc "Alguns mecanismos de visualização de equações matemáticas estão desativados.">
<!ENTITY torbutton.prefs.sec_mathml_desc_tooltip "MathML está desativado.">
<!ENTITY torbutton.prefs.sec_med_high "Médio-Alto">
-<!ENTITY torbutton.prefs.sec_all_jit_desc "Todas as otimizações de desempenho JavaScript estão desativadas.">
+<!ENTITY torbutton.prefs.sec_all_jit_desc "Todas as otimizações de desempenho da JavaScript estão desativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_desc "Algumas funções de renderização do tipo de letra estão desativadas.">
<!ENTITY torbutton.prefs.sec_font_rend_graphite_tooltip "O mecanismo de renderização do tipo de letra Graphite está desativado.">
<!ENTITY torbutton.prefs.sec_svg_desc "Alguns tipos de imagens estão desativados.">
<!ENTITY torbutton.prefs.sec_svg_desc_tooltip "As imagens SVG estão desativadas.">
-<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript está desativado por predefinição em todos os sites não HTTPS.">
-<!ENTITY torbutton.prefs.sec_js_desc_tooltip "O JavaScript pode ser ativado numa base de per-sítio através do botão da barra de ferramentas NoScript.">
+<!ENTITY torbutton.prefs.sec_js_https_desc "JavaScript está desativada por predefinição em todos os sites não HTTPS.">
+<!ENTITY torbutton.prefs.sec_js_desc_tooltip "JavaScript pode ser ativada numa base de por cada site através do botão da barra de ferramentas NoScript.">
<!ENTITY torbutton.prefs.sec_high "Alto">
-<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript está desativado por predefinição em todos os sites.">
+<!ENTITY torbutton.prefs.sec_all_js_desc "JavaScript está desativada por predefinição em todos os sites.">
<!ENTITY torbutton.prefs.sec_audio_video_desc "A maioria dos formatos de áudio e vídeo estão desativados.">
<!ENTITY torbutton.prefs.sec_audio_video_desc_tooltip "WebM é o único codec que se mantém ativado.">
<!ENTITY torbutton.prefs.sec_webfonts_desc "Alguns tipos de letra e ícones poderão ser visualizados incorretamente.">
-<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Os ficheiros dos tipos de letra fornecidos pelo sítio da Web estão bloqueados.">
-<!ENTITY torbutton.prefs.sec_custom "Valores definidos">
+<!ENTITY torbutton.prefs.sec_webfonts_desc_tooltip "Os ficheiros dos tipos de letra fornecidos pelo site da Web estão bloqueados.">
+<!ENTITY torbutton.prefs.sec_custom "Valores Personalizados">
<!ENTITY torbutton.circuit_display.title "Circuito Tor para este site">
diff --git a/src/chrome/locale/pt/torbutton.properties b/src/chrome/locale/pt/torbutton.properties
index 2ec7378..3f5026a 100644
--- a/src/chrome/locale/pt/torbutton.properties
+++ b/src/chrome/locale/pt/torbutton.properties
@@ -2,52 +2,52 @@ torbutton.button.tooltip.disabled = Ativar Tor
torbutton.button.tooltip.enabled = Desativar Tor
torbutton.circuit_display.internet = Internet
torbutton.circuit_display.ip_unknown = IP desconhecido
-torbutton.circuit_display.onion_site = Sítio do Onion
+torbutton.circuit_display.onion_site = Site do Onion
torbutton.circuit_display.this_browser = Este navegador
torbutton.circuit_display.relay = retransmitir
torbutton.circuit_display.tor_bridge = Ponte
torbutton.circuit_display.unknown_country = País desconhecido
-torbutton.content_sizer.margin_tooltip = O Navegador Tor adiciona esta margem para realçar a altura e a largura da sua janela, e com isso reduz a possibilidade de as pessoas on-line o possam rastrear.
+torbutton.content_sizer.margin_tooltip = O Navegador Tor adiciona esta margem para realçar a altura e a largura da sua janela, e com isso reduz a possibilidade de as pessoas o rastrearem on-line.
torbutton.panel.tooltip.disabled = Clique para ativar o Tor
torbutton.panel.tooltip.enabled = Clique para desativar o Tor
-torbutton.panel.plugins.disabled = Clique para ativar os plugins
-torbutton.panel.plugins.enabled = Clique para desativar os plugins
-torbutton.panel.label.disabled = Tor desativado
-torbutton.panel.label.enabled = Tor ativado
+torbutton.panel.plugins.disabled = Clique para ativar as extensões
+torbutton.panel.plugins.enabled = Clique para desativar as extensões
+torbutton.panel.label.disabled = Tor Desativado
+torbutton.panel.label.enabled = Tor Ativado
extensions.torbutton(a)torproject.org.description = o Torbutton proporciona um botão para configurar as configurações do Tor e para limpar facilmente e rapidamente os dados de navegação privados.
torbutton.popup.history.warning = O Torbutton bloqueou a atividade de um separador carregado num diferente estado do Tor.\n\nIsto é para contornar os erros do Firefox 409737 e 417869.\n\nSe esta janela aparecer sem qualquer motivo aparente, um dos seus separadores está a tentar recarregar-se em segundo plano, e este foi bloqueado.\n\nPara recarregar o separador neste estado do Tor, pressione 'enter' na caixa de localização do URL.\n\n
torbutton.popup.plugin.warning = Torbutton bloqueou o carregamento direto do Tor do conteúdo do plugin.\n\nEm vez disso, utilize o Guardar Como.\n\n
-torbutton.popup.confirm_ca_certs = Torbutton: Você não possui nenhum Certificado de Autenticação. Verificar a lista de Certificados de Autenticação pode ser uma operação lenta para o Tor. Gostaria de desactivar o modo de isolamento de Certificados de Autenticação? (Se você não percebeu esta mensagem, o mais seguro é pressionar OK)
+torbutton.popup.confirm_ca_certs = Nota de Torbutton: parece que não possui nenhum Certificado de Autenticação. Verificar a lista de Certificado de Autenticação é uma operação lenta e abranda o alternar do Tor. Gostaria de desativar o modo de isolamento do Certificado de Autenticação? (Se não compreendeu esta mensagem, o mais seguro é clicarem "CONFIRMAR")
torbutton.popup.ff3.warning = Aviso!\n\nO Torbutton no Firefox 3 é conhecido por dar a conhecer o seu fuso horário e os seus Live Marks, através da rede Tor.\n\nTem a certeza que deseja continuar?
-torbutton.popup.toggle.warning = Precisa de alternar o Tor ou reiniciar para aplicar as suas definições.
-torbutton.popup.test.success = Teste do proxy do Tor concluído com sucesso
-torbutton.popup.test.failure = O teste ao proxy Tor FALHOU! Verifique as propriedades do proxy e do Polipo.
+torbutton.popup.toggle.warning = Precisa de alternar o Tor ou reiniciar para aplicar as suas configurações.
+torbutton.popup.test.success = Teste do proxy bem sucedido!
+torbutton.popup.test.failure = Teste do proxy Tor - FALHOU! Verifique as configurações do proxy e Polipo.
torbutton.popup.test.confirm_toggle = O mais recente teste de utilização de Tor falhou.\n\nTem a certeza que deseja continuar mesmo assim?\n\nNota: Se já resolveu o problema, é recomendado voltar a testar a ligação nas Preferências do Torbutton para remover este aviso.
-torbutton.popup.test.ff3_notice = Pressione OK para testar as configurações do proxy Tor. Este teste é realizado em plano de fundo. Por favor seja paciente.
+torbutton.popup.test.ff3_notice = Clique em "CONFIRMAR" para testar as configurações do proxy Tor. Este teste será realizado em segundo plano. Por favor, seja paciente.
torbutton.panel.label.verified = Tor Verificado
torbutton.popup.test.auto_failed = O teste automático ao proxy Tor falhou.\n\nDeseja activar mesmo assim?
torbutton.prefs.recommended = (recomendado)
torbutton.prefs.optional = (opcional)
torbutton.prefs.crucial = (crucial)
torbutton.popup.external.title = Transferir um tipo de ficheiro externo?
-torbutton.popup.external.app = O navegador Tor Browser não consegue mostrar este ficheiro. Pode ter que o abrir com outra aplicação.\n\n
-torbutton.popup.external.note = Alguns tipos de ficheiro podem implicar uma ligação à Internet sem usar o Tor.
-torbutton.popup.external.suggest = Para sua segurança, deve apenas abrir ficheiros transferidos quando estiver offline, or usar um CD Tor Live como o Tails.
+torbutton.popup.external.app = O navegador Tor não consegue exibir este ficheiro. Poderá ter que o abrir com outra aplicação.\n\n
+torbutton.popup.external.note = Alguns tipos dos ficheiros podem fazer com que as aplicações liguem à Internet sem utilizar o Tor.\n
+torbutton.popup.external.suggest = Para sua segurança, só deverá abrir os ficheiros transferidos enquanto estiver off-line, ou utilizar um CD Live do Tor, como o Tails.\n
torbutton.popup.launch = Transferir ficheiro
torbutton.popup.cancel = Cancelar
torbutton.popup.dontask = A partir de agora, transferir automaticamente os ficheiros
torbutton.popup.test.no_http_proxy = Teste do proxy do Tor: Proxy HTTP local inacessível. O Polipo está devidamente em execução?
torbutton.popup.captcha.title = Evitar Captchas do Google?
-torbutton.popup.captcha.ask = O Torbutton detectou uma Captcha do Google. Pretende ser redireccionado para um novo motor de busca usando esta consulta?
+torbutton.popup.captcha.ask = O Torbutton detetou uma Captcha do Google. Deseja ser redirecionado para um novo mecanismo de procura, utilizando esta consulta?
torbutton.popup.captcha.always = A partir de agora, efetuar sempre esta ação
torbutton.popup.redirect = Redirecionar
torbutton.popup.no_redirect = Não Redirecionar
torbutton.popup.prompted_language = Para lhe fornecer maior privacidade, o Torbutton pode requerer o uso da versão em inglês em páginas da Internet. Isto pode causar a visualização em inglês das páginas que prefere ler em português.\n\nPretende visualizar páginas em inglês, para melhor privacidade?
torbutton.popup.no_newnym = O Torbutton não pode, em segurança, fornecer-lhe uma nova identidade. Não tem acesso à porta de controle Tor.\n\nEstá a usar o Tor Browser Bundle?
torbutton.popup.use_tbb = Parece estar a usar Torbutton com Firefox, o que já não é recomendado como uma configuração segura.\n\nEm alternativa, sugerimos que obtenha o último Tor Browser Bundle através de envio de e-mail para: gettor(a)torproject.org ou carregando para o computador o ficheiro na seguinte URL:
-torbutton.popup.pref_error = O Torbutton não consegue actualizar as preferências na directoria do perfil do Explorador do Tor.
-torbutton.popup.permission_denied = Por favor restabeleça as permissões da directoria do Explorador do Tor ou copie para uma nova localização.
-torbutton.popup.device_full = O disco parece estar cheio. Por favor liberte espaço ou relocalize o Explorador do Tor para um novo dispositivo.
+torbutton.popup.pref_error = O Torbutton não consegue atualizar as preferências na diretoria do perfil do Navegador Tor.
+torbutton.popup.permission_denied = Por favor, reinicie as permissões da diretoria do Navegador Tor ou copie-a para uma nova localização.
+torbutton.popup.device_full = O disco parece estar cheio. Por favor, liberte espaço ou mova o Navegador Tor para um novo dispositivo.
torbutton.title.prompt_torbrowser = Informação Importante do Torbutton
torbutton.popup.prompt_torbrowser = O Torbutton funciona agora de forma diferente: já não pode desligá-lo.\n\nProcedemos a esta alteração porque não é seguro usar o Torbutton num explorador também usado para buscas fora do Tor. Havia demasiados erros que não conseguimos corrigir de outra forma.\n\nSe pretende continuar a usar o Firefox normalmente, deve desinstalar o Torbutton e carregar o Tor Browser Bundle para o seu computador. As políticas de privacidade do Explorador do Tor também são superiores às normais no Firefox, mesmo quando este é usado com o Torbutton.\n\nPara remover o Torbutton abra Ferramentas->Acessórios->Extensões e clique no botão Remover junto ao Torbutton.
torbutton.popup.short_torbrowser = Informação importante do Torbutton!\nO Torbutton não está sempre activo.\nClique no Torbutton para mais informação.
@@ -57,22 +57,22 @@ torbutton.popup.never_ask_again = Não voltar a perguntar-me
torbutton.popup.confirm_newnym = O Navegador Tor irá fechar todas as janela e separadores. Estarão perdidas todas sessões do sítio da Web.\n\nReiniciar o Navegador Tor para repor a sua identidade?\n\n
torbutton.slider_notification = Agora, o menu da cebola verde tem um cursor de segurança que o deixa ajustar o seu nível de segurança. Verifique-o!
-torbutton.slider_notification_button = Abra as definições de segurança
+torbutton.slider_notification_button = Abra as configurações de segurança
torbutton.maximize_warning = Ao maximizar o Navegador Tor pode permitir que os sites da Web determinem o tamanho do seu monitor, o que poderá ser utilizado para o rastrear. Nós recomendamos que deixe as janelas do Navegador no seu tamanho original predefinido.
# Canvas permission prompt. Strings are kept here for ease of translation.
canvas.siteprompt=Este site (%S) tentou extrair informação HTML5, que pode ser usada para identificar claramente o seu computador.\n\nQuer que o navegador Tor permita que o site extraia a informação HTML5?
-canvas.notNow=Agora não
+canvas.notNow=Agora Não
canvas.notNowAccessKey=N
canvas.allow=Permitir de futuro
canvas.allowAccessKey=A
-canvas.never=Nunca para este sítio (recomendado)
+canvas.never=Nunca para este site (recomendado)
canvas.neverAccessKey=e
# Profile/startup error messages. Strings are kept here for ease of translation.
# LOCALIZATION NOTE: %S is the application name.
profileProblemTitle=%S - Problema de Perfil
-profileReadOnly=Não pode executar %S a partir de um ficheiro do sistema só-de-leitura. Por favor, copie %S para outra localização antes de tentar utilizá-lo.
+profileReadOnly=Não pode executar %S a partir de um sistema de ficheiros só-de-leitura. Por favor, copie %S para outra localização antes de tentar utilizá-lo.
profileReadOnlyMac=Não pode executar %S a partir de um ficheiro do sistema só-de-leitura. Por favor, copie %S para o seu Ambiente de Trabalho antes de tentar utilizá-lo.
profileAccessDenied=%S não tem permissão para aceder ao perfil. Por favor, ajuste as suas permissões de ficheiro do sistema e tente de novo.
diff --git a/src/chrome/locale/ru/aboutTBUpdate.dtd b/src/chrome/locale/ru/aboutTBUpdate.dtd
new file mode 100644
index 0000000..da0a7c3
--- /dev/null
+++ b/src/chrome/locale/ru/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Обновление браузера Tor">
+<!ENTITY aboutTBUpdate.updated "Браузер Tor был обновлен.">
+<!ENTITY aboutTBUpdate.linkPrefix "Для наиболее актуальной информации об этом выпуске,">
+<!ENTITY aboutTBUpdate.linkLabel "посетите наш вебсайт">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Список изменений:">
diff --git a/src/chrome/locale/ru/aboutTor.dtd b/src/chrome/locale/ru/aboutTor.dtd
index 8b1c0bb..bb5a49b 100644
--- a/src/chrome/locale/ru/aboutTor.dtd
+++ b/src/chrome/locale/ru/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "О проекте Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "ТЕМ НЕ МЕНЕЕ, данный браузер устарел.">
+<!ENTITY aboutTor.outOfDateTorOn.label "ВНИМАНИЕ: этот обозреватель устарел.">
<!ENTITY aboutTor.outOfDateTorOff.label "КРОМЕ ТОГО, данный браузер устарел.">
<!ENTITY aboutTor.outOfDate2.label "Нажмите на "луковицу"и затем выберите "Проверить обновления браузера Tor"">
<!ENTITY aboutTor.check.label "Проверить настройки сети Tor">
-<!ENTITY aboutTor.success.label "Поздравляем!">
-<!ENTITY aboutTor.success2.label "Данный браузер настроен для использования Tor.">
+<!ENTITY aboutTor.success.label "Добро пожаловать в обозреватель Tor">
+<!ENTITY aboutTor.success2.label "Соединены с сетью Tor">
<!ENTITY aboutTor.success3.label "Теперь Вы можете просматривать интернет-сайты в анонимном режиме.">
<!ENTITY aboutTor.failure.label "Что-то пошло не так!">
<!ENTITY aboutTor.failure2.label "Tor не работает в этом браузере.">
@@ -48,3 +48,6 @@
<!ENTITY aboutTor.learnMore.label "Узнайте больше о проекте Tor »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html#ru
">
+
+<!ENTITY aboutTor.donate.donate "Пожертвовать">
+<!ENTITY aboutTor.donate.supportTor "Пожалуйста, поддержите Tor!">
diff --git a/src/chrome/locale/ru/aboutTor.properties b/src/chrome/locale/ru/aboutTor.properties
index 6795b7c..e294d61 100644
--- a/src/chrome/locale/ru/aboutTor.properties
+++ b/src/chrome/locale/ru/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Ищите <a href="%1$S">конфиденциальн
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Лора Пойтрас
+aboutTor.donationBanner.lp.quote=Эдвард Сноуден не был бы в состоянии связаться со мной без Tor и других проектов свободного программного обеспечения для шифрования. Тор является важным инструментом, и он нуждается в нашей поддержке.
+aboutTor.donationBanner.lp.speciality=обладатель "Оскара" за лучший документальный фильм <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Кори Доктороу
+aboutTor.donationBanner.cd.quote=Конфиденциальность и анонимность важна для всех нас.
+aboutTor.donationBanner.cd.speciality= Писатель, активист в области технологий, соредактор ресурса "Boing Boing"
+
+aboutTor.donationBanner.rd.who=— Роджер Динглдайн
+aboutTor.donationBanner.rd.quote=Пожалуйста, помогите сильнейшему инструменту конфиденциальности в мире стать более стабильным!
+aboutTor.donationBanner.rd.speciality=Основатель, исполнительный директор Tor Project
diff --git a/src/chrome/locale/sv/aboutTBUpdate.dtd b/src/chrome/locale/sv/aboutTBUpdate.dtd
new file mode 100644
index 0000000..c502721
--- /dev/null
+++ b/src/chrome/locale/sv/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser-uppdatering">
+<!ENTITY aboutTBUpdate.updated "Tor Browser har uppdaterats.">
+<!ENTITY aboutTBUpdate.linkPrefix "För den senaste information om den här versionen,">
+<!ENTITY aboutTBUpdate.linkLabel "besök vår hemsida">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Ändringslogg:">
diff --git a/src/chrome/locale/sv/aboutTor.dtd b/src/chrome/locale/sv/aboutTor.dtd
index 6e261f3..75c4ed1 100644
--- a/src/chrome/locale/sv/aboutTor.dtd
+++ b/src/chrome/locale/sv/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Om Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "EMELLERTID, denna webbläsare är ej uppdaterad.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "DESSUTOM, denna webbläsare är ej uppdaterad.">
<!ENTITY aboutTor.outOfDate2.label "Klicka på Tor-löken och välj sedan 'Sök efter uppdateringar för Tor webbläsare'.">
<!ENTITY aboutTor.check.label "Testa nätverksinställningarna för Tor">
-<!ENTITY aboutTor.success.label "Gratulerar!">
-<!ENTITY aboutTor.success2.label "Denna webbläsare är konfigurerad att använda Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Du kan nu surfa på nätet anonymt.">
<!ENTITY aboutTor.failure.label "Någonting gick fel!">
<!ENTITY aboutTor.failure2.label "Tor fungerar inte i den här webbläsaren.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Tor projektet är en US 501(c)(3) non-profit organisation som utför forskning, utveckling, och utbildning inom online anonymitet och integritet.">
<!ENTITY aboutTor.learnMore.label "Mer information om Tor-projektet »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Donera">
+<!ENTITY aboutTor.donate.supportTor "Vänligen stöd Tor!">
diff --git a/src/chrome/locale/sv/aboutTor.properties b/src/chrome/locale/sv/aboutTor.properties
index fafe44a..c74928f 100644
--- a/src/chrome/locale/sv/aboutTor.properties
+++ b/src/chrome/locale/sv/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Sök <a href="%1$S">säkert</a> med <a href="%2$S">Dis
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden skulle inte ha kunnat kontakta mig utan Tor och andra öppna projekt för kryptering. Tor är ett väsentligt verktyg, och det behöver vårt stöd.
+aboutTor.donationBanner.lp.speciality=Oscar-vinnande dokumentärfilmare, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Integritet och anonymitet är viktigt för oss alla.
+aboutTor.donationBanner.cd.speciality= Romanförfattare, teknikaktivist och medredaktör för Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Vänligen hjälp det starkaste integritetsverktyget i världen att bli mer hållbart!
+aboutTor.donationBanner.rd.speciality=Grundare, tillförordnad verkställande direktör för Tor-projektet
diff --git a/src/chrome/locale/tr/aboutDialog.dtd b/src/chrome/locale/tr/aboutDialog.dtd
index 0e9100d..2e3c714 100644
--- a/src/chrome/locale/tr/aboutDialog.dtd
+++ b/src/chrome/locale/tr/aboutDialog.dtd
@@ -8,7 +8,7 @@
<!ENTITY help.donateLink "Bağışta bulunun">
<!ENTITY help.or " ya da ">
<!-- LOCALIZATION NOTE (help.getInvolvedLink): This is a link title that links to https://www.torproject.org/getinvolved/volunteer.html.en -->
-<!ENTITY help.getInvolvedLink "çalışmalarımızda yer alın">
+<!ENTITY help.getInvolvedLink "çalışmalarımıza katılın">
<!ENTITY help.end "!">
<!-- LOCALIZATION NOTE (bottom.questions): This is a link title that links to https://www.torproject.org/docs/trademark-faq.html.en -->
<!ENTITY bottomLinks.questions "Sorularınız mı var?">
diff --git a/src/chrome/locale/tr/aboutTBUpdate.dtd b/src/chrome/locale/tr/aboutTBUpdate.dtd
new file mode 100644
index 0000000..e92e395
--- /dev/null
+++ b/src/chrome/locale/tr/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Güncellemesi">
+<!ENTITY aboutTBUpdate.updated "Tor Browser güncellendi.">
+<!ENTITY aboutTBUpdate.linkPrefix "Bu sürüm hakkındaki en güncel bilgiler için.">
+<!ENTITY aboutTBUpdate.linkLabel "web sitemize bakın">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Sürüm notları:">
diff --git a/src/chrome/locale/tr/aboutTor.dtd b/src/chrome/locale/tr/aboutTor.dtd
index f6de534..98e110e 100644
--- a/src/chrome/locale/tr/aboutTor.dtd
+++ b/src/chrome/locale/tr/aboutTor.dtd
@@ -6,18 +6,18 @@
<!ENTITY aboutTor.title "Tor Hakkında">
-<!ENTITY aboutTor.outOfDateTorOn.label "ANCAK, bu tarayıcı güncel değil.">
+<!ENTITY aboutTor.outOfDateTorOn.label "UYARI: bu tarayıcı güncel değil.">
<!ENTITY aboutTor.outOfDateTorOff.label "AYRICA, bu tarayıcı güncel değil.">
<!ENTITY aboutTor.outOfDate2.label "Soğan simgesine tıklayın ve ardından Tor Browser Güncellemesini denetleyin.">
<!ENTITY aboutTor.check.label "Tor Ağ Ayarlarını Sınayın">
-<!ENTITY aboutTor.success.label "Tebrikler!">
-<!ENTITY aboutTor.success2.label "Bu tarayıcı Tor kullanımı için yapılandırıldı.">
+<!ENTITY aboutTor.success.label "Tor Browser'a Hoş Geldiniz">
+<!ENTITY aboutTor.success2.label "Tor ağına bağlanın.">
<!ENTITY aboutTor.success3.label "Artık Internet'te özgürce ve anonim olarak dolaşabilirsiniz.">
<!ENTITY aboutTor.failure.label "Birşeyler Ters Gitti!">
-<!ENTITY aboutTor.failure2.label "Tor bu tarayıcıda çalışmıyor.">
-<!ENTITY aboutTor.failure3prefix.label "Yardım için lütfen iletişime geçin ">
+<!ENTITY aboutTor.failure2.label "Tor bu tarayıcı ile çalışmıyor.">
+<!ENTITY aboutTor.failure3prefix.label "Yardım almak için bizimle görüşün">
<!ENTITY aboutTor.failure3Link "help(a)rt.torproject.org">
<!ENTITY aboutTor.failure3suffix.label ".">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Tor Projesi, ABD 501(c)(3) kapsamında çevrim içi gizlilik ve mahremiyet üzerine araştırma, geliştirme ve eğitim çalışmaları yapan ve kar amacı gütmeyen bir kuruluştur.">
<!ENTITY aboutTor.learnMore.label "Tor Projesi hakkında daha çok şey öğrenin »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Bağış Yapın">
+<!ENTITY aboutTor.donate.supportTor "Lütfen Tor Projesini Destekleyin!">
diff --git a/src/chrome/locale/tr/aboutTor.properties b/src/chrome/locale/tr/aboutTor.properties
index 18cf582..c034690 100644
--- a/src/chrome/locale/tr/aboutTor.properties
+++ b/src/chrome/locale/tr/aboutTor.properties
@@ -16,6 +16,18 @@ aboutTor.searchDDG.search.link=https://duckduckgo.com/
aboutTor.searchDC.privacy=<a href="%2$S">Disconnect.me</a> kullanarak <a href="%1$S">güvenli</a> arama yapın.
# The following string is a link which replaces %1$S above.
-aboutTor.searchDC.privacy.link=
+aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Tor ve diğer özgür yazılım şifreleme projeleri olmadan Edward Snowden benimle görüşemezdi. Tor olmazsa olmaz bir araç ve desteklenmesi gerekiyor.
+aboutTor.donationBanner.lp.speciality=Oscar ödüllü <i>citizenFour</i> belgeselinin yönetmeni
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Kişisel gizlilik ve anonim kalmak hepimiz için önemli.
+aboutTor.donationBanner.cd.speciality= Yazar, teknoloji aktivisti ve Boing Boing editörü
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Dünyadaki en güçlü kişisel gizlilik koruma yazılımının kalıcı olmasına yardımcı olun!
+aboutTor.donationBanner.rd.speciality=Tor Projesinin Kurucusu ve Yürütücü Başkanı
diff --git a/src/chrome/locale/tr/torbutton.dtd b/src/chrome/locale/tr/torbutton.dtd
index ae45b7b..273da1b 100644
--- a/src/chrome/locale/tr/torbutton.dtd
+++ b/src/chrome/locale/tr/torbutton.dtd
@@ -1,8 +1,8 @@
<!ENTITY torbutton.prefs.title "Torbutton Ayarları">
<!ENTITY torbutton.prefs.tor_settings "Vekil Sunucu Ayarları">
-<!ENTITY torbutton.prefs.recommended_settings "Firefox sürümüm için önerilen vekil sunucu ayarlarını kullan">
-<!ENTITY torbutton.prefs.use_privoxy "Privoxy Kullan">
-<!ENTITY torbutton.prefs.use_polipo "Polipo kullan">
+<!ENTITY torbutton.prefs.recommended_settings "Firefox sürümüm için önerilen vekil sunucu ayarları kullanılsın">
+<!ENTITY torbutton.prefs.use_privoxy "Privoxy Kullanılsın">
+<!ENTITY torbutton.prefs.use_polipo "Polipo Kullanılsın">
<!ENTITY torbutton.prefs.custom_settings "Özel vekil sunucu ayarları kullanılsın">
<!ENTITY torbutton.prefs.proxy.host.http "HTTP Vekil Sunucusu:">
<!ENTITY torbutton.prefs.proxy.host.https "SSL Vekil Sunucusu:">
@@ -38,7 +38,7 @@
<!ENTITY torbutton.context_menu.downloadUpdate.key "U">
<!ENTITY torbutton.context_menu.cookieProtections "Çerez Koruması...">
<!ENTITY torbutton.context_menu.cookieProtections.key "C">
-<!ENTITY torbutton.context_menu.copyTor "Tor İnternet Adresini Kopyala">
+<!ENTITY torbutton.context_menu.copyTor "Tor İnternet adresini kopyala">
<!ENTITY torbutton.context_menu.copyTor.key "p">
<!ENTITY torbutton.context_menu.openTorTab "Tor İnternet adresini yeni sekmede aç">
<!ENTITY torbutton.context_menu.openTorTab.key "r">
diff --git a/src/chrome/locale/vi/aboutTBUpdate.dtd b/src/chrome/locale/vi/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/vi/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/src/chrome/locale/vi/aboutTor.dtd b/src/chrome/locale/vi/aboutTor.dtd
index 2321976..e3d1629 100644
--- a/src/chrome/locale/vi/aboutTor.dtd
+++ b/src/chrome/locale/vi/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "Thông tin về Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "Tuy nhiên, trình duyệt này đã lỗi thời.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "Ngoài ra, trình duyệt này đã lỗi thời.">
<!ENTITY aboutTor.outOfDate2.label "Click on the onion and then choose Check for Tor Browser Update.">
<!ENTITY aboutTor.check.label "Test Tor Network Settings">
-<!ENTITY aboutTor.success.label "Chúc mừng">
-<!ENTITY aboutTor.success2.label "Trình duyệt này được cấu hình để dùng Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "Bây giờ bạn sẽ tự do lướt web ẩn danh.">
<!ENTITY aboutTor.failure.label "Có sai sót gì đó!">
<!ENTITY aboutTor.failure2.label "Tor không hoạt động trên trình duyệt này.">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "Dự án Tor là một US 501(c)(3) không lợi nhuận chuyên dùng cho nghiên cứu, phát triển và giao dục về vô danh và riêng tư trực tuyến">
<!ENTITY aboutTor.learnMore.label "Tìm hiểu thêm về Tor Project">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Donate">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/vi/aboutTor.properties b/src/chrome/locale/vi/aboutTor.properties
index d607324..10f09a1 100644
--- a/src/chrome/locale/vi/aboutTor.properties
+++ b/src/chrome/locale/vi/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/locale/zh-CN/aboutTBUpdate.dtd b/src/chrome/locale/zh-CN/aboutTBUpdate.dtd
new file mode 100644
index 0000000..d5caea9
--- /dev/null
+++ b/src/chrome/locale/zh-CN/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser 更新">
+<!ENTITY aboutTBUpdate.updated "Tor Browser 已更新。">
+<!ENTITY aboutTBUpdate.linkPrefix "有关此版本的最新信息,">
+<!ENTITY aboutTBUpdate.linkLabel "请访问我们的网站">
+<!ENTITY aboutTBUpdate.linkSuffix "。">
+<!ENTITY aboutTBUpdate.changeLogHeading "变更日志:">
diff --git a/src/chrome/locale/zh-CN/aboutTor.dtd b/src/chrome/locale/zh-CN/aboutTor.dtd
index cbb7ea7..fa3d5f3 100644
--- a/src/chrome/locale/zh-CN/aboutTor.dtd
+++ b/src/chrome/locale/zh-CN/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "关于 Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "但是该浏览器并非最新版本。">
+<!ENTITY aboutTor.outOfDateTorOn.label "警告:此浏览器版本较旧。">
<!ENTITY aboutTor.outOfDateTorOff.label "另外,该浏览器并非最新版本。">
<!ENTITY aboutTor.outOfDate2.label "点击洋葱图标,然后选择“Tor Browser 检查更新”。">
<!ENTITY aboutTor.check.label "测试 Tor 网络设置">
-<!ENTITY aboutTor.success.label "恭喜!">
-<!ENTITY aboutTor.success2.label "该浏览器已配置为使用 Tor 网络。">
+<!ENTITY aboutTor.success.label "欢迎使用 Tor Browser">
+<!ENTITY aboutTor.success2.label "已连接到 Tor 网络。">
<!ENTITY aboutTor.success3.label "现在即可自由地匿名访问互联网。">
<!ENTITY aboutTor.failure.label "出错了!">
<!ENTITY aboutTor.failure2.label "Tor 无法在该浏览器下运行。">
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "The Tor Project 是一家美国 501(c)(3) 非营利组织,致力于在线匿名与隐私的研究、开发与教育。">
<!ENTITY aboutTor.learnMore.label "了解更多有关 The Tor Project 的信息 »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "捐款">
+<!ENTITY aboutTor.donate.supportTor "请支持 Tor!">
diff --git a/src/chrome/locale/zh-CN/aboutTor.properties b/src/chrome/locale/zh-CN/aboutTor.properties
index e974862..62b5528 100644
--- a/src/chrome/locale/zh-CN/aboutTor.properties
+++ b/src/chrome/locale/zh-CN/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=使用<a href="%2$S">Disconnect.me</a><a href="%1$S">
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— 罗拉·柏翠丝(Laura Poitras)
+aboutTor.donationBanner.lp.quote=如果没有 Tor 和其他自由的加密软件,爱德华·斯诺登不可能与我联系。Tor 是必不可少的工具;Tor 需要我们的支持!
+aboutTor.donationBanner.lp.speciality=奥斯卡获奖纪录片《第四公民》制作人
+
+aboutTor.donationBanner.cd.who=— 科利·多克托罗(Cory Doctorow)
+aboutTor.donationBanner.cd.quote=隐私和匿名事关我们每一个人。
+aboutTor.donationBanner.cd.speciality= 小说家,技术活动家,Boing Boing 共同主编
+
+aboutTor.donationBanner.rd.who=— 罗杰·丁格尔丹(Roger Dingledine)
+aboutTor.donationBanner.rd.quote=请帮助世界上最强的隐私工具变得更加可持续发展!
+aboutTor.donationBanner.rd.speciality=Tor Project 创始人,临时执行董事
1
0

[tor-browser/tor-browser-38.4.0esr-5.5-1] fixup! Bug #13313: Pref 'font.system.whitelist' restricts set of permitted fonts
by gk@torproject.org 09 Dec '15
by gk@torproject.org 09 Dec '15
09 Dec '15
commit 03f70ef48bfbd9c9cf80177151a1dc7290409f4b
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Dec 5 23:19:02 2015 -0800
fixup! Bug #13313: Pref 'font.system.whitelist' restricts set of permitted fonts
---
gfx/thebes/gfxUserFontSet.cpp | 14 ++++++++------
1 file changed, 8 insertions(+), 6 deletions(-)
diff --git a/gfx/thebes/gfxUserFontSet.cpp b/gfx/thebes/gfxUserFontSet.cpp
index e313b17..e00894b 100644
--- a/gfx/thebes/gfxUserFontSet.cpp
+++ b/gfx/thebes/gfxUserFontSet.cpp
@@ -410,12 +410,14 @@ gfxUserFontEntry::LoadNextSrc()
// src local ==> lookup and load immediately
if (currSrc.mSourceType == gfxFontFaceSrc::eSourceType_Local) {
- gfxFontEntry* fe =
- gfxPlatform::GetPlatform()->LookupLocalFont(currSrc.mLocalName,
- mWeight,
- mStretch,
- mItalic);
- mFontSet->SetLocalRulesUsed();
+ gfxFontEntry* fe = nullptr;
+ if (gfxFontUtils::IsFontFamilyNameAllowed(currSrc.mLocalName)) {
+ fe = gfxPlatform::GetPlatform()->LookupLocalFont(currSrc.mLocalName,
+ mWeight,
+ mStretch,
+ mItalic);
+ mFontSet->SetLocalRulesUsed();
+ }
if (fe) {
LOG(("userfonts (%p) [src %d] loaded local: (%s) for (%s) gen: %8.8x\n",
mFontSet, mSrcIndex,
1
0

07 Dec '15
commit 548c10907863257c636e9393babe707fe79a4f40
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Thu Nov 12 16:09:43 2015 -0800
Bug 17568: Clean up tor-control-port.js
---
src/modules/tor-control-port.js | 113 ++++++++++++++-------------------------
1 file changed, 41 insertions(+), 72 deletions(-)
diff --git a/src/modules/tor-control-port.js b/src/modules/tor-control-port.js
index 2b41897..c5010de 100644
--- a/src/modules/tor-control-port.js
+++ b/src/modules/tor-control-port.js
@@ -209,7 +209,7 @@ io.callbackDispatcher = function () {
// __io.matchRepliesToCommands(asyncSend, dispatcher)__.
// Takes asyncSend(message), an asynchronous send function, and the callback
-// displatcher, and returns a function Promise<response> sendCommand(command).
+// dispatcher, and returns a function Promise<response> sendCommand(command).
io.matchRepliesToCommands = function (asyncSend, dispatcher) {
let commandQueue = [],
sendCommand = function (command, replyCallback, errorCallback) {
@@ -254,7 +254,7 @@ io.controlSocket = function (host, port, password, onError) {
io.onDataFromOnLine(
io.onLineFromOnMessage(mainDispatcher.pushMessage)),
onError),
- // Tor expects any commands to be terminated by CRLF.
+ // Controllers should send commands terminated by CRLF.
writeLine = function (text) { socket.write(text + "\r\n"); },
// Create a sendCommand method from writeLine.
sendCommand = io.matchRepliesToCommands(writeLine, mainDispatcher),
@@ -371,6 +371,10 @@ utils.listMapData = function (parameterString, listNames) {
return dataMap;
};
+// __utils.rejectPromise(errorMessage)__.
+// Returns a rejected promise with the given error message.
+utils.rejectPromise = errorMessage => Promise.reject(new Error(errorMessage));
+
// ## info
// A namespace for functions related to tor's GETINFO and GETCONF command.
let info = info || {};
@@ -387,7 +391,7 @@ let info = info || {};
// or single-line (with a `250-` or `250 ` prefix):
//
// 250-version=0.2.6.0-alpha-dev (git-b408125288ad6943)
-info.keyValueStringsFromMessage = utils.extractor(/^(250\+[\s\S]+?^\.|250[-\ ].+?)$/gmi);
+info.keyValueStringsFromMessage = utils.extractor(/^(250\+[\s\S]+?^\.|250[- ].+?)$/gmi);
// __info.applyPerLine(transformFunction)__.
// Returns a function that splits text into lines,
@@ -400,7 +404,7 @@ info.applyPerLine = function (transformFunction) {
// __info.routerStatusParser(valueString)__.
// Parses a router status entry as, described in
-// https://gitweb.torproject.org/torspec.git/blob/HEAD:/dir-spec.txt
+// https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt
// (search for "router status entry")
info.routerStatusParser = function (valueString) {
let lines = utils.splitLines(valueString),
@@ -418,7 +422,6 @@ info.routerStatusParser = function (valueString) {
"v" : data => ({ "version" : data }),
"w" : data => utils.listMapData(data, []),
"p" : data => ({ "portList" : data.split(",") }),
- "m" : data => utils.listMapData(data, [])
}[line.charAt(0)];
if (dataFun !== undefined) {
objects.push(dataFun(myData));
@@ -448,21 +451,6 @@ info.streamStatusParser = function (text) {
"CircuitID", "Target"]);
};
-// __info.configTextParser(text)__.
-// Parse the output of a `getinfo config-text`.
-info.configTextParser = function(text) {
- let result = {};
- utils.splitLines(text).map(function(line) {
- let [name, value] = utils.splitAtFirst(line, /\s/);
- if (name) {
- if (!result.hasOwnProperty(name)) result[name] = [];
- result[name].push(value);
- }
- });
- return result;
-};
-
-
// __info.bridgeParser(bridgeLine)__.
// Takes a single line from a `getconf bridge` result and returns
// a map containing the bridge's type, address, and ID.
@@ -488,16 +476,15 @@ info.bridgeParser = function(bridgeLine) {
// A map of GETINFO and GETCONF keys to parsing function, which convert
// result strings to JavaScript data.
info.parsers = {
- "version" : utils.identity,
- "config-file" : utils.identity,
- "config-defaults-file" : utils.identity,
- "config-text" : info.configTextParser,
"ns/id/" : info.routerStatusParser,
- "ns/name/" : info.routerStatusParser,
"ip-to-country/" : utils.identity,
"circuit-status" : info.applyPerLine(info.circuitStatusParser),
- "stream-status" : info.applyPerLine(info.streamStatusParser),
- "bridge" : info.bridgeParser
+ "bridge" : info.bridgeParser,
+ // Currently unused parsers:
+ // "ns/name/" : info.routerStatusParser,
+ // "stream-status" : info.applyPerLine(info.streamStatusParser),
+ // "version" : utils.identity,
+ // "config-file" : utils.identity,
};
// __info.getParser(key)__.
@@ -512,13 +499,14 @@ info.getParser = function(key) {
// Converts a key-value string as from GETINFO or GETCONF to a value.
info.stringToValue = function (string) {
// key should look something like `250+circuit-status=` or `250-circuit-status=...`
- // or `250 circuit-status...`
- let matchForKey = string.match(/^250[ +-](.+?)=/mi),
+ // or `250 circuit-status=...`
+ let matchForKey = string.match(/^250[ +-](.+?)=/),
key = matchForKey ? matchForKey[1] : null;
if (key === null) return null;
- // matchResult finds a single-line result for `250-` or a multi-line one for `250+`.
- let matchResult = string.match(/^250[ -].+?=(.*?)$/mi) ||
- string.match(/^250\+.+?=([\s\S]*?)^\.$/mi),
+ // matchResult finds a single-line result for `250-` or `250 `,
+ // or a multi-line one for `250+`.
+ let matchResult = string.match(/^250[ -].+?=(.*)$/) ||
+ string.match(/^250\+.+?=([\s\S]*?)^\.$/m),
// Retrieve the captured group (the text of the value in the key-value pair)
valueString = matchResult ? matchResult[1] : null,
// Get the parser function for the key found.
@@ -538,48 +526,27 @@ info.getMultipleResponseValues = function (message) {
.filter(utils.identity);
};
-// __info.getInfoMultiple(aControlSocket, keys)__.
-// Sends GETINFO for an array of keys. Returns a promise with an array of results.
-info.getInfoMultiple = function (aControlSocket, keys) {
- /*
- if (!(keys instanceof Array)) {
- throw new Error("keys argument should be an array");
- }
- if (!(onData instanceof Function)) {
- throw new Error("onData argument should be a function");
- }
- let parsers = keys.map(info.getParser);
- if (parsers.indexOf("unknown") !== -1) {
- throw new Error("unknown key");
- }
- if (parsers.indexOf("not supported") !== -1) {
- throw new Error("unsupported key");
- }
- */
- return aControlSocket.sendCommand("getinfo " + keys.join(" "))
- .then(info.getMultipleResponseValues);
-};
-
// __info.getInfo(controlSocket, key)__.
// Sends GETINFO for a single key. Returns a promise with the result.
info.getInfo = function (aControlSocket, key) {
- /*
if (!utils.isString(key)) {
- throw new Error("key argument should be a string");
- }
- if (!(onValue instanceof Function)) {
- throw new Error("onValue argument should be a function");
+ return utils.rejectPromise("key argument should be a string");
}
- */
- return info.getInfoMultiple(aControlSocket, [key]).then(data => data[0]);
+ return aControlSocket
+ .sendCommand("getinfo " + key)
+ .then(response => info.getMultipleResponseValues(response)[0]);
};
// __info.getConf(aControlSocket, key)__.
// Sends GETCONF for a single key. Returns a promise with the result.
info.getConf = function (aControlSocket, key) {
- // GETCONF with a single argument returns results that look like
- // results from GETINFO with multiple arguments.
- // So we can use the same kind of parsing for
+ // GETCONF with a single argument returns results with
+ // one or more lines that look like `250[- ]key=value`.
+ // Any GETCONF lines that contain a single keyword only are currently dropped.
+ // So we can use similar parsing to that for getInfo.
+ if (!utils.isString(key)) {
+ return utils.rejectPromise("key argument should be a string");
+ }
return aControlSocket.sendCommand("getconf " + key)
.then(info.getMultipleResponseValues);
};
@@ -594,22 +561,25 @@ let event = event || {};
// data.
event.parsers = {
"stream" : info.streamStatusParser,
- "circ" : info.circuitStatusParser
+ // Currently unused:
+ // "circ" : info.circuitStatusParser,
};
// __event.messageToData(type, message)__.
-// Extract the data from an event.
+// Extract the data from an event. Note, at present
+// we only extract streams that look like `"650" SP...`
event.messageToData = function (type, message) {
- let dataText = message.match(/^650 \S+?\s(.*?)$/mi)[1];
+ let dataText = message.match(/^650 \S+?\s(.*)/m)[1];
return dataText ? event.parsers[type.toLowerCase()](dataText) : null;
};
// __event.watchEvent(controlSocket, type, filter, onData)__.
// Watches for a particular type of event. If filter(data) returns true, the event's
// data is passed to the onData callback. Returns a zero arg function that
-// stops watching the event.
+// stops watching the event. Note: we only observe `"650" SP...` events
+// currently (no `650+...` or `650-...` events).
event.watchEvent = function (controlSocket, type, filter, onData) {
- return controlSocket.addNotificationCallback(new RegExp("^650." + type, "i"),
+ return controlSocket.addNotificationCallback(new RegExp("^650 " + type),
function (message) {
let data = event.messageToData(type, message);
if (filter === null || filter(data)) {
@@ -634,7 +604,6 @@ tor.controller = function (host, port, password, onError) {
let socket = io.controlSocket(host, port, password, onError),
isOpen = true;
return { getInfo : key => info.getInfo(socket, key),
- getInfoMultiple : keys => info.getInfoMultiple(socket, keys),
getConf : key => info.getConf(socket, key),
watchEvent : (type, filter, onData) =>
event.watchEvent(socket, type, filter, onData),
@@ -655,8 +624,8 @@ tor.controller = function (host, port, password, onError) {
// // Get the controller
// let c = controller("127.0.0.1", 9151, "MyPassw0rd",
// function (error) { console.log(error.message || error); });
-// // Send command and receive `250` reply or error message
-// c.getInfo("ip-to-country/16.16.16.16", console.log);
+// // Send command and receive `250` reply or error message in a promise:
+// let replyPromise = c.getInfo("ip-to-country/16.16.16.16");
// // Close the controller permanently
// c.close();
let controller = function (host, port, password, onError) {
1
0

[tor-browser/tor-browser-38.4.0esr-5.0-1] fixup! Bug #6253: Add canvas image extraction prompt.
by gk@torproject.org 07 Dec '15
by gk@torproject.org 07 Dec '15
07 Dec '15
commit 9a717351831505dff9b48b579353c043d8531fd6
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Fri Nov 6 16:41:29 2015 -0800
fixup! Bug #6253: Add canvas image extraction prompt.
Ensure that third parties are never able to extract canvas
image data, even if the same domain has been given
permission previously as a first party.
Also, refactor slightly to clarify logic of IsImageExtractionAllowed.
---
dom/canvas/CanvasUtils.cpp | 179 +++++++++++++++++++++++---------------------
1 file changed, 95 insertions(+), 84 deletions(-)
diff --git a/dom/canvas/CanvasUtils.cpp b/dom/canvas/CanvasUtils.cpp
index 9883a52..b3c83f6 100644
--- a/dom/canvas/CanvasUtils.cpp
+++ b/dom/canvas/CanvasUtils.cpp
@@ -46,99 +46,110 @@ namespace CanvasUtils {
// Check site-specific permission and display prompt if appropriate.
bool IsImageExtractionAllowed(nsIDocument *aDocument, JSContext *aCx)
{
- if (!aDocument || !aCx)
- return false;
+ // Don't proceed if we don't have a document or JavaScript context.
+ if (!aDocument || !aCx) {
+ return false;
+ }
- nsPIDOMWindow *win = aDocument->GetWindow();
- nsCOMPtr<nsIScriptObjectPrincipal> sop(do_QueryInterface(win));
- if (sop && nsContentUtils::IsSystemPrincipal(sop->GetPrincipal()))
- return true;
+ // Documents with system principal can always extract canvas data.
+ nsPIDOMWindow *win = aDocument->GetWindow();
+ nsCOMPtr<nsIScriptObjectPrincipal> sop(do_QueryInterface(win));
+ if (sop && nsContentUtils::IsSystemPrincipal(sop->GetPrincipal())) {
+ return true;
+ }
- // Don't show canvas prompt for chrome scripts (e.g. Page Inspector)
- if (nsContentUtils::ThreadsafeIsCallerChrome())
- return true;
+ // Always give permission to chrome scripts (e.g. Page Inspector).
+ if (nsContentUtils::ThreadsafeIsCallerChrome()) {
+ return true;
+ }
- JS::AutoFilename scriptFile;
- unsigned scriptLine = 0;
- bool isScriptKnown = false;
- if (JS::DescribeScriptedCaller(aCx, &scriptFile, &scriptLine)) {
- isScriptKnown = true;
- // Don't show canvas prompt for PDF.js
- if (scriptFile.get() &&
- strcmp(scriptFile.get(), "resource://pdf.js/build/pdf.js") == 0)
- return true;
- }
- bool isAllowed = false;
- nsCOMPtr<mozIThirdPartyUtil> thirdPartyUtil =
- do_GetService(THIRDPARTYUTIL_CONTRACTID);
- nsCOMPtr<nsIPermissionManager> permissionManager =
- do_GetService(NS_PERMISSIONMANAGER_CONTRACTID);
- if (thirdPartyUtil && permissionManager) {
- nsCOMPtr<nsIURI> uri;
- nsresult rv = thirdPartyUtil->GetFirstPartyURI(NULL, aDocument,
- getter_AddRefs(uri));
- uint32_t permission = nsIPermissionManager::UNKNOWN_ACTION;
- if (NS_SUCCEEDED(rv)) {
- // Allow local files to access canvas data; check content permissions
- // for remote pages.
- bool isFileURL = false;
- (void)uri->SchemeIs("file", &isFileURL);
- if (isFileURL)
- permission = nsIPermissionManager::ALLOW_ACTION;
- else {
- rv = permissionManager->TestPermission(uri,
- PERMISSION_CANVAS_EXTRACT_DATA, &permission);
- }
+ // Get the document URI and its spec.
+ nsIURI *docURI = aDocument->GetDocumentURI();
+ nsCString docURISpec;
+ docURI->GetSpec(docURISpec);
+
+ // Allow local files to extract canvas data.
+ bool isFileURL;
+ (void) docURI->SchemeIs("file", &isFileURL);
+ if (isFileURL) {
+ return true;
}
- if (NS_SUCCEEDED(rv)) {
- isAllowed = (permission == nsIPermissionManager::ALLOW_ACTION);
-
- if (!isAllowed && (permission != nsIPermissionManager::DENY_ACTION)) {
- // Log all attempted canvas access and block access by third parties.
- bool isThirdParty = true;
- nsIURI *docURI = aDocument->GetDocumentURI();
- rv = thirdPartyUtil->IsThirdPartyURI(uri, docURI, &isThirdParty);
- NS_ENSURE_SUCCESS(rv, false);
-
- nsCString firstPartySpec;
- rv = uri->GetSpec(firstPartySpec);
- nsCString docSpec;
- docURI->GetSpec(docSpec);
- nsPrintfCString msg("On %s: blocked access to canvas image data"
- " from document %s, ", // L10n
- firstPartySpec.get(), docSpec.get());
- if (isScriptKnown && scriptFile.get()) {
- msg += nsPrintfCString("script from %s:%u", // L10n
- scriptFile.get(), scriptLine);
- } else {
- msg += nsPrintfCString("unknown script"); // L10n
+ // Get calling script file and line for logging.
+ JS::AutoFilename scriptFile;
+ unsigned scriptLine = 0;
+ bool isScriptKnown = false;
+ if (JS::DescribeScriptedCaller(aCx, &scriptFile, &scriptLine)) {
+ isScriptKnown = true;
+ // Don't show canvas prompt for PDF.js
+ if (scriptFile.get() &&
+ strcmp(scriptFile.get(), "resource://pdf.js/build/pdf.js") == 0) {
+ return true;
}
- nsCOMPtr<nsIConsoleService> console
- (do_GetService(NS_CONSOLESERVICE_CONTRACTID));
- if (console)
- console->LogStringMessage(NS_ConvertUTF8toUTF16(msg).get());
-
- // Log every canvas access attempt to stdout if debugging:
-#ifdef DEBUG
- printf("%s\n", msg.get());
-#endif
- // Ensure URI is valid after logging, but before trying to notify the
- // user:
- NS_ENSURE_SUCCESS(rv, false);
-
- if (!isThirdParty) {
- // Send notification so that a prompt is displayed.
- nsCOMPtr<nsIObserverService> obs =
- mozilla::services::GetObserverService();
- obs->NotifyObservers(win, TOPIC_CANVAS_PERMISSIONS_PROMPT,
- NS_ConvertUTF8toUTF16(firstPartySpec).get());
+ }
+
+ // Load Third Party Util service.
+ nsresult rv;
+ nsCOMPtr<mozIThirdPartyUtil> thirdPartyUtil =
+ do_GetService(THIRDPARTYUTIL_CONTRACTID, &rv);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ // Get the First Party URI and its spec.
+ nsCOMPtr<nsIURI> firstPartyURI;
+ rv = thirdPartyUtil->GetFirstPartyURI(NULL, aDocument,
+ getter_AddRefs(firstPartyURI));
+ NS_ENSURE_SUCCESS(rv, false);
+ nsCString firstPartySpec;
+ firstPartyURI->GetSpec(firstPartySpec);
+
+ // Block all third-party attempts to extract canvas.
+ bool isThirdParty = true;
+ rv = thirdPartyUtil->IsThirdPartyURI(firstPartyURI, docURI, &isThirdParty);
+ NS_ENSURE_SUCCESS(rv, false);
+ if (isThirdParty) {
+ nsAutoCString message;
+ message.AppendPrintf("Blocked third party %s in page %s from extracting canvas data.",
+ docURISpec.get(), firstPartySpec.get());
+ if (isScriptKnown) {
+ message.AppendPrintf(" %s:%u.", scriptFile.get(), scriptLine);
}
- }
+ nsContentUtils::LogMessageToConsole(message.get());
+ return false;
+ }
+
+ // Load Permission Manager service.
+ nsCOMPtr<nsIPermissionManager> permissionManager =
+ do_GetService(NS_PERMISSIONMANAGER_CONTRACTID);
+ NS_ENSURE_SUCCESS(rv, false);
+
+ // Check if the site has permission to extract canvas data.
+ // Either permit or block extraction if a stored permission setting exists.
+ uint32_t permission;
+ rv = permissionManager->TestPermission(firstPartyURI,
+ PERMISSION_CANVAS_EXTRACT_DATA, &permission);
+ NS_ENSURE_SUCCESS(rv, false);
+ if (permission == nsIPermissionManager::ALLOW_ACTION) {
+ return true;
+ } else if (permission == nsIPermissionManager::DENY_ACTION) {
+ return false;
}
- }
- return isAllowed;
+ // At this point, permission is unknown (nsIPermissionManager::UNKNOWN_ACTION).
+ nsAutoCString message;
+ message.AppendPrintf("Blocked %s in page %s from extracting canvas data.",
+ docURISpec.get(), firstPartySpec.get());
+ if (isScriptKnown) {
+ message.AppendPrintf(" %s:%u.", scriptFile.get(), scriptLine);
+ }
+ nsContentUtils::LogMessageToConsole(message.get());
+
+ // Prompt the user (asynchronous).
+ nsCOMPtr<nsIObserverService> obs = mozilla::services::GetObserverService();
+ obs->NotifyObservers(win, TOPIC_CANVAS_PERMISSIONS_PROMPT,
+ NS_ConvertUTF8toUTF16(firstPartySpec).get());
+
+ // We don't extract the image for now -- user may override at prompt.
+ return false;
}
void
1
0

07 Dec '15
commit 05c8befab9446cdd6a0bfe7a60a75849a09321da
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Wed Nov 11 13:14:08 2015 -0800
Bug 17108: Polish about:tor appearance
Changes include:
0. Logo changed to prettier onion
1. Title changed to "Welcome to Tor Browser" (in purple).
2. Dropped "This browser is configured to use Tor."
3. Normal style for "You are now free to browse the Internet anonymously."
4. Border on input box set to light gray, rounded corners removed
5. Search button image replaced with non-pixellated one
6. Sans-serif text used everywhere
7. Borders on bubbles removed
8. Text color changed to be slightly less black
9. Some text increased a little in size
---
src/chrome/content/aboutTor/aboutTor.xhtml | 6 +-
src/chrome/content/aboutTor/search.png | Bin 3419 -> 934 bytes
src/chrome/content/aboutTor/tor-on.png | Bin 2665 -> 17945 bytes
src/chrome/locale/en/aboutTor.dtd | 6 +-
src/chrome/skin/aboutTor.css | 88 ++++++++--------------------
5 files changed, 29 insertions(+), 71 deletions(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index dbfca72..6331997 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -249,11 +249,11 @@ function setupDonationBanner() {
<div id="torstatus-on-container" class="hideIfTorOff torstatus-container">
<h1>&aboutTor.success.label;</h1>
<br/>
- <h2 id="success2">&aboutTor.success2.label;</h2>
- <br/>
<h3 class="hideIfTBBNeedsUpdate">&aboutTor.success3.label;</h3>
<br/>
- <a id="testTorSettings" href="about:blank">&aboutTor.check.label;</a>
+ <div style="margin-top: 20px;">
+ <a id="testTorSettings" href="about:blank">&aboutTor.check.label;</a>
+ </div>
</div>
<div id="torstatus-off-container" class="hideIfTorOn torstatus-container">
<h1>&aboutTor.failure.label;</h1>
diff --git a/src/chrome/content/aboutTor/search.png b/src/chrome/content/aboutTor/search.png
index 379d094..698a77d 100644
Binary files a/src/chrome/content/aboutTor/search.png and b/src/chrome/content/aboutTor/search.png differ
diff --git a/src/chrome/content/aboutTor/tor-on.png b/src/chrome/content/aboutTor/tor-on.png
index aa938e1..186fcf1 100644
Binary files a/src/chrome/content/aboutTor/tor-on.png and b/src/chrome/content/aboutTor/tor-on.png differ
diff --git a/src/chrome/locale/en/aboutTor.dtd b/src/chrome/locale/en/aboutTor.dtd
index 69ef335..17af371 100644
--- a/src/chrome/locale/en/aboutTor.dtd
+++ b/src/chrome/locale/en/aboutTor.dtd
@@ -6,14 +6,14 @@
<!ENTITY aboutTor.title "About Tor">
-<!ENTITY aboutTor.outOfDateTorOn.label "HOWEVER, this browser is out of date.">
+<!ENTITY aboutTor.outOfDateTorOn.label "WARNING: this browser is out of date.">
<!ENTITY aboutTor.outOfDateTorOff.label "ALSO, this browser is out of date.">
<!ENTITY aboutTor.outOfDate2.label "Click on the onion and then choose Check for Tor Browser Update.">
<!ENTITY aboutTor.check.label "Test Tor Network Settings">
-<!ENTITY aboutTor.success.label "Congratulations!">
-<!ENTITY aboutTor.success2.label "This browser is configured to use Tor.">
+<!ENTITY aboutTor.success.label "Welcome to Tor Browser">
+<!ENTITY aboutTor.success2.label "Connected to the Tor network.">
<!ENTITY aboutTor.success3.label "You are now free to browse the Internet anonymously.">
<!ENTITY aboutTor.failure.label "Something Went Wrong!">
<!ENTITY aboutTor.failure2.label "Tor is not working in this browser.">
diff --git a/src/chrome/skin/aboutTor.css b/src/chrome/skin/aboutTor.css
index 038d470..2776a0e 100644
--- a/src/chrome/skin/aboutTor.css
+++ b/src/chrome/skin/aboutTor.css
@@ -18,7 +18,7 @@ body {
margin: 0px auto;
padding: 0px 0px;
font-size: 62.5%;
- font-family: "Liberation Serif", "Times New Roman", Times, serif;
+ font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
font-weight: normal;
color: #4d4d4d;
background-color: #FFFFFF;
@@ -40,7 +40,6 @@ body[toron] {
right: 6px;
height: 30px;
width: 200px;
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
font-size: 1.4em;
white-space: pre-wrap;
text-align: right;
@@ -56,6 +55,8 @@ body[toron] #torstatus-image {
height: 128px;
width: 128px;
background-image: url('chrome://torbutton/content/aboutTor/tor-off.png');
+ background-repeat: no-repeat;
+ background-position: center;
z-index: -1;
}
@@ -127,8 +128,8 @@ body:not([toron]) .hideIfTorOff {
display: none;
}
-body[toron] .top h1, body[toron] .top h2 {
- color: #008000;
+body[toron] .top h1 {
+ color: #600060;
}
div.hideIfTorIsUpToDate,
@@ -151,7 +152,7 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
}
.top h1 {
- font-size: 4.14em;
+ font-size: 4.00em;
font-weight: bold;
margin-bottom: 5px;
}
@@ -162,14 +163,10 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
font-weight: normal;
}
-.top #success2 {
- margin-bottom: 5px;
-}
-
.top h3 {
- font-size: 2.04em;
- font-style: italic;
+ font-size: 1.8em;
font-weight: normal;
+ color: #3B503C;
}
#middle {
@@ -179,6 +176,7 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
border-spacing: 100px 0px;
border-collapse: separate;
text-align: center;
+ font-size: 1.6em;
}
.bubbleRow {
@@ -189,61 +187,30 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
display: table-cell;
width: 50%;
height: 100%;
- padding: 10px 10px;
- color: #222222;
+ padding: 20px 30px;
+ color: #3B503C;
background-color: #FFFFFF;
- border: 1px solid #008000;
+ border: none;
border-radius: 16px;
- text-align: center;
+ text-align: start;
vertical-align: top;
}
#middle h1 {
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
- font-size: 1.9em;
+ font-size: 1.2em;
margin-bottom: 10px;
}
-#middle h2 {
- font-size: 1.4em;
- margin: 9px 0px 3px 0px;
- font-weight: 500;
-}
-
-#middle h6 {
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
- font-size: 1em;
- line-height: 1em;
- font-style: italic;
- font-weight: normal;
- padding-top: 10px;
-}
-
-#middle p {
- font-size: 1.35em;
- text-align: left;
-}
-
-#middle p:-moz-dir(rtl) {
- text-align: right;
-}
-
-#middle a {
- font-size: 1.35em;
-}
-
#middle a.tips {
display: block;
- margin-top: 1.35em;
+ margin-top: 1.6em;
}
#middle ul {
- text-align: left;
padding: 5px 0 0 22px;
}
#middle ul:-moz-dir(rtl) {
- text-align: right;
padding: 5px 22px 0 0;
}
@@ -252,14 +219,14 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
}
#bottom {
- margin: 0px auto;
+ margin: 30px 0px 0px 0px;
padding-bottom: 40px;
float: left;
}
#bottom p {
- font-size: 1.8em;
- text-align: justify;
+ font-size: 1.6em;
+ text-align: start;
margin: 10px 125px 0px 125px;
}
@@ -276,7 +243,6 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
#bottom h4 {
margin-top: 50px;
line-height: 1em;
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
font-size: 1em;
font-weight: normal;
text-align: center;
@@ -285,7 +251,6 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
#bottom p.lang {
max-width: 620px;
margin: 10px auto;
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
font-size: 1em;
font-weight: normal;
text-align: center;
@@ -301,7 +266,6 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
padding-top: 5px;
font-size: 12px;
font-weight: normal;
- font-family: "Liberation Sans", Arial, Helvetica, sans-serif;
text-align: center;
}
@@ -312,7 +276,7 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
}
#sbutton input {
- height: 32px;
+ height: 34px;
width: 33px;
border: 0;
background: url('chrome://torbutton/content/aboutTor/search.png') no-repeat top left;
@@ -321,26 +285,20 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
/* #sxw is the container div for the search field and button */
#sxw {
- border-top: rgb(31,119,45) solid 1px;
- border-left: rgb(31,119,45) solid 1px;
- border-bottom: rgb(94,213,99) solid 1px;
- border-right: none;
- border-radius: 3px 0 0 3px;
- box-shadow: 0 1px 2px 0 rgba(0,0,0,0.2);
- border-top-left-radius: 3px 3px;
- border-bottom-left-radius: 3px 3px;
+ border: none;
}
/* #sx is the search input (text) field */
#sx {
+ border-color: lightgray;
+ border-style: solid;
+ border-width: 1px 0px 1px 1px;
width: 350px;
min-height: 23px;
padding: 4px 6px 5px 6px;
margin: 0;
outline: none;
color: #222;
- border: none;
- font-family: "Segoe UI","Arial",sans-serif;
font-size: 18px;
}
1
0

[torbutton/maint-1.9.3] Bug 17565: Tor fundraising campaign donation banner
by gk@torproject.org 05 Dec '15
by gk@torproject.org 05 Dec '15
05 Dec '15
commit ddf8ea3503fc29a601baf4c77d0cbe96391e8fee
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Nov 21 12:12:55 2015 -0800
Bug 17565: Tor fundraising campaign donation banner
---
src/chrome/content/aboutTor/aboutTor.xhtml | 84 ++++++++++++++++++--
src/chrome/content/aboutTor/donation-banner-cd.jpg | Bin 0 -> 64622 bytes
src/chrome/content/aboutTor/donation-banner-lp.jpg | Bin 0 -> 68990 bytes
src/chrome/content/aboutTor/donation-banner-rd.jpg | Bin 0 -> 63095 bytes
src/chrome/locale/en/aboutTor.dtd | 3 +
src/chrome/locale/en/aboutTor.properties | 12 +++
src/chrome/skin/aboutTor.css | 75 +++++++++++++++++
7 files changed, 169 insertions(+), 5 deletions(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index 0991ebe..dbfca72 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -23,10 +23,16 @@
href="chrome://torbutton/skin/aboutTor.css"/>
<script type="text/javascript;version=1.7">
<![CDATA[
+let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
+Components.utils.import("resource://gre/modules/Services.jsm");
+let gStringBundle = Services.strings.createBundle(kPropertiesURL);
+
function onLoad()
{
insertPropertyStrings();
+ setupDonationBanner();
+
document.addEventListener("AboutTorAdjustArrow", function() {
adjustToolbarIconArrow();
}, false);
@@ -144,10 +150,6 @@ function adjustToolbarIconArrow()
function insertPropertyStrings()
{
try {
- let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
-
- Components.utils.import("resource://gre/modules/Services.jsm");
- let gStringBundle = Services.strings.createBundle(kPropertiesURL);
let s1 = gStringBundle.GetStringFromName("aboutTor.searchDC.privacy.link");
let s2 = gStringBundle.GetStringFromName("aboutTor.searchDC.search.link");
let result = gStringBundle.formatStringFromName("aboutTor.searchDC.privacy",
@@ -165,11 +167,83 @@ window.addEventListener("pageshow", function() {
document.dispatchEvent(evt);
});
+// Donation banner constants
+let gBannerAlternates = ["lp", "cd", "rd"],
+ gBannerSuffixes = ["quote", "who", "speciality"],
+ populateBannerText = (suffix, alternate) =>
+ document.getElementById("donation-banner-" + suffix).innerHTML
+ = gStringBundle.GetStringFromName("aboutTor.donationBanner." +
+ alternate + "." + suffix);
+
+// This function takes care of the donation banner.
+function setupDonationBanner() {
+ try {
+ // Only show banner for US English
+ let browserLocale = Services.prefs.getCharPref("general.useragent.locale");
+ if (browserLocale !== "en-US") {
+ return;
+ }
+ // Only show banner until 2016 Jan 25.
+ let now = new Date();
+ let expiration = new Date(2016,0,26);
+ if (now > expiration) {
+ return;
+ }
+ // Only show banner 10 times.
+ let showCountPref = "extensions.torbutton.donation_banner.shown_count";
+ if (Services.prefs.prefHasUserValue(showCountPref)) {
+ count = Services.prefs.getIntPref(showCountPref);
+ } else {
+ count = 0;
+ }
+ if (count >= 10) {
+ return;
+ }
+ Services.prefs.setIntPref(showCountPref, count+1);
+
+ // Decide which champion we are using.
+ let alternate = gBannerAlternates[
+ Math.floor(Math.random() * gBannerAlternates.length)];
+ // Show the champion.
+ document.getElementById("donation-banner-image").src =
+ "chrome://torbutton/content/aboutTor/donation-banner-" + alternate + ".jpg";
+ // Populate banner with associated text.
+ for (let suffix of gBannerSuffixes) {
+ populateBannerText(suffix, alternate);
+ }
+ } catch (e) {
+ // Something has gone wrong! Don't show the banner, and don't propagate
+ // any errors that will interfere with other code.
+ return;
+ }
+ // Now we can show the banner.
+ document.getElementById("donation-banner").style.display = "inline";
+}
]]>
</script>
</head>
<body dir="&locale.dir;" onload="onLoad();">
-<div id="torstatus" class="top">
+
+ <div id="donation-banner" class="top">
+ <a href="https://www.torproject.org/donate/donate-tbb">
+ <div id="donation-banner-inner">
+ <img id="donation-banner-image" width="700" />
+ <div id="donation-banner-text">
+ <div id="donation-banner-quote"></div>
+ <div id="donation-banner-credit">
+ <div id="donation-banner-who"></div>
+ <div id="donation-banner-speciality"></div>
+ </div>
+ </div>
+ <div id="donation-banner-plea">&aboutTor.donate.supportTor;</div>
+ </div>
+ </a>
+ <a href="https://www.torproject.org/donate/donate-tbb">
+ <div id="donate-button">&aboutTor.donate.donate;</div>
+ </a>
+ </div>
+
+ <div id="torstatus" class="top">
<div id="torstatus-version"/>
<div id="torstatus-image"/>
<div id="torstatus-on-container" class="hideIfTorOff torstatus-container">
diff --git a/src/chrome/content/aboutTor/donation-banner-cd.jpg b/src/chrome/content/aboutTor/donation-banner-cd.jpg
new file mode 100644
index 0000000..522f950
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-cd.jpg differ
diff --git a/src/chrome/content/aboutTor/donation-banner-lp.jpg b/src/chrome/content/aboutTor/donation-banner-lp.jpg
new file mode 100644
index 0000000..e807679
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-lp.jpg differ
diff --git a/src/chrome/content/aboutTor/donation-banner-rd.jpg b/src/chrome/content/aboutTor/donation-banner-rd.jpg
new file mode 100644
index 0000000..94e59c7
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-rd.jpg differ
diff --git a/src/chrome/locale/en/aboutTor.dtd b/src/chrome/locale/en/aboutTor.dtd
index b923233..69ef335 100644
--- a/src/chrome/locale/en/aboutTor.dtd
+++ b/src/chrome/locale/en/aboutTor.dtd
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "The Tor Project is a US 501(c)(3) non-profit dedicated to the research, development, and education of online anonymity and privacy.">
<!ENTITY aboutTor.learnMore.label "Learn more about The Tor Project »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Donate">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/en/aboutTor.properties b/src/chrome/locale/en/aboutTor.properties
index d607324..10f09a1 100644
--- a/src/chrome/locale/en/aboutTor.properties
+++ b/src/chrome/locale/en/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/skin/aboutTor.css b/src/chrome/skin/aboutTor.css
index ab8dba8..038d470 100644
--- a/src/chrome/skin/aboutTor.css
+++ b/src/chrome/skin/aboutTor.css
@@ -344,3 +344,78 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
font-size: 18px;
}
+#donation-banner {
+ margin: 0px auto;
+ position: relative;
+ width: 700px;
+ display: none;
+}
+
+#donation-banner-inner {
+ margin: 0px auto;
+ position: relative;
+ text-align: left;
+ width: 700px;
+ z-index: -1;
+}
+
+#donation-banner-text {
+ height: 120px;
+ left: 245px;
+ position: absolute;
+ top: 23px;
+ width: 420px;
+}
+
+#donation-banner-quote {
+ color: darkgreen;
+ font-size: 18px;
+ text-align: start;
+ white-space: normal;
+}
+
+#donation-banner-credit {
+ color: rgb(17, 17, 17);
+ padding: 10px;
+ position: absolute;
+}
+
+#donation-banner-who {
+ font-size: 19px;
+ font-style: bold;
+}
+
+#donation-banner-speciality {
+ font-size: 13px;
+ text-transform: uppercase;
+}
+
+#donation-banner-plea {
+ background-color: yellow;
+ font-family: sans-serif;
+ font-size: 20px;
+ color: darkgreen;
+ left: 250px;
+ padding: 10px;
+ position: absolute;
+ top: 144px;
+}
+
+#donate-button {
+ background-color: green;
+ border-radius: 5px;
+ color: white;
+ font-family: sans-serif;
+ font-size: 20px;
+ left: 600px;
+ padding: 10px;
+ position: absolute;
+ text-align: center;
+ top: 153px;
+ vertical-align: middle;
+ width: 110px;
+}
+
+#donate-button:hover {
+ filter: brightness(1.2);
+}
1
0

[torbutton/master] Bug 17565: Tor fundraising campaign donation banner
by gk@torproject.org 05 Dec '15
by gk@torproject.org 05 Dec '15
05 Dec '15
commit 5623a3f4ff415eff980b03998b3eff2caf433906
Author: Arthur Edelstein <arthuredelstein(a)gmail.com>
Date: Sat Nov 21 12:12:55 2015 -0800
Bug 17565: Tor fundraising campaign donation banner
---
src/chrome/content/aboutTor/aboutTor.xhtml | 84 ++++++++++++++++++--
src/chrome/content/aboutTor/donation-banner-cd.jpg | Bin 0 -> 64622 bytes
src/chrome/content/aboutTor/donation-banner-lp.jpg | Bin 0 -> 68990 bytes
src/chrome/content/aboutTor/donation-banner-rd.jpg | Bin 0 -> 63095 bytes
src/chrome/locale/en/aboutTor.dtd | 3 +
src/chrome/locale/en/aboutTor.properties | 12 +++
src/chrome/skin/aboutTor.css | 75 +++++++++++++++++
7 files changed, 169 insertions(+), 5 deletions(-)
diff --git a/src/chrome/content/aboutTor/aboutTor.xhtml b/src/chrome/content/aboutTor/aboutTor.xhtml
index 0991ebe..dbfca72 100644
--- a/src/chrome/content/aboutTor/aboutTor.xhtml
+++ b/src/chrome/content/aboutTor/aboutTor.xhtml
@@ -23,10 +23,16 @@
href="chrome://torbutton/skin/aboutTor.css"/>
<script type="text/javascript;version=1.7">
<![CDATA[
+let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
+Components.utils.import("resource://gre/modules/Services.jsm");
+let gStringBundle = Services.strings.createBundle(kPropertiesURL);
+
function onLoad()
{
insertPropertyStrings();
+ setupDonationBanner();
+
document.addEventListener("AboutTorAdjustArrow", function() {
adjustToolbarIconArrow();
}, false);
@@ -144,10 +150,6 @@ function adjustToolbarIconArrow()
function insertPropertyStrings()
{
try {
- let kPropertiesURL = "chrome://torbutton/locale/aboutTor.properties";
-
- Components.utils.import("resource://gre/modules/Services.jsm");
- let gStringBundle = Services.strings.createBundle(kPropertiesURL);
let s1 = gStringBundle.GetStringFromName("aboutTor.searchDC.privacy.link");
let s2 = gStringBundle.GetStringFromName("aboutTor.searchDC.search.link");
let result = gStringBundle.formatStringFromName("aboutTor.searchDC.privacy",
@@ -165,11 +167,83 @@ window.addEventListener("pageshow", function() {
document.dispatchEvent(evt);
});
+// Donation banner constants
+let gBannerAlternates = ["lp", "cd", "rd"],
+ gBannerSuffixes = ["quote", "who", "speciality"],
+ populateBannerText = (suffix, alternate) =>
+ document.getElementById("donation-banner-" + suffix).innerHTML
+ = gStringBundle.GetStringFromName("aboutTor.donationBanner." +
+ alternate + "." + suffix);
+
+// This function takes care of the donation banner.
+function setupDonationBanner() {
+ try {
+ // Only show banner for US English
+ let browserLocale = Services.prefs.getCharPref("general.useragent.locale");
+ if (browserLocale !== "en-US") {
+ return;
+ }
+ // Only show banner until 2016 Jan 25.
+ let now = new Date();
+ let expiration = new Date(2016,0,26);
+ if (now > expiration) {
+ return;
+ }
+ // Only show banner 10 times.
+ let showCountPref = "extensions.torbutton.donation_banner.shown_count";
+ if (Services.prefs.prefHasUserValue(showCountPref)) {
+ count = Services.prefs.getIntPref(showCountPref);
+ } else {
+ count = 0;
+ }
+ if (count >= 10) {
+ return;
+ }
+ Services.prefs.setIntPref(showCountPref, count+1);
+
+ // Decide which champion we are using.
+ let alternate = gBannerAlternates[
+ Math.floor(Math.random() * gBannerAlternates.length)];
+ // Show the champion.
+ document.getElementById("donation-banner-image").src =
+ "chrome://torbutton/content/aboutTor/donation-banner-" + alternate + ".jpg";
+ // Populate banner with associated text.
+ for (let suffix of gBannerSuffixes) {
+ populateBannerText(suffix, alternate);
+ }
+ } catch (e) {
+ // Something has gone wrong! Don't show the banner, and don't propagate
+ // any errors that will interfere with other code.
+ return;
+ }
+ // Now we can show the banner.
+ document.getElementById("donation-banner").style.display = "inline";
+}
]]>
</script>
</head>
<body dir="&locale.dir;" onload="onLoad();">
-<div id="torstatus" class="top">
+
+ <div id="donation-banner" class="top">
+ <a href="https://www.torproject.org/donate/donate-tbb">
+ <div id="donation-banner-inner">
+ <img id="donation-banner-image" width="700" />
+ <div id="donation-banner-text">
+ <div id="donation-banner-quote"></div>
+ <div id="donation-banner-credit">
+ <div id="donation-banner-who"></div>
+ <div id="donation-banner-speciality"></div>
+ </div>
+ </div>
+ <div id="donation-banner-plea">&aboutTor.donate.supportTor;</div>
+ </div>
+ </a>
+ <a href="https://www.torproject.org/donate/donate-tbb">
+ <div id="donate-button">&aboutTor.donate.donate;</div>
+ </a>
+ </div>
+
+ <div id="torstatus" class="top">
<div id="torstatus-version"/>
<div id="torstatus-image"/>
<div id="torstatus-on-container" class="hideIfTorOff torstatus-container">
diff --git a/src/chrome/content/aboutTor/donation-banner-cd.jpg b/src/chrome/content/aboutTor/donation-banner-cd.jpg
new file mode 100644
index 0000000..522f950
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-cd.jpg differ
diff --git a/src/chrome/content/aboutTor/donation-banner-lp.jpg b/src/chrome/content/aboutTor/donation-banner-lp.jpg
new file mode 100644
index 0000000..e807679
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-lp.jpg differ
diff --git a/src/chrome/content/aboutTor/donation-banner-rd.jpg b/src/chrome/content/aboutTor/donation-banner-rd.jpg
new file mode 100644
index 0000000..94e59c7
Binary files /dev/null and b/src/chrome/content/aboutTor/donation-banner-rd.jpg differ
diff --git a/src/chrome/locale/en/aboutTor.dtd b/src/chrome/locale/en/aboutTor.dtd
index b923233..69ef335 100644
--- a/src/chrome/locale/en/aboutTor.dtd
+++ b/src/chrome/locale/en/aboutTor.dtd
@@ -47,3 +47,6 @@
<!ENTITY aboutTor.footer.label "The Tor Project is a US 501(c)(3) non-profit dedicated to the research, development, and education of online anonymity and privacy.">
<!ENTITY aboutTor.learnMore.label "Learn more about The Tor Project »">
<!ENTITY aboutTor.learnMore.link "https://www.torproject.org/about/overview.html.en">
+
+<!ENTITY aboutTor.donate.donate "Donate">
+<!ENTITY aboutTor.donate.supportTor "Please support Tor!">
diff --git a/src/chrome/locale/en/aboutTor.properties b/src/chrome/locale/en/aboutTor.properties
index d607324..10f09a1 100644
--- a/src/chrome/locale/en/aboutTor.properties
+++ b/src/chrome/locale/en/aboutTor.properties
@@ -19,3 +19,15 @@ aboutTor.searchDC.privacy=Search <a href="%1$S">securely</a> with <a href="%2$S"
aboutTor.searchDC.privacy.link=https://disconnect.me/privacy
# The following string is a link which replaces %2$S above.
aboutTor.searchDC.search.link=https://search.disconnect.me/
+
+aboutTor.donationBanner.lp.who=— Laura Poitras
+aboutTor.donationBanner.lp.quote=Edward Snowden would not have been able to contact me without Tor and other free software encryption projects. Tor is an essential tool, and it needs our support.
+aboutTor.donationBanner.lp.speciality=Oscar-Winning Documentary Filmmaker, <i>CitizenFour</i>
+
+aboutTor.donationBanner.cd.who=— Cory Doctorow
+aboutTor.donationBanner.cd.quote=Privacy and anonymity matter to all of us.
+aboutTor.donationBanner.cd.speciality= Novelist, technology activist, co-editor of Boing Boing
+
+aboutTor.donationBanner.rd.who=— Roger Dingledine
+aboutTor.donationBanner.rd.quote=Please help the strongest privacy tool in the world become more sustainable!
+aboutTor.donationBanner.rd.speciality=Founder, Acting Executive Director of the Tor Project
diff --git a/src/chrome/skin/aboutTor.css b/src/chrome/skin/aboutTor.css
index ab8dba8..038d470 100644
--- a/src/chrome/skin/aboutTor.css
+++ b/src/chrome/skin/aboutTor.css
@@ -344,3 +344,78 @@ body .top div.hideIfTorIsUpToDate h1.hideIfTorOff {
font-size: 18px;
}
+#donation-banner {
+ margin: 0px auto;
+ position: relative;
+ width: 700px;
+ display: none;
+}
+
+#donation-banner-inner {
+ margin: 0px auto;
+ position: relative;
+ text-align: left;
+ width: 700px;
+ z-index: -1;
+}
+
+#donation-banner-text {
+ height: 120px;
+ left: 245px;
+ position: absolute;
+ top: 23px;
+ width: 420px;
+}
+
+#donation-banner-quote {
+ color: darkgreen;
+ font-size: 18px;
+ text-align: start;
+ white-space: normal;
+}
+
+#donation-banner-credit {
+ color: rgb(17, 17, 17);
+ padding: 10px;
+ position: absolute;
+}
+
+#donation-banner-who {
+ font-size: 19px;
+ font-style: bold;
+}
+
+#donation-banner-speciality {
+ font-size: 13px;
+ text-transform: uppercase;
+}
+
+#donation-banner-plea {
+ background-color: yellow;
+ font-family: sans-serif;
+ font-size: 20px;
+ color: darkgreen;
+ left: 250px;
+ padding: 10px;
+ position: absolute;
+ top: 144px;
+}
+
+#donate-button {
+ background-color: green;
+ border-radius: 5px;
+ color: white;
+ font-family: sans-serif;
+ font-size: 20px;
+ left: 600px;
+ padding: 10px;
+ position: absolute;
+ text-align: center;
+ top: 153px;
+ vertical-align: middle;
+ width: 110px;
+}
+
+#donate-button:hover {
+ filter: brightness(1.2);
+}
1
0

[torbutton/master] Bug 16940: After update, load local change notes.
by gk@torproject.org 25 Nov '15
by gk@torproject.org 25 Nov '15
25 Nov '15
commit 9b800ffc669f7eb7dd6203a24aa85a39b5edd154
Author: Kathy Brade <brade(a)pearlcrescent.com>
Date: Thu Nov 19 10:13:11 2015 -0500
Bug 16940: After update, load local change notes.
Include the localizable strings for the about:tbupdate page
in Torbutton.
---
src/chrome.manifest | 3 +++
src/chrome/locale/en/aboutTBUpdate.dtd | 6 ++++++
trans_tools/import-translations.sh | 1 +
3 files changed, 10 insertions(+)
diff --git a/src/chrome.manifest b/src/chrome.manifest
index 1d3efb4..30aa2ff 100644
--- a/src/chrome.manifest
+++ b/src/chrome.manifest
@@ -12,6 +12,9 @@ override chrome://branding/locale/brand.dtd chrome://torbutton/locale/brand.dtd
override chrome://branding/locale/brand.properties chrome://torbutton/locale/brand.properties
overlay chrome://browser/content/aboutDialog.xul chrome://torbutton/content/aboutDialog.xul
+# Strings for the about:tbupdate page
+override chrome://browser/locale/aboutTBUpdate.dtd chrome://torbutton/locale/aboutTBUpdate.dtd
+
locale torbutton af chrome/locale/af/
locale torbutton ak chrome/locale/ak/
locale torbutton am chrome/locale/am/
diff --git a/src/chrome/locale/en/aboutTBUpdate.dtd b/src/chrome/locale/en/aboutTBUpdate.dtd
new file mode 100644
index 0000000..37567bd
--- /dev/null
+++ b/src/chrome/locale/en/aboutTBUpdate.dtd
@@ -0,0 +1,6 @@
+<!ENTITY aboutTBUpdate.title "Tor Browser Update">
+<!ENTITY aboutTBUpdate.updated "Tor Browser has been updated.">
+<!ENTITY aboutTBUpdate.linkPrefix "For the most up-to-date information about this release, ">
+<!ENTITY aboutTBUpdate.linkLabel "visit our website">
+<!ENTITY aboutTBUpdate.linkSuffix ".">
+<!ENTITY aboutTBUpdate.changeLogHeading "Changelog:">
diff --git a/trans_tools/import-translations.sh b/trans_tools/import-translations.sh
index 494e64f..cfaa05c 100755
--- a/trans_tools/import-translations.sh
+++ b/trans_tools/import-translations.sh
@@ -17,6 +17,7 @@ LOCALE_DIR=../src/chrome/locale
FILEMAP=( "aboutDialog.dtd:torbutton-aboutdialogdtd"
"aboutTor.dtd:abouttor-homepage"
"aboutTor.properties:torbutton-abouttorproperties"
+ "aboutTBUpdate.dtd:torbutton-abouttbupdatedtd"
"brand.dtd:torbutton-branddtd"
"brand.properties:torbutton-brandproperties"
"torbutton.dtd:torbutton-torbuttondtd"
1
0