diff --git a/SAM.cpp b/SAM.cpp index 7da8ff68..43711a54 100644 --- a/SAM.cpp +++ b/SAM.cpp @@ -3,6 +3,7 @@ #ifdef _MSC_VER #include #endif +#include #include "base64.h" #include "Identity.h" #include "Log.h" @@ -238,13 +239,15 @@ namespace client std::string& style = params[SAM_PARAM_STYLE]; std::string& id = params[SAM_PARAM_ID]; std::string& destination = params[SAM_PARAM_DESTINATION]; - m_ID = id; + m_ID = id; if (m_Owner.FindSession (id)) { // session exists SendMessageReply (SAM_SESSION_CREATE_DUPLICATED_ID, strlen(SAM_SESSION_CREATE_DUPLICATED_ID), true); return; } + + // create destination m_Session = m_Owner.CreateSession (id, destination == SAM_VALUE_TRANSIENT ? "" : destination, ¶ms); if (m_Session) { @@ -642,7 +645,18 @@ namespace client localDestination = i2p::client::context.CreateNewLocalDestination (keys, true, params); } else // transient - localDestination = i2p::client::context.CreateNewLocalDestination (false, i2p::data::SIGNING_KEY_TYPE_DSA_SHA1, params); + { + // extract signature type + i2p::data::SigningKeyType signatureType = i2p::data::SIGNING_KEY_TYPE_DSA_SHA1; + if (params) + { + auto it = params->find (SAM_PARAM_SIGNATURE_TYPE); + if (it != params->end ()) + // TODO: extract string values + signatureType = boost::lexical_cast (it->second); + } + localDestination = i2p::client::context.CreateNewLocalDestination (false, signatureType, params); + } if (localDestination) { SAMSession session; diff --git a/SAM.h b/SAM.h index 78de49ce..f8772112 100644 --- a/SAM.h +++ b/SAM.h @@ -50,7 +50,8 @@ namespace client const char SAM_PARAM_ID[] = "ID"; const char SAM_PARAM_SILENT[] = "SILENT"; const char SAM_PARAM_DESTINATION[] = "DESTINATION"; - const char SAM_PARAM_NAME[] = "NAME"; + const char SAM_PARAM_NAME[] = "NAME"; + const char SAM_PARAM_SIGNATURE_TYPE[] = "SIGNATURE_TYPE"; const char SAM_VALUE_TRANSIENT[] = "TRANSIENT"; const char SAM_VALUE_STREAM[] = "STREAM"; const char SAM_VALUE_DATAGRAM[] = "DATAGRAM"; @@ -149,8 +150,8 @@ namespace client void Stop (); boost::asio::io_service& GetService () { return m_Service; }; - SAMSession * CreateSession (const std::string& id, const std::string& destination = "", // empty string means transient - const std::map * params = nullptr); + SAMSession * CreateSession (const std::string& id, const std::string& destination, // empty string means transient + const std::map * params); void CloseSession (const std::string& id); SAMSession * FindSession (const std::string& id);