From c9e4e78f41bc79c13cc9364984a008a6929a4019 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Sun, 1 May 2022 23:25:08 +0300 Subject: [PATCH] [webconsole] remove version from title, move tunnel chain print from Tunnel class Signed-off-by: R4SAS --- daemon/HTTPServer.cpp | 99 +++++++++++++++++++++++++++++++------------ libi2pd/Tunnel.cpp | 33 ++------------- libi2pd/Tunnel.h | 14 +++--- 3 files changed, 79 insertions(+), 67 deletions(-) diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 1d3d7a5d..97295b59 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -182,7 +182,7 @@ namespace http { " \r\n" " \r\n" " \r\n" - " Purple I2P " VERSION " Webconsole\r\n"; + " Purple I2P Webconsole\r\n"; GetStyles(s); s << "\r\n" @@ -196,8 +196,10 @@ namespace http { if (i2p::context.IsFloodfill ()) s << " " << tr("LeaseSets") << "
\r\n"; s << - " " << tr("Tunnels") << "
\r\n" - " " << tr("Transit Tunnels") << "
\r\n" + " " << tr("Tunnels") << "
\r\n"; + if (i2p::context.AcceptsTunnels () || i2p::tunnel::tunnels.CountTransitTunnels()) + s << " " << tr("Transit Tunnels") << "
\r\n"; + s << " " << tr ("Transports") << "
\r\n" " " << tr("I2P tunnels") << "
\r\n"; if (i2p::client::context.GetSAMBridge ()) @@ -295,10 +297,10 @@ namespace http { s << " (" << (double) i2p::transport::transports.GetTransitBandwidth () / 1024 << " " << tr(/* tr: Kibibit/s */ "KiB/s") << ")
\r\n"; s << "" << tr("Data path") << ": " << i2p::fs::GetUTF8DataDir() << "
\r\n"; s << "
"; - if((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) { + if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) { s << "\r\n\r\n
\r\n"; } - if(includeHiddenContent) { + if (includeHiddenContent) { s << "" << tr("Router Ident") << ": " << i2p::context.GetRouterInfo().GetIdentHashBase64() << "
\r\n"; if (!i2p::context.GetRouterInfo().GetProperty("family").empty()) s << "" << tr("Router Family") << ": " << i2p::context.GetRouterInfo().GetProperty("family") << "
\r\n"; @@ -318,31 +320,31 @@ namespace http { break; case i2p::data::RouterInfo::eTransportSSU2: s << "SSU2"; - break; + break; default: s << tr("Unknown"); } if (address->IsV6 ()) - { + { if (address->IsV4 ()) s << "v4"; s << "v6"; - } + } s << "\r\n"; if (address->published) s << "" << address->host.to_string() << ":" << address->port << "\r\n"; else - { + { s << "" << tr("supported"); if (address->port) - s << " :" << address->port; + s << " :" << address->port; s << "\r\n"; - } + } s << "\r\n"; } s << "\r\n"; } s << "
\r\n
\r\n"; - if(outputFormat == OutputFormatEnum::forQtUi) { + if (outputFormat == OutputFormatEnum::forQtUi) { s << "
"; } s << "" << tr("Routers") << ": " << i2p::data::netdb.GetNumRouters () << " "; @@ -356,7 +358,7 @@ namespace http { s << "" << tr("Client Tunnels") << ": " << std::to_string(clientTunnelCount) << " "; s << "" << tr("Transit Tunnels") << ": " << std::to_string(transitTunnelCount) << "
\r\n
\r\n"; - if(outputFormat==OutputFormatEnum::forWebConsole) { + if (outputFormat==OutputFormatEnum::forWebConsole) { bool httpproxy = i2p::client::context.GetHttpProxy () ? true : false; bool socksproxy = i2p::client::context.GetSocksProxy () ? true : false; bool bob = i2p::client::context.GetBOBCommandChannel () ? true : false; @@ -417,7 +419,7 @@ namespace http { s << "\r\n\r\n"; } - if(dest->IsPublic() && token) + if (dest->IsPublic() && token) { std::string webroot; i2p::config::GetOption("http.webroot", webroot); auto base32 = dest->GetIdentHash ().ToBase32 (); @@ -431,7 +433,7 @@ namespace http { "\r\n" << tr("Note: result string can be used only for registering 2LD domains (example.i2p). For registering subdomains please use i2pd-tools.") << "\r\n\r\n\r\n
\r\n"; } - if(dest->GetNumRemoteLeaseSets()) + if (dest->GetNumRemoteLeaseSets()) { s << "
\r\n\r\n
\r\n"; @@ -447,8 +449,18 @@ namespace http { s << "" << tr("Inbound tunnels") << ":
\r\n
\r\n"; for (auto & it : pool->GetInboundTunnels ()) { s << "
"; - it->Print(s); - if(it->LatencyIsKnown()) + // for each tunnel hop if not zero-hop + if (it->GetNumHops ()) + { + it->VisitTunnelHops( + [&s](std::shared_ptr hopIdent) + { + s << "⇒ " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " "; + } + ); + } + s << "⇒ " << it->GetTunnelID () << ":me"; + if (it->LatencyIsKnown()) s << " ( " << it->GetMeanLatency() << tr(/* tr: Milliseconds */ "ms") << " )"; ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ()); s << "
\r\n"; @@ -457,8 +469,18 @@ namespace http { s << "" << tr("Outbound tunnels") << ":
\r\n
\r\n"; for (auto & it : pool->GetOutboundTunnels ()) { s << "
"; - it->Print(s); - if(it->LatencyIsKnown()) + s << it->GetTunnelID () << ":me ⇒"; + // for each tunnel hop if not zero-hop + if (it->GetNumHops ()) + { + it->VisitTunnelHops( + [&s](std::shared_ptr hopIdent) + { + s << " " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ⇒"; + } + ); + } + if (it->LatencyIsKnown()) s << " ( " << it->GetMeanLatency() << tr("ms") << " )"; ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ()); s << "
\r\n"; @@ -631,8 +653,17 @@ namespace http { s << "" << tr("Inbound tunnels") << ":
\r\n
\r\n"; for (auto & it : i2p::tunnel::tunnels.GetInboundTunnels ()) { s << "
"; - it->Print(s); - if(it->LatencyIsKnown()) + if (it->GetNumHops ()) + { + it->VisitTunnelHops( + [&s](std::shared_ptr hopIdent) + { + s << "⇒ " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " "; + } + ); + } + s << "⇒ " << it->GetTunnelID () << ":me"; + if (it->LatencyIsKnown()) s << " ( " << it->GetMeanLatency() << tr("ms") << " )"; ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumReceivedBytes ()); s << "
\r\n"; @@ -641,8 +672,18 @@ namespace http { s << "" << tr("Outbound tunnels") << ":
\r\n
\r\n"; for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnels ()) { s << "
"; - it->Print(s); - if(it->LatencyIsKnown()) + s << it->GetTunnelID () << ":me ⇒"; + // for each tunnel hop if not zero-hop + if (it->GetNumHops ()) + { + it->VisitTunnelHops( + [&s](std::shared_ptr hopIdent) + { + s << " " << i2p::data::GetIdentHashAbbreviation (hopIdent->GetIdentHash ()) << " ⇒"; + } + ); + } + if (it->LatencyIsKnown()) s << " ( " << it->GetMeanLatency() << tr("ms") << " )"; ShowTunnelDetails(s, it->GetState (), (it->GetTunnelPool () == ExplPool), it->GetNumSentBytes ()); s << "
\r\n"; @@ -714,7 +755,7 @@ namespace http { void ShowTransitTunnels (std::stringstream& s) { - if(i2p::tunnel::tunnels.CountTransitTunnels()) + if (i2p::tunnel::tunnels.CountTransitTunnels()) { s << "" << tr("Transit Tunnels") << ":
\r\n
\r\n"; for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ()) @@ -848,7 +889,7 @@ namespace http { return; } - if(sam->GetSessions ().size ()) + if (sam->GetSessions ().size ()) { s << "" << tr("SAM sessions") << ":
\r\n
\r\n"; for (auto& it: sam->GetSessions ()) @@ -1065,6 +1106,7 @@ namespace http { SendReply(res, content); return; } + bool strictheaders; i2p::config::GetOption("http.strictheaders", strictheaders); if (strictheaders) @@ -1087,6 +1129,7 @@ namespace http { return; } } + // HTML head start ShowPageHead (s); if (req.uri.find("page=") != std::string::npos) { @@ -1207,7 +1250,7 @@ namespace http { else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) { i2p::context.SetAcceptsTunnels (true); -#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID)) || defined(ANDROID_BINARY)) +#if ((!defined(WIN32) && !defined(QT_GUI_LIB) && !defined(ANDROID)) || defined(ANDROID_BINARY)) Daemon.gracefulShutdownInterval = 0; #elif defined(WIN32_APP) i2p::win32::StopGracefulShutdown (); @@ -1239,7 +1282,7 @@ namespace http { { if (dest) { - if(dest->DeleteStream (streamID)) + if (dest->DeleteStream (streamID)) s << "" << tr("SUCCESS") << ": " << tr("Stream closed") << "
\r\n
\r\n"; else s << "" << tr("ERROR") << ": " << tr("Stream not found or already was closed") << "
\r\n
\r\n"; @@ -1445,7 +1488,7 @@ namespace http { CreateConnection(newSocket); else { - if(newSocket) newSocket->close(); + if (newSocket) newSocket->close(); LogPrint(eLogError, "HTTP Server: Error handling accept: ", ecode.message()); } Accept (); diff --git a/libi2pd/Tunnel.cpp b/libi2pd/Tunnel.cpp index 725ff7c9..f5812a70 100644 --- a/libi2pd/Tunnel.cpp +++ b/libi2pd/Tunnel.cpp @@ -235,15 +235,11 @@ namespace tunnel m_State = state; } - - void Tunnel::PrintHops (std::stringstream& s) const + void Tunnel::VisitTunnelHops(TunnelHopVisitor v) { - // hops are in inverted order, we must print in direct order + // hops are in inverted order, we must return in direct order for (auto it = m_Hops.rbegin (); it != m_Hops.rend (); it++) - { - s << " ⇒ "; - s << i2p::data::GetIdentHashAbbreviation ((*it).ident->GetIdentHash ()); - } + v((*it).ident); } void InboundTunnel::HandleTunnelDataMsg (std::shared_ptr&& msg) @@ -254,12 +250,6 @@ namespace tunnel m_Endpoint.HandleDecryptedTunnelDataMsg (msg); } - void InboundTunnel::Print (std::stringstream& s) const - { - PrintHops (s); - s << " ⇒ " << GetTunnelID () << ":me"; - } - ZeroHopsInboundTunnel::ZeroHopsInboundTunnel (): InboundTunnel (std::make_shared ()), m_NumReceivedBytes (0) @@ -276,11 +266,6 @@ namespace tunnel } } - void ZeroHopsInboundTunnel::Print (std::stringstream& s) const - { - s << " ⇒ " << GetTunnelID () << ":me"; - } - void OutboundTunnel::SendTunnelDataMsg (const uint8_t * gwHash, uint32_t gwTunnel, std::shared_ptr msg) { TunnelMessageBlock block; @@ -315,13 +300,6 @@ namespace tunnel LogPrint (eLogError, "Tunnel: Incoming message for outbound tunnel ", GetTunnelID ()); } - void OutboundTunnel::Print (std::stringstream& s) const - { - s << GetTunnelID () << ":me"; - PrintHops (s); - s << " ⇒ "; - } - ZeroHopsOutboundTunnel::ZeroHopsOutboundTunnel (): OutboundTunnel (std::make_shared ()), m_NumSentBytes (0) @@ -351,11 +329,6 @@ namespace tunnel } } - void ZeroHopsOutboundTunnel::Print (std::stringstream& s) const - { - s << GetTunnelID () << ":me ⇒ "; - } - Tunnels tunnels; Tunnels::Tunnels (): m_IsRunning (false), m_Thread (nullptr), diff --git a/libi2pd/Tunnel.h b/libi2pd/Tunnel.h index 2414aff9..bc95601e 100644 --- a/libi2pd/Tunnel.h +++ b/libi2pd/Tunnel.h @@ -44,6 +44,9 @@ namespace tunnel const size_t I2NP_TUNNEL_MESSAGE_SIZE = TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + 34; // reserved for alignment and NTCP 16 + 6 + 12 const size_t I2NP_TUNNEL_ENPOINT_MESSAGE_SIZE = 2*TUNNEL_DATA_MSG_SIZE + I2NP_HEADER_SIZE + TUNNEL_GATEWAY_HEADER_SIZE + 28; // reserved for alignment and NTCP 16 + 6 + 6 + /** function for visiting a hops stored in a tunnel */ + typedef std::function)> TunnelHopVisitor; + enum TunnelState { eTunnelStatePending, @@ -91,8 +94,6 @@ namespace tunnel bool HandleTunnelBuildResponse (uint8_t * msg, size_t len); - virtual void Print (std::stringstream&) const {}; - // implements TunnelBase void SendTunnelDataMsg (std::shared_ptr msg); void EncryptTunnelMsg (std::shared_ptr in, std::shared_ptr out); @@ -107,9 +108,8 @@ namespace tunnel bool LatencyIsKnown() const { return m_Latency > 0; } bool IsSlow () const { return LatencyIsKnown() && (int)m_Latency > HIGH_LATENCY_PER_HOP*GetNumHops (); } - protected: - - void PrintHops (std::stringstream& s) const; + /** visit all hops we currently store */ + void VisitTunnelHops(TunnelHopVisitor v); private: @@ -134,7 +134,6 @@ namespace tunnel virtual void SendTunnelDataMsg (const std::vector& msgs); // multiple messages const i2p::data::IdentHash& GetEndpointIdentHash () const { return m_EndpointIdentHash; }; virtual size_t GetNumSentBytes () const { return m_Gateway.GetNumSentBytes (); }; - void Print (std::stringstream& s) const; // implements TunnelBase void HandleTunnelDataMsg (std::shared_ptr&& tunnelMsg); @@ -155,7 +154,6 @@ namespace tunnel InboundTunnel (std::shared_ptr config): Tunnel (config), m_Endpoint (true) {}; void HandleTunnelDataMsg (std::shared_ptr&& msg); virtual size_t GetNumReceivedBytes () const { return m_Endpoint.GetNumReceivedBytes (); }; - void Print (std::stringstream& s) const; bool IsInbound() const { return true; } // override TunnelBase @@ -172,7 +170,6 @@ namespace tunnel ZeroHopsInboundTunnel (); void SendTunnelDataMsg (std::shared_ptr msg); - void Print (std::stringstream& s) const; size_t GetNumReceivedBytes () const { return m_NumReceivedBytes; }; private: @@ -186,7 +183,6 @@ namespace tunnel ZeroHopsOutboundTunnel (); void SendTunnelDataMsg (const std::vector& msgs); - void Print (std::stringstream& s) const; size_t GetNumSentBytes () const { return m_NumSentBytes; }; private:
"<< tr("Address") << "" << tr("Type") << "" << tr("EncType") << "