mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-01-31 04:44:13 +00:00
Merge pull request #138 from klondi/master
Reintroduce Request verification, allow for extra data after connect request.
This commit is contained in:
commit
cbcfe50eb5
19
SOCKS.cpp
19
SOCKS.cpp
@ -149,12 +149,12 @@ namespace proxy
|
|||||||
m_state = nstate;
|
m_state = nstate;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SOCKSHandler::ValidateSOCKSRequest() {
|
bool SOCKSHandler::ValidateSOCKSRequest() {
|
||||||
if ( m_cmd != CMD_CONNECT ) {
|
if ( m_cmd != CMD_CONNECT ) {
|
||||||
//TODO: we need to support binds and other shit!
|
//TODO: we need to support binds and other shit!
|
||||||
LogPrint(eLogError,"--- SOCKS unsupported command: ", m_cmd);
|
LogPrint(eLogError,"--- SOCKS unsupported command: ", m_cmd);
|
||||||
SocksRequestFailed(SOCKS5_CMD_UNSUP);
|
SocksRequestFailed(SOCKS5_CMD_UNSUP);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
//TODO: we may want to support other address types!
|
//TODO: we may want to support other address types!
|
||||||
if ( m_addrtype != ADDR_DNS ) {
|
if ( m_addrtype != ADDR_DNS ) {
|
||||||
@ -167,14 +167,15 @@ namespace proxy
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
SocksRequestFailed(SOCKS5_ADDR_UNSUP);
|
SocksRequestFailed(SOCKS5_ADDR_UNSUP);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
//TODO: we may want to support other domains
|
//TODO: we may want to support other domains
|
||||||
if(m_addrtype == ADDR_DNS && m_address.dns.ToString().find(".i2p") == std::string::npos) {
|
if(m_addrtype == ADDR_DNS && m_address.dns.ToString().find(".i2p") == std::string::npos) {
|
||||||
LogPrint(eLogError,"--- SOCKS invalid hostname: ", m_address.dns.ToString());
|
LogPrint(eLogError,"--- SOCKS invalid hostname: ", m_address.dns.ToString());
|
||||||
SocksRequestFailed(SOCKS5_ADDR_UNSUP);
|
SocksRequestFailed(SOCKS5_ADDR_UNSUP);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SOCKSHandler::HandleData(uint8_t *sock_buff, std::size_t len)
|
bool SOCKSHandler::HandleData(uint8_t *sock_buff, std::size_t len)
|
||||||
@ -315,10 +316,10 @@ namespace proxy
|
|||||||
}
|
}
|
||||||
sock_buff++;
|
sock_buff++;
|
||||||
len--;
|
len--;
|
||||||
if (len && m_state == DONE) {
|
if (m_state == DONE) {
|
||||||
LogPrint(eLogError,"--- SOCKS rejected because we can't handle extra data");
|
m_remaining_data_len = len;
|
||||||
SocksRequestFailed(SOCKS5_GEN_FAIL);
|
m_remaining_data = sock_buff;
|
||||||
return false;
|
return ValidateSOCKSRequest();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
@ -363,7 +364,7 @@ namespace proxy
|
|||||||
LogPrint (eLogInfo,"--- SOCKS New I2PTunnel connection");
|
LogPrint (eLogInfo,"--- SOCKS New I2PTunnel connection");
|
||||||
auto connection = std::make_shared<i2p::client::I2PTunnelConnection>((i2p::client::I2PTunnel *)m_parent, m_sock, m_stream);
|
auto connection = std::make_shared<i2p::client::I2PTunnelConnection>((i2p::client::I2PTunnel *)m_parent, m_sock, m_stream);
|
||||||
m_parent->AddConnection (connection);
|
m_parent->AddConnection (connection);
|
||||||
connection->I2PConnect ();
|
connection->I2PConnect (m_remaining_data,m_remaining_data_len);
|
||||||
Done();
|
Done();
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
4
SOCKS.h
4
SOCKS.h
@ -94,7 +94,7 @@ namespace proxy
|
|||||||
|
|
||||||
void EnterState(state nstate, uint8_t parseleft = 1);
|
void EnterState(state nstate, uint8_t parseleft = 1);
|
||||||
bool HandleData(uint8_t *sock_buff, std::size_t len);
|
bool HandleData(uint8_t *sock_buff, std::size_t len);
|
||||||
void ValidateSOCKSRequest();
|
bool ValidateSOCKSRequest();
|
||||||
void HandleSockRecv(const boost::system::error_code & ecode, std::size_t bytes_transfered);
|
void HandleSockRecv(const boost::system::error_code & ecode, std::size_t bytes_transfered);
|
||||||
void Done();
|
void Done();
|
||||||
void Terminate();
|
void Terminate();
|
||||||
@ -114,8 +114,10 @@ namespace proxy
|
|||||||
SOCKSServer * m_parent;
|
SOCKSServer * m_parent;
|
||||||
boost::asio::ip::tcp::socket * m_sock;
|
boost::asio::ip::tcp::socket * m_sock;
|
||||||
std::shared_ptr<i2p::stream::Stream> m_stream;
|
std::shared_ptr<i2p::stream::Stream> m_stream;
|
||||||
|
uint8_t *m_remaining_data; //Data left to be sent
|
||||||
uint8_t m_response[7+max_socks_hostname_size];
|
uint8_t m_response[7+max_socks_hostname_size];
|
||||||
address m_address; //Address
|
address m_address; //Address
|
||||||
|
std::size_t m_remaining_data_len; //Size of the data left to be sent
|
||||||
uint32_t m_4aip; //Used in 4a requests
|
uint32_t m_4aip; //Used in 4a requests
|
||||||
uint16_t m_port;
|
uint16_t m_port;
|
||||||
uint8_t m_command;
|
uint8_t m_command;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user