From a17f07495a94dabeb06b9ce67827cd258b40df49 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Wed, 19 Jul 2017 00:21:02 +0300 Subject: [PATCH] add socks.outproxy.enable option --- libi2pd/Config.cpp | 3 ++- libi2pd_client/ClientContext.cpp | 20 ++++++++++++-------- libi2pd_client/SOCKS.cpp | 12 ++++++------ libi2pd_client/SOCKS.h | 15 ++++++--------- 4 files changed, 26 insertions(+), 24 deletions(-) diff --git a/libi2pd/Config.cpp b/libi2pd/Config.cpp index 0ca3674a..0097eb30 100644 --- a/libi2pd/Config.cpp +++ b/libi2pd/Config.cpp @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2016, The PurpleI2P Project +* Copyright (c) 2013-2017, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -112,6 +112,7 @@ namespace config { ("socksproxy.outbound.quantity", value()->default_value("5"), "SOCKS proxy outbound tunnels quantity") ("socksproxy.latency.min", value()->default_value("0"), "SOCKS proxy min latency for tunnels") ("socksproxy.latency.max", value()->default_value("0"), "SOCKS proxy max latency for tunnels") + ("socksproxy.outproxy.enabled", value()->default_value(false), "Enable or disable SOCKS outproxy") ("socksproxy.outproxy", value()->default_value("127.0.0.1"), "Upstream outproxy address for SOCKS Proxy") ("socksproxy.outproxyport", value()->default_value(9050), "Upstream outproxy port for SOCKS Proxy") ; diff --git a/libi2pd_client/ClientContext.cpp b/libi2pd_client/ClientContext.cpp index d8a9d84f..1c5d99d0 100644 --- a/libi2pd_client/ClientContext.cpp +++ b/libi2pd_client/ClientContext.cpp @@ -78,9 +78,10 @@ namespace client bool socksproxy; i2p::config::GetOption("socksproxy.enabled", socksproxy); if (socksproxy) { - std::string socksProxyKeys; i2p::config::GetOption("socksproxy.keys", socksProxyKeys); - std::string socksProxyAddr; i2p::config::GetOption("socksproxy.address", socksProxyAddr); - uint16_t socksProxyPort; i2p::config::GetOption("socksproxy.port", socksProxyPort); + std::string socksProxyKeys; i2p::config::GetOption("socksproxy.keys", socksProxyKeys); + std::string socksProxyAddr; i2p::config::GetOption("socksproxy.address", socksProxyAddr); + uint16_t socksProxyPort; i2p::config::GetOption("socksproxy.port", socksProxyPort); + bool socksOutProxy; i2p::config::GetOption("socksproxy.outproxy.enabled", socksOutProxy); std::string socksOutProxyAddr; i2p::config::GetOption("socksproxy.outproxy", socksOutProxyAddr); uint16_t socksOutProxyPort; i2p::config::GetOption("socksproxy.outproxyport", socksOutProxyPort); i2p::data::SigningKeyType sigType; i2p::config::GetOption("socksproxy.signaturetype", sigType); @@ -97,11 +98,14 @@ namespace client else LogPrint(eLogError, "Clients: failed to load SOCKS Proxy key"); } - try { - m_SocksProxy = new i2p::proxy::SOCKSProxy(socksProxyAddr, socksProxyPort, socksOutProxyAddr, socksOutProxyPort, localDestination); - m_SocksProxy->Start(); - } catch (std::exception& e) { - LogPrint(eLogError, "Clients: Exception in SOCKS Proxy: ", e.what()); + try + { + m_SocksProxy = new i2p::proxy::SOCKSProxy(socksProxyAddr, socksProxyPort, socksOutProxy, socksOutProxyAddr, socksOutProxyPort, localDestination); + m_SocksProxy->Start(); + } + catch (std::exception& e) + { + LogPrint(eLogError, "Clients: Exception in SOCKS Proxy: ", e.what()); } } diff --git a/libi2pd_client/SOCKS.cpp b/libi2pd_client/SOCKS.cpp index ef6bd73f..c68a7e58 100644 --- a/libi2pd_client/SOCKS.cpp +++ b/libi2pd_client/SOCKS.cpp @@ -765,18 +765,18 @@ namespace proxy m_upstreamSock = std::make_shared(service); boost::asio::async_connect(*m_upstreamSock, itr, std::bind(&SOCKSHandler::HandleUpstreamConnected, - shared_from_this(), std::placeholders::_1, std::placeholders::_2)); + shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } - - SOCKSServer::SOCKSServer(const std::string& address, int port, const std::string& outAddress, uint16_t outPort, + + SOCKSServer::SOCKSServer(const std::string& address, int port, bool outEnable, const std::string& outAddress, uint16_t outPort, std::shared_ptr localDestination) : - TCPIPAcceptor (address, port, localDestination ? localDestination : i2p::client::context.GetSharedLocalDestination ()) + TCPIPAcceptor (address, port, localDestination ? localDestination : i2p::client::context.GetSharedLocalDestination ()) { m_UseUpstreamProxy = false; - if (outAddress.length() > 0) + if (outAddress.length() > 0 && outEnable) SetUpstreamProxy(outAddress, outPort); } - + std::shared_ptr SOCKSServer::CreateHandler(std::shared_ptr socket) { return std::make_shared (this, socket, m_UpstreamProxyAddress, m_UpstreamProxyPort, m_UseUpstreamProxy); diff --git a/libi2pd_client/SOCKS.h b/libi2pd_client/SOCKS.h index d417c4a0..a61287f3 100644 --- a/libi2pd_client/SOCKS.h +++ b/libi2pd_client/SOCKS.h @@ -14,27 +14,24 @@ namespace proxy class SOCKSServer: public i2p::client::TCPIPAcceptor { public: - - SOCKSServer(const std::string& address, int port, const std::string& outAddress, uint16_t outPort, + SOCKSServer(const std::string& address, int port, bool outEnable, const std::string& outAddress, uint16_t outPort, std::shared_ptr localDestination = nullptr); ~SOCKSServer() {}; void SetUpstreamProxy(const std::string & addr, const uint16_t port); - + protected: // Implements TCPIPAcceptor std::shared_ptr CreateHandler(std::shared_ptr socket); const char* GetName() { return "SOCKS"; } - private: - std::string m_UpstreamProxyAddress; - uint16_t m_UpstreamProxyPort; - bool m_UseUpstreamProxy; + private: + std::string m_UpstreamProxyAddress; + uint16_t m_UpstreamProxyPort; + bool m_UseUpstreamProxy; }; typedef SOCKSServer SOCKSProxy; } } - - #endif