diff --git a/ClientContext.h b/ClientContext.h index 73001934..db74a19e 100644 --- a/ClientContext.h +++ b/ClientContext.h @@ -66,6 +66,7 @@ namespace client AddressBook& GetAddressBook () { return m_AddressBook; }; const SAMBridge * GetSAMBridge () const { return m_SamBridge; }; + const I2CPServer * GetI2CPServer () const { return m_I2CPServer; }; std::vector > GetForwardInfosFor(const i2p::data::IdentHash & destination); diff --git a/HTTPServer.cpp b/HTTPServer.cpp index bf0a3159..b3bcf473 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -71,6 +71,7 @@ namespace http { const char HTTP_PAGE_TRANSPORTS[] = "transports"; const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations"; const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination"; + const char HTTP_PAGE_I2CP_LOCAL_DESTINATION[] = "i2cp_local_destination"; const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions"; const char HTTP_PAGE_SAM_SESSION[] = "sam_session"; const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels"; @@ -86,7 +87,8 @@ namespace http { const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; const char HTTP_PARAM_ADDRESS[] = "address"; - void ShowUptime (std::stringstream& s, int seconds) { + static void ShowUptime (std::stringstream& s, int seconds) + { int num; if ((num = seconds / 86400) > 0) { @@ -104,7 +106,7 @@ namespace http { s << seconds << " seconds"; } - void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, int bytes) + static void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, int bytes) { std::string state; switch (eState) { @@ -121,7 +123,7 @@ namespace http { s << " " << (int) (bytes / 1024) << " KiB
\r\n"; } - void ShowPageHead (std::stringstream& s) + static void ShowPageHead (std::stringstream& s) { s << "\r\n" @@ -156,7 +158,7 @@ namespace http { "
"; } - void ShowPageTail (std::stringstream& s) + static void ShowPageTail (std::stringstream& s) { s << "
\r\n" @@ -164,12 +166,12 @@ namespace http { "\r\n"; } - void ShowError(std::stringstream& s, const std::string& string) + static void ShowError(std::stringstream& s, const std::string& string) { s << "ERROR: " << string << "
\r\n"; } - void ShowStatus (std::stringstream& s) + static void ShowStatus (std::stringstream& s) { s << "Uptime: "; ShowUptime(s, i2p::context.GetUptime ()); @@ -265,18 +267,71 @@ namespace http { s << "Transit Tunnels: " << std::to_string(transitTunnelCount) << "
\r\n"; } - void ShowLocalDestinations (std::stringstream& s) + static void ShowLocalDestinations (std::stringstream& s) { s << "Local Destinations:
\r\n
\r\n"; for (auto& it: i2p::client::context.GetDestinations ()) { - auto ident = it.second->GetIdentHash ();; + auto ident = it.second->GetIdentHash (); s << ""; s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; } + + auto i2cpServer = i2p::client::context.GetI2CPServer (); + if (i2cpServer) + { + s << "
I2CP Local Destinations:
\r\n
\r\n"; + for (auto& it: i2cpServer->GetSessions ()) + { + auto ident = it.second->GetDestination ()->GetIdentHash (); + s << ""; + s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; + } + } } - void ShowLocalDestination (std::stringstream& s, const std::string& b32) + static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr dest) + { + s << "Base64:
\r\n
\r\n
\r\n"; + s << "LeaseSets: " << dest->GetNumRemoteLeaseSets () << "
\r\n"; + if(dest->GetNumRemoteLeaseSets()) + { + s << "
\r\n\r\n

\r\n"; + for(auto& it: dest->GetLeaseSets ()) + s << it.second->GetIdentHash ().ToBase32 () << "
\r\n"; + s << "

\r\n
\r\n"; + } + auto pool = dest->GetTunnelPool (); + if (pool) + { + s << "Inbound tunnels:
\r\n"; + for (auto & it : pool->GetInboundTunnels ()) { + it->Print(s); + if(it->LatencyIsKnown()) + s << " ( " << it->GetMeanLatency() << "ms )"; + ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ()); + } + s << "
\r\n"; + s << "Outbound tunnels:
\r\n"; + for (auto & it : pool->GetOutboundTunnels ()) { + it->Print(s); + if(it->LatencyIsKnown()) + s << " ( " << it->GetMeanLatency() << "ms )"; + ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ()); + } + } + s << "
\r\n"; + s << "Tags
Incoming: " << dest->GetNumIncomingTags () << "
Outgoing:
" << std::endl; + for (const auto& it: dest->GetSessions ()) + { + s << i2p::client::context.GetAddressBook ().ToAddress(it.first) << " "; + s << it.second->GetNumOutgoingTags () << "
" << std::endl; + } + s << "
" << std::endl; + } + + static void ShowLocalDestination (std::stringstream& s, const std::string& b32) { s << "Local Destination:
\r\n
\r\n"; i2p::data::IdentHash ident; @@ -284,55 +339,8 @@ namespace http { auto dest = i2p::client::context.FindLocalDestination (ident); if (dest) { - s << "Base64:
\r\n
\r\n
\r\n"; - s << "LeaseSets: " << dest->GetNumRemoteLeaseSets () << "
\r\n"; - if(dest->GetNumRemoteLeaseSets()) - { - s << "
\r\n\r\n

\r\n"; - for(auto& it: dest->GetLeaseSets ()) - s << it.second->GetIdentHash ().ToBase32 () << "
\r\n"; - s << "

\r\n
\r\n"; - } - auto pool = dest->GetTunnelPool (); - if (pool) - { - s << "Inbound tunnels:
\r\n"; - for (auto & it : pool->GetInboundTunnels ()) { - it->Print(s); - if(it->LatencyIsKnown()) - s << " ( " << it->GetMeanLatency() << "ms )"; - ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ()); - } - s << "
\r\n"; - s << "Outbound tunnels:
\r\n"; - for (auto & it : pool->GetOutboundTunnels ()) { - it->Print(s); - if(it->LatencyIsKnown()) - s << " ( " << it->GetMeanLatency() << "ms )"; - ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ()); - } - } - s << "
\r\n"; - s << "Tags
Incoming: " << dest->GetNumIncomingTags () << "
Outgoing:
" << std::endl; - for (const auto& it: dest->GetSessions ()) - { - s << i2p::client::context.GetAddressBook ().ToAddress(it.first) << " "; - s << it.second->GetNumOutgoingTags () << "
" << std::endl; - } - s << "
" << std::endl; - // s << "
\r\nStreams:
\r\n"; - // for (auto it: dest->GetStreamingDestination ()->GetStreams ()) - // { - // s << it.first << "->" << i2p::client::context.GetAddressBook ().ToAddress(it.second->GetRemoteIdentity ()) << " "; - // s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; - // s << " [out:" << it.second->GetSendQueueSize () << "][in:" << it.second->GetReceiveQueueSize () << "]"; - // s << "[buf:" << it.second->GetSendBufferSize () << "]"; - // s << "[RTT:" << it.second->GetRTT () << "]"; - // s << "[Window:" << it.second->GetWindowSize () << "]"; - // s << "[Status:" << (int)it.second->GetStatus () << "]"; - // s << "
\r\n"<< std::endl; - // } + ShowLeaseSetDestination (s, dest); + // show streams s << "
\r\n"; s << ""; s << ""; @@ -365,7 +373,23 @@ namespace http { } } - void ShowLeasesSets(std::stringstream& s) + static void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id) + { + auto i2cpServer = i2p::client::context.GetI2CPServer (); + if (i2cpServer) + { + s << "I2CP Local Destination:
\r\n
\r\n"; + auto it = i2cpServer->GetSessions ().find (std::stoi (id)); + if (it != i2cpServer->GetSessions ().end ()) + ShowLeaseSetDestination (s, it->second->GetDestination ()); + else + ShowError(s, "I2CP session not found"); + } + else + ShowError(s, "I2CP is not enabled"); + } + + static void ShowLeasesSets(std::stringstream& s) { s << "
LeaseSets (click on to show info):

\r\n"; int counter = 1; @@ -398,7 +422,7 @@ namespace http { // end for each lease set } - void ShowTunnels (std::stringstream& s) + static void ShowTunnels (std::stringstream& s) { s << "Queue size: " << i2p::tunnel::tunnels.GetQueueSize () << "
\r\n"; @@ -420,7 +444,7 @@ namespace http { s << "
\r\n"; } - void ShowCommands (std::stringstream& s) + static void ShowCommands (std::stringstream& s) { /* commands */ s << "Router Commands
\r\n"; @@ -442,7 +466,7 @@ namespace http { s << " Force shutdown
\r\n"; } - void ShowTransitTunnels (std::stringstream& s) + static void ShowTransitTunnels (std::stringstream& s) { s << "Transit tunnels:
\r\n
\r\n"; for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ()) @@ -457,7 +481,7 @@ namespace http { } } - void ShowTransports (std::stringstream& s) + static void ShowTransports (std::stringstream& s) { s << "Transports:
\r\n
\r\n"; auto ntcpServer = i2p::transport::transports.GetNTCPServer (); @@ -506,7 +530,7 @@ namespace http { } } - void ShowSAMSessions (std::stringstream& s) + static void ShowSAMSessions (std::stringstream& s) { auto sam = i2p::client::context.GetSAMBridge (); if (!sam) { @@ -521,7 +545,7 @@ namespace http { } } - void ShowSAMSession (std::stringstream& s, const std::string& id) + static void ShowSAMSession (std::stringstream& s, const std::string& id) { s << "SAM Session:
\r\n
\r\n"; auto sam = i2p::client::context.GetSAMBridge (); @@ -553,7 +577,7 @@ namespace http { } } - void ShowI2PTunnels (std::stringstream& s) + static void ShowI2PTunnels (std::stringstream& s) { s << "Client Tunnels:
\r\n
\r\n"; for (auto& it: i2p::client::context.GetClientTunnels ()) @@ -743,6 +767,8 @@ namespace http { ShowLocalDestinations (s); else if (page == HTTP_PAGE_LOCAL_DESTINATION) ShowLocalDestination (s, params["b32"]); + else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION) + ShowI2CPLocalDestination (s, params["i2cp_id"]); else if (page == HTTP_PAGE_SAM_SESSIONS) ShowSAMSessions (s); else if (page == HTTP_PAGE_SAM_SESSION) diff --git a/I2CP.h b/I2CP.h index 4964c575..4033d9cd 100644 --- a/I2CP.h +++ b/I2CP.h @@ -112,6 +112,7 @@ namespace client void Start (); void Stop (); uint16_t GetSessionID () const { return m_SessionID; }; + std::shared_ptr GetDestination () const { return m_Destination; }; // called from I2CPDestination void SendI2CPMessage (uint8_t type, const uint8_t * payload, size_t len); @@ -196,6 +197,9 @@ namespace client public: const decltype(m_MessagesHandlers)& GetMessagesHandlers () const { return m_MessagesHandlers; }; + + // for HTTP + const decltype(m_Sessions)& GetSessions () const { return m_Sessions; }; }; } }
Streams
StreamIDDestination