From 67fef39ed463533157e66a72c17f31f9d078d5a2 Mon Sep 17 00:00:00 2001 From: Tobias Markmann Date: Fri, 19 Jun 2015 14:50:07 +0200 Subject: Create S5B proxy candidates for each DNS lookup result If the S5B proxy lookup result has no direct IP address listed the name is resolved using DNS. This change will create a proxy result per resolved result address and not only the first result address. Test-Information: Verified the candidate list contains both entires for a proxy name that resolves to an A and an AAAA record. Change-Id: Iec21ff90af981030ff49fb53803d88a59694767c diff --git a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp index 26ad8b5..2956ff7 100644 --- a/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp +++ b/Swiften/FileTransfer/SOCKS5BytestreamProxiesManager.cpp @@ -13,17 +13,17 @@ #include -#include #include +#include +#include #include #include -#include -#include #include -#include #include #include +#include +#include namespace Swift { @@ -44,7 +44,6 @@ void SOCKS5BytestreamProxiesManager::addS5BProxy(S5BProxyRequest::ref proxy) { localS5BProxies_ = std::vector(); } localS5BProxies_->push_back(proxy); - onDiscoveredProxiesChanged(); } } @@ -106,6 +105,7 @@ void SOCKS5BytestreamProxiesManager::handleProxyFound(S5BProxyRequest::ref proxy if (proxy) { if (HostAddress(proxy->getStreamHost().get().host).isValid()) { addS5BProxy(proxy); + onDiscoveredProxiesChanged(); } else { DomainNameAddressQuery::ref resolveRequest = resolver_->createAddressQuery(proxy->getStreamHost().get().host); @@ -120,20 +120,25 @@ void SOCKS5BytestreamProxiesManager::handleProxyFound(S5BProxyRequest::ref proxy proxyFinder_.reset(); } -void SOCKS5BytestreamProxiesManager::handleNameLookupResult(const std::vector& address, boost::optional error, S5BProxyRequest::ref proxy) { +void SOCKS5BytestreamProxiesManager::handleNameLookupResult(const std::vector& addresses, boost::optional error, S5BProxyRequest::ref proxy) { if (error) { onDiscoveredProxiesChanged(); } else { - if (address.empty()) { + if (addresses.empty()) { SWIFT_LOG(warning) << "S5B proxy hostname does not resolve." << std::endl; onDiscoveredProxiesChanged(); } else { - S5BProxyRequest::StreamHost streamHost = proxy->getStreamHost().get(); - streamHost.host = address[0].toString(); - proxy->setStreamHost(streamHost); - addS5BProxy(proxy); + // generate proxy per returned address + foreach (const HostAddress& address, addresses) { + S5BProxyRequest::StreamHost streamHost = proxy->getStreamHost().get(); + S5BProxyRequest::ref proxyForAddress = boost::make_shared(*proxy); + streamHost.host = address.toString(); + proxyForAddress->setStreamHost(streamHost); + addS5BProxy(proxyForAddress); + } + onDiscoveredProxiesChanged(); } } } -- cgit v0.10.2-6-g49f6