From c1a29b08acee79afd41104afe86189bffc4932a9 Mon Sep 17 00:00:00 2001 From: "Francisco Blas (klondike) Izquierdo Riera" Date: Wed, 7 Jan 2015 21:50:12 +0100 Subject: [PATCH 1/2] Remove ClientContext.h dependency --- AddressBook.h | 4 +++- Destination.cpp | 4 ++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/AddressBook.h b/AddressBook.h index 5b24c017..1d22018e 100644 --- a/AddressBook.h +++ b/AddressBook.h @@ -23,6 +23,8 @@ namespace client const int CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT = 240; // in minutes const int CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT = 5; // in minutes const int SUBSCRIPTION_REQUEST_TIMEOUT = 60; //in second + + inline std::string GetB32Address(const i2p::data::IdentHash& ident) { return ident.ToBase32().append(".b32.i2p"); } class AddressBookStorage // interface for storage { @@ -55,7 +57,7 @@ namespace client void LoadHostsFromStream (std::istream& f); void DownloadComplete (bool success); //This method returns the ".b32.i2p" address - std::string ToAddress(const i2p::data::IdentHash& ident) { return ident.ToBase32().append(".b32.i2p"); } + std::string ToAddress(const i2p::data::IdentHash& ident) { return GetB32Address(ident); } std::string ToAddress(const i2p::data::IdentityEx& ident) { return ToAddress(ident.GetIdentHash ()); } private: diff --git a/Destination.cpp b/Destination.cpp index abaf0de0..77cae1d0 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -6,7 +6,7 @@ #include "ElGamal.h" #include "Timestamp.h" #include "NetDb.h" -#include "ClientContext.h" +#include "AddressBook.h" #include "Destination.h" namespace i2p @@ -47,7 +47,7 @@ namespace client } m_Pool = i2p::tunnel::tunnels.CreateTunnelPool (this, inboundTunnelLen, outboundTunnelLen); if (m_IsPublic) - LogPrint (eLogInfo, "Local address ", i2p::client::context.GetAddressBook ().ToAddress(GetIdentHash()), " created"); + LogPrint (eLogInfo, "Local address ", i2p::client::GetB32Address(GetIdentHash()), " created"); m_StreamingDestination = new i2p::stream::StreamingDestination (*this); // TODO: } From b3232b42db7a39e22bf0cd96ccd33dde36a19393 Mon Sep 17 00:00:00 2001 From: "Francisco Blas (klondike) Izquierdo Riera" Date: Wed, 7 Jan 2015 21:52:40 +0100 Subject: [PATCH 2/2] Use shared_from_this to avoid being killed easily on stop --- HTTPProxy.cpp | 6 +++--- I2PService.h | 15 +++++++++------ SOCKS.cpp | 16 ++++++++++------ 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/HTTPProxy.cpp b/HTTPProxy.cpp index 22940592..b99c63b2 100644 --- a/HTTPProxy.cpp +++ b/HTTPProxy.cpp @@ -62,7 +62,7 @@ namespace proxy LogPrint(eLogDebug,"--- HTTP Proxy async sock read"); if(m_sock) { m_sock->async_receive(boost::asio::buffer(m_http_buff, http_buffer_size), - std::bind(&HTTPProxyHandler::HandleSockRecv, this, + std::bind(&HTTPProxyHandler::HandleSockRecv, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } else { LogPrint(eLogError,"--- HTTP Proxy no socket for read"); @@ -86,7 +86,7 @@ namespace proxy { std::string response = "HTTP/1.0 500 Internal Server Error\r\nContent-type: text/html\r\nContent-length: 0\r\n"; boost::asio::async_write(*m_sock, boost::asio::buffer(response,response.size()), - std::bind(&HTTPProxyHandler::SentHTTPFailed, this, std::placeholders::_1)); + std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1)); } void HTTPProxyHandler::EnterState(HTTPProxyHandler::state nstate) { @@ -197,7 +197,7 @@ namespace proxy if (m_state == DONE) { LogPrint(eLogInfo,"--- HTTP Proxy requested: ", m_url); GetOwner()->CreateStream (std::bind (&HTTPProxyHandler::HandleStreamRequestComplete, - this, std::placeholders::_1), m_address, m_port); + shared_from_this(), std::placeholders::_1), m_address, m_port); } else { AsyncSockRead(); } diff --git a/I2PService.h b/I2PService.h index 5345ab6d..6d9e878f 100644 --- a/I2PService.h +++ b/I2PService.h @@ -21,24 +21,27 @@ namespace client I2PService (i2p::data::SigningKeyType kt); virtual ~I2PService () { ClearHandlers (); } - inline void AddHandler (std::shared_ptr conn) { + inline void AddHandler (std::shared_ptr conn) + { std::unique_lock l(m_HandlersMutex); m_Handlers.insert(conn); } - inline void RemoveHandler (std::shared_ptr conn) { + inline void RemoveHandler (std::shared_ptr conn) + { std::unique_lock l(m_HandlersMutex); m_Handlers.erase(conn); } - inline void ClearHandlers () { + inline void ClearHandlers () + { std::unique_lock l(m_HandlersMutex); m_Handlers.clear(); } - inline ClientDestination * GetLocalDestination () { return m_LocalDestination; }; - inline void SetLocalDestination (ClientDestination * dest) { m_LocalDestination = dest; }; + inline ClientDestination * GetLocalDestination () { return m_LocalDestination; } + inline void SetLocalDestination (ClientDestination * dest) { m_LocalDestination = dest; } void CreateStream (StreamRequestComplete streamRequestComplete, const std::string& dest, int port = 0); - inline boost::asio::io_service& GetService () { return m_LocalDestination->GetService (); }; + inline boost::asio::io_service& GetService () { return m_LocalDestination->GetService (); } virtual void Start () = 0; virtual void Stop () = 0; diff --git a/SOCKS.cpp b/SOCKS.cpp index 068b4499..d4db0767 100644 --- a/SOCKS.cpp +++ b/SOCKS.cpp @@ -137,7 +137,7 @@ namespace proxy LogPrint(eLogDebug,"--- SOCKS async sock read"); if(m_sock) { m_sock->async_receive(boost::asio::buffer(m_sock_buff, socks_buffer_size), - std::bind(&SOCKSHandler::HandleSockRecv, this, + std::bind(&SOCKSHandler::HandleSockRecv, shared_from_this(), std::placeholders::_1, std::placeholders::_2)); } else { LogPrint(eLogError,"--- SOCKS no socket for read"); @@ -204,11 +204,13 @@ namespace proxy boost::asio::const_buffers_1 response(m_response,2); if (m_authchosen == AUTH_UNACCEPTABLE) { LogPrint(eLogWarning,"--- SOCKS5 authentication negotiation failed"); - boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksFailed, this, std::placeholders::_1)); + boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksFailed, + shared_from_this(), std::placeholders::_1)); return false; } else { LogPrint(eLogDebug,"--- SOCKS5 choosing authentication method: ", m_authchosen); - boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksResponse, this, std::placeholders::_1)); + boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksResponse, + shared_from_this(), std::placeholders::_1)); return true; } } @@ -229,7 +231,8 @@ namespace proxy response = GenerateSOCKS5Response(error, m_addrtype, m_address, m_port); break; } - boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksFailed, this, std::placeholders::_1)); + boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksFailed, + shared_from_this(), std::placeholders::_1)); } void SOCKSHandler::SocksRequestSuccess() @@ -249,7 +252,8 @@ namespace proxy response = GenerateSOCKS5Response(SOCKS5_OK, ADDR_DNS, ad, m_stream->GetRecvStreamID()); break; } - boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksDone, this, std::placeholders::_1)); + boost::asio::async_write(*m_sock, response, std::bind(&SOCKSHandler::SentSocksDone, + shared_from_this(), std::placeholders::_1)); } void SOCKSHandler::EnterState(SOCKSHandler::state nstate, uint8_t parseleft) { @@ -455,7 +459,7 @@ namespace proxy if (m_state == DONE) { LogPrint(eLogInfo,"--- SOCKS requested ", m_address.dns.ToString(), ":" , m_port); GetOwner()->CreateStream ( std::bind (&SOCKSHandler::HandleStreamRequestComplete, - this, std::placeholders::_1), m_address.dns.ToString(), m_port); + shared_from_this(), std::placeholders::_1), m_address.dns.ToString(), m_port); } else { AsyncSockRead(); }