From 686bb5c606d66693cb41cd26ba66cdb990c2c2eb Mon Sep 17 00:00:00 2001 From: Anon2026 Date: Wed, 14 Jan 2026 22:41:58 +0300 Subject: [PATCH] Add missing HTML tags --- daemon/HTTPServer.cpp | 101 +++++++++++++++++++++++++++--------------- 1 file changed, 66 insertions(+), 35 deletions(-) diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index c5896c02..605bf5ca 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -201,7 +201,7 @@ namespace http { s << "\r\n" "\r\n" - " \r\n" /* TODO: Find something to parse html/template system. This is horrible. */ + "\r\n" /* TODO: Find something to parse html/template system. This is horrible. */ " \r\n" " \r\n" " \r\n" @@ -339,7 +339,9 @@ namespace http { s << "" << tr("Data path") << ": " << i2p::fs::GetUTF8DataDir() << "
\r\n"; s << "
"; if ((outputFormat == OutputFormatEnum::forWebConsole) || !includeHiddenContent) { - s << "\r\n\r\n
\r\n"; + s << "\r\n"; + s << "\r\n"; + s << "
\r\n"; } if (includeHiddenContent) { @@ -348,7 +350,8 @@ namespace http { s << "" << tr("Router Family") << ": " << i2p::context.GetRouterInfo().GetProperty("family") << "
\r\n"; s << "" << tr("Router Caps") << ": " << i2p::context.GetRouterInfo().GetProperty("caps") << "
\r\n"; s << "" << tr("Version") << ": " VERSION "
\r\n"; - s << ""<< tr("Our external address") << ":" << "
\r\n\r\n"; + s << ""<< tr("Our external address") << ":" << "
\r\n"; + s << "
\r\n\r\n"; auto addresses = i2p::context.GetRouterInfo().GetAddresses (); if (addresses) { @@ -378,7 +381,8 @@ namespace http { s << "\r\n"; else { - s << "\r\n"; @@ -386,7 +390,7 @@ namespace http { s << "\r\n"; } } - s << "
" << (v6 ? "[" : "") << address->host.to_string() << (v6 ? "]:" : ":") << address->port << "" << tr(/* tr: Shown when router doesn't publish itself and have "Firewalled" state */ "supported"); + /* tr: Shown when router doesn't publish itself and have "Firewalled" state */ + s << "" << tr("supported"); if (address->port) s << " :" << address->port; s << "
\r\n"; + s << "\r\n\r\n"; } s << "
\r\n
\r\n"; if (outputFormat == OutputFormatEnum::forQtUi) { @@ -410,14 +414,14 @@ namespace http { bool sam = i2p::client::context.GetSAMBridge () ? true : false; bool i2cp = i2p::client::context.GetI2CPServer () ? true : false; bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol); - s << "\r\n"; + s << "
" << tr("Services") << "
\r\n\r\n\r\n"; s << "\r\n"; s << "\r\n"; s << "\r\n"; s << "\r\n"; s << "\r\n"; s << "\r\n"; - s << "
" << tr("Services") << "
" << "HTTP " << tr("Proxy") << "" << (httpproxy ? tr("Enabled") : tr("Disabled")) << "
" << "SOCKS " << tr("Proxy") << "" << (socksproxy ? tr("Enabled") : tr("Disabled")) << "
" << "BOB" << "" << (bob ? tr("Enabled") : tr("Disabled")) << "
" << "SAM" << "" << (sam ? tr("Enabled") : tr("Disabled")) << "
" << "I2CP" << "" << (i2cp ? tr("Enabled") : tr("Disabled")) << "
" << "I2PControl" << "" << (i2pcontrol ? tr("Enabled") : tr("Disabled")) << "
\r\n"; + s << "\r\n\r\n"; } } @@ -472,7 +476,9 @@ namespace http { if (dest->IsEncryptedLeaseSet ()) { i2p::data::BlindedPublicKey blinded (dest->GetIdentity (), dest->IsPerClientAuth ()); - s << "
\r\n\r\n
\r\n"; + s << "
\r\n"; + s << "\r\n"; + s << "
\r\n"; s << blinded.ToB33 () << ".b32.i2p
\r\n"; s << "
\r\n
\r\n"; } @@ -480,26 +486,31 @@ namespace http { if (dest->IsPublic() && token && !dest->IsEncryptedLeaseSet ()) { std::string webroot; i2p::config::GetOption("http.webroot", webroot); - s << "
\r\n\r\n
\r\n" + s << "
\r\n" + "\r\n" + "
\r\n" "
\r\n" " \r\n" " \r\n" " GetIdentHash ().ToBase32 () << "\">\r\n" " " << tr("Domain") << ":\r\n\r\n" " \r\n" - "
\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"; + "\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()) { s << "
\r\n\r\n
\r\n" - << "" + << "\r\n\r\n" + << "
\r\n" + << "
\r\n" << "" << "" // LeaseSet expiration button column << "" << "" - << ""; + << "\r\n"; for(auto& it: dest->GetLeaseSets ()) { s << "" @@ -510,7 +521,8 @@ namespace http { << "" << "\r\n"; } - s << "
" << tr("Address") << " " << tr("Type") << "" << tr("EncType") << "
" << (int)it.second->GetEncryptionType () <<"
\r\n
\r\n
\r\n
\r\n"; + s << "\r\n\r\n"; + s << "
\r\n
\r\n
\r\n"; } else s << "" << tr("LeaseSets") << ": 0
\r\n
\r\n"; @@ -538,7 +550,7 @@ namespace http { ShowTunnelDetails(s, it->GetState (), false, it->GetNumReceivedBytes ()); s << "
\r\n"; } - s << "
\r\n"; + s << "\r\n
\r\n"; s << "" << tr("Outbound tunnels") << ":
\r\n
\r\n"; for (auto & it : pool->GetOutboundTunnels ()) { s << "
"; @@ -560,6 +572,7 @@ namespace http { ShowTunnelDetails(s, it->GetState (), false, it->GetNumSentBytes ()); s << "
\r\n"; } + s << "
\r\n
\r\n"; } s << "
\r\n"; @@ -575,7 +588,8 @@ namespace http { << "\r\n" << "
\r\n" << "\r\n\r\n" - << "\r\n" << tmp_s.str () << "
" << tr("Destination") << "" << tr("Amount") << "
\r\n
\r\n\r\n"; + << "\r\n" << tmp_s.str () << "\r\n\r\n" + << "\r\n\r\n"; } else s << tr("Outgoing") << ": 0
\r\n"; s << "
\r\n"; @@ -592,9 +606,10 @@ namespace http { } s << "
\r\n" << "\r\n" - << "
\r\n\r\n" - << "\r\n" - << "\r\n" << tmp_s.str () << "
" << tr("Destination") << "" << tr("Status") << "
\r\n
\r\n
\r\n"; + << "
\r\n" + << "\r\n\r\n" + << "\r\n" << tmp_s.str () << "\r\n
" << tr("Destination") << "" << tr("Status") << "
\r\n" + << "
\r\n\r\n"; } else s << tr("Tags sessions") << ": 0
\r\n"; s << "
\r\n"; @@ -613,9 +628,8 @@ namespace http { ShowLeaseSetDestination (s, dest, token); // Print table with streams information - s << "\r\n\r\n\r\n" + s << "
" - << tr("Streams") - << "
\r\n\r\n" + << "\r\n" << "" << "" // Stream closing button column << "" @@ -627,7 +641,8 @@ namespace http { << "" << "" << "" - << "\r\n\r\n\r\n"; + << "\r\n\r\n" + << "\r\n"; for (const auto& it: dest->GetAllStreams ()) { @@ -638,8 +653,9 @@ namespace http { if (it->GetRecvStreamID ()) { s << ""; - } else { - s << ""; // TODO: FIXME: Undefined HTML code } s << ""; s << ""; @@ -652,7 +668,7 @@ namespace http { s << ""; s << "\r\n"; } - s << "\r\n
" << tr("Streams") << "
StreamID DestinationRTTWindowStatus
"; + } + else { + s << " HTML " << streamDestShort << "" << it->GetNumSentBytes () << "" << (int)it->GetStatus () << "
"; + s << "\r\n\r\n"; } else ShowError(s, tr("Such destination is not found")); @@ -702,7 +718,8 @@ namespace http { if (!ls->IsValid()) s << "
!! " << tr("Invalid") << " !!
\r\n"; s << "
\r\n"; - s << "\r\n
\r\n"; + s << "\r\n"; + s << "
\r\n"; s << "" << tr("Store type") << ": " << (int)storeType << "
\r\n"; s << "" << tr("Expires") << ": " << ConvertTime(ls->GetExpirationTime()) << "
\r\n"; if (storeType == i2p::data::NETDB_STORE_TYPE_LEASESET || storeType == i2p::data::NETDB_STORE_TYPE_STANDARD_LEASESET2) @@ -717,10 +734,12 @@ namespace http { s << "" << tr("EndDate") << ": " << ConvertTime(l->endDate) << "
\r\n"; } } - s << "
\r\n
\r\n
\r\n"; + s << "\r\n\r\n"; // class slide class slidecontent + s << "\r\n"; // class leaseset listitem } ); // end for each lease set + s << "\r\n"; } else if (!i2p::context.IsFloodfill ()) { @@ -861,7 +880,9 @@ namespace http { if (i2p::tunnel::tunnels.CountTransitTunnels()) { s << "" << tr("Transit Tunnels") << ":
\r\n"; - s << ""; + s << "
ID" << tr("Amount") << "" << tr("Next") << "
\r\n"; + s << "\r\n"; + s << ""; for (const auto& it: i2p::tunnel::tunnels.GetTransitTunnels ()) { if (std::dynamic_pointer_cast(it)) @@ -873,11 +894,13 @@ namespace http { ShowTraffic(s, it->GetNumTransmittedBytes ()); s << "\r\n"; } - s << "
ID" << tr("Amount") << "" << tr("Next") << "
" << it->GetNextPeerName () << "
\r\n"; + s << "\r\n\r\n"; } else { - s << "" << tr("Transit Tunnels") << ": " << tr(/* Message on transit tunnels page */ "no transit tunnels currently built") << ".
\r\n"; + s << "" << tr("Transit Tunnels") << ": "; + /* Message on transit tunnels page */ + s << tr("no transit tunnels currently built") << ".
\r\n"; } } @@ -932,13 +955,17 @@ namespace http { if (!tmp_s.str ().empty ()) { s << "
\r\n\r\n
" + << " ( " << cnt << " )\r\n" + << "\r\n" + << "
" << tmp_s.str () << "
\r\n
\r\n"; } if (!tmp_s6.str ().empty ()) { s << "
\r\n\r\n
" + << "v6 ( " << cnt6 << " )\r\n" + << "\r\n" + << "
" << tmp_s6.str () << "
\r\n
\r\n"; } } @@ -985,7 +1012,11 @@ namespace http { s << "
\r\n"; } else - s << "" << tr("SAM sessions") << ": " << tr(/* Message on SAM sessions page */ "no sessions currently running") << ".
\r\n"; + { + s << "" << tr("SAM sessions") << ": "; + /* Message on SAM sessions page */ + s << tr("no sessions currently running") << ".
\r\n"; + } } void ShowSAMSession (std::stringstream& s, const std::string& id) @@ -1020,7 +1051,7 @@ namespace http { auto& ident = session->GetLocalDestination ()->GetIdentHash(); s << "\r\n"; - s << "
\r\n"; + s << "
\r\n
\r\n"; s << "" << tr("Streams") << ":
\r\n
\r\n"; for (const auto& it: sam->ListSockets({ (const char *)sam_id.data (), l })) {