diff --git a/libi2pd/LeaseSet.cpp b/libi2pd/LeaseSet.cpp index de38d568..d4141660 100644 --- a/libi2pd/LeaseSet.cpp +++ b/libi2pd/LeaseSet.cpp @@ -251,7 +251,7 @@ namespace data } LeaseSet2::LeaseSet2 (uint8_t storeType, const uint8_t * buf, size_t len, bool storeLeases): - LeaseSet (storeLeases), m_StoreType (storeType) + LeaseSet (storeLeases), m_StoreType (storeType), m_PublishedTimestamp (0) { SetBuffer (buf, len); if (storeType == NETDB_STORE_TYPE_ENCRYPTED_LEASESET2) @@ -281,9 +281,9 @@ namespace data identity = GetIdentity (); size_t offset = identity->GetFullLen (); if (offset + 8 >= len) return; - uint32_t timestamp = bufbe32toh (buf + offset); offset += 4; // published timestamp (seconds) + m_PublishedTimestamp = bufbe32toh (buf + offset); offset += 4; // published timestamp (seconds) uint16_t expires = bufbe16toh (buf + offset); offset += 2; // expires (seconds) - SetExpirationTime ((timestamp + expires)*1000LL); // in milliseconds + SetExpirationTime ((m_PublishedTimestamp + expires)*1000LL); // in milliseconds uint16_t flags = bufbe16toh (buf + offset); offset += 2; // flags if (flags & LEASESET2_FLAG_OFFLINE_KEYS) { @@ -427,9 +427,9 @@ namespace data blindedVerifier->SetPublicKey (buf + offset); offset += blindedKeyLen; // expiration if (offset + 8 >= len) return; - uint32_t timestamp = bufbe32toh (buf + offset); offset += 4; // published timestamp (seconds) + m_PublishedTimestamp = bufbe32toh (buf + offset); offset += 4; // published timestamp (seconds) uint16_t expires = bufbe16toh (buf + offset); offset += 2; // expires (seconds) - SetExpirationTime ((timestamp + expires)*1000LL); // in milliseconds + SetExpirationTime ((m_PublishedTimestamp + expires)*1000LL); // in milliseconds uint16_t flags = bufbe16toh (buf + offset); offset += 2; // flags if (flags & LEASESET2_FLAG_OFFLINE_KEYS) { diff --git a/libi2pd/LeaseSet.h b/libi2pd/LeaseSet.h index 44ee873c..5791b5f1 100644 --- a/libi2pd/LeaseSet.h +++ b/libi2pd/LeaseSet.h @@ -78,6 +78,7 @@ namespace data bool operator== (const LeaseSet& other) const { return m_BufferLen == other.m_BufferLen && !memcmp (m_Buffer, other.m_Buffer, m_BufferLen); }; virtual uint8_t GetStoreType () const { return NETDB_STORE_TYPE_LEASESET; }; + virtual uint32_t GetPublishedTimestamp () const { return 0; }; // should be set for LeaseSet2 only virtual std::shared_ptr GetTransientVerifier () const { return nullptr; }; // implements RoutingDestination @@ -133,6 +134,7 @@ namespace data LeaseSet2 (uint8_t storeType, const uint8_t * buf, size_t len, bool storeLeases = true); uint8_t GetStoreType () const { return m_StoreType; }; + uint32_t GetPublishedTimestamp () const { return m_PublishedTimestamp; }; std::shared_ptr GetTransientVerifier () const { return m_TransientVerifier; }; void Update (const uint8_t * buf, size_t len, bool verifySignature); @@ -154,6 +156,7 @@ namespace data private: uint8_t m_StoreType; + uint32_t m_PublishedTimestamp; std::shared_ptr m_TransientVerifier; std::shared_ptr m_Encryptor; // for standardLS2 }; diff --git a/libi2pd/NetDb.cpp b/libi2pd/NetDb.cpp index 9d858d91..e3d3a509 100644 --- a/libi2pd/NetDb.cpp +++ b/libi2pd/NetDb.cpp @@ -300,10 +300,22 @@ namespace data bool NetDb::AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType) { std::unique_lock lock(m_LeaseSetsMutex); - // always new LS2 for now. TODO: implement update auto leaseSet = std::make_shared (storeType, buf, len, false); // we don't need leases in netdb - m_LeaseSets[ident] = leaseSet; - return true; + if (leaseSet->IsValid ()) + { + auto it = m_LeaseSets.find(ident); + if (it == m_LeaseSets.end () || it->second->GetStoreType () == i2p::data::NETDB_STORE_TYPE_LEASESET || + leaseSet->GetPublishedTimestamp () > it->second->GetPublishedTimestamp ()) + { + // TODO: implement actual update + LogPrint (eLogInfo, "NetDb: LeaseSet2 updated: ", ident.ToBase32()); + m_LeaseSets[ident] = leaseSet; + return true; + } + } + else + LogPrint (eLogError, "NetDb: new LeaseSet2 validation failed: ", ident.ToBase32()); + return false; } std::shared_ptr NetDb::FindRouter (const IdentHash& ident) const