I2PControl.h
1 /* 2 * Copyright (c) 2013-2025, The PurpleI2P Project 3 * 4 * This file is part of Purple i2pd project and licensed under BSD3 5 * 6 * See full license text in LICENSE file at top of project tree 7 */ 8 9 #ifndef I2P_CONTROL_H__ 10 #define I2P_CONTROL_H__ 11 12 #include <inttypes.h> 13 #include <thread> 14 #include <memory> 15 #include <array> 16 #include <string> 17 #include <sstream> 18 #include <map> 19 #include <set> 20 #include <boost/asio.hpp> 21 #include <boost/asio/ssl.hpp> 22 #include <boost/property_tree/ptree.hpp> 23 #include "I2PControlHandlers.h" 24 25 namespace i2p 26 { 27 namespace client 28 { 29 const size_t I2P_CONTROL_MAX_REQUEST_SIZE = 1024; 30 typedef std::array<char, I2P_CONTROL_MAX_REQUEST_SIZE> I2PControlBuffer; 31 32 const long I2P_CONTROL_CERTIFICATE_VALIDITY = 365*10; // 10 years 33 const char I2P_CONTROL_CERTIFICATE_COMMON_NAME[] = "i2pd.i2pcontrol"; 34 const char I2P_CONTROL_CERTIFICATE_ORGANIZATION[] = "Purple I2P"; 35 36 class I2PControlService: public I2PControlHandlers 37 { 38 public: 39 40 I2PControlService (const std::string& address, int port); 41 ~I2PControlService (); 42 43 void Start (); 44 void Stop (); 45 46 private: 47 48 void Run (); 49 void Accept (); 50 template<typename ssl_socket> 51 void HandleAccepted (const boost::system::error_code& ecode, std::shared_ptr<ssl_socket> newSocket); 52 template<typename ssl_socket> 53 void Handshake (std::shared_ptr<ssl_socket> socket); 54 template<typename ssl_socket> 55 void ReadRequest (std::shared_ptr<ssl_socket> socket); 56 template<typename ssl_socket> 57 void HandleRequestReceived (const boost::system::error_code& ecode, size_t bytes_transferred, 58 std::shared_ptr<ssl_socket> socket, std::shared_ptr<I2PControlBuffer> buf); 59 template<typename ssl_socket> 60 void SendResponse (std::shared_ptr<ssl_socket> socket, 61 std::shared_ptr<I2PControlBuffer> buf, std::ostringstream& response, bool isHtml); 62 63 void CreateCertificate (const char *crt_path, const char *key_path); 64 65 private: 66 67 // methods 68 typedef void (I2PControlService::*MethodHandler)(const boost::property_tree::ptree& params, std::ostringstream& results); 69 70 void AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results); 71 void EchoHandler (const boost::property_tree::ptree& params, std::ostringstream& results); 72 void I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results); 73 void RouterManagerHandler (const boost::property_tree::ptree& params, std::ostringstream& results); 74 75 // I2PControl 76 typedef void (I2PControlService::*I2PControlRequestHandler)(const std::string& value); 77 void PasswordHandler (const std::string& value); 78 79 // RouterManager 80 typedef void (I2PControlService::*RouterManagerRequestHandler)(std::ostringstream& results); 81 void ShutdownHandler (std::ostringstream& results); 82 void ShutdownGracefulHandler (std::ostringstream& results); 83 void ReseedHandler (std::ostringstream& results); 84 85 private: 86 87 std::string m_Password; 88 bool m_IsRunning; 89 std::unique_ptr<std::thread> m_Thread; 90 91 boost::asio::io_context m_Service; 92 std::unique_ptr<boost::asio::ip::tcp::acceptor> m_Acceptor; 93 #if defined(BOOST_ASIO_HAS_LOCAL_SOCKETS) 94 std::unique_ptr<boost::asio::local::stream_protocol::acceptor> m_LocalAcceptor; 95 #endif 96 boost::asio::ssl::context m_SSLContext; 97 boost::asio::deadline_timer m_ShutdownTimer; 98 std::set<std::string> m_Tokens; 99 100 std::map<std::string, MethodHandler> m_MethodHandlers; 101 std::map<std::string, I2PControlRequestHandler> m_I2PControlHandlers; 102 std::map<std::string, RouterManagerRequestHandler> m_RouterManagerHandlers; 103 }; 104 } 105 } 106 107 #endif