From ba74c04581586e146e67225eeb4c84bb0c367673 Mon Sep 17 00:00:00 2001 From: sehraf Date: Mon, 7 Sep 2015 11:51:24 +0200 Subject: [PATCH] removed duplicated code, fixed compile, few additions --- libretroshare/src/pqi/p3peermgr.cc | 195 +++++++++++++---------- libretroshare/src/pqi/p3peermgr.h | 14 +- libretroshare/src/pqi/pqisslpersongrp.cc | 2 +- libretroshare/src/retroshare/rspeers.h | 4 +- libretroshare/src/rsserver/p3peers.cc | 18 +-- libretroshare/src/rsserver/p3peers.h | 6 +- 6 files changed, 133 insertions(+), 106 deletions(-) diff --git a/libretroshare/src/pqi/p3peermgr.cc b/libretroshare/src/pqi/p3peermgr.cc index 4d8d2e29a..be0c565f9 100644 --- a/libretroshare/src/pqi/p3peermgr.cc +++ b/libretroshare/src/pqi/p3peermgr.cc @@ -77,8 +77,10 @@ static const std::string kConfigDefaultProxyServerIpAddr = "127.0.0.1"; static const uint16_t kConfigDefaultProxyServerPort = 9050; // standard port. static const std::string kConfigKeyExtIpFinder = "USE_EXTR_IP_FINDER"; -static const std::string kConfigKeyProxyServerIpAddr = "PROXY_SERVER_IPADDR"; -static const std::string kConfigKeyProxyServerPort = "PROXY_SERVER_PORT"; +static const std::string kConfigKeyProxyServerIpAddrTor = "PROXY_SERVER_IPADDR"; +static const std::string kConfigKeyProxyServerPortTor = "PROXY_SERVER_PORT"; +static const std::string kConfigKeyProxyServerIpAddrI2P = "PROXY_SERVER_IPADDR_I2P"; +static const std::string kConfigKeyProxyServerPortI2P = "PROXY_SERVER_PORT_I2P"; void printConnectState(std::ostream &out, peerState &peer); @@ -373,12 +375,42 @@ bool p3PeerMgrIMPL::getGpgId(const RsPeerId &ssl_id, RsPgpId &gpgId) bool p3PeerMgrIMPL::isHidden() { - RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ - return mOwnState.hiddenNode; + return isHidden(RS_HIDDEN_TYPE_NONE); } +/** + * @brief checks the hidden type of the own peer. When type RS_HIDDEN_TYPE_NONE is choosen it returns the 'hiddenNode' value instead + * @param type type to check. Use RS_HIDDEN_TYPE_NONE to check 'hiddenNode' value + * @return true when the peer has the same hidden type than type + */ +bool p3PeerMgrIMPL::isHidden(const uint32_t type) +{ + RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ + switch (type) { + case RS_HIDDEN_TYPE_TOR: + return mOwnState.hiddenType == RS_HIDDEN_TYPE_TOR; + break; + case RS_HIDDEN_TYPE_I2P: + return mOwnState.hiddenType == RS_HIDDEN_TYPE_I2P; + break; + default: + return mOwnState.hiddenNode; + break; + } +} bool p3PeerMgrIMPL::isHiddenPeer(const RsPeerId &ssl_id) +{ + return isHiddenPeer(ssl_id, RS_HIDDEN_TYPE_NONE); +} + +/** + * @brief checks the hidden type of a given ssl id. When type RS_HIDDEN_TYPE_NONE is choosen it returns the 'hiddenNode' value instead + * @param ssl_id to check + * @param type type to check. Use RS_HIDDEN_TYPE_NONE to check 'hiddenNode' value + * @return true when the peer has the same hidden type than type + */ +bool p3PeerMgrIMPL::isHiddenPeer(const RsPeerId &ssl_id, const uint32_t type) { RsStackMutex stack(mPeerMtx); /****** STACK LOCK MUTEX *******/ @@ -399,67 +431,17 @@ bool p3PeerMgrIMPL::isHiddenPeer(const RsPeerId &ssl_id) std::cerr << "p3PeerMgrIMPL::isHiddenPeer(" << ssl_id << ") = " << (it->second).hiddenNode; std::cerr << std::endl; #endif - 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::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; + switch (type) { + case RS_HIDDEN_TYPE_TOR: + return (it->second).hiddenType == RS_HIDDEN_TYPE_TOR; + break; + case RS_HIDDEN_TYPE_I2P: + return (it->second).hiddenType == RS_HIDDEN_TYPE_I2P; + break; + default: + return (it->second).hiddenNode; + break; } - -#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::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) { @@ -1756,10 +1738,6 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) cleanup = false; bool useExtAddrFinder = mNetMgr->getIPServersEnabled(); - // Store Proxy Server. - struct sockaddr_storage proxy_addr; - getProxyServerAddress(proxy_addr); - mPeerMtx.lock(); /****** MUTEX LOCKED *******/ RsPeerNetItem *item = new RsPeerNetItem(); @@ -1869,16 +1847,37 @@ bool p3PeerMgrIMPL::saveList(bool &cleanup, std::list& saveData) vitem->tlvkvs.pairs.push_back(kv) ; + // Store Proxy Server. + // Tor + struct sockaddr_storage proxy_addr; + getProxyServerAddress(RS_HIDDEN_TYPE_TOR, proxy_addr); + #ifdef PEER_DEBUG - std::cerr << "Saving proxyServerAddress: " << sockaddr_storage_tostring(proxy_addr); + std::cerr << "Saving proxyServerAddress for Tor: " << sockaddr_storage_tostring(proxy_addr); std::cerr << std::endl; #endif - kv.key = kConfigKeyProxyServerIpAddr; + kv.key = kConfigKeyProxyServerIpAddrTor; kv.value = sockaddr_storage_iptostring(proxy_addr); vitem->tlvkvs.pairs.push_back(kv) ; - kv.key = kConfigKeyProxyServerPort; + kv.key = kConfigKeyProxyServerPortTor; + kv.value = sockaddr_storage_porttostring(proxy_addr); + vitem->tlvkvs.pairs.push_back(kv) ; + + // I2P + getProxyServerAddress(RS_HIDDEN_TYPE_I2P, proxy_addr); + +#ifdef PEER_DEBUG + std::cerr << "Saving proxyServerAddress for I2P: " << sockaddr_storage_tostring(proxy_addr); + std::cerr << std::endl; +#endif + + kv.key = kConfigKeyProxyServerIpAddrI2P; + kv.value = sockaddr_storage_iptostring(proxy_addr); + vitem->tlvkvs.pairs.push_back(kv) ; + + kv.key = kConfigKeyProxyServerPortI2P; kv.value = sockaddr_storage_porttostring(proxy_addr); vitem->tlvkvs.pairs.push_back(kv) ; @@ -1915,8 +1914,10 @@ bool p3PeerMgrIMPL::loadList(std::list& load) // DEFAULTS. bool useExtAddrFinder = true; - std::string proxyIpAddress = kConfigDefaultProxyServerIpAddr; - uint16_t proxyPort = kConfigDefaultProxyServerPort; + std::string proxyIpAddressTor = kConfigDefaultProxyServerIpAddr; + uint16_t proxyPortTor = kConfigDefaultProxyServerPort; + std::string proxyIpAddressI2P = kConfigDefaultProxyServerIpAddr; + uint16_t proxyPortI2P = kConfigDefaultProxyServerPort; if (load.empty()) { std::cerr << "p3PeerMgrIMPL::loadList() list is empty, it may be a configuration problem." << std::endl; @@ -2012,20 +2013,39 @@ bool p3PeerMgrIMPL::loadList(std::list& load) std::cerr << "setting use_extr_addr_finder to " << useExtAddrFinder << std::endl ; #endif } - else if (kit->key == kConfigKeyProxyServerIpAddr) + // Tor + else if (kit->key == kConfigKeyProxyServerIpAddrTor) { - proxyIpAddress = kit->value; + proxyIpAddressTor = kit->value; #ifdef PEER_DEBUG - std::cerr << "Loaded proxyIpAddress: " << proxyIpAddress; + std::cerr << "Loaded proxyIpAddress for Tor: " << proxyIpAddress; std::cerr << std::endl ; #endif } - else if (kit->key == kConfigKeyProxyServerPort) + else if (kit->key == kConfigKeyProxyServerPortTor) { - proxyPort = atoi(kit->value.c_str()); + proxyPortTor = atoi(kit->value.c_str()); #ifdef PEER_DEBUG - std::cerr << "Loaded proxyPort: " << proxyPort; + std::cerr << "Loaded proxyPort for Tor: " << proxyPort; + std::cerr << std::endl ; +#endif + } + // I2p + else if (kit->key == kConfigKeyProxyServerIpAddrI2P) + { + proxyIpAddressI2P = kit->value; +#ifdef PEER_DEBUG + std::cerr << "Loaded proxyIpAddress for I2P: " << proxyIpAddress; + std::cerr << std::endl ; +#endif + + } + else if (kit->key == kConfigKeyProxyServerPortI2P) + { + proxyPortI2P = atoi(kit->value.c_str()); +#ifdef PEER_DEBUG + std::cerr << "Loaded proxyPort for I2P: " << proxyPort; std::cerr << std::endl ; #endif } @@ -2141,13 +2161,24 @@ bool p3PeerMgrIMPL::loadList(std::list& load) // Configure Proxy Server. struct sockaddr_storage proxy_addr; + // Tor sockaddr_storage_clear(proxy_addr); - sockaddr_storage_ipv4_aton(proxy_addr, proxyIpAddress.c_str()); - sockaddr_storage_ipv4_setport(proxy_addr, proxyPort); + sockaddr_storage_ipv4_aton(proxy_addr, proxyIpAddressTor.c_str()); + sockaddr_storage_ipv4_setport(proxy_addr, proxyPortTor); if (sockaddr_storage_isValidNet(proxy_addr)) { - setProxyServerAddress(proxy_addr); + setProxyServerAddress(RS_HIDDEN_TYPE_TOR, proxy_addr); + } + + // I2P + sockaddr_storage_clear(proxy_addr); + sockaddr_storage_ipv4_aton(proxy_addr, proxyIpAddressI2P.c_str()); + sockaddr_storage_ipv4_setport(proxy_addr, proxyPortI2P); + + if (sockaddr_storage_isValidNet(proxy_addr)) + { + setProxyServerAddress(RS_HIDDEN_TYPE_I2P, proxy_addr); } return true; diff --git a/libretroshare/src/pqi/p3peermgr.h b/libretroshare/src/pqi/p3peermgr.h index f9474465c..2941ba182 100644 --- a/libretroshare/src/pqi/p3peermgr.h +++ b/libretroshare/src/pqi/p3peermgr.h @@ -190,11 +190,9 @@ virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr 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 isHidden(const uint32_t type) = 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 isHiddenPeer(const RsPeerId &ssl_id, const uint32_t type) = 0; virtual bool getProxyAddress(const RsPeerId &ssl_id, struct sockaddr_storage &proxy_addr, std::string &domain_addr, uint16_t &domain_port) = 0; @@ -297,11 +295,9 @@ virtual bool setProxyServerAddress(const uint32_t type, const struct sockaddr 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 isHidden(const uint32_t type); +virtual bool isHiddenPeer(const RsPeerId &ssl_id); +virtual bool isHiddenPeer(const RsPeerId &ssl_id, const uint32_t type); 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); diff --git a/libretroshare/src/pqi/pqisslpersongrp.cc b/libretroshare/src/pqi/pqisslpersongrp.cc index fb285d7ba..94a7ed853 100644 --- a/libretroshare/src/pqi/pqisslpersongrp.cc +++ b/libretroshare/src/pqi/pqisslpersongrp.cc @@ -91,7 +91,7 @@ pqiperson * pqisslpersongrp::locked_createPerson(const RsPeerId& id, pqilistener pqiconnect *pqisc = new pqiconnect(pqip, rss, pqis); - if (mPeerMgr->isHiddenI2P() | mPeerMgr->isHiddenI2PPeer(id)) + if (mPeerMgr->isHidden(RS_HIDDEN_TYPE_I2P) | mPeerMgr->isHiddenPeer(id, RS_HIDDEN_TYPE_I2P)) pqip -> addChildInterface(PQI_CONNECT_HIDDEN_I2P_TCP, pqisc); else /* default tor */ diff --git a/libretroshare/src/retroshare/rspeers.h b/libretroshare/src/retroshare/rspeers.h index e8c3884f3..4b21fadef 100644 --- a/libretroshare/src/retroshare/rspeers.h +++ b/libretroshare/src/retroshare/rspeers.h @@ -355,8 +355,8 @@ class RsPeers virtual bool setNetworkMode(const RsPeerId &ssl_id, uint32_t netMode) = 0; virtual bool setVisState(const RsPeerId &ssl_id, uint16_t vs_disc, uint16_t vs_dht) = 0; - virtual bool getProxyServer(std::string &addr, uint16_t &port,uint32_t& status_flags) = 0; - virtual bool setProxyServer(const std::string &addr, const uint16_t port) = 0; + virtual bool getProxyServer(const uint32_t type, std::string &addr, uint16_t &port,uint32_t& status_flags) = 0; + virtual bool setProxyServer(const uint32_t type, const std::string &addr, const uint16_t port) = 0; virtual void getIPServersList(std::list& ip_servers) = 0; virtual void allowServerIPDetermination(bool) = 0; diff --git a/libretroshare/src/rsserver/p3peers.cc b/libretroshare/src/rsserver/p3peers.cc index 0a0c8717e..97e81b073 100644 --- a/libretroshare/src/rsserver/p3peers.cc +++ b/libretroshare/src/rsserver/p3peers.cc @@ -435,7 +435,7 @@ bool p3Peers::getPeerDetails(const RsPeerId& id, RsPeerDetails &d) } else if (pcs.state & RS_PEER_S_CONNECTED) { - if(isProxyAddress(pcs.connectaddr) || mPeerMgr->isHidden()) + if(isProxyAddress(RS_HIDDEN_TYPE_TOR, pcs.connectaddr) || isProxyAddress(RS_HIDDEN_TYPE_I2P, pcs.connectaddr) || mPeerMgr->isHidden()) d.connectState = RS_PEER_CONNECTSTATE_CONNECTED_TOR; else if (pcs.connecttype == RS_NET_CONN_TCP_ALL) { @@ -457,13 +457,13 @@ bool p3Peers::getPeerDetails(const RsPeerId& id, RsPeerDetails &d) return true; } -bool p3Peers::isProxyAddress(const sockaddr_storage& addr) +bool p3Peers::isProxyAddress(const uint32_t type, const sockaddr_storage& addr) { uint16_t port ; std::string string_addr; - uint32_t status ; + uint32_t status ; - if(!getProxyServer(string_addr, port, status)) + if(!getProxyServer(type, string_addr, port, status)) return false ; return sockaddr_storage_iptostring(addr)==string_addr && sockaddr_storage_port(addr)==port ; @@ -923,21 +923,21 @@ bool p3Peers::setVisState(const RsPeerId &id, uint16_t vs_disc, uint16_t vs_dht) return mPeerMgr->setVisState(id, vs_disc, vs_dht); } -bool p3Peers::getProxyServer(std::string &addr, uint16_t &port, uint32_t &status) +bool p3Peers::getProxyServer(const uint32_t type, std::string &addr, uint16_t &port, uint32_t &status) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::getProxyServer()" << std::endl; #endif struct sockaddr_storage proxy_addr; - mPeerMgr->getProxyServerAddressTor(proxy_addr); + mPeerMgr->getProxyServerAddress(type, proxy_addr); addr = sockaddr_storage_iptostring(proxy_addr); port = sockaddr_storage_port(proxy_addr); - mPeerMgr->getProxyServerStatusTor(status); + mPeerMgr->getProxyServerStatus(type, status); return true; } -bool p3Peers::setProxyServer(const std::string &addr_str, const uint16_t port) +bool p3Peers::setProxyServer(const uint32_t type, const std::string &addr_str, const uint16_t port) { #ifdef P3PEERS_DEBUG std::cerr << "p3Peers::setProxyServer() " << std::endl; @@ -958,7 +958,7 @@ bool p3Peers::setProxyServer(const std::string &addr_str, const uint16_t port) #endif /********************************** WINDOWS/UNIX SPECIFIC PART *******************/ { - return mPeerMgr->setProxyServerAddressTor(addr); + return mPeerMgr->setProxyServerAddress(type, addr); } else { diff --git a/libretroshare/src/rsserver/p3peers.h b/libretroshare/src/rsserver/p3peers.h index 66540003e..3f4fb8763 100644 --- a/libretroshare/src/rsserver/p3peers.h +++ b/libretroshare/src/rsserver/p3peers.h @@ -94,9 +94,9 @@ virtual bool setDynDNS(const RsPeerId &id, const std::string &dyndns); virtual bool setNetworkMode(const RsPeerId &id, uint32_t netMode); virtual bool setVisState(const RsPeerId &id, uint16_t vs_disc, uint16_t vs_dht); -virtual bool getProxyServer(std::string &addr, uint16_t &port,uint32_t& status); -virtual bool setProxyServer(const std::string &addr, const uint16_t port); -virtual bool isProxyAddress(const sockaddr_storage&); +virtual bool getProxyServer(const uint32_t type, std::string &addr, uint16_t &port,uint32_t& status); +virtual bool setProxyServer(const uint32_t type,const std::string &addr, const uint16_t port); +virtual bool isProxyAddress(const uint32_t type,const sockaddr_storage&); virtual void getIPServersList(std::list& ip_servers) ; virtual void allowServerIPDetermination(bool) ;