Browse Source

re-create LeaseSet if store type has changed

pull/1288/head
orignal 6 years ago
parent
commit
65c2c7d80b
  1. 7
      libi2pd/LeaseSet.cpp
  2. 3
      libi2pd/LeaseSet.h
  3. 78
      libi2pd/NetDb.cpp
  4. 2
      libi2pd/NetDb.hpp

7
libi2pd/LeaseSet.cpp

@ -260,6 +260,13 @@ namespace data
ReadFromBuffer (buf, len); ReadFromBuffer (buf, len);
} }
void LeaseSet2::Update (const uint8_t * buf, size_t len, bool verifySignature)
{
// shouldn't be called for now. Must be called from NetDb::AddLeaseSet later
SetBuffer (buf, len);
// TODO:verify signature if requested
}
void LeaseSet2::ReadFromBuffer (const uint8_t * buf, size_t len) void LeaseSet2::ReadFromBuffer (const uint8_t * buf, size_t len)
{ {
// standard LS2 header // standard LS2 header

3
libi2pd/LeaseSet.h

@ -60,7 +60,7 @@ namespace data
LeaseSet (const uint8_t * buf, size_t len, bool storeLeases = true); LeaseSet (const uint8_t * buf, size_t len, bool storeLeases = true);
virtual ~LeaseSet () { delete[] m_EncryptionKey; delete[] m_Buffer; }; virtual ~LeaseSet () { delete[] m_EncryptionKey; delete[] m_Buffer; };
void Update (const uint8_t * buf, size_t len, bool verifySignature = true); virtual void Update (const uint8_t * buf, size_t len, bool verifySignature = true);
bool IsNewer (const uint8_t * buf, size_t len) const; bool IsNewer (const uint8_t * buf, size_t len) const;
void PopulateLeases (); // from buffer void PopulateLeases (); // from buffer
@ -128,6 +128,7 @@ namespace data
LeaseSet2 (uint8_t storeType, const uint8_t * buf, size_t len, bool storeLeases = true); LeaseSet2 (uint8_t storeType, const uint8_t * buf, size_t len, bool storeLeases = true);
uint8_t GetStoreType () const { return m_StoreType; }; uint8_t GetStoreType () const { return m_StoreType; };
void Update (const uint8_t * buf, size_t len, bool verifySignature);
// implements RoutingDestination // implements RoutingDestination
void Encrypt (const uint8_t * data, uint8_t * encrypted, BN_CTX * ctx) const; void Encrypt (const uint8_t * data, uint8_t * encrypted, BN_CTX * ctx) const;

78
libi2pd/NetDb.cpp

@ -250,43 +250,40 @@ namespace data
return r; return r;
} }
bool NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, bool NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len)
std::shared_ptr<i2p::tunnel::InboundTunnel> from)
{ {
std::unique_lock<std::mutex> lock(m_LeaseSetsMutex); std::unique_lock<std::mutex> lock(m_LeaseSetsMutex);
bool updated = false; bool updated = false;
if (!from) // unsolicited LS must be received directly auto it = m_LeaseSets.find(ident);
if (it != m_LeaseSets.end () && it->second->GetStoreType () == i2p::data::NETDB_STORE_TYPE_LEASESET)
{ {
auto it = m_LeaseSets.find(ident); // we update only is existing LeaseSet is not LeaseSet2
if (it != m_LeaseSets.end ()) uint64_t expires;
if(LeaseSetBufferValidate(buf, len, expires))
{ {
uint64_t expires; if(it->second->GetExpirationTime() < expires)
if(LeaseSetBufferValidate(buf, len, expires))
{ {
if(it->second->GetExpirationTime() < expires) it->second->Update (buf, len, false); // signature is verified already
{ LogPrint (eLogInfo, "NetDb: LeaseSet updated: ", ident.ToBase32());
it->second->Update (buf, len, false); // signature is verified already updated = true;
LogPrint (eLogInfo, "NetDb: LeaseSet updated: ", ident.ToBase32());
updated = true;
}
else
LogPrint(eLogDebug, "NetDb: LeaseSet is older: ", ident.ToBase32());
} }
else else
LogPrint(eLogError, "NetDb: LeaseSet is invalid: ", ident.ToBase32()); LogPrint(eLogDebug, "NetDb: LeaseSet is older: ", ident.ToBase32());
} }
else else
LogPrint(eLogError, "NetDb: LeaseSet is invalid: ", ident.ToBase32());
}
else
{
auto leaseSet = std::make_shared<LeaseSet> (buf, len, false); // we don't need leases in netdb
if (leaseSet->IsValid ())
{ {
auto leaseSet = std::make_shared<LeaseSet> (buf, len, false); // we don't need leases in netdb LogPrint (eLogInfo, "NetDb: LeaseSet added: ", ident.ToBase32());
if (leaseSet->IsValid ()) m_LeaseSets[ident] = leaseSet;
{ updated = true;
LogPrint (eLogInfo, "NetDb: LeaseSet added: ", ident.ToBase32());
m_LeaseSets[ident] = leaseSet;
updated = true;
}
else
LogPrint (eLogError, "NetDb: new LeaseSet validation failed: ", ident.ToBase32());
} }
else
LogPrint (eLogError, "NetDb: new LeaseSet validation failed: ", ident.ToBase32());
} }
return updated; return updated;
} }
@ -294,14 +291,10 @@ namespace data
bool NetDb::AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType) bool NetDb::AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType)
{ {
std::unique_lock<std::mutex> lock(m_LeaseSetsMutex); std::unique_lock<std::mutex> lock(m_LeaseSetsMutex);
auto it = m_LeaseSets.find(ident); // always new LS2 for now. TODO: implement update
if (it == m_LeaseSets.end ()) auto leaseSet = std::make_shared<LeaseSet2> (storeType, buf, len, false); // we don't need leases in netdb
{ m_LeaseSets[ident] = leaseSet;
auto leaseSet = std::make_shared<LeaseSet2> (storeType, buf, len, false); // we don't need leases in netdb return true;
m_LeaseSets[ident] = leaseSet;
return true;
}
return false;
} }
std::shared_ptr<RouterInfo> NetDb::FindRouter (const IdentHash& ident) const std::shared_ptr<RouterInfo> NetDb::FindRouter (const IdentHash& ident) const
@ -661,15 +654,18 @@ namespace data
uint8_t storeType = buf[DATABASE_STORE_TYPE_OFFSET]; uint8_t storeType = buf[DATABASE_STORE_TYPE_OFFSET];
if (storeType) // LeaseSet or LeaseSet2 if (storeType) // LeaseSet or LeaseSet2
{ {
if (storeType == NETDB_STORE_TYPE_LEASESET) // 1 if (!m->from) // unsolicited LS must be received directly
{ {
LogPrint (eLogDebug, "NetDb: store request: LeaseSet for ", ident.ToBase32()); if (storeType == NETDB_STORE_TYPE_LEASESET) // 1
updated = AddLeaseSet (ident, buf + offset, len - offset, m->from); {
} LogPrint (eLogDebug, "NetDb: store request: LeaseSet for ", ident.ToBase32());
else // all others are considered as LeaseSet2 updated = AddLeaseSet (ident, buf + offset, len - offset);
{ }
LogPrint (eLogDebug, "NetDb: store request: LeaseSet2 of type ", storeType, " for ", ident.ToBase32()); else // all others are considered as LeaseSet2
updated = AddLeaseSet2 (ident, buf + offset, len - offset, storeType); {
LogPrint (eLogDebug, "NetDb: store request: LeaseSet2 of type ", storeType, " for ", ident.ToBase32());
updated = AddLeaseSet2 (ident, buf + offset, len - offset, storeType);
}
} }
} }
else // RouterInfo else // RouterInfo

2
libi2pd/NetDb.hpp

@ -54,7 +54,7 @@ namespace data
bool AddRouterInfo (const uint8_t * buf, int len); bool AddRouterInfo (const uint8_t * buf, int len);
bool AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len); bool AddRouterInfo (const IdentHash& ident, const uint8_t * buf, int len);
bool AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len, std::shared_ptr<i2p::tunnel::InboundTunnel> from); bool AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len);
bool AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType); bool AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType);
std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const; std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const;
std::shared_ptr<LeaseSet> FindLeaseSet (const IdentHash& destination) const; std::shared_ptr<LeaseSet> FindLeaseSet (const IdentHash& destination) const;

Loading…
Cancel
Save