mirror of
https://github.com/PurpleI2P/i2pd.git
synced 2025-03-10 01:01:02 +00:00
don't send 'accepted' if not requested
This commit is contained in:
parent
f6d7f7d984
commit
6de7cd5063
39
I2CP.cpp
39
I2CP.cpp
@ -117,7 +117,7 @@ namespace client
|
|||||||
I2CPSession::I2CPSession (I2CPServer& owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket):
|
I2CPSession::I2CPSession (I2CPServer& owner, std::shared_ptr<boost::asio::ip::tcp::socket> socket):
|
||||||
m_Owner (owner), m_Socket (socket),
|
m_Owner (owner), m_Socket (socket),
|
||||||
m_NextMessage (nullptr), m_NextMessageLen (0), m_NextMessageOffset (0),
|
m_NextMessage (nullptr), m_NextMessageLen (0), m_NextMessageOffset (0),
|
||||||
m_MessageID (0)
|
m_MessageID (0), m_IsSendAccepted (true)
|
||||||
{
|
{
|
||||||
RAND_bytes ((uint8_t *)&m_SessionID, 2);
|
RAND_bytes ((uint8_t *)&m_SessionID, 2);
|
||||||
}
|
}
|
||||||
@ -317,21 +317,42 @@ namespace client
|
|||||||
{
|
{
|
||||||
auto identity = std::make_shared<i2p::data::IdentityEx>();
|
auto identity = std::make_shared<i2p::data::IdentityEx>();
|
||||||
size_t offset = identity->FromBuffer (buf, len);
|
size_t offset = identity->FromBuffer (buf, len);
|
||||||
|
if (!offset)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "I2CP: create session maformed identity");
|
||||||
|
SendSessionStatusMessage (3); // invalid
|
||||||
|
return;
|
||||||
|
}
|
||||||
uint16_t optionsSize = bufbe16toh (buf + offset);
|
uint16_t optionsSize = bufbe16toh (buf + offset);
|
||||||
offset += 2;
|
offset += 2;
|
||||||
|
if (optionsSize > len - offset)
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "I2CP: options size ", optionsSize, "exceeds message size");
|
||||||
|
SendSessionStatusMessage (3); // invalid
|
||||||
|
return;
|
||||||
|
}
|
||||||
std::map<std::string, std::string> params;
|
std::map<std::string, std::string> params;
|
||||||
ExtractMapping (buf + offset, optionsSize, params);
|
ExtractMapping (buf + offset, optionsSize, params);
|
||||||
offset += optionsSize;
|
offset += optionsSize; // options
|
||||||
|
if (params[I2CP_PARAM_MESSAGE_RELIABILITY] == "none") m_IsSendAccepted = false;
|
||||||
|
|
||||||
offset += 8; // date
|
offset += 8; // date
|
||||||
if (identity->Verify (buf, offset, buf + offset)) // signature
|
if (identity->Verify (buf, offset, buf + offset)) // signature
|
||||||
{
|
{
|
||||||
bool isPublic = true;
|
bool isPublic = true;
|
||||||
if (params[I2CP_PARAM_DONT_PUBLISH_LEASESET] == "true") isPublic = false;
|
if (params[I2CP_PARAM_DONT_PUBLISH_LEASESET] == "true") isPublic = false;
|
||||||
m_Destination = std::make_shared<I2CPDestination>(shared_from_this (), identity, isPublic, params);
|
if (!m_Destination)
|
||||||
m_Destination->Start ();
|
{
|
||||||
SendSessionStatusMessage (1); // created
|
m_Destination = std::make_shared<I2CPDestination>(shared_from_this (), identity, isPublic, params);
|
||||||
LogPrint (eLogDebug, "I2CP: session ", m_SessionID, " created");
|
SendSessionStatusMessage (1); // created
|
||||||
|
LogPrint (eLogDebug, "I2CP: session ", m_SessionID, " created");
|
||||||
|
m_Destination->Start ();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
LogPrint (eLogError, "I2CP: session already exists");
|
||||||
|
SendSessionStatusMessage (4); // refused
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -363,6 +384,7 @@ namespace client
|
|||||||
|
|
||||||
void I2CPSession::SendMessageStatusMessage (uint32_t nonce, I2CPMessageStatus status)
|
void I2CPSession::SendMessageStatusMessage (uint32_t nonce, I2CPMessageStatus status)
|
||||||
{
|
{
|
||||||
|
if (!nonce) return; // don't send status with zero nonce
|
||||||
uint8_t buf[15];
|
uint8_t buf[15];
|
||||||
htobe16buf (buf, m_SessionID);
|
htobe16buf (buf, m_SessionID);
|
||||||
htobe32buf (buf + 2, m_MessageID++);
|
htobe32buf (buf + 2, m_MessageID++);
|
||||||
@ -406,7 +428,8 @@ namespace client
|
|||||||
uint32_t payloadLen = bufbe32toh (buf + offset);
|
uint32_t payloadLen = bufbe32toh (buf + offset);
|
||||||
offset += 4;
|
offset += 4;
|
||||||
uint32_t nonce = bufbe32toh (buf + offset + payloadLen);
|
uint32_t nonce = bufbe32toh (buf + offset + payloadLen);
|
||||||
SendMessageStatusMessage (nonce, eI2CPMessageStatusAccepted); // accepted
|
if (m_IsSendAccepted)
|
||||||
|
SendMessageStatusMessage (nonce, eI2CPMessageStatusAccepted); // accepted
|
||||||
m_Destination->SendMsgTo (buf + offset, payloadLen, identity.GetIdentHash (), nonce);
|
m_Destination->SendMsgTo (buf + offset, payloadLen, identity.GetIdentHash (), nonce);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
4
I2CP.h
4
I2CP.h
@ -56,7 +56,8 @@ namespace client
|
|||||||
};
|
};
|
||||||
|
|
||||||
// params
|
// params
|
||||||
const char I2CP_PARAM_DONT_PUBLISH_LEASESET[] = "i2cp.dontPublishLeaseSet ";
|
const char I2CP_PARAM_DONT_PUBLISH_LEASESET[] = "i2cp.dontPublishLeaseSet";
|
||||||
|
const char I2CP_PARAM_MESSAGE_RELIABILITY[] = "i2cp.messageReliability";
|
||||||
|
|
||||||
class I2CPSession;
|
class I2CPSession;
|
||||||
class I2CPDestination: public LeaseSetDestination
|
class I2CPDestination: public LeaseSetDestination
|
||||||
@ -148,6 +149,7 @@ namespace client
|
|||||||
std::shared_ptr<I2CPDestination> m_Destination;
|
std::shared_ptr<I2CPDestination> m_Destination;
|
||||||
uint16_t m_SessionID;
|
uint16_t m_SessionID;
|
||||||
uint32_t m_MessageID;
|
uint32_t m_MessageID;
|
||||||
|
bool m_IsSendAccepted;
|
||||||
};
|
};
|
||||||
typedef void (I2CPSession::*I2CPMessageHandler)(const uint8_t * buf, size_t len);
|
typedef void (I2CPSession::*I2CPMessageHandler)(const uint8_t * buf, size_t len);
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user