mirror of
				https://github.com/PurpleI2P/i2pd.git
				synced 2025-11-04 08:30:46 +00:00 
			
		
		
		
	re-create LeaseSet if store type has changed
This commit is contained in:
		
							parent
							
								
									468a32a819
								
							
						
					
					
						commit
						65c2c7d80b
					
				
					 4 changed files with 52 additions and 48 deletions
				
			
		| 
						 | 
				
			
			@ -260,6 +260,13 @@ namespace data
 | 
			
		|||
			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)
 | 
			
		||||
	{
 | 
			
		||||
		// standard LS2 header
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -60,7 +60,7 @@ namespace data
 | 
			
		|||
 | 
			
		||||
			LeaseSet (const uint8_t * buf, size_t len, bool storeLeases = true);
 | 
			
		||||
			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;
 | 
			
		||||
			void PopulateLeases (); // from buffer
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -128,6 +128,7 @@ namespace data
 | 
			
		|||
 | 
			
		||||
			LeaseSet2 (uint8_t storeType, const uint8_t * buf, size_t len,  bool storeLeases = true);
 | 
			
		||||
			uint8_t GetStoreType () const { return m_StoreType; };
 | 
			
		||||
			void Update (const uint8_t * buf, size_t len, bool verifySignature);
 | 
			
		||||
			
 | 
			
		||||
			// implements RoutingDestination
 | 
			
		||||
			void Encrypt (const uint8_t * data, uint8_t * encrypted, BN_CTX * ctx) const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -250,43 +250,40 @@ namespace data
 | 
			
		|||
		return r;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	bool NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len,
 | 
			
		||||
		std::shared_ptr<i2p::tunnel::InboundTunnel> from)
 | 
			
		||||
	bool NetDb::AddLeaseSet (const IdentHash& ident, const uint8_t * buf, int len)
 | 
			
		||||
	{
 | 
			
		||||
		std::unique_lock<std::mutex> lock(m_LeaseSetsMutex);
 | 
			
		||||
		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);
 | 
			
		||||
			if (it != m_LeaseSets.end ())
 | 
			
		||||
			// we update only is existing LeaseSet is not LeaseSet2
 | 
			
		||||
			uint64_t expires;
 | 
			
		||||
			if(LeaseSetBufferValidate(buf, len, expires))
 | 
			
		||||
			{
 | 
			
		||||
				uint64_t expires;
 | 
			
		||||
				if(LeaseSetBufferValidate(buf, len, expires))
 | 
			
		||||
				if(it->second->GetExpirationTime() < expires)
 | 
			
		||||
				{
 | 
			
		||||
					if(it->second->GetExpirationTime() < expires)
 | 
			
		||||
					{
 | 
			
		||||
						it->second->Update (buf, len, false); // signature is verified already
 | 
			
		||||
						LogPrint (eLogInfo, "NetDb: LeaseSet updated: ", ident.ToBase32());
 | 
			
		||||
						updated = true;
 | 
			
		||||
					}
 | 
			
		||||
					else
 | 
			
		||||
						LogPrint(eLogDebug, "NetDb: LeaseSet is older: ", ident.ToBase32());
 | 
			
		||||
				}
 | 
			
		||||
				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 ())
 | 
			
		||||
				{
 | 
			
		||||
					LogPrint (eLogInfo, "NetDb: LeaseSet added: ", ident.ToBase32());
 | 
			
		||||
					m_LeaseSets[ident] = leaseSet;
 | 
			
		||||
					it->second->Update (buf, len, false); // signature is verified already
 | 
			
		||||
					LogPrint (eLogInfo, "NetDb: LeaseSet updated: ", ident.ToBase32());
 | 
			
		||||
					updated = true;
 | 
			
		||||
				}
 | 
			
		||||
				else
 | 
			
		||||
					LogPrint (eLogError, "NetDb: new LeaseSet validation failed: ", ident.ToBase32());
 | 
			
		||||
					LogPrint(eLogDebug, "NetDb: LeaseSet is older: ", ident.ToBase32());
 | 
			
		||||
			}
 | 
			
		||||
			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 ())
 | 
			
		||||
			{
 | 
			
		||||
				LogPrint (eLogInfo, "NetDb: LeaseSet added: ", ident.ToBase32());
 | 
			
		||||
				m_LeaseSets[ident] = leaseSet;
 | 
			
		||||
				updated = true;
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
				LogPrint (eLogError, "NetDb: new LeaseSet validation failed: ", ident.ToBase32());
 | 
			
		||||
		}
 | 
			
		||||
		return updated;
 | 
			
		||||
	}
 | 
			
		||||
| 
						 | 
				
			
			@ -294,14 +291,10 @@ namespace data
 | 
			
		|||
	bool NetDb::AddLeaseSet2 (const IdentHash& ident, const uint8_t * buf, int len, uint8_t storeType)
 | 
			
		||||
	{
 | 
			
		||||
		std::unique_lock<std::mutex> lock(m_LeaseSetsMutex);
 | 
			
		||||
		auto it = m_LeaseSets.find(ident);
 | 
			
		||||
		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;
 | 
			
		||||
			return true; 
 | 
			
		||||
		}
 | 
			
		||||
		return false;
 | 
			
		||||
		// always new LS2 for now. TODO: implement update
 | 
			
		||||
		auto leaseSet = std::make_shared<LeaseSet2> (storeType, buf, len, false); // we don't need leases in netdb
 | 
			
		||||
		m_LeaseSets[ident] = leaseSet;
 | 
			
		||||
		return true; 
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::shared_ptr<RouterInfo> NetDb::FindRouter (const IdentHash& ident) const
 | 
			
		||||
| 
						 | 
				
			
			@ -661,15 +654,18 @@ namespace data
 | 
			
		|||
		uint8_t storeType = buf[DATABASE_STORE_TYPE_OFFSET];	
 | 
			
		||||
		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());
 | 
			
		||||
				updated = AddLeaseSet (ident, buf + offset, len - offset, m->from);
 | 
			
		||||
			}
 | 
			
		||||
			else // all others are considered as LeaseSet2 
 | 
			
		||||
			{
 | 
			
		||||
				LogPrint (eLogDebug, "NetDb: store request: LeaseSet2 of type ", storeType, " for ", ident.ToBase32());
 | 
			
		||||
				updated = AddLeaseSet2 (ident, buf + offset, len - offset, storeType);
 | 
			
		||||
				if (storeType == NETDB_STORE_TYPE_LEASESET) // 1
 | 
			
		||||
				{
 | 
			
		||||
					LogPrint (eLogDebug, "NetDb: store request: LeaseSet for ", ident.ToBase32());
 | 
			
		||||
					updated = AddLeaseSet (ident, buf + offset, len - offset);
 | 
			
		||||
				}
 | 
			
		||||
				else // all others are considered as LeaseSet2 
 | 
			
		||||
				{
 | 
			
		||||
					LogPrint (eLogDebug, "NetDb: store request: LeaseSet2 of type ", storeType, " for ", ident.ToBase32());
 | 
			
		||||
					updated = AddLeaseSet2 (ident, buf + offset, len - offset, storeType);
 | 
			
		||||
				}
 | 
			
		||||
			}	
 | 
			
		||||
		}
 | 
			
		||||
		else // RouterInfo
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,7 +54,7 @@ namespace data
 | 
			
		|||
 | 
			
		||||
			bool AddRouterInfo (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);
 | 
			
		||||
			std::shared_ptr<RouterInfo> FindRouter (const IdentHash& ident) const;
 | 
			
		||||
			std::shared_ptr<LeaseSet> FindLeaseSet (const IdentHash& destination) const;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue