From 659177e2fd9e128670c60235ef3621df3223c104 Mon Sep 17 00:00:00 2001 From: orignal Date: Tue, 14 Jan 2014 20:57:33 -0500 Subject: [PATCH] check expiration of lease --- HTTPServer.cpp | 12 +++++++++--- LeaseSet.cpp | 29 ++++++++++++++++++++++++++++- LeaseSet.h | 3 +++ Streaming.cpp | 15 ++++++++++++--- 4 files changed, 52 insertions(+), 7 deletions(-) diff --git a/HTTPServer.cpp b/HTTPServer.cpp index 58c5391d..80ddd456 100644 --- a/HTTPServer.cpp +++ b/HTTPServer.cpp @@ -149,14 +149,14 @@ namespace util uint8_t destination[32]; i2p::data::Base32ToByteStream (b32.c_str (), b32.length (), destination, 32); auto leaseSet = i2p::data::netdb.FindLeaseSet (destination); - if (!leaseSet) + if (!leaseSet || !leaseSet->HasNonExpiredLeases ()) { i2p::data::netdb.RequestDestination (i2p::data::IdentHash (destination), true); std::this_thread::sleep_for (std::chrono::seconds(10)); // wait for 10 seconds leaseSet = i2p::data::netdb.FindLeaseSet (destination); - if (!leaseSet) // still no LeaseSet + if (!leaseSet || !leaseSet->HasNonExpiredLeases ()) // still no LeaseSet { - m_Reply.content = "LeaseSet not found"; + m_Reply.content = leaseSet ? "Leases expired" : "LeaseSet not found"; m_Reply.headers.resize(2); m_Reply.headers[0].name = "Content-Length"; m_Reply.headers[0].value = boost::lexical_cast(m_Reply.content.size()); @@ -166,6 +166,12 @@ namespace util } } // we found LeaseSet + if (leaseSet->HasExpiredLeases ()) + { + // we should re-request LeaseSet + LogPrint ("LeaseSet re-requested"); + i2p::data::netdb.RequestDestination (i2p::data::IdentHash (destination), true); + } auto s = i2p::stream::CreateStream (leaseSet); if (s) { diff --git a/LeaseSet.cpp b/LeaseSet.cpp index c948c343..9c7585a2 100644 --- a/LeaseSet.cpp +++ b/LeaseSet.cpp @@ -1,8 +1,9 @@ +#include "I2PEndian.h" #include #include "CryptoConst.h" #include "Log.h" +#include "Timestamp.h" #include "LeaseSet.h" -#include "I2PEndian.h" namespace i2p { @@ -44,5 +45,31 @@ namespace data if (!verifier.VerifyMessage (buf, leases - buf, leases, 40)) LogPrint ("LeaseSet verification failed"); } + + std::vector LeaseSet::GetNonExpiredLeases () const + { + auto ts = i2p::util::GetMillisecondsSinceEpoch (); + std::vector leases; + for (auto& it: m_Leases) + if (ts < it.endDate) + leases.push_back (it); + return leases; + } + + bool LeaseSet::HasExpiredLeases () const + { + auto ts = i2p::util::GetMillisecondsSinceEpoch (); + for (auto& it: m_Leases) + if (ts >= it.endDate) return true; + return false; + } + + bool LeaseSet::HasNonExpiredLeases () const + { + auto ts = i2p::util::GetMillisecondsSinceEpoch (); + for (auto& it: m_Leases) + if (ts < it.endDate) return true; + return false; + } } } diff --git a/LeaseSet.h b/LeaseSet.h index fababcf0..294e32d0 100644 --- a/LeaseSet.h +++ b/LeaseSet.h @@ -34,6 +34,9 @@ namespace data const Identity& GetIdentity () const { return m_Identity; }; const IdentHash& GetIdentHash () const { return m_IdentHash; }; const std::vector& GetLeases () const { return m_Leases; }; + std::vector GetNonExpiredLeases () const; + bool HasExpiredLeases () const; + bool HasNonExpiredLeases () const; const uint8_t * GetEncryptionPublicKey () const { return m_EncryptionKey; }; bool IsDestination () const { return true; }; diff --git a/Streaming.cpp b/Streaming.cpp index a22d1cd0..1acbad79 100644 --- a/Streaming.cpp +++ b/Streaming.cpp @@ -170,9 +170,18 @@ namespace stream CreateDataMessage (this, packet, size)); if (m_OutboundTunnel) { - auto& lease = m_RemoteLeaseSet->GetLeases ()[0]; // TODO: - m_OutboundTunnel->SendTunnelDataMsg (lease.tunnelGateway, lease.tunnelID, msg); - LogPrint ("Quick Ack sent"); + auto leases = m_RemoteLeaseSet->GetNonExpiredLeases (); + if (!leases.empty ()) + { + auto& lease = leases[0]; // TODO: + m_OutboundTunnel->SendTunnelDataMsg (lease.tunnelGateway, lease.tunnelID, msg); + LogPrint ("Quick Ack sent"); + } + else + { + LogPrint ("All leases are expired"); + DeleteI2NPMessage (msg); + } } else DeleteI2NPMessage (msg);