diff options
Diffstat (limited to 'contrib/epee/src')
| -rw-r--r-- | contrib/epee/src/connection_basic.cpp | 18 | ||||
| -rw-r--r-- | contrib/epee/src/net_helper.cpp | 49 | ||||
| -rw-r--r-- | contrib/epee/src/net_ssl.cpp | 22 |
3 files changed, 50 insertions, 39 deletions
diff --git a/contrib/epee/src/connection_basic.cpp b/contrib/epee/src/connection_basic.cpp index b0a30f47f..1fdd82c1b 100644 --- a/contrib/epee/src/connection_basic.cpp +++ b/contrib/epee/src/connection_basic.cpp @@ -46,12 +46,6 @@ // TODO: #include "net/network_throttle-detail.hpp" -#if BOOST_VERSION >= 107000 -#define GET_IO_SERVICE(s) ((boost::asio::io_context&)(s).get_executor().context()) -#else -#define GET_IO_SERVICE(s) ((s).get_io_service()) -#endif - #undef MONERO_DEFAULT_LOG_CATEGORY #define MONERO_DEFAULT_LOG_CATEGORY "net.conn" @@ -127,12 +121,12 @@ connection_basic_pimpl::connection_basic_pimpl(const std::string &name) : m_thro int connection_basic_pimpl::m_default_tos; // methods: -connection_basic::connection_basic(boost::asio::ip::tcp::socket&& sock, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) +connection_basic::connection_basic(boost::asio::io_context &io_context, boost::asio::ip::tcp::socket&& sock, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) : m_state(std::move(state)), mI( new connection_basic_pimpl("peer") ), - strand_(GET_IO_SERVICE(sock)), - socket_(GET_IO_SERVICE(sock), get_context(m_state.get())), + strand_(io_context), + socket_(io_context, get_context(m_state.get())), m_want_close_connection(false), m_was_shutdown(false), m_is_multithreaded(false), @@ -152,12 +146,12 @@ connection_basic::connection_basic(boost::asio::ip::tcp::socket&& sock, std::sha _note("Spawned connection #"<<mI->m_peer_number<<" to " << remote_addr_str << " currently we have sockets count:" << m_state->sock_count); } -connection_basic::connection_basic(boost::asio::io_service &io_service, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) +connection_basic::connection_basic(boost::asio::io_context &io_context, std::shared_ptr<connection_basic_shared_state> state, ssl_support_t ssl_support) : m_state(std::move(state)), mI( new connection_basic_pimpl("peer") ), - strand_(io_service), - socket_(io_service, get_context(m_state.get())), + strand_(io_context), + socket_(io_context, get_context(m_state.get())), m_want_close_connection(false), m_was_shutdown(false), m_is_multithreaded(false), diff --git a/contrib/epee/src/net_helper.cpp b/contrib/epee/src/net_helper.cpp index 719f1c8e0..de0f1211b 100644 --- a/contrib/epee/src/net_helper.cpp +++ b/contrib/epee/src/net_helper.cpp @@ -4,22 +4,38 @@ namespace epee { namespace net_utils { + namespace + { + struct new_connection + { + boost::promise<boost::asio::ip::tcp::socket> result_; + boost::asio::ip::tcp::socket socket_; + + template<typename T> + explicit new_connection(T&& executor) + : result_(), socket_(std::forward<T>(executor)) + {} + }; + } + boost::unique_future<boost::asio::ip::tcp::socket> direct_connect::operator()(const std::string& addr, const std::string& port, boost::asio::steady_timer& timeout) const { // Get a list of endpoints corresponding to the server name. ////////////////////////////////////////////////////////////////////////// - boost::asio::ip::tcp::resolver resolver(GET_IO_SERVICE(timeout)); - boost::asio::ip::tcp::resolver::query query(boost::asio::ip::tcp::v4(), addr, port, boost::asio::ip::tcp::resolver::query::canonical_name); + boost::asio::ip::tcp::resolver resolver(MONERO_GET_EXECUTOR(timeout)); bool try_ipv6 = false; - boost::asio::ip::tcp::resolver::iterator iterator; - boost::asio::ip::tcp::resolver::iterator end; + boost::asio::ip::tcp::resolver::results_type results{}; boost::system::error_code resolve_error; + try { - iterator = resolver.resolve(query, resolve_error); - if(iterator == end) // Documentation states that successful call is guaranteed to be non-empty + results = resolver.resolve( + boost::asio::ip::tcp::v4(), addr, port, boost::asio::ip::tcp::resolver::canonical_name, resolve_error + ); + + if (results.empty()) { // if IPv4 resolution fails, try IPv6. Unintentional outgoing IPv6 connections should only // be possible if for some reason a hostname was given and that hostname fails IPv4 resolution, @@ -37,27 +53,20 @@ namespace net_utils } try_ipv6 = true; } + if (try_ipv6) { - boost::asio::ip::tcp::resolver::query query6(boost::asio::ip::tcp::v6(), addr, port, boost::asio::ip::tcp::resolver::query::canonical_name); - iterator = resolver.resolve(query6); - if (iterator == end) + results = resolver.resolve( + boost::asio::ip::tcp::v6(), addr, port, boost::asio::ip::tcp::resolver::canonical_name + ); + if (results.empty()) throw boost::system::system_error{boost::asio::error::fault, "Failed to resolve " + addr}; } ////////////////////////////////////////////////////////////////////////// - struct new_connection - { - boost::promise<boost::asio::ip::tcp::socket> result_; - boost::asio::ip::tcp::socket socket_; - - explicit new_connection(boost::asio::io_service& io_service) - : result_(), socket_(io_service) - {} - }; - const auto shared = std::make_shared<new_connection>(GET_IO_SERVICE(timeout)); + const auto shared = std::make_shared<new_connection>(MONERO_GET_EXECUTOR(timeout)); timeout.async_wait([shared] (boost::system::error_code error) { if (error != boost::system::errc::operation_canceled && shared && shared->socket_.is_open()) @@ -66,7 +75,7 @@ namespace net_utils shared->socket_.close(); } }); - shared->socket_.async_connect(*iterator, [shared] (boost::system::error_code error) + shared->socket_.async_connect(*results.begin(), [shared] (boost::system::error_code error) { if (shared) { diff --git a/contrib/epee/src/net_ssl.cpp b/contrib/epee/src/net_ssl.cpp index 9200796a8..aef37844e 100644 --- a/contrib/epee/src/net_ssl.cpp +++ b/contrib/epee/src/net_ssl.cpp @@ -29,6 +29,7 @@ #include <string.h> #include <thread> +#include <boost/asio/post.hpp> #include <boost/asio/ssl.hpp> #include <boost/cerrno.hpp> #include <boost/filesystem/operations.hpp> @@ -45,6 +46,13 @@ #undef MONERO_DEFAULT_LOG_CATEGORY #define MONERO_DEFAULT_LOG_CATEGORY "net.ssl" + +#if BOOST_VERSION >= 107300 + #define MONERO_HOSTNAME_VERIFY boost::asio::ssl::host_name_verification +#else + #define MONERO_HOSTNAME_VERIFY boost::asio::ssl::rfc2818_verification +#endif + // openssl genrsa -out /tmp/KEY 4096 // openssl req -new -key /tmp/KEY -out /tmp/REQ // openssl x509 -req -days 999999 -sha256 -in /tmp/REQ -signkey /tmp/KEY -out /tmp/CERT @@ -526,7 +534,7 @@ void ssl_options_t::configure( // preverified means it passed system or user CA check. System CA is never loaded // when fingerprints are whitelisted. const bool verified = preverified && - (verification != ssl_verification_t::system_ca || host.empty() || boost::asio::ssl::rfc2818_verification(host)(preverified, ctx)); + (verification != ssl_verification_t::system_ca || host.empty() || MONERO_HOSTNAME_VERIFY(host)(preverified, ctx)); if (!verified && !has_fingerprint(ctx)) { @@ -544,6 +552,7 @@ void ssl_options_t::configure( } bool ssl_options_t::handshake( + boost::asio::io_context& io_context, boost::asio::ssl::stream<boost::asio::ip::tcp::socket> &socket, boost::asio::ssl::stream_base::handshake_type type, boost::asio::const_buffer buffer, @@ -555,12 +564,11 @@ bool ssl_options_t::handshake( auto start_handshake = [&]{ using ec_t = boost::system::error_code; using timer_t = boost::asio::steady_timer; - using strand_t = boost::asio::io_service::strand; + using strand_t = boost::asio::io_context::strand; using socket_t = boost::asio::ip::tcp::socket; - auto &io_context = GET_IO_SERVICE(socket); if (io_context.stopped()) - io_context.reset(); + io_context.restart(); strand_t strand(io_context); timer_t deadline(io_context, timeout); @@ -595,13 +603,13 @@ bool ssl_options_t::handshake( state.result = ec; if (!state.cancel_handshake) { state.cancel_timer = true; - ec_t ec; - deadline.cancel(ec); + deadline.cancel(); } }; deadline.async_wait(on_timer); - strand.post( + boost::asio::post( + strand, [&]{ socket.async_handshake( type, |
