From 54071b0e5dbc3b3296f64a6ed98f372945db477f Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 16 Jul 2019 11:48:30 -0400 Subject: [PATCH] set and handle unpublished LeaseSet flag --- libi2pd/Destination.cpp | 2 +- libi2pd/Destination.h | 1 + libi2pd/LeaseSet.cpp | 4 +++- libi2pd/LeaseSet.h | 7 +++++-- libi2pd/NetDb.cpp | 16 ++++++++++++---- 5 files changed, 22 insertions(+), 8 deletions(-) diff --git a/libi2pd/Destination.cpp b/libi2pd/Destination.cpp index ef7c7d21..ea884aa4 100644 --- a/libi2pd/Destination.cpp +++ b/libi2pd/Destination.cpp @@ -1147,7 +1147,7 @@ namespace client // standard LS2 (type 3) first auto keyLen = m_Decryptor ? m_Decryptor->GetPublicKeyLen () : 256; auto ls2 = std::make_shared (i2p::data::NETDB_STORE_TYPE_STANDARD_LEASESET2, - m_Keys, m_EncryptionKeyType, keyLen, m_EncryptionPublicKey, tunnels); + m_Keys, m_EncryptionKeyType, keyLen, m_EncryptionPublicKey, tunnels, IsPublic ()); if (GetLeaseSetType () == i2p::data::NETDB_STORE_TYPE_ENCRYPTED_LEASESET2) // encrypt if type 5 ls2 = std::make_shared (ls2, m_Keys); leaseSet = ls2; diff --git a/libi2pd/Destination.h b/libi2pd/Destination.h index 25f2f1c1..dcbe9768 100644 --- a/libi2pd/Destination.h +++ b/libi2pd/Destination.h @@ -134,6 +134,7 @@ namespace client void SetLeaseSet (std::shared_ptr newLeaseSet); int GetLeaseSetType () const { return m_LeaseSetType; }; void SetLeaseSetType (int leaseSetType) { m_LeaseSetType = leaseSetType; }; + bool IsPublic () const { return m_IsPublic; }; virtual void CleanupDestination () {}; // additional clean up in derived classes // I2CP virtual void HandleDataMessage (const uint8_t * buf, size_t len) = 0; diff --git a/libi2pd/LeaseSet.cpp b/libi2pd/LeaseSet.cpp index d0eafd1d..bd2fca75 100644 --- a/libi2pd/LeaseSet.cpp +++ b/libi2pd/LeaseSet.cpp @@ -302,6 +302,7 @@ namespace data return; } } + if (flags & LEASESET2_FLAG_UNPUBLISHED_LEASESET) m_IsPublic = false; // type specific part size_t s = 0; switch (m_StoreType) @@ -741,7 +742,7 @@ namespace data LocalLeaseSet2::LocalLeaseSet2 (uint8_t storeType, const i2p::data::PrivateKeys& keys, uint16_t keyType, uint16_t keyLen, const uint8_t * encryptionPublicKey, - std::vector > tunnels): + std::vector > tunnels, bool isPublic): LocalLeaseSet (keys.GetPublic (), nullptr, 0) { auto identity = keys.GetPublic (); @@ -756,6 +757,7 @@ namespace data flags |= LEASESET2_FLAG_OFFLINE_KEYS; m_BufferLen += keys.GetOfflineSignature ().size (); } + if (!isPublic) flags |= LEASESET2_FLAG_UNPUBLISHED_LEASESET; m_Buffer = new uint8_t[m_BufferLen + 1]; m_Buffer[0] = storeType; diff --git a/libi2pd/LeaseSet.h b/libi2pd/LeaseSet.h index c2b88da6..03e0e543 100644 --- a/libi2pd/LeaseSet.h +++ b/libi2pd/LeaseSet.h @@ -129,7 +129,8 @@ namespace data const uint8_t NETDB_STORE_TYPE_META_LEASESET2 = 7; const uint16_t LEASESET2_FLAG_OFFLINE_KEYS = 0x0001; - + const uint16_t LEASESET2_FLAG_UNPUBLISHED_LEASESET = 0x0002; + class LeaseSet2: public LeaseSet { public: @@ -139,6 +140,7 @@ namespace data uint8_t GetStoreType () const { return m_StoreType; }; uint8_t GetOrigStoreType () const { return m_OrigStoreType; }; uint32_t GetPublishedTimestamp () const { return m_PublishedTimestamp; }; + bool IsPublic () const { return m_IsPublic; }; std::shared_ptr GetTransientVerifier () const { return m_TransientVerifier; }; void Update (const uint8_t * buf, size_t len, bool verifySignature); @@ -162,6 +164,7 @@ namespace data uint8_t m_StoreType, m_OrigStoreType; uint32_t m_PublishedTimestamp = 0; + bool m_IsPublic = true; std::shared_ptr m_TransientVerifier; std::shared_ptr m_Encryptor; // for standardLS2 }; @@ -227,7 +230,7 @@ namespace data LocalLeaseSet2 (uint8_t storeType, const i2p::data::PrivateKeys& keys, uint16_t keyType, uint16_t keyLen, const uint8_t * encryptionPublicKey, - std::vector > tunnels); + std::vector > tunnels, bool isPublic); LocalLeaseSet2 (uint8_t storeType, std::shared_ptr identity, const uint8_t * buf, size_t len); // from I2CP virtual ~LocalLeaseSet2 () { delete[] m_Buffer; }; diff --git a/libi2pd/NetDb.cpp b/libi2pd/NetDb.cpp index b7479744..4461c094 100644 --- a/libi2pd/NetDb.cpp +++ b/libi2pd/NetDb.cpp @@ -307,10 +307,18 @@ namespace data if (it == m_LeaseSets.end () || it->second->GetStoreType () != storeType || leaseSet->GetPublishedTimestamp () > it->second->GetPublishedTimestamp ()) { - // TODO: implement actual update - LogPrint (eLogInfo, "NetDb: LeaseSet2 updated: ", ident.ToBase32()); - m_LeaseSets[ident] = leaseSet; - return true; + if (leaseSet->IsPublic ()) + { + // TODO: implement actual update + LogPrint (eLogInfo, "NetDb: LeaseSet2 updated: ", ident.ToBase32()); + m_LeaseSets[ident] = leaseSet; + return true; + } + else + { + LogPrint (eLogWarning, "NetDb: Unpublished LeaseSet2 received: ", ident.ToBase32()); + m_LeaseSets.erase (ident); + } } } else