Browse Source

fix issue #1126

pull/1128/head
Jeff Becker 7 years ago
parent
commit
ce9c9411b1
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05
  1. 47
      libi2pd_client/SAM.cpp
  2. 1
      libi2pd_client/SAM.h

47
libi2pd_client/SAM.cpp

@ -107,6 +107,21 @@ namespace client
std::placeholders::_1, std::placeholders::_2)); std::placeholders::_1, std::placeholders::_2));
} }
static bool SAMVersionAccceptable(const std::string & ver)
{
return ver == "3.0" || ver == "3.1";
}
static bool SAMVersionTooLow(const std::string & ver)
{
return ver.size() && ver[0] < '3';
}
static bool SAMVersionTooHigh(const std:::string & ver)
{
return ver.size() && ver > "3.1";
}
void SAMSocket::HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred) void SAMSocket::HandleHandshakeReceived (const boost::system::error_code& ecode, std::size_t bytes_transferred)
{ {
if (ecode) if (ecode)
@ -132,19 +147,37 @@ namespace client
if (!strcmp (m_Buffer, SAM_HANDSHAKE)) if (!strcmp (m_Buffer, SAM_HANDSHAKE))
{ {
std::string version("3.0"); std::string maxver("3.1");
std::string minver("3.0");
// try to find MIN and MAX, 3.0 if not found // try to find MIN and MAX, 3.0 if not found
if (separator) if (separator)
{ {
separator++; separator++;
std::map<std::string, std::string> params; std::map<std::string, std::string> params;
ExtractParams (separator, params); ExtractParams (separator, params);
//auto it = params.find (SAM_PARAM_MAX); auto it = params.find (SAM_PARAM_MAX);
// TODO: check MIN as well if (it != params.end ())
//if (it != params.end ()) maxver = it->second;
// version = it->second; it = params.find(SAM_PARAM_MIN);
if (it != params.end ())
minver = it->second;
} }
if (version[0] == '3') // we support v3 (3.0 and 3.1) only // version negotiation
std::string version;
if (SAMVersionAcceptable(maxver))
{
version = maxver;
}
else if (SAMVersionAcceptable(minver))
{
version = minver;
}
else if (SAMVersionTooLow(minver) && SAMVersionIsTooHigh(maxver))
{
version = "3.0";
}
if (SAMVersionAcceptable(version))
{ {
#ifdef _MSC_VER #ifdef _MSC_VER
size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ()); size_t l = sprintf_s (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_HANDSHAKE_REPLY, version.c_str ());
@ -156,7 +189,7 @@ namespace client
std::placeholders::_1, std::placeholders::_2)); std::placeholders::_1, std::placeholders::_2));
} }
else else
SendMessageReply (SAM_HANDSHAKE_I2P_ERROR, strlen (SAM_HANDSHAKE_I2P_ERROR), true); SendMessageReply (SAM_HANDSHAKE_NOVERSION, strlen (SAM_HANDSHAKE_NOVERSION), true);
} }
else else
{ {

1
libi2pd_client/SAM.h

@ -23,6 +23,7 @@ namespace client
const int SAM_SESSION_READINESS_CHECK_INTERVAL = 20; // in seconds const int SAM_SESSION_READINESS_CHECK_INTERVAL = 20; // in seconds
const char SAM_HANDSHAKE[] = "HELLO VERSION"; const char SAM_HANDSHAKE[] = "HELLO VERSION";
const char SAM_HANDSHAKE_REPLY[] = "HELLO REPLY RESULT=OK VERSION=%s\n"; const char SAM_HANDSHAKE_REPLY[] = "HELLO REPLY RESULT=OK VERSION=%s\n";
const char SAM_HANDSHAKE_NOVERSION[] = "HELLO REPLY RESULT=NOVERSION\n";
const char SAM_HANDSHAKE_I2P_ERROR[] = "HELLO REPLY RESULT=I2P_ERROR\n"; const char SAM_HANDSHAKE_I2P_ERROR[] = "HELLO REPLY RESULT=I2P_ERROR\n";
const char SAM_SESSION_CREATE[] = "SESSION CREATE"; const char SAM_SESSION_CREATE[] = "SESSION CREATE";
const char SAM_SESSION_CREATE_REPLY_OK[] = "SESSION STATUS RESULT=OK DESTINATION=%s\n"; const char SAM_SESSION_CREATE_REPLY_OK[] = "SESSION STATUS RESULT=OK DESTINATION=%s\n";

Loading…
Cancel
Save