[tbb-commits] [tor-browser-bundle/master] Add a tor-master version of #8402 for nightly testing.
mikeperry at torproject.org
mikeperry at torproject.org
Tue May 6 14:11:05 UTC 2014
commit 14c8ff18ccdaccdf8ddf8287dea48b9da03b72dd
Author: Mike Perry <mikeperry-git at torproject.org>
Date: Fri May 2 10:14:43 2014 -0700
Add a tor-master version of #8402 for nightly testing.
---
gitian/descriptors/linux/gitian-tor.yml | 3 +
gitian/descriptors/mac/gitian-tor.yml | 3 +
gitian/descriptors/windows/gitian-tor.yml | 3 +
gitian/patches/bug8402-master.patch | 767 +++++++++++++++++++++++++++++
4 files changed, 776 insertions(+)
diff --git a/gitian/descriptors/linux/gitian-tor.yml b/gitian/descriptors/linux/gitian-tor.yml
index 8b1644e..44c2b1f 100644
--- a/gitian/descriptors/linux/gitian-tor.yml
+++ b/gitian/descriptors/linux/gitian-tor.yml
@@ -30,6 +30,7 @@ files:
- "bug11069.patch"
- "bug9665.patch"
- "bug8402.patch"
+- "bug8402-master.patch"
- "dzip.sh"
- "openssl-linux32-utils.zip"
- "openssl-linux64-utils.zip"
@@ -81,6 +82,8 @@ script: |
git am ~/build/bug9665.patch
git am ~/build/bug11200.patch
git am ~/build/bug8402.patch
+ else
+ git am ~/build/bug8402-master.patch
fi
fi
mkdir -p $OUTDIR/src
diff --git a/gitian/descriptors/mac/gitian-tor.yml b/gitian/descriptors/mac/gitian-tor.yml
index ca938fc..68905e7 100644
--- a/gitian/descriptors/mac/gitian-tor.yml
+++ b/gitian/descriptors/mac/gitian-tor.yml
@@ -33,6 +33,7 @@ files:
- "bug11069.patch"
- "bug9665.patch"
- "bug8402.patch"
+- "bug8402-master.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"
@@ -112,6 +113,8 @@ script: |
git am ~/build/bug9665.patch
git am ~/build/bug11200.patch
git am ~/build/bug8402.patch
+ else
+ git am ~/build/bug8402-master.patch
fi
fi
mkdir -p $OUTDIR/src
diff --git a/gitian/descriptors/windows/gitian-tor.yml b/gitian/descriptors/windows/gitian-tor.yml
index 61fc9b5..bb6998b 100644
--- a/gitian/descriptors/windows/gitian-tor.yml
+++ b/gitian/descriptors/windows/gitian-tor.yml
@@ -32,6 +32,7 @@ files:
- "bug11069.patch"
- "bug9665.patch"
- "bug8402.patch"
+- "bug8402-master.patch"
- "binutils.tar.bz2"
- "dzip.sh"
- "openssl.tar.gz"
@@ -108,6 +109,8 @@ script: |
git am ~/build/bug9665.patch
git am ~/build/bug11200.patch
git am ~/build/bug8402.patch
+ else
+ git am ~/build/bug8402-master.patch
fi
fi
mkdir -p $OUTDIR/src
diff --git a/gitian/patches/bug8402-master.patch b/gitian/patches/bug8402-master.patch
new file mode 100644
index 0000000..33d6e20
--- /dev/null
+++ b/gitian/patches/bug8402-master.patch
@@ -0,0 +1,767 @@
+From 7476a5c00aabdb2b2b4cd29f3029a7fa3afc657d Mon Sep 17 00:00:00 2001
+From: Yawning Angel <yawning at 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 | 24 +++++++----
+ src/or/connection.c | 62 +++++++++++++++++++++--------
+ src/or/transports.c | 112 ++++++++++++++++++++++++++++++++++++++++++++++++++--
+ src/or/transports.h | 6 +++
+ src/test/test_pt.c | 81 +++++++++++++++++++++++++++++++++++++
+ 5 files changed, 258 insertions(+), 27 deletions(-)
+
+diff --git a/src/or/config.c b/src/or/config.c
+index da6aec0..91e8410 100644
+--- a/src/or/config.c
++++ b/src/or/config.c
+@@ -535,7 +535,9 @@ static int options_transition_affects_descriptor(
+ const or_options_t *old_options, const or_options_t *new_options);
+ static int check_nickname_list(char **lst, const char *name, char **msg);
+
+-static int parse_client_transport_line(const char *line, int validate_only);
++static int parse_client_transport_line(const or_options_t *options,
++ const char *line,
++ int validate_only);
+
+ static int parse_server_transport_line(const char *line, int validate_only);
+ static char *get_bindaddr_from_transport_listen_line(const char *line,
+@@ -1399,7 +1401,7 @@ options_act(const or_options_t *old_options)
+ pt_prepare_proxy_list_for_config_read();
+ if (options->ClientTransportPlugin) {
+ for (cl = options->ClientTransportPlugin; cl; cl = cl->next) {
+- if (parse_client_transport_line(cl->value, 0)<0) {
++ if (parse_client_transport_line(options, cl->value, 0)<0) {
+ log_warn(LD_BUG,
+ "Previously validated ClientTransportPlugin line "
+ "could not be added!");
+@@ -3120,11 +3122,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 ||
+@@ -3237,7 +3239,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
+ }
+
+ for (cl = options->ClientTransportPlugin; cl; cl = cl->next) {
+- if (parse_client_transport_line(cl->value, 1)<0)
++ if (parse_client_transport_line(options, cl->value, 1)<0)
+ REJECT("Transport line did not parse. See logs for details.");
+ }
+
+@@ -4609,7 +4611,8 @@ parse_bridge_line(const char *line)
+ * our internal transport list.
+ * - If it's a managed proxy line, launch the managed proxy. */
+ static int
+-parse_client_transport_line(const char *line, int validate_only)
++parse_client_transport_line(const or_options_t *options, const char *line,
++ int validate_only)
+ {
+ smartlist_t *items = NULL;
+ int r;
+@@ -4700,6 +4703,13 @@ parse_client_transport_line(const char *line, int validate_only)
+ 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 8c697d6..93d164c 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.
+@@ -1671,14 +1673,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;
+ }
+@@ -4733,6 +4735,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.
+ *
+@@ -4744,6 +4775,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;
+@@ -4759,19 +4800,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);
+ }
+
+ *proxy_type = PROXY_NONE;
+diff --git a/src/or/transports.c b/src/or/transports.c
+index 8b4a118..8e82a41 100644
+--- a/src/or/transports.c
++++ b/src/or/transports.c
+@@ -122,6 +122,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. */
+@@ -437,6 +439,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
+@@ -457,10 +470,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
+@@ -491,6 +504,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++;
+@@ -725,12 +743,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)
+@@ -743,6 +801,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;
+@@ -860,6 +924,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;
+@@ -1126,6 +1206,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. */
+@@ -1286,6 +1381,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) {
+@@ -1318,6 +1421,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 7b524f2..5b8144b 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 3277921..ada8dbe 100644
+--- a/src/test/test_pt.c
++++ b/src/test/test_pt.c
+@@ -435,6 +435,85 @@ test_pt_configure_proxy(void *arg)
+ }
+ }
+
++/* 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 at 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 }
+
+@@ -447,6 +526,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
+ };
+
+--
+1.8.1.2
+
+From bc59556e87a0b0ebaf2adfc57147522f05b3f974 Mon Sep 17 00:00:00 2001
+From: Yawning Angel <yawning at 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 ada8dbe..ac604eb 100644
+--- a/src/test/test_pt.c
++++ b/src/test/test_pt.c
+@@ -449,7 +449,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);
+@@ -457,11 +457,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);
+@@ -471,16 +470,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 at 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);
+@@ -490,15 +490,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);
+@@ -506,7 +506,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)
+--
+1.8.1.2
+
+From 3c991178926f39ffacef1d86e403f5d360d30404 Mon Sep 17 00:00:00 2001
+From: Yawning Angel <yawning at 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 93d164c..9a766d6 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.
+@@ -4735,35 +4733,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.
+ *
+@@ -4781,8 +4750,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) {
+@@ -4800,8 +4780,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);
+ }
+
+ *proxy_type = PROXY_NONE;
+--
+1.8.1.2
+
+From c4c41bb8e31ab39f2c7fe3c8f11ee727a65c3e09 Mon Sep 17 00:00:00 2001
+From: Yawning Angel <yawning at 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 9a766d6..b2e6a69 100644
+--- a/src/or/connection.c
++++ b/src/or/connection.c
+@@ -4801,7 +4801,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));
+ }
+
+--
+1.8.1.2
+
+From e3b5b7f4b9e5ef4637f0719d54be9f534e41019c Mon Sep 17 00:00:00 2001
+From: Yawning Angel <yawning at 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 8e82a41..3991bd3 100644
+--- a/src/or/transports.c
++++ b/src/or/transports.c
+@@ -803,7 +803,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;
+ }
+--
+1.8.1.2
+
More information about the tbb-commits
mailing list