diff options
| author | Lee *!* Clagett <code@leeclagett.com> | 2024-08-17 18:37:10 -0400 |
|---|---|---|
| committer | lschomaker1 <lucas.schomaker12@gmail.com> | 2026-04-16 15:52:05 -0500 |
| commit | ce5437f0677966c15d2946bc7c068975aa6bfd83 (patch) | |
| tree | fe34f64934e00f27f4308f6747a0c32efd2edfcd /src/net/socks_connect.cpp | |
| parent | 54b803603cf0fb450a9b9436b9fe85452e75966f (diff) | |
| download | monzero-core-ce5437f0677966c15d2946bc7c068975aa6bfd83.tar.gz monzero-core-ce5437f0677966c15d2946bc7c068975aa6bfd83.tar.xz monzero-core-ce5437f0677966c15d2946bc7c068975aa6bfd83.zip | |
Add Socks v5 support to daemon and wallet
(cherry picked from commit 23e29a5074f01cbb781f7e76b0c17ad2b6797af0)
Diffstat (limited to 'src/net/socks_connect.cpp')
| -rw-r--r-- | src/net/socks_connect.cpp | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/src/net/socks_connect.cpp b/src/net/socks_connect.cpp index 8ecbf6d08..c7c963cb7 100644 --- a/src/net/socks_connect.cpp +++ b/src/net/socks_connect.cpp @@ -28,6 +28,7 @@ #include "socks_connect.h" +#include <boost/asio/ip/address_v6.hpp> #include <boost/system/error_code.hpp> #include <boost/system/system_error.hpp> #include <cstdint> @@ -36,6 +37,7 @@ #include "net/error.h" #include "net/net_utils_base.h" +#include "net/parse.h" #include "net/socks.h" #include "string_tools.h" #include "string_tools_lexical.h" @@ -44,9 +46,22 @@ namespace net { namespace socks { + namespace + { + bool get_v6_address(boost::asio::ip::address_v6& out, const std::string& source) + { + boost::system::error_code error{}; + out = boost::asio::ip::make_address_v6(source, error); + return !error; + } + } // anonymous + boost::unique_future<boost::asio::ip::tcp::socket> connector::operator()(const std::string& remote_host, const std::string& remote_port, boost::asio::steady_timer& timeout) const { + if (!proxy_address) + throw std::runtime_error{"Unexpected nullptr of net::socks::endpoint"}; + struct future_socket { boost::promise<boost::asio::ip::tcp::socket> result_; @@ -68,18 +83,21 @@ namespace socks bool is_set = false; std::uint32_t ip_address = 0; + boost::asio::ip::address_v6 v6_address{}; boost::promise<boost::asio::ip::tcp::socket> result{}; out = result.get_future(); const auto proxy = net::socks::make_connect_client( - boost::asio::ip::tcp::socket{MONERO_GET_EXECUTOR(timeout)}, net::socks::version::v4a, future_socket{std::move(result)} + boost::asio::ip::tcp::socket{MONERO_GET_EXECUTOR(timeout)}, proxy_address->ver, future_socket{std::move(result)} ); if (epee::string_tools::get_ip_int32_from_string(ip_address, remote_host)) - is_set = proxy->set_connect_command(epee::net_utils::ipv4_network_address{ip_address, port}); + is_set = proxy->set_connect_command(epee::net_utils::ipv4_network_address{ip_address, port}, std::addressof(proxy_address->userinfo)); + else if (get_v6_address(v6_address, remote_host)) + is_set = proxy->set_connect_command(epee::net_utils::ipv6_network_address{v6_address, port}, std::addressof(proxy_address->userinfo)); else - is_set = proxy->set_connect_command(remote_host, port); + is_set = proxy->set_connect_command(remote_host, port, std::addressof(proxy_address->userinfo)); - if (!is_set || !net::socks::client::connect_and_send(proxy, proxy_address)) + if (!is_set || !net::socks::client::connect_and_send(proxy, proxy_address->address)) throw std::system_error{net::error::invalid_host, "Address for socks proxy"}; timeout.async_wait(net::socks::client::async_close{std::move(proxy)}); |
