/ daemon / I2PControl.h
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