From d582c30f6e45f6a47bfcdc1e7608bb03ecd2dc6d Mon Sep 17 00:00:00 2001 From: orignal Date: Sun, 24 Apr 2016 17:32:24 -0400 Subject: [PATCH 01/51] allow same port at different interfaces --- ClientContext.cpp | 5 +++-- ClientContext.h | 6 +++--- I2PService.h | 3 +++ 3 files changed, 9 insertions(+), 5 deletions(-) diff --git a/ClientContext.cpp b/ClientContext.cpp index 59f11f21..2eb81af2 100644 --- a/ClientContext.cpp +++ b/ClientContext.cpp @@ -328,7 +328,8 @@ namespace client localDestination = CreateNewLocalDestination (k, false, &options); } auto clientTunnel = new I2PClientTunnel (name, dest, address, port, localDestination, destinationPort); - if (m_ClientTunnels.insert (std::make_pair (port, std::unique_ptr(clientTunnel))).second) + if (m_ClientTunnels.insert (std::make_pair (clientTunnel->GetAcceptor ().local_endpoint (), + std::unique_ptr(clientTunnel))).second) clientTunnel->Start (); else LogPrint (eLogError, "Clients: I2P client tunnel with port ", port, " already exists"); @@ -382,7 +383,7 @@ namespace client serverTunnel->SetAccessList (idents); } if (m_ServerTunnels.insert (std::make_pair ( - std::make_tuple (localDestination->GetIdentHash (), inPort), + std::make_pair (localDestination->GetIdentHash (), inPort), std::unique_ptr(serverTunnel))).second) serverTunnel->Start (); else diff --git a/ClientContext.h b/ClientContext.h index a05c2161..3381228b 100644 --- a/ClientContext.h +++ b/ClientContext.h @@ -2,9 +2,9 @@ #define CLIENT_CONTEXT_H__ #include -#include #include #include +#include #include "Destination.h" #include "HTTPProxy.h" #include "SOCKS.h" @@ -78,8 +78,8 @@ namespace client i2p::proxy::HTTPProxy * m_HttpProxy; i2p::proxy::SOCKSProxy * m_SocksProxy; - std::map > m_ClientTunnels; // port->tunnel - std::map, std::unique_ptr > m_ServerTunnels; // ->tunnel + std::map > m_ClientTunnels; // local endpoint->tunnel + std::map, std::unique_ptr > m_ServerTunnels; // ->tunnel SAMBridge * m_SamBridge; BOBCommandChannel * m_BOBCommandChannel; diff --git a/I2PService.h b/I2PService.h index 251a379a..2df11909 100644 --- a/I2PService.h +++ b/I2PService.h @@ -118,6 +118,9 @@ namespace client void Start (); //If you override this make sure you call it from the children void Stop (); + + const boost::asio::ip::tcp::acceptor& GetAcceptor () const { return m_Acceptor; }; + protected: virtual std::shared_ptr CreateHandler(std::shared_ptr socket) = 0; virtual const char* GetName() { return "Generic TCP/IP accepting daemon"; } From 85840872ab50fe7e1af312d51912a3ebba3362f9 Mon Sep 17 00:00:00 2001 From: weekendi2p Date: Tue, 26 Apr 2016 19:39:10 +0200 Subject: [PATCH 02/51] family: volatile.crt --- contrib/certificates/family/volatile.crt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 contrib/certificates/family/volatile.crt diff --git a/contrib/certificates/family/volatile.crt b/contrib/certificates/family/volatile.crt new file mode 100644 index 00000000..928c7f39 --- /dev/null +++ b/contrib/certificates/family/volatile.crt @@ -0,0 +1,12 @@ +-----BEGIN CERTIFICATE----- +MIIBxDCCAWmgAwIBAgIJAJnJIdKHYwWcMAoGCCqGSM49BAMCMGcxCzAJBgNVBAYT +AkFVMRMwEQYDVQQIDApTb21lLVN0YXRlMSEwHwYDVQQKDBhJbnRlcm5ldCBXaWRn +aXRzIFB0eSBMdGQxIDAeBgNVBAMMF3ZvbGF0aWxlLmZhbWlseS5pMnAubmV0MB4X +DTE2MDQyNjE1MjAyNloXDTI2MDQyNDE1MjAyNlowZzELMAkGA1UEBhMCQVUxEzAR +BgNVBAgMClNvbWUtU3RhdGUxITAfBgNVBAoMGEludGVybmV0IFdpZGdpdHMgUHR5 +IEx0ZDEgMB4GA1UEAwwXdm9sYXRpbGUuZmFtaWx5LmkycC5uZXQwWTATBgcqhkjO +PQIBBggqhkjOPQMBBwNCAARf6LBfbbfL6HInvC/4wAGaN3rj0eeLE/OdBpA93R3L +s8EUp0YTEJHWPo9APiKMmAwQSsMJfjhNrbp+UWEnnx2LMAoGCCqGSM49BAMCA0kA +MEYCIQDpQu2KPV5G1JOFLoZvdj+rcvEnjxM/FxkaqikwkVx8FAIhANP7DkUal+GT +SuiCtcqM4QyIBsfsCJBWEMzovft164Bo +-----END CERTIFICATE----- From a78caa2976d3d96f8ac2defb7622c48e456e0630 Mon Sep 17 00:00:00 2001 From: weekendi2p Date: Wed, 27 Apr 2016 00:31:33 +0200 Subject: [PATCH 03/51] added SetFamilyString(); GetFamilyString() and shows family in webiface --- HTTPServer.cpp | 1 + RouterContext.cpp | 12 ++++++++++++ RouterContext.h | 2 ++ 3 files changed, 15 insertions(+) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 6c2c6112..08b67e22 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -417,6 +417,7 @@ namespace util default: s << "Unknown"; } s << "
\r\n"; + s << "Family: " << i2p::context.GetFamilyString() << "
\r\n"; s << "Tunnel creation success rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
\r\n"; s << "Received: "; s << std::fixed << std::setprecision(2); diff --git a/RouterContext.cpp b/RouterContext.cpp index f35d8426..4cdf13fe 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -149,11 +149,23 @@ namespace i2p UpdateRouterInfo (); } + std::string RouterContext::GetFamilyString () const + { + return m_FamilyString; + } + void RouterContext::SetFamily (const std::string& family) { + + m_FamilyString = family; + if (m_FamilyString.length() == 0) + m_FamilyString = "<undefined>"; + std::string signature; if (family.length () > 0) + { signature = i2p::data::CreateFamilySignature (family, GetIdentHash ()); + } if (signature.length () > 0) { m_RouterInfo.SetProperty (i2p::data::ROUTER_INFO_PROPERTY_FAMILY, family); diff --git a/RouterContext.h b/RouterContext.h index 9766c66e..1b0f7ed2 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -59,6 +59,7 @@ namespace i2p bool IsFloodfill () const { return m_IsFloodfill; }; void SetFloodfill (bool floodfill); void SetFamily (const std::string& family); + std::string GetFamilyString () const; void SetBandwidth (int limit); /* in kilobytes */ void SetBandwidth (char L); /* by letter */ bool AcceptsTunnels () const { return m_AcceptsTunnels; }; @@ -100,6 +101,7 @@ namespace i2p i2p::data::PrivateKeys m_Keys; uint64_t m_LastUpdateTime; bool m_AcceptsTunnels, m_IsFloodfill; + std::string m_FamilyString; uint64_t m_StartupTime; // in seconds since epoch uint32_t m_BandwidthLimit; // allowed bandwidth RouterStatus m_Status; From 61e8becd38e2b1af4948fa56333f8ee82d66040b Mon Sep 17 00:00:00 2001 From: weekendi2p Date: Wed, 27 Apr 2016 00:48:23 +0200 Subject: [PATCH 04/51] wrong file version --- Daemon.cpp | 1 + RouterContext.cpp | 14 ++++++++------ RouterContext.h | 1 + 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/Daemon.cpp b/Daemon.cpp index 81bbcdd5..2a32ff04 100644 --- a/Daemon.cpp +++ b/Daemon.cpp @@ -189,6 +189,7 @@ namespace i2p std::string family; i2p::config::GetOption("family", family); i2p::context.SetFamily (family); + i2p::context.SetFamilyString (family); if (family.length () > 0) LogPrint(eLogInfo, "Daemon: family set to ", family); diff --git a/RouterContext.cpp b/RouterContext.cpp index 4cdf13fe..bc1f3fc1 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -149,6 +149,14 @@ namespace i2p UpdateRouterInfo (); } + void RouterContext::SetFamilyString (const std::string& family) + { + if (family.length() > 0) + m_FamilyString = family; + else + m_FamilyString = "<undefined>"; + } + std::string RouterContext::GetFamilyString () const { return m_FamilyString; @@ -157,15 +165,9 @@ namespace i2p void RouterContext::SetFamily (const std::string& family) { - m_FamilyString = family; - if (m_FamilyString.length() == 0) - m_FamilyString = "<undefined>"; - std::string signature; if (family.length () > 0) - { signature = i2p::data::CreateFamilySignature (family, GetIdentHash ()); - } if (signature.length () > 0) { m_RouterInfo.SetProperty (i2p::data::ROUTER_INFO_PROPERTY_FAMILY, family); diff --git a/RouterContext.h b/RouterContext.h index 1b0f7ed2..def89383 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -59,6 +59,7 @@ namespace i2p bool IsFloodfill () const { return m_IsFloodfill; }; void SetFloodfill (bool floodfill); void SetFamily (const std::string& family); + void SetFamilyString (const std::string& family); std::string GetFamilyString () const; void SetBandwidth (int limit); /* in kilobytes */ void SetBandwidth (char L); /* by letter */ From ebee94fb11b436add295ae791cb1fe53c6e99d7d Mon Sep 17 00:00:00 2001 From: weekendi2p Date: Wed, 27 Apr 2016 01:19:27 +0200 Subject: [PATCH 05/51] removed 1 blank line.. --- RouterContext.cpp | 1 - 1 file changed, 1 deletion(-) diff --git a/RouterContext.cpp b/RouterContext.cpp index bc1f3fc1..29891169 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -164,7 +164,6 @@ namespace i2p void RouterContext::SetFamily (const std::string& family) { - std::string signature; if (family.length () > 0) signature = i2p::data::CreateFamilySignature (family, GetIdentHash ()); From 7cf171671db8de9f7dfb34029d2ec7c1db94709c Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 06/51] * HTTPConnection::reply : to_buffers() -> to_string() --- HTTPServer.cpp | 57 +++++++++++++++++++++----------------------------- HTTPServer.h | 4 ++-- 2 files changed, 26 insertions(+), 35 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 6c2c6112..6897a347 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -212,42 +212,32 @@ namespace util } // namespace misc_strings - std::vector HTTPConnection::reply::to_buffers(int status) + std::string HTTPConnection::reply::to_string(int code) { - std::vector buffers; + std::stringstream ss(""); if (headers.size () > 0) { - status_string = "HTTP/1.1 "; - status_string += std::to_string (status); - status_string += " "; - switch (status) + const char *status; + switch (code) { - case 105: status_string += "Name Not Resolved"; break; - case 200: status_string += "OK"; break; - case 400: status_string += "Bad Request"; break; - case 404: status_string += "Not Found"; break; - case 408: status_string += "Request Timeout"; break; - case 500: status_string += "Internal Server Error"; break; - case 502: status_string += "Bad Gateway"; break; - case 503: status_string += "Not Implemented"; break; - case 504: status_string += "Gateway Timeout"; break; - default: status_string += "WTF"; + case 105: status = "Name Not Resolved"; break; + case 200: status = "OK"; break; + case 400: status = "Bad Request"; break; + case 404: status = "Not Found"; break; + case 408: status = "Request Timeout"; break; + case 500: status = "Internal Server Error"; break; + case 502: status = "Bad Gateway"; break; + case 503: status = "Not Implemented"; break; + case 504: status = "Gateway Timeout"; break; + default: status = "WTF"; } - buffers.push_back(boost::asio::buffer(status_string, status_string.size())); - buffers.push_back(boost::asio::buffer(misc_strings::crlf)); - - for (std::size_t i = 0; i < headers.size(); ++i) - { - header& h = headers[i]; - buffers.push_back(boost::asio::buffer(h.name)); - buffers.push_back(boost::asio::buffer(misc_strings::name_value_separator)); - buffers.push_back(boost::asio::buffer(h.value)); - buffers.push_back(boost::asio::buffer(misc_strings::crlf)); - } - buffers.push_back(boost::asio::buffer(misc_strings::crlf)); - } - buffers.push_back(boost::asio::buffer(content)); - return buffers; + ss << "HTTP/1.1 " << code << "" << status << HTTP_CRLF; + for (header & h : headers) { + ss << h.name << HTTP_HEADER_KV_SEP << h.value << HTTP_CRLF; + } + ss << HTTP_CRLF; /* end of headers */ + } + return ss.str(); } void HTTPConnection::Terminate () @@ -914,8 +904,9 @@ namespace util m_Reply.headers[2].name = "Content-Type"; m_Reply.headers[2].value = "text/html"; } - - boost::asio::async_write (*m_Socket, m_Reply.to_buffers(status), + std::string res = m_Reply.to_string(status); + + boost::asio::async_write (*m_Socket, res, std::bind (&HTTPConnection::HandleWriteReply, shared_from_this (), std::placeholders::_1)); } diff --git a/HTTPServer.h b/HTTPServer.h index 66083d85..889afca9 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -39,8 +39,8 @@ namespace util struct reply { std::vector
headers; - std::string status_string, content; - std::vector to_buffers (int status); + std::string status; + std::string to_string (int code); }; public: From 7a461c168490a98450e716d2972c46672740c6f0 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 07/51] * HTTPServer.{cpp,h}: move #include to one place --- HTTPServer.cpp | 7 +++++++ HTTPServer.h | 12 +----------- 2 files changed, 8 insertions(+), 11 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 6897a347..bf895ced 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -1,7 +1,13 @@ #include #include +#include +#include +#include + +#include #include #include + #include "Base.h" #include "FS.h" #include "Log.h" @@ -9,6 +15,7 @@ #include "TransitTunnel.h" #include "Transports.h" #include "NetDb.h" +#include "LeaseSet.h" #include "I2PEndian.h" #include "Streaming.h" #include "Destination.h" diff --git a/HTTPServer.h b/HTTPServer.h index 889afca9..ead03cde 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -1,14 +1,6 @@ #ifndef HTTP_SERVER_H__ #define HTTP_SERVER_H__ -#include -#include -#include -#include -#include -#include "LeaseSet.h" -#include "Streaming.h" - namespace i2p { namespace util @@ -135,6 +127,4 @@ namespace util } } -#endif - - +#endif /* HTTP_SERVER_H__ */ From 6ed709d6e6b2af7516de4ceea69753a73f82428c Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 08/51] * HTTPServer.{cpp,h}: extract itoopie{Image,Favicon} from HTTPConnection (!) class --- HTTPServer.cpp | 10 ++++++---- HTTPServer.h | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index bf895ced..2c0f3ea5 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -30,7 +30,7 @@ namespace i2p { namespace util { - const std::string HTTPConnection::itoopieImage = + const char *itoopieImage = "\"ICToopie"; - const std::string HTTPConnection::itoopieFavicon = + const char *itoopieFavicon = "data:image/png;base64," "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv" "8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAYdEVYdFNvZnR3YXJlAFBhaW50Lk5FVCB2My4wOGVynO" @@ -357,7 +357,7 @@ namespace util // Html5 head start s << "\r\n"; // TODO: Add support for locale. s << "\r\n\r\n"; // TODO: Find something to parse html/template system. This is horrible. - s << "\r\n"; + s << "\r\n"; s << "Purple I2P " << VERSION " Webconsole\r\n"; s << "\r\n"; + + const char HTTP_PAGE_TUNNELS[] = "tunnels"; + const char HTTP_PAGE_TRANSIT_TUNNELS[] = "transit_tunnels"; + 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_SAM_SESSIONS[] = "sam_sessions"; + const char HTTP_PAGE_SAM_SESSION[] = "sam_session"; + const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels"; + const char HTTP_PAGE_JUMPSERVICES[] = "jumpservices"; const char HTTP_COMMAND_START_ACCEPTING_TUNNELS[] = "start_accepting_tunnels"; const char HTTP_COMMAND_STOP_ACCEPTING_TUNNELS[] = "stop_accepting_tunnels"; const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test"; - const char HTTP_COMMAND_LOCAL_DESTINATIONS[] = "local_destinations"; - const char HTTP_COMMAND_LOCAL_DESTINATION[] = "local_destination"; const char HTTP_PARAM_BASE32_ADDRESS[] = "b32"; - const char HTTP_COMMAND_SAM_SESSIONS[] = "sam_sessions"; - const char HTTP_COMMAND_SAM_SESSION[] = "sam_session"; const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; - const char HTTP_COMMAND_I2P_TUNNELS[] = "i2p_tunnels"; - const char HTTP_COMMAND_JUMPSERVICES[] = "jumpservices="; const char HTTP_PARAM_ADDRESS[] = "address"; void HTTPConnection::Terminate () @@ -282,52 +299,53 @@ namespace http { { std::stringstream s; // Html5 head start - s << "\r\n"; // TODO: Add support for locale. - s << "\r\n\r\n"; // TODO: Find something to parse html/template system. This is horrible. - s << "\r\n"; - s << "Purple I2P " << VERSION " Webconsole\r\n"; - s << "\r\n\r\n\r\n"; - s << "
i2pd webconsole
"; - s << "
"; - s << "
\r\n"; - s << "Main page
\r\n
\r\n"; - s << "Local destinations
\r\n"; - s << "Tunnels
\r\n"; - s << "Transit tunnels
\r\n"; - s << "Transports
\r\n
\r\n"; - s << "I2P tunnels
\r\n"; + s << + "\r\n" + "\r\n" /* TODO: Add support for locale */ + " \r\n" + " \r\n" /* TODO: Find something to parse html/template system. This is horrible. */ + " \r\n" + " Purple I2P " VERSION " Webconsole\r\n" + << cssStyles << + "\r\n"; + s << + "\r\n" + "
i2pd webconsole
\r\n" + "
\r\n" + "
\r\n" + " Main page
\r\n
\r\n" + " Local destinations
\r\n" + " Tunnels
\r\n" + " Transit tunnels
\r\n" + " Transports
\r\n" + " I2P tunnels
\r\n" + " Jump services
\r\n" + ; if (i2p::client::context.GetSAMBridge ()) - s << "SAM sessions
\r\n
\r\n"; + s << " SAM sessions
\r\n"; + /* commands */ + s << "
\r\n"; + s << " Run peer test
\r\n"; if (i2p::context.AcceptsTunnels ()) - s << "Stop accepting tunnels
\r\n
\r\n"; + s << " Stop accepting tunnels
\r\n"; else - s << "Start accepting tunnels
\r\n
\r\n"; - s << "Run peer test
\r\n
\r\n"; - s << "Jump services
\r\n
\r\n"; - s << "
"; - if (request.uri.find("cmd=") != std::string::npos) + s << " Start accepting tunnels
\r\n"; + s << "
\r\n"; + s << "
"; + if (request.uri.find("page=") != std::string::npos) + HandlePage (s, request.uri); + else if (request.uri.find("cmd=") != std::string::npos) HandleCommand (s, request.uri); else - FillContent (s); - s << "
\r\n\r\n"; + ShowStatus (s); + s << + "
\r\n" + "\r\n" + "\r\n"; SendReply (s.str ()); } - void HTTPConnection::FillContent (std::stringstream& s) + void HTTPConnection::ShowStatus (std::stringstream& s) { s << "Uptime: " << boost::posix_time::to_simple_string ( boost::posix_time::time_duration (boost::posix_time::seconds ( @@ -396,6 +414,38 @@ namespace http { s << "Transit Tunnels: " << std::to_string(transitTunnelCount) << "
\r\n"; } + void HTTPConnection::HandlePage (std::stringstream& s, const std::string & uri) + { + std::map params; + std::string page(""); + URL url; + + url.parse(uri); + url.parse_query(params); + page = params["page"]; + + if (page == HTTP_PAGE_TRANSPORTS) + ShowTransports (s); + else if (page == HTTP_PAGE_TUNNELS) + ShowTunnels (s); + else if (page == HTTP_PAGE_JUMPSERVICES) + ShowJumpServices (s, params["address"]); + else if (page == HTTP_PAGE_TRANSIT_TUNNELS) + ShowTransitTunnels (s); + else if (page == HTTP_PAGE_LOCAL_DESTINATIONS) + ShowLocalDestinations (s); + else if (page == HTTP_PAGE_LOCAL_DESTINATION) + ShowLocalDestination (s, params["b32"]); + else if (page == HTTP_PAGE_SAM_SESSIONS) + ShowSAMSessions (s); + else if (page == HTTP_PAGE_SAM_SESSION) + ShowSAMSession (s, params["sam_id"]); + else if (page == HTTP_PAGE_I2P_TUNNELS) + ShowI2PTunnels (s); + else + SendError("Unknown page: " + page); + } + void HTTPConnection::HandleCommand (std::stringstream& s, const std::string & uri) { std::map params; @@ -406,30 +456,14 @@ namespace http { url.parse_query(params); cmd = params["cmd"]; - if (cmd == HTTP_COMMAND_TRANSPORTS) - ShowTransports (s); - else if (cmd == HTTP_COMMAND_TUNNELS) - ShowTunnels (s); - else if (cmd == HTTP_COMMAND_JUMPSERVICES) - ShowJumpServices (s, params["address"]); - else if (cmd == HTTP_COMMAND_TRANSIT_TUNNELS) - ShowTransitTunnels (s); - else if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) + if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) StartAcceptingTunnels (s); else if (cmd == HTTP_COMMAND_STOP_ACCEPTING_TUNNELS) StopAcceptingTunnels (s); else if (cmd == HTTP_COMMAND_RUN_PEER_TEST) RunPeerTest (s); - else if (cmd == HTTP_COMMAND_LOCAL_DESTINATIONS) - ShowLocalDestinations (s); - else if (cmd == HTTP_COMMAND_LOCAL_DESTINATION) - ShowLocalDestination (s, params["b32"]); - else if (cmd == HTTP_COMMAND_SAM_SESSIONS) - ShowSAMSessions (s); - else if (cmd == HTTP_COMMAND_SAM_SESSION) - ShowSAMSession (s, params["sam_id"]); - else if (cmd == HTTP_COMMAND_I2P_TUNNELS) - ShowI2PTunnels (s); + else + SendError("Unknown command: " + cmd); } void HTTPConnection::ShowJumpServices (std::stringstream& s, const std::string& address) @@ -448,7 +482,7 @@ namespace http { for (auto& it: i2p::client::context.GetDestinations ()) { auto ident = it.second->GetIdentHash ();; - s << ""; + s << ""; s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; } } @@ -548,9 +582,9 @@ namespace http { it->Print (s); auto state = it->GetState (); if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; + s << " " << "Failed"; else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; + s << " " << "Expiring"; s << " " << (int)it->GetNumSentBytes () << "
\r\n"; s << std::endl; } @@ -560,9 +594,9 @@ namespace http { it->Print (s); auto state = it->GetState (); if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; + s << " " << "Failed"; else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; + s << " " << "Expiring"; s << " " << (int)it->GetNumReceivedBytes () << "
\r\n"; s << std::endl; } @@ -640,7 +674,7 @@ namespace http { { for (auto& it: sam->GetSessions ()) { - s << ""; + s << ""; s << it.first << "
\r\n" << std::endl; } } @@ -656,7 +690,7 @@ namespace http { if (session) { auto& ident = session->localDestination->GetIdentHash(); - s << ""; + s << ""; s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; s << "Streams:
\r\n"; for (auto it: session->ListSockets()) @@ -688,7 +722,7 @@ namespace http { for (auto& it: i2p::client::context.GetClientTunnels ()) { auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); - s << ""; + s << ""; s << it.second->GetName () << " ⇐ "; s << i2p::client::context.GetAddressBook ().ToAddress(ident); s << "
\r\n"<< std::endl; @@ -697,7 +731,7 @@ namespace http { for (auto& it: i2p::client::context.GetServerTunnels ()) { auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); - s << ""; + s << ""; s << it.second->GetName () << " ⇒ "; s << i2p::client::context.GetAddressBook ().ToAddress(ident); s << ":" << it.second->GetLocalPort (); diff --git a/HTTPServer.h b/HTTPServer.h index 89df8fb5..57d6fa59 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -29,21 +29,24 @@ namespace http { void SendError (const std::string& message); void HandleRequest (const HTTPReq & request); - void HandleCommand (std::stringstream& s, const std::string& request); + void HandlePage (std::stringstream& s, const std::string& request); + void HandleCommand (std::stringstream& s, const std::string& request); + /* pages */ void ShowJumpServices (std::stringstream& s, const std::string& address); void ShowTransports (std::stringstream& s); void ShowTunnels (std::stringstream& s); + void ShowStatus (std::stringstream& s); void ShowTransitTunnels (std::stringstream& s); void ShowLocalDestinations (std::stringstream& s); void ShowLocalDestination (std::stringstream& s, const std::string& b32); void ShowSAMSessions (std::stringstream& s); void ShowSAMSession (std::stringstream& s, const std::string& id); void ShowI2PTunnels (std::stringstream& s); + /* commands */ void StartAcceptingTunnels (std::stringstream& s); void StopAcceptingTunnels (std::stringstream& s); void RunPeerTest (std::stringstream& s); - void FillContent (std::stringstream& s); protected: From 9bbff744e991cfa60cb4fa21684b84a06413d712 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 17/51] * HTTPServer.{cpp,h}: chg HandleRequest() signature --- HTTPServer.cpp | 12 ++++++------ HTTPServer.h | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 5673e468..80022897 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -271,7 +271,7 @@ namespace http { } if (ret == 0) return; /* need more data */ - HandleRequest (request); + HandleRequest (request.uri); } void HTTPConnection::HandleWriteReply (const boost::system::error_code& ecode) @@ -295,7 +295,7 @@ namespace http { AsyncStreamReceive (); } - void HTTPConnection::HandleRequest (const HTTPReq &request) + void HTTPConnection::HandleRequest (const std::string &uri) { std::stringstream s; // Html5 head start @@ -332,10 +332,10 @@ namespace http { s << " Start accepting tunnels
\r\n"; s << "\r\n"; s << "
"; - if (request.uri.find("page=") != std::string::npos) - HandlePage (s, request.uri); - else if (request.uri.find("cmd=") != std::string::npos) - HandleCommand (s, request.uri); + if (uri.find("page=") != std::string::npos) + HandlePage (s, uri); + else if (uri.find("cmd=") != std::string::npos) + HandleCommand (s, uri); else ShowStatus (s); s << diff --git a/HTTPServer.h b/HTTPServer.h index 57d6fa59..28962dde 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -28,7 +28,7 @@ namespace http { void SendReply (const std::string& content, int code = 200); void SendError (const std::string& message); - void HandleRequest (const HTTPReq & request); + void HandleRequest (const std::string& uri); void HandlePage (std::stringstream& s, const std::string& request); void HandleCommand (std::stringstream& s, const std::string& request); From 48b3959cfb9b71d5765c70439ab7a7b94a93dae6 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 18/51] * HTTPServer.{cpp,h}: cleanup --- HTTPServer.cpp | 18 ++++++++---------- HTTPServer.h | 4 ---- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 80022897..accca463 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -836,11 +836,10 @@ namespace http { { m_Acceptor.close(); m_Service.stop (); - if (m_Thread) - { - m_Thread->join (); - m_Thread = nullptr; - } + if (m_Thread) { + m_Thread->join (); + m_Thread = nullptr; + } } void HTTPServer::Run () @@ -858,11 +857,10 @@ namespace http { void HTTPServer::HandleAccept(const boost::system::error_code& ecode, std::shared_ptr newSocket) { - if (!ecode) - { - CreateConnection(newSocket); - Accept (); - } + if (ecode) + return; + CreateConnection(newSocket); + Accept (); } void HTTPServer::CreateConnection(std::shared_ptr newSocket) diff --git a/HTTPServer.h b/HTTPServer.h index 28962dde..a6ef52cc 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -6,7 +6,6 @@ namespace http { extern const char *itoopieImage; extern const char *itoopieFavicon; const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192; - const int HTTP_DESTINATION_REQUEST_TIMEOUT = 10; // in seconds class HTTPConnection: public std::enable_shared_from_this { @@ -59,9 +58,6 @@ namespace http { protected: virtual void RunRequest (); - - public: - }; class HTTPServer From 4fa4ba6301d4aadd19b5155218a9efc48832b745 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 19/51] * HTTPServer.cpp: move known jump services to std::map --- HTTPServer.cpp | 23 ++++++++++++++++------- 1 file changed, 16 insertions(+), 7 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index accca463..73c9c791 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -226,7 +226,12 @@ namespace http { const char HTTP_PARAM_BASE32_ADDRESS[] = "b32"; const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; const char HTTP_PARAM_ADDRESS[] = "address"; - + + std::map jumpservices = { + { "inr.i2p", "http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/search/?q=" }, + { "stats.i2p", "http://7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq.b32.i2p/cgi-bin/jump.cgi?a=" }, + }; + void HTTPConnection::Terminate () { if (!m_Stream) return; @@ -468,12 +473,16 @@ namespace http { void HTTPConnection::ShowJumpServices (std::stringstream& s, const std::string& address) { - s << "
"; - s << ""; - s << "

\r\n"; - s << "Jump services for " << address << ""; - s << ""; + s << "
"; + s << ""; + s << ""; + s << ""; + s << "

\r\n"; + s << "Jump services for " << address << "\r\n\r\n"; } void HTTPConnection::ShowLocalDestinations (std::stringstream& s) From 2a1fe99a2981dbfe6966d60379155346b1c723c2 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 20/51] * HTTPServer.{cpp,h}: drop rest of streaming support --- HTTPServer.cpp | 52 +++----------------------------------------------- HTTPServer.h | 9 +++------ 2 files changed, 6 insertions(+), 55 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 73c9c791..5f195792 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -17,8 +17,6 @@ #include "NetDb.h" #include "HTTP.h" #include "LeaseSet.h" -#include "I2PEndian.h" -#include "Streaming.h" #include "Destination.h" #include "RouterContext.h" #include "ClientContext.h" @@ -234,9 +232,6 @@ namespace http { void HTTPConnection::Terminate () { - if (!m_Stream) return; - m_Stream->Close (); - m_Stream = nullptr; m_Socket->close (); } @@ -251,14 +246,9 @@ namespace http { { if (!ecode) { - if (!m_Stream) // new request - { - m_Buffer[bytes_transferred] = '\0'; - m_BufferLen = bytes_transferred; - RunRequest(); - } - else // follow-on - m_Stream->Send ((uint8_t *)m_Buffer, bytes_transferred); + m_Buffer[bytes_transferred] = '\0'; + m_BufferLen = bytes_transferred; + RunRequest(); Receive (); } else if (ecode != boost::asio::error::operation_aborted) @@ -289,17 +279,6 @@ namespace http { } } - void HTTPConnection::HandleWrite (const boost::system::error_code& ecode) - { - if (ecode || (m_Stream && !m_Stream->IsOpen ())) - { - if (ecode != boost::asio::error::operation_aborted) - Terminate (); - } - else // data keeps coming - AsyncStreamReceive (); - } - void HTTPConnection::HandleRequest (const std::string &uri) { std::stringstream s; @@ -769,31 +748,6 @@ namespace http { s << "Peer test is running" << std::endl; } - void HTTPConnection::AsyncStreamReceive () - { - if (m_Stream) - m_Stream->AsyncReceive (boost::asio::buffer (m_StreamBuffer, 8192), - std::bind (&HTTPConnection::HandleStreamReceive, shared_from_this (), - std::placeholders::_1, std::placeholders::_2), - 45); // 45 seconds timeout - } - - void HTTPConnection::HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred) - { - if (!ecode) - { - boost::asio::async_write (*m_Socket, boost::asio::buffer (m_StreamBuffer, bytes_transferred), - std::bind (&HTTPConnection::HandleWrite, shared_from_this (), std::placeholders::_1)); - } - else - { - if (ecode == boost::asio::error::timed_out) - SendError ("Host not responding"); - else if (ecode != boost::asio::error::operation_aborted) - Terminate (); - } - } - void HTTPConnection::SendReply (const std::string& content, int code) { std::time_t time_now = std::time(nullptr); diff --git a/HTTPServer.h b/HTTPServer.h index a6ef52cc..cafa9b46 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -13,17 +13,15 @@ namespace http { HTTPConnection (std::shared_ptr socket): m_Socket (socket), m_Timer (socket->get_io_service ()), - m_Stream (nullptr), m_BufferLen (0) {}; + m_BufferLen (0) {}; void Receive (); private: void Terminate (); void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred); - void AsyncStreamReceive (); - void HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred); void HandleWriteReply(const boost::system::error_code& ecode); - void HandleWrite (const boost::system::error_code& ecode); + void SendReply (const std::string& content, int code = 200); void SendError (const std::string& message); @@ -51,8 +49,7 @@ namespace http { std::shared_ptr m_Socket; boost::asio::deadline_timer m_Timer; - std::shared_ptr m_Stream; - char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1], m_StreamBuffer[HTTP_CONNECTION_BUFFER_SIZE + 1]; + char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1]; size_t m_BufferLen; protected: From fd928e8d12167c87ff63f540d7a2d0c9ff9cd78f Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 21/51] * HTTPServer.h: not virtual: not inherited anywhere --- HTTPServer.h | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/HTTPServer.h b/HTTPServer.h index cafa9b46..18c6bed8 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -25,6 +25,7 @@ namespace http { void SendReply (const std::string& content, int code = 200); void SendError (const std::string& message); + void RunRequest (); void HandleRequest (const std::string& uri); void HandlePage (std::stringstream& s, const std::string& request); void HandleCommand (std::stringstream& s, const std::string& request); @@ -45,16 +46,12 @@ namespace http { void StopAcceptingTunnels (std::stringstream& s); void RunPeerTest (std::stringstream& s); - protected: + private: std::shared_ptr m_Socket; boost::asio::deadline_timer m_Timer; char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1]; size_t m_BufferLen; - - protected: - - virtual void RunRequest (); }; class HTTPServer @@ -62,7 +59,7 @@ namespace http { public: HTTPServer (const std::string& address, int port); - virtual ~HTTPServer (); + ~HTTPServer (); void Start (); void Stop (); @@ -73,6 +70,7 @@ namespace http { void Accept (); void HandleAccept(const boost::system::error_code& ecode, std::shared_ptr newSocket); + void CreateConnection(std::shared_ptr newSocket); private: @@ -80,9 +78,6 @@ namespace http { boost::asio::io_service m_Service; boost::asio::io_service::work m_Work; boost::asio::ip::tcp::acceptor m_Acceptor; - - protected: - virtual void CreateConnection(std::shared_ptr newSocket); }; } // http } // i2p From 0c8fdfca7d9670a692891cebb25ef8848411a794 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 22/51] * HTTPServer.{cpp,h}: merge HandleWriteReply & Terminate : the same purpose --- HTTPServer.cpp | 36 +++++++++++++++--------------------- HTTPServer.h | 3 +-- 2 files changed, 16 insertions(+), 23 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 5f195792..c7b91fd0 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -230,11 +230,6 @@ namespace http { { "stats.i2p", "http://7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq.b32.i2p/cgi-bin/jump.cgi?a=" }, }; - void HTTPConnection::Terminate () - { - m_Socket->close (); - } - void HTTPConnection::Receive () { m_Socket->async_read_some (boost::asio::buffer (m_Buffer, HTTP_CONNECTION_BUFFER_SIZE), @@ -244,15 +239,15 @@ namespace http { void HTTPConnection::HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred) { - if (!ecode) - { - m_Buffer[bytes_transferred] = '\0'; - m_BufferLen = bytes_transferred; - RunRequest(); - Receive (); + if (ecode) { + if (ecode != boost::asio::error::operation_aborted) + Terminate (ecode); + return; } - else if (ecode != boost::asio::error::operation_aborted) - Terminate (); + m_Buffer[bytes_transferred] = '\0'; + m_BufferLen = bytes_transferred; + RunRequest(); + Receive (); } void HTTPConnection::RunRequest () @@ -269,14 +264,13 @@ namespace http { HandleRequest (request.uri); } - void HTTPConnection::HandleWriteReply (const boost::system::error_code& ecode) + void HTTPConnection::Terminate (const boost::system::error_code& ecode) { - if (ecode != boost::asio::error::operation_aborted) - { - boost::system::error_code ignored_ec; - m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); - Terminate (); - } + if (ecode == boost::asio::error::operation_aborted) + return; + boost::system::error_code ignored_ec; + m_Socket->shutdown(boost::asio::ip::tcp::socket::shutdown_both, ignored_ec); + m_Socket->close (); } void HTTPConnection::HandleRequest (const std::string &uri) @@ -767,7 +761,7 @@ namespace http { buffers.push_back(boost::asio::buffer(content)); boost::asio::async_write (*m_Socket, buffers, - std::bind (&HTTPConnection::HandleWriteReply, shared_from_this (), std::placeholders::_1)); + std::bind (&HTTPConnection::Terminate, shared_from_this (), std::placeholders::_1)); } void HTTPConnection::SendError(const std::string& content) diff --git a/HTTPServer.h b/HTTPServer.h index 18c6bed8..f3070502 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -18,9 +18,8 @@ namespace http { private: - void Terminate (); void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred); - void HandleWriteReply(const boost::system::error_code& ecode); + void Terminate (const boost::system::error_code& ecode); void SendReply (const std::string& content, int code = 200); void SendError (const std::string& message); From 4d98a64000bf3ccce04f5165a59c3deb3f29beac Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 23/51] * HTTPServer.{cpp,h}: extract html-rendering methods from class --- HTTPServer.cpp | 734 ++++++++++++++++++++++++------------------------- HTTPServer.h | 16 -- 2 files changed, 367 insertions(+), 383 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index c7b91fd0..98080808 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -230,6 +230,373 @@ namespace http { { "stats.i2p", "http://7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq.b32.i2p/cgi-bin/jump.cgi?a=" }, }; + void ShowStatus (std::stringstream& s) + { + s << "Uptime: " << boost::posix_time::to_simple_string ( + boost::posix_time::time_duration (boost::posix_time::seconds ( + i2p::context.GetUptime ()))) << "
\r\n"; + s << "Status: "; + switch (i2p::context.GetStatus ()) + { + case eRouterStatusOK: s << "OK"; break; + case eRouterStatusTesting: s << "Testing"; break; + case eRouterStatusFirewalled: s << "Firewalled"; break; + default: s << "Unknown"; + } + s << "
\r\n"; + s << "Tunnel creation success rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
\r\n"; + s << "Received: "; + s << std::fixed << std::setprecision(2); + auto numKBytesReceived = (double) i2p::transport::transports.GetTotalReceivedBytes () / 1024; + if (numKBytesReceived < 1024) + s << numKBytesReceived << " KiB"; + else if (numKBytesReceived < 1024 * 1024) + s << numKBytesReceived / 1024 << " MiB"; + else + s << numKBytesReceived / 1024 / 1024 << " GiB"; + s << " (" << (double) i2p::transport::transports.GetInBandwidth () / 1024 << " KiB/s)
\r\n"; + s << "Sent: "; + auto numKBytesSent = (double) i2p::transport::transports.GetTotalSentBytes () / 1024; + if (numKBytesSent < 1024) + s << numKBytesSent << " KiB"; + else if (numKBytesSent < 1024 * 1024) + s << numKBytesSent / 1024 << " MiB"; + else + s << numKBytesSent / 1024 / 1024 << " GiB"; + s << " (" << (double) i2p::transport::transports.GetOutBandwidth () / 1024 << " KiB/s)
\r\n"; + s << "Data path: " << i2p::fs::GetDataDir() << "
\r\n
\r\n"; + s << "Our external address:" << "
\r\n" ; + for (auto address : i2p::context.GetRouterInfo().GetAddresses()) + { + switch (address->transportStyle) + { + case i2p::data::RouterInfo::eTransportNTCP: + if (address->host.is_v6 ()) + s << "NTCP6  "; + else + s << "NTCP  "; + break; + case i2p::data::RouterInfo::eTransportSSU: + if (address->host.is_v6 ()) + s << "SSU6     "; + else + s << "SSU     "; + break; + default: + s << "Unknown  "; + } + s << address->host.to_string() << ":" << address->port << "
\r\n"; + } + s << "
\r\nRouters: " << i2p::data::netdb.GetNumRouters () << " "; + s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << " "; + s << "LeaseSets: " << i2p::data::netdb.GetNumLeaseSets () << "
\r\n"; + + size_t clientTunnelCount = i2p::tunnel::tunnels.CountOutboundTunnels(); + clientTunnelCount += i2p::tunnel::tunnels.CountInboundTunnels(); + size_t transitTunnelCount = i2p::tunnel::tunnels.CountTransitTunnels(); + + s << "Client Tunnels: " << std::to_string(clientTunnelCount) << " "; + s << "Transit Tunnels: " << std::to_string(transitTunnelCount) << "
\r\n"; + } + + void ShowJumpServices (std::stringstream& s, const std::string& address) + { + s << "
"; + s << ""; + s << ""; + s << ""; + s << "

\r\n"; + s << "Jump services for " << address << "\r\n\r\n"; + } + + void ShowLocalDestinations (std::stringstream& s) + { + s << "Local Destinations:
\r\n
\r\n"; + for (auto& it: i2p::client::context.GetDestinations ()) + { + auto ident = it.second->GetIdentHash ();; + s << ""; + s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; + } + } + + void ShowLocalDestination (std::stringstream& s, const std::string& b32) + { + s << "Local Destination:
\r\n
\r\n"; + i2p::data::IdentHash ident; + ident.FromBase32 (b32); + auto dest = i2p::client::context.FindLocalDestination (ident); + if (dest) + { + s << "Base64:
\r\n
\r\n
\r\n"; + s << "LeaseSets: " << dest->GetNumRemoteLeaseSets () << "
\r\n"; + auto pool = dest->GetTunnelPool (); + if (pool) + { + s << "Tunnels:
\r\n"; + for (auto it: pool->GetOutboundTunnels ()) + { + it->Print (s); + auto state = it->GetState (); + if (state == i2p::tunnel::eTunnelStateFailed) + s << " " << "Failed"; + else if (state == i2p::tunnel::eTunnelStateExpiring) + s << " " << "Exp"; + s << "
\r\n" << std::endl; + } + for (auto it: pool->GetInboundTunnels ()) + { + it->Print (s); + auto state = it->GetState (); + if (state == i2p::tunnel::eTunnelStateFailed) + s << " " << "Failed"; + else if (state == i2p::tunnel::eTunnelStateExpiring) + s << " " << "Exp"; + s << "
\r\n" << std::endl; + } + } + s << "Tags
Incoming: " << dest->GetNumIncomingTags () << "
Outgoing:
" << std::endl; + for (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; + // } + s << "
\r\n"; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + + for (auto it: dest->GetAllStreams ()) + { + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << ""; + s << "
\r\n" << std::endl; + } + } + } + + void ShowTunnels (std::stringstream& s) + { + s << "Tunnels:
\r\n
\r\n"; + s << "Queue size: " << i2p::tunnel::tunnels.GetQueueSize () << "
\r\n"; + for (auto it: i2p::tunnel::tunnels.GetOutboundTunnels ()) + { + it->Print (s); + auto state = it->GetState (); + if (state == i2p::tunnel::eTunnelStateFailed) + s << " " << "Failed"; + else if (state == i2p::tunnel::eTunnelStateExpiring) + s << " " << "Expiring"; + s << " " << (int)it->GetNumSentBytes () << "
\r\n"; + s << std::endl; + } + + for (auto it: i2p::tunnel::tunnels.GetInboundTunnels ()) + { + it->Print (s); + auto state = it->GetState (); + if (state == i2p::tunnel::eTunnelStateFailed) + s << " " << "Failed"; + else if (state == i2p::tunnel::eTunnelStateExpiring) + s << " " << "Expiring"; + s << " " << (int)it->GetNumReceivedBytes () << "
\r\n"; + s << std::endl; + } + } + + void ShowTransitTunnels (std::stringstream& s) + { + s << "Transit tunnels:
\r\n
\r\n"; + for (auto it: i2p::tunnel::tunnels.GetTransitTunnels ()) + { + if (std::dynamic_pointer_cast(it)) + s << it->GetTunnelID () << " ⇒ "; + else if (std::dynamic_pointer_cast(it)) + s << " ⇒ " << it->GetTunnelID (); + else + s << " ⇒ " << it->GetTunnelID () << " ⇒ "; + s << " " << it->GetNumTransmittedBytes () << "
\r\n"; + } + } + + void ShowTransports (std::stringstream& s) + { + s << "Transports:
\r\n
\r\n"; + auto ntcpServer = i2p::transport::transports.GetNTCPServer (); + if (ntcpServer) + { + s << "NTCP
\r\n"; + for (auto it: ntcpServer->GetNTCPSessions ()) + { + if (it.second && it.second->IsEstablished ()) + { + // incoming connection doesn't have remote RI + if (it.second->IsOutgoing ()) s << " ⇒ "; + s << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": " + << it.second->GetSocket ().remote_endpoint().address ().to_string (); + if (!it.second->IsOutgoing ()) s << " ⇒ "; + s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; + s << "
\r\n" << std::endl; + } + } + } + auto ssuServer = i2p::transport::transports.GetSSUServer (); + if (ssuServer) + { + s << "
\r\nSSU
\r\n"; + for (auto it: ssuServer->GetSessions ()) + { + auto endpoint = it.second->GetRemoteEndpoint (); + if (it.second->IsOutgoing ()) s << " ⇒ "; + s << endpoint.address ().to_string () << ":" << endpoint.port (); + if (!it.second->IsOutgoing ()) s << " ⇒ "; + s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; + if (it.second->GetRelayTag ()) + s << " [itag:" << it.second->GetRelayTag () << "]"; + s << "
\r\n" << std::endl; + } + s << "
\r\nSSU6
\r\n"; + for (auto it: ssuServer->GetSessionsV6 ()) + { + auto endpoint = it.second->GetRemoteEndpoint (); + if (it.second->IsOutgoing ()) s << " ⇒ "; + s << endpoint.address ().to_string () << ":" << endpoint.port (); + if (!it.second->IsOutgoing ()) s << " ⇒ "; + s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; + s << "
\r\n" << std::endl; + } + } + } + + void ShowSAMSessions (std::stringstream& s) + { + s << "SAM Sessions:
\r\n
\r\n"; + auto sam = i2p::client::context.GetSAMBridge (); + if (sam) + { + for (auto& it: sam->GetSessions ()) + { + s << ""; + s << it.first << "
\r\n" << std::endl; + } + } + } + + void ShowSAMSession (std::stringstream& s, const std::string& id) + { + s << "SAM Session:
\r\n
\r\n"; + auto sam = i2p::client::context.GetSAMBridge (); + if (sam) + { + auto session = sam->FindSession (id); + if (session) + { + auto& ident = session->localDestination->GetIdentHash(); + s << ""; + s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; + s << "Streams:
\r\n"; + for (auto it: session->ListSockets()) + { + switch (it->GetSocketType ()) + { + case i2p::client::eSAMSocketTypeSession: + s << "session"; + break; + case i2p::client::eSAMSocketTypeStream: + s << "stream"; + break; + case i2p::client::eSAMSocketTypeAcceptor: + s << "acceptor"; + break; + default: + s << "unknown"; + } + s << " [" << it->GetSocket ().remote_endpoint() << "]"; + s << "
\r\n" << std::endl; + } + } + } + } + + void ShowI2PTunnels (std::stringstream& s) + { + s << "Client Tunnels:
\r\n
\r\n"; + for (auto& it: i2p::client::context.GetClientTunnels ()) + { + auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); + s << ""; + s << it.second->GetName () << " ⇐ "; + s << i2p::client::context.GetAddressBook ().ToAddress(ident); + s << "
\r\n"<< std::endl; + } + s << "
\r\nServer Tunnels:
\r\n
\r\n"; + for (auto& it: i2p::client::context.GetServerTunnels ()) + { + auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); + s << ""; + s << it.second->GetName () << " ⇒ "; + s << i2p::client::context.GetAddressBook ().ToAddress(ident); + s << ":" << it.second->GetLocalPort (); + s << "
\r\n"<< std::endl; + } + } + + void StopAcceptingTunnels (std::stringstream& s) + { + s << "Stop Accepting Tunnels:
\r\n
\r\n"; + i2p::context.SetAcceptsTunnels (false); + s << "Accepting tunnels stopped" << std::endl; + } + + void StartAcceptingTunnels (std::stringstream& s) + { + s << "Start Accepting Tunnels:
\r\n
\r\n"; + i2p::context.SetAcceptsTunnels (true); + s << "Accepting tunnels started" << std::endl; + } + + void RunPeerTest (std::stringstream& s) + { + s << "Run Peer Test:
\r\n
\r\n"; + i2p::transport::transports.PeerTest (); + s << "Peer test is running" << std::endl; + } + void HTTPConnection::Receive () { m_Socket->async_read_some (boost::asio::buffer (m_Buffer, HTTP_CONNECTION_BUFFER_SIZE), @@ -323,75 +690,6 @@ namespace http { SendReply (s.str ()); } - void HTTPConnection::ShowStatus (std::stringstream& s) - { - s << "Uptime: " << boost::posix_time::to_simple_string ( - boost::posix_time::time_duration (boost::posix_time::seconds ( - i2p::context.GetUptime ()))) << "
\r\n"; - s << "Status: "; - switch (i2p::context.GetStatus ()) - { - case eRouterStatusOK: s << "OK"; break; - case eRouterStatusTesting: s << "Testing"; break; - case eRouterStatusFirewalled: s << "Firewalled"; break; - default: s << "Unknown"; - } - s << "
\r\n"; - s << "Tunnel creation success rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
\r\n"; - s << "Received: "; - s << std::fixed << std::setprecision(2); - auto numKBytesReceived = (double) i2p::transport::transports.GetTotalReceivedBytes () / 1024; - if (numKBytesReceived < 1024) - s << numKBytesReceived << " KiB"; - else if (numKBytesReceived < 1024 * 1024) - s << numKBytesReceived / 1024 << " MiB"; - else - s << numKBytesReceived / 1024 / 1024 << " GiB"; - s << " (" << (double) i2p::transport::transports.GetInBandwidth () / 1024 << " KiB/s)
\r\n"; - s << "Sent: "; - auto numKBytesSent = (double) i2p::transport::transports.GetTotalSentBytes () / 1024; - if (numKBytesSent < 1024) - s << numKBytesSent << " KiB"; - else if (numKBytesSent < 1024 * 1024) - s << numKBytesSent / 1024 << " MiB"; - else - s << numKBytesSent / 1024 / 1024 << " GiB"; - s << " (" << (double) i2p::transport::transports.GetOutBandwidth () / 1024 << " KiB/s)
\r\n"; - s << "Data path: " << i2p::fs::GetDataDir() << "
\r\n
\r\n"; - s << "Our external address:" << "
\r\n" ; - for (auto address : i2p::context.GetRouterInfo().GetAddresses()) - { - switch (address->transportStyle) - { - case i2p::data::RouterInfo::eTransportNTCP: - if (address->host.is_v6 ()) - s << "NTCP6  "; - else - s << "NTCP  "; - break; - case i2p::data::RouterInfo::eTransportSSU: - if (address->host.is_v6 ()) - s << "SSU6     "; - else - s << "SSU     "; - break; - default: - s << "Unknown  "; - } - s << address->host.to_string() << ":" << address->port << "
\r\n"; - } - s << "
\r\nRouters: " << i2p::data::netdb.GetNumRouters () << " "; - s << "Floodfills: " << i2p::data::netdb.GetNumFloodfills () << " "; - s << "LeaseSets: " << i2p::data::netdb.GetNumLeaseSets () << "
\r\n"; - - size_t clientTunnelCount = i2p::tunnel::tunnels.CountOutboundTunnels(); - clientTunnelCount += i2p::tunnel::tunnels.CountInboundTunnels(); - size_t transitTunnelCount = i2p::tunnel::tunnels.CountTransitTunnels(); - - s << "Client Tunnels: " << std::to_string(clientTunnelCount) << " "; - s << "Transit Tunnels: " << std::to_string(transitTunnelCount) << "
\r\n"; - } - void HTTPConnection::HandlePage (std::stringstream& s, const std::string & uri) { std::map params; @@ -444,304 +742,6 @@ namespace http { SendError("Unknown command: " + cmd); } - void HTTPConnection::ShowJumpServices (std::stringstream& s, const std::string& address) - { - s << "
"; - s << ""; - s << ""; - s << ""; - s << "
\r\n"; - s << "Jump services for " << address << "\r\n\r\n"; - } - - void HTTPConnection::ShowLocalDestinations (std::stringstream& s) - { - s << "Local Destinations:
\r\n
\r\n"; - for (auto& it: i2p::client::context.GetDestinations ()) - { - auto ident = it.second->GetIdentHash ();; - s << ""; - s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; - } - } - - void HTTPConnection::ShowLocalDestination (std::stringstream& s, const std::string& b32) - { - s << "Local Destination:
\r\n
\r\n"; - i2p::data::IdentHash ident; - ident.FromBase32 (b32); - auto dest = i2p::client::context.FindLocalDestination (ident); - if (dest) - { - s << "Base64:
\r\n
\r\n
\r\n"; - s << "LeaseSets: " << dest->GetNumRemoteLeaseSets () << "
\r\n"; - auto pool = dest->GetTunnelPool (); - if (pool) - { - s << "Tunnels:
\r\n"; - for (auto it: pool->GetOutboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; - s << "
\r\n" << std::endl; - } - for (auto it: pool->GetInboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; - s << "
\r\n" << std::endl; - } - } - s << "Tags
Incoming: " << dest->GetNumIncomingTags () << "
Outgoing:
" << std::endl; - for (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; - // } - s << "
\r\n
Streams
StreamIDDestinationSentReceivedOutInBufRTTWindowStatus
" << it->GetSendStreamID () << "" << i2p::client::context.GetAddressBook ().ToAddress(it->GetRemoteIdentity ()) << "" << it->GetNumSentBytes () << "" << it->GetNumReceivedBytes () << "" << it->GetSendQueueSize () << "" << it->GetReceiveQueueSize () << "" << it->GetSendBufferSize () << "" << it->GetRTT () << "" << it->GetWindowSize () << "" << (int)it->GetStatus () << "
"; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - - for (auto it: dest->GetAllStreams ()) - { - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << ""; - s << "
\r\n" << std::endl; - } - } - } - - void HTTPConnection::ShowTunnels (std::stringstream& s) - { - s << "Tunnels:
\r\n
\r\n"; - s << "Queue size: " << i2p::tunnel::tunnels.GetQueueSize () << "
\r\n"; - for (auto it: i2p::tunnel::tunnels.GetOutboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Expiring"; - s << " " << (int)it->GetNumSentBytes () << "
\r\n"; - s << std::endl; - } - - for (auto it: i2p::tunnel::tunnels.GetInboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Expiring"; - s << " " << (int)it->GetNumReceivedBytes () << "
\r\n"; - s << std::endl; - } - } - - void HTTPConnection::ShowTransitTunnels (std::stringstream& s) - { - s << "Transit tunnels:
\r\n
\r\n"; - for (auto it: i2p::tunnel::tunnels.GetTransitTunnels ()) - { - if (std::dynamic_pointer_cast(it)) - s << it->GetTunnelID () << " ⇒ "; - else if (std::dynamic_pointer_cast(it)) - s << " ⇒ " << it->GetTunnelID (); - else - s << " ⇒ " << it->GetTunnelID () << " ⇒ "; - s << " " << it->GetNumTransmittedBytes () << "
\r\n"; - } - } - - void HTTPConnection::ShowTransports (std::stringstream& s) - { - s << "Transports:
\r\n
\r\n"; - auto ntcpServer = i2p::transport::transports.GetNTCPServer (); - if (ntcpServer) - { - s << "NTCP
\r\n"; - for (auto it: ntcpServer->GetNTCPSessions ()) - { - if (it.second && it.second->IsEstablished ()) - { - // incoming connection doesn't have remote RI - if (it.second->IsOutgoing ()) s << " ⇒ "; - s << i2p::data::GetIdentHashAbbreviation (it.second->GetRemoteIdentity ()->GetIdentHash ()) << ": " - << it.second->GetSocket ().remote_endpoint().address ().to_string (); - if (!it.second->IsOutgoing ()) s << " ⇒ "; - s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; - s << "
\r\n" << std::endl; - } - } - } - auto ssuServer = i2p::transport::transports.GetSSUServer (); - if (ssuServer) - { - s << "
\r\nSSU
\r\n"; - for (auto it: ssuServer->GetSessions ()) - { - auto endpoint = it.second->GetRemoteEndpoint (); - if (it.second->IsOutgoing ()) s << " ⇒ "; - s << endpoint.address ().to_string () << ":" << endpoint.port (); - if (!it.second->IsOutgoing ()) s << " ⇒ "; - s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; - if (it.second->GetRelayTag ()) - s << " [itag:" << it.second->GetRelayTag () << "]"; - s << "
\r\n" << std::endl; - } - s << "
\r\nSSU6
\r\n"; - for (auto it: ssuServer->GetSessionsV6 ()) - { - auto endpoint = it.second->GetRemoteEndpoint (); - if (it.second->IsOutgoing ()) s << " ⇒ "; - s << endpoint.address ().to_string () << ":" << endpoint.port (); - if (!it.second->IsOutgoing ()) s << " ⇒ "; - s << " [" << it.second->GetNumSentBytes () << ":" << it.second->GetNumReceivedBytes () << "]"; - s << "
\r\n" << std::endl; - } - } - } - - void HTTPConnection::ShowSAMSessions (std::stringstream& s) - { - s << "SAM Sessions:
\r\n
\r\n"; - auto sam = i2p::client::context.GetSAMBridge (); - if (sam) - { - for (auto& it: sam->GetSessions ()) - { - s << ""; - s << it.first << "
\r\n" << std::endl; - } - } - } - - void HTTPConnection::ShowSAMSession (std::stringstream& s, const std::string& id) - { - s << "SAM Session:
\r\n
\r\n"; - auto sam = i2p::client::context.GetSAMBridge (); - if (sam) - { - auto session = sam->FindSession (id); - if (session) - { - auto& ident = session->localDestination->GetIdentHash(); - s << ""; - s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; - s << "Streams:
\r\n"; - for (auto it: session->ListSockets()) - { - switch (it->GetSocketType ()) - { - case i2p::client::eSAMSocketTypeSession: - s << "session"; - break; - case i2p::client::eSAMSocketTypeStream: - s << "stream"; - break; - case i2p::client::eSAMSocketTypeAcceptor: - s << "acceptor"; - break; - default: - s << "unknown"; - } - s << " [" << it->GetSocket ().remote_endpoint() << "]"; - s << "
\r\n" << std::endl; - } - } - } - } - - void HTTPConnection::ShowI2PTunnels (std::stringstream& s) - { - s << "Client Tunnels:
\r\n
\r\n"; - for (auto& it: i2p::client::context.GetClientTunnels ()) - { - auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); - s << ""; - s << it.second->GetName () << " ⇐ "; - s << i2p::client::context.GetAddressBook ().ToAddress(ident); - s << "
\r\n"<< std::endl; - } - s << "
\r\nServer Tunnels:
\r\n
\r\n"; - for (auto& it: i2p::client::context.GetServerTunnels ()) - { - auto& ident = it.second->GetLocalDestination ()->GetIdentHash(); - s << ""; - s << it.second->GetName () << " ⇒ "; - s << i2p::client::context.GetAddressBook ().ToAddress(ident); - s << ":" << it.second->GetLocalPort (); - s << "
\r\n"<< std::endl; - } - } - - void HTTPConnection::StopAcceptingTunnels (std::stringstream& s) - { - s << "Stop Accepting Tunnels:
\r\n
\r\n"; - i2p::context.SetAcceptsTunnels (false); - s << "Accepting tunnels stopped" << std::endl; - } - - void HTTPConnection::StartAcceptingTunnels (std::stringstream& s) - { - s << "Start Accepting Tunnels:
\r\n
\r\n"; - i2p::context.SetAcceptsTunnels (true); - s << "Accepting tunnels started" << std::endl; - } - - void HTTPConnection::RunPeerTest (std::stringstream& s) - { - s << "Run Peer Test:
\r\n
\r\n"; - i2p::transport::transports.PeerTest (); - s << "Peer test is running" << std::endl; - } - void HTTPConnection::SendReply (const std::string& content, int code) { std::time_t time_now = std::time(nullptr); diff --git a/HTTPServer.h b/HTTPServer.h index f3070502..06fa4457 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -29,22 +29,6 @@ namespace http { void HandlePage (std::stringstream& s, const std::string& request); void HandleCommand (std::stringstream& s, const std::string& request); - /* pages */ - void ShowJumpServices (std::stringstream& s, const std::string& address); - void ShowTransports (std::stringstream& s); - void ShowTunnels (std::stringstream& s); - void ShowStatus (std::stringstream& s); - void ShowTransitTunnels (std::stringstream& s); - void ShowLocalDestinations (std::stringstream& s); - void ShowLocalDestination (std::stringstream& s, const std::string& b32); - void ShowSAMSessions (std::stringstream& s); - void ShowSAMSession (std::stringstream& s, const std::string& id); - void ShowI2PTunnels (std::stringstream& s); - /* commands */ - void StartAcceptingTunnels (std::stringstream& s); - void StopAcceptingTunnels (std::stringstream& s); - void RunPeerTest (std::stringstream& s); - private: std::shared_ptr m_Socket; From 849308e28d3f0852bf86873399bea809d16719fe Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 24/51] * HTTPServer.cpp: drop boost::date_time dep --- HTTPServer.cpp | 25 +++++++++++++++++++++---- 1 file changed, 21 insertions(+), 4 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 98080808..d5a4622e 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -6,7 +6,6 @@ #include #include -#include #include "Base.h" #include "FS.h" @@ -230,11 +229,29 @@ namespace http { { "stats.i2p", "http://7tbay5p4kzeekxvyvbf6v7eauazemsnnl2aoyqhg5jzpr5eke7tq.b32.i2p/cgi-bin/jump.cgi?a=" }, }; + void ShowUptime (std::stringstream& s, int seconds) { + int num; + + if ((num = seconds / 86400) > 0) { + s << num << " days, "; + seconds -= num; + } + if ((num = seconds / 3600) > 0) { + s << num << " hours, "; + seconds -= num; + } + if ((num = seconds / 60) > 0) { + s << num << " min, "; + seconds -= num; + } + s << seconds << " seconds"; + } + void ShowStatus (std::stringstream& s) { - s << "Uptime: " << boost::posix_time::to_simple_string ( - boost::posix_time::time_duration (boost::posix_time::seconds ( - i2p::context.GetUptime ()))) << "
\r\n"; + s << "Uptime: "; + ShowUptime(s, i2p::context.GetUptime ()); + s << "
\r\n"; s << "Status: "; switch (i2p::context.GetStatus ()) { From 65395516b0b087d09fc28ae3df9dd012f38160e0 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 25/51] * HTTPServer.cpp: drop separate function handlers for commands --- HTTPServer.cpp | 36 +++++++++--------------------------- 1 file changed, 9 insertions(+), 27 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index d5a4622e..d3a57b50 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -593,27 +593,6 @@ namespace http { } } - void StopAcceptingTunnels (std::stringstream& s) - { - s << "Stop Accepting Tunnels:
\r\n
\r\n"; - i2p::context.SetAcceptsTunnels (false); - s << "Accepting tunnels stopped" << std::endl; - } - - void StartAcceptingTunnels (std::stringstream& s) - { - s << "Start Accepting Tunnels:
\r\n
\r\n"; - i2p::context.SetAcceptsTunnels (true); - s << "Accepting tunnels started" << std::endl; - } - - void RunPeerTest (std::stringstream& s) - { - s << "Run Peer Test:
\r\n
\r\n"; - i2p::transport::transports.PeerTest (); - s << "Peer test is running" << std::endl; - } - void HTTPConnection::Receive () { m_Socket->async_read_some (boost::asio::buffer (m_Buffer, HTTP_CONNECTION_BUFFER_SIZE), @@ -749,14 +728,17 @@ namespace http { url.parse_query(params); cmd = params["cmd"]; - if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) - StartAcceptingTunnels (s); + if (cmd == HTTP_COMMAND_RUN_PEER_TEST) + i2p::transport::transports.PeerTest (); + else if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) + i2p::context.SetAcceptsTunnels (true); else if (cmd == HTTP_COMMAND_STOP_ACCEPTING_TUNNELS) - StopAcceptingTunnels (s); - else if (cmd == HTTP_COMMAND_RUN_PEER_TEST) - RunPeerTest (s); - else + i2p::context.SetAcceptsTunnels (false); + else { SendError("Unknown command: " + cmd); + return; + } + s << "Command accepted"; } void HTTPConnection::SendReply (const std::string& content, int code) From 23b8df1c36a420f367b12bfa5e897bb163813e2a Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 26/51] * HTTPServer.cpp: move commands to separate page --- HTTPServer.cpp | 28 ++++++++++++++++++---------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index d3a57b50..44841a91 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -217,6 +217,7 @@ namespace http { const char HTTP_PAGE_SAM_SESSION[] = "sam_session"; const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels"; const char HTTP_PAGE_JUMPSERVICES[] = "jumpservices"; + const char HTTP_PAGE_COMMANDS[] = "commands"; const char HTTP_COMMAND_START_ACCEPTING_TUNNELS[] = "start_accepting_tunnels"; const char HTTP_COMMAND_STOP_ACCEPTING_TUNNELS[] = "stop_accepting_tunnels"; const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test"; @@ -452,10 +453,20 @@ namespace http { else if (state == i2p::tunnel::eTunnelStateExpiring) s << " " << "Expiring"; s << " " << (int)it->GetNumReceivedBytes () << "
\r\n"; - s << std::endl; } } + void ShowCommands (std::stringstream& s) + { + /* commands */ + s << "Router Commands
\r\n"; + s << " Run peer test
\r\n"; + if (i2p::context.AcceptsTunnels ()) + s << " Stop accepting tunnels
\r\n"; + else + s << " Start accepting tunnels
\r\n"; + } + void ShowTransitTunnels (std::stringstream& s) { s << "Transit tunnels:
\r\n
\r\n"; @@ -655,22 +666,16 @@ namespace http { "
\r\n" "
\r\n" " Main page
\r\n
\r\n" + " Router commands
\r\n" " Local destinations
\r\n" " Tunnels
\r\n" " Transit tunnels
\r\n" " Transports
\r\n" " I2P tunnels
\r\n" - " Jump services
\r\n" + " Jump services
\r\n" ; if (i2p::client::context.GetSAMBridge ()) s << " SAM sessions
\r\n"; - /* commands */ - s << "
\r\n"; - s << " Run peer test
\r\n"; - if (i2p::context.AcceptsTunnels ()) - s << " Stop accepting tunnels
\r\n"; - else - s << " Start accepting tunnels
\r\n"; s << "
\r\n"; s << "
"; if (uri.find("page=") != std::string::npos) @@ -700,6 +705,8 @@ namespace http { ShowTransports (s); else if (page == HTTP_PAGE_TUNNELS) ShowTunnels (s); + else if (page == HTTP_PAGE_COMMANDS) + ShowCommands (s); else if (page == HTTP_PAGE_JUMPSERVICES) ShowJumpServices (s, params["address"]); else if (page == HTTP_PAGE_TRANSIT_TUNNELS) @@ -738,7 +745,8 @@ namespace http { SendError("Unknown command: " + cmd); return; } - s << "Command accepted"; + s << "Command accepted

\r\n"; + s << "Back to commands list"; } void HTTPConnection::SendReply (const std::string& content, int code) From 54078087e5713da4b692563b55a1b3420462a0cd Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 27/51] * HTTPServer.cpp: move common code to function --- HTTPServer.cpp | 78 ++++++++++++++++++++++++-------------------------- 1 file changed, 38 insertions(+), 40 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 44841a91..142c392b 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -248,6 +248,23 @@ namespace http { s << seconds << " seconds"; } + void ShowTunnelDetails (std::stringstream& s, enum i2p::tunnel::TunnelState eState, int bytes) + { + std::string state; + switch (eState) { + case i2p::tunnel::eTunnelStateBuildReplyReceived : + case i2p::tunnel::eTunnelStatePending : state = "building"; break; + case i2p::tunnel::eTunnelStateBuildFailed : + case i2p::tunnel::eTunnelStateTestFailed : + case i2p::tunnel::eTunnelStateFailed : state = "failed"; break; + case i2p::tunnel::eTunnelStateExpiring : state = "expiring"; break; + case i2p::tunnel::eTunnelStateEstablished : state = "established"; break; + default: state = "unknown"; break; + } + s << " " << state << ", "; + s << " " << (int) (bytes / 1024) << " KiB
\r\n"; + } + void ShowStatus (std::stringstream& s) { s << "Uptime: "; @@ -356,28 +373,19 @@ namespace http { auto pool = dest->GetTunnelPool (); if (pool) { - s << "Tunnels:
\r\n"; - for (auto it: pool->GetOutboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; - s << "
\r\n" << std::endl; + s << "Inbound tunnels:
\r\n"; + for (auto & it : pool->GetInboundTunnels ()) { + it->Print(s); + ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ()); } - for (auto it: pool->GetInboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Exp"; - s << "
\r\n" << std::endl; + s << "
\r\n"; + s << "Outbound tunnels:
\r\n"; + for (auto & it : pool->GetOutboundTunnels ()) { + it->Print(s); + ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ()); } } + s << "
\r\n"; s << "Tags
Incoming: " << dest->GetNumIncomingTags () << "
Outgoing:
" << std::endl; for (auto it: dest->GetSessions ()) { @@ -430,30 +438,20 @@ namespace http { void ShowTunnels (std::stringstream& s) { - s << "Tunnels:
\r\n
\r\n"; s << "Queue size: " << i2p::tunnel::tunnels.GetQueueSize () << "
\r\n"; - for (auto it: i2p::tunnel::tunnels.GetOutboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Expiring"; - s << " " << (int)it->GetNumSentBytes () << "
\r\n"; - s << std::endl; - } - for (auto it: i2p::tunnel::tunnels.GetInboundTunnels ()) - { - it->Print (s); - auto state = it->GetState (); - if (state == i2p::tunnel::eTunnelStateFailed) - s << " " << "Failed"; - else if (state == i2p::tunnel::eTunnelStateExpiring) - s << " " << "Expiring"; - s << " " << (int)it->GetNumReceivedBytes () << "
\r\n"; + s << "Inbound tunnels:
\r\n"; + for (auto & it : i2p::tunnel::tunnels.GetInboundTunnels ()) { + it->Print(s); + ShowTunnelDetails(s, it->GetState (), it->GetNumReceivedBytes ()); } + s << "
\r\n"; + s << "Outbound tunnels:
\r\n"; + for (auto & it : i2p::tunnel::tunnels.GetOutboundTunnels ()) { + it->Print(s); + ShowTunnelDetails(s, it->GetState (), it->GetNumSentBytes ()); + } + s << "
\r\n"; } void ShowCommands (std::stringstream& s) From 1f404bb62291542b7923bb3656b7e23c8e4d0bb0 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 28/51] * HTTPServer.cpp: move html parts outside HTTPConnection class --- HTTPServer.cpp | 70 ++++++++++++++++++++++++++++---------------------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 142c392b..864c9fd3 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -265,6 +265,43 @@ namespace http { s << " " << (int) (bytes / 1024) << " KiB
\r\n"; } + void ShowPageHead (std::stringstream& s) + { + s << + "\r\n" + "\r\n" /* TODO: Add support for locale */ + " \r\n" + " \r\n" /* TODO: Find something to parse html/template system. This is horrible. */ + " \r\n" + " Purple I2P " VERSION " Webconsole\r\n" + << cssStyles << + "\r\n"; + s << + "\r\n" + "
i2pd webconsole
\r\n" + "
\r\n" + "
\r\n" + " Main page
\r\n
\r\n" + " Router commands
\r\n" + " Local destinations
\r\n" + " Tunnels
\r\n" + " Transit tunnels
\r\n" + " Transports
\r\n" + " I2P tunnels
\r\n" + " Jump services
\r\n" + " SAM sessions
\r\n" + "
\r\n" + "
"; + } + + void ShowPageTail (std::stringstream& s) + { + s << + "
\r\n" + "\r\n" + "\r\n"; + } + void ShowStatus (std::stringstream& s) { s << "Uptime: "; @@ -649,43 +686,14 @@ namespace http { { std::stringstream s; // Html5 head start - s << - "\r\n" - "\r\n" /* TODO: Add support for locale */ - " \r\n" - " \r\n" /* TODO: Find something to parse html/template system. This is horrible. */ - " \r\n" - " Purple I2P " VERSION " Webconsole\r\n" - << cssStyles << - "\r\n"; - s << - "\r\n" - "
i2pd webconsole
\r\n" - "
\r\n" - "
\r\n" - " Main page
\r\n
\r\n" - " Router commands
\r\n" - " Local destinations
\r\n" - " Tunnels
\r\n" - " Transit tunnels
\r\n" - " Transports
\r\n" - " I2P tunnels
\r\n" - " Jump services
\r\n" - ; - if (i2p::client::context.GetSAMBridge ()) - s << " SAM sessions
\r\n"; - s << "
\r\n"; - s << "
"; + ShowPageHead (s); if (uri.find("page=") != std::string::npos) HandlePage (s, uri); else if (uri.find("cmd=") != std::string::npos) HandleCommand (s, uri); else ShowStatus (s); - s << - "
\r\n" - "\r\n" - "\r\n"; + ShowPageTail (s); SendReply (s.str ()); } From 80e37df0123067aedc784321ff2c7eb2f0074030 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 29/51] * HTTPServer.{cpp,h}: change page/cmd processing flow --- Daemon.cpp | 1 + HTTPServer.cpp | 55 ++++++++++++++++++++++++++------------------------ HTTPServer.h | 10 ++++----- 3 files changed, 34 insertions(+), 32 deletions(-) diff --git a/Daemon.cpp b/Daemon.cpp index fdb9bf3f..c98bce05 100644 --- a/Daemon.cpp +++ b/Daemon.cpp @@ -13,6 +13,7 @@ #include "RouterInfo.h" #include "RouterContext.h" #include "Tunnel.h" +#include "HTTP.h" #include "NetDb.h" #include "Garlic.h" #include "Streaming.h" diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 864c9fd3..e5093bba 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -302,6 +302,11 @@ namespace http { "\r\n"; } + void ShowError(std::stringstream& s, const std::string& string) + { + s << "ERROR: " << string << "
\r\n"; + } + void ShowStatus (std::stringstream& s) { s << "Uptime: "; @@ -670,7 +675,7 @@ namespace http { } if (ret == 0) return; /* need more data */ - HandleRequest (request.uri); + HandleRequest (request); } void HTTPConnection::Terminate (const boost::system::error_code& ecode) @@ -682,28 +687,31 @@ namespace http { m_Socket->close (); } - void HTTPConnection::HandleRequest (const std::string &uri) + void HTTPConnection::HandleRequest (const HTTPReq & req) { std::stringstream s; + std::string content; + HTTPRes res; // Html5 head start ShowPageHead (s); - if (uri.find("page=") != std::string::npos) - HandlePage (s, uri); - else if (uri.find("cmd=") != std::string::npos) - HandleCommand (s, uri); + if (req.uri.find("page=") != std::string::npos) + HandlePage (req, res, s); + else if (req.uri.find("cmd=") != std::string::npos) + HandleCommand (req, res, s); else ShowStatus (s); ShowPageTail (s); - SendReply (s.str ()); + content = s.str (); + SendReply (res, content); } - void HTTPConnection::HandlePage (std::stringstream& s, const std::string & uri) + void HTTPConnection::HandlePage (const HTTPReq& req, HTTPRes& res, std::stringstream& s) { std::map params; std::string page(""); URL url; - url.parse(uri); + url.parse(req.uri); url.parse_query(params); page = params["page"]; @@ -727,17 +735,20 @@ namespace http { ShowSAMSession (s, params["sam_id"]); else if (page == HTTP_PAGE_I2P_TUNNELS) ShowI2PTunnels (s); - else - SendError("Unknown page: " + page); + else { + res.code = 400; + ShowError(s, "Unknown page: " + page); + return; + } } - void HTTPConnection::HandleCommand (std::stringstream& s, const std::string & uri) + void HTTPConnection::HandleCommand (const HTTPReq& req, HTTPRes& res, std::stringstream& s) { std::map params; std::string cmd(""); URL url; - url.parse(uri); + url.parse(req.uri); url.parse_query(params); cmd = params["cmd"]; @@ -748,21 +759,20 @@ namespace http { else if (cmd == HTTP_COMMAND_STOP_ACCEPTING_TUNNELS) i2p::context.SetAcceptsTunnels (false); else { - SendError("Unknown command: " + cmd); + res.code = 400; + ShowError(s, "Unknown command: " + cmd); return; } - s << "Command accepted

\r\n"; + s << "SUCCESS: Command accepted

\r\n"; s << "Back to commands list"; } - void HTTPConnection::SendReply (const std::string& content, int code) + void HTTPConnection::SendReply (HTTPRes& reply, std::string& content) { std::time_t time_now = std::time(nullptr); char time_buff[128]; std::strftime(time_buff, sizeof(time_buff), "%a, %d %b %Y %H:%M:%S GMT", std::gmtime(&time_now)); - HTTPRes reply; - reply.code = code; - reply.status = HTTPCodeToStatus(code); + reply.status = HTTPCodeToStatus(reply.code); reply.headers.insert(std::pair("Date", time_buff)); reply.headers.insert(std::pair("Content-Type", "text/html")); reply.headers.insert(std::pair("Content-Length", std::to_string(content.size()))); @@ -777,13 +787,6 @@ namespace http { std::bind (&HTTPConnection::Terminate, shared_from_this (), std::placeholders::_1)); } - void HTTPConnection::SendError(const std::string& content) - { - std::stringstream ss; - ss << "" << itoopieImage << "
\r\n" << content << ""; - SendReply (ss.str(), 504); - } - HTTPServer::HTTPServer (const std::string& address, int port): m_Thread (nullptr), m_Work (m_Service), m_Acceptor (m_Service, boost::asio::ip::tcp::endpoint (boost::asio::ip::address::from_string(address), port)) diff --git a/HTTPServer.h b/HTTPServer.h index 06fa4457..72a0c383 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -21,13 +21,11 @@ namespace http { void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred); void Terminate (const boost::system::error_code& ecode); - void SendReply (const std::string& content, int code = 200); - void SendError (const std::string& message); - void RunRequest (); - void HandleRequest (const std::string& uri); - void HandlePage (std::stringstream& s, const std::string& request); - void HandleCommand (std::stringstream& s, const std::string& request); + void HandleRequest (const HTTPReq & req); + void HandlePage (const HTTPReq & req, HTTPRes & res, std::stringstream& data); + void HandleCommand (const HTTPReq & req, HTTPRes & res, std::stringstream& data); + void SendReply (HTTPRes & res, std::string & content); private: From 75db2867dcdd77452414e4cbfec6c19ef3c44619 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 30/51] * HTTPServer.cpp: protect SAM pages if disabled --- HTTPServer.cpp | 65 ++++++++++++++++++++++++-------------------------- 1 file changed, 31 insertions(+), 34 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index e5093bba..7dc8d910 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -573,15 +573,16 @@ namespace http { void ShowSAMSessions (std::stringstream& s) { - s << "SAM Sessions:
\r\n
\r\n"; auto sam = i2p::client::context.GetSAMBridge (); - if (sam) - { - for (auto& it: sam->GetSessions ()) - { - s << ""; - s << it.first << "
\r\n" << std::endl; - } + if (!sam) { + ShowError(s, "SAM disabled"); + return; + } + s << "SAM Sessions:
\r\n
\r\n"; + for (auto& it: sam->GetSessions ()) + { + s << ""; + s << it.first << "
\r\n" << std::endl; } } @@ -589,35 +590,31 @@ namespace http { { s << "SAM Session:
\r\n
\r\n"; auto sam = i2p::client::context.GetSAMBridge (); - if (sam) + if (!sam) { + ShowError(s, "SAM disabled"); + return; + } + auto session = sam->FindSession (id); + if (!session) { + ShowError(s, "SAM session not found"); + return; + } + auto& ident = session->localDestination->GetIdentHash(); + s << ""; + s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n"; + s << "
\r\n"; + s << "Streams:
\r\n"; + for (auto it: session->ListSockets()) { - auto session = sam->FindSession (id); - if (session) + switch (it->GetSocketType ()) { - auto& ident = session->localDestination->GetIdentHash(); - s << ""; - s << i2p::client::context.GetAddressBook ().ToAddress(ident) << "
\r\n" << std::endl; - s << "Streams:
\r\n"; - for (auto it: session->ListSockets()) - { - switch (it->GetSocketType ()) - { - case i2p::client::eSAMSocketTypeSession: - s << "session"; - break; - case i2p::client::eSAMSocketTypeStream: - s << "stream"; - break; - case i2p::client::eSAMSocketTypeAcceptor: - s << "acceptor"; - break; - default: - s << "unknown"; - } - s << " [" << it->GetSocket ().remote_endpoint() << "]"; - s << "
\r\n" << std::endl; - } + case i2p::client::eSAMSocketTypeSession : s << "session"; break; + case i2p::client::eSAMSocketTypeStream : s << "stream"; break; + case i2p::client::eSAMSocketTypeAcceptor : s << "acceptor"; break; + default: s << "unknown"; break; } + s << " [" << it->GetSocket ().remote_endpoint() << "]"; + s << "
\r\n"; } } From e09386be445fde1a9e7fe63bbbabb6cff39ebff4 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 31/51] * add http.auth, http.user & http.pass options --- Config.cpp | 3 +++ docs/configuration.md | 3 +++ 2 files changed, 6 insertions(+) diff --git a/Config.cpp b/Config.cpp index d7cef879..44dec286 100644 --- a/Config.cpp +++ b/Config.cpp @@ -141,6 +141,9 @@ namespace config { ("http.enabled", value()->default_value(true), "Enable or disable webconsole") ("http.address", value()->default_value("127.0.0.1"), "Webconsole listen address") ("http.port", value()->default_value(7070), "Webconsole listen port") + ("http.auth", value()->default_value(false), "Enable Basic HTTP auth for webconsole") + ("http.user", value()->default_value("i2pd"), "Username for basic auth") + ("http.pass", value()->default_value(""), "Password for basic auth (default: random, see logs)") ; options_description httpproxy("HTTP Proxy options"); diff --git a/docs/configuration.md b/docs/configuration.md index 2a639be3..11e8b4a8 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -36,6 +36,9 @@ All options below still possible in cmdline, but better write it in config file: * --http.address= - The address to listen on (HTTP server) * --http.port= - The port to listen on (HTTP server) +* --http.auth - Enable basic HTTP auth for webconsole +* --http.user= - Username for basic auth (default: i2pd) +* --http.pass= - Password for basic auth (default: random, see logs) * --httpproxy.address= - The address to listen on (HTTP Proxy) * --httpproxy.port= - The port to listen on (HTTP Proxy) 4446 by default From 678650beaff02b59491233b43aee2ffc5e660e6d Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 32/51] * HTTPServer.{cpp,h}: basic auth --- HTTPServer.cpp | 61 +++++++++++++++++++++++++++++++++++++++++++++++++- HTTPServer.h | 8 ++++--- 2 files changed, 65 insertions(+), 4 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 7dc8d910..8d9be41f 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -10,6 +10,7 @@ #include "Base.h" #include "FS.h" #include "Log.h" +#include "Config.h" #include "Tunnel.h" #include "TransitTunnel.h" #include "Transports.h" @@ -640,7 +641,16 @@ namespace http { s << "
\r\n"<< std::endl; } } - + + HTTPConnection::HTTPConnection (std::shared_ptr socket): + m_Socket (socket), m_Timer (socket->get_io_service ()), m_BufferLen (0) + { + /* cache options */ + i2p::config::GetOption("http.auth", needAuth); + i2p::config::GetOption("http.user", user); + i2p::config::GetOption("http.pass", pass); + }; + void HTTPConnection::Receive () { m_Socket->async_read_some (boost::asio::buffer (m_Buffer, HTTP_CONNECTION_BUFFER_SIZE), @@ -672,6 +682,7 @@ namespace http { } if (ret == 0) return; /* need more data */ + HandleRequest (request); } @@ -684,11 +695,44 @@ namespace http { m_Socket->close (); } + bool HTTPConnection::CheckAuth (const HTTPReq & req) { + /* method #1: http://user:pass@127.0.0.1:7070/ */ + if (req.uri.find('@') != std::string::npos) { + URL url; + if (url.parse(req.uri) && url.user == user && url.pass == pass) + return true; + } + /* method #2: 'Authorization' header sent */ + if (req.headers.count("Authorization") > 0) { + std::string provided = req.headers.find("Authorization")->second; + std::string expected = user + ":" + pass; + char b64_creds[64]; + std::size_t len = 0; + len = i2p::data::ByteStreamToBase64((unsigned char *)expected.c_str(), expected.length(), b64_creds, sizeof(b64_creds)); + b64_creds[len] = '\0'; + expected = "Basic "; + expected += b64_creds; + if (provided == expected) + return true; + } + + LogPrint(eLogWarning, "HTTPServer: auth failure from ", m_Socket->remote_endpoint().address ()); + return false; + } + void HTTPConnection::HandleRequest (const HTTPReq & req) { std::stringstream s; std::string content; HTTPRes res; + + if (needAuth && !CheckAuth(req)) { + res.code = 401; + res.headers.insert(std::pair("WWW-Authenticate", "Basic realm=\"WebAdmin\"")); + SendReply(res, content); + return; + } + // Html5 head start ShowPageHead (s); if (req.uri.find("page=") != std::string::npos) @@ -797,6 +841,21 @@ namespace http { void HTTPServer::Start () { + bool needAuth; i2p::config::GetOption("http.auth", needAuth); + std::string user; i2p::config::GetOption("http.user", user); + std::string pass; i2p::config::GetOption("http.pass", pass); + /* generate pass if needed */ + if (needAuth && pass == "") { + char alnum[] = "0123456789" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "abcdefghijklmnopqrstuvwxyz"; + pass.resize(16); + for (size_t i = 0; i < pass.size(); i++) { + pass[i] = alnum[rand() % (sizeof(alnum) - 1)]; + } + i2p::config::SetOption("http.pass", pass); + LogPrint(eLogInfo, "HTTPServer: password set to ", pass); + } m_Thread = std::unique_ptr(new std::thread (std::bind (&HTTPServer::Run, this))); m_Acceptor.listen (); Accept (); diff --git a/HTTPServer.h b/HTTPServer.h index 72a0c383..2635c3be 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -11,9 +11,7 @@ namespace http { { public: - HTTPConnection (std::shared_ptr socket): - m_Socket (socket), m_Timer (socket->get_io_service ()), - m_BufferLen (0) {}; + HTTPConnection (std::shared_ptr socket); void Receive (); private: @@ -22,6 +20,7 @@ namespace http { void Terminate (const boost::system::error_code& ecode); void RunRequest (); + bool CheckAuth (const HTTPReq & req); void HandleRequest (const HTTPReq & req); void HandlePage (const HTTPReq & req, HTTPRes & res, std::stringstream& data); void HandleCommand (const HTTPReq & req, HTTPRes & res, std::stringstream& data); @@ -33,6 +32,9 @@ namespace http { boost::asio::deadline_timer m_Timer; char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1]; size_t m_BufferLen; + bool needAuth; + std::string user; + std::string pass; }; class HTTPServer From 8fd55a210a7613acc01f4467c1a91186028b0ab5 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 33/51] * HTTPServer.cpp: add 'Shutdown' commands --- HTTPServer.cpp | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 8d9be41f..36ff2a37 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -21,6 +21,7 @@ #include "RouterContext.h" #include "ClientContext.h" #include "HTTPServer.h" +#include "Daemon.h" // For image and info #include "version.h" @@ -221,6 +222,9 @@ namespace http { const char HTTP_PAGE_COMMANDS[] = "commands"; const char HTTP_COMMAND_START_ACCEPTING_TUNNELS[] = "start_accepting_tunnels"; const char HTTP_COMMAND_STOP_ACCEPTING_TUNNELS[] = "stop_accepting_tunnels"; + const char HTTP_COMMAND_SHUTDOWN_START[] = "shutdown_start"; + const char HTTP_COMMAND_SHUTDOWN_CANCEL[] = "shutdown_cancel"; + const char HTTP_COMMAND_SHUTDOWN_NOW[] = "terminate"; const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test"; const char HTTP_PARAM_BASE32_ADDRESS[] = "b32"; const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; @@ -506,6 +510,14 @@ namespace http { s << " Stop accepting tunnels
\r\n"; else s << " Start accepting tunnels
\r\n"; + if (Daemon.gracefullShutdownInterval) { + s << " Cancel gracefull shutdown ("; + s << Daemon.gracefullShutdownInterval; + s << " seconds remains)
\r\n"; + } else { + s << " Start gracefull shutdown
\r\n"; + } + s << " Force shutdown
\r\n"; } void ShowTransitTunnels (std::stringstream& s) @@ -799,7 +811,15 @@ namespace http { i2p::context.SetAcceptsTunnels (true); else if (cmd == HTTP_COMMAND_STOP_ACCEPTING_TUNNELS) i2p::context.SetAcceptsTunnels (false); - else { + else if (cmd == HTTP_COMMAND_SHUTDOWN_START) { + i2p::context.SetAcceptsTunnels (false); + Daemon.gracefullShutdownInterval = 10*60; + } else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) { + i2p::context.SetAcceptsTunnels (true); + Daemon.gracefullShutdownInterval = 0; + } else if (cmd == HTTP_COMMAND_SHUTDOWN_NOW) { + Daemon.running = false; + } else { res.code = 400; ShowError(s, "Unknown command: " + cmd); return; From f131e319496739cd3983964cf7e048bec8663423 Mon Sep 17 00:00:00 2001 From: hagen Date: Wed, 27 Apr 2016 00:00:00 +0000 Subject: [PATCH 34/51] * HTTPServer.cpp: add request logging --- HTTPServer.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 36ff2a37..b3efc57d 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -738,6 +738,8 @@ namespace http { std::string content; HTTPRes res; + LogPrint(eLogDebug, "HTTPServer: request: ", req.uri); + if (needAuth && !CheckAuth(req)) { res.code = 401; res.headers.insert(std::pair("WWW-Authenticate", "Basic realm=\"WebAdmin\"")); From 2373b94d3e7794dc19a95322a0c407fddf6ae8d9 Mon Sep 17 00:00:00 2001 From: Jeff Becker Date: Wed, 27 Apr 2016 12:08:08 -0400 Subject: [PATCH 35/51] try fixing issue #482 --- Destination.cpp | 25 ++++++++++++++----------- util.h | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 11 deletions(-) diff --git a/Destination.cpp b/Destination.cpp index 5893caff..1534cbf9 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -9,6 +9,7 @@ #include "Timestamp.h" #include "NetDb.h" #include "Destination.h" +#include "util.h" namespace i2p { @@ -35,28 +36,30 @@ namespace client { auto it = params->find (I2CP_PARAM_INBOUND_TUNNEL_LENGTH); if (it != params->end ()) - { - int len = boost::lexical_cast(it->second); + { + + int len = i2p::util::lexical_cast(it->second, inboundTunnelLen); if (len > 0) { - inboundTunnelLen = len; - LogPrint (eLogInfo, "Destination: Inbound tunnel length set to ", len); + inboundTunnelLen = len; } + LogPrint (eLogInfo, "Destination: Inbound tunnel length set to ", inboundTunnelLen); } it = params->find (I2CP_PARAM_OUTBOUND_TUNNEL_LENGTH); if (it != params->end ()) { - int len = boost::lexical_cast(it->second); + + int len = i2p::util::lexical_cast(it->second, outboundTunnelLen); if (len > 0) { - outboundTunnelLen = len; - LogPrint (eLogInfo, "Destination: Outbound tunnel length set to ", len); + outboundTunnelLen = len; } + LogPrint (eLogInfo, "Destination: Outbound tunnel length set to ", outboundTunnelLen); } it = params->find (I2CP_PARAM_INBOUND_TUNNELS_QUANTITY); if (it != params->end ()) { - int quantity = boost::lexical_cast(it->second); + int quantity = i2p::util::lexical_cast(it->second, inboundTunnelsQuantity); if (quantity > 0) { inboundTunnelsQuantity = quantity; @@ -66,7 +69,7 @@ namespace client it = params->find (I2CP_PARAM_OUTBOUND_TUNNELS_QUANTITY); if (it != params->end ()) { - int quantity = boost::lexical_cast(it->second); + int quantity = i2p::util::lexical_cast(it->second, outboundTunnelsQuantity); if (quantity > 0) { outboundTunnelsQuantity = quantity; @@ -76,11 +79,11 @@ namespace client it = params->find (I2CP_PARAM_TAGS_TO_SEND); if (it != params->end ()) { - int tagsToSend = boost::lexical_cast(it->second); + int tagsToSend = i2p::util::lexical_cast(it->second, numTags); if (tagsToSend > 0) { numTags = tagsToSend; - LogPrint (eLogInfo, "Destination: Tags to send set to ", tagsToSend); + LogPrint (eLogInfo, "Destination: Tags to send set to ", tagsToSend); } } it = params->find (I2CP_PARAM_EXPLICIT_PEERS); diff --git a/util.h b/util.h index 13200591..f5dbc9aa 100644 --- a/util.h +++ b/util.h @@ -5,11 +5,25 @@ #include #include #include +#include namespace i2p { namespace util { + + /** + wrapper arround boost::lexical_cast that "never" fails + */ + template + T lexical_cast(const std::string & str, const T fallback) { + try { + return boost::lexical_cast(str); + } catch ( ... ) { + return fallback; + } + } + namespace http { // in (lower case) From 5e2dc14dd5564fda8f6458db0de38485edd9d6de Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 28 Apr 2016 18:16:11 -0400 Subject: [PATCH 36/51] get family string from local RouterInfo --- Daemon.cpp | 1 - HTTPServer.cpp | 4 +++- RouterContext.cpp | 12 ++---------- RouterContext.h | 4 +--- RouterInfo.cpp | 8 ++++++++ RouterInfo.h | 1 + 6 files changed, 15 insertions(+), 15 deletions(-) diff --git a/Daemon.cpp b/Daemon.cpp index 2a32ff04..81bbcdd5 100644 --- a/Daemon.cpp +++ b/Daemon.cpp @@ -189,7 +189,6 @@ namespace i2p std::string family; i2p::config::GetOption("family", family); i2p::context.SetFamily (family); - i2p::context.SetFamilyString (family); if (family.length () > 0) LogPrint(eLogInfo, "Daemon: family set to ", family); diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 08b67e22..458a717f 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -417,7 +417,9 @@ namespace util default: s << "Unknown"; } s << "
\r\n"; - s << "Family: " << i2p::context.GetFamilyString() << "
\r\n"; + auto family = i2p::context.GetFamily (); + if (family.length () > 0) + s << "Family: " << family << "
\r\n"; s << "Tunnel creation success rate: " << i2p::tunnel::tunnels.GetTunnelCreationSuccessRate () << "%
\r\n"; s << "Received: "; s << std::fixed << std::setprecision(2); diff --git a/RouterContext.cpp b/RouterContext.cpp index 29891169..5fa32a13 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -149,17 +149,9 @@ namespace i2p UpdateRouterInfo (); } - void RouterContext::SetFamilyString (const std::string& family) + std::string RouterContext::GetFamily () const { - if (family.length() > 0) - m_FamilyString = family; - else - m_FamilyString = "<undefined>"; - } - - std::string RouterContext::GetFamilyString () const - { - return m_FamilyString; + return m_RouterInfo.GetProperty (i2p::data::ROUTER_INFO_PROPERTY_FAMILY); } void RouterContext::SetFamily (const std::string& family) diff --git a/RouterContext.h b/RouterContext.h index def89383..5a72ad58 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -59,8 +59,7 @@ namespace i2p bool IsFloodfill () const { return m_IsFloodfill; }; void SetFloodfill (bool floodfill); void SetFamily (const std::string& family); - void SetFamilyString (const std::string& family); - std::string GetFamilyString () const; + std::string GetFamily () const; void SetBandwidth (int limit); /* in kilobytes */ void SetBandwidth (char L); /* by letter */ bool AcceptsTunnels () const { return m_AcceptsTunnels; }; @@ -102,7 +101,6 @@ namespace i2p i2p::data::PrivateKeys m_Keys; uint64_t m_LastUpdateTime; bool m_AcceptsTunnels, m_IsFloodfill; - std::string m_FamilyString; uint64_t m_StartupTime; // in seconds since epoch uint32_t m_BandwidthLimit; // allowed bandwidth RouterStatus m_Status; diff --git a/RouterInfo.cpp b/RouterInfo.cpp index c27f8754..2e76127c 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -636,6 +636,14 @@ namespace data m_Properties.erase (key); } + std::string RouterInfo::GetProperty (const std::string& key) const + { + auto it = m_Properties.find (key); + if (it != m_Properties.end ()) + return it->second; + return ""; + } + bool RouterInfo::IsNTCP (bool v4only) const { if (v4only) diff --git a/RouterInfo.h b/RouterInfo.h index c9881dd2..a55924a8 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -128,6 +128,7 @@ namespace data bool RemoveIntroducer (const boost::asio::ip::udp::endpoint& e); void SetProperty (const std::string& key, const std::string& value); // called from RouterContext only void DeleteProperty (const std::string& key); // called from RouterContext only + std::string GetProperty (const std::string& key) const; // called from RouterContext only void ClearProperties () { m_Properties.clear (); }; bool IsFloodfill () const { return m_Caps & Caps::eFloodfill; }; bool IsReachable () const { return m_Caps & Caps::eReachable; }; From 00cfdc7d9257cfdb0ada151b77bf14b52c4da729 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 4 May 2016 12:12:24 -0400 Subject: [PATCH 37/51] fix mac brew, use libressl and homebrew --- Makefile | 2 +- Makefile.homebrew | 29 +++++++++++++++++++++++++++++ docs/build_notes_unix.md | 15 +++++++++++++++ 3 files changed, 45 insertions(+), 1 deletion(-) create mode 100644 Makefile.homebrew diff --git a/Makefile b/Makefile index ae49ae4f..db6da2df 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,7 @@ USE_STATIC := no ifeq ($(UNAME),Darwin) DAEMON_SRC += DaemonLinux.cpp - include Makefile.osx + include Makefile.homebrew else ifeq ($(shell echo $(UNAME) | $(GREP) -c FreeBSD),1) DAEMON_SRC += DaemonLinux.cpp include Makefile.bsd diff --git a/Makefile.homebrew b/Makefile.homebrew new file mode 100644 index 00000000..163b7950 --- /dev/null +++ b/Makefile.homebrew @@ -0,0 +1,29 @@ +# root directory holding homebrew +BREWROOT = /usr/local/ +BOOSTROOT = ${BREWROOT}/opt/boost +SSLROOT = ${BREWROOT}/opt/libressl +CXX = clang++ +CXXFLAGS = -g -Wall -std=c++11 -DMAC_OSX +INCFLAGS = -I${SSLROOT}/include -I${BOOSTROOT}/include +LDFLAGS = -L${SSLROOT}/lib -L${BOOSTROOT}/lib +LDLIBS = -lz -lcrypto -lssl -lboost_system -lboost_date_time -lboost_filesystem -lboost_regex -lboost_program_options -lpthread + +ifeq ($(USE_UPNP),1) + LDFLAGS += -ldl + CXXFLAGS += -DUSE_UPNP +endif + +# OSX Notes +# http://www.hutsby.net/2011/08/macs-with-aes-ni.html +# Seems like all recent Mac's have AES-NI, after firmware upgrade 2.2 +# Found no good way to detect it from command line. TODO: Might be some osx sysinfo magic +# note from psi: 2009 macbook does not have aesni +#ifeq ($(USE_AESNI),yes) +# CXXFLAGS += -maes -DAESNI +#endif + +# Disabled, since it will be the default make rule. I think its better +# to define the default rule in Makefile and not Makefile. - torkel +#install: all +# test -d ${PREFIX} || mkdir -p ${PREFIX}/ +# cp -r i2p ${PREFIX}/ diff --git a/docs/build_notes_unix.md b/docs/build_notes_unix.md index d02eb5df..d173d4ae 100644 --- a/docs/build_notes_unix.md +++ b/docs/build_notes_unix.md @@ -93,6 +93,21 @@ If you need UPnP support (don't forget to run CMake with `WITH_UPNP=ON`) miniupn miniupnpc-devel ``` +MAC OS X +-------- + +Requires homebrew + +```bash +brew install libressl boost +``` + +Then build: +```bash +make +``` + + FreeBSD ------- From ca36a6fe41afffc1f9f8f2fd69ded564a71e69a8 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 10 May 2016 15:55:48 -0400 Subject: [PATCH 38/51] update our IP after signture verification --- SSUSession.cpp | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/SSUSession.cpp b/SSUSession.cpp index aa534c56..a1bbf4d9 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -265,8 +265,6 @@ namespace transport uint16_t ourPort = bufbe16toh (payload); s.Insert (payload, 2); // our port payload += 2; // port - LogPrint (eLogInfo, "SSU: Our external address is ", ourIP.to_string (), ":", ourPort); - i2p::context.UpdateAddress (ourIP); if (m_RemoteEndpoint.address ().is_v4 ()) s.Insert (m_RemoteEndpoint.address ().to_v4 ().to_bytes ().data (), 4); // remote IP v4 else @@ -283,11 +281,18 @@ namespace transport //TODO: since we are accessing a uint8_t this is unlikely to crash due to alignment but should be improved m_SessionKeyDecryption.SetIV (((SSUHeader *)buf)->iv); m_SessionKeyDecryption.Decrypt (payload, signatureLen, payload); // TODO: non-const payload - // verify - if (!s.Verify (m_RemoteIdentity, payload)) + // verify signature + if (s.Verify (m_RemoteIdentity, payload)) + { + LogPrint (eLogInfo, "SSU: Our external address is ", ourIP.to_string (), ":", ourPort); + i2p::context.UpdateAddress (ourIP); + SendSessionConfirmed (y, ourAddress, addressSize + 2); + } + else + { LogPrint (eLogError, "SSU: message 'created' signature verification failed"); - - SendSessionConfirmed (y, ourAddress, addressSize + 2); + Failed (); + } } void SSUSession::ProcessSessionConfirmed (const uint8_t * buf, size_t len) @@ -313,11 +318,17 @@ namespace transport paddingSize &= 0x0F; // %16 if (paddingSize > 0) paddingSize = 16 - paddingSize; payload += paddingSize; - // verify - if (m_SignedData && !m_SignedData->Verify (m_RemoteIdentity, payload)) + // verify signature + if (m_SignedData && m_SignedData->Verify (m_RemoteIdentity, payload)) + { + m_Data.Send (CreateDeliveryStatusMsg (0)); + Established (); + } + else + { LogPrint (eLogError, "SSU message 'confirmed' signature verification failed"); - m_Data.Send (CreateDeliveryStatusMsg (0)); - Established (); + Failed (); + } } void SSUSession::SendSessionRequest () From aa215f2a5a975742ad78410caf59be49c6759ce3 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 11 May 2016 07:08:02 -0400 Subject: [PATCH 39/51] regular/homebrew build selection for Mac OS X --- Makefile | 6 +++++- docs/build_notes_unix.md | 2 +- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/Makefile b/Makefile index db6da2df..e3807d93 100644 --- a/Makefile +++ b/Makefile @@ -14,7 +14,11 @@ USE_STATIC := no ifeq ($(UNAME),Darwin) DAEMON_SRC += DaemonLinux.cpp - include Makefile.homebrew + ifeq ($(HOMEBREW),1) + include Makefile.homebrew + else + include Makefile.osx + endif else ifeq ($(shell echo $(UNAME) | $(GREP) -c FreeBSD),1) DAEMON_SRC += DaemonLinux.cpp include Makefile.bsd diff --git a/docs/build_notes_unix.md b/docs/build_notes_unix.md index d173d4ae..05605343 100644 --- a/docs/build_notes_unix.md +++ b/docs/build_notes_unix.md @@ -104,7 +104,7 @@ brew install libressl boost Then build: ```bash -make +make HOMEBREW=1 ``` From 28b5f39b840a4b10542d9f1a29a1d693e1376c94 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 11 May 2016 08:41:32 -0400 Subject: [PATCH 40/51] fix http unit test SIGBUS in os x --- HTTP.cpp | 27 +++++++++++++-------------- HTTP.h | 4 ++-- 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/HTTP.cpp b/HTTP.cpp index 74acfb7a..02b58f99 100644 --- a/HTTP.cpp +++ b/HTTP.cpp @@ -10,23 +10,22 @@ namespace i2p { namespace http { - const char *HTTP_METHODS[] = { + const std::vector HTTP_METHODS = { "GET", "HEAD", "POST", "PUT", "PATCH", - "DELETE", "OPTIONS", "CONNECT", - NULL + "DELETE", "OPTIONS", "CONNECT" }; - const char *HTTP_VERSIONS[] = { - "HTTP/1.0", "HTTP/1.1", NULL + const std::vector HTTP_VERSIONS = { + "HTTP/1.0", "HTTP/1.1" }; - bool in_cstr_array(const char **haystack, const char *needle) { - for (const char *p = haystack[0]; p != NULL; p++) { - if (strcmp(p, needle) == 0) - return true; - } - return false; + inline bool is_http_version(const std::string & str) { + return std::find(HTTP_VERSIONS.begin(), HTTP_VERSIONS.end(), str) != std::end(HTTP_VERSIONS); } + inline bool is_http_method(const std::string & str) { + return std::find(HTTP_METHODS.begin(), HTTP_METHODS.end(), str) != std::end(HTTP_METHODS); + } + void strsplit(const std::string & line, std::vector &tokens, char delim, std::size_t limit = 0) { std::size_t count = 0; std::stringstream ss(line); @@ -205,9 +204,9 @@ namespace http { strsplit(line, tokens, ' '); if (tokens.size() != 3) return -1; - if (!in_cstr_array(HTTP_METHODS, tokens[0].c_str())) + if (!is_http_method(tokens[0])) return -1; - if (!in_cstr_array(HTTP_VERSIONS, tokens[2].c_str())) + if (!is_http_version(tokens[2])) return -1; if (!url.parse(tokens[1])) return -1; @@ -288,7 +287,7 @@ namespace http { strsplit(line, tokens, ' ', 3); if (tokens.size() != 3) return -1; - if (!in_cstr_array(HTTP_VERSIONS, tokens[0].c_str())) + if (!is_http_version(tokens[0])) return -1; code = atoi(tokens[1].c_str()); if (code < 100 || code >= 600) diff --git a/HTTP.h b/HTTP.h index 864ad88b..9bd31c75 100644 --- a/HTTP.h +++ b/HTTP.h @@ -19,8 +19,8 @@ namespace i2p { namespace http { const char CRLF[] = "\r\n"; /**< HTTP line terminator */ const char HTTP_EOH[] = "\r\n\r\n"; /**< HTTP end-of-headers mark */ - extern const char *HTTP_METHODS[]; /**< list of valid HTTP methods */ - extern const char *HTTP_VERSIONS[]; /**< list of valid HTTP versions */ + extern const std::vector HTTP_METHODS; /**< list of valid HTTP methods */ + extern const std::vector HTTP_VERSIONS; /**< list of valid HTTP versions */ struct URL { std::string schema; From 8363b4fda78ced508e0f505239389195b7bfde79 Mon Sep 17 00:00:00 2001 From: Jeff Date: Wed, 11 May 2016 09:33:25 -0400 Subject: [PATCH 41/51] add missing header --- HTTP.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/HTTP.cpp b/HTTP.cpp index 02b58f99..ef43d55f 100644 --- a/HTTP.cpp +++ b/HTTP.cpp @@ -7,6 +7,7 @@ */ #include "HTTP.h" +#include namespace i2p { namespace http { From aa5ea0e3a17737d6b6046724734aa0893a1b5bae Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 11 May 2016 11:57:02 -0400 Subject: [PATCH 42/51] support gcc 6 --- Makefile.linux | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Makefile.linux b/Makefile.linux index 24816770..791382c6 100644 --- a/Makefile.linux +++ b/Makefile.linux @@ -19,7 +19,7 @@ else ifeq ($(shell expr match ${CXXVER} "4\.[7-9]"),3) # >= 4.7 NEEDED_CXXFLAGS += -std=c++11 -D_GLIBCXX_USE_NANOSLEEP=1 else ifeq ($(shell expr match ${CXXVER} "4\.6"),3) # = 4.6 NEEDED_CXXFLAGS += -std=c++0x -else ifeq ($(shell expr match ${CXXVER} "5\.[0-9]"),3) # gcc >= 5.0 +else ifeq ($(shell expr match ${CXXVER} "[5-6]\.[0-9]"),3) # gcc >= 5.0 NEEDED_CXXFLAGS += -std=c++11 else # not supported $(error Compiler too old) From 3907b4101a1794fa1d3cf2f3d659deb1c5f10921 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 11 May 2016 15:12:38 -0400 Subject: [PATCH 43/51] include openssl through OPENSSL macro --- Crypto.cpp | 16 +++++----- Crypto.h | 12 +++++--- CryptoConst.cpp | 73 ---------------------------------------------- CryptoConst.h | 38 ------------------------ Datagram.cpp | 3 +- Destination.cpp | 4 +-- Family.cpp | 6 ++-- Garlic.cpp | 5 ++-- I2NPProtocol.cpp | 2 -- I2NPProtocol.h | 2 +- I2PControl.cpp | 5 ++-- I2PControl.h | 2 +- Identity.cpp | 3 -- NTCPSession.cpp | 4 +-- NetDb.cpp | 2 +- Reseed.cpp | 10 +++---- SSUSession.cpp | 4 +-- Signature.h | 14 ++++----- Streaming.cpp | 2 +- Transports.cpp | 1 - Tunnel.cpp | 2 +- TunnelConfig.h | 1 - TunnelEndpoint.cpp | 2 +- TunnelGateway.cpp | 3 +- TunnelPool.cpp | 1 - 25 files changed, 48 insertions(+), 169 deletions(-) delete mode 100644 CryptoConst.cpp delete mode 100644 CryptoConst.h diff --git a/Crypto.cpp b/Crypto.cpp index 742296f5..ff68ff6a 100644 --- a/Crypto.cpp +++ b/Crypto.cpp @@ -3,15 +3,15 @@ #include #include #include -#include -#include -#include -#include -#include -#include "TunnelBase.h" -#include -#include "Log.h" #include "Crypto.h" +#include OPENSSL(sha.h) +#include OPENSSL(dh.h) +#include OPENSSL(md5.h) +#include OPENSSL(rand.h) +#include OPENSSL(crypto.h) +#include "TunnelBase.h" +#include OPENSSL(ssl.h) +#include "Log.h" namespace i2p { diff --git a/Crypto.h b/Crypto.h index e333940e..7b580c94 100644 --- a/Crypto.h +++ b/Crypto.h @@ -1,12 +1,16 @@ #ifndef CRYPTO_H__ #define CRYPTO_H__ +#define OPENSSL(file) + #include #include -#include -#include -#include -#include +#include OPENSSL(bn.h) +#include OPENSSL(dh.h) +#include OPENSSL(aes.h) +#include OPENSSL(dsa.h) +#include OPENSSL(sha.h) +#include OPENSSL(rand.h) #include "Base.h" namespace i2p diff --git a/CryptoConst.cpp b/CryptoConst.cpp deleted file mode 100644 index a8868988..00000000 --- a/CryptoConst.cpp +++ /dev/null @@ -1,73 +0,0 @@ -#include -#include "CryptoConst.h" - -namespace i2p -{ -namespace crypto -{ - const uint8_t elgp_[256]= - { - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xC9, 0x0F, 0xDA, 0xA2, 0x21, 0x68, 0xC2, 0x34, - 0xC4, 0xC6, 0x62, 0x8B, 0x80, 0xDC, 0x1C, 0xD1, 0x29, 0x02, 0x4E, 0x08, 0x8A, 0x67, 0xCC, 0x74, - 0x02, 0x0B, 0xBE, 0xA6, 0x3B, 0x13, 0x9B, 0x22, 0x51, 0x4A, 0x08, 0x79, 0x8E, 0x34, 0x04, 0xDD, - 0xEF, 0x95, 0x19, 0xB3, 0xCD, 0x3A, 0x43, 0x1B, 0x30, 0x2B, 0x0A, 0x6D, 0xF2, 0x5F, 0x14, 0x37, - 0x4F, 0xE1, 0x35, 0x6D, 0x6D, 0x51, 0xC2, 0x45, 0xE4, 0x85, 0xB5, 0x76, 0x62, 0x5E, 0x7E, 0xC6, - 0xF4, 0x4C, 0x42, 0xE9, 0xA6, 0x37, 0xED, 0x6B, 0x0B, 0xFF, 0x5C, 0xB6, 0xF4, 0x06, 0xB7, 0xED, - 0xEE, 0x38, 0x6B, 0xFB, 0x5A, 0x89, 0x9F, 0xA5, 0xAE, 0x9F, 0x24, 0x11, 0x7C, 0x4B, 0x1F, 0xE6, - 0x49, 0x28, 0x66, 0x51, 0xEC, 0xE4, 0x5B, 0x3D, 0xC2, 0x00, 0x7C, 0xB8, 0xA1, 0x63, 0xBF, 0x05, - 0x98, 0xDA, 0x48, 0x36, 0x1C, 0x55, 0xD3, 0x9A, 0x69, 0x16, 0x3F, 0xA8, 0xFD, 0x24, 0xCF, 0x5F, - 0x83, 0x65, 0x5D, 0x23, 0xDC, 0xA3, 0xAD, 0x96, 0x1C, 0x62, 0xF3, 0x56, 0x20, 0x85, 0x52, 0xBB, - 0x9E, 0xD5, 0x29, 0x07, 0x70, 0x96, 0x96, 0x6D, 0x67, 0x0C, 0x35, 0x4E, 0x4A, 0xBC, 0x98, 0x04, - 0xF1, 0x74, 0x6C, 0x08, 0xCA, 0x18, 0x21, 0x7C, 0x32, 0x90, 0x5E, 0x46, 0x2E, 0x36, 0xCE, 0x3B, - 0xE3, 0x9E, 0x77, 0x2C, 0x18, 0x0E, 0x86, 0x03, 0x9B, 0x27, 0x83, 0xA2, 0xEC, 0x07, 0xA2, 0x8F, - 0xB5, 0xC5, 0x5D, 0xF0, 0x6F, 0x4C, 0x52, 0xC9, 0xDE, 0x2B, 0xCB, 0xF6, 0x95, 0x58, 0x17, 0x18, - 0x39, 0x95, 0x49, 0x7C, 0xEA, 0x95, 0x6A, 0xE5, 0x15, 0xD2, 0x26, 0x18, 0x98, 0xFA, 0x05, 0x10, - 0x15, 0x72, 0x8E, 0x5A, 0x8A, 0xAC, 0xAA, 0x68, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF - }; - - const uint8_t dsap_[128]= - { - 0x9c, 0x05, 0xb2, 0xaa, 0x96, 0x0d, 0x9b, 0x97, 0xb8, 0x93, 0x19, 0x63, 0xc9, 0xcc, 0x9e, 0x8c, - 0x30, 0x26, 0xe9, 0xb8, 0xed, 0x92, 0xfa, 0xd0, 0xa6, 0x9c, 0xc8, 0x86, 0xd5, 0xbf, 0x80, 0x15, - 0xfc, 0xad, 0xae, 0x31, 0xa0, 0xad, 0x18, 0xfa, 0xb3, 0xf0, 0x1b, 0x00, 0xa3, 0x58, 0xde, 0x23, - 0x76, 0x55, 0xc4, 0x96, 0x4a, 0xfa, 0xa2, 0xb3, 0x37, 0xe9, 0x6a, 0xd3, 0x16, 0xb9, 0xfb, 0x1c, - 0xc5, 0x64, 0xb5, 0xae, 0xc5, 0xb6, 0x9a, 0x9f, 0xf6, 0xc3, 0xe4, 0x54, 0x87, 0x07, 0xfe, 0xf8, - 0x50, 0x3d, 0x91, 0xdd, 0x86, 0x02, 0xe8, 0x67, 0xe6, 0xd3, 0x5d, 0x22, 0x35, 0xc1, 0x86, 0x9c, - 0xe2, 0x47, 0x9c, 0x3b, 0x9d, 0x54, 0x01, 0xde, 0x04, 0xe0, 0x72, 0x7f, 0xb3, 0x3d, 0x65, 0x11, - 0x28, 0x5d, 0x4c, 0xf2, 0x95, 0x38, 0xd9, 0xe3, 0xb6, 0x05, 0x1f, 0x5b, 0x22, 0xcc, 0x1c, 0x93 - }; - - const uint8_t dsaq_[20]= - { - 0xa5, 0xdf, 0xc2, 0x8f, 0xef, 0x4c, 0xa1, 0xe2, 0x86, 0x74, 0x4c, 0xd8, 0xee, 0xd9, 0xd2, 0x9d, - 0x68, 0x40, 0x46, 0xb7 - }; - - const uint8_t dsag_[128]= - { - 0x0c, 0x1f, 0x4d, 0x27, 0xd4, 0x00, 0x93, 0xb4, 0x29, 0xe9, 0x62, 0xd7, 0x22, 0x38, 0x24, 0xe0, - 0xbb, 0xc4, 0x7e, 0x7c, 0x83, 0x2a, 0x39, 0x23, 0x6f, 0xc6, 0x83, 0xaf, 0x84, 0x88, 0x95, 0x81, - 0x07, 0x5f, 0xf9, 0x08, 0x2e, 0xd3, 0x23, 0x53, 0xd4, 0x37, 0x4d, 0x73, 0x01, 0xcd, 0xa1, 0xd2, - 0x3c, 0x43, 0x1f, 0x46, 0x98, 0x59, 0x9d, 0xda, 0x02, 0x45, 0x18, 0x24, 0xff, 0x36, 0x97, 0x52, - 0x59, 0x36, 0x47, 0xcc, 0x3d, 0xdc, 0x19, 0x7d, 0xe9, 0x85, 0xe4, 0x3d, 0x13, 0x6c, 0xdc, 0xfc, - 0x6b, 0xd5, 0x40, 0x9c, 0xd2, 0xf4, 0x50, 0x82, 0x11, 0x42, 0xa5, 0xe6, 0xf8, 0xeb, 0x1c, 0x3a, - 0xb5, 0xd0, 0x48, 0x4b, 0x81, 0x29, 0xfc, 0xf1, 0x7b, 0xce, 0x4f, 0x7f, 0x33, 0x32, 0x1c, 0x3c, - 0xb3, 0xdb, 0xb1, 0x4a, 0x90, 0x5e, 0x7b, 0x2b, 0x3e, 0x93, 0xbe, 0x47, 0x08, 0xcb, 0xcc, 0x82 - }; - - const CryptoConstants& GetCryptoConstants () - { - static CryptoConstants cryptoConstants = - { - {elgp_, 256}, // elgp - {2}, // elgg - {dsap_, 128}, // dsap - {dsaq_, 20}, // dsaq - {dsag_, 128} // dsag - }; - return cryptoConstants; - } - -} -} - diff --git a/CryptoConst.h b/CryptoConst.h deleted file mode 100644 index ba48a35d..00000000 --- a/CryptoConst.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifndef CRYPTO_CONST_H__ -#define CRYPTO_CONST_H__ - -#include - -namespace i2p -{ -namespace crypto -{ - struct CryptoConstants - { - // DH/ElGamal - const CryptoPP::Integer elgp; - const CryptoPP::Integer elgg; - - // DSA - const CryptoPP::Integer dsap; - const CryptoPP::Integer dsaq; - const CryptoPP::Integer dsag; - }; - - const CryptoConstants& GetCryptoConstants (); - - // DH/ElGamal - #define elgp GetCryptoConstants ().elgp - #define elgg GetCryptoConstants ().elgg - - // DSA - #define dsap GetCryptoConstants ().dsap - #define dsaq GetCryptoConstants ().dsaq - #define dsag GetCryptoConstants ().dsag - - // RSA - const int rsae = 65537; -} -} - -#endif diff --git a/Datagram.cpp b/Datagram.cpp index 9221824d..2015622c 100644 --- a/Datagram.cpp +++ b/Datagram.cpp @@ -1,7 +1,6 @@ #include #include -#include -#include +#include "Crypto.h" #include "Log.h" #include "TunnelBase.h" #include "RouterContext.h" diff --git a/Destination.cpp b/Destination.cpp index 1534cbf9..f487b9ad 100644 --- a/Destination.cpp +++ b/Destination.cpp @@ -1,11 +1,9 @@ #include #include #include -#include - +#include "Crypto.h" #include "Log.h" #include "FS.h" -#include "Crypto.h" #include "Timestamp.h" #include "NetDb.h" #include "Destination.h" diff --git a/Family.cpp b/Family.cpp index 34406faa..a3dc5bd0 100644 --- a/Family.cpp +++ b/Family.cpp @@ -1,9 +1,9 @@ #include -#include -#include +#include "Crypto.h" +#include OPENSSL(evp.h) +#include OPENSSL(ssl.h) #include "FS.h" #include "Log.h" -#include "Crypto.h" #include "Family.h" namespace i2p diff --git a/Garlic.cpp b/Garlic.cpp index e11f8ec8..2188ade7 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -2,8 +2,9 @@ #include "I2PEndian.h" #include #include -#include -#include +#include "Crypto.h" +#include OPENSSL(rand.h) +#include OPENSSL(sha.h) #include "RouterContext.h" #include "I2NPProtocol.h" #include "Tunnel.h" diff --git a/I2NPProtocol.cpp b/I2NPProtocol.cpp index 9674fdca..e2451f68 100644 --- a/I2NPProtocol.cpp +++ b/I2NPProtocol.cpp @@ -1,7 +1,5 @@ #include #include -#include -#include #include "Base.h" #include "Log.h" #include "Crypto.h" diff --git a/I2NPProtocol.h b/I2NPProtocol.h index cf8f4266..113e8eb8 100644 --- a/I2NPProtocol.h +++ b/I2NPProtocol.h @@ -5,7 +5,7 @@ #include #include #include -#include +#include "Crypto.h" #include "I2PEndian.h" #include "Identity.h" #include "RouterInfo.h" diff --git a/I2PControl.cpp b/I2PControl.cpp index 1ef56c2d..ef9b5081 100644 --- a/I2PControl.cpp +++ b/I2PControl.cpp @@ -1,7 +1,8 @@ #include #include -#include -#include +#include "Crypto.h" +#include OPENSSL(x509.h) +#include OPENSSL(pem.h) #include #include #include diff --git a/I2PControl.h b/I2PControl.h index 728c9925..0bd70956 100644 --- a/I2PControl.h +++ b/I2PControl.h @@ -10,7 +10,7 @@ #include #include #include -#include +#include // might include openssl #include namespace i2p diff --git a/Identity.cpp b/Identity.cpp index f221dd04..71ca007f 100644 --- a/Identity.cpp +++ b/Identity.cpp @@ -1,8 +1,5 @@ #include #include -#include -#include -#include #include "Crypto.h" #include "I2PEndian.h" #include "Log.h" diff --git a/NTCPSession.cpp b/NTCPSession.cpp index a7832335..ae020f5f 100644 --- a/NTCPSession.cpp +++ b/NTCPSession.cpp @@ -1,13 +1,11 @@ #include #include -#include -#include #include #include "I2PEndian.h" #include "Base.h" +#include "Crypto.h" #include "Log.h" #include "Timestamp.h" -#include "Crypto.h" #include "I2NPProtocol.h" #include "RouterContext.h" #include "Transports.h" diff --git a/NetDb.cpp b/NetDb.cpp index 857381d8..3aeff92f 100644 --- a/NetDb.cpp +++ b/NetDb.cpp @@ -2,10 +2,10 @@ #include #include #include -#include #include #include "I2PEndian.h" #include "Base.h" +#include "Crypto.h" #include "Log.h" #include "Timestamp.h" #include "I2NPProtocol.h" diff --git a/Reseed.cpp b/Reseed.cpp index caac8071..81811a5e 100644 --- a/Reseed.cpp +++ b/Reseed.cpp @@ -3,10 +3,11 @@ #include #include #include -#include -#include -#include -#include +#include // might include openssl +#include "Crypto.h" +#include OPENSSL(bn.h) +#include OPENSSL(ssl.h) +#include OPENSSL(err.h) #include #include "I2PEndian.h" @@ -14,7 +15,6 @@ #include "FS.h" #include "Log.h" #include "Identity.h" -#include "Crypto.h" #include "NetDb.h" #include "util.h" diff --git a/SSUSession.cpp b/SSUSession.cpp index a1bbf4d9..cf56ca15 100644 --- a/SSUSession.cpp +++ b/SSUSession.cpp @@ -1,7 +1,5 @@ #include -#include -#include -#include +#include "Crypto.h" #include "Log.h" #include "Timestamp.h" #include "RouterContext.h" diff --git a/Signature.h b/Signature.h index a0b54468..e3a39339 100644 --- a/Signature.h +++ b/Signature.h @@ -3,14 +3,14 @@ #include #include -#include -#include -#include -#include -#include -#include -#include #include "Crypto.h" +#include OPENSSL(sha.h) +#include OPENSSL(dsa.h) +#include OPENSSL(ec.h) +#include OPENSSL(ecdsa.h) +#include OPENSSL(rsa.h) +#include OPENSSL(rand.h) +#include OPENSSL(evp.h) namespace i2p { diff --git a/Streaming.cpp b/Streaming.cpp index e425ce27..ab0a6df0 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -1,4 +1,4 @@ -#include +#include "Crypto.h" #include "Log.h" #include "RouterInfo.h" #include "RouterContext.h" diff --git a/Transports.cpp b/Transports.cpp index 0fdfce3d..057e2472 100644 --- a/Transports.cpp +++ b/Transports.cpp @@ -1,4 +1,3 @@ -#include #include "Log.h" #include "Crypto.h" #include "RouterContext.h" diff --git a/Tunnel.cpp b/Tunnel.cpp index 5e237d87..bf81dc5e 100644 --- a/Tunnel.cpp +++ b/Tunnel.cpp @@ -3,7 +3,7 @@ #include #include #include -#include +#include "Crypto.h" #include "RouterContext.h" #include "Log.h" #include "Timestamp.h" diff --git a/TunnelConfig.h b/TunnelConfig.h index c089b13c..0340254e 100644 --- a/TunnelConfig.h +++ b/TunnelConfig.h @@ -5,7 +5,6 @@ #include #include #include -#include #include "Crypto.h" #include "Identity.h" #include "RouterContext.h" diff --git a/TunnelEndpoint.cpp b/TunnelEndpoint.cpp index 842b624f..1bc8a937 100644 --- a/TunnelEndpoint.cpp +++ b/TunnelEndpoint.cpp @@ -1,6 +1,6 @@ #include "I2PEndian.h" #include -#include +#include "Crypto.h" #include "Log.h" #include "NetDb.h" #include "I2NPProtocol.h" diff --git a/TunnelGateway.cpp b/TunnelGateway.cpp index 4f517eb8..3383010b 100644 --- a/TunnelGateway.cpp +++ b/TunnelGateway.cpp @@ -1,6 +1,5 @@ #include -#include -#include +#include "Crypto.h" #include "I2PEndian.h" #include "Log.h" #include "RouterContext.h" diff --git a/TunnelPool.cpp b/TunnelPool.cpp index c74ff475..5e7e8ec4 100644 --- a/TunnelPool.cpp +++ b/TunnelPool.cpp @@ -1,5 +1,4 @@ #include -#include #include "I2PEndian.h" #include "Crypto.h" #include "Tunnel.h" From ae81cc2644a83dfdfebf4ef6009cfdba68f25308 Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 11 May 2016 15:33:53 -0400 Subject: [PATCH 44/51] windows doesn't support graceful shutdown yet --- HTTPServer.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 7ad8279d..63975722 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -513,6 +513,7 @@ namespace http { s << " Stop accepting tunnels
\r\n"; else s << " Start accepting tunnels
\r\n"; +#ifndef WIN32 if (Daemon.gracefullShutdownInterval) { s << " Cancel gracefull shutdown ("; s << Daemon.gracefullShutdownInterval; @@ -521,6 +522,7 @@ namespace http { s << " Start gracefull shutdown
\r\n"; } s << " Force shutdown
\r\n"; +#endif } void ShowTransitTunnels (std::stringstream& s) @@ -818,10 +820,14 @@ namespace http { i2p::context.SetAcceptsTunnels (false); else if (cmd == HTTP_COMMAND_SHUTDOWN_START) { i2p::context.SetAcceptsTunnels (false); +#ifndef WIN32 Daemon.gracefullShutdownInterval = 10*60; +#endif } else if (cmd == HTTP_COMMAND_SHUTDOWN_CANCEL) { i2p::context.SetAcceptsTunnels (true); +#ifndef WIN32 Daemon.gracefullShutdownInterval = 0; +#endif } else if (cmd == HTTP_COMMAND_SHUTDOWN_NOW) { Daemon.running = false; } else { From 7c835bae20cd5d877b7a16351b851881577d6aac Mon Sep 17 00:00:00 2001 From: orignal Date: Wed, 11 May 2016 16:02:26 -0400 Subject: [PATCH 45/51] changed back to #include #include -#include "Crypto.h" -#include OPENSSL(sha.h) -#include OPENSSL(dh.h) -#include OPENSSL(md5.h) -#include OPENSSL(rand.h) -#include OPENSSL(crypto.h) +#include +#include +#include #include "TunnelBase.h" -#include OPENSSL(ssl.h) +#include #include "Log.h" +#include "Crypto.h" namespace i2p { diff --git a/Crypto.h b/Crypto.h index 7b580c94..7ce202ce 100644 --- a/Crypto.h +++ b/Crypto.h @@ -1,16 +1,14 @@ #ifndef CRYPTO_H__ #define CRYPTO_H__ -#define OPENSSL(file) - #include #include -#include OPENSSL(bn.h) -#include OPENSSL(dh.h) -#include OPENSSL(aes.h) -#include OPENSSL(dsa.h) -#include OPENSSL(sha.h) -#include OPENSSL(rand.h) +#include +#include +#include +#include +#include +#include #include "Base.h" namespace i2p diff --git a/Family.cpp b/Family.cpp index a3dc5bd0..90c5ccd0 100644 --- a/Family.cpp +++ b/Family.cpp @@ -1,7 +1,7 @@ #include +#include +#include #include "Crypto.h" -#include OPENSSL(evp.h) -#include OPENSSL(ssl.h) #include "FS.h" #include "Log.h" #include "Family.h" diff --git a/Garlic.cpp b/Garlic.cpp index 2188ade7..c1100f64 100644 --- a/Garlic.cpp +++ b/Garlic.cpp @@ -3,8 +3,6 @@ #include #include #include "Crypto.h" -#include OPENSSL(rand.h) -#include OPENSSL(sha.h) #include "RouterContext.h" #include "I2NPProtocol.h" #include "Tunnel.h" diff --git a/I2PControl.cpp b/I2PControl.cpp index ef9b5081..ab9feeed 100644 --- a/I2PControl.cpp +++ b/I2PControl.cpp @@ -1,8 +1,7 @@ #include #include -#include "Crypto.h" -#include OPENSSL(x509.h) -#include OPENSSL(pem.h) +#include +#include #include #include #include @@ -14,6 +13,7 @@ #include #endif +#include "Crypto.h" #include "FS.h" #include "Log.h" #include "Config.h" diff --git a/I2PControl.h b/I2PControl.h index 0bd70956..f2e82254 100644 --- a/I2PControl.h +++ b/I2PControl.h @@ -10,7 +10,7 @@ #include #include #include -#include // might include openssl +#include #include namespace i2p diff --git a/Reseed.cpp b/Reseed.cpp index 81811a5e..ddefc460 100644 --- a/Reseed.cpp +++ b/Reseed.cpp @@ -3,13 +3,12 @@ #include #include #include -#include // might include openssl -#include "Crypto.h" -#include OPENSSL(bn.h) -#include OPENSSL(ssl.h) -#include OPENSSL(err.h) +#include +#include +#include #include +#include "Crypto.h" #include "I2PEndian.h" #include "Reseed.h" #include "FS.h" diff --git a/Signature.h b/Signature.h index e3a39339..5934f8d2 100644 --- a/Signature.h +++ b/Signature.h @@ -3,14 +3,12 @@ #include #include +#include +#include +#include +#include +#include #include "Crypto.h" -#include OPENSSL(sha.h) -#include OPENSSL(dsa.h) -#include OPENSSL(ec.h) -#include OPENSSL(ecdsa.h) -#include OPENSSL(rsa.h) -#include OPENSSL(rand.h) -#include OPENSSL(evp.h) namespace i2p { From c49fdf12334c5fae3cb5545ecb14eba9bc0f0fb5 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 12 May 2016 11:38:18 -0400 Subject: [PATCH 46/51] initial commit for reload config command --- ClientContext.cpp | 18 ++++++++++++++---- ClientContext.h | 2 ++ HTTPServer.cpp | 6 +++++- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/ClientContext.cpp b/ClientContext.cpp index 2eb81af2..aad41ab2 100644 --- a/ClientContext.cpp +++ b/ClientContext.cpp @@ -171,6 +171,11 @@ namespace client m_Destinations.clear (); m_SharedLocalDestination = nullptr; } + + void ClientContext::ReloadConfig () + { + ReadTunnels (); // TODO: it reads new tunnels only, should be implemented better + } void ClientContext::LoadPrivateKeys (i2p::data::PrivateKeys& keys, const std::string& filename, i2p::data::SigningKeyType sigType) { @@ -330,10 +335,12 @@ namespace client auto clientTunnel = new I2PClientTunnel (name, dest, address, port, localDestination, destinationPort); if (m_ClientTunnels.insert (std::make_pair (clientTunnel->GetAcceptor ().local_endpoint (), std::unique_ptr(clientTunnel))).second) + { clientTunnel->Start (); + numClientTunnels++; + } else - LogPrint (eLogError, "Clients: I2P client tunnel with port ", port, " already exists"); - numClientTunnels++; + LogPrint (eLogError, "Clients: I2P client tunnel for endpoint ", clientTunnel->GetAcceptor ().local_endpoint (), " already exists"); } else if (type == I2P_TUNNELS_SECTION_TYPE_SERVER || type == I2P_TUNNELS_SECTION_TYPE_HTTP || type == I2P_TUNNELS_SECTION_TYPE_IRC) { @@ -385,10 +392,13 @@ namespace client if (m_ServerTunnels.insert (std::make_pair ( std::make_pair (localDestination->GetIdentHash (), inPort), std::unique_ptr(serverTunnel))).second) + { serverTunnel->Start (); + numServerTunnels++; + } else - LogPrint (eLogError, "Clients: I2P server tunnel for destination ", m_AddressBook.ToAddress(localDestination->GetIdentHash ()), " already exists"); - numServerTunnels++; + LogPrint (eLogError, "Clients: I2P server tunnel for destination/port ", m_AddressBook.ToAddress(localDestination->GetIdentHash ()), "/", inPort, " already exists"); + } else LogPrint (eLogWarning, "Clients: Unknown section type=", type, " of ", name, " in ", tunConf); diff --git a/ClientContext.h b/ClientContext.h index 3381228b..15ae73c2 100644 --- a/ClientContext.h +++ b/ClientContext.h @@ -48,6 +48,8 @@ namespace client void Start (); void Stop (); + void ReloadConfig (); + std::shared_ptr GetSharedLocalDestination () const { return m_SharedLocalDestination; }; std::shared_ptr CreateNewLocalDestination (bool isPublic = false, i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1, const std::map * params = nullptr); // transient diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 63975722..19ccecb5 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -225,7 +225,8 @@ namespace http { const char HTTP_COMMAND_SHUTDOWN_START[] = "shutdown_start"; const char HTTP_COMMAND_SHUTDOWN_CANCEL[] = "shutdown_cancel"; const char HTTP_COMMAND_SHUTDOWN_NOW[] = "terminate"; - const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test"; + const char HTTP_COMMAND_RUN_PEER_TEST[] = "run_peer_test"; + const char HTTP_COMMAND_RELOAD_CONFIG[] = "reload_config"; const char HTTP_PARAM_BASE32_ADDRESS[] = "b32"; const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; const char HTTP_PARAM_ADDRESS[] = "address"; @@ -509,6 +510,7 @@ namespace http { /* commands */ s << "Router Commands
\r\n"; s << " Run peer test
\r\n"; + s << " Reload config
\r\n"; if (i2p::context.AcceptsTunnels ()) s << " Stop accepting tunnels
\r\n"; else @@ -814,6 +816,8 @@ namespace http { if (cmd == HTTP_COMMAND_RUN_PEER_TEST) i2p::transport::transports.PeerTest (); + else if (cmd == HTTP_COMMAND_RELOAD_CONFIG) + i2p::client::context.ReloadConfig (); else if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) i2p::context.SetAcceptsTunnels (true); else if (cmd == HTTP_COMMAND_STOP_ACCEPTING_TUNNELS) From 67f1e07508a2a4348d95d2d8024430f5d67a78c0 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 12 May 2016 15:37:46 -0400 Subject: [PATCH 47/51] I2CP added --- ClientContext.cpp | 3 ++- ClientContext.h | 2 ++ I2CP.cpp | 13 +++++++++++++ I2CP.h | 21 +++++++++++++++++++++ build/CMakeLists.txt | 1 + filelist.mk | 2 +- 6 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 I2CP.cpp create mode 100644 I2CP.h diff --git a/ClientContext.cpp b/ClientContext.cpp index aad41ab2..df0de4e5 100644 --- a/ClientContext.cpp +++ b/ClientContext.cpp @@ -16,7 +16,7 @@ namespace client ClientContext::ClientContext (): m_SharedLocalDestination (nullptr), m_HttpProxy (nullptr), m_SocksProxy (nullptr), m_SamBridge (nullptr), - m_BOBCommandChannel (nullptr) + m_BOBCommandChannel (nullptr), m_I2CPServer (nullptr) { } @@ -26,6 +26,7 @@ namespace client delete m_SocksProxy; delete m_SamBridge; delete m_BOBCommandChannel; + delete m_I2CPServer; } void ClientContext::Start () diff --git a/ClientContext.h b/ClientContext.h index 15ae73c2..cfbc039f 100644 --- a/ClientContext.h +++ b/ClientContext.h @@ -11,6 +11,7 @@ #include "I2PTunnel.h" #include "SAM.h" #include "BOB.h" +#include "I2CP.h" #include "AddressBook.h" namespace i2p @@ -84,6 +85,7 @@ namespace client std::map, std::unique_ptr > m_ServerTunnels; // ->tunnel SAMBridge * m_SamBridge; BOBCommandChannel * m_BOBCommandChannel; + I2CPServer * m_I2CPServer; public: // for HTTP diff --git a/I2CP.cpp b/I2CP.cpp new file mode 100644 index 00000000..77ff06e2 --- /dev/null +++ b/I2CP.cpp @@ -0,0 +1,13 @@ +#include "I2CP.h" + + +namespace i2p +{ +namespace client +{ + I2CPServer::I2CPServer (const std::string& interface, int port) + { + } +} +} + diff --git a/I2CP.h b/I2CP.h new file mode 100644 index 00000000..c5460c93 --- /dev/null +++ b/I2CP.h @@ -0,0 +1,21 @@ +#ifndef I2CP_H__ +#define I2CP_H__ + +#include +#include + +namespace i2p +{ +namespace client +{ + class I2CPServer + { + public: + + I2CPServer (const std::string& interface, int port); + }; +} +} + +#endif + diff --git a/build/CMakeLists.txt b/build/CMakeLists.txt index 22029e85..7944e2ec 100644 --- a/build/CMakeLists.txt +++ b/build/CMakeLists.txt @@ -76,6 +76,7 @@ set (CLIENT_SRC "${CMAKE_SOURCE_DIR}/SOCKS.cpp" "${CMAKE_SOURCE_DIR}/HTTP.cpp" "${CMAKE_SOURCE_DIR}/HTTPProxy.cpp" + "${CMAKE_SOURCE_DIR}/I2CP.cpp" ) add_library(i2pdclient ${CLIENT_SRC}) diff --git a/filelist.mk b/filelist.mk index e2a3da36..8abf0b4b 100644 --- a/filelist.mk +++ b/filelist.mk @@ -9,7 +9,7 @@ LIB_SRC = \ LIB_CLIENT_SRC = \ AddressBook.cpp BOB.cpp ClientContext.cpp I2PTunnel.cpp I2PService.cpp \ - SAM.cpp SOCKS.cpp HTTP.cpp HTTPProxy.cpp + SAM.cpp SOCKS.cpp HTTP.cpp HTTPProxy.cpp I2CP.cpp # also: Daemon{Linux,Win32}.cpp will be added later DAEMON_SRC = \ From 4c2d4009dab26fc4daffb2349e426adeb3636cd6 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 12 May 2016 16:17:10 -0400 Subject: [PATCH 48/51] handle protocol byte --- I2CP.cpp | 40 ++++++++++++++++++++++++++++++++++++++++ I2CP.h | 24 ++++++++++++++++++++++++ 2 files changed, 64 insertions(+) diff --git a/I2CP.cpp b/I2CP.cpp index 77ff06e2..d3e25e99 100644 --- a/I2CP.cpp +++ b/I2CP.cpp @@ -5,6 +5,46 @@ namespace i2p { namespace client { + I2CPSession::I2CPSession (std::shared_ptr socket): + m_Socket (socket) + { + ReadProtocolByte (); + } + + void I2CPSession::ReadProtocolByte () + { + if (m_Socket) + { + auto s = shared_from_this (); + m_Socket->async_read_some (boost::asio::buffer (m_Buffer, 1), + [s](const boost::system::error_code& ecode, std::size_t bytes_transferred) + { + if (!ecode && bytes_transferred > 0 && s->m_Buffer[0] == I2CP_PRTOCOL_BYTE) + s->Receive (); + else + s->Terminate (); + }); + } + } + + void I2CPSession::Receive () + { + m_Socket->async_read_some (boost::asio::buffer (m_Buffer, I2CP_SESSION_BUFFER_SIZE), + std::bind (&I2CPSession::HandleReceived, shared_from_this (), std::placeholders::_1, std::placeholders::_2)); + } + + void I2CPSession::HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred) + { + if (ecode) + Terminate (); + else + Receive (); + } + + void I2CPSession::Terminate () + { + } + I2CPServer::I2CPServer (const std::string& interface, int port) { } diff --git a/I2CP.h b/I2CP.h index c5460c93..e4b94870 100644 --- a/I2CP.h +++ b/I2CP.h @@ -1,13 +1,37 @@ #ifndef I2CP_H__ #define I2CP_H__ +#include #include +#include #include namespace i2p { namespace client { + const uint8_t I2CP_PRTOCOL_BYTE = 0x2A; + const size_t I2CP_SESSION_BUFFER_SIZE = 8192; + + class I2CPSession: public std::enable_shared_from_this + { + public: + + I2CPSession (std::shared_ptr socket); + + private: + + void ReadProtocolByte (); + void Receive (); + void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred); + void Terminate (); + + private: + + std::shared_ptr m_Socket; + uint8_t m_Buffer[I2CP_SESSION_BUFFER_SIZE]; + }; + class I2CPServer { public: From 448b25a8b2adf3fb1a03589111781ae94141ec78 Mon Sep 17 00:00:00 2001 From: orignal Date: Fri, 13 May 2016 15:13:36 -0400 Subject: [PATCH 49/51] receive I2CP messages --- I2CP.cpp | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- I2CP.h | 31 ++++++++++++++++++++++++---- 2 files changed, 88 insertions(+), 6 deletions(-) diff --git a/I2CP.cpp b/I2CP.cpp index d3e25e99..d6ba4e42 100644 --- a/I2CP.cpp +++ b/I2CP.cpp @@ -1,3 +1,6 @@ +#include +#include "I2PEndian.h" +#include "Log.h" #include "I2CP.h" @@ -5,12 +8,18 @@ namespace i2p { namespace client { - I2CPSession::I2CPSession (std::shared_ptr socket): - m_Socket (socket) + I2CPSession::I2CPSession (I2CPServer& owner, std::shared_ptr socket): + m_Owner (owner), m_Socket (socket), + m_NextMessage (nullptr), m_NextMessageLen (0), m_NextMessageOffset (0) { ReadProtocolByte (); } + I2CPSession::~I2CPSession () + { + delete[] m_NextMessage; + } + void I2CPSession::ReadProtocolByte () { if (m_Socket) @@ -38,15 +47,65 @@ namespace client if (ecode) Terminate (); else + { + size_t offset = 0; + if (m_NextMessage) + { + if (m_NextMessageOffset + bytes_transferred <= m_NextMessageLen) + { + memcpy (m_NextMessage + m_NextMessageOffset, m_Buffer, bytes_transferred); + m_NextMessageOffset += bytes_transferred; + } + else + { + offset = m_NextMessageLen - m_NextMessageOffset; + memcpy (m_NextMessage + m_NextMessageOffset, m_Buffer, offset); + HandleNextMessage (m_NextMessage); + delete[] m_NextMessage; + } + } + while (offset < bytes_transferred) + { + auto msgLen = bufbe32toh (m_Buffer + offset + I2CP_HEADER_LENGTH_OFFSET) + I2CP_HEADER_SIZE; + if (msgLen <= bytes_transferred - offset) + { + HandleNextMessage (m_Buffer + offset); + offset += msgLen; + } + else + { + m_NextMessageLen = msgLen; + m_NextMessageOffset = bytes_transferred - offset; + m_NextMessage = new uint8_t[m_NextMessageLen]; + memcpy (m_NextMessage, m_Buffer + offset, m_NextMessageOffset); + offset = bytes_transferred; + } + } Receive (); + } + } + + void I2CPSession::HandleNextMessage (const uint8_t * buf) + { + auto handler = m_Owner.GetMessagesHandlers ()[buf[I2CP_HEADER_TYPE_OFFSET]]; + if (handler) + (this->*handler)(buf + I2CP_HEADER_SIZE, bufbe32toh (buf + I2CP_HEADER_LENGTH_OFFSET)); + else + LogPrint (eLogError, "I2CP: Unknown I2CP messsage ", (int)buf[I2CP_HEADER_TYPE_OFFSET]); } void I2CPSession::Terminate () { } + void I2CPSession::GetDateMessageHandler (const uint8_t * buf, size_t len) + { + } + I2CPServer::I2CPServer (const std::string& interface, int port) { + memset (m_MessagesHandlers, 0, sizeof (m_MessagesHandlers)); + m_MessagesHandlers[I2CP_GET_DATE_MESSAGE] = &I2CPSession::GetDateMessageHandler; } } } diff --git a/I2CP.h b/I2CP.h index e4b94870..cb17626d 100644 --- a/I2CP.h +++ b/I2CP.h @@ -11,32 +11,55 @@ namespace i2p namespace client { const uint8_t I2CP_PRTOCOL_BYTE = 0x2A; - const size_t I2CP_SESSION_BUFFER_SIZE = 8192; + const size_t I2CP_SESSION_BUFFER_SIZE = 4096; + const size_t I2CP_HEADER_LENGTH_OFFSET = 0; + const size_t I2CP_HEADER_TYPE_OFFSET = I2CP_HEADER_LENGTH_OFFSET + 4; + const size_t I2CP_HEADER_SIZE = I2CP_HEADER_TYPE_OFFSET + 1; + + const uint8_t I2CP_GET_DATE_MESSAGE = 32; + + class I2CPServer; class I2CPSession: public std::enable_shared_from_this { public: - I2CPSession (std::shared_ptr socket); + I2CPSession (I2CPServer& owner, std::shared_ptr socket); + ~I2CPSession (); + + // message handlers + void GetDateMessageHandler (const uint8_t * buf, size_t len); private: void ReadProtocolByte (); void Receive (); void HandleReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred); + void HandleNextMessage (const uint8_t * buf); void Terminate (); private: + I2CPServer& m_Owner; std::shared_ptr m_Socket; - uint8_t m_Buffer[I2CP_SESSION_BUFFER_SIZE]; + uint8_t m_Buffer[I2CP_SESSION_BUFFER_SIZE], * m_NextMessage; + size_t m_NextMessageLen, m_NextMessageOffset; }; - + typedef void (I2CPSession::*I2CPMessageHandler)(const uint8_t * buf, size_t len); + class I2CPServer { public: I2CPServer (const std::string& interface, int port); + + private: + + I2CPMessageHandler m_MessagesHandlers[256]; + + public: + + const decltype(m_MessagesHandlers)& GetMessagesHandlers () const { return m_MessagesHandlers; }; }; } } From 8353f928a1b1f406be69a23367e9b304eb32c6eb Mon Sep 17 00:00:00 2001 From: weekendi2p Date: Tue, 17 May 2016 01:42:58 +0200 Subject: [PATCH 50/51] fix jumpservices --- HTTPProxy.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/HTTPProxy.cpp b/HTTPProxy.cpp index c252614b..6104e15e 100644 --- a/HTTPProxy.cpp +++ b/HTTPProxy.cpp @@ -104,7 +104,7 @@ namespace proxy std::string httpAddr; i2p::config::GetOption("http.address", httpAddr); uint16_t httpPort; i2p::config::GetOption("http.port", httpPort); - response << "HTTP/1.1 302 Found\r\nLocation: http://" << httpAddr << ":" << httpPort << "/?jumpservices=&address=" << m_address << "\r\n\r\n"; + response << "HTTP/1.1 302 Found\r\nLocation: http://" << httpAddr << ":" << httpPort << "/?page=jumpservices&address=" << m_address << "\r\n\r\n"; boost::asio::async_write(*m_sock, boost::asio::buffer(response.str (),response.str ().length ()), std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1)); } From caf2e469a624d9aa63d83075c54484c4db162f0b Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 17 May 2016 12:35:08 -0400 Subject: [PATCH 51/51] remove mascot --- Win32/Anke_2200px.jpg | Bin 149209 -> 0 bytes Win32/Anke_700px.bmp | Bin 747656 -> 0 bytes Win32/Resource.rc | 2 -- Win32/Win32App.cpp | 13 ------------- Win32/anke.ico | Bin 121681 -> 0 bytes Win32/resource.h | 1 - 6 files changed, 16 deletions(-) delete mode 100644 Win32/Anke_2200px.jpg delete mode 100644 Win32/Anke_700px.bmp delete mode 100644 Win32/anke.ico diff --git a/Win32/Anke_2200px.jpg b/Win32/Anke_2200px.jpg deleted file mode 100644 index 1c5b0f31681ecf31d9eae38a6590b0bf2267b503..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 149209 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
>&&84UGHbJUq@^SZ1}>42R~4S)wtjZJ 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 diff --git a/Win32/Resource.rc b/Win32/Resource.rc index c885c044..dc0f82fa 100644 --- a/Win32/Resource.rc +++ b/Win32/Resource.rc @@ -55,8 +55,6 @@ END MAINICON ICON "ictoopie.ico" //MAINICON ICON "anke.ico" -MASCOT BITMAP "Anke_700px.bmp" - #endif // English (United States) resources ///////////////////////////////////////////////////////////////////////////// diff --git a/Win32/Win32App.cpp b/Win32/Win32App.cpp index 81a3ba48..01432381 100644 --- a/Win32/Win32App.cpp +++ b/Win32/Win32App.cpp @@ -167,19 +167,6 @@ namespace win32 } break; } - case WM_PAINT: - { - PAINTSTRUCT ps; - auto hDC = BeginPaint (hWnd, &ps); - auto mascot = LoadBitmap (GetModuleHandle(NULL), MAKEINTRESOURCE (MASCOT)); - auto mascotDC = CreateCompatibleDC (hDC); - SelectObject (mascotDC, mascot); - BitBlt (hDC, 0,0, 533, 700, mascotDC, 0, 0, SRCCOPY); - DeleteDC (mascotDC); - DeleteObject (mascot); - EndPaint (hWnd, &ps); - break; - } } return DefWindowProc( hWnd, uMsg, wParam, lParam); } diff --git a/Win32/anke.ico b/Win32/anke.ico deleted file mode 100644 index 509177bb378cd1e711f85ea0b284e7d49c0b179d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 121681 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
%?MsGrQ^B^7%MdM{hd5k-r- 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

ZAV6DTygQAu&!6< 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 S`XKTJ#gBVU9sIxk@&5rN32ux4 diff --git a/Win32/resource.h b/Win32/resource.h index f37fce46..a8309c8b 100644 --- a/Win32/resource.h +++ b/Win32/resource.h @@ -3,7 +3,6 @@ // Used by Resource.rc // #define MAINICON 101 -#define MASCOT 201 // Next default values for new objects //

Streams
StreamIDDestinationSentReceivedOutInBufRTTWindowStatus
" << it->GetSendStreamID () << "" << i2p::client::context.GetAddressBook ().ToAddress(it->GetRemoteIdentity ()) << "" << it->GetNumSentBytes () << "" << it->GetNumReceivedBytes () << "" << it->GetSendQueueSize () << "" << it->GetReceiveQueueSize () << "" << it->GetSendBufferSize () << "" << it->GetRTT () << "" << it->GetWindowSize () << "" << (int)it->GetStatus () << "