2011-07-09 09:36:37 +00:00
/*
* libretroshare / src / pqi : p3peermgr . cc
*
* 3 P / PQI network interface for RetroShare .
*
* Copyright 2007 - 2011 by Robert Fernie .
*
* This library is free software ; you can redistribute it and / or
* modify it under the terms of the GNU Library General Public
* License Version 2 as published by the Free Software Foundation .
*
* This library is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the GNU
* Library General Public License for more details .
*
* You should have received a copy of the GNU Library General Public
* License along with this library ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307
* USA .
*
* Please report all bugs and problems to " retroshare@lunamutt.com " .
*
*/
2014-01-07 22:51:22 +00:00
# include "rsserver/p3face.h"
2011-07-09 09:36:37 +00:00
# include "util/rsnet.h"
# include "pqi/authgpg.h"
# include "pqi/authssl.h"
# include "pqi/p3peermgr.h"
2011-07-09 18:39:34 +00:00
# include "pqi/p3linkmgr.h"
# include "pqi/p3netmgr.h"
2011-09-29 09:20:09 +00:00
# include "pqi/p3historymgr.h"
2011-07-09 09:36:37 +00:00
//#include "pqi/p3dhtmgr.h" // Only need it for constants.
//#include "tcponudp/tou.h"
//#include "util/extaddrfinder.h"
//#include "util/dnsresolver.h"
# include "util/rsprint.h"
2012-04-14 22:38:24 +00:00
# include "util/rsstring.h"
2011-08-06 12:27:23 +00:00
# include "util/rsdebug.h"
const int p3peermgrzone = 9531 ;
2011-07-09 09:36:37 +00:00
# include "serialiser/rsconfigitems.h"
2011-08-07 21:11:00 +00:00
# include "retroshare/rsiface.h" // Needed for rsicontrol (should remove this dependancy)
# include "retroshare/rspeers.h" // Needed for Group Parameters.
2015-05-31 15:52:11 +00:00
# include "retroshare/rsbanlist.h" // Needed for banned IPs
2011-08-07 21:11:00 +00:00
2011-07-09 09:36:37 +00:00
/* Network setup States */
const uint32_t RS_NET_NEEDS_RESET = 0x0000 ;
const uint32_t RS_NET_UNKNOWN = 0x0001 ;
const uint32_t RS_NET_UPNP_INIT = 0x0002 ;
const uint32_t RS_NET_UPNP_SETUP = 0x0003 ;
const uint32_t RS_NET_EXT_SETUP = 0x0004 ;
const uint32_t RS_NET_DONE = 0x0005 ;
const uint32_t RS_NET_LOOPBACK = 0x0006 ;
const uint32_t RS_NET_DOWN = 0x0007 ;
const uint32_t MIN_TIME_BETWEEN_NET_RESET = 5 ;
const uint32_t PEER_IP_CONNECT_STATE_MAX_LIST_SIZE = 4 ;
2011-08-08 12:02:17 +00:00
# define VERY_OLD_PEER (90 * 24 * 3600) // 90 days.
2011-07-09 09:36:37 +00:00
/****
2011-07-11 12:11:58 +00:00
* # define PEER_DEBUG 1
2011-07-09 09:36:37 +00:00
* * */
# define MAX_AVAIL_PERIOD 230 //times a peer stay in available state when not connected
# define MIN_RETRY_PERIOD 140
2014-01-18 04:40:39 +00:00
static const std : : string kConfigDefaultProxyServerIpAddr = " 127.0.0.1 " ;
2015-09-15 16:18:46 +02:00
static const uint16_t kConfigDefaultProxyServerPortTor = 9050 ; // standard port.
2015-09-16 11:48:32 +02:00
static const uint16_t kConfigDefaultProxyServerPortI2P = 10 ; // there is no standard port though
2014-01-18 04:40:39 +00:00
static const std : : string kConfigKeyExtIpFinder = " USE_EXTR_IP_FINDER " ;
2015-09-07 11:51:24 +02:00
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 " ;
2014-01-18 04:40:39 +00:00
2011-07-09 09:36:37 +00:00
void printConnectState ( std : : ostream & out , peerState & peer ) ;
peerState : : peerState ( )
2014-03-17 20:56:06 +00:00
: netMode ( RS_NET_MODE_UNKNOWN ) , vs_disc ( RS_VS_DISC_FULL ) , vs_dht ( RS_VS_DHT_FULL ) , lastcontact ( 0 ) ,
2015-09-07 18:46:19 +02:00
hiddenNode ( false ) , hiddenPort ( 0 ) , hiddenType ( RS_HIDDEN_TYPE_NONE )
2011-07-09 09:36:37 +00:00
{
2013-09-13 14:35:19 +00:00
sockaddr_storage_clear ( localaddr ) ;
sockaddr_storage_clear ( serveraddr ) ;
2011-07-09 09:36:37 +00:00
return ;
}
std : : string textPeerConnectState ( peerState & state )
{
2014-03-17 20:56:06 +00:00
std : : string out = " Id: " + state . id . toStdString ( ) + " \n " ;
2012-04-14 22:38:24 +00:00
rs_sprintf_append ( out , " NetMode: %lu \n " , state . netMode ) ;
2013-09-28 08:09:59 +00:00
rs_sprintf_append ( out , " VisState: Disc: %u Dht: %u \n " , state . vs_disc , state . vs_dht ) ;
2013-09-13 14:35:19 +00:00
out + = " laddr: " ;
out + = sockaddr_storage_tostring ( state . localaddr ) ;
out + = " \n eaddr: " ;
out + = sockaddr_storage_tostring ( state . serveraddr ) ;
out + = " \n " ;
2012-04-14 22:38:24 +00:00
return out ;
2011-07-09 09:36:37 +00:00
}
2014-03-17 20:56:06 +00:00
p3PeerMgrIMPL : : p3PeerMgrIMPL ( const RsPeerId & ssl_own_id , const RsPgpId & gpg_own_id , const std : : string & gpg_own_name , const std : : string & ssl_own_location )
2014-03-29 05:20:57 +00:00
: p3Config ( ) , mPeerMtx ( " p3PeerMgr " ) , mStatusChanged ( false )
2011-07-09 09:36:37 +00:00
{
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-09-29 09:20:09 +00:00
mLinkMgr = NULL ;
mNetMgr = NULL ;
2011-07-09 09:36:37 +00:00
/* setup basics of own state */
2012-12-26 18:12:19 +00:00
mOwnState . id = ssl_own_id ;
mOwnState . gpg_id = gpg_own_id ;
mOwnState . name = gpg_own_name ;
mOwnState . location = ssl_own_location ;
2011-07-30 12:18:56 +00:00
mOwnState . netMode = RS_NET_MODE_UPNP ; // Default to UPNP.
2013-09-28 08:09:59 +00:00
mOwnState . vs_disc = RS_VS_DISC_FULL ;
mOwnState . vs_dht = RS_VS_DHT_FULL ;
2011-07-09 09:36:37 +00:00
lastGroupId = 1 ;
2013-09-03 13:35:39 +00:00
// setup default ProxyServerAddress.
2015-09-07 18:46:19 +02:00
// Tor
2015-09-07 11:22:15 +02:00
sockaddr_storage_clear ( mProxyServerAddressTor ) ;
sockaddr_storage_ipv4_aton ( mProxyServerAddressTor ,
2014-01-18 04:40:39 +00:00
kConfigDefaultProxyServerIpAddr . c_str ( ) ) ;
2015-09-07 11:22:15 +02:00
sockaddr_storage_ipv4_setport ( mProxyServerAddressTor ,
2015-09-15 16:18:46 +02:00
kConfigDefaultProxyServerPortTor ) ;
2015-09-07 18:46:19 +02:00
// I2P
2015-09-07 11:22:15 +02:00
sockaddr_storage_clear ( mProxyServerAddressI2P ) ;
sockaddr_storage_ipv4_aton ( mProxyServerAddressI2P ,
kConfigDefaultProxyServerIpAddr . c_str ( ) ) ;
sockaddr_storage_ipv4_setport ( mProxyServerAddressI2P ,
2015-09-15 16:18:46 +02:00
kConfigDefaultProxyServerPortI2P ) ;
2014-09-28 09:54:20 +00:00
2015-09-15 17:10:48 +02:00
mProxyServerStatusTor = RS_NET_PROXY_STATUS_UNKNOWN ;
2015-09-07 18:46:19 +02:00
mProxyServerStatusI2P = RS_NET_PROXY_STATUS_UNKNOWN ;
2011-07-09 09:36:37 +00:00
}
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-09 09:36:37 +00:00
std : : cerr < < " p3PeerMgr() Startup " < < std : : endl ;
# endif
return ;
}
2012-02-14 22:55:14 +00:00
void p3PeerMgrIMPL : : setManagers ( p3LinkMgrIMPL * linkMgr , p3NetMgrIMPL * netMgr )
2011-07-09 18:39:34 +00:00
{
mLinkMgr = linkMgr ;
mNetMgr = netMgr ;
}
2011-07-09 09:36:37 +00:00
2014-01-18 02:32:55 +00:00
2013-09-09 02:10:49 +00:00
bool p3PeerMgrIMPL : : setupHiddenNode ( const std : : string & hiddenAddress , const uint16_t hiddenPort )
{
2014-01-18 02:32:55 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2014-01-18 02:32:55 +00:00
std : : cerr < < " p3PeerMgrIMPL::setupHiddenNode() " ;
std : : cerr < < " Address: " < < hiddenAddress ;
std : : cerr < < " Port: " < < hiddenPort ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2014-01-18 02:32:55 +00:00
mOwnState . hiddenNode = true ;
mOwnState . hiddenPort = hiddenPort ;
mOwnState . hiddenDomain = hiddenAddress ;
2015-09-07 18:46:19 +02:00
mOwnState . hiddenType = hiddenDomainToHiddenType ( hiddenAddress ) ;
2014-01-18 02:32:55 +00:00
}
forceHiddenNode ( ) ;
return true ;
}
bool p3PeerMgrIMPL : : forceHiddenNode ( )
{
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
if ( RS_NET_MODE_HIDDEN ! = mOwnState . netMode )
{
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2014-01-18 02:32:55 +00:00
std : : cerr < < " p3PeerMgrIMPL::forceHiddenNode() Required! " ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2014-01-18 02:32:55 +00:00
}
mOwnState . hiddenNode = true ;
2015-09-15 16:18:46 +02:00
mOwnState . hiddenType = hiddenDomainToHiddenType ( mOwnState . hiddenDomain ) ;
2014-01-18 02:32:55 +00:00
// force external address - otherwise its invalid.
sockaddr_storage_clear ( mOwnState . serveraddr ) ;
sockaddr_storage_ipv4_aton ( mOwnState . serveraddr , " 0.0.0.0 " ) ;
sockaddr_storage_ipv4_setport ( mOwnState . serveraddr , 0 ) ;
}
2013-09-09 02:10:49 +00:00
setOwnNetworkMode ( RS_NET_MODE_HIDDEN ) ;
// switch off DHT too.
2013-09-28 08:09:59 +00:00
setOwnVisState ( mOwnState . vs_disc , RS_VS_DHT_OFF ) ;
2013-09-09 02:10:49 +00:00
// Force the Port.
2013-09-13 14:35:19 +00:00
struct sockaddr_storage loopback ;
sockaddr_storage_clear ( loopback ) ;
sockaddr_storage_ipv4_aton ( loopback , " 127.0.0.1 " ) ;
2014-01-18 02:32:55 +00:00
uint16_t port = sockaddr_storage_port ( mOwnState . localaddr ) ;
sockaddr_storage_ipv4_setport ( loopback , port ) ;
2013-09-09 02:10:49 +00:00
setLocalAddress ( AuthSSL : : getAuthSSL ( ) - > OwnId ( ) , loopback ) ;
2014-01-18 02:32:55 +00:00
mNetMgr - > setIPServersEnabled ( false ) ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
2013-09-09 02:10:49 +00:00
return true ;
}
2013-08-08 23:00:27 +00:00
bool p3PeerMgrIMPL : : setOwnNetworkMode ( uint32_t netMode )
2011-07-09 09:36:37 +00:00
{
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-09-28 09:54:20 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setOwnNetworkMode() : " ;
2011-07-09 18:39:34 +00:00
std : : cerr < < " Existing netMode: " < < mOwnState . netMode ;
std : : cerr < < " Input netMode: " < < netMode ;
2011-07-09 09:36:37 +00:00
std : : cerr < < std : : endl ;
2014-09-28 09:54:20 +00:00
# endif
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
if ( mOwnState . netMode ! = ( netMode & RS_NET_MODE_ACTUAL ) )
{
mOwnState . netMode = ( netMode & RS_NET_MODE_ACTUAL ) ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
changed = true ;
}
2011-07-09 18:39:34 +00:00
}
// Pass on Flags to NetMgr.
2011-07-10 00:41:39 +00:00
mNetMgr - > setNetworkMode ( ( netMode & RS_NET_MODE_ACTUAL ) ) ;
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 18:39:34 +00:00
}
2013-09-28 08:09:59 +00:00
bool p3PeerMgrIMPL : : setOwnVisState ( uint16_t vs_disc , uint16_t vs_dht )
2011-07-09 18:39:34 +00:00
{
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 18:39:34 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2012-04-14 22:38:24 +00:00
std : : string out ;
2013-09-28 08:09:59 +00:00
rs_sprintf ( out , " p3PeerMgr::setOwnVisState() Existing vis: %u/%u Input vis: %u/%u " ,
mOwnState . vs_disc , mOwnState . vs_dht , vs_disc , vs_dht ) ;
2012-04-14 22:38:24 +00:00
rslog ( RSL_WARNING , p3peermgrzone , out ) ;
2011-08-07 21:11:00 +00:00
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2013-09-13 14:35:19 +00:00
std : : cerr < < out . c_str ( ) < < std : : endl ;
2011-07-09 18:39:34 +00:00
# endif
2011-07-09 09:36:37 +00:00
2013-09-28 08:09:59 +00:00
if ( mOwnState . vs_disc ! = vs_disc | | mOwnState . vs_dht ! = vs_dht )
{
mOwnState . vs_disc = vs_disc ;
mOwnState . vs_dht = vs_dht ;
2013-08-08 23:00:27 +00:00
changed = true ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
2011-07-09 09:36:37 +00:00
}
// Pass on Flags to NetMgr.
2013-09-28 08:09:59 +00:00
mNetMgr - > setVisState ( vs_disc , vs_dht ) ;
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2011-07-13 14:22:25 +00:00
void p3PeerMgrIMPL : : tick ( )
2011-07-09 09:36:37 +00:00
{
2015-05-25 16:51:15 +00:00
static const time_t INTERVAL_BETWEEN_LOCATION_CLEANING = 300 ; // Remove unused locations and clean IPs every 10 minutes.
2015-05-25 14:02:45 +00:00
2015-05-25 16:30:04 +00:00
static time_t last_friends_check = time ( NULL ) ; // first cleaning after 1 hour.
2011-07-09 09:36:37 +00:00
2015-05-25 16:30:04 +00:00
time_t now = time ( NULL ) ;
2011-07-09 09:36:37 +00:00
2015-05-25 16:30:04 +00:00
if ( now > INTERVAL_BETWEEN_LOCATION_CLEANING + last_friends_check )
{
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2015-05-25 16:30:04 +00:00
std : : cerr < < " p3PeerMgrIMPL::tick(): cleaning unused locations. " < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2011-07-09 09:36:37 +00:00
2015-05-25 16:30:04 +00:00
rslog ( RSL_WARNING , p3peermgrzone , " p3PeerMgr::tick() removeUnusedLocations() " ) ;
2011-08-06 12:27:23 +00:00
2015-05-25 14:02:45 +00:00
removeUnusedLocations ( ) ;
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::tick(): cleaning banned/old IPs. " < < std : : endl ;
# endif
removeBannedIps ( ) ;
2015-05-25 16:30:04 +00:00
last_friends_check = now ;
}
2011-07-09 09:36:37 +00:00
}
/******************************** Network Status *********************************
* Configuration Loading / Saving .
*/
2014-03-17 20:56:06 +00:00
const RsPeerId & p3PeerMgrIMPL : : getOwnId ( )
2011-07-09 09:36:37 +00:00
{
return AuthSSL : : getAuthSSL ( ) - > OwnId ( ) ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : getOwnNetStatus ( peerState & state )
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
state = mOwnState ;
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : isFriend ( const RsPeerId & id )
2011-07-09 09:36:37 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG_COMMON
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::isFriend( " < < id < < " ) called " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
bool ret = ( mFriendList . end ( ) ! = mFriendList . find ( id ) ) ;
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG_COMMON
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::isFriend( " < < id < < " ) returning : " < < ret < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
return ret ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getPeerName ( const RsPeerId & ssl_id , std : : string & name )
2011-08-07 21:11:00 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-08-07 21:11:00 +00:00
it = mFriendList . find ( ssl_id ) ;
if ( it = = mFriendList . end ( ) )
{
return false ;
}
name = it - > second . name + " ( " + it - > second . location + " ) " ;
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getGpgId ( const RsPeerId & ssl_id , RsPgpId & gpgId )
2012-01-05 15:41:24 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2012-01-05 15:41:24 +00:00
it = mFriendList . find ( ssl_id ) ;
if ( it = = mFriendList . end ( ) )
{
return false ;
}
gpgId = it - > second . gpg_id ;
return true ;
}
2013-09-03 13:35:39 +00:00
/**** HIDDEN STUFF ****/
2013-09-11 07:00:33 +00:00
bool p3PeerMgrIMPL : : isHidden ( )
{
2015-09-07 18:46:19 +02:00
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
return mOwnState . hiddenNode ;
2013-09-11 07:00:33 +00:00
}
2015-09-07 11:51:24 +02:00
/**
2015-09-07 18:46:19 +02:00
* @ brief checks the hidden type of the own peer .
* @ param type type to check
2015-09-07 11:51:24 +02:00
* @ return true when the peer has the same hidden type than type
*/
bool p3PeerMgrIMPL : : isHidden ( const uint32_t type )
2013-09-03 13:35:39 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-09-07 11:51:24 +02:00
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 :
2015-09-07 18:46:19 +02:00
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::isHidden( " < < type < < " ) unkown type -> false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
2015-09-07 11:51:24 +02:00
break ;
2013-09-03 13:35:39 +00:00
}
}
2015-09-07 11:51:24 +02:00
bool p3PeerMgrIMPL : : isHiddenPeer ( const RsPeerId & ssl_id )
2015-09-07 11:22:15 +02:00
{
2015-09-07 11:51:24 +02:00
return isHiddenPeer ( ssl_id , RS_HIDDEN_TYPE_NONE ) ;
2015-09-07 11:22:15 +02:00
}
2015-09-07 11:51:24 +02:00
/**
* @ 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 )
2015-09-07 11:22:15 +02:00
{
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
2015-09-07 11:51:24 +02:00
std : : cerr < < " p3PeerMgrIMPL::isHiddenPeer( " < < ssl_id < < " ) Missing Peer => false " ;
2015-09-07 11:22:15 +02:00
std : : cerr < < std : : endl ;
# endif
return false ;
}
# ifdef PEER_DEBUG
2015-09-07 11:51:24 +02:00
std : : cerr < < " p3PeerMgrIMPL::isHiddenPeer( " < < ssl_id < < " ) = " < < ( it - > second ) . hiddenNode ;
2015-09-07 11:22:15 +02:00
std : : cerr < < std : : endl ;
# endif
2015-09-07 11:51:24 +02:00
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 ;
2015-09-07 11:22:15 +02:00
}
}
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
2015-09-08 13:48:30 +02:00
return RS_HIDDEN_TYPE_UNKNOWN ;
2015-09-07 11:22:15 +02:00
}
2015-09-15 17:10:48 +02:00
/**
* @ brief returns the hidden type of a peer
* @ param ssl_id peer id
* @ return hidden type
*/
uint32_t p3PeerMgrIMPL : : getHiddenType ( const RsPeerId & ssl_id )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
if ( ssl_id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
return mOwnState . hiddenType ;
/* check for existing */
std : : map < RsPeerId , peerState > : : iterator it ;
it = mFriendList . find ( ssl_id ) ;
if ( it = = mFriendList . end ( ) )
{
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::getHiddenType( " < < ssl_id < < " ) Missing Peer => false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
}
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::getHiddenType( " < < ssl_id < < " ) = " < < ( it - > second ) . hiddenType ;
std : : cerr < < std : : endl ;
# endif
return ( it - > second ) . hiddenType ;
}
2015-09-14 09:56:43 +02:00
/**
* @ brief sets hidden domain and port for a given ssl ID
* @ param ssl_id peer to set domain and port for
* @ param domain_addr
* @ param domain_port
* @ return true on success
*/
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setHiddenDomainPort ( const RsPeerId & ssl_id , const std : : string & domain_addr , const uint16_t domain_port )
2013-09-03 13:35:39 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2013-09-09 02:10:49 +00:00
std : : cerr < < " p3PeerMgrIMPL::setHiddenDomainPort() " ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-09-09 02:10:49 +00:00
2014-01-18 23:29:22 +00:00
std : : string domain = domain_addr ;
// trim whitespace!
size_t pos = domain . find_last_not_of ( " \t \n " ) ;
if ( std : : string : : npos ! = pos )
{
domain = domain . substr ( 0 , pos + 1 ) ;
}
pos = domain . find_first_not_of ( " \t \n " ) ;
if ( std : : string : : npos ! = pos )
{
domain = domain . substr ( pos ) ;
}
2014-01-18 02:32:55 +00:00
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
2013-09-09 02:10:49 +00:00
if ( ssl_id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
mOwnState . hiddenNode = true ;
2014-01-18 23:29:22 +00:00
mOwnState . hiddenDomain = domain ;
2013-09-09 02:10:49 +00:00
mOwnState . hiddenPort = domain_port ;
2015-09-07 11:22:15 +02:00
mOwnState . hiddenType = hiddenDomainToHiddenType ( domain ) ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2013-09-09 02:10:49 +00:00
std : : cerr < < " p3PeerMgrIMPL::setHiddenDomainPort() Set own State " ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-09-09 02:10:49 +00:00
return true ;
}
2013-09-03 13:35:39 +00:00
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2013-09-03 13:35:39 +00:00
it = mFriendList . find ( ssl_id ) ;
if ( it = = mFriendList . end ( ) )
{
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2013-09-09 02:10:49 +00:00
std : : cerr < < " p3PeerMgrIMPL::setHiddenDomainPort() Peer Not Found " ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-09-03 13:35:39 +00:00
return false ;
}
2014-01-18 23:29:22 +00:00
it - > second . hiddenDomain = domain ;
2013-09-03 13:35:39 +00:00
it - > second . hiddenPort = domain_port ;
it - > second . hiddenNode = true ;
2015-09-07 11:22:15 +02:00
it - > second . hiddenType = hiddenDomainToHiddenType ( domain ) ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2013-09-09 02:10:49 +00:00
std : : cerr < < " p3PeerMgrIMPL::setHiddenDomainPort() Set Peers State " ;
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-09-09 02:10:49 +00:00
2013-09-03 13:35:39 +00:00
return true ;
}
2015-09-14 09:56:43 +02:00
/**
* @ brief sets the proxy server address for a hidden service
* @ param type hidden service type
* @ param proxy_addr proxy address
* @ return true on success
*/
2015-09-07 11:22:15 +02:00
bool p3PeerMgrIMPL : : setProxyServerAddress ( const uint32_t type , const struct sockaddr_storage & proxy_addr )
2013-09-03 13:35:39 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-09-07 11:22:15 +02:00
switch ( type ) {
case RS_HIDDEN_TYPE_I2P :
2015-09-14 14:56:14 +02:00
if ( ! sockaddr_storage_same ( mProxyServerAddressI2P , proxy_addr ) )
2015-09-07 11:22:15 +02:00
{
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
mProxyServerAddressI2P = proxy_addr ;
}
break ;
case RS_HIDDEN_TYPE_TOR :
2015-09-14 14:56:14 +02:00
if ( ! sockaddr_storage_same ( mProxyServerAddressTor , proxy_addr ) )
2015-09-07 11:22:15 +02:00
{
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
mProxyServerAddressTor = proxy_addr ;
}
break ;
2015-09-08 13:48:30 +02:00
case RS_HIDDEN_TYPE_UNKNOWN :
default :
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::setProxyServerAddress() unknown hidden type " < < type < < " -> false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
2014-01-18 04:40:39 +00:00
}
2015-09-07 11:22:15 +02:00
2013-09-03 13:35:39 +00:00
return true ;
}
2015-05-17 10:00:00 +00:00
bool p3PeerMgrIMPL : : resetOwnExternalAddressList ( )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
mOwnState . ipAddrs . mLocal . mAddrs . clear ( ) ;
mOwnState . ipAddrs . mExt . mAddrs . clear ( ) ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
return true ;
}
2015-09-14 09:56:43 +02:00
/**
* @ brief returs proxy server status for a hidden service proxy
* @ param type hidden service type
* @ param proxy_status
* @ return true on success
*/
2015-09-07 11:22:15 +02:00
bool p3PeerMgrIMPL : : getProxyServerStatus ( const uint32_t type , uint32_t & proxy_status )
2014-09-28 09:54:20 +00:00
{
2015-09-07 11:22:15 +02:00
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-01-18 02:32:55 +00:00
2015-09-07 11:22:15 +02:00
switch ( type ) {
case RS_HIDDEN_TYPE_I2P :
proxy_status = mProxyServerStatusI2P ;
break ;
case RS_HIDDEN_TYPE_TOR :
proxy_status = mProxyServerStatusTor ;
break ;
2015-09-08 13:48:30 +02:00
case RS_HIDDEN_TYPE_UNKNOWN :
default :
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::getProxyServerStatus() unknown hidden type " < < type < < " -> false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
2015-09-07 11:22:15 +02:00
}
return true ;
2014-09-28 09:54:20 +00:00
}
2015-09-07 11:22:15 +02:00
2015-09-14 09:56:43 +02:00
/**
* @ brief returs proxy server address for a hidden service proxy
* @ param type hidden service type
* @ param proxy_addr
* @ return true on success
*/
2015-09-07 11:22:15 +02:00
bool p3PeerMgrIMPL : : getProxyServerAddress ( const uint32_t type , struct sockaddr_storage & proxy_addr )
2014-01-18 02:32:55 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-09-07 11:22:15 +02:00
switch ( type ) {
case RS_HIDDEN_TYPE_I2P :
proxy_addr = mProxyServerAddressI2P ;
break ;
case RS_HIDDEN_TYPE_TOR :
proxy_addr = mProxyServerAddressTor ;
break ;
2015-09-08 13:48:30 +02:00
case RS_HIDDEN_TYPE_UNKNOWN :
default :
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::getProxyServerAddress() unknown hidden type " < < type < < " -> false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
2015-09-07 11:22:15 +02:00
}
2014-01-18 02:32:55 +00:00
return true ;
}
2015-09-14 09:56:43 +02:00
/**
* @ brief looks up the proxy address and domain / port that have to be used when connecting to a peer
* @ param ssl_id peer to connect to
* @ param proxy_addr proxy address to be used
* @ param domain_addr domain to connect to
* @ param domain_port port to connect to
* @ return true on success
*/
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getProxyAddress ( const RsPeerId & ssl_id , struct sockaddr_storage & proxy_addr , std : : string & domain_addr , uint16_t & domain_port )
2013-09-03 13:35:39 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2013-09-03 13:35:39 +00:00
it = mFriendList . find ( ssl_id ) ;
if ( it = = mFriendList . end ( ) )
{
return false ;
}
if ( ! it - > second . hiddenNode )
{
return false ;
}
domain_addr = it - > second . hiddenDomain ;
domain_port = it - > second . hiddenPort ;
2015-09-07 23:40:52 +02:00
switch ( it - > second . hiddenType ) {
case RS_HIDDEN_TYPE_I2P :
2015-09-07 11:22:15 +02:00
proxy_addr = mProxyServerAddressI2P ;
2015-09-07 23:40:52 +02:00
break ;
case RS_HIDDEN_TYPE_TOR :
2015-09-07 11:22:15 +02:00
proxy_addr = mProxyServerAddressTor ;
2015-09-07 23:40:52 +02:00
break ;
2015-09-08 13:48:30 +02:00
case RS_HIDDEN_TYPE_UNKNOWN :
default :
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::getProxyAddress() no valid hidden type ( " < < it - > second . hiddenType < < " ) for peer id " < < ssl_id < < " -> false " ;
std : : cerr < < std : : endl ;
# endif
return false ;
2015-09-07 23:40:52 +02:00
}
2013-09-03 13:35:39 +00:00
return true ;
}
2012-01-08 22:15:19 +00:00
// Placeholder until we implement this functionality.
2014-03-17 20:56:06 +00:00
uint32_t p3PeerMgrIMPL : : getConnectionType ( const RsPeerId & /*sslId*/ )
2012-01-08 22:15:19 +00:00
{
return RS_NET_CONN_TYPE_FRIEND ;
}
2011-08-07 21:11:00 +00:00
2012-02-25 01:48:56 +00:00
int p3PeerMgrIMPL : : getFriendCount ( bool ssl , bool online )
{
if ( online ) {
// count only online id's
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > onlineIds ;
2012-02-25 01:48:56 +00:00
mLinkMgr - > getOnlineList ( onlineIds ) ;
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-03-17 20:56:06 +00:00
std : : set < RsPgpId > gpgIds ;
2012-02-25 01:48:56 +00:00
int count = 0 ;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2012-02-25 01:48:56 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it ) {
if ( online & & std : : find ( onlineIds . begin ( ) , onlineIds . end ( ) , it - > first ) = = onlineIds . end ( ) ) {
continue ;
}
if ( ssl ) {
// count ssl id's only
count + + ;
} else {
// count unique gpg id's
gpgIds . insert ( it - > second . gpg_id ) ;
}
}
return ssl ? count : gpgIds . size ( ) ;
}
if ( ssl ) {
// count all ssl id's
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
return mFriendList . size ( ) ;
}
// count all gpg id's
2014-03-17 20:56:06 +00:00
std : : list < RsPgpId > gpgIds ;
2012-02-25 01:48:56 +00:00
AuthGPG : : getAuthGPG ( ) - > getGPGAcceptedList ( gpgIds ) ;
// add own gpg id, if we have more than one location
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > ownSslIds ;
2012-02-25 01:48:56 +00:00
getAssociatedPeers ( AuthGPG : : getAuthGPG ( ) - > getGPGOwnId ( ) , ownSslIds ) ;
return gpgIds . size ( ) + ( ( ownSslIds . size ( ) > 0 ) ? 1 : 0 ) ;
}
2011-07-09 09:36:37 +00:00
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getFriendNetStatus ( const RsPeerId & id , peerState & state )
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
it = mFriendList . find ( id ) ;
if ( it = = mFriendList . end ( ) )
{
return false ;
}
state = it - > second ;
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getOthersNetStatus ( const RsPeerId & id , peerState & state )
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
it = mOthersList . find ( id ) ;
if ( it = = mOthersList . end ( ) )
{
return false ;
}
state = it - > second ;
return true ;
}
2014-03-17 20:56:06 +00:00
int p3PeerMgrIMPL : : getConnectAddresses ( const RsPeerId & id ,
2013-09-13 14:35:19 +00:00
struct sockaddr_storage & lAddr , struct sockaddr_storage & eAddr ,
2011-07-10 00:41:39 +00:00
pqiIpAddrSet & histAddrs , std : : string & dyndns )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-10 00:41:39 +00:00
it = mFriendList . find ( id ) ;
if ( it = = mFriendList . end ( ) )
{
/* ERROR */
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::getConnectAddresses() ERROR unknown Peer " ;
2011-07-10 00:41:39 +00:00
std : : cerr < < std : : endl ;
return 0 ;
}
lAddr = it - > second . localaddr ;
eAddr = it - > second . serveraddr ;
histAddrs = it - > second . ipAddrs ;
dyndns = it - > second . dyndns ;
return 1 ;
}
2011-07-09 09:36:37 +00:00
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : haveOnceConnected ( )
2011-07-11 18:48:56 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check for existing */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-07-11 18:48:56 +00:00
{
if ( it - > second . lastcontact > 0 )
{
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::haveOnceConnected() lastcontact: " ;
2011-07-11 18:48:56 +00:00
std : : cerr < < time ( NULL ) - it - > second . lastcontact < < " for id: " < < it - > first ;
std : : cerr < < std : : endl ;
# endif
return true ;
}
}
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::haveOnceConnected() all Last Contacts = 0 " ;
2011-07-11 18:48:56 +00:00
std : : cerr < < std : : endl ;
# endif
return false ;
}
2011-07-09 09:36:37 +00:00
/*******************************************************************/
/*******************************************************************/
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : addFriend ( const RsPeerId & input_id , const RsPgpId & input_gpg_id , uint32_t netMode , uint16_t vs_disc , uint16_t vs_dht , time_t lastContact , ServicePermissionFlags service_flags )
2011-07-09 09:36:37 +00:00
{
bool notifyLinkMgr = false ;
2014-03-17 20:56:06 +00:00
RsPeerId id = input_id ;
RsPgpId gpg_id = input_gpg_id ;
2011-08-06 12:27:23 +00:00
2014-03-17 20:56:06 +00:00
rslog ( RSL_WARNING , p3peermgrzone , " p3PeerMgr::addFriend() id: " + id . toStdString ( ) ) ;
2011-08-06 12:27:23 +00:00
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2012-12-01 19:22:22 +00:00
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() cannot add own id as a friend. " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
/* (1) already exists */
return false ;
}
/* so four possibilities
* ( 1 ) already exists as friend - > do nothing .
* ( 2 ) is in others list - > move over .
* ( 3 ) is non - existant - > create new one .
*/
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() " < < id < < " ; gpg_id : " < < gpg_id < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) ! = mFriendList . find ( id ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() Already Exists " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
/* (1) already exists */
return true ;
}
//Authentication is now tested at connection time, we don't store the ssl cert anymore
//
if ( ! AuthGPG : : getAuthGPG ( ) - > isGPGAccepted ( gpg_id ) & & gpg_id ! = AuthGPG : : getAuthGPG ( ) - > getGPGOwnId ( ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() gpg is not accepted " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
/* no auth */
return false ;
}
/* check if it is in others */
if ( mOthersList . end ( ) ! = ( it = mOthersList . find ( id ) ) )
{
/* (2) in mOthersList -> move over */
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() Move from Others " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
mFriendList [ id ] = it - > second ;
mOthersList . erase ( it ) ;
it = mFriendList . find ( id ) ;
/* setup connectivity parameters */
2013-09-28 08:09:59 +00:00
it - > second . vs_disc = vs_disc ;
it - > second . vs_dht = vs_dht ;
2011-07-09 09:36:37 +00:00
it - > second . netMode = netMode ;
it - > second . lastcontact = lastContact ;
mStatusChanged = true ;
notifyLinkMgr = true ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
else
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::addFriend() Creating New Entry " < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
/* create a new entry */
peerState pstate ;
pstate . id = id ;
pstate . gpg_id = gpg_id ;
pstate . name = AuthGPG : : getAuthGPG ( ) - > getGPGName ( gpg_id ) ;
2013-09-28 08:09:59 +00:00
pstate . vs_disc = vs_disc ;
pstate . vs_dht = vs_dht ;
2011-07-09 09:36:37 +00:00
pstate . netMode = netMode ;
pstate . lastcontact = lastContact ;
/* addr & timestamps -> auto cleared */
mFriendList [ id ] = pstate ;
mStatusChanged = true ;
notifyLinkMgr = true ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
}
if ( notifyLinkMgr )
{
2013-09-28 08:09:59 +00:00
mLinkMgr - > addFriend ( id , vs_dht ! = RS_VS_DHT_OFF ) ;
2011-07-09 09:36:37 +00:00
}
2013-03-28 19:48:45 +00:00
service_flags & = servicePermissionFlags ( gpg_id ) ; // Always reduce the permissions.
2012-12-01 19:22:22 +00:00
setServicePermissionFlags ( gpg_id , service_flags ) ;
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
printPeerLists ( std : : cerr ) ;
mLinkMgr - > printPeerLists ( std : : cerr ) ;
# endif
2011-07-09 09:36:37 +00:00
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : removeFriend ( const RsPgpId & id )
{
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::removeFriend() for id : " < < id < < std : : endl ;
std : : cerr < < " p3PeerMgrIMPL::removeFriend() mFriendList.size() : " < < mFriendList . size ( ) < < std : : endl ;
# endif
rslog ( RSL_WARNING , p3peermgrzone , " p3PeerMgr::removeFriend() id: " + id . toStdString ( ) ) ;
std : : list < RsPeerId > sslid_toRemove ; // This is a list of SSLIds.
rsPeers - > getAssociatedSSLIds ( id , sslid_toRemove ) ;
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* move to othersList */
2015-09-24 18:03:19 -04:00
//bool success = false;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
//remove ssl and gpg_ids
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2014-03-17 20:56:06 +00:00
{
if ( find ( sslid_toRemove . begin ( ) , sslid_toRemove . end ( ) , it - > second . id ) ! = sslid_toRemove . end ( ) )
{
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::removeFriend() friend found in the list. " < < id < < std : : endl ;
# endif
peerState peer = it - > second ;
sslid_toRemove . push_back ( it - > second . id ) ;
mOthersList [ it - > second . id ] = peer ;
mStatusChanged = true ;
2015-09-24 18:03:19 -04:00
//success = true;
2014-03-17 20:56:06 +00:00
}
}
2014-10-24 22:07:26 +00:00
for ( std : : list < RsPeerId > : : iterator rit = sslid_toRemove . begin ( ) ; rit ! = sslid_toRemove . end ( ) ; + + rit )
2014-03-17 20:56:06 +00:00
if ( mFriendList . end ( ) ! = ( it = mFriendList . find ( * rit ) ) )
mFriendList . erase ( it ) ;
std : : map < RsPgpId , ServicePermissionFlags > : : iterator it2 = mFriendsPermissionFlags . find ( id ) ;
if ( it2 ! = mFriendsPermissionFlags . end ( ) )
mFriendsPermissionFlags . erase ( it2 ) ;
# ifdef PEER_DEBUG
std : : cerr < < " p3PeerMgrIMPL::removeFriend() new mFriendList.size() : " < < mFriendList . size ( ) < < std : : endl ;
# endif
}
std : : list < RsPeerId > : : iterator rit ;
2014-10-24 22:07:26 +00:00
for ( rit = sslid_toRemove . begin ( ) ; rit ! = sslid_toRemove . end ( ) ; + + rit )
2014-03-17 20:56:06 +00:00
{
mLinkMgr - > removeFriend ( * rit ) ;
}
/* remove id from all groups */
std : : list < RsPgpId > ids ;
ids . push_back ( id ) ;
assignPeersToGroup ( " " , ids , false ) ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
# ifdef PEER_DEBUG
printPeerLists ( std : : cerr ) ;
mLinkMgr - > printPeerLists ( std : : cerr ) ;
# endif
2011-07-09 09:36:37 +00:00
2014-03-17 20:56:06 +00:00
return ! sslid_toRemove . empty ( ) ;
}
bool p3PeerMgrIMPL : : removeFriend ( const RsPeerId & id , bool removePgpId )
2011-07-09 09:36:37 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::removeFriend() for id : " < < id < < std : : endl ;
std : : cerr < < " p3PeerMgrIMPL::removeFriend() mFriendList.size() : " < < mFriendList . size ( ) < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
2014-03-17 20:56:06 +00:00
rslog ( RSL_WARNING , p3peermgrzone , " p3PeerMgr::removeFriend() id: " + id . toStdString ( ) ) ;
2011-08-06 12:27:23 +00:00
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > sslid_toRemove ; // This is a list of SSLIds.
std : : list < RsPgpId > pgpid_toRemove ; // This is a list of SSLIds.
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* move to othersList */
2015-09-24 18:03:19 -04:00
//bool success = false;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
//remove ssl and gpg_ids
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-07-09 09:36:37 +00:00
{
2014-03-17 20:56:06 +00:00
if ( it - > second . id = = id )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::removeFriend() friend found in the list. " < < id < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
peerState peer = it - > second ;
2012-12-01 19:22:22 +00:00
sslid_toRemove . push_back ( it - > second . id ) ;
2013-04-16 20:10:31 +00:00
if ( removePgpId )
pgpid_toRemove . push_back ( it - > second . gpg_id ) ;
2011-07-09 09:36:37 +00:00
mOthersList [ id ] = peer ;
mStatusChanged = true ;
2015-09-24 18:03:19 -04:00
//success = true;
2011-07-09 09:36:37 +00:00
}
}
2014-10-24 22:07:26 +00:00
for ( std : : list < RsPeerId > : : iterator rit = sslid_toRemove . begin ( ) ; rit ! = sslid_toRemove . end ( ) ; + + rit )
2011-07-11 12:11:58 +00:00
if ( mFriendList . end ( ) ! = ( it = mFriendList . find ( * rit ) ) )
2011-07-09 09:36:37 +00:00
mFriendList . erase ( it ) ;
2012-12-01 19:22:22 +00:00
2014-03-17 20:56:06 +00:00
std : : map < RsPgpId , ServicePermissionFlags > : : iterator it2 ;
2012-12-01 19:22:22 +00:00
2014-10-24 22:07:26 +00:00
for ( std : : list < RsPgpId > : : iterator rit = pgpid_toRemove . begin ( ) ; rit ! = pgpid_toRemove . end ( ) ; + + rit )
2012-12-01 19:22:22 +00:00
if ( mFriendsPermissionFlags . end ( ) ! = ( it2 = mFriendsPermissionFlags . find ( * rit ) ) )
mFriendsPermissionFlags . erase ( it2 ) ;
2011-07-09 09:36:37 +00:00
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::removeFriend() new mFriendList.size() : " < < mFriendList . size ( ) < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
}
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > : : iterator rit ;
2014-10-24 22:07:26 +00:00
for ( rit = sslid_toRemove . begin ( ) ; rit ! = sslid_toRemove . end ( ) ; + + rit )
2011-07-11 12:11:58 +00:00
{
mLinkMgr - > removeFriend ( * rit ) ;
}
2011-07-09 09:36:37 +00:00
/* remove id from all groups */
2014-03-17 20:56:06 +00:00
assignPeersToGroup ( " " , pgpid_toRemove , false ) ;
2011-07-09 09:36:37 +00:00
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
printPeerLists ( std : : cerr ) ;
mLinkMgr - > printPeerLists ( std : : cerr ) ;
# endif
2012-12-01 19:22:22 +00:00
return ! sslid_toRemove . empty ( ) ;
2011-07-09 09:36:37 +00:00
}
2011-07-13 14:22:25 +00:00
void p3PeerMgrIMPL : : printPeerLists ( std : : ostream & out )
2011-07-11 12:11:58 +00:00
{
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-07-13 14:22:25 +00:00
out < < " p3PeerMgrIMPL::printPeerLists() Friend List " ;
2011-07-11 12:11:58 +00:00
out < < std : : endl ;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-07-11 12:11:58 +00:00
{
out < < " \t SSL ID: " < < it - > second . id ;
out < < " \t GPG ID: " < < it - > second . gpg_id ;
out < < std : : endl ;
}
2011-07-13 14:22:25 +00:00
out < < " p3PeerMgrIMPL::printPeerLists() Others List " ;
2011-07-11 12:11:58 +00:00
out < < std : : endl ;
2014-10-24 22:07:26 +00:00
for ( it = mOthersList . begin ( ) ; it ! = mOthersList . end ( ) ; + + it )
2011-07-11 12:11:58 +00:00
{
out < < " \t SSL ID: " < < it - > second . id ;
out < < " \t GPG ID: " < < it - > second . gpg_id ;
out < < std : : endl ;
}
}
return ;
}
2011-07-09 09:36:37 +00:00
/*******************************************************************/
/*******************************************************************/
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * External Setup * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-08-02 19:05:27 +00:00
/* This function should only be called from NetMgr,
* as it doesn ' t call back to there .
*/
2013-09-13 14:35:19 +00:00
bool p3PeerMgrIMPL : : UpdateOwnAddress ( const struct sockaddr_storage & localAddr , const struct sockaddr_storage & extAddr )
2011-08-02 19:05:27 +00:00
{
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2015-05-31 19:52:51 +00:00
std : : cerr < < " p3PeerMgrIMPL::UpdateOwnAddress( " ;
std : : cerr < < sockaddr_storage_tostring ( localAddr ) ;
std : : cerr < < " , " ;
std : : cerr < < sockaddr_storage_tostring ( extAddr ) ;
std : : cerr < < " ) " < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
if ( ! rsBanList - > isAddressAccepted ( localAddr , RSBANLIST_CHECKING_FLAGS_BLACKLIST ) )
2015-05-25 16:51:15 +00:00
{
2015-05-31 19:52:51 +00:00
std : : cerr < < " (SS) Trying to set own IP to a banned IP " < < sockaddr_storage_iptostring ( localAddr ) < < " . This probably means that a friend in under traffic re-routing attack. " < < std : : endl ;
2015-05-25 16:51:15 +00:00
return false ;
}
2015-05-31 19:52:51 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
//update ip address list
pqiIpAddress ipAddressTimed ;
ipAddressTimed . mAddr = localAddr ;
ipAddressTimed . mSeenTime = time ( NULL ) ;
ipAddressTimed . mSrc = 0 ;
mOwnState . ipAddrs . updateLocalAddrs ( ipAddressTimed ) ;
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
mOwnState . localaddr = localAddr ;
}
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-11-22 13:24:42 +00:00
2015-05-31 19:52:51 +00:00
//update ip address list
pqiIpAddress ipAddressTimed ;
ipAddressTimed . mAddr = extAddr ;
ipAddressTimed . mSeenTime = time ( NULL ) ;
ipAddressTimed . mSrc = 0 ;
mOwnState . ipAddrs . updateExtAddrs ( ipAddressTimed ) ;
/* Attempted Fix to MANUAL FORWARD Mode....
* don ' t update the server address - if we are in this mode
*
* It is okay - if they get it wrong , as we put the address in the address list anyway .
* This should keep people happy , and allow for misconfiguration !
*/
if ( mOwnState . netMode & RS_NET_MODE_TRY_EXT )
{
/**** THIS CASE SHOULD NOT BE TRIGGERED ****/
std : : cerr < < " p3PeerMgrIMPL::UpdateOwnAddress() Disabling Update of Server Port " ;
std : : cerr < < " as MANUAL FORWARD Mode (ERROR - SHOULD NOT BE TRIGGERED: TRY_EXT_MODE) " ;
std : : cerr < < std : : endl ;
std : : cerr < < " Address is Now: " ;
std : : cerr < < sockaddr_storage_tostring ( mOwnState . serveraddr ) ;
std : : cerr < < std : : endl ;
}
else if ( mOwnState . netMode & RS_NET_MODE_EXT )
{
sockaddr_storage_copyip ( mOwnState . serveraddr , extAddr ) ;
std : : cerr < < " p3PeerMgrIMPL::UpdateOwnAddress() Disabling Update of Server Port " ;
std : : cerr < < " as MANUAL FORWARD Mode " ;
std : : cerr < < std : : endl ;
std : : cerr < < " Address is Now: " ;
std : : cerr < < sockaddr_storage_tostring ( mOwnState . serveraddr ) ;
std : : cerr < < std : : endl ;
}
else
{
mOwnState . serveraddr = extAddr ;
}
}
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
mLinkMgr - > setLocalAddress ( localAddr ) ;
2011-08-02 19:05:27 +00:00
2015-05-31 19:52:51 +00:00
return true ;
2011-08-02 19:05:27 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setLocalAddress ( const RsPeerId & id , const struct sockaddr_storage & addr )
2011-07-09 09:36:37 +00:00
{
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2013-09-13 14:35:19 +00:00
if ( ! sockaddr_storage_same ( mOwnState . localaddr , addr ) )
2011-07-09 09:36:37 +00:00
{
2013-08-08 23:00:27 +00:00
mOwnState . localaddr = addr ;
2011-07-09 09:36:37 +00:00
changed = true ;
}
}
if ( changed )
{
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
2011-07-09 18:39:34 +00:00
mNetMgr - > setLocalAddress ( addr ) ;
2011-07-10 01:49:39 +00:00
mLinkMgr - > setLocalAddress ( addr ) ;
2011-07-09 09:36:37 +00:00
}
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setLocalAddress() cannot add addres info : peer id not found in friend list id: " < < id < < std : : endl ;
2011-07-11 12:11:58 +00:00
# endif
2011-07-09 09:36:37 +00:00
return false ;
}
}
/* "it" points to peer */
2013-09-13 14:35:19 +00:00
if ( ! sockaddr_storage_same ( it - > second . localaddr , addr ) )
{
2013-08-08 23:00:27 +00:00
it - > second . localaddr = addr ;
changed = true ;
}
2011-07-09 09:36:37 +00:00
#if 0
//update ip address list
IpAddressTimed ipAddressTimed ;
ipAddressTimed . ipAddr = addr ;
ipAddressTimed . seenTime = time ( NULL ) ;
it - > second . updateIpAddressList ( ipAddressTimed ) ;
# endif
2013-08-08 23:00:27 +00:00
if ( changed ) {
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setExtAddress ( const RsPeerId & id , const struct sockaddr_storage & addr )
2011-07-09 09:36:37 +00:00
{
2015-06-03 20:28:16 +00:00
bool changed = false ;
uint32_t check_res = 0 ;
if ( ! rsBanList - > isAddressAccepted ( addr , RSBANLIST_CHECKING_FLAGS_BLACKLIST , & check_res ) )
{
std : : cerr < < " (SS) trying to set external contact address for peer " < < id < < " to a banned address " < < sockaddr_storage_iptostring ( addr ) < < std : : endl ;
return false ;
}
2013-08-08 23:00:27 +00:00
2011-07-09 09:36:37 +00:00
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
2011-07-09 18:39:34 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2013-09-13 14:35:19 +00:00
if ( ! sockaddr_storage_same ( mOwnState . serveraddr , addr ) )
2013-08-08 23:00:27 +00:00
{
mOwnState . serveraddr = addr ;
changed = true ;
}
2011-07-09 18:39:34 +00:00
}
2011-07-09 09:36:37 +00:00
2011-07-09 18:39:34 +00:00
mNetMgr - > setExtAddress ( addr ) ;
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setLocalAddress() cannot add addres info : peer id not found in friend list id: " < < id < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
return false ;
}
}
/* "it" points to peer */
2013-09-13 14:35:19 +00:00
if ( ! sockaddr_storage_same ( it - > second . serveraddr , addr ) )
2015-06-03 20:28:16 +00:00
{
2013-08-08 23:00:27 +00:00
it - > second . serveraddr = addr ;
changed = true ;
}
2011-07-09 09:36:37 +00:00
#if 0
//update ip address list
IpAddressTimed ipAddressTimed ;
ipAddressTimed . ipAddr = addr ;
ipAddressTimed . seenTime = time ( NULL ) ;
it - > second . updateIpAddressList ( ipAddressTimed ) ;
# endif
2013-08-08 23:00:27 +00:00
if ( changed ) {
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setDynDNS ( const RsPeerId & id , const std : : string & dyndns )
2011-07-09 09:36:37 +00:00
{
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2013-08-08 23:00:27 +00:00
if ( mOwnState . dyndns . compare ( dyndns ) ! = 0 ) {
mOwnState . dyndns = dyndns ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
changed = true ;
}
return changed ;
2011-07-09 09:36:37 +00:00
}
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setDynDNS() cannot add dyn dns info : peer id not found in friend list id: " < < id < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2011-07-09 09:36:37 +00:00
return false ;
}
}
/* "it" points to peer */
2013-08-08 23:00:27 +00:00
if ( it - > second . dyndns . compare ( dyndns ) ! = 0 ) {
it - > second . dyndns = dyndns ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
changed = true ;
}
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2015-06-06 13:50:11 +00:00
struct ZeroedInt
{
ZeroedInt ( ) { n = 0 ; }
int n ;
} ;
2015-06-01 22:03:07 +00:00
bool p3PeerMgrIMPL : : addCandidateForOwnExternalAddress ( const RsPeerId & from , const sockaddr_storage & addr )
{
2015-06-06 13:50:11 +00:00
// The algorithm is the following:
// - collect for each friend the last external connection address that is reported
// - everytime the list is changed, parse it entirely and
// * emit a warnign when the address is unknown
// * if multiple peers report the same address => notify the LinkMgr that the external address had changed.
2015-09-23 21:45:15 -04:00
sockaddr_storage addr_filtered ;
sockaddr_storage_clear ( addr_filtered ) ;
sockaddr_storage_copyip ( addr_filtered , addr ) ;
2015-06-06 13:50:11 +00:00
# ifdef PEER_DEBUG
2015-09-23 21:45:15 -04:00
std : : cerr < < " Own external address is " < < sockaddr_storage_iptostring ( addr_filtered ) < < " , as reported by friend " < < from < < std : : endl ;
2015-06-06 13:50:11 +00:00
# endif
2015-06-01 22:03:07 +00:00
2015-09-23 21:45:15 -04:00
if ( ! sockaddr_storage_isExternalNet ( addr_filtered ) )
{
2015-06-06 13:50:11 +00:00
# ifdef PEER_DEBUG
2015-09-23 21:45:15 -04:00
std : : cerr < < " address is not an external address. Returning false " < < std : : endl ;
2015-06-06 13:50:11 +00:00
# endif
2015-09-23 21:45:15 -04:00
return false ;
}
// Update a list of own IPs:
// - remove old values for that same peer
// - remove values for non connected peers
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
mReportedOwnAddresses [ from ] = addr_filtered ;
for ( std : : map < RsPeerId , sockaddr_storage > : : iterator it ( mReportedOwnAddresses . begin ( ) ) ; it ! = mReportedOwnAddresses . end ( ) ; )
if ( ! mLinkMgr - > isOnline ( it - > first ) )
{
std : : map < RsPeerId , sockaddr_storage > : : iterator tmp ( it ) ;
+ + tmp ;
mReportedOwnAddresses . erase ( it ) ;
it = tmp ;
}
else
+ + it ;
sockaddr_storage current_best_ext_address_guess ;
uint32_t count ;
locked_computeCurrentBestOwnExtAddressCandidate ( current_best_ext_address_guess , count ) ;
std : : cerr < < " p3PeerMgr:: Current external address is calculated to be: " < < sockaddr_storage_iptostring ( current_best_ext_address_guess ) < < " (simultaneously reported by " < < count < < " peers). " < < std : : endl ;
2015-06-06 13:50:11 +00:00
}
2015-09-23 21:45:15 -04:00
// now current
2015-06-01 22:03:07 +00:00
sockaddr_storage own_addr ;
2015-06-06 13:50:11 +00:00
if ( ! mNetMgr - > getExtAddress ( own_addr ) )
2015-06-01 22:03:07 +00:00
{
2015-06-06 13:50:11 +00:00
# ifdef PEER_DEBUG
std : : cerr < < " cannot get current external address. Returning false " < < std : : endl ;
# endif
return false ;
}
# ifdef PEER_DEBUG
std : : cerr < < " current external address is known to be " < < sockaddr_storage_iptostring ( own_addr ) < < std : : endl ;
# endif
2015-06-11 21:12:20 +00:00
// Notify for every friend that has reported a wrong external address, except if that address is in the IP whitelist.
2015-06-06 13:50:11 +00:00
2015-06-11 21:12:20 +00:00
if ( ( ! rsBanList - > isAddressAccepted ( addr_filtered , RSBANLIST_CHECKING_FLAGS_WHITELIST ) ) & & ( ! sockaddr_storage_sameip ( own_addr , addr_filtered ) ) )
2015-06-06 13:50:11 +00:00
{
std : : cerr < < " Peer " < < from < < " reports a connexion address ( " < < sockaddr_storage_iptostring ( addr_filtered ) < < " ) that is not your current external address ( " < < sockaddr_storage_iptostring ( own_addr ) < < " ). This is weird. " < < std : : endl ;
2015-06-01 22:03:07 +00:00
2015-06-13 01:28:01 +00:00
RsServer : : notify ( ) - > AddFeedItem ( RS_FEED_ITEM_SEC_IP_WRONG_EXTERNAL_IP_REPORTED , from . toStdString ( ) , sockaddr_storage_iptostring ( own_addr ) , sockaddr_storage_iptostring ( addr ) ) ;
2015-06-01 22:03:07 +00:00
}
2015-09-23 21:45:15 -04:00
// we could also sweep over all connected friends and see if some report a different address.
2015-06-06 13:50:11 +00:00
2015-06-01 22:03:07 +00:00
return true ;
}
2015-06-06 13:50:11 +00:00
2015-09-23 21:45:15 -04:00
bool p3PeerMgrIMPL : : locked_computeCurrentBestOwnExtAddressCandidate ( sockaddr_storage & addr , uint32_t & count )
{
std : : map < sockaddr_storage , ZeroedInt > addr_counts ;
for ( std : : map < RsPeerId , sockaddr_storage > : : iterator it ( mReportedOwnAddresses . begin ( ) ) ; it ! = mReportedOwnAddresses . end ( ) ; + + it )
+ + addr_counts [ it - > second ] . n ;
# ifdef PEER_DEBUG
std : : cerr < < " Current ext addr statistics: " < < std : : endl ;
# endif
count = 0 ;
for ( std : : map < sockaddr_storage , ZeroedInt > : : const_iterator it ( addr_counts . begin ( ) ) ; it ! = addr_counts . end ( ) ; + + it )
{
2015-09-24 18:03:19 -04:00
if ( uint32_t ( it - > second . n ) > count )
2015-09-23 21:45:15 -04:00
{
addr = it - > first ;
count = it - > second . n ;
}
# ifdef PEER_DEBUG
std : : cerr < < sockaddr_storage_iptostring ( it - > first ) < < " : " < < it - > second . n < < std : : endl ;
# endif
}
return true ;
}
bool p3PeerMgrIMPL : : getExtAddressReportedByFriends ( sockaddr_storage & addr , uint8_t & isstable )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
uint32_t count ;
locked_computeCurrentBestOwnExtAddressCandidate ( addr , count ) ;
# ifdef PEER_DEBUG
std : : cerr < < " Estimation count = " < < count < < " . Trusted? = " < < ( count > = 2 ) < < std : : endl ;
# endif
return count > = 2 ; // 2 is not conservative enough. 3 should be probably better.
}
2015-06-03 20:28:16 +00:00
static bool cleanIpList ( std : : list < pqiIpAddress > & lst , const RsPeerId & pid , p3LinkMgr * link_mgr )
{
bool changed = false ;
time_t now = time ( NULL ) ;
for ( std : : list < pqiIpAddress > : : iterator it2 ( lst . begin ( ) ) ; it2 ! = lst . end ( ) ; )
{
# ifdef PEER_DEBUG
std : : cerr < < " Checking IP address " < < sockaddr_storage_iptostring ( ( * it2 ) . mAddr ) < < " for peer " < < pid < < " , age = " < < now - ( * it2 ) . mSeenTime < < std : : endl ;
2015-06-15 22:41:18 +00:00
# else
/* remove unused parameter warnings */
( void ) pid ;
2015-06-03 20:28:16 +00:00
# endif
if ( ! link_mgr - > checkPotentialAddr ( ( * it2 ) . mAddr , now - ( * it2 ) . mSeenTime ) )
{
# ifdef PEER_DEBUG
std : : cerr < < " (SS) Removing Banned/old IP address " < < sockaddr_storage_iptostring ( ( * it2 ) . mAddr ) < < " from peer " < < pid < < " , age = " < < now - ( * it2 ) . mSeenTime < < std : : endl ;
# endif
std : : list < pqiIpAddress > : : iterator ittmp = it2 ;
+ + ittmp ;
lst . erase ( it2 ) ;
it2 = ittmp ;
changed = true ;
}
else
+ + it2 ;
}
return changed ;
}
2015-06-01 22:03:07 +00:00
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : updateAddressList ( const RsPeerId & id , const pqiIpAddrSet & addrs )
2011-07-09 09:36:37 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setAddressList() called for id : " < < id < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
2015-06-03 20:28:16 +00:00
// first clean the list from potentially banned IPs.
pqiIpAddrSet clean_set = addrs ;
cleanIpList ( clean_set . mExt . mAddrs , id , mLinkMgr ) ;
cleanIpList ( clean_set . mLocal . mAddrs , id , mLinkMgr ) ;
2011-07-09 09:36:37 +00:00
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is our own ip */
if ( id = = getOwnId ( ) )
{
2015-06-03 20:28:16 +00:00
mOwnState . ipAddrs . updateAddrs ( clean_set ) ;
2011-07-09 09:36:37 +00:00
return true ;
}
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setLocalAddress() cannot add addres info : peer id not found in friend list. id: " < < id < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
return false ;
}
}
/* "it" points to peer */
2015-06-03 20:28:16 +00:00
it - > second . ipAddrs . updateAddrs ( clean_set ) ;
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setLocalAddress() Updated Address for: " < < id ;
2011-07-09 09:36:37 +00:00
std : : cerr < < std : : endl ;
2013-09-13 14:35:19 +00:00
std : : string addrstr ;
it - > second . ipAddrs . printAddrs ( addrstr ) ;
std : : cerr < < addrstr ;
2011-07-09 09:36:37 +00:00
std : : cerr < < std : : endl ;
# endif
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
return true ;
}
2011-07-09 18:39:34 +00:00
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : updateCurrentAddress ( const RsPeerId & id , const pqiIpAddress & addr )
2011-07-09 09:36:37 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::updateCurrentAddress() called for id : " < < id < < std : : endl ;
2011-07-09 18:39:34 +00:00
# endif
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* cannot be own id */
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 18:39:34 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
2011-07-09 09:36:37 +00:00
{
2011-07-09 18:39:34 +00:00
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
2011-07-09 09:36:37 +00:00
{
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::updateCurrentAddress() ERROR peer id not found: " < < id < < std : : endl ;
2011-07-09 18:39:34 +00:00
return false ;
2011-07-09 09:36:37 +00:00
}
2011-07-09 18:39:34 +00:00
}
2011-07-09 09:36:37 +00:00
2013-09-13 14:35:19 +00:00
if ( sockaddr_storage_isPrivateNet ( addr . mAddr ) )
2011-07-09 18:39:34 +00:00
{
it - > second . ipAddrs . updateLocalAddrs ( addr ) ;
it - > second . localaddr = addr . mAddr ;
}
else
{
it - > second . ipAddrs . updateExtAddrs ( addr ) ;
it - > second . serveraddr = addr . mAddr ;
}
2011-07-11 00:52:12 +00:00
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::updatedCurrentAddress() Updated Address for: " < < id ;
2011-07-09 18:39:34 +00:00
std : : cerr < < std : : endl ;
2013-09-13 14:35:19 +00:00
std : : string addrstr ;
it - > second . ipAddrs . printAddrs ( addrstr ) ;
std : : cerr < < addrstr ;
2011-07-09 18:39:34 +00:00
std : : cerr < < std : : endl ;
# endif
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
return true ;
2011-07-11 00:52:12 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : updateLastContact ( const RsPeerId & id )
2011-07-11 00:52:12 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::updateLastContact() called for id : " < < id < < std : : endl ;
2011-07-11 00:52:12 +00:00
# endif
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* cannot be own id */
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-11 00:52:12 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::updateLastContact() ERROR peer id not found: " < < id < < std : : endl ;
2011-07-11 00:52:12 +00:00
return false ;
}
2011-07-09 18:39:34 +00:00
}
2011-07-11 00:52:12 +00:00
it - > second . lastcontact = time ( NULL ) ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setNetworkMode ( const RsPeerId & id , uint32_t netMode )
2011-07-09 18:39:34 +00:00
{
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
2013-08-08 23:00:27 +00:00
return setOwnNetworkMode ( netMode ) ;
2011-07-09 09:36:37 +00:00
}
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
return false ;
}
}
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
/* "it" points to peer */
2013-08-08 23:00:27 +00:00
if ( it - > second . netMode ! = netMode )
{
it - > second . netMode = netMode ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
changed = true ;
}
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setLocation ( const RsPeerId & id , const std : : string & location )
2011-07-09 09:36:37 +00:00
{
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::setLocation() called for id : " < < id < < " ; with location " < < location < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
2013-08-08 23:00:27 +00:00
if ( mOwnState . location . compare ( location ) ! = 0 ) {
2011-07-09 09:36:37 +00:00
mOwnState . location = location ;
2013-08-08 23:00:27 +00:00
changed = true ;
}
return changed ;
2011-07-09 09:36:37 +00:00
}
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2013-08-08 23:00:27 +00:00
if ( mFriendList . end ( ) ! = ( it = mFriendList . find ( id ) ) ) {
if ( it - > second . location . compare ( location ) ! = 0 ) {
it - > second . location = location ;
changed = true ;
}
2011-07-09 09:36:37 +00:00
}
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : setVisState ( const RsPeerId & id , uint16_t vs_disc , uint16_t vs_dht )
2011-07-09 09:36:37 +00:00
{
2011-08-07 21:11:00 +00:00
{
2012-04-14 22:38:24 +00:00
std : : string out ;
2014-03-17 20:56:06 +00:00
rs_sprintf ( out , " p3PeerMgr::setVisState(%s, %u, %u) " , id . toStdString ( ) . c_str ( ) , vs_disc , vs_dht ) ;
2012-04-14 22:38:24 +00:00
rslog ( RSL_WARNING , p3peermgrzone , out ) ;
2011-08-07 21:11:00 +00:00
}
2011-07-09 09:36:37 +00:00
if ( id = = AuthSSL : : getAuthSSL ( ) - > OwnId ( ) )
{
2013-09-28 08:09:59 +00:00
return setOwnVisState ( vs_disc , vs_dht ) ;
2011-07-09 09:36:37 +00:00
}
bool isFriend = false ;
2013-08-08 23:00:27 +00:00
bool changed = false ;
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* check if it is a friend */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2011-07-09 09:36:37 +00:00
if ( mFriendList . end ( ) = = ( it = mFriendList . find ( id ) ) )
{
if ( mOthersList . end ( ) = = ( it = mOthersList . find ( id ) ) )
{
return false ;
}
}
else
{
isFriend = true ;
}
/* "it" points to peer */
2013-09-28 08:09:59 +00:00
if ( ( it - > second . vs_disc ! = vs_disc ) | | ( it - > second . vs_dht = vs_dht ) )
{
it - > second . vs_disc = vs_disc ;
it - > second . vs_dht = vs_dht ;
2013-08-08 23:00:27 +00:00
changed = true ;
2011-07-30 12:18:56 +00:00
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2013-09-28 08:09:59 +00:00
std : : cerr < < " p3PeerMgrIMPL::setVisState( " < < id < < " , DISC: " < < vs_disc < < " DHT: " < < vs_dht < < " ) " ;
2013-08-08 23:00:27 +00:00
std : : cerr < < " NAME: " < < it - > second . name ;
2011-07-30 12:18:56 +00:00
2013-09-28 08:09:59 +00:00
switch ( it - > second . vs_disc )
2013-08-08 23:00:27 +00:00
{
2013-09-28 08:09:59 +00:00
default :
case RS_VS_DISC_OFF :
std : : cerr < < " NO-DISC " ;
break ;
case RS_VS_DISC_MINIMAL :
std : : cerr < < " MIN-DISC " ;
break ;
case RS_VS_DISC_FULL :
std : : cerr < < " FULL-DISC " ;
break ;
2013-08-08 23:00:27 +00:00
}
2013-09-28 08:09:59 +00:00
switch ( it - > second . vs_dht )
2013-08-08 23:00:27 +00:00
{
2013-09-28 08:09:59 +00:00
default :
case RS_VS_DHT_OFF :
std : : cerr < < " NO-DHT " ;
break ;
case RS_VS_DHT_PASSIVE :
std : : cerr < < " PASSIVE-DHT " ;
break ;
case RS_VS_DHT_FULL :
std : : cerr < < " FULL-DHT " ;
break ;
2013-08-08 23:00:27 +00:00
}
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-08-08 23:00:27 +00:00
}
2011-07-09 09:36:37 +00:00
}
2013-08-08 23:00:27 +00:00
if ( isFriend & & changed )
2011-07-09 09:36:37 +00:00
{
2013-09-28 08:09:59 +00:00
mLinkMgr - > setFriendVisibility ( id , vs_dht ! = RS_VS_DHT_OFF ) ;
2011-07-09 09:36:37 +00:00
}
2013-08-08 23:00:27 +00:00
if ( changed ) {
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
2011-07-09 09:36:37 +00:00
2013-08-08 23:00:27 +00:00
return changed ;
2011-07-09 09:36:37 +00:00
}
/*******************************************************************/
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * p3Config functions * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
/* Key Functions to be overloaded for Full Configuration */
2011-07-13 14:22:25 +00:00
RsSerialiser * p3PeerMgrIMPL : : setupSerialiser ( )
2011-07-09 09:36:37 +00:00
{
RsSerialiser * rss = new RsSerialiser ( ) ;
rss - > addSerialType ( new RsPeerConfigSerialiser ( ) ) ;
rss - > addSerialType ( new RsGeneralConfigSerialiser ( ) ) ;
return rss ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : saveList ( bool & cleanup , std : : list < RsItem * > & saveData )
2011-07-09 09:36:37 +00:00
{
/* create a list of current peers */
cleanup = false ;
2011-07-09 18:39:34 +00:00
bool useExtAddrFinder = mNetMgr - > getIPServersEnabled ( ) ;
2011-07-09 09:36:37 +00:00
2015-09-07 18:46:19 +02:00
/* gather these information before mPeerMtx is locked! */
struct sockaddr_storage proxy_addr_tor , proxy_addr_i2p ;
getProxyServerAddress ( RS_HIDDEN_TYPE_TOR , proxy_addr_tor ) ;
getProxyServerAddress ( RS_HIDDEN_TYPE_I2P , proxy_addr_i2p ) ;
2011-07-09 09:36:37 +00:00
mPeerMtx . lock ( ) ; /****** MUTEX LOCKED *******/
RsPeerNetItem * item = new RsPeerNetItem ( ) ;
item - > clear ( ) ;
2014-04-01 08:00:20 +00:00
item - > peerId = getOwnId ( ) ;
item - > pgpId = mOwnState . gpg_id ;
2014-03-17 20:56:06 +00:00
item - > location = mOwnState . location ;
2014-04-01 08:00:20 +00:00
2011-07-30 12:18:56 +00:00
#if 0
2011-07-09 09:36:37 +00:00
if ( mOwnState . netMode & RS_NET_MODE_TRY_EXT )
{
item - > netMode = RS_NET_MODE_EXT ;
}
else if ( mOwnState . netMode & RS_NET_MODE_TRY_UPNP )
{
item - > netMode = RS_NET_MODE_UPNP ;
}
else
{
item - > netMode = RS_NET_MODE_UDP ;
}
2011-07-30 12:18:56 +00:00
# endif
item - > netMode = mOwnState . netMode ;
2011-07-09 09:36:37 +00:00
2013-09-28 08:09:59 +00:00
item - > vs_disc = mOwnState . vs_disc ;
item - > vs_dht = mOwnState . vs_dht ;
2011-07-09 09:36:37 +00:00
item - > lastContact = mOwnState . lastcontact ;
2013-09-28 08:09:59 +00:00
item - > localAddrV4 . addr = mOwnState . localaddr ;
item - > extAddrV4 . addr = mOwnState . serveraddr ;
sockaddr_storage_clear ( item - > localAddrV6 . addr ) ;
sockaddr_storage_clear ( item - > extAddrV6 . addr ) ;
2013-09-13 14:35:19 +00:00
item - > dyndns = mOwnState . dyndns ;
mOwnState . ipAddrs . mLocal . loadTlv ( item - > localAddrList ) ;
mOwnState . ipAddrs . mExt . loadTlv ( item - > extAddrList ) ;
2013-09-09 02:10:49 +00:00
item - > domain_addr = mOwnState . hiddenDomain ;
item - > domain_port = mOwnState . hiddenPort ;
2011-07-09 09:36:37 +00:00
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::saveList() Own Config Item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
item - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
saveData . push_back ( item ) ;
saveCleanupList . push_back ( item ) ;
/* iterate through all friends and save */
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-07-09 09:36:37 +00:00
{
item = new RsPeerNetItem ( ) ;
item - > clear ( ) ;
2014-04-01 08:00:20 +00:00
item - > peerId = it - > first ;
item - > pgpId = ( it - > second ) . gpg_id ;
2011-07-09 18:39:34 +00:00
item - > location = ( it - > second ) . location ;
item - > netMode = ( it - > second ) . netMode ;
2013-09-28 08:09:59 +00:00
item - > vs_disc = ( it - > second ) . vs_disc ;
item - > vs_dht = ( it - > second ) . vs_dht ;
2011-07-09 09:36:37 +00:00
item - > lastContact = ( it - > second ) . lastcontact ;
2013-09-28 08:09:59 +00:00
item - > localAddrV4 . addr = ( it - > second ) . localaddr ;
item - > extAddrV4 . addr = ( it - > second ) . serveraddr ;
sockaddr_storage_clear ( item - > localAddrV6 . addr ) ;
sockaddr_storage_clear ( item - > extAddrV6 . addr ) ;
2011-07-09 18:39:34 +00:00
item - > dyndns = ( it - > second ) . dyndns ;
( it - > second ) . ipAddrs . mLocal . loadTlv ( item - > localAddrList ) ;
( it - > second ) . ipAddrs . mExt . loadTlv ( item - > extAddrList ) ;
2011-07-09 09:36:37 +00:00
2013-09-03 13:35:39 +00:00
item - > domain_addr = ( it - > second ) . hiddenDomain ;
item - > domain_port = ( it - > second ) . hiddenPort ;
2011-07-09 09:36:37 +00:00
saveData . push_back ( item ) ;
saveCleanupList . push_back ( item ) ;
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::saveList() Peer Config Item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
item - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
}
2012-12-01 19:22:22 +00:00
RsPeerServicePermissionItem * sitem = new RsPeerServicePermissionItem ;
2014-03-17 20:56:06 +00:00
for ( std : : map < RsPgpId , ServicePermissionFlags > : : const_iterator it ( mFriendsPermissionFlags . begin ( ) ) ; it ! = mFriendsPermissionFlags . end ( ) ; + + it )
2012-12-01 19:22:22 +00:00
{
sitem - > pgp_ids . push_back ( it - > first ) ;
sitem - > service_flags . push_back ( it - > second ) ;
}
saveData . push_back ( sitem ) ;
saveCleanupList . push_back ( sitem ) ;
2011-07-09 09:36:37 +00:00
// Now save config for network digging strategies
RsConfigKeyValueSet * vitem = new RsConfigKeyValueSet ;
RsTlvKeyValue kv ;
2014-01-18 04:40:39 +00:00
kv . key = kConfigKeyExtIpFinder ;
2011-07-09 18:39:34 +00:00
kv . value = ( useExtAddrFinder ) ? " TRUE " : " FALSE " ;
2011-07-09 09:36:37 +00:00
vitem - > tlvkvs . pairs . push_back ( kv ) ;
2015-09-07 11:51:24 +02:00
// Store Proxy Server.
// Tor
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2015-09-07 18:46:19 +02:00
std : : cerr < < " Saving proxyServerAddress for Tor: " < < sockaddr_storage_tostring ( proxy_addr_tor ) ;
2014-01-18 04:40:39 +00:00
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2011-07-09 09:36:37 +00:00
2015-09-07 11:51:24 +02:00
kv . key = kConfigKeyProxyServerIpAddrTor ;
2015-09-07 18:46:19 +02:00
kv . value = sockaddr_storage_iptostring ( proxy_addr_tor ) ;
2014-01-18 04:40:39 +00:00
vitem - > tlvkvs . pairs . push_back ( kv ) ;
2011-07-09 09:36:37 +00:00
2015-09-07 11:51:24 +02:00
kv . key = kConfigKeyProxyServerPortTor ;
2015-09-07 18:46:19 +02:00
kv . value = sockaddr_storage_porttostring ( proxy_addr_tor ) ;
2015-09-07 11:51:24 +02:00
vitem - > tlvkvs . pairs . push_back ( kv ) ;
// I2P
# ifdef PEER_DEBUG
2015-09-14 14:56:14 +02:00
std : : cerr < < " Saving proxyServerAddress for I2P: " < < sockaddr_storage_tostring ( proxy_addr_i2p ) ;
2015-09-07 11:51:24 +02:00
std : : cerr < < std : : endl ;
# endif
kv . key = kConfigKeyProxyServerIpAddrI2P ;
2015-09-07 18:46:19 +02:00
kv . value = sockaddr_storage_iptostring ( proxy_addr_i2p ) ;
2015-09-07 11:51:24 +02:00
vitem - > tlvkvs . pairs . push_back ( kv ) ;
kv . key = kConfigKeyProxyServerPortI2P ;
2015-09-07 18:46:19 +02:00
kv . value = sockaddr_storage_porttostring ( proxy_addr_i2p ) ;
2014-01-18 04:40:39 +00:00
vitem - > tlvkvs . pairs . push_back ( kv ) ;
saveData . push_back ( vitem ) ;
saveCleanupList . push_back ( vitem ) ;
2011-07-09 09:36:37 +00:00
/* save groups */
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
saveData . push_back ( * groupIt ) ; // no delete
}
return true ;
}
2011-07-13 14:22:25 +00:00
void p3PeerMgrIMPL : : saveDone ( )
2011-07-09 09:36:37 +00:00
{
/* clean up the save List */
std : : list < RsItem * > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = saveCleanupList . begin ( ) ; it ! = saveCleanupList . end ( ) ; + + it )
2011-07-09 09:36:37 +00:00
{
delete ( * it ) ;
}
saveCleanupList . clear ( ) ;
/* unlock mutex */
mPeerMtx . unlock ( ) ; /****** MUTEX UNLOCKED *******/
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : loadList ( std : : list < RsItem * > & load )
2011-07-09 09:36:37 +00:00
{
2011-07-09 18:39:34 +00:00
// DEFAULTS.
bool useExtAddrFinder = true ;
2015-09-07 11:51:24 +02:00
std : : string proxyIpAddressTor = kConfigDefaultProxyServerIpAddr ;
2015-09-15 16:18:46 +02:00
uint16_t proxyPortTor = kConfigDefaultProxyServerPortTor ;
2015-09-07 11:51:24 +02:00
std : : string proxyIpAddressI2P = kConfigDefaultProxyServerIpAddr ;
2015-09-15 16:18:46 +02:00
uint16_t proxyPortI2P = kConfigDefaultProxyServerPortI2P ;
2014-01-18 04:40:39 +00:00
2014-10-21 22:33:02 +00:00
if ( load . empty ( ) ) {
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() list is empty, it may be a configuration problem. " < < std : : endl ;
2011-07-09 09:36:37 +00:00
return false ;
}
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() Item Count: " < < load . size ( ) < < std : : endl ;
2011-07-09 09:36:37 +00:00
# endif
2014-03-17 20:56:06 +00:00
RsPeerId ownId = getOwnId ( ) ;
2011-07-09 09:36:37 +00:00
/* load the list of peers */
std : : list < RsItem * > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = load . begin ( ) ; it ! = load . end ( ) ; + + it )
2011-07-09 09:36:37 +00:00
{
RsPeerNetItem * pitem = dynamic_cast < RsPeerNetItem * > ( * it ) ;
if ( pitem )
{
2014-04-01 08:00:20 +00:00
RsPeerId peer_id = pitem - > peerId ;
RsPgpId peer_pgp_id = pitem - > pgpId ;
2014-03-17 20:56:06 +00:00
if ( peer_id = = ownId )
2011-07-09 09:36:37 +00:00
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() Own Config Item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
pitem - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
/* add ownConfig */
2011-07-09 18:39:34 +00:00
setOwnNetworkMode ( pitem - > netMode ) ;
2015-05-25 14:02:45 +00:00
setOwnVisState ( pitem - > vs_disc , pitem - > vs_dht ) ;
2011-07-09 18:39:34 +00:00
mOwnState . gpg_id = AuthGPG : : getAuthGPG ( ) - > getGPGOwnId ( ) ;
mOwnState . location = AuthSSL : : getAuthSSL ( ) - > getOwnLocation ( ) ;
2011-07-09 09:36:37 +00:00
}
else
{
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() Peer Config Item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
pitem - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
2015-04-04 21:18:43 +00:00
/* ************* */
// permission flags is used as a mask for the existing perms, so we set it to 0xffff
addFriend ( peer_id , peer_pgp_id , pitem - > netMode , pitem - > vs_disc , pitem - > vs_dht , pitem - > lastContact , RS_NODE_PERM_ALL ) ;
2014-04-01 08:00:20 +00:00
setLocation ( pitem - > peerId , pitem - > location ) ;
2011-07-09 18:39:34 +00:00
}
2013-09-03 13:35:39 +00:00
if ( pitem - > netMode = = RS_NET_MODE_HIDDEN )
{
2014-01-18 05:05:35 +00:00
/* set only the hidden stuff & localAddress */
2014-03-17 20:56:06 +00:00
setLocalAddress ( peer_id , pitem - > localAddrV4 . addr ) ;
setHiddenDomainPort ( peer_id , pitem - > domain_addr , pitem - > domain_port ) ;
2013-09-03 13:35:39 +00:00
}
else
{
2014-03-17 20:56:06 +00:00
setLocalAddress ( peer_id , pitem - > localAddrV4 . addr ) ;
2015-05-25 14:02:45 +00:00
setExtAddress ( peer_id , pitem - > extAddrV4 . addr ) ;
2014-03-17 20:56:06 +00:00
setDynDNS ( peer_id , pitem - > dyndns ) ;
2013-09-03 13:35:39 +00:00
/* convert addresses */
pqiIpAddrSet addrs ;
addrs . mLocal . extractFromTlv ( pitem - > localAddrList ) ;
addrs . mExt . extractFromTlv ( pitem - > extAddrList ) ;
2011-07-09 18:39:34 +00:00
2014-03-17 20:56:06 +00:00
updateAddressList ( peer_id , addrs ) ;
2013-09-03 13:35:39 +00:00
}
2011-07-09 09:36:37 +00:00
delete ( * it ) ;
continue ;
}
RsConfigKeyValueSet * vitem = dynamic_cast < RsConfigKeyValueSet * > ( * it ) ;
if ( vitem )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() General Variable Config Item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
vitem - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
std : : list < RsTlvKeyValue > : : iterator kit ;
2014-10-24 22:07:26 +00:00
for ( kit = vitem - > tlvkvs . pairs . begin ( ) ; kit ! = vitem - > tlvkvs . pairs . end ( ) ; + + kit )
2014-01-18 04:40:39 +00:00
{
if ( kit - > key = = kConfigKeyExtIpFinder )
{
2011-07-09 18:39:34 +00:00
useExtAddrFinder = ( kit - > value = = " TRUE " ) ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2011-07-09 18:39:34 +00:00
std : : cerr < < " setting use_extr_addr_finder to " < < useExtAddrFinder < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2013-09-03 14:51:23 +00:00
}
2015-09-07 11:51:24 +02:00
// Tor
else if ( kit - > key = = kConfigKeyProxyServerIpAddrTor )
2014-01-18 04:40:39 +00:00
{
2015-09-07 11:51:24 +02:00
proxyIpAddressTor = kit - > value ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2015-09-07 18:46:19 +02:00
std : : cerr < < " Loaded proxyIpAddress for Tor: " < < proxyIpAddressTor ;
2014-01-18 04:40:39 +00:00
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2014-01-18 04:40:39 +00:00
}
2015-09-07 11:51:24 +02:00
else if ( kit - > key = = kConfigKeyProxyServerPortTor )
{
proxyPortTor = atoi ( kit - > value . c_str ( ) ) ;
# ifdef PEER_DEBUG
2015-09-07 18:46:19 +02:00
std : : cerr < < " Loaded proxyPort for Tor: " < < proxyPortTor ;
2015-09-07 11:51:24 +02:00
std : : cerr < < std : : endl ;
# endif
}
// I2p
else if ( kit - > key = = kConfigKeyProxyServerIpAddrI2P )
2014-01-18 04:40:39 +00:00
{
2015-09-07 11:51:24 +02:00
proxyIpAddressI2P = kit - > value ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2015-09-07 18:46:19 +02:00
std : : cerr < < " Loaded proxyIpAddress for I2P: " < < proxyIpAddressI2P ;
2015-09-07 11:51:24 +02:00
std : : cerr < < std : : endl ;
# endif
}
else if ( kit - > key = = kConfigKeyProxyServerPortI2P )
{
proxyPortI2P = atoi ( kit - > value . c_str ( ) ) ;
# ifdef PEER_DEBUG
2015-09-07 18:46:19 +02:00
std : : cerr < < " Loaded proxyPort for I2P: " < < proxyPortI2P ;
2014-01-18 04:40:39 +00:00
std : : cerr < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2011-07-09 09:36:37 +00:00
}
}
delete ( * it ) ;
continue ;
}
RsPeerGroupItem * gitem = dynamic_cast < RsPeerGroupItem * > ( * it ) ;
if ( gitem )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2011-07-11 12:11:58 +00:00
# ifdef PEER_DEBUG
2011-07-13 14:22:25 +00:00
std : : cerr < < " p3PeerMgrIMPL::loadList() Peer group item: " < < std : : endl ;
2011-07-09 09:36:37 +00:00
gitem - > print ( std : : cerr , 10 ) ;
std : : cerr < < std : : endl ;
# endif
groupList . push_back ( gitem ) ; // don't delete
if ( ( gitem - > flag & RS_GROUP_FLAG_STANDARD ) = = 0 ) {
/* calculate group id */
uint32_t groupId = atoi ( gitem - > id . c_str ( ) ) ;
if ( groupId > lastGroupId ) {
lastGroupId = groupId ;
}
}
continue ;
}
2012-12-01 19:22:22 +00:00
RsPeerServicePermissionItem * sitem = dynamic_cast < RsPeerServicePermissionItem * > ( * it ) ;
if ( sitem )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2012-12-01 19:22:22 +00:00
std : : cerr < < " Loaded service permission item: " < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2012-12-01 19:22:22 +00:00
for ( uint32_t i = 0 ; i < sitem - > pgp_ids . size ( ) ; + + i )
2013-04-05 21:11:27 +00:00
if ( AuthGPG : : getAuthGPG ( ) - > isGPGAccepted ( sitem - > pgp_ids [ i ] ) | | sitem - > pgp_ids [ i ] = = AuthGPG : : getAuthGPG ( ) - > getGPGOwnId ( ) )
2012-12-01 19:22:22 +00:00
{
mFriendsPermissionFlags [ sitem - > pgp_ids [ i ] ] = sitem - > service_flags [ i ] ;
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2012-12-01 19:22:22 +00:00
std : : cerr < < " " < < sitem - > pgp_ids [ i ] < < " - " < < sitem - > service_flags [ i ] < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2012-12-01 19:22:22 +00:00
}
2014-12-21 19:12:40 +00:00
# ifdef PEER_DEBUG
2012-12-01 19:22:22 +00:00
else
std : : cerr < < " " < < sitem - > pgp_ids [ i ] < < " - Not a friend! " < < std : : endl ;
2014-12-21 19:12:40 +00:00
# endif
2012-12-01 19:22:22 +00:00
}
2011-07-09 09:36:37 +00:00
delete ( * it ) ;
}
{
/* set missing groupIds */
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
/* Standard groups */
const int standardGroupCount = 5 ;
const char * standardGroup [ standardGroupCount ] = { RS_GROUP_ID_FRIENDS , RS_GROUP_ID_FAMILY , RS_GROUP_ID_COWORKERS , RS_GROUP_ID_OTHERS , RS_GROUP_ID_FAVORITES } ;
bool foundStandardGroup [ standardGroupCount ] = { false , false , false , false , false } ;
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
if ( ( * groupIt ) - > flag & RS_GROUP_FLAG_STANDARD ) {
int i ;
2014-10-24 22:07:26 +00:00
for ( i = 0 ; i < standardGroupCount ; + + i ) {
2011-07-09 09:36:37 +00:00
if ( ( * groupIt ) - > id = = standardGroup [ i ] ) {
foundStandardGroup [ i ] = true ;
break ;
}
}
if ( i > = standardGroupCount ) {
/* No more a standard group, remove the flag standard */
( * groupIt ) - > flag & = ~ RS_GROUP_FLAG_STANDARD ;
}
} else {
uint32_t groupId = atoi ( ( * groupIt ) - > id . c_str ( ) ) ;
if ( groupId = = 0 ) {
2012-04-14 22:38:24 +00:00
rs_sprintf ( ( * groupIt ) - > id , " %lu " , lastGroupId + + ) ;
2011-07-09 09:36:37 +00:00
}
}
}
/* Initialize standard groups */
2014-10-24 22:07:26 +00:00
for ( int i = 0 ; i < standardGroupCount ; + + i ) {
2011-07-09 09:36:37 +00:00
if ( foundStandardGroup [ i ] = = false ) {
RsPeerGroupItem * gitem = new RsPeerGroupItem ;
gitem - > id = standardGroup [ i ] ;
gitem - > name = standardGroup [ i ] ;
gitem - > flag | = RS_GROUP_FLAG_STANDARD ;
groupList . push_back ( gitem ) ;
}
}
}
2014-01-18 04:40:39 +00:00
// If we are hidden - don't want ExtAddrFinder - ever!
if ( isHidden ( ) )
{
useExtAddrFinder = false ;
}
2011-07-09 18:39:34 +00:00
mNetMgr - > setIPServersEnabled ( useExtAddrFinder ) ;
2014-01-18 04:40:39 +00:00
// Configure Proxy Server.
struct sockaddr_storage proxy_addr ;
2015-09-07 11:51:24 +02:00
// Tor
sockaddr_storage_clear ( proxy_addr ) ;
sockaddr_storage_ipv4_aton ( proxy_addr , proxyIpAddressTor . c_str ( ) ) ;
sockaddr_storage_ipv4_setport ( proxy_addr , proxyPortTor ) ;
if ( sockaddr_storage_isValidNet ( proxy_addr ) )
{
setProxyServerAddress ( RS_HIDDEN_TYPE_TOR , proxy_addr ) ;
}
// I2P
2014-01-18 04:40:39 +00:00
sockaddr_storage_clear ( proxy_addr ) ;
2015-09-07 11:51:24 +02:00
sockaddr_storage_ipv4_aton ( proxy_addr , proxyIpAddressI2P . c_str ( ) ) ;
sockaddr_storage_ipv4_setport ( proxy_addr , proxyPortI2P ) ;
2014-01-18 04:40:39 +00:00
if ( sockaddr_storage_isValidNet ( proxy_addr ) )
{
2015-09-07 11:51:24 +02:00
setProxyServerAddress ( RS_HIDDEN_TYPE_I2P , proxy_addr ) ;
2014-01-18 04:40:39 +00:00
}
2015-12-30 18:20:09 -05:00
load . clear ( ) ;
2011-07-09 09:36:37 +00:00
return true ;
}
2011-07-09 18:39:34 +00:00
#if 0
2011-07-09 09:36:37 +00:00
void printConnectState ( std : : ostream & out , peerState & peer )
{
out < < " Friend: " < < peer . name < < " Id: " < < peer . id < < " State: " < < peer . state ;
if ( peer . state & RS_PEER_S_FRIEND )
out < < " S:RS_PEER_S_FRIEND " ;
if ( peer . state & RS_PEER_S_ONLINE )
out < < " S:RS_PEER_S_ONLINE " ;
if ( peer . state & RS_PEER_S_CONNECTED )
out < < " S:RS_PEER_S_CONNECTED " ;
out < < " Actions: " < < peer . actions ;
if ( peer . actions & RS_PEER_NEW )
out < < " A:RS_PEER_NEW " ;
if ( peer . actions & RS_PEER_MOVED )
out < < " A:RS_PEER_MOVED " ;
if ( peer . actions & RS_PEER_CONNECTED )
out < < " A:RS_PEER_CONNECTED " ;
if ( peer . actions & RS_PEER_DISCONNECTED )
out < < " A:RS_PEER_DISCONNECTED " ;
if ( peer . actions & RS_PEER_CONNECT_REQ )
out < < " A:RS_PEER_CONNECT_REQ " ;
out < < std : : endl ;
return ;
}
2011-07-09 18:39:34 +00:00
# endif
2011-07-09 09:36:37 +00:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * Groups * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : addGroup ( RsGroupInfo & groupInfo )
2011-07-09 09:36:37 +00:00
{
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
RsPeerGroupItem * groupItem = new RsPeerGroupItem ;
groupItem - > set ( groupInfo ) ;
2012-04-14 22:38:24 +00:00
rs_sprintf ( groupItem - > id , " %lu " , + + lastGroupId ) ;
2011-07-09 09:36:37 +00:00
// remove standard flag
groupItem - > flag & = ~ RS_GROUP_FLAG_STANDARD ;
groupItem - > PeerId ( getOwnId ( ) ) ;
groupList . push_back ( groupItem ) ;
2012-11-24 14:48:31 +00:00
groupInfo . id = groupItem - > id ;
2011-07-09 09:36:37 +00:00
}
2014-01-07 22:51:22 +00:00
RsServer : : notify ( ) - > notifyListChange ( NOTIFY_LIST_GROUPLIST , NOTIFY_TYPE_ADD ) ;
2011-07-09 09:36:37 +00:00
IndicateConfigChanged ( ) ;
return true ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : editGroup ( const std : : string & groupId , RsGroupInfo & groupInfo )
2011-07-09 09:36:37 +00:00
{
if ( groupId . empty ( ) ) {
return false ;
}
bool changed = false ;
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
if ( ( * groupIt ) - > id = = groupId ) {
break ;
}
}
if ( groupIt ! = groupList . end ( ) ) {
if ( ( * groupIt ) - > flag & RS_GROUP_FLAG_STANDARD ) {
// can't edit standard groups
} else {
changed = true ;
( * groupIt ) - > set ( groupInfo ) ;
}
}
}
if ( changed ) {
2014-01-07 22:51:22 +00:00
RsServer : : notify ( ) - > notifyListChange ( NOTIFY_LIST_GROUPLIST , NOTIFY_TYPE_MOD ) ;
2011-07-09 09:36:37 +00:00
IndicateConfigChanged ( ) ;
}
return changed ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : removeGroup ( const std : : string & groupId )
2011-07-09 09:36:37 +00:00
{
if ( groupId . empty ( ) ) {
return false ;
}
bool changed = false ;
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
if ( ( * groupIt ) - > id = = groupId ) {
break ;
}
}
if ( groupIt ! = groupList . end ( ) ) {
if ( ( * groupIt ) - > flag & RS_GROUP_FLAG_STANDARD ) {
// can't remove standard groups
} else {
changed = true ;
delete ( * groupIt ) ;
groupList . erase ( groupIt ) ;
}
}
}
if ( changed ) {
2014-01-07 22:51:22 +00:00
RsServer : : notify ( ) - > notifyListChange ( NOTIFY_LIST_GROUPLIST , NOTIFY_TYPE_DEL ) ;
2011-07-09 09:36:37 +00:00
IndicateConfigChanged ( ) ;
}
return changed ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : getGroupInfo ( const std : : string & groupId , RsGroupInfo & groupInfo )
2011-07-09 09:36:37 +00:00
{
if ( groupId . empty ( ) ) {
return false ;
}
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
if ( ( * groupIt ) - > id = = groupId ) {
( * groupIt ) - > get ( groupInfo ) ;
return true ;
}
}
return false ;
}
2011-07-13 14:22:25 +00:00
bool p3PeerMgrIMPL : : getGroupInfoList ( std : : list < RsGroupInfo > & groupInfoList )
2011-07-09 09:36:37 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
RsGroupInfo groupInfo ;
( * groupIt ) - > get ( groupInfo ) ;
groupInfoList . push_back ( groupInfo ) ;
}
return true ;
}
// groupId == "" && assign == false -> remove from all groups
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : assignPeersToGroup ( const std : : string & groupId , const std : : list < RsPgpId > & peerIds , bool assign )
2011-07-09 09:36:37 +00:00
{
if ( groupId . empty ( ) & & assign = = true ) {
return false ;
}
if ( peerIds . empty ( ) ) {
return false ;
}
bool changed = false ;
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
std : : list < RsPeerGroupItem * > : : iterator groupIt ;
2014-10-24 22:07:26 +00:00
for ( groupIt = groupList . begin ( ) ; groupIt ! = groupList . end ( ) ; + + groupIt ) {
2011-07-09 09:36:37 +00:00
if ( groupId . empty ( ) | | ( * groupIt ) - > id = = groupId ) {
RsPeerGroupItem * groupItem = * groupIt ;
2014-03-17 20:56:06 +00:00
std : : list < RsPgpId > : : const_iterator peerIt ;
2014-10-24 22:07:26 +00:00
for ( peerIt = peerIds . begin ( ) ; peerIt ! = peerIds . end ( ) ; + + peerIt ) {
2015-04-17 21:36:22 +00:00
std : : set < RsPgpId > : : iterator peerIt1 = std : : find ( groupItem - > pgpList . ids . begin ( ) , groupItem - > pgpList . ids . end ( ) , * peerIt ) ;
2011-07-09 09:36:37 +00:00
if ( assign ) {
2014-04-01 08:00:20 +00:00
if ( peerIt1 = = groupItem - > pgpList . ids . end ( ) ) {
2015-04-17 21:36:22 +00:00
groupItem - > pgpList . ids . insert ( * peerIt ) ;
2011-07-09 09:36:37 +00:00
changed = true ;
}
} else {
2014-04-01 08:00:20 +00:00
if ( peerIt1 ! = groupItem - > pgpList . ids . end ( ) ) {
groupItem - > pgpList . ids . erase ( peerIt1 ) ;
2011-07-09 09:36:37 +00:00
changed = true ;
}
}
}
if ( groupId . empty ( ) = = false ) {
break ;
}
}
}
}
if ( changed ) {
2014-01-07 22:51:22 +00:00
RsServer : : notify ( ) - > notifyListChange ( NOTIFY_LIST_GROUPLIST , NOTIFY_TYPE_MOD ) ;
2011-07-09 09:36:37 +00:00
IndicateConfigChanged ( ) ;
}
return changed ;
}
2011-08-07 21:11:00 +00:00
2012-12-01 19:22:22 +00:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * Service permission stuff * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-03-17 20:56:06 +00:00
ServicePermissionFlags p3PeerMgrIMPL : : servicePermissionFlags ( const RsPeerId & ssl_id )
2012-12-01 19:22:22 +00:00
{
2014-03-17 20:56:06 +00:00
RsPgpId gpg_id ;
2013-04-03 22:50:50 +00:00
{
2012-12-01 19:22:22 +00:00
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : const_iterator it = mFriendList . find ( ssl_id ) ;
2012-12-01 19:22:22 +00:00
2013-04-03 22:50:50 +00:00
if ( it = = mFriendList . end ( ) )
2015-02-18 19:07:58 +00:00
return RS_NODE_PERM_DEFAULT ;
2013-04-03 22:50:50 +00:00
gpg_id = it - > second . gpg_id ;
}
return servicePermissionFlags ( gpg_id ) ;
2012-12-01 19:22:22 +00:00
}
2014-03-17 20:56:06 +00:00
ServicePermissionFlags p3PeerMgrIMPL : : servicePermissionFlags ( const RsPgpId & pgp_id )
2012-12-01 19:22:22 +00:00
{
2013-04-03 22:50:50 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2014-03-17 20:56:06 +00:00
std : : map < RsPgpId , ServicePermissionFlags > : : const_iterator it = mFriendsPermissionFlags . find ( pgp_id ) ;
2012-12-01 19:22:22 +00:00
if ( it = = mFriendsPermissionFlags . end ( ) )
2015-02-18 19:07:58 +00:00
return RS_NODE_PERM_DEFAULT ;
2012-12-01 19:22:22 +00:00
else
return it - > second ;
2013-04-03 22:50:50 +00:00
}
2012-12-01 19:22:22 +00:00
}
2014-03-17 20:56:06 +00:00
void p3PeerMgrIMPL : : setServicePermissionFlags ( const RsPgpId & pgp_id , const ServicePermissionFlags & flags )
2012-12-01 19:22:22 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
// Check that we have a PGP id. This should not be necessary, but because
// we use std::string, anything can get passed down here.
//
mFriendsPermissionFlags [ pgp_id ] = flags ;
IndicateConfigChanged ( ) ; /**** INDICATE MSG CONFIG CHANGED! *****/
}
2011-08-07 21:11:00 +00:00
/**********************************************************************
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * Stuff moved from p3peers * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : removeAllFriendLocations ( const RsPgpId & gpgid )
2011-08-07 21:11:00 +00:00
{
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > sslIds ;
2011-08-07 21:11:00 +00:00
if ( ! getAssociatedPeers ( gpgid , sslIds ) )
{
return false ;
}
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = sslIds . begin ( ) ; it ! = sslIds . end ( ) ; + + it )
2011-08-07 21:11:00 +00:00
{
2013-04-16 20:10:31 +00:00
removeFriend ( * it , true ) ;
2011-08-07 21:11:00 +00:00
}
return true ;
}
2014-03-17 20:56:06 +00:00
bool p3PeerMgrIMPL : : getAssociatedPeers ( const RsPgpId & gpg_id , std : : list < RsPeerId > & ids )
2011-08-07 21:11:00 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-05-25 16:30:04 +00:00
# ifdef PEER_DEBUG
2011-08-07 21:11:00 +00:00
std : : cerr < < " p3PeerMgr::getAssociatedPeers() for id : " < < gpg_id < < std : : endl ;
# endif
int count = 0 ;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-08-07 21:11:00 +00:00
{
if ( it - > second . gpg_id = = gpg_id )
{
count + + ;
ids . push_back ( it - > first ) ;
2015-05-25 16:30:04 +00:00
# ifdef PEER_DEBUG
2011-08-07 21:11:00 +00:00
std : : cerr < < " p3PeerMgr::getAssociatedPeers() found ssl id : " < < it - > first < < std : : endl ;
# endif
}
}
return ( count > 0 ) ;
}
2015-05-25 14:02:45 +00:00
// goes through the list of known friend IPs and remove the ones that are banned by p3LinkMgr.
bool p3PeerMgrIMPL : : removeBannedIps ( )
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-06-03 20:28:16 +00:00
std : : cerr < < " Cleaning known IPs for all peers. " < < std : : endl ;
2015-05-25 14:02:45 +00:00
bool changed = false ;
for ( std : : map < RsPeerId , peerState > : : iterator it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
{
2015-05-25 16:30:04 +00:00
if ( cleanIpList ( it - > second . ipAddrs . mExt . mAddrs , it - > first , mLinkMgr ) ) changed = true ;
if ( cleanIpList ( it - > second . ipAddrs . mLocal . mAddrs , it - > first , mLinkMgr ) ) changed = true ;
2015-06-03 20:28:16 +00:00
if ( ! rsBanList - > isAddressAccepted ( it - > second . serveraddr , RSBANLIST_CHECKING_FLAGS_BLACKLIST ) )
{
sockaddr_storage_clear ( it - > second . serveraddr ) ;
std : : cerr < < " (SS) Peer " < < it - > first < < " has a banned server address. Wiping it out. " < < std : : endl ;
}
2015-05-25 14:02:45 +00:00
}
2015-05-25 16:30:04 +00:00
if ( cleanIpList ( mOwnState . ipAddrs . mExt . mAddrs , mOwnState . id , mLinkMgr ) ) changed = true ;
if ( cleanIpList ( mOwnState . ipAddrs . mLocal . mAddrs , mOwnState . id , mLinkMgr ) ) changed = true ;
2015-05-25 14:02:45 +00:00
if ( changed )
IndicateConfigChanged ( ) ;
return true ;
}
2011-08-07 21:11:00 +00:00
2014-03-17 20:56:06 +00:00
// /* This only removes SSL certs, that are old... Can end up with no Certs per GPG Id
// * We are removing the concept of a "DummyId" - There is no need for it.
// */
//
// bool isDummyFriend(RsPeerId id)
// {
// bool ret = (id.substr(0,5) == "dummy");
// return ret;
// }
2011-08-07 21:11:00 +00:00
bool p3PeerMgrIMPL : : removeUnusedLocations ( )
{
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > toRemove ;
2011-08-07 21:11:00 +00:00
{
RsStackMutex stack ( mPeerMtx ) ; /****** STACK LOCK MUTEX *******/
2015-05-25 16:30:04 +00:00
# ifdef PEER_DEBUG
2011-08-07 21:11:00 +00:00
std : : cerr < < " p3PeerMgr::removeUnusedLocations() " < < std : : endl ;
# endif
time_t now = time ( NULL ) ;
2014-03-17 20:56:06 +00:00
std : : map < RsPeerId , peerState > : : iterator it ;
2014-10-24 22:07:26 +00:00
for ( it = mFriendList . begin ( ) ; it ! = mFriendList . end ( ) ; + + it )
2011-08-07 21:11:00 +00:00
{
if ( now - it - > second . lastcontact > VERY_OLD_PEER )
{
toRemove . push_back ( it - > first ) ;
2015-05-25 16:30:04 +00:00
# ifdef PEER_DEBUG
2015-05-25 14:02:45 +00:00
std : : cerr < < " p3PeerMgr::removeUnusedLocations() removing Old SSL Id: " < < it - > first < < std : : endl ;
2011-08-07 21:11:00 +00:00
# endif
}
2014-03-17 20:56:06 +00:00
// if (isDummyFriend(it->first))
// {
// toRemove.push_back(it->first);
//
2015-05-25 16:30:04 +00:00
//#ifdef PEER_DEBUG
2014-03-17 20:56:06 +00:00
// std::cerr << "p3PeerMgr::removeUnusedLocations() removing Dummy Id: " << it->first << std::endl;
//#endif
//
// }
2011-08-07 21:11:00 +00:00
}
}
2014-03-17 20:56:06 +00:00
std : : list < RsPeerId > : : iterator it ;
2011-08-07 21:11:00 +00:00
2014-10-24 22:07:26 +00:00
for ( it = toRemove . begin ( ) ; it ! = toRemove . end ( ) ; + + it )
2011-08-07 21:11:00 +00:00
{
2013-04-16 20:10:31 +00:00
removeFriend ( * it , false ) ;
2011-08-07 21:11:00 +00:00
}
2011-08-08 11:27:40 +00:00
return true ;
2011-08-07 21:11:00 +00:00
}