diff options
| author | tobtoht <tob@featherwallet.org> | 2026-04-20 07:49:04 +0000 |
|---|---|---|
| committer | tobtoht <tob@featherwallet.org> | 2026-04-20 07:49:04 +0000 |
| commit | 8b6be66bef8cce6e074074b7329be9509b93dbb8 (patch) | |
| tree | 6dee62eec590447f49e6a29d649c294f4757a2a4 /src/net/socks_connect.cpp | |
| parent | e75125a30b1f70e74eded99d3fc4f3e98938c6d5 (diff) | |
| parent | ce5437f0677966c15d2946bc7c068975aa6bfd83 (diff) | |
| download | monzero-core-8b6be66bef8cce6e074074b7329be9509b93dbb8.tar.gz monzero-core-8b6be66bef8cce6e074074b7329be9509b93dbb8.tar.xz monzero-core-8b6be66bef8cce6e074074b7329be9509b93dbb8.zip | |
Merge pull request #10411
ce5437f Add Socks v5 support to daemon and wallet (Lee *!* Clagett)
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)}); |
