From 3ab5ac66b6615f1fb35db73856c14e413bf5f9a4 Mon Sep 17 00:00:00 2001 From: R4SAS Date: Mon, 4 Mar 2019 22:52:21 +0300 Subject: [PATCH] modulize client protocols Signed-off-by: R4SAS --- Makefile | 19 +++++++++++++++ daemon/Daemon.cpp | 8 ++++++ daemon/HTTPServer.cpp | 34 +++++++++++++++++++++++--- daemon/HTTPServer.h | 10 +++++--- daemon/I2PControl.cpp | 33 ++++++++++++++++--------- daemon/I2PControl.h | 9 +++++++ libi2pd/Destination.h | 1 - libi2pd_client/BOB.cpp | 3 +++ libi2pd_client/BOB.h | 4 ++- libi2pd_client/ClientContext.cpp | 30 +++++++++++++++++++++-- libi2pd_client/ClientContext.h | 34 ++++++++++++++++++++++++-- libi2pd_client/I2CP.cpp | 23 +++++++++-------- libi2pd_client/I2CP.h | 3 +++ libi2pd_client/SAM.cpp | 42 +++----------------------------- libi2pd_client/SAM.h | 3 +++ 15 files changed, 184 insertions(+), 72 deletions(-) diff --git a/Makefile b/Makefile index e9bd9187..09348839 100644 --- a/Makefile +++ b/Makefile @@ -40,6 +40,12 @@ USE_GIT_VERSION := $(or $(USE_GIT_VERSION),no) # for MacOS only, waiting for "1", not "yes" HOMEBREW := $(or $(HOMEBREW),0) +# Client protocols +USE_I2PC := $(or $(USE_I2PC),yes) +USE_I2CP := $(or $(USE_I2CP),yes) +USE_SAM := $(or $(USE_SAM),yes) +USE_BOB := $(or $(USE_BOB),yes) + ifeq ($(DEBUG),yes) CXX_DEBUG = -g else @@ -47,6 +53,19 @@ else LD_DEBUG = -s endif +ifeq ($(USE_I2PC),yes) + NEEDED_CXXFLAGS += -DWITH_I2PC +endif +ifeq ($(USE_I2CP),yes) + NEEDED_CXXFLAGS += -DWITH_I2CP +endif +ifeq ($(USE_SAM),yes) + NEEDED_CXXFLAGS += -DWITH_SAM +endif +ifeq ($(USE_BOB),yes) + NEEDED_CXXFLAGS += -DWITH_BOB +endif + ifneq (, $(findstring darwin, $(SYS))) DAEMON_SRC += $(DAEMON_SRC_DIR)/UnixDaemon.cpp ifeq ($(HOMEBREW),1) diff --git a/daemon/Daemon.cpp b/daemon/Daemon.cpp index 744c1e6c..d341ae63 100644 --- a/daemon/Daemon.cpp +++ b/daemon/Daemon.cpp @@ -26,7 +26,9 @@ #include "Streaming.h" #include "Destination.h" #include "HTTPServer.h" +#ifdef WITH_I2PC #include "I2PControl.h" +#endif #include "ClientContext.h" #include "Crypto.h" #include "UPnP.h" @@ -45,7 +47,9 @@ namespace util ~Daemon_Singleton_Private() {}; std::unique_ptr httpServer; +#ifdef WITH_I2PC std::unique_ptr m_I2PControlService; +#endif std::unique_ptr UPnP; std::unique_ptr m_NTPSync; }; @@ -441,6 +445,7 @@ namespace util LogPrint(eLogInfo, "Daemon: Starting Client"); i2p::client::context.Start (); +#ifdef WITH_I2PC // I2P Control Protocol bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol); if (i2pcontrol) { @@ -458,6 +463,7 @@ namespace util ThrowFatal ("Unable to start I2PControl service at ", i2pcpAddr, ":", i2pcpPort, ": ", ex.what ()); } } +#endif return true; } @@ -490,12 +496,14 @@ namespace util d.httpServer->Stop(); d.httpServer = nullptr; } +#ifdef WITH_I2PC if (d.m_I2PControlService) { LogPrint(eLogInfo, "Daemon: Stopping I2PControl"); d.m_I2PControlService->Stop (); d.m_I2PControlService = nullptr; } +#endif i2p::crypto::TerminateCrypto (); i2p::log::Logger().Stop(); diff --git a/daemon/HTTPServer.cpp b/daemon/HTTPServer.cpp index 97295b59..e4693bd1 100644 --- a/daemon/HTTPServer.cpp +++ b/daemon/HTTPServer.cpp @@ -68,9 +68,13 @@ namespace http { const char HTTP_PAGE_TRANSPORTS[] = "transports"; const char HTTP_PAGE_LOCAL_DESTINATIONS[] = "local_destinations"; const char HTTP_PAGE_LOCAL_DESTINATION[] = "local_destination"; +#ifdef WITH_I2CP const char HTTP_PAGE_I2CP_LOCAL_DESTINATION[] = "i2cp_local_destination"; +#endif +#ifdef WITH_SAM const char HTTP_PAGE_SAM_SESSIONS[] = "sam_sessions"; const char HTTP_PAGE_SAM_SESSION[] = "sam_session"; +#endif const char HTTP_PAGE_I2P_TUNNELS[] = "i2p_tunnels"; const char HTTP_PAGE_COMMANDS[] = "commands"; const char HTTP_PAGE_LEASESETS[] = "leasesets"; @@ -87,7 +91,9 @@ namespace http { const char HTTP_COMMAND_GET_REG_STRING[] = "get_reg_string"; const char HTTP_COMMAND_SETLANGUAGE[] = "setlanguage"; const char HTTP_COMMAND_RELOAD_CSS[] = "reload_css"; +#ifdef WITH_SAM const char HTTP_PARAM_SAM_SESSION_ID[] = "id"; +#endif const char HTTP_PARAM_ADDRESS[] = "address"; static std::string ConvertTime (uint64_t time) @@ -202,8 +208,10 @@ namespace http { s << " " << tr ("Transports") << "
\r\n" " " << tr("I2P tunnels") << "
\r\n"; +#ifdef WITH_SAM if (i2p::client::context.GetSAMBridge ()) s << " " << tr("SAM sessions") << "
\r\n"; +#endif s << "\r\n" "
"; @@ -361,17 +369,25 @@ namespace http { if (outputFormat==OutputFormatEnum::forWebConsole) { bool httpproxy = i2p::client::context.GetHttpProxy () ? true : false; bool socksproxy = i2p::client::context.GetSocksProxy () ? true : false; - bool bob = i2p::client::context.GetBOBCommandChannel () ? true : false; - bool sam = i2p::client::context.GetSAMBridge () ? true : false; - bool i2cp = i2p::client::context.GetI2CPServer () ? true : false; - bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol); s << "\r\n"; s << "\r\n"; s << "\r\n"; +#ifdef WITH_BOB + bool bob = i2p::client::context.GetBOBCommandChannel () ? true : false; s << "\r\n"; +#endif +#ifdef WITH_SAM + bool sam = i2p::client::context.GetSAMBridge () ? true : false; s << "\r\n"; +#endif +#ifdef WITH_I2CP + bool i2cp = i2p::client::context.GetI2CPServer () ? true : false; s << "\r\n"; +#endif +#ifdef WITH_I2PC + bool i2pcontrol; i2p::config::GetOption("i2pcontrol.enabled", i2pcontrol); s << "\r\n"; +#endif s << "
" << tr("Services") << "
" << "HTTP " << tr("Proxy") << "" << (httpproxy ? tr("Enabled") : tr("Disabled")) << "
" << "SOCKS " << tr("Proxy") << "" << (socksproxy ? tr("Enabled") : tr("Disabled")) << "
" << "BOB" << "" << (bob ? tr("Enabled") : tr("Disabled")) << "
" << "SAM" << "" << (sam ? tr("Enabled") : tr("Disabled")) << "
" << "I2CP" << "" << (i2cp ? tr("Enabled") : tr("Disabled")) << "
" << "I2PControl" << "" << (i2pcontrol ? tr("Enabled") : tr("Disabled")) << "
\r\n"; } } @@ -388,6 +404,7 @@ namespace http { } s << "
\r\n"; +#ifdef WITH_I2CP auto i2cpServer = i2p::client::context.GetI2CPServer (); if (i2cpServer && !(i2cpServer->GetSessions ().empty ())) { @@ -405,6 +422,7 @@ namespace http { } s << "\r\n"; } +#endif } static void ShowLeaseSetDestination (std::stringstream& s, std::shared_ptr dest, uint32_t token) @@ -572,6 +590,7 @@ namespace http { } } +#ifdef WITH_I2CP void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id) { auto i2cpServer = i2p::client::context.GetI2CPServer (); @@ -587,6 +606,7 @@ namespace http { else ShowError(s, tr("I2CP is not enabled")); } +#endif void ShowLeasesSets(std::stringstream& s) { @@ -879,6 +899,7 @@ namespace http { } } +#ifdef WITH_SAM void ShowSAMSessions (std::stringstream& s) { std::string webroot; i2p::config::GetOption("http.webroot", webroot); @@ -941,6 +962,7 @@ namespace http { } s << "\r\n"; } +#endif void ShowI2PTunnels (std::stringstream& s) { @@ -1194,12 +1216,16 @@ namespace http { uint32_t token = CreateToken (); ShowLocalDestination (s, params["b32"], token); } +#ifdef WITH_I2CP else if (page == HTTP_PAGE_I2CP_LOCAL_DESTINATION) ShowI2CPLocalDestination (s, params["i2cp_id"]); +#endif +#ifdef WITH_SAM else if (page == HTTP_PAGE_SAM_SESSIONS) ShowSAMSessions (s); else if (page == HTTP_PAGE_SAM_SESSION) ShowSAMSession (s, params["sam_id"]); +#endif else if (page == HTTP_PAGE_I2P_TUNNELS) ShowI2PTunnels (s); else if (page == HTTP_PAGE_LEASESETS) diff --git a/daemon/HTTPServer.h b/daemon/HTTPServer.h index 8e1520b8..29f5603f 100644 --- a/daemon/HTTPServer.h +++ b/daemon/HTTPServer.h @@ -95,11 +95,15 @@ namespace http void ShowTunnels (std::stringstream& s); void ShowTransitTunnels (std::stringstream& s); void ShowTransports (std::stringstream& s); - void ShowSAMSessions (std::stringstream& s); void ShowI2PTunnels (std::stringstream& s); void ShowLocalDestination (std::stringstream& s, const std::string& b32, uint32_t token); - void ShowSAMSession (std::stringstream& s, const std::string& id); - void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id); +#ifdef WITH_SAM + void ShowSAMSessions (std::stringstream& s); + void ShowSAMSession (std::stringstream& s, const std::string& id); +#endif +#ifdef WITH_I2CP + void ShowI2CPLocalDestination (std::stringstream& s, const std::string& id); +#endif } // http } // i2p diff --git a/daemon/I2PControl.cpp b/daemon/I2PControl.cpp index 53463a45..6750604c 100644 --- a/daemon/I2PControl.cpp +++ b/daemon/I2PControl.cpp @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_I2PC + #include #include #include @@ -87,8 +89,7 @@ namespace client m_RouterInfoHandlers["i2p.router.net.bw.outbound.1s"] = &I2PControlService::OutboundBandwidth1S; m_RouterInfoHandlers["i2p.router.net.status"] = &I2PControlService::NetStatusHandler; m_RouterInfoHandlers["i2p.router.net.tunnels.participating"] = &I2PControlService::TunnelsParticipatingHandler; - m_RouterInfoHandlers["i2p.router.net.tunnels.successrate"] = -&I2PControlService::TunnelsSuccessRateHandler; + m_RouterInfoHandlers["i2p.router.net.tunnels.successrate"] = &I2PControlService::TunnelsSuccessRateHandler; m_RouterInfoHandlers["i2p.router.net.total.received.bytes"] = &I2PControlService::NetTotalReceivedBytes; m_RouterInfoHandlers["i2p.router.net.total.sent.bytes"] = &I2PControlService::NetTotalSentBytes; @@ -105,9 +106,15 @@ namespace client m_ClientServicesInfoHandlers["I2PTunnel"] = &I2PControlService::I2PTunnelInfoHandler; m_ClientServicesInfoHandlers["HTTPProxy"] = &I2PControlService::HTTPProxyInfoHandler; m_ClientServicesInfoHandlers["SOCKS"] = &I2PControlService::SOCKSInfoHandler; +#ifdef WITH_SAM m_ClientServicesInfoHandlers["SAM"] = &I2PControlService::SAMInfoHandler; +#endif +#ifdef WITH_BOB m_ClientServicesInfoHandlers["BOB"] = &I2PControlService::BOBInfoHandler; +#endif +#ifdef WITH_I2CP m_ClientServicesInfoHandlers["I2CP"] = &I2PControlService::I2CPInfoHandler; +#endif } I2PControlService::~I2PControlService () @@ -346,8 +353,7 @@ namespace client } } -// handlers - + // handlers void I2PControlService::AuthenticateHandler (const boost::property_tree::ptree& params, std::ostringstream& results) { int api = params.get ("API"); @@ -372,8 +378,7 @@ namespace client } -// I2PControl - + // I2PControl void I2PControlService::I2PControlHandler (const boost::property_tree::ptree& params, std::ostringstream& results) { for (auto& it: params) @@ -507,7 +512,7 @@ namespace client m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(1)); // 1 second to make sure response has been sent m_ShutdownTimer.async_wait ( [](const boost::system::error_code& ecode) - { + { Daemon.running = 0; }); } @@ -521,7 +526,7 @@ namespace client m_ShutdownTimer.expires_from_now (boost::posix_time::seconds(timeout + 1)); // + 1 second m_ShutdownTimer.async_wait ( [](const boost::system::error_code& ecode) - { + { Daemon.running = 0; }); } @@ -533,7 +538,7 @@ namespace client i2p::data::netdb.Reseed (); } -// network setting + // network setting void I2PControlService::NetworkSettingHandler (const boost::property_tree::ptree& params, std::ostringstream& results) { for (auto it = params.begin (); it != params.end (); it++) @@ -613,8 +618,7 @@ namespace client EVP_PKEY_free (pkey); } -// ClientServicesInfo - + // ClientServicesInfo void I2PControlService::ClientServicesInfoHandler (const boost::property_tree::ptree& params, std::ostringstream& results) { for (auto it = params.begin (); it != params.end (); it++) @@ -720,6 +724,7 @@ namespace client InsertParam (results, "SOCKS", pt); } +#ifdef WITH_SAM void I2PControlService::SAMInfoHandler (std::ostringstream& results) { boost::property_tree::ptree pt; @@ -755,7 +760,9 @@ namespace client InsertParam (results, "SAM", pt); } +#endif // WITH_SAM +#ifdef WITH_BOB void I2PControlService::BOBInfoHandler (std::ostringstream& results) { boost::property_tree::ptree pt; @@ -770,7 +777,9 @@ namespace client InsertParam (results, "BOB", pt); } +#endif // WITH_BOB +#ifdef WITH_I2CP void I2PControlService::I2CPInfoHandler (std::ostringstream& results) { boost::property_tree::ptree pt; @@ -785,5 +794,7 @@ namespace client InsertParam (results, "I2CP", pt); } +#endif // WITH_I2CP } } +#endif // WITH_I2PC \ No newline at end of file diff --git a/daemon/I2PControl.h b/daemon/I2PControl.h index 32b8933c..4ad321d6 100644 --- a/daemon/I2PControl.h +++ b/daemon/I2PControl.h @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_I2PC + #ifndef I2P_CONTROL_H__ #define I2P_CONTROL_H__ @@ -114,9 +116,15 @@ namespace client void I2PTunnelInfoHandler (std::ostringstream& results); void HTTPProxyInfoHandler (std::ostringstream& results); void SOCKSInfoHandler (std::ostringstream& results); +#ifdef WITH_SAM void SAMInfoHandler (std::ostringstream& results); +#endif +#ifdef WITH_BOB void BOBInfoHandler (std::ostringstream& results); +#endif +#ifdef WITH_I2CP void I2CPInfoHandler (std::ostringstream& results); +#endif private: @@ -141,3 +149,4 @@ namespace client } #endif +#endif // WITH_I2PC \ No newline at end of file diff --git a/libi2pd/Destination.h b/libi2pd/Destination.h index 4b08ec51..562e10db 100644 --- a/libi2pd/Destination.h +++ b/libi2pd/Destination.h @@ -319,5 +319,4 @@ namespace client } } - #endif diff --git a/libi2pd_client/BOB.cpp b/libi2pd_client/BOB.cpp index 61c5d531..4b33cbe3 100644 --- a/libi2pd_client/BOB.cpp +++ b/libi2pd_client/BOB.cpp @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_BOB + #include #include "Log.h" #include "ClientContext.h" @@ -884,3 +886,4 @@ namespace client } } } +#endif // WITH_BOB diff --git a/libi2pd_client/BOB.h b/libi2pd_client/BOB.h index 164ca47c..a567c655 100644 --- a/libi2pd_client/BOB.h +++ b/libi2pd_client/BOB.h @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_BOB + #ifndef BOB_H__ #define BOB_H__ @@ -277,5 +279,5 @@ namespace client }; } } - #endif +#endif // WITH_BOB diff --git a/libi2pd_client/ClientContext.cpp b/libi2pd_client/ClientContext.cpp index d0074f62..3ed62648 100644 --- a/libi2pd_client/ClientContext.cpp +++ b/libi2pd_client/ClientContext.cpp @@ -26,8 +26,16 @@ namespace client ClientContext context; ClientContext::ClientContext (): m_SharedLocalDestination (nullptr), - m_HttpProxy (nullptr), m_SocksProxy (nullptr), m_SamBridge (nullptr), - m_BOBCommandChannel (nullptr), m_I2CPServer (nullptr) + m_HttpProxy (nullptr), m_SocksProxy (nullptr) +#ifdef WITH_SAM + , m_SamBridge (nullptr) +#endif +#ifdef WITH_BOB + , m_BOBCommandChannel (nullptr) +#endif +#ifdef WITH_I2CP + , m_I2CPServer (nullptr) +#endif { } @@ -35,9 +43,15 @@ namespace client { delete m_HttpProxy; delete m_SocksProxy; +#ifdef WITH_SAM delete m_SamBridge; +#endif +#ifdef WITH_BOB delete m_BOBCommandChannel; +#endif +#ifdef WITH_I2CP delete m_I2CPServer; +#endif } void ClientContext::Start () @@ -58,6 +72,7 @@ namespace client // I2P tunnels ReadTunnels (); +#ifdef WITH_SAM // SAM bool sam; i2p::config::GetOption("sam.enabled", sam); if (sam) @@ -77,7 +92,9 @@ namespace client ThrowFatal ("Unable to start SAM bridge at ", samAddr, ":", samPort, ": ", e.what ()); } } +#endif +#ifdef WITH_BOB // BOB bool bob; i2p::config::GetOption("bob.enabled", bob); if (bob) { @@ -95,7 +112,9 @@ namespace client ThrowFatal ("Unable to start BOB bridge at ", bobAddr, ":", bobPort, ": ", e.what ()); } } +#endif +#ifdef WITH_I2CP // I2CP bool i2cp; i2p::config::GetOption("i2cp.enabled", i2cp); if (i2cp) @@ -115,6 +134,7 @@ namespace client ThrowFatal ("Unable to start I2CP at ", i2cpAddr, ":", i2cpPort, ": ", e.what ()); } } +#endif m_AddressBook.StartResolvers (); @@ -158,6 +178,7 @@ namespace client } m_ServerTunnels.clear (); +#ifdef WITH_SAM if (m_SamBridge) { LogPrint(eLogInfo, "Clients: Stopping SAM bridge"); @@ -165,7 +186,9 @@ namespace client delete m_SamBridge; m_SamBridge = nullptr; } +#endif +#ifdef WITH_BOB if (m_BOBCommandChannel) { LogPrint(eLogInfo, "Clients: Stopping BOB command channel"); @@ -173,7 +196,9 @@ namespace client delete m_BOBCommandChannel; m_BOBCommandChannel = nullptr; } +#endif +#ifdef WITH_I2CP if (m_I2CPServer) { LogPrint(eLogInfo, "Clients: Stopping I2CP"); @@ -181,6 +206,7 @@ namespace client delete m_I2CPServer; m_I2CPServer = nullptr; } +#endif LogPrint(eLogInfo, "Clients: Stopping AddressBook"); m_AddressBook.Stop (); diff --git a/libi2pd_client/ClientContext.h b/libi2pd_client/ClientContext.h index 7dd6ff82..b8f0d49d 100644 --- a/libi2pd_client/ClientContext.h +++ b/libi2pd_client/ClientContext.h @@ -1,5 +1,5 @@ /* -* Copyright (c) 2013-2021, The PurpleI2P Project +* Copyright (c) 2013-2022, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * @@ -18,9 +18,19 @@ #include "HTTPProxy.h" #include "SOCKS.h" #include "I2PTunnel.h" + +#ifdef WITH_SAM #include "SAM.h" +#endif + +#ifdef WITH_BOB #include "BOB.h" +#endif + +#ifdef WITH_I2CP #include "I2CP.h" +#endif + #include "AddressBook.h" #include "I18N_langs.h" @@ -76,31 +86,45 @@ namespace client void ReloadConfig (); std::shared_ptr GetSharedLocalDestination () const { return m_SharedLocalDestination; }; - std::shared_ptr CreateNewLocalDestination (bool isPublic = false, // transient + + std::shared_ptr CreateNewLocalDestination ( + bool isPublic = false, // transient i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519, i2p::data::CryptoKeyType cryptoType = i2p::data::CRYPTO_KEY_TYPE_ELGAMAL, const std::map * params = nullptr); // used by SAM only + std::shared_ptr CreateNewLocalDestination (boost::asio::io_service& service, bool isPublic = false, i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519, i2p::data::CryptoKeyType cryptoType = i2p::data::CRYPTO_KEY_TYPE_ELGAMAL, const std::map * params = nullptr); // same as previous but on external io_service + std::shared_ptr CreateNewLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic = true, const std::map * params = nullptr); + std::shared_ptr CreateNewLocalDestination (boost::asio::io_service& service, const i2p::data::PrivateKeys& keys, bool isPublic = true, const std::map * params = nullptr); // same as previous but on external io_service + std::shared_ptr CreateNewMatchedTunnelDestination(const i2p::data::PrivateKeys &keys, const std::string & name, const std::map * params = nullptr); + void DeleteLocalDestination (std::shared_ptr destination); std::shared_ptr FindLocalDestination (const i2p::data::IdentHash& destination) const; + bool LoadPrivateKeys (i2p::data::PrivateKeys& keys, const std::string& filename, i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519, i2p::data::CryptoKeyType cryptoType = i2p::data::CRYPTO_KEY_TYPE_ELGAMAL); AddressBook& GetAddressBook () { return m_AddressBook; }; +#ifdef WITH_BOB const BOBCommandChannel * GetBOBCommandChannel () const { return m_BOBCommandChannel; }; +#endif +#ifdef WITH_SAM const SAMBridge * GetSAMBridge () const { return m_SamBridge; }; +#endif +#ifdef WITH_I2CP const I2CPServer * GetI2CPServer () const { return m_I2CPServer; }; +#endif std::vector > GetForwardInfosFor(const i2p::data::IdentHash & destination); @@ -149,9 +173,15 @@ namespace client std::map > m_ClientForwards; // local endpoint -> udp tunnel std::map, std::shared_ptr > m_ServerForwards; // -> udp tunnel +#ifdef WITH_SAM SAMBridge * m_SamBridge; +#endif +#ifdef WITH_BOB BOBCommandChannel * m_BOBCommandChannel; +#endif +#ifdef WITH_I2CP I2CPServer * m_I2CPServer; +#endif std::unique_ptr m_CleanupUDPTimer; diff --git a/libi2pd_client/I2CP.cpp b/libi2pd_client/I2CP.cpp index 76dbcd66..30b902e6 100644 --- a/libi2pd_client/I2CP.cpp +++ b/libi2pd_client/I2CP.cpp @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_I2CP + #include #include #include @@ -208,12 +210,12 @@ namespace client if (leases.empty ()) leases = remote->GetNonExpiredLeases (true); // with threshold if (!leases.empty ()) - { + { remoteLease = leases[rand () % leases.size ()]; auto leaseRouter = i2p::data::netdb.FindRouter (remoteLease->tunnelGateway); outboundTunnel = GetTunnelPool ()->GetNextOutboundTunnel (nullptr, leaseRouter ? leaseRouter->GetCompatibleTransports (false) : (i2p::data::RouterInfo::CompatibleTransports)i2p::data::RouterInfo::eAllTransports); - } + } if (remoteLease && outboundTunnel) remoteSession->SetSharedRoutingPath (std::make_shared ( i2p::garlic::GarlicRoutingPath{outboundTunnel, remoteLease, 10000, 0, 0})); // 10 secs RTT @@ -534,21 +536,21 @@ namespace client RAND_bytes ((uint8_t *)&m_SessionID, 2); auto identity = std::make_shared(); size_t offset = identity->FromBuffer (buf, len); - + if (!offset) { LogPrint (eLogError, "I2CP: Create session malformed identity"); SendSessionStatusMessage (eI2CPSessionStatusInvalid); // invalid return; } - + if (m_Owner.FindSessionByIdentHash (identity->GetIdentHash ())) { LogPrint (eLogError, "I2CP: Create session duplicate address ", identity->GetIdentHash ().ToBase32 ()); SendSessionStatusMessage (eI2CPSessionStatusInvalid); // invalid return; - } - + } + uint16_t optionsSize = bufbe16toh (buf + offset); offset += 2; if (optionsSize > len - offset) @@ -557,7 +559,7 @@ namespace client SendSessionStatusMessage (eI2CPSessionStatusInvalid); // invalid return; } - + std::map params; ExtractMapping (buf + offset, optionsSize, params); offset += optionsSize; // options @@ -1025,13 +1027,14 @@ namespace client for (const auto& it: m_Sessions) { if (it.second) - { + { auto dest = it.second->GetDestination (); if (dest && dest->GetIdentHash () == ident) return it.second; - } + } } return nullptr; - } + } } } +#endif // WITH_I2CP diff --git a/libi2pd_client/I2CP.h b/libi2pd_client/I2CP.h index f8a45d1e..90384497 100644 --- a/libi2pd_client/I2CP.h +++ b/libi2pd_client/I2CP.h @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_I2CP + #ifndef I2CP_H__ #define I2CP_H__ @@ -249,3 +251,4 @@ namespace client } #endif +#endif // WITH_I2CP diff --git a/libi2pd_client/SAM.cpp b/libi2pd_client/SAM.cpp index d5c62d79..ccb5a773 100644 --- a/libi2pd_client/SAM.cpp +++ b/libi2pd_client/SAM.cpp @@ -1,11 +1,13 @@ /* -* Copyright (c) 2013-2021, The PurpleI2P Project +* Copyright (c) 2013-2022, The PurpleI2P Project * * This file is part of Purple i2pd project and licensed under BSD3 * * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_SAM + #include #include #ifdef _MSC_VER @@ -154,11 +156,7 @@ namespace client if (SAMVersionAcceptable(version)) { -#ifdef _MSC_VER - size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ()); -#else size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ()); -#endif boost::asio::async_write (m_Socket, boost::asio::buffer (m_Buffer, l), boost::asio::transfer_all (), std::bind(&SAMSocket::HandleHandshakeReplySent, shared_from_this (), std::placeholders::_1, std::placeholders::_2)); @@ -465,11 +463,7 @@ namespace client size_t l = session->GetLocalDestination ()->GetPrivateKeys ().ToBuffer (buf, 1024); size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, priv, 1024); priv[l1] = 0; -#ifdef _MSC_VER - size_t l2 = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv); -#else size_t l2 = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_CREATE_REPLY_OK, priv); -#endif SendMessageReply (m_Buffer, l2, false); } } @@ -710,13 +704,8 @@ namespace client } } auto keys = i2p::data::PrivateKeys::CreateRandomKeys (signatureType, cryptoType); -#ifdef _MSC_VER - size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_DEST_REPLY, - keys.GetPublic ()->ToBase64 ().c_str (), keys.ToBase64 ().c_str ()); -#else size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_DEST_REPLY, keys.GetPublic ()->ToBase64 ().c_str (), keys.ToBase64 ().c_str ()); -#endif SendMessageReply (m_Buffer, l, false); } @@ -754,11 +743,7 @@ namespace client else { LogPrint (eLogError, "SAM: Naming failed, unknown address ", name); -#ifdef _MSC_VER - size_t len = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str()); -#else size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str()); -#endif SendMessageReply (m_Buffer, len, false); } } @@ -833,11 +818,7 @@ namespace client void SAMSocket::SendI2PError(const std::string & msg) { LogPrint (eLogError, "SAM: I2P error: ", msg); -#ifdef _MSC_VER - size_t len = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_STATUS_I2P_ERROR, msg.c_str()); -#else size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_SESSION_STATUS_I2P_ERROR, msg.c_str()); -#endif SendMessageReply (m_Buffer, len, true); } @@ -851,11 +832,7 @@ namespace client else { LogPrint (eLogError, "SAM: Naming lookup failed. LeaseSet for ", name, " not found"); -#ifdef _MSC_VER - size_t len = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str()); -#else size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY_INVALID_KEY, name.c_str()); -#endif SendMessageReply (m_Buffer, len, false); } } @@ -863,11 +840,7 @@ namespace client void SAMSocket::SendNamingLookupReply (const std::string& name, std::shared_ptr identity) { auto base64 = identity->ToBase64 (); -#ifdef _MSC_VER - size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY, name.c_str (), base64.c_str ()); -#else size_t l = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_NAMING_REPLY, name.c_str (), base64.c_str ()); -#endif SendMessageReply (m_Buffer, l, false); } @@ -1121,11 +1094,7 @@ namespace client } else { -#ifdef _MSC_VER - size_t l = sprintf_s ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_DATAGRAM_RECEIVED, base64.c_str (), (long unsigned int)len); -#else size_t l = snprintf ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_DATAGRAM_RECEIVED, base64.c_str (), (long unsigned int)len); -#endif if (len < SAM_SOCKET_BUFFER_SIZE - l) { memcpy (m_StreamBuffer + l, buf, len); @@ -1149,11 +1118,7 @@ namespace client m_Owner.SendTo({ {buf, len} }, *ep); else { -#ifdef _MSC_VER - size_t l = sprintf_s ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_RAW_RECEIVED, (long unsigned int)len); -#else size_t l = snprintf ((char *)m_StreamBuffer, SAM_SOCKET_BUFFER_SIZE, SAM_RAW_RECEIVED, (long unsigned int)len); -#endif if (len < SAM_SOCKET_BUFFER_SIZE - l) { memcpy (m_StreamBuffer + l, buf, len); @@ -1528,3 +1493,4 @@ namespace client } } } +#endif // WITH_SAM \ No newline at end of file diff --git a/libi2pd_client/SAM.h b/libi2pd_client/SAM.h index b36f0958..2410d2aa 100644 --- a/libi2pd_client/SAM.h +++ b/libi2pd_client/SAM.h @@ -6,6 +6,8 @@ * See full license text in LICENSE file at top of project tree */ +#ifdef WITH_SAM + #ifndef SAM_H__ #define SAM_H__ @@ -286,3 +288,4 @@ namespace client } #endif +#endif // WITH_SAM \ No newline at end of file