diff --git a/HTTPProxy.cpp b/HTTPProxy.cpp index f0166a4a..160c27f6 100644 --- a/HTTPProxy.cpp +++ b/HTTPProxy.cpp @@ -12,6 +12,7 @@ #include "ClientContext.h" #include "I2PEndian.h" #include "I2PTunnel.h" +#include "Config.h" namespace i2p { @@ -36,6 +37,7 @@ namespace proxy void Terminate(); void AsyncSockRead(); void HTTPRequestFailed(/*std::string message*/); + void RedirectToJumpService(); void ExtractRequest(); bool ValidateHTTPRequest(); void HandleJumpServices(); @@ -95,6 +97,17 @@ namespace proxy std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1)); } + void HTTPProxyHandler::RedirectToJumpService(/*HTTPProxyHandler::errTypes error*/) + { + std::stringstream response; + 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"; + boost::asio::async_write(*m_sock, boost::asio::buffer(response.str (),response.str ().length ()), + std::bind(&HTTPProxyHandler::SentHTTPFailed, shared_from_this(), std::placeholders::_1)); + } + void HTTPProxyHandler::EnterState(HTTPProxyHandler::state nstate) { m_state = nstate; @@ -168,6 +181,13 @@ namespace proxy ExtractRequest(); //TODO: parse earlier if (!ValidateHTTPRequest()) return false; HandleJumpServices(); + + i2p::data::IdentHash identHash; + if (!i2p::client::context.GetAddressBook ().GetIdentHash (m_address, identHash)){ + RedirectToJumpService(); + return false; + } + m_request = m_method; m_request.push_back(' '); m_request += m_path; diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 3b92d4bc..b0281692 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -203,6 +203,9 @@ namespace util 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"; + namespace misc_strings { @@ -393,6 +396,7 @@ namespace util 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 (address.length () > 1) HandleCommand (address.substr (2), s); @@ -464,7 +468,13 @@ namespace util ShowTransports (s); else if (cmd == HTTP_COMMAND_TUNNELS) ShowTunnels (s); - else if (cmd == HTTP_COMMAND_TRANSIT_TUNNELS) + else if (cmd == HTTP_COMMAND_JUMPSERVICES) + { + std::map params; + ExtractParams (command.substr (paramsPos), params); + auto address = params[HTTP_PARAM_ADDRESS]; + ShowJumpServices (address, s); + } else if (cmd == HTTP_COMMAND_TRANSIT_TUNNELS) ShowTransitTunnels (s); else if (cmd == HTTP_COMMAND_START_ACCEPTING_TUNNELS) StartAcceptingTunnels (s); @@ -494,6 +504,16 @@ namespace util ShowI2PTunnels (s); } + void HTTPConnection::ShowJumpServices (const std::string& address, std::stringstream& s) + { + s << "
"; + s << ""; + s << "

\r\n"; + s << "Jump services for " << address << ""; + s << ""; + } + void HTTPConnection::ShowLocalDestinations (std::stringstream& s) { s << "Local Destinations:
\r\n
\r\n"; diff --git a/HTTPServer.h b/HTTPServer.h index 702e3191..f70e27dc 100644 --- a/HTTPServer.h +++ b/HTTPServer.h @@ -62,6 +62,7 @@ namespace util void HandleRequest (const std::string& address); void HandleCommand (const std::string& command, std::stringstream& s); + void ShowJumpServices (const std::string& address, std::stringstream& s); void ShowTransports (std::stringstream& s); void ShowTunnels (std::stringstream& s); void ShowTransitTunnels (std::stringstream& s);