|
|
@ -102,7 +102,7 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
separator++; |
|
|
|
separator++; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
ExtractParams (separator, bytes_transferred - (separator - m_Buffer), params); |
|
|
|
ExtractParams (separator, params); |
|
|
|
auto it = params.find (SAM_PARAM_MAX); |
|
|
|
auto it = params.find (SAM_PARAM_MAX); |
|
|
|
// TODO: check MIN as well
|
|
|
|
// TODO: check MIN as well
|
|
|
|
if (it != params.end ()) |
|
|
|
if (it != params.end ()) |
|
|
@ -208,6 +208,8 @@ namespace client |
|
|
|
ProcessStreamConnect (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); |
|
|
|
ProcessStreamConnect (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); |
|
|
|
else if (!strcmp (m_Buffer, SAM_STREAM_ACCEPT)) |
|
|
|
else if (!strcmp (m_Buffer, SAM_STREAM_ACCEPT)) |
|
|
|
ProcessStreamAccept (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); |
|
|
|
ProcessStreamAccept (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); |
|
|
|
|
|
|
|
else if (!strcmp (m_Buffer, SAM_DATAGRAM_SEND)) |
|
|
|
|
|
|
|
ProcessDatagramSend (separator + 1, bytes_transferred - (separator - m_Buffer) - 1, eol + 1); |
|
|
|
else if (!strcmp (m_Buffer, SAM_DEST_GENERATE)) |
|
|
|
else if (!strcmp (m_Buffer, SAM_DEST_GENERATE)) |
|
|
|
ProcessDestGenerate (); |
|
|
|
ProcessDestGenerate (); |
|
|
|
else if (!strcmp (m_Buffer, SAM_NAMING_LOOKUP)) |
|
|
|
else if (!strcmp (m_Buffer, SAM_NAMING_LOOKUP)) |
|
|
@ -236,7 +238,7 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint ("SAM session create: ", buf); |
|
|
|
LogPrint ("SAM session create: ", buf); |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
ExtractParams (buf, len, params); |
|
|
|
ExtractParams (buf, params); |
|
|
|
std::string& style = params[SAM_PARAM_STYLE]; |
|
|
|
std::string& style = params[SAM_PARAM_STYLE]; |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& destination = params[SAM_PARAM_DESTINATION]; |
|
|
|
std::string& destination = params[SAM_PARAM_DESTINATION]; |
|
|
@ -307,7 +309,7 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint ("SAM stream connect: ", buf); |
|
|
|
LogPrint ("SAM stream connect: ", buf); |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
ExtractParams (buf, len, params); |
|
|
|
ExtractParams (buf, params); |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& destination = params[SAM_PARAM_DESTINATION]; |
|
|
|
std::string& destination = params[SAM_PARAM_DESTINATION]; |
|
|
|
std::string& silent = params[SAM_PARAM_SILENT]; |
|
|
|
std::string& silent = params[SAM_PARAM_SILENT]; |
|
|
@ -361,7 +363,7 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint ("SAM stream accept: ", buf); |
|
|
|
LogPrint ("SAM stream accept: ", buf); |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
ExtractParams (buf, len, params); |
|
|
|
ExtractParams (buf, params); |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& id = params[SAM_PARAM_ID]; |
|
|
|
std::string& silent = params[SAM_PARAM_SILENT]; |
|
|
|
std::string& silent = params[SAM_PARAM_SILENT]; |
|
|
|
if (silent == SAM_VALUE_TRUE) m_IsSilent = true; |
|
|
|
if (silent == SAM_VALUE_TRUE) m_IsSilent = true; |
|
|
@ -383,6 +385,35 @@ namespace client |
|
|
|
SendMessageReply (SAM_STREAM_STATUS_INVALID_ID, strlen(SAM_STREAM_STATUS_INVALID_ID), true); |
|
|
|
SendMessageReply (SAM_STREAM_STATUS_INVALID_ID, strlen(SAM_STREAM_STATUS_INVALID_ID), true); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void SAMSocket::ProcessDatagramSend (char * buf, size_t len, const char * data) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint ("SAM datagram send: ", buf); |
|
|
|
|
|
|
|
std::map<std::string, std::string> params; |
|
|
|
|
|
|
|
ExtractParams (buf, params); |
|
|
|
|
|
|
|
size_t size = boost::lexical_cast<int>(params[SAM_PARAM_SIZE]); |
|
|
|
|
|
|
|
if (size < len) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (m_Session) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
auto d = m_Session->localDestination->GetDatagramDestination (); |
|
|
|
|
|
|
|
if (d) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
i2p::data::IdentityEx dest; |
|
|
|
|
|
|
|
dest.FromBase64 (params[SAM_PARAM_DESTINATION]); |
|
|
|
|
|
|
|
d->SendDatagramTo ((const uint8_t *)data, size, dest.GetIdentHash ()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
LogPrint (eLogError, "SAM missing datagram destination"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
LogPrint (eLogError, "SAM session is not created from DATAGRAM SEND"); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
else |
|
|
|
|
|
|
|
LogPrint (eLogError, "SAM datagram size ", size, " exceeds buffer"); |
|
|
|
|
|
|
|
// since it's SAM v1 reply is not expected
|
|
|
|
|
|
|
|
Receive (); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SAMSocket::ProcessDestGenerate () |
|
|
|
void SAMSocket::ProcessDestGenerate () |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint ("SAM dest generate"); |
|
|
|
LogPrint ("SAM dest generate"); |
|
|
@ -401,7 +432,7 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
LogPrint ("SAM naming lookup: ", buf); |
|
|
|
LogPrint ("SAM naming lookup: ", buf); |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
std::map<std::string, std::string> params; |
|
|
|
ExtractParams (buf, len, params); |
|
|
|
ExtractParams (buf, params); |
|
|
|
std::string& name = params[SAM_PARAM_NAME]; |
|
|
|
std::string& name = params[SAM_PARAM_NAME]; |
|
|
|
i2p::data::IdentityEx identity; |
|
|
|
i2p::data::IdentityEx identity; |
|
|
|
i2p::data::IdentHash ident; |
|
|
|
i2p::data::IdentHash ident; |
|
|
@ -467,7 +498,7 @@ namespace client |
|
|
|
SendMessageReply (m_Buffer, l, false); |
|
|
|
SendMessageReply (m_Buffer, l, false); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void SAMSocket::ExtractParams (char * buf, size_t len, std::map<std::string, std::string>& params) |
|
|
|
void SAMSocket::ExtractParams (char * buf, std::map<std::string, std::string>& params) |
|
|
|
{ |
|
|
|
{ |
|
|
|
char * separator; |
|
|
|
char * separator; |
|
|
|
do |
|
|
|
do |
|
|
@ -779,15 +810,8 @@ namespace client |
|
|
|
{ |
|
|
|
{ |
|
|
|
i2p::data::IdentityEx dest; |
|
|
|
i2p::data::IdentityEx dest; |
|
|
|
dest.FromBase64 (destination); |
|
|
|
dest.FromBase64 (destination); |
|
|
|
auto leaseSet = i2p::data::netdb.FindLeaseSet (dest.GetIdentHash ()); |
|
|
|
|
|
|
|
if (leaseSet) |
|
|
|
|
|
|
|
session->localDestination->GetDatagramDestination ()-> |
|
|
|
session->localDestination->GetDatagramDestination ()-> |
|
|
|
SendDatagramTo ((uint8_t *)eol, payloadLen, leaseSet); |
|
|
|
SendDatagramTo ((uint8_t *)eol, payloadLen, dest.GetIdentHash ()); |
|
|
|
else |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
LogPrint ("SAM datagram destination not found"); |
|
|
|
|
|
|
|
session->localDestination->RequestDestination (dest.GetIdentHash ()); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
LogPrint ("Session ", sessionID, " not found"); |
|
|
|
LogPrint ("Session ", sessionID, " not found"); |
|
|
|