diff --git a/SAM.cpp b/SAM.cpp index 0fe0888c..4e62948f 100644 --- a/SAM.cpp +++ b/SAM.cpp @@ -1,4 +1,5 @@ #include +#include #include #include "base64.h" #include "Identity.h" @@ -160,31 +161,36 @@ namespace stream *eol = 0; char * separator = strchr (m_Buffer, ' '); if (separator) - separator = strchr (separator + 1, ' '); - if (separator) - { - *separator = 0; + { + separator = strchr (separator + 1, ' '); + if (separator) + *separator = 0; + else + separator = eol; + if (!strcmp (m_Buffer, SAM_SESSION_CREATE)) ProcessSessionCreate (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); else if (!strcmp (m_Buffer, SAM_STREAM_CONNECT)) ProcessStreamConnect (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); else if (!strcmp (m_Buffer, SAM_STREAM_ACCEPT)) ProcessStreamAccept (separator + 1, bytes_transferred - (separator - m_Buffer) - 1); + else if (!strcmp (m_Buffer, SAM_DEST_GENERATE)) + ProcessDestGenerate (); else { LogPrint ("SAM unexpected message ", m_Buffer); Terminate (); } - } + } else - { - LogPrint ("SAM malformed message"); + { + LogPrint ("SAM malformed message ", m_Buffer); Terminate (); } } else { - LogPrint ("SAM malformed message"); + LogPrint ("SAM malformed message ", m_Buffer); Terminate (); } } @@ -277,6 +283,28 @@ namespace stream SendMessageReply (SAM_STREAM_STATUS_INVALID_ID, strlen(SAM_STREAM_STATUS_INVALID_ID), true); } + void SAMSocket::ProcessDestGenerate () + { + LogPrint ("SAM dest generate"); + auto localDestination = CreateNewLocalDestination (); + if (localDestination) + { + uint8_t buf[1024]; + char priv[1024], pub[1024]; + size_t l = localDestination->GetPrivateKeys ().ToBuffer (buf, 1024); + size_t l1 = i2p::data::ByteStreamToBase64 (buf, l, priv, 1024); + priv[l1] = 0; + + l = localDestination->GetIdentity ().ToBuffer (buf, 1024); + l1 = i2p::data::ByteStreamToBase64 (buf, l, pub, 1024); + pub[l1] = 0; + size_t len = snprintf (m_Buffer, SAM_SOCKET_BUFFER_SIZE, SAM_DEST_REPLY, pub, priv); + SendMessageReply (m_Buffer, len, true); + } + else + SendMessageReply (SAM_DEST_REPLY_I2P_ERROR, strlen(SAM_DEST_REPLY_I2P_ERROR), true); + } + void SAMSocket::ExtractParams (char * buf, size_t len, std::map& params) { while (char * separator = strchr (buf, ' ')) diff --git a/SAM.h b/SAM.h index add16a90..4697fda4 100644 --- a/SAM.h +++ b/SAM.h @@ -26,6 +26,9 @@ namespace stream const char SAM_STREAM_STATUS_CANT_REACH_PEER[] = "STREAM STATUS RESULT=CANT_REACH_PEER\n"; const char SAM_STREAM_STATUS_I2P_ERROR[] = "STREAM STATUS RESULT=I2P_ERROR\n"; const char SAM_STREAM_ACCEPT[] = "STREAM ACCEPT"; + const char SAM_DEST_GENERATE[] = "DEST GENERATE"; + const char SAM_DEST_REPLY[] = "DEST REPLY PUB=%s PRIV=%s\n"; + const char SAM_DEST_REPLY_I2P_ERROR[] = "DEST REPLY RESULT=I2P_ERROR\n"; const char SAM_PARAM_STYLE[] = "STYLE"; const char SAM_PARAM_ID[] = "ID"; const char SAM_PARAM_SILENT[] = "SILENT"; @@ -72,6 +75,7 @@ namespace stream void ProcessSessionCreate (char * buf, size_t len); void ProcessStreamConnect (char * buf, size_t len); void ProcessStreamAccept (char * buf, size_t len); + void ProcessDestGenerate (); void ExtractParams (char * buf, size_t len, std::map& params); private: diff --git a/Streaming.cpp b/Streaming.cpp index 5bc26bd8..4536c62b 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -742,7 +742,10 @@ namespace stream { auto it = m_Destinations.find (keys.GetPublic ().GetIdentHash ()); if (it != m_Destinations.end ()) + { + LogPrint ("Local destination ", keys.GetPublic ().GetIdentHash ().ToBase32 (), ".b32.i2p exists"); return it->second; + } auto localDestination = new StreamingDestination (m_Service, keys, isPublic); m_Destinations[keys.GetPublic ().GetIdentHash ()] = localDestination; return localDestination;