mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-03-10 19:38:28 +01:00
move BOB incoming connection logic from I2PTunnelConnection to BOB
Some checks failed
Build Debian packages / bookworm (push) Has been cancelled
Build Debian packages / bullseye (push) Has been cancelled
Build Debian packages / buster (push) Has been cancelled
Build on FreeBSD / with UPnP (push) Has been cancelled
Build on OSX / With USE_UPNP=no (push) Has been cancelled
Build on OSX / With USE_UPNP=yes (push) Has been cancelled
Build on Windows / clang-x86_64 (push) Has been cancelled
Build on Windows / i686 (push) Has been cancelled
Build on Windows / ucrt-x86_64 (push) Has been cancelled
Build on Windows / x86_64 (push) Has been cancelled
Build on Windows / CMake clang-x86_64 (push) Has been cancelled
Build on Windows / CMake i686 (push) Has been cancelled
Build on Windows / CMake ucrt-x86_64 (push) Has been cancelled
Build on Windows / CMake x86_64 (push) Has been cancelled
Build on Windows / XP (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=no (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=yes (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=OFF (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=ON (push) Has been cancelled
Build containers / Building container for linux/amd64 (push) Has been cancelled
Build containers / Building container for linux/arm64 (push) Has been cancelled
Build containers / Building container for linux/arm/v7 (push) Has been cancelled
Build containers / Building container for linux/386 (push) Has been cancelled
Build containers / Pushing merged manifest (push) Has been cancelled
Some checks failed
Build Debian packages / bookworm (push) Has been cancelled
Build Debian packages / bullseye (push) Has been cancelled
Build Debian packages / buster (push) Has been cancelled
Build on FreeBSD / with UPnP (push) Has been cancelled
Build on OSX / With USE_UPNP=no (push) Has been cancelled
Build on OSX / With USE_UPNP=yes (push) Has been cancelled
Build on Windows / clang-x86_64 (push) Has been cancelled
Build on Windows / i686 (push) Has been cancelled
Build on Windows / ucrt-x86_64 (push) Has been cancelled
Build on Windows / x86_64 (push) Has been cancelled
Build on Windows / CMake clang-x86_64 (push) Has been cancelled
Build on Windows / CMake i686 (push) Has been cancelled
Build on Windows / CMake ucrt-x86_64 (push) Has been cancelled
Build on Windows / CMake x86_64 (push) Has been cancelled
Build on Windows / XP (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=no (push) Has been cancelled
Build on Ubuntu / Make with USE_UPNP=yes (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=OFF (push) Has been cancelled
Build on Ubuntu / CMake with -DWITH_UPNP=ON (push) Has been cancelled
Build containers / Building container for linux/amd64 (push) Has been cancelled
Build containers / Building container for linux/arm64 (push) Has been cancelled
Build containers / Building container for linux/arm/v7 (push) Has been cancelled
Build containers / Building container for linux/386 (push) Has been cancelled
Build containers / Pushing merged manifest (push) Has been cancelled
This commit is contained in:
parent
539e7e988e
commit
5f762845f0
4 changed files with 58 additions and 35 deletions
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2024, The PurpleI2P Project
|
* Copyright (c) 2013-2025, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
|
@ -16,6 +16,24 @@ namespace i2p
|
||||||
{
|
{
|
||||||
namespace client
|
namespace client
|
||||||
{
|
{
|
||||||
|
void BOBI2PTunnelIncomingConnection::Established ()
|
||||||
|
{
|
||||||
|
if (m_IsQuiet)
|
||||||
|
StreamReceive ();
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// send destination first like received from I2P
|
||||||
|
std::string dest = GetStream ()->GetRemoteIdentity ()->ToBase64 ();
|
||||||
|
dest += "\n";
|
||||||
|
if (dest.size() <= I2P_TUNNEL_CONNECTION_BUFFER_SIZE)
|
||||||
|
memcpy (GetStreamBuffer (), dest.c_str (), dest.size ());
|
||||||
|
else
|
||||||
|
memset (GetStreamBuffer (), 0, I2P_TUNNEL_CONNECTION_BUFFER_SIZE);
|
||||||
|
HandleStreamReceive (boost::system::error_code (), dest.size ());
|
||||||
|
}
|
||||||
|
Receive ();
|
||||||
|
}
|
||||||
|
|
||||||
BOBI2PInboundTunnel::BOBI2PInboundTunnel (const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<ClientDestination> localDestination):
|
BOBI2PInboundTunnel::BOBI2PInboundTunnel (const boost::asio::ip::tcp::endpoint& ep, std::shared_ptr<ClientDestination> localDestination):
|
||||||
BOBI2PTunnel (localDestination), m_Acceptor (localDestination->GetService (), ep)
|
BOBI2PTunnel (localDestination), m_Acceptor (localDestination->GetService (), ep)
|
||||||
{
|
{
|
||||||
|
@ -156,7 +174,7 @@ namespace client
|
||||||
{
|
{
|
||||||
if (stream)
|
if (stream)
|
||||||
{
|
{
|
||||||
auto conn = std::make_shared<I2PTunnelConnection> (this, stream, m_Endpoint, m_IsQuiet);
|
auto conn = std::make_shared<BOBI2PTunnelIncomingConnection> (this, stream, m_Endpoint, m_IsQuiet);
|
||||||
AddHandler (conn);
|
AddHandler (conn);
|
||||||
conn->Connect ();
|
conn->Connect ();
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2024, The PurpleI2P Project
|
* Copyright (c) 2013-2025, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
|
@ -71,6 +71,23 @@ namespace client
|
||||||
const char BOB_HELP_STATUS[] = "status <NICKNAME> - Display status of a nicknamed tunnel.";
|
const char BOB_HELP_STATUS[] = "status <NICKNAME> - Display status of a nicknamed tunnel.";
|
||||||
const char BOB_HELP_HELP [] = "help <COMMAND> - Get help on a command.";
|
const char BOB_HELP_HELP [] = "help <COMMAND> - Get help on a command.";
|
||||||
|
|
||||||
|
class BOBI2PTunnelIncomingConnection: public I2PTunnelConnection
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
|
||||||
|
BOBI2PTunnelIncomingConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
||||||
|
const boost::asio::ip::tcp::endpoint& target, bool quiet):
|
||||||
|
I2PTunnelConnection (owner, stream, target), m_IsQuiet (quiet) {};
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
void Established () override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
bool m_IsQuiet; // don't send destination
|
||||||
|
};
|
||||||
|
|
||||||
class BOBI2PTunnel: public I2PService
|
class BOBI2PTunnel: public I2PService
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright (c) 2013-2024, The PurpleI2P Project
|
* Copyright (c) 2013-2025, The PurpleI2P Project
|
||||||
*
|
*
|
||||||
* This file is part of Purple i2pd project and licensed under BSD3
|
* This file is part of Purple i2pd project and licensed under BSD3
|
||||||
*
|
*
|
||||||
|
@ -32,8 +32,7 @@ namespace client
|
||||||
|
|
||||||
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
|
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
|
||||||
std::shared_ptr<const i2p::data::LeaseSet> leaseSet, uint16_t port):
|
std::shared_ptr<const i2p::data::LeaseSet> leaseSet, uint16_t port):
|
||||||
I2PServiceHandler(owner), m_Socket (socket), m_RemoteEndpoint (socket->remote_endpoint ()),
|
I2PServiceHandler(owner), m_Socket (socket), m_RemoteEndpoint (socket->remote_endpoint ())
|
||||||
m_IsQuiet (true)
|
|
||||||
{
|
{
|
||||||
m_Stream = GetOwner()->GetLocalDestination ()->CreateStream (leaseSet, port);
|
m_Stream = GetOwner()->GetLocalDestination ()->CreateStream (leaseSet, port);
|
||||||
}
|
}
|
||||||
|
@ -41,14 +40,13 @@ namespace client
|
||||||
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner,
|
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner,
|
||||||
std::shared_ptr<boost::asio::ip::tcp::socket> socket, std::shared_ptr<i2p::stream::Stream> stream):
|
std::shared_ptr<boost::asio::ip::tcp::socket> socket, std::shared_ptr<i2p::stream::Stream> stream):
|
||||||
I2PServiceHandler(owner), m_Socket (socket), m_Stream (stream),
|
I2PServiceHandler(owner), m_Socket (socket), m_Stream (stream),
|
||||||
m_RemoteEndpoint (socket->remote_endpoint ()), m_IsQuiet (true)
|
m_RemoteEndpoint (socket->remote_endpoint ())
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
I2PTunnelConnection::I2PTunnelConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
||||||
const boost::asio::ip::tcp::endpoint& target, bool quiet,
|
const boost::asio::ip::tcp::endpoint& target,std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
||||||
std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
I2PServiceHandler(owner), m_Stream (stream), m_RemoteEndpoint (target)
|
||||||
I2PServiceHandler(owner), m_Stream (stream), m_RemoteEndpoint (target), m_IsQuiet (quiet)
|
|
||||||
{
|
{
|
||||||
m_Socket = std::make_shared<boost::asio::ip::tcp::socket> (owner->GetService ());
|
m_Socket = std::make_shared<boost::asio::ip::tcp::socket> (owner->GetService ());
|
||||||
if (sslCtx)
|
if (sslCtx)
|
||||||
|
@ -292,18 +290,7 @@ namespace client
|
||||||
|
|
||||||
void I2PTunnelConnection::Established ()
|
void I2PTunnelConnection::Established ()
|
||||||
{
|
{
|
||||||
if (m_IsQuiet)
|
StreamReceive ();
|
||||||
StreamReceive ();
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// send destination first like received from I2P
|
|
||||||
std::string dest = m_Stream->GetRemoteIdentity ()->ToBase64 ();
|
|
||||||
dest += "\n";
|
|
||||||
if(sizeof(m_StreamBuffer) >= dest.size()) {
|
|
||||||
memcpy (m_StreamBuffer, dest.c_str (), dest.size ());
|
|
||||||
}
|
|
||||||
HandleStreamReceive (boost::system::error_code (), dest.size ());
|
|
||||||
}
|
|
||||||
Receive ();
|
Receive ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -377,7 +364,7 @@ namespace client
|
||||||
I2PServerTunnelConnectionHTTP::I2PServerTunnelConnectionHTTP (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
I2PServerTunnelConnectionHTTP::I2PServerTunnelConnectionHTTP (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
||||||
const boost::asio::ip::tcp::endpoint& target, const std::string& host, const std::string& XI2P,
|
const boost::asio::ip::tcp::endpoint& target, const std::string& host, const std::string& XI2P,
|
||||||
std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
||||||
I2PTunnelConnection (owner, stream, target, true, sslCtx), m_Host (host), m_XI2P (XI2P),
|
I2PTunnelConnection (owner, stream, target, sslCtx), m_Host (host), m_XI2P (XI2P),
|
||||||
m_HeaderSent (false), m_ResponseHeaderSent (false)
|
m_HeaderSent (false), m_ResponseHeaderSent (false)
|
||||||
{
|
{
|
||||||
if (sslCtx)
|
if (sslCtx)
|
||||||
|
@ -528,7 +515,7 @@ namespace client
|
||||||
I2PTunnelConnectionIRC::I2PTunnelConnectionIRC (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
I2PTunnelConnectionIRC::I2PTunnelConnectionIRC (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
||||||
const boost::asio::ip::tcp::endpoint& target, const std::string& webircpass,
|
const boost::asio::ip::tcp::endpoint& target, const std::string& webircpass,
|
||||||
std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
std::shared_ptr<boost::asio::ssl::context> sslCtx):
|
||||||
I2PTunnelConnection (owner, stream, target, true, sslCtx), m_From (stream->GetRemoteIdentity ()),
|
I2PTunnelConnection (owner, stream, target, sslCtx), m_From (stream->GetRemoteIdentity ()),
|
||||||
m_NeedsWebIrc (webircpass.length() ? true : false), m_WebircPass (webircpass)
|
m_NeedsWebIrc (webircpass.length() ? true : false), m_WebircPass (webircpass)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
@ -857,7 +844,7 @@ namespace client
|
||||||
|
|
||||||
std::shared_ptr<I2PTunnelConnection> I2PServerTunnel::CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream)
|
std::shared_ptr<I2PTunnelConnection> I2PServerTunnel::CreateI2PConnection (std::shared_ptr<i2p::stream::Stream> stream)
|
||||||
{
|
{
|
||||||
return std::make_shared<I2PTunnelConnection> (this, stream, GetEndpoint (), true, m_SSLCtx);
|
return std::make_shared<I2PTunnelConnection> (this, stream, GetEndpoint (), m_SSLCtx);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -45,7 +45,7 @@ namespace client
|
||||||
I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
|
I2PTunnelConnection (I2PService * owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket,
|
||||||
std::shared_ptr<i2p::stream::Stream> stream); // to I2P using simplified API
|
std::shared_ptr<i2p::stream::Stream> stream); // to I2P using simplified API
|
||||||
I2PTunnelConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
I2PTunnelConnection (I2PService * owner, std::shared_ptr<i2p::stream::Stream> stream,
|
||||||
const boost::asio::ip::tcp::endpoint& target, bool quiet = true,
|
const boost::asio::ip::tcp::endpoint& target,
|
||||||
std::shared_ptr<boost::asio::ssl::context> sslCtx = nullptr); // from I2P
|
std::shared_ptr<boost::asio::ssl::context> sslCtx = nullptr); // from I2P
|
||||||
~I2PTunnelConnection ();
|
~I2PTunnelConnection ();
|
||||||
void I2PConnect (const uint8_t * msg = nullptr, size_t len = 0);
|
void I2PConnect (const uint8_t * msg = nullptr, size_t len = 0);
|
||||||
|
@ -54,25 +54,27 @@ namespace client
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
|
virtual void Established ();
|
||||||
void Terminate ();
|
void Terminate ();
|
||||||
|
|
||||||
void Receive ();
|
void Receive ();
|
||||||
void StreamReceive ();
|
void StreamReceive ();
|
||||||
|
void HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
||||||
virtual void Write (const uint8_t * buf, size_t len); // can be overloaded
|
virtual void Write (const uint8_t * buf, size_t len); // can be overloaded
|
||||||
virtual void WriteToStream (const uint8_t * buf, size_t len); // can be overloaded
|
virtual void WriteToStream (const uint8_t * buf, size_t len); // can be overloaded
|
||||||
|
|
||||||
std::shared_ptr<boost::asio::ip::tcp::socket> GetSocket () const { return m_Socket; };
|
std::shared_ptr<boost::asio::ip::tcp::socket> GetSocket () const { return m_Socket; };
|
||||||
|
std::shared_ptr<i2p::stream::Stream> GetStream () const { return m_Stream; };
|
||||||
std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&> > GetSSL () const { return m_SSL; };
|
std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&> > GetSSL () const { return m_SSL; };
|
||||||
|
uint8_t * GetStreamBuffer () { return m_StreamBuffer; };
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
void HandleConnect (const boost::system::error_code& ecode);
|
void HandleConnect (const boost::system::error_code& ecode);
|
||||||
void HandleHandshake (const boost::system::error_code& ecode);
|
void HandleHandshake (const boost::system::error_code& ecode);
|
||||||
void Established ();
|
|
||||||
void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
||||||
void HandleWrite (const boost::system::error_code& ecode);
|
void HandleWrite (const boost::system::error_code& ecode);
|
||||||
void HandleStreamReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
uint8_t m_Buffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE], m_StreamBuffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE];
|
uint8_t m_Buffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE], m_StreamBuffer[I2P_TUNNEL_CONNECTION_BUFFER_SIZE];
|
||||||
|
@ -80,7 +82,6 @@ namespace client
|
||||||
std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&> > m_SSL;
|
std::shared_ptr<boost::asio::ssl::stream<boost::asio::ip::tcp::socket&> > m_SSL;
|
||||||
std::shared_ptr<i2p::stream::Stream> m_Stream;
|
std::shared_ptr<i2p::stream::Stream> m_Stream;
|
||||||
boost::asio::ip::tcp::endpoint m_RemoteEndpoint;
|
boost::asio::ip::tcp::endpoint m_RemoteEndpoint;
|
||||||
bool m_IsQuiet; // don't send destination
|
|
||||||
};
|
};
|
||||||
|
|
||||||
class I2PClientTunnelConnectionHTTP: public I2PTunnelConnection
|
class I2PClientTunnelConnectionHTTP: public I2PTunnelConnection
|
||||||
|
@ -94,7 +95,7 @@ namespace client
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void Write (const uint8_t * buf, size_t len);
|
void Write (const uint8_t * buf, size_t len) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -112,8 +113,8 @@ namespace client
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void Write (const uint8_t * buf, size_t len);
|
void Write (const uint8_t * buf, size_t len) override;
|
||||||
void WriteToStream (const uint8_t * buf, size_t len);
|
void WriteToStream (const uint8_t * buf, size_t len) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -132,7 +133,7 @@ namespace client
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
||||||
void Write (const uint8_t * buf, size_t len);
|
void Write (const uint8_t * buf, size_t len) override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue