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);
 | 
								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
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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,7 +128,8 @@ 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;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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
 | 
					 | 
				
			||||||
						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;
 | 
					 | 
				
			||||||
					updated = true;
 | 
										updated = true;
 | 
				
			||||||
				}
 | 
									}
 | 
				
			||||||
				else
 | 
									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;
 | 
							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,16 +654,19 @@ 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
 | 
				
			||||||
		{
 | 
							{
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -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…
	
	Add table
		Add a link
		
	
		Reference in a new issue