mirror of
https://github.com/RetroShare/RetroShare.git
synced 2025-02-17 21:34:10 -05:00
add i2p support to libretroshare
This commit is contained in:
parent
a022019358
commit
c17d0e1498
@ -2026,7 +2026,11 @@ void p3LinkMgrIMPL::locked_ConnectAttempt_ProxyAddress(peerConnectState *peer,
|
||||
peerConnectAddress pca;
|
||||
pca.addr = proxy_addr;
|
||||
|
||||
pca.type = RS_NET_CONN_TCP_HIDDEN;
|
||||
if (mPeerMgr->hiddenDomainToHiddenType(domain_addr) == RS_HIDDEN_TYPE_I2P)
|
||||
pca.type = RS_NET_CONN_TCP_HIDDEN_I2P;
|
||||
else
|
||||
/* default tor */
|
||||
pca.type = RS_NET_CONN_TCP_HIDDEN_TOR;
|
||||
|
||||
//for the delay, we add a random time and some more time when the friend list is big
|
||||
pca.delay = P3CONNMGR_TCP_DEFAULT_DELAY;
|
||||
|
@ -46,7 +46,8 @@ const uint32_t RS_NET_CONN_UDP_ALL = 0x00f0;
|
||||
const uint32_t RS_NET_CONN_TCP_LOCAL = 0x0001;
|
||||
const uint32_t RS_NET_CONN_TCP_EXTERNAL = 0x0002;
|
||||
const uint32_t RS_NET_CONN_TCP_UNKNOW_TOPOLOGY = 0x0004;
|
||||
const uint32_t RS_NET_CONN_TCP_HIDDEN = 0x0008;
|
||||
const uint32_t RS_NET_CONN_TCP_HIDDEN_TOR = 0x0008;
|
||||
const uint32_t RS_NET_CONN_TCP_HIDDEN_I2P = 0x0010;
|
||||
|
||||
const uint32_t RS_NET_CONN_UDP_DHT_SYNC = 0x0010;
|
||||
const uint32_t RS_NET_CONN_UDP_PEER_SYNC = 0x0020; /* coming soon */
|
||||
|
@ -130,13 +130,18 @@ p3PeerMgrIMPL::p3PeerMgrIMPL(const RsPeerId& ssl_own_id, const RsPgpId& gpg_own_
|
||||
lastGroupId = 1;
|
||||
|
||||
// setup default ProxyServerAddress.
|
||||
sockaddr_storage_clear(mProxyServerAddress);
|
||||
sockaddr_storage_ipv4_aton(mProxyServerAddress,
|
||||
sockaddr_storage_clear(mProxyServerAddressTor);
|
||||
sockaddr_storage_ipv4_aton(mProxyServerAddressTor,
|
||||
kConfigDefaultProxyServerIpAddr.c_str());
|
||||
sockaddr_storage_ipv4_setport(mProxyServerAddress,
|
||||
sockaddr_storage_ipv4_setport(mProxyServerAddressTor,
|
||||
kConfigDefaultProxyServerPort);
|
||||
sockaddr_storage_clear(mProxyServerAddressI2P);
|
||||
sockaddr_storage_ipv4_aton(mProxyServerAddressI2P,
|
||||
kConfigDefaultProxyServerIpAddr.c_str());
|
||||
sockaddr_storage_ipv4_setport(mProxyServerAddressI2P,
|
||||
kConfigDefaultProxyServerPort);
|
||||
|
||||
mProxyServerStatus = RS_NET_PROXY_STATUS_UNKNOWN ;
|
||||
mProxyServerStatusTor = RS_NET_PROXY_STATUS_UNKNOWN ;
|
||||
}
|
||||
|
||||
#ifdef PEER_DEBUG
|
||||
@ -397,6 +402,100 @@ bool p3PeerMgrIMPL::isHiddenPeer(const RsPeerId &ssl_id)
|
||||
return (it->second).hiddenNode;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::isHiddenTor()
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
return mOwnState.hiddenType == RS_HIDDEN_TYPE_TOR;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::isHiddenTorPeer(const RsPeerId &ssl_id)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
/* check for existing */
|
||||
std::map<RsPeerId, peerState>::iterator it;
|
||||
it = mFriendList.find(ssl_id);
|
||||
if (it == mFriendList.end())
|
||||
{
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::isHiddenTorPeer(" << ssl_id << ") Missing Peer => false";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::isHiddenTorPeer(" << ssl_id << ") = " << (it->second).hiddenType;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return (it->second).hiddenType == RS_HIDDEN_TYPE_TOR;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::isHiddenI2P()
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
return mOwnState.hiddenType == RS_HIDDEN_TYPE_I2P;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::isHiddenI2PPeer(const RsPeerId &ssl_id)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
/* check for existing */
|
||||
std::map<RsPeerId, peerState>::iterator it;
|
||||
it = mFriendList.find(ssl_id);
|
||||
if (it == mFriendList.end())
|
||||
{
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::isHiddenI2PPeer(" << ssl_id << ") Missing Peer => false";
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::isHiddenI2PPeer(" << ssl_id << ") = " << (it->second).hiddenType;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return (it->second).hiddenType == RS_HIDDEN_TYPE_I2P;
|
||||
}
|
||||
|
||||
bool hasEnding (std::string const &fullString, std::string const &ending) {
|
||||
if (fullString.length() < ending.length())
|
||||
return false;
|
||||
|
||||
return (0 == fullString.compare (fullString.length() - ending.length(), ending.length(), ending));
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief resolves the hidden type (tor or i2p) from a domain
|
||||
* @param domain to check
|
||||
* @return RS_HIDDEN_TYPE_TOR, RS_HIDDEN_TYPE_I2P or RS_HIDDEN_TYPE_NONE
|
||||
*
|
||||
* Tor: ^[a-z2-7]{16}\.onion$
|
||||
*
|
||||
* I2P: There is more than one address:
|
||||
* - pub. key in base64
|
||||
* - hash in base32 ( ^[a-z2-7]{52}\.b32\.i2p$ )
|
||||
* - "normal" .i2p domains
|
||||
*/
|
||||
uint32_t p3PeerMgrIMPL::hiddenDomainToHiddenType(const std::string &domain)
|
||||
{
|
||||
if(hasEnding(domain, ".onion"))
|
||||
return RS_HIDDEN_TYPE_TOR;
|
||||
if(hasEnding(domain, ".i2p"))
|
||||
return RS_HIDDEN_TYPE_I2P;
|
||||
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::hiddenDomainToHiddenType() unknown hidden type: " << domain;
|
||||
std::cerr << std::endl;
|
||||
#endif
|
||||
return RS_HIDDEN_TYPE_NONE;
|
||||
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::setHiddenDomainPort(const RsPeerId &ssl_id, const std::string &domain_addr, const uint16_t domain_port)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
@ -426,6 +525,7 @@ bool p3PeerMgrIMPL::setHiddenDomainPort(const RsPeerId &ssl_id, const std::strin
|
||||
mOwnState.hiddenNode = true;
|
||||
mOwnState.hiddenDomain = domain;
|
||||
mOwnState.hiddenPort = domain_port;
|
||||
mOwnState.hiddenType = hiddenDomainToHiddenType(domain);
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::setHiddenDomainPort() Set own State";
|
||||
std::cerr << std::endl;
|
||||
@ -448,6 +548,7 @@ bool p3PeerMgrIMPL::setHiddenDomainPort(const RsPeerId &ssl_id, const std::strin
|
||||
it->second.hiddenDomain = domain;
|
||||
it->second.hiddenPort = domain_port;
|
||||
it->second.hiddenNode = true;
|
||||
it->second.hiddenType = hiddenDomainToHiddenType(domain);
|
||||
#ifdef PEER_DEBUG
|
||||
std::cerr << "p3PeerMgrIMPL::setHiddenDomainPort() Set Peers State";
|
||||
std::cerr << std::endl;
|
||||
@ -456,15 +557,28 @@ bool p3PeerMgrIMPL::setHiddenDomainPort(const RsPeerId &ssl_id, const std::strin
|
||||
return true;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::setProxyServerAddress(const struct sockaddr_storage &proxy_addr)
|
||||
bool p3PeerMgrIMPL::setProxyServerAddress(const uint32_t type, const struct sockaddr_storage &proxy_addr)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
if (!sockaddr_storage_same(mProxyServerAddress,proxy_addr))
|
||||
{
|
||||
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
|
||||
mProxyServerAddress = proxy_addr;
|
||||
switch (type) {
|
||||
case RS_HIDDEN_TYPE_I2P:
|
||||
if (!sockaddr_storage_same(mProxyServerAddressI2P,proxy_addr))
|
||||
{
|
||||
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
|
||||
mProxyServerAddressI2P = proxy_addr;
|
||||
}
|
||||
break;
|
||||
case RS_HIDDEN_TYPE_TOR:
|
||||
default:
|
||||
if (!sockaddr_storage_same(mProxyServerAddressTor,proxy_addr))
|
||||
{
|
||||
IndicateConfigChanged(); /**** INDICATE MSG CONFIG CHANGED! *****/
|
||||
mProxyServerAddressTor = proxy_addr;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -480,18 +594,36 @@ bool p3PeerMgrIMPL::resetOwnExternalAddressList()
|
||||
return true ;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::getProxyServerStatus(uint32_t& proxy_status)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
proxy_status = mProxyServerStatus;
|
||||
return true;
|
||||
}
|
||||
bool p3PeerMgrIMPL::getProxyServerAddress(struct sockaddr_storage &proxy_addr)
|
||||
bool p3PeerMgrIMPL::getProxyServerStatus(const uint32_t type, uint32_t& proxy_status)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
proxy_addr = mProxyServerAddress;
|
||||
switch (type) {
|
||||
case RS_HIDDEN_TYPE_I2P:
|
||||
proxy_status = mProxyServerStatusI2P;
|
||||
break;
|
||||
case RS_HIDDEN_TYPE_TOR:
|
||||
default:
|
||||
proxy_status = mProxyServerStatusTor;
|
||||
break;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
bool p3PeerMgrIMPL::getProxyServerAddress(const uint32_t type, struct sockaddr_storage &proxy_addr)
|
||||
{
|
||||
RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/
|
||||
|
||||
switch (type) {
|
||||
case RS_HIDDEN_TYPE_I2P:
|
||||
proxy_addr = mProxyServerAddressI2P;
|
||||
break;
|
||||
case RS_HIDDEN_TYPE_TOR:
|
||||
default:
|
||||
proxy_addr = mProxyServerAddressTor;
|
||||
break;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -515,7 +647,11 @@ bool p3PeerMgrIMPL::getProxyAddress(const RsPeerId &ssl_id, struct sockaddr_stor
|
||||
domain_addr = it->second.hiddenDomain;
|
||||
domain_port = it->second.hiddenPort;
|
||||
|
||||
proxy_addr = mProxyServerAddress;
|
||||
if(it->second.hiddenType == RS_HIDDEN_TYPE_I2P)
|
||||
proxy_addr = mProxyServerAddressI2P;
|
||||
else
|
||||
/* default tor */
|
||||
proxy_addr = mProxyServerAddressTor;
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -90,6 +90,7 @@ class peerState
|
||||
bool hiddenNode; /* all IP addresses / dyndns must be blank */
|
||||
std::string hiddenDomain;
|
||||
uint16_t hiddenPort;
|
||||
uint32_t hiddenType;
|
||||
|
||||
std::string location;
|
||||
std::string name;
|
||||
@ -185,11 +186,15 @@ virtual bool getPeerName(const RsPeerId &ssl_id, std::string &name) = 0;
|
||||
virtual bool getGpgId(const RsPeerId &sslId, RsPgpId &gpgId) = 0;
|
||||
virtual uint32_t getConnectionType(const RsPeerId &sslId) = 0;
|
||||
|
||||
virtual bool setProxyServerAddress(const struct sockaddr_storage &proxy_addr) = 0;
|
||||
virtual bool getProxyServerAddress(struct sockaddr_storage &proxy_addr) = 0;
|
||||
virtual bool getProxyServerStatus(uint32_t& status) = 0;
|
||||
virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr_storage &proxy_addr) = 0;
|
||||
virtual bool getProxyServerAddress(const uint32_t type, struct sockaddr_storage &proxy_addr) = 0;
|
||||
virtual bool getProxyServerStatus(const uint32_t type, uint32_t& status) = 0;
|
||||
virtual bool isHidden() = 0;
|
||||
virtual bool isHiddenPeer(const RsPeerId &ssl_id) = 0;
|
||||
virtual bool isHiddenTor() = 0;
|
||||
virtual bool isHiddenTorPeer(const RsPeerId &ssl_id) = 0;
|
||||
virtual bool isHiddenI2P() = 0;
|
||||
virtual bool isHiddenI2PPeer(const RsPeerId &ssl_id) = 0;
|
||||
virtual bool getProxyAddress(const RsPeerId &ssl_id, struct sockaddr_storage &proxy_addr, std::string &domain_addr, uint16_t &domain_port) = 0;
|
||||
|
||||
|
||||
@ -288,12 +293,17 @@ virtual bool getPeerName(const RsPeerId& ssl_id, std::string& name);
|
||||
virtual bool getGpgId(const RsPeerId& sslId, RsPgpId& gpgId);
|
||||
virtual uint32_t getConnectionType(const RsPeerId& sslId);
|
||||
|
||||
virtual bool setProxyServerAddress(const struct sockaddr_storage &proxy_addr);
|
||||
virtual bool getProxyServerAddress(struct sockaddr_storage &proxy_addr);
|
||||
virtual bool getProxyServerStatus(uint32_t &proxy_status);
|
||||
virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr_storage &proxy_addr);
|
||||
virtual bool getProxyServerAddress(const uint32_t type, struct sockaddr_storage &proxy_addr);
|
||||
virtual bool getProxyServerStatus(const uint32_t type, uint32_t &proxy_status);
|
||||
virtual bool isHidden();
|
||||
virtual bool isHiddenPeer(const RsPeerId& ssl_id);
|
||||
virtual bool isHiddenTor();
|
||||
virtual bool isHiddenTorPeer(const RsPeerId &ssl_id);
|
||||
virtual bool isHiddenI2P();
|
||||
virtual bool isHiddenI2PPeer(const RsPeerId &ssl_id);
|
||||
virtual bool getProxyAddress(const RsPeerId& ssl_id, struct sockaddr_storage &proxy_addr, std::string &domain_addr, uint16_t &domain_port);
|
||||
virtual uint32_t hiddenDomainToHiddenType(const std::string &domain);
|
||||
|
||||
virtual int getFriendCount(bool ssl, bool online);
|
||||
|
||||
@ -369,8 +379,10 @@ private:
|
||||
|
||||
std::map<RsPgpId, ServicePermissionFlags> mFriendsPermissionFlags ; // permission flags for each gpg key
|
||||
|
||||
struct sockaddr_storage mProxyServerAddress;
|
||||
uint32_t mProxyServerStatus ;
|
||||
struct sockaddr_storage mProxyServerAddressTor;
|
||||
struct sockaddr_storage mProxyServerAddressI2P;
|
||||
uint32_t mProxyServerStatusTor ;
|
||||
uint32_t mProxyServerStatusI2P ;
|
||||
|
||||
};
|
||||
|
||||
|
@ -249,7 +249,8 @@ class PQInterface: public RateInterface
|
||||
|
||||
const uint32_t PQI_CONNECT_TCP = 0x0001;
|
||||
const uint32_t PQI_CONNECT_UDP = 0x0002;
|
||||
const uint32_t PQI_CONNECT_HIDDEN_TCP = 0x0004;
|
||||
const uint32_t PQI_CONNECT_HIDDEN_TOR_TCP = 0x0004;
|
||||
const uint32_t PQI_CONNECT_HIDDEN_I2P_TCP = 0x0008;
|
||||
|
||||
|
||||
#define BIN_FLAGS_NO_CLOSE 0x0001
|
||||
|
@ -500,7 +500,7 @@ void printNetBinID(std::ostream &out, const RsPeerId& id, uint32_t t)
|
||||
{
|
||||
out << "TCP)";
|
||||
}
|
||||
else if (t == PQI_CONNECT_HIDDEN_TCP)
|
||||
else if (t == PQI_CONNECT_HIDDEN_TOR_TCP || t == PQI_CONNECT_HIDDEN_I2P_TCP)
|
||||
{
|
||||
out << "HTCP";
|
||||
}
|
||||
|
@ -617,10 +617,15 @@ int pqipersongrp::connectPeer(const RsPeerId& id
|
||||
uint32_t ptype;
|
||||
if (type & RS_NET_CONN_TCP_ALL)
|
||||
{
|
||||
if (type == RS_NET_CONN_TCP_HIDDEN)
|
||||
if (type == RS_NET_CONN_TCP_HIDDEN_TOR)
|
||||
{
|
||||
ptype = PQI_CONNECT_HIDDEN_TCP;
|
||||
timeout = RS_TCP_HIDDEN_TIMEOUT_PERIOD;
|
||||
ptype = PQI_CONNECT_HIDDEN_TOR_TCP;
|
||||
timeout = RS_TCP_HIDDEN_TIMEOUT_PERIOD;
|
||||
}
|
||||
else if (type == RS_NET_CONN_TCP_HIDDEN_I2P)
|
||||
{
|
||||
ptype = PQI_CONNECT_HIDDEN_I2P_TCP;
|
||||
timeout = RS_TCP_HIDDEN_TIMEOUT_PERIOD;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -91,7 +91,11 @@ pqiperson * pqisslpersongrp::locked_createPerson(const RsPeerId& id, pqilistener
|
||||
|
||||
pqiconnect *pqisc = new pqiconnect(pqip, rss, pqis);
|
||||
|
||||
pqip -> addChildInterface(PQI_CONNECT_HIDDEN_TCP, pqisc);
|
||||
if (mPeerMgr->isHiddenI2P() | mPeerMgr->isHiddenI2PPeer(id))
|
||||
pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqisc);
|
||||
else
|
||||
/* default tor */
|
||||
pqip -> addChildInterface(PQI_CONNECT_HIDDEN_TOR_TCP, pqisc);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
@ -63,6 +63,11 @@ const uint32_t RS_NETMODE_EXT = 0x0003;
|
||||
const uint32_t RS_NETMODE_HIDDEN = 0x0004;
|
||||
const uint32_t RS_NETMODE_UNREACHABLE = 0x0005;
|
||||
|
||||
/* Hidden Type */
|
||||
const uint32_t RS_HIDDEN_TYPE_NONE = 0x0000;
|
||||
const uint32_t RS_HIDDEN_TYPE_TOR = 0x0001;
|
||||
const uint32_t RS_HIDDEN_TYPE_I2P = 0x0002;
|
||||
|
||||
/* Visibility */
|
||||
const uint32_t RS_VS_DISC_OFF = 0x0000;
|
||||
const uint32_t RS_VS_DISC_MINIMAL = 0x0001;
|
||||
|
@ -930,10 +930,10 @@ bool p3Peers::getProxyServer(std::string &addr, uint16_t &port, uint32_t &status
|
||||
#endif
|
||||
|
||||
struct sockaddr_storage proxy_addr;
|
||||
mPeerMgr->getProxyServerAddress(proxy_addr);
|
||||
mPeerMgr->getProxyServerAddressTor(proxy_addr);
|
||||
addr = sockaddr_storage_iptostring(proxy_addr);
|
||||
port = sockaddr_storage_port(proxy_addr);
|
||||
mPeerMgr->getProxyServerStatus(status);
|
||||
mPeerMgr->getProxyServerStatusTor(status);
|
||||
return true;
|
||||
}
|
||||
|
||||
@ -958,7 +958,7 @@ bool p3Peers::setProxyServer(const std::string &addr_str, const uint16_t port)
|
||||
#endif
|
||||
/********************************** WINDOWS/UNIX SPECIFIC PART *******************/
|
||||
{
|
||||
return mPeerMgr->setProxyServerAddress(addr);
|
||||
return mPeerMgr->setProxyServerAddressTor(addr);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
Loading…
x
Reference in New Issue
Block a user