aboutsummaryrefslogtreecommitdiff
path: root/src/net/socks_connect.cpp
diff options
context:
space:
mode:
authortobtoht <tob@featherwallet.org>2026-04-20 07:49:04 +0000
committertobtoht <tob@featherwallet.org>2026-04-20 07:49:04 +0000
commit8b6be66bef8cce6e074074b7329be9509b93dbb8 (patch)
tree6dee62eec590447f49e6a29d649c294f4757a2a4 /src/net/socks_connect.cpp
parente75125a30b1f70e74eded99d3fc4f3e98938c6d5 (diff)
parentce5437f0677966c15d2946bc7c068975aa6bfd83 (diff)
downloadmonzero-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.cpp26
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)});