From 8d75d518031a3cc350821152d214d2f4a22c482f Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 24 Oct 2014 13:36:55 -0400 Subject: [PATCH] don't specify RI for inbound NTCP connections --- HTTPServer.cpp | 6 +++--- NTCPSession.cpp | 24 +++++++++++++++--------- NTCPSession.h | 13 +++++-------- Transports.cpp | 4 ++-- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index b4c7f1dc..3a0aedc9 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -701,12 +701,12 @@ namespace util s << "NTCP
"; for (auto it: i2p::transport::transports.GetNTCPSessions ()) { - // RouterInfo of incoming connection doesn't have address - bool outgoing = it.second->GetRemoteRouterInfo ().GetNTCPAddress (); if (it.second->IsEstablished ()) { + // incoming connection doesn't have remote RI + bool outgoing = it.second->GetRemoteRouterInfo (); if (outgoing) s << "-->"; - s << it.second->GetRemoteRouterInfo ().GetIdentHashAbbreviation () << ": " + s << it.second->GetRemoteRouterIdentity ().GetIdentHash ().ToBase64 ().substr (0, 4) << ": " << it.second->GetSocket ().remote_endpoint().address ().to_string (); if (!outgoing) s << "-->"; s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; diff --git a/NTCPSession.cpp b/NTCPSession.cpp index 1cdbca48..5a41bada 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -18,7 +18,7 @@ namespace i2p { namespace transport { - NTCPSession::NTCPSession (boost::asio::io_service& service, i2p::data::RouterInfo& in_RemoteRouterInfo): + NTCPSession::NTCPSession (boost::asio::io_service& service, i2p::data::RouterInfo * in_RemoteRouterInfo): m_Socket (service), m_TerminationTimer (service), m_IsEstablished (false), m_RemoteRouterInfo (in_RemoteRouterInfo), m_ReceiveBufferOffset (0), m_NextMessage (nullptr), m_NumSentBytes (0), m_NumReceivedBytes (0) @@ -81,7 +81,8 @@ namespace transport for (auto it :m_DelayedMessages) { // try to send them again - transports.SendMessage (m_RemoteRouterInfo.GetIdentHash (), it); + if (m_RemoteRouterInfo) + transports.SendMessage (m_RemoteRouterInfo->GetIdentHash (), it); numDelayed++; } m_DelayedMessages.clear (); @@ -117,9 +118,14 @@ namespace transport void NTCPSession::ClientLogin () { + if (!m_RemoteRouterInfo) + { + LogPrint ("Remote router info is not set"); + Terminate (); + } if (!m_DHKeysPair) m_DHKeysPair = transports.GetNextDHKeysPair (); - m_RemoteRouterIdentity = m_RemoteRouterInfo. GetRouterIdentity (); + m_RemoteRouterIdentity = m_RemoteRouterInfo->GetRouterIdentity (); // send Phase1 const uint8_t * x = m_DHKeysPair->publicKey; memcpy (m_Establisher->phase1.pubKey, x, 256); @@ -237,7 +243,7 @@ namespace transport LogPrint ("Phase 2 read error: ", ecode.message (), ". Wrong ident assumed"); if (ecode != boost::asio::error::operation_aborted) { - GetRemoteRouterInfo ().SetUnreachable (true); // this RouterInfo is not valid + m_RemoteRouterInfo->SetUnreachable (true); // this RouterInfo is not valid transports.ReuseDHKeysPair (m_DHKeysPair); m_DHKeysPair = nullptr; Terminate (); @@ -282,7 +288,7 @@ namespace transport SignedData s; memcpy (s.x, m_Establisher->phase1.pubKey, 256); memcpy (s.y, m_Establisher->phase2.pubKey, 256); - memcpy (s.ident, m_RemoteRouterInfo.GetIdentHash (), 32); + memcpy (s.ident, m_RemoteRouterIdentity.GetIdentHash (), 32); s.tsA = tsA; s.tsB = m_Establisher->phase2.encrypted.timestamp; i2p::context.Sign ((uint8_t *)&s, sizeof (s), m_Establisher->phase3.signature); @@ -382,7 +388,7 @@ namespace transport LogPrint ("Phase 4 read error: ", ecode.message ()); if (ecode != boost::asio::error::operation_aborted) { - GetRemoteRouterInfo ().SetUnreachable (true); // this router doesn't like us + m_RemoteRouterInfo->SetUnreachable (true); // this router doesn't like us Terminate (); } } @@ -594,8 +600,7 @@ namespace transport NTCPClient::NTCPClient (boost::asio::io_service& service, const boost::asio::ip::address& address, int port, i2p::data::RouterInfo& in_RouterInfo): - NTCPSession (service, in_RouterInfo), - m_Endpoint (address, port) + NTCPSession (service, &in_RouterInfo), m_Endpoint (address, port) { Connect (); } @@ -614,7 +619,8 @@ namespace transport LogPrint ("Connect error: ", ecode.message ()); if (ecode != boost::asio::error::operation_aborted) { - GetRemoteRouterInfo ().SetUnreachable (true); + if (GetRemoteRouterInfo ()) + GetRemoteRouterInfo ()->SetUnreachable (true); Terminate (); } } diff --git a/NTCPSession.h b/NTCPSession.h index 112144a1..1af00eba 100644 --- a/NTCPSession.h +++ b/NTCPSession.h @@ -71,12 +71,13 @@ namespace transport { public: - NTCPSession (boost::asio::io_service& service, i2p::data::RouterInfo& in_RemoteRouterInfo); + NTCPSession (boost::asio::io_service& service, i2p::data::RouterInfo * in_RemoteRouterInfo = nullptr); virtual ~NTCPSession (); boost::asio::ip::tcp::socket& GetSocket () { return m_Socket; }; bool IsEstablished () const { return m_IsEstablished; }; - i2p::data::RouterInfo& GetRemoteRouterInfo () { return m_RemoteRouterInfo; }; + i2p::data::RouterInfo * GetRemoteRouterInfo () { return m_RemoteRouterInfo; }; + const i2p::data::IdentityEx& GetRemoteRouterIdentity () { return m_RemoteRouterIdentity; }; void ClientLogin (); void ServerLogin (); @@ -134,7 +135,7 @@ namespace transport i2p::crypto::CBCEncryption m_Encryption; CryptoPP::Adler32 m_Adler; - i2p::data::RouterInfo& m_RemoteRouterInfo; + i2p::data::RouterInfo * m_RemoteRouterInfo; i2p::data::IdentityEx m_RemoteRouterIdentity; struct Establisher @@ -176,15 +177,11 @@ namespace transport public: NTCPServerConnection (boost::asio::io_service& service): - NTCPSession (service, m_DummyRemoteRouterInfo) {}; + NTCPSession (service) {}; protected: virtual void Connected (); - - private: - - i2p::data::RouterInfo m_DummyRemoteRouterInfo; }; } } diff --git a/Transports.cpp b/Transports.cpp index 6747febd..4661d439 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -184,13 +184,13 @@ namespace transport void Transports::AddNTCPSession (NTCPSession * session) { if (session) - m_NTCPSessions[session->GetRemoteRouterInfo ().GetIdentHash ()] = session; + m_NTCPSessions[session->GetRemoteRouterIdentity ().GetIdentHash ()] = session; } void Transports::RemoveNTCPSession (NTCPSession * session) { if (session) - m_NTCPSessions.erase (session->GetRemoteRouterInfo ().GetIdentHash ()); + m_NTCPSessions.erase (session->GetRemoteRouterIdentity ().GetIdentHash ()); } void Transports::HandleAccept (NTCPServerConnection * conn, const boost::system::error_code& error)