i2pd/libi2pd_client/ClientContext.h

158 lines
7.5 KiB
C
Raw Normal View History

2014-10-16 04:52:17 +04:00
#ifndef CLIENT_CONTEXT_H__
#define CLIENT_CONTEXT_H__
#include <map>
2014-10-16 04:52:17 +04:00
#include <mutex>
2015-02-13 00:11:56 +03:00
#include <memory>
#include <boost/asio.hpp>
2014-10-16 04:52:17 +04:00
#include "Destination.h"
#include "I2PService.h"
#include "HTTPProxy.h"
#include "SOCKS.h"
#include "I2PTunnel.h"
#include "SAM.h"
2014-12-02 18:34:02 +03:00
#include "BOB.h"
2016-05-12 22:37:46 +03:00
#include "I2CP.h"
2014-10-24 23:22:36 +04:00
#include "AddressBook.h"
2014-10-16 04:52:17 +04:00
namespace i2p
{
namespace client
{
2015-03-14 02:51:31 +03:00
const char I2P_TUNNELS_SECTION_TYPE[] = "type";
const char I2P_TUNNELS_SECTION_TYPE_CLIENT[] = "client";
const char I2P_TUNNELS_SECTION_TYPE_SERVER[] = "server";
2015-05-20 23:00:09 +03:00
const char I2P_TUNNELS_SECTION_TYPE_HTTP[] = "http";
2016-02-22 22:33:21 +03:00
const char I2P_TUNNELS_SECTION_TYPE_IRC[] = "irc";
const char I2P_TUNNELS_SECTION_TYPE_UDPCLIENT[] = "udpclient";
const char I2P_TUNNELS_SECTION_TYPE_UDPSERVER[] = "udpserver";
const char I2P_TUNNELS_SECTION_TYPE_SOCKS[] = "socks";
const char I2P_TUNNELS_SECTION_TYPE_WEBSOCKS[] = "websocks";
const char I2P_TUNNELS_SECTION_TYPE_HTTPPROXY[] = "httpproxy";
2015-03-14 02:51:31 +03:00
const char I2P_CLIENT_TUNNEL_PORT[] = "port";
2015-11-30 17:44:32 +03:00
const char I2P_CLIENT_TUNNEL_ADDRESS[] = "address";
2015-03-14 02:51:31 +03:00
const char I2P_CLIENT_TUNNEL_DESTINATION[] = "destination";
const char I2P_CLIENT_TUNNEL_KEYS[] = "keys";
2016-01-04 05:43:43 +03:00
const char I2P_CLIENT_TUNNEL_SIGNATURE_TYPE[] = "signaturetype";
const char I2P_CLIENT_TUNNEL_CRYPTO_TYPE[] = "cryptotype";
const char I2P_CLIENT_TUNNEL_DESTINATION_PORT[] = "destinationport";
2017-04-08 22:14:47 +03:00
const char I2P_CLIENT_TUNNEL_MATCH_TUNNELS[] = "matchtunnels";
const char I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT[] = "connecttimeout";
const char I2P_SERVER_TUNNEL_HOST[] = "host";
const char I2P_SERVER_TUNNEL_HOST_OVERRIDE[] = "hostoverride";
2015-03-14 02:51:31 +03:00
const char I2P_SERVER_TUNNEL_PORT[] = "port";
const char I2P_SERVER_TUNNEL_KEYS[] = "keys";
2016-01-04 05:43:43 +03:00
const char I2P_SERVER_TUNNEL_SIGNATURE_TYPE[] = "signaturetype";
const char I2P_SERVER_TUNNEL_INPORT[] = "inport";
const char I2P_SERVER_TUNNEL_ACCESS_LIST[] = "accesslist";
2016-03-04 09:37:38 +03:00
const char I2P_SERVER_TUNNEL_GZIP[] = "gzip";
const char I2P_SERVER_TUNNEL_WEBIRC_PASSWORD[] = "webircpassword";
2016-09-03 16:38:53 +03:00
const char I2P_SERVER_TUNNEL_ADDRESS[] = "address";
const char I2P_SERVER_TUNNEL_ENABLE_UNIQUE_LOCAL[] = "enableuniquelocal";
2014-10-16 04:52:17 +04:00
class ClientContext
{
public:
ClientContext ();
~ClientContext ();
2014-10-16 04:52:17 +04:00
void Start ();
void Stop ();
void ReloadConfig ();
2015-02-24 23:40:50 +03:00
std::shared_ptr<ClientDestination> GetSharedLocalDestination () const { return m_SharedLocalDestination; };
2017-11-14 23:05:07 +03:00
std::shared_ptr<ClientDestination> CreateNewLocalDestination (bool isPublic = false, // transient
2018-12-05 22:58:50 +03:00
i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519,
2017-11-14 23:05:07 +03:00
i2p::data::CryptoKeyType cryptoType = i2p::data::CRYPTO_KEY_TYPE_ELGAMAL,
2017-11-14 21:31:13 +03:00
const std::map<std::string, std::string> * params = nullptr); // used by SAM only
2020-02-04 23:31:04 +03:00
std::shared_ptr<ClientDestination> 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<std::string, std::string> * params = nullptr); // same as previous but on external io_service
std::shared_ptr<ClientDestination> CreateNewLocalDestination (const i2p::data::PrivateKeys& keys, bool isPublic = true,
2017-11-14 21:31:13 +03:00
const std::map<std::string, std::string> * params = nullptr);
2020-02-04 23:31:04 +03:00
std::shared_ptr<ClientDestination> CreateNewLocalDestination (boost::asio::io_service& service,
const i2p::data::PrivateKeys& keys, bool isPublic = true,
const std::map<std::string, std::string> * params = nullptr); // same as previous but on external io_service
2017-04-08 22:16:51 +03:00
std::shared_ptr<ClientDestination> CreateNewMatchedTunnelDestination(const i2p::data::PrivateKeys &keys, const std::string & name, const std::map<std::string, std::string> * params = nullptr);
2015-02-24 23:40:50 +03:00
void DeleteLocalDestination (std::shared_ptr<ClientDestination> destination);
std::shared_ptr<ClientDestination> FindLocalDestination (const i2p::data::IdentHash& destination) const;
2018-01-06 06:48:51 +03:00
bool LoadPrivateKeys (i2p::data::PrivateKeys& keys, const std::string& filename,
2018-12-05 22:58:50 +03:00
i2p::data::SigningKeyType sigType = i2p::data::SIGNING_KEY_TYPE_EDDSA_SHA512_ED25519,
i2p::data::CryptoKeyType cryptoType = i2p::data::CRYPTO_KEY_TYPE_ELGAMAL);
2014-10-16 04:52:17 +04:00
2014-10-24 23:22:36 +04:00
AddressBook& GetAddressBook () { return m_AddressBook; };
2017-11-14 21:31:13 +03:00
const BOBCommandChannel * GetBOBCommandChannel () const { return m_BOBCommandChannel; };
const SAMBridge * GetSAMBridge () const { return m_SamBridge; };
2016-11-17 21:10:29 +03:00
const I2CPServer * GetI2CPServer () const { return m_I2CPServer; };
2016-09-03 20:58:34 +03:00
2016-09-04 00:53:46 +03:00
std::vector<std::shared_ptr<DatagramSessionInfo> > GetForwardInfosFor(const i2p::data::IdentHash & destination);
2016-10-20 16:12:15 +03:00
2015-02-13 00:11:56 +03:00
private:
void ReadTunnels ();
void ReadTunnels (const std::string& tunConf, int& numClientTunnels, int& numServerTunnels);
void ReadHttpProxy ();
void ReadSocksProxy ();
2016-01-15 20:24:40 +03:00
template<typename Section, typename Type>
std::string GetI2CPOption (const Section& section, const std::string& name, const Type& value) const;
template<typename Section>
2019-01-15 23:43:21 +03:00
std::string GetI2CPStringOption (const Section& section, const std::string& name, const std::string& value) const; // GetI2CPOption with string default value
template<typename Section>
void ReadI2CPOptionsGroup (const Section& section, const std::string& group, std::map<std::string, std::string>& options) const;
template<typename Section>
void ReadI2CPOptions (const Section& section, std::map<std::string, std::string>& options) const; // for tunnels
void ReadI2CPOptionsFromConfig (const std::string& prefix, std::map<std::string, std::string>& options) const; // for HTTP and SOCKS proxy
2016-01-15 20:24:40 +03:00
void CleanupUDP(const boost::system::error_code & ecode);
void ScheduleCleanupUDP();
template<typename Visitor>
void VisitTunnels (Visitor v); // Visitor: (I2PService *) -> bool, true means retain
void CreateNewSharedLocalDestination ();
2020-02-04 23:31:04 +03:00
void AddLocalDestination (std::shared_ptr<ClientDestination> localDestination);
private:
2014-10-16 04:52:17 +04:00
std::mutex m_DestinationsMutex;
2015-02-24 23:40:50 +03:00
std::map<i2p::data::IdentHash, std::shared_ptr<ClientDestination> > m_Destinations;
std::shared_ptr<ClientDestination> m_SharedLocalDestination;
2014-10-16 04:52:17 +04:00
2014-10-24 23:22:36 +04:00
AddressBook m_AddressBook;
i2p::proxy::HTTPProxy * m_HttpProxy;
i2p::proxy::SOCKSProxy * m_SocksProxy;
2018-04-25 23:18:07 +03:00
std::map<boost::asio::ip::tcp::endpoint, std::shared_ptr<I2PService> > m_ClientTunnels; // local endpoint->tunnel
std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PServerTunnel> > m_ServerTunnels; // <destination,port>->tunnel
2016-08-21 22:02:17 +03:00
std::mutex m_ForwardsMutex;
2018-04-25 23:18:07 +03:00
std::map<boost::asio::ip::udp::endpoint, std::shared_ptr<I2PUDPClientTunnel> > m_ClientForwards; // local endpoint -> udp tunnel
std::map<std::pair<i2p::data::IdentHash, int>, std::shared_ptr<I2PUDPServerTunnel> > m_ServerForwards; // <destination,port> -> udp tunnel
SAMBridge * m_SamBridge;
2014-12-02 18:34:02 +03:00
BOBCommandChannel * m_BOBCommandChannel;
2016-05-12 22:37:46 +03:00
I2CPServer * m_I2CPServer;
std::unique_ptr<boost::asio::deadline_timer> m_CleanupUDPTimer;
2014-10-16 04:52:17 +04:00
public:
// for HTTP
const decltype(m_Destinations)& GetDestinations () const { return m_Destinations; };
2016-01-14 04:21:53 +03:00
const decltype(m_ClientTunnels)& GetClientTunnels () const { return m_ClientTunnels; };
const decltype(m_ServerTunnels)& GetServerTunnels () const { return m_ServerTunnels; };
const decltype(m_ClientForwards)& GetClientForwards () const { return m_ClientForwards; }
const decltype(m_ServerForwards)& GetServerForwards () const { return m_ServerForwards; }
2016-10-31 22:42:50 +03:00
const i2p::proxy::HTTPProxy * GetHttpProxy () const { return m_HttpProxy; }
2016-12-28 06:45:51 +03:00
const i2p::proxy::SOCKSProxy * GetSocksProxy () const { return m_SocksProxy; }
2014-10-16 04:52:17 +04:00
};
extern ClientContext context;
}
}
2014-10-16 04:52:17 +04:00
#endif