commit 29203b7f3f6d07dec1cede65f118aa450ac7712d Author: George Kadianakis desnacked@gmail.com Date: Sun Jun 12 00:14:11 2011 +0200
We can now connect using transports as well! --- src/or/circuitbuild.c | 21 +++++++++++++++++++++ src/or/circuitbuild.h | 3 +++ src/or/connection_or.c | 18 ++++++++++++++++++ 3 files changed, 42 insertions(+), 0 deletions(-)
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c index c07e890..21018dc 100644 --- a/src/or/circuitbuild.c +++ b/src/or/circuitbuild.c @@ -100,6 +100,7 @@ static int count_acceptable_nodes(smartlist_t *routers); static int onion_append_hop(crypt_path_t **head_ptr, extend_info_t *choice);
static void entry_guards_changed(void); +static void transport_free(transport_info_t *transport);
/** * This function decides if CBT learning should be disabled. It returns @@ -4803,6 +4804,26 @@ find_bridge_by_digest(const char *digest) return NULL; }
+/** If <b>addr</b> and <b>port</b> match one of our known bridges, + * returns it's transport protocol if it has one, else returns NULL. + */ +transport_info_t * +find_bridge_transport_by_addrport(const tor_addr_t *addr, uint16_t port) +{ + SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) + { + if (tor_addr_eq(&bridge->addr, addr) && + (bridge->port == port)) { + if (bridge->transport) { + log_debug(LD_GENERAL, "Found matching bridge!\n"); + return bridge->transport; + } else /* bridge found, but it had no transport */ + return NULL; + } + } SMARTLIST_FOREACH_END(bridge); + return NULL; +} + /** We need to ask <b>bridge</b> for its server descriptor. */ static void launch_direct_bridge_descriptor_fetch(bridge_info_t *bridge) diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h index eb6fdba..047de11 100644 --- a/src/or/circuitbuild.h +++ b/src/or/circuitbuild.h @@ -148,5 +148,8 @@ void clear_transport_list(void); int match_bridges_with_transports(void); void transport_add_from_config(const tor_addr_t *addr, uint16_t port, const char *name, int socks_ver); +transport_info_t * +find_bridge_transport_by_addrport(const tor_addr_t *addr, uint16_t port); + #endif
diff --git a/src/or/connection_or.c b/src/or/connection_or.c index 73aad7e..7cfe2e7 100644 --- a/src/or/connection_or.c +++ b/src/or/connection_or.c @@ -335,6 +335,14 @@ connection_or_finished_connecting(or_connection_t *or_conn) proxy_type = PROXY_SOCKS4; else if (get_options()->Socks5Proxy) proxy_type = PROXY_SOCKS5; + else if (get_options()->UseBridges) { + transport_info_t *transport; + transport = find_bridge_transport_by_addrport(&conn->addr,conn->port); + if (transport) { /* this bridge supports transports. use proxy. */ + log_warn(LD_GENERAL, "Setting up pluggable transport plugin proxy type!\n"); + proxy_type = transport->socks_version; + } + }
if (proxy_type != PROXY_NONE) { /* start proxy handshake */ @@ -861,6 +869,16 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port, using_proxy = 1; tor_addr_copy(&addr, &options->Socks5ProxyAddr); port = options->Socks5ProxyPort; + } else if (options->ClientTransportPlugin) { + transport_info_t *transport; + transport = find_bridge_transport_by_addrport(&addr, port); + if (transport) { + log_warn(LD_GENERAL, "Our bridge uses a pluggable transport plugin. " + "Setting up proxying!"); + using_proxy = 1; + tor_addr_copy(&addr, &transport->addr); + port = transport->port; + } }
switch (connection_connect(TO_CONN(conn), conn->_base.address,
tor-commits@lists.torproject.org