@ -488,8 +488,8 @@ namespace client
{
{
localDestination = m_SharedLocalDestination ;
localDestination = m_SharedLocalDestination ;
}
}
auto clientTunnel = new I2PUDPClientTunnel ( name , dest , end , localDestination , destinationPort ) ;
auto clientTunnel = std : : make_shared < I2PUDPClientTunnel > ( name , dest , end , localDestination , destinationPort ) ;
if ( m_ClientForwards . insert ( std : : make_pair ( end , std : : unique_ptr < I2PUDPClientTunnel > ( clientTunnel ) ) ) . second )
if ( m_ClientForwards . insert ( std : : make_pair ( end , clientTunnel ) ) . second )
{
{
clientTunnel - > Start ( ) ;
clientTunnel - > Start ( ) ;
}
}
@ -498,31 +498,35 @@ namespace client
} else {
} else {
boost : : asio : : ip : : tcp : : endpoint clientEndpoint ;
boost : : asio : : ip : : tcp : : endpoint clientEndpoint ;
I2PService * clientTunnel = nullptr ;
std : : shared_ptr < I2PService > clientTunnel ;
if ( type = = I2P_TUNNELS_SECTION_TYPE_SOCKS )
if ( type = = I2P_TUNNELS_SECTION_TYPE_SOCKS )
{
{
// socks proxy
// socks proxy
clientTunnel = new i2p : : proxy : : SOCKSProxy ( name , address , port , false , " " , destinationPort , localDestination ) ;
auto tun = std : : make_shared < i2p : : proxy : : SOCKSProxy > ( name , address , port , false , " " , destinationPort , localDestination ) ;
clientEndpoint = ( ( i2p : : proxy : : SOCKSProxy * ) clientTunnel ) - > GetLocalEndpoint ( ) ;
clientTunnel = tun ;
clientEndpoint = tun - > GetLocalEndpoint ( ) ;
}
}
else if ( type = = I2P_TUNNELS_SECTION_TYPE_HTTPPROXY )
else if ( type = = I2P_TUNNELS_SECTION_TYPE_HTTPPROXY )
{
{
// http proxy
// http proxy
std : : string outproxy = section . second . get ( " outproxy " , " " ) ;
std : : string outproxy = section . second . get ( " outproxy " , " " ) ;
clientTunnel = new i2p : : proxy : : HTTPProxy ( name , address , port , outproxy , localDestination ) ;
auto tun = std : : make_shared < i2p : : proxy : : HTTPProxy > ( name , address , port , outproxy , localDestination ) ;
clientEndpoint = ( ( i2p : : proxy : : HTTPProxy * ) clientTunnel ) - > GetLocalEndpoint ( ) ;
clientTunnel = tun ;
clientEndpoint = tun - > GetLocalEndpoint ( ) ;
}
}
else if ( type = = I2P_TUNNELS_SECTION_TYPE_WEBSOCKS )
else if ( type = = I2P_TUNNELS_SECTION_TYPE_WEBSOCKS )
{
{
// websocks proxy
// websocks proxy
clientTunnel = new WebSocks ( address , port , localDestination ) ; ;
auto tun = std : : make_shared < WebSocks > ( address , port , localDestination ) ;
clientEndpoint = ( ( WebSocks * ) clientTunnel ) - > GetLocalEndpoint ( ) ;
clientTunnel = tun ;
clientEndpoint = tun - > GetLocalEndpoint ( ) ;
}
}
else
else
{
{
// tcp client
// tcp client
clientTunnel = new I2PClientTunnel ( name , dest , address , port , localDestination , destinationPort ) ;
auto tun = std : : make_shared < I2PClientTunnel > ( name , dest , address , port , localDestination , destinationPort ) ;
clientEndpoint = ( ( I2PClientTunnel * ) clientTunnel ) - > GetLocalEndpoint ( ) ;
clientTunnel = tun ;
clientEndpoint = tun - > GetLocalEndpoint ( ) ;
}
}
uint32_t timeout = section . second . get < uint32_t > ( I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT , 0 ) ;
uint32_t timeout = section . second . get < uint32_t > ( I2P_CLIENT_TUNNEL_CONNECT_TIMEOUT , 0 ) ;
if ( timeout )
if ( timeout )
@ -531,8 +535,7 @@ namespace client
LogPrint ( eLogInfo , " Clients: I2P Client tunnel connect timeout set to " , timeout ) ;
LogPrint ( eLogInfo , " Clients: I2P Client tunnel connect timeout set to " , timeout ) ;
}
}
auto clientTunnelDest = clientTunnel - > GetLocalDestination ( ) ; // make copy of destination for possible update
auto ins = m_ClientTunnels . insert ( std : : make_pair ( clientEndpoint , clientTunnel ) ) ;
auto ins = m_ClientTunnels . insert ( std : : make_pair ( clientEndpoint , std : : unique_ptr < I2PService > ( clientTunnel ) ) ) ;
if ( ins . second )
if ( ins . second )
{
{
clientTunnel - > Start ( ) ;
clientTunnel - > Start ( ) ;
@ -541,10 +544,10 @@ namespace client
else
else
{
{
// TODO: update
// TODO: update
if ( ins . first - > second - > GetLocalDestination ( ) ! = clientTunnelDest )
if ( ins . first - > second - > GetLocalDestination ( ) ! = clientTunnel - > GetLocal Destination ( ) )
{
{
LogPrint ( eLogInfo , " Clients: I2P client tunnel destination updated " ) ;
LogPrint ( eLogInfo , " Clients: I2P client tunnel destination updated " ) ;
ins . first - > second - > SetLocalDestination ( clientTunnelDest ) ;
ins . first - > second - > SetLocalDestination ( clientTunnel - > GetLocal Destination ( ) ) ;
}
}
ins . first - > second - > isUpdated = true ;
ins . first - > second - > isUpdated = true ;
LogPrint ( eLogInfo , " Clients: I2P client tunnel for endpoint " , clientEndpoint , " already exists " ) ;
LogPrint ( eLogInfo , " Clients: I2P client tunnel for endpoint " , clientEndpoint , " already exists " ) ;
@ -589,7 +592,7 @@ namespace client
// TODO: hostnames
// TODO: hostnames
auto localAddress = boost : : asio : : ip : : address : : from_string ( address ) ;
auto localAddress = boost : : asio : : ip : : address : : from_string ( address ) ;
boost : : asio : : ip : : udp : : endpoint endpoint ( boost : : asio : : ip : : address : : from_string ( host ) , port ) ;
boost : : asio : : ip : : udp : : endpoint endpoint ( boost : : asio : : ip : : address : : from_string ( host ) , port ) ;
I2PUDPServerTunnel * serverTunnel = new I2PUDPServerTunnel ( name , localDestination , localAddress , endpoint , port ) ;
auto serverTunnel = std : : make_shared < I2PUDPServerTunnel > ( name , localDestination , localAddress , endpoint , port ) ;
if ( ! isUniqueLocal )
if ( ! isUniqueLocal )
{
{
LogPrint ( eLogInfo , " Clients: disabling loopback address mapping " ) ;
LogPrint ( eLogInfo , " Clients: disabling loopback address mapping " ) ;
@ -600,7 +603,7 @@ namespace client
std : : make_pair (
std : : make_pair (
std : : make_pair (
std : : make_pair (
localDestination - > GetIdentHash ( ) , port ) ,
localDestination - > GetIdentHash ( ) , port ) ,
std : : unique_ptr < I2PUDPS erverTunnel > ( serverTunnel ) ) ) . second )
serverTunnel ) ) . second )
{
{
serverTunnel - > Start ( ) ;
serverTunnel - > Start ( ) ;
LogPrint ( eLogInfo , " Clients: I2P Server Forward created for UDP Endpoint " , host , " : " , port , " bound on " , address , " for " , localDestination - > GetIdentHash ( ) . ToBase32 ( ) ) ;
LogPrint ( eLogInfo , " Clients: I2P Server Forward created for UDP Endpoint " , host , " : " , port , " bound on " , address , " for " , localDestination - > GetIdentHash ( ) . ToBase32 ( ) ) ;
@ -611,13 +614,13 @@ namespace client
continue ;
continue ;
}
}
I2PServerTunnel * serverTunnel ;
std : : shared_ptr < I2PServerTunnel > serverTunnel ;
if ( type = = I2P_TUNNELS_SECTION_TYPE_HTTP )
if ( type = = I2P_TUNNELS_SECTION_TYPE_HTTP )
serverTunnel = new I2PServerTunnelHTTP ( name , host , port , localDestination , hostOverride , inPort , gzip ) ;
serverTunnel = std : : make_shared < I2PServerTunnelHTTP > ( name , host , port , localDestination , hostOverride , inPort , gzip ) ;
else if ( type = = I2P_TUNNELS_SECTION_TYPE_IRC )
else if ( type = = I2P_TUNNELS_SECTION_TYPE_IRC )
serverTunnel = new I2PServerTunnelIRC ( name , host , port , localDestination , webircpass , inPort , gzip ) ;
serverTunnel = std : : make_shared < I2PServerTunnelIRC > ( name , host , port , localDestination , webircpass , inPort , gzip ) ;
else // regular server tunnel by default
else // regular server tunnel by default
serverTunnel = new I2PServerTunnel ( name , host , port , localDestination , inPort , gzip ) ;
serverTunnel = std : : make_shared < I2PServerTunnel > ( name , host , port , localDestination , inPort , gzip ) ;
if ( ! isUniqueLocal )
if ( ! isUniqueLocal )
{
{
@ -640,10 +643,9 @@ namespace client
while ( comma ! = std : : string : : npos ) ;
while ( comma ! = std : : string : : npos ) ;
serverTunnel - > SetAccessList ( idents ) ;
serverTunnel - > SetAccessList ( idents ) ;
}
}
auto serverTunnelDest = serverTunnel - > GetLocalDestination ( ) ;
auto ins = m_ServerTunnels . insert ( std : : make_pair (
auto ins = m_ServerTunnels . insert ( std : : make_pair (
std : : make_pair ( localDestination - > GetIdentHash ( ) , inPort ) ,
std : : make_pair ( localDestination - > GetIdentHash ( ) , inPort ) ,
std : : unique_ptr < I2PServerTunnel > ( serverTunnel ) ) ) ;
serverTunnel ) ) ;
if ( ins . second )
if ( ins . second )
{
{
serverTunnel - > Start ( ) ;
serverTunnel - > Start ( ) ;
@ -652,10 +654,10 @@ namespace client
else
else
{
{
// TODO: update
// TODO: update
if ( ins . first - > second - > GetLocalDestination ( ) ! = serverTunnelDest )
if ( ins . first - > second - > GetLocalDestination ( ) ! = serverTunnel - > GetLocal Destination ( ) )
{
{
LogPrint ( eLogInfo , " Clients: I2P server tunnel destination updated " ) ;
LogPrint ( eLogInfo , " Clients: I2P server tunnel destination updated " ) ;
ins . first - > second - > SetLocalDestination ( serverTunnelDest ) ;
ins . first - > second - > SetLocalDestination ( serverTunnel - > GetLocal Destination ( ) ) ;
}
}
ins . first - > second - > isUpdated = true ;
ins . first - > second - > isUpdated = true ;
LogPrint ( eLogInfo , " Clients: I2P server tunnel for destination/port " , m_AddressBook . ToAddress ( localDestination - > GetIdentHash ( ) ) , " / " , inPort , " already exists " ) ;
LogPrint ( eLogInfo , " Clients: I2P server tunnel for destination/port " , m_AddressBook . ToAddress ( localDestination - > GetIdentHash ( ) ) , " / " , inPort , " already exists " ) ;