Browse Source

handle ntcp2.proxy parameter

pull/1499/head
orignal 5 years ago
parent
commit
e969d58689
  1. 2
      libi2pd/Config.cpp
  2. 135
      libi2pd/NTCP2.cpp
  3. 12
      libi2pd/Transports.cpp

2
libi2pd/Config.cpp

@ -61,7 +61,6 @@ namespace config {
("ntcp", value<bool>()->default_value(false), "Enable NTCP transport (default: disabled)") ("ntcp", value<bool>()->default_value(false), "Enable NTCP transport (default: disabled)")
("ssu", value<bool>()->default_value(true), "Enable SSU transport (default: enabled)") ("ssu", value<bool>()->default_value(true), "Enable SSU transport (default: enabled)")
("ntcpproxy", value<std::string>()->default_value(""), "Proxy URL for NTCP transport") ("ntcpproxy", value<std::string>()->default_value(""), "Proxy URL for NTCP transport")
("ntcp2proxy", value<std::string>()->default_value(""), "Proxy URL for NTCP2 transport")
#ifdef _WIN32 #ifdef _WIN32
("svcctl", value<std::string>()->default_value(""), "Windows service management ('install' or 'remove')") ("svcctl", value<std::string>()->default_value(""), "Windows service management ('install' or 'remove')")
("insomnia", bool_switch()->default_value(false), "Prevent system from sleeping (default: disabled)") ("insomnia", bool_switch()->default_value(false), "Prevent system from sleeping (default: disabled)")
@ -240,6 +239,7 @@ namespace config {
("ntcp2.published", value<bool>()->default_value(true), "Publish NTCP2 (default: enabled)") ("ntcp2.published", value<bool>()->default_value(true), "Publish NTCP2 (default: enabled)")
("ntcp2.port", value<uint16_t>()->default_value(0), "Port to listen for incoming NTCP2 connections (default: auto)") ("ntcp2.port", value<uint16_t>()->default_value(0), "Port to listen for incoming NTCP2 connections (default: auto)")
("ntcp2.addressv6", value<std::string>()->default_value("::"), "Address to bind NTCP2 on") ("ntcp2.addressv6", value<std::string>()->default_value("::"), "Address to bind NTCP2 on")
("ntcp2.proxy", value<std::string>()->default_value(""), "Proxy URL for NTCP2 transport")
; ;
options_description nettime("Time sync options"); options_description nettime("Time sync options");

135
libi2pd/NTCP2.cpp

@ -1189,46 +1189,48 @@ namespace transport
case eSocksProxy: case eSocksProxy:
{ {
// TODO: support username/password auth etc // TODO: support username/password auth etc
uint8_t buff[3] = {0x05, 0x01, 0x00}; static const uint8_t buff[3] = {0x05, 0x01, 0x00};
boost::asio::async_write(conn->GetSocket(), boost::asio::buffer(buff, 3), boost::asio::transfer_all(), [=] (const boost::system::error_code & ec, std::size_t transferred) { boost::asio::async_write(conn->GetSocket(), boost::asio::buffer(buff, 3), boost::asio::transfer_all(),
(void) transferred; [] (const boost::system::error_code & ec, std::size_t transferred)
if(ec) {
{ (void) transferred;
LogPrint(eLogWarning, "NTCP2: socks5 write error ", ec.message()); if(ec)
}
});
uint8_t readbuff[2];
boost::asio::async_read(conn->GetSocket(), boost::asio::buffer(readbuff, 2),
[=](const boost::system::error_code & ec, std::size_t transferred)
{
LogPrint(eLogError, "NTCP2: ", transferred);
if(ec)
{
LogPrint(eLogError, "NTCP2: socks5 read error ", ec.message());
timer->cancel();
conn->Terminate();
return;
}
else if(transferred == 2)
{
if(readbuff[1] == 0xba)
{ {
AfterSocksHandshake(conn, timer, host, port, addrtype); LogPrint(eLogWarning, "NTCP2: socks5 write error ", ec.message());
return;
} }
else if (readbuff[1] == 0xff) });
auto readbuff = std::make_shared<std::array<uint8_t, 2> >();
boost::asio::async_read(conn->GetSocket(), boost::asio::buffer(*readbuff, 2),
[this, readbuff, timer, conn, host, port, addrtype](const boost::system::error_code & ec, std::size_t transferred)
{
LogPrint(eLogError, "NTCP2: ", transferred);
if(ec)
{ {
LogPrint(eLogError, "NTCP2: socks5 proxy rejected authentication"); LogPrint(eLogError, "NTCP2: socks5 read error ", ec.message());
timer->cancel(); timer->cancel();
conn->Terminate(); conn->Terminate();
return; return;
} }
LogPrint(eLogError, "NTCP2:", readbuff[1]); else if(transferred == 2)
} {
LogPrint(eLogError, "NTCP2: socks5 server gave invalid response"); if((*readbuff)[1] == 0xba)
timer->cancel(); {
conn->Terminate(); AfterSocksHandshake(conn, timer, host, port, addrtype);
}); return;
}
else if ((*readbuff)[1] == 0xff)
{
LogPrint(eLogError, "NTCP2: socks5 proxy rejected authentication");
timer->cancel();
conn->Terminate();
return;
}
LogPrint(eLogError, "NTCP2:", (*readbuff)[1]);
}
LogPrint(eLogError, "NTCP2: socks5 server gave invalid response");
timer->cancel();
conn->Terminate();
});
break; break;
} }
case eHTTPProxy: case eHTTPProxy:
@ -1245,47 +1247,47 @@ namespace transport
std::ostream out(&writebuff); std::ostream out(&writebuff);
out << req.to_string(); out << req.to_string();
boost::asio::async_write(conn->GetSocket(), writebuff.data(), boost::asio::transfer_all(), [=](const boost::system::error_code & ec, std::size_t transferred) { boost::asio::async_write(conn->GetSocket(), writebuff.data(), boost::asio::transfer_all(),
(void) transferred; [](const boost::system::error_code & ec, std::size_t transferred)
if(ec) {
LogPrint(eLogError, "NTCP2: http proxy write error ", ec.message()); (void) transferred;
}); if(ec)
LogPrint(eLogError, "NTCP2: http proxy write error ", ec.message());
});
boost::asio::streambuf * readbuff = new boost::asio::streambuf; boost::asio::streambuf * readbuff = new boost::asio::streambuf;
boost::asio::async_read_until(conn->GetSocket(), *readbuff, "\r\n\r\n", boost::asio::async_read_until(conn->GetSocket(), *readbuff, "\r\n\r\n",
[=] (const boost::system::error_code & ec, std::size_t transferred) [this, readbuff, timer, conn] (const boost::system::error_code & ec, std::size_t transferred)
{
if(ec)
{
LogPrint(eLogError, "NTCP2: http proxy read error ", ec.message());
timer->cancel();
conn->Terminate();
}
else
{ {
readbuff->commit(transferred); if(ec)
i2p::http::HTTPRes res; {
if(res.parse(boost::asio::buffer_cast<const char*>(readbuff->data()), readbuff->size()) > 0) LogPrint(eLogError, "NTCP2: http proxy read error ", ec.message());
timer->cancel();
conn->Terminate();
}
else
{ {
if(res.code == 200) readbuff->commit(transferred);
i2p::http::HTTPRes res;
if(res.parse(boost::asio::buffer_cast<const char*>(readbuff->data()), readbuff->size()) > 0)
{ {
timer->cancel(); if(res.code == 200)
conn->ClientLogin(); {
delete readbuff; timer->cancel();
return; conn->ClientLogin();
delete readbuff;
return;
}
else
LogPrint(eLogError, "NTCP2: http proxy rejected request ", res.code);
} }
else else
{ LogPrint(eLogError, "NTCP2: http proxy gave malformed response");
LogPrint(eLogError, "NTCP2: http proxy rejected request ", res.code); timer->cancel();
} conn->Terminate();
delete readbuff;
} }
else });
LogPrint(eLogError, "NTCP2: http proxy gave malformed response");
timer->cancel();
conn->Terminate();
delete readbuff;
}
});
break; break;
} }
default: default:
@ -1304,7 +1306,8 @@ namespace transport
auto timeout = NTCP_CONNECT_TIMEOUT * 5; auto timeout = NTCP_CONNECT_TIMEOUT * 5;
conn->SetTerminationTimeout(timeout * 2); conn->SetTerminationTimeout(timeout * 2);
timer->expires_from_now (boost::posix_time::seconds(timeout)); timer->expires_from_now (boost::posix_time::seconds(timeout));
timer->async_wait ([conn, timeout](const boost::system::error_code& ecode) { timer->async_wait ([conn, timeout](const boost::system::error_code& ecode)
{
if (ecode != boost::asio::error::operation_aborted) if (ecode != boost::asio::error::operation_aborted)
{ {
LogPrint (eLogInfo, "NTCP2: Not connected in ", timeout, " seconds"); LogPrint (eLogInfo, "NTCP2: Not connected in ", timeout, " seconds");

12
libi2pd/Transports.cpp

@ -157,7 +157,7 @@ namespace transport
m_IsRunning = true; m_IsRunning = true;
m_Thread = new std::thread (std::bind (&Transports::Run, this)); m_Thread = new std::thread (std::bind (&Transports::Run, this));
std::string ntcpproxy; i2p::config::GetOption("ntcpproxy", ntcpproxy); std::string ntcpproxy; i2p::config::GetOption("ntcpproxy", ntcpproxy);
std::string ntcp2proxy; i2p::config::GetOption("ntcp2proxy", ntcp2proxy); std::string ntcp2proxy; i2p::config::GetOption("ntcp2.proxy", ntcp2proxy);
i2p::http::URL proxyurl; i2p::http::URL proxyurl;
uint16_t softLimit, hardLimit, threads; uint16_t softLimit, hardLimit, threads;
i2p::config::GetOption("limits.ntcpsoft", softLimit); i2p::config::GetOption("limits.ntcpsoft", softLimit);
@ -201,7 +201,7 @@ namespace transport
bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2); bool ntcp2; i2p::config::GetOption("ntcp2.enabled", ntcp2);
if (ntcp2) if (ntcp2)
{ {
if(ntcp2proxy.size()) if(!ntcp2proxy.empty())
{ {
if(proxyurl.parse(ntcp2proxy)) if(proxyurl.parse(ntcp2proxy))
{ {
@ -223,9 +223,11 @@ namespace transport
LogPrint(eLogError, "Transports: invalid NTCP2 proxy url ", ntcp2proxy); LogPrint(eLogError, "Transports: invalid NTCP2 proxy url ", ntcp2proxy);
return; return;
} }
else
// m_NTCP2Server = new NTCP2Server (); {
// m_NTCP2Server->Start (); m_NTCP2Server = new NTCP2Server ();
m_NTCP2Server->Start ();
}
} }
// create acceptors // create acceptors

Loading…
Cancel
Save