Merge pull request #5 from i2p/sam-v3.1

Support for SAM v3.1
github/master
Mikal 2019-07-27 22:01:03 +02:00 committed by GitHub
commit 11422d33f7
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 29 additions and 12 deletions

View File

@ -241,7 +241,8 @@ StreamSession::StreamSession(
const std::string& SAMHost /*= SAM_DEFAULT_ADDRESS*/,
uint16_t SAMPort /*= SAM_DEFAULT_PORT*/,
const std::string& destination /*= SAM_GENERATE_MY_DESTINATION*/,
const std::string& i2pOptions /*= SAM_DEFAULT_I2P_OPTIONS*/)
const std::string& i2pOptions /*= SAM_DEFAULT_I2P_OPTIONS*/,
const std::string& signatureType /*= SAM_SIGNATURE_TYPE */ )
: socket_(SAMHost, SAMPort)
, nickname_(nickname)
, sessionID_(generateSessionID())
@ -419,7 +420,7 @@ FullDestination StreamSession::createStreamSession(const std::string& destinatio
{
typedef Message::Answer<const std::string> AnswerType;
const AnswerType answer = createStreamSession(socket_, sessionID_, nickname_, destination, i2pOptions_);
const AnswerType answer = createStreamSession(socket_, sessionID_, nickname_, destination, i2pOptions_, SAM_SIGNATURE_TYPE);
if (answer.status != Message::OK)
{
fallSick();
@ -486,9 +487,9 @@ Message::eStatus StreamSession::request(I2pSocket& socket, const std::string& re
}
/*static*/
Message::Answer<const std::string> StreamSession::createStreamSession(I2pSocket& socket, const std::string& sessionID, const std::string& nickname, const std::string& destination, const std::string& options)
Message::Answer<const std::string> StreamSession::createStreamSession(I2pSocket& socket, const std::string& sessionID, const std::string& nickname, const std::string& destination, const std::string& options, const std::string& signatureType)
{
return request(socket, Message::sessionCreate(Message::sssStream, sessionID, nickname, destination, options), "DESTINATION");
return request(socket, Message::sessionCreate(Message::sssStream, sessionID, nickname, destination, options, signatureType), "DESTINATION");
}
/*static*/
@ -603,6 +604,17 @@ const std::string& StreamSession::getSAMVersion() const
return socket_.getVersion();
}
const std::string& StreamSession::getSAMMinVer() const
{
return socket_.minVer_;
}
const std::string& StreamSession::getSAMMaxVer() const
{
return socket_.maxVer_;
}
//--------------------------------------------------------------------------------------------------
@ -649,7 +661,7 @@ std::string Message::hello(const std::string &minVer, const std::string &maxVer)
return createSAMRequest(helloFormat, minVer.c_str(), maxVer.c_str());
}
std::string Message::sessionCreate(SessionStyle style, const std::string& sessionID, const std::string& nickname, const std::string& destination /*= SAM_GENERATE_MY_DESTINATION*/, const std::string& options /*= ""*/)
std::string Message::sessionCreate(SessionStyle style, const std::string& sessionID, const std::string& nickname, const std::string& destination /*= SAM_GENERATE_MY_DESTINATION*/, const std::string& options /*= ""*/, const std::string& signatureType /*= SAM_SIGNATURE_TYPE*/)
{
///////////////////////////////////////////////////////////
//
@ -673,8 +685,8 @@ std::string Message::sessionCreate(SessionStyle style, const std::string& sessio
case sssRaw: sessionStyle = "RAW"; break;
}
static const char* sessionCreateFormat = "SESSION CREATE STYLE=%s ID=%s DESTINATION=%s inbound.nickname=%s %s\n"; // we add inbound.nickname option
return createSAMRequest(sessionCreateFormat, sessionStyle.c_str(), sessionID.c_str(), destination.c_str(), nickname.c_str(), options.c_str());
static const char* sessionCreateFormat = "SESSION CREATE STYLE=%s ID=%s DESTINATION=%s SIGNATURE_TYPE=%s inbound.nickname=%s %s\n"; // we add inbound.nickname option
return createSAMRequest(sessionCreateFormat, sessionStyle.c_str(), sessionID.c_str(), destination.c_str(), signatureType.c_str(), nickname.c_str(), options.c_str());
}
std::string Message::streamAccept(const std::string& sessionID, bool silent /*= false*/)

View File

@ -13,6 +13,7 @@
#define SAM_GENERATE_MY_DESTINATION "TRANSIENT"
#define SAM_MY_NAME "ME"
#define SAM_DEFAULT_I2P_OPTIONS ""
#define SAM_SIGNATURE_TYPE "EdDSA_SHA512_Ed25519"
#define SAM_NAME_INBOUND_QUANTITY "inbound.quantity"
#define SAM_DEFAULT_INBOUND_QUANTITY 3 // Three tunnels is default now
@ -183,7 +184,9 @@ public:
};
static std::string hello(const std::string& minVer, const std::string& maxVer);
static std::string sessionCreate(SessionStyle style, const std::string& sessionID, const std::string& nickname, const std::string& destination = SAM_GENERATE_MY_DESTINATION, const std::string& options = "");
static std::string sessionCreate(SessionStyle style, const std::string& sessionID,
const std::string& nickname, const std::string& destination = SAM_GENERATE_MY_DESTINATION,
const std::string& options = "", const std::string& signatureType = SAM_SIGNATURE_TYPE);
static std::string streamAccept(const std::string& sessionID, bool silent = false);
static std::string streamConnect(const std::string& sessionID, const std::string& destination, bool silent = false);
static std::string streamForward(const std::string& sessionID, const std::string& host, uint16_t port, bool silent = false);
@ -221,13 +224,14 @@ public:
const sockaddr_in& getAddress() const;
const std::string minVer_ = "3.0";
const std::string maxVer_ = "3.1";
private:
SOCKET socket_;
sockaddr_in servAddr_;
std::string SAMHost_;
uint16_t SAMPort_;
const std::string minVer_ = "3.0";
const std::string maxVer_ = "3.0";
std::string version_;
#ifdef WIN32
@ -329,7 +333,8 @@ public:
const std::string& SAMHost = SAM_DEFAULT_ADDRESS,
uint16_t SAMPort = SAM_DEFAULT_PORT,
const std::string& destination = SAM_GENERATE_MY_DESTINATION,
const std::string& i2pOptions = SAM_DEFAULT_I2P_OPTIONS);
const std::string& i2pOptions = SAM_DEFAULT_I2P_OPTIONS,
const std::string& signatureType = SAM_SIGNATURE_TYPE);
explicit StreamSession(StreamSession& rhs);
~StreamSession();
@ -390,7 +395,7 @@ private:
static Message::Answer<const std::string> request(I2pSocket& socket, const std::string& requestStr, const std::string& keyOnSuccess);
static Message::eStatus request(I2pSocket& socket, const std::string& requestStr);
// commands
static Message::Answer<const std::string> createStreamSession(I2pSocket& socket, const std::string& sessionID, const std::string& nickname, const std::string& destination, const std::string& options);
static Message::Answer<const std::string> createStreamSession(I2pSocket& socket, const std::string& sessionID, const std::string& nickname, const std::string& destination, const std::string& options, const std::string& signatureType);
static Message::Answer<const std::string> namingLookup(I2pSocket& socket, const std::string& name);
static Message::Answer<const FullDestination> destGenerate(I2pSocket& socket);