From 30ffda770853aa475fd1b744502f101df19f43c0 Mon Sep 17 00:00:00 2001 From: orignal Date: Mon, 1 Sep 2014 17:34:20 -0400 Subject: [PATCH] introducers in local RouterInfo --- RouterContext.cpp | 16 +++++++++ RouterContext.h | 2 ++ RouterInfo.cpp | 89 ++++++++++++++++++++++++++++++++++++++++++++++- RouterInfo.h | 5 ++- 4 files changed, 110 insertions(+), 2 deletions(-) diff --git a/RouterContext.cpp b/RouterContext.cpp index 112fcc8e..5c77a6ad 100644 --- a/RouterContext.cpp +++ b/RouterContext.cpp @@ -80,6 +80,22 @@ namespace i2p UpdateRouterInfo (); } + void RouterContext::AddIntroducer (const i2p::data::RouterInfo& routerInfo, uint32_t tag) + { + auto address = routerInfo.GetSSUAddress (); + if (address) + { + if (m_RouterInfo.AddIntroducer (address, tag)) + UpdateRouterInfo (); + } + } + + void RouterContext::RemoveIntroducer (uint32_t tag) + { + if (m_RouterInfo.RemoveIntroducer (tag)) + UpdateRouterInfo (); + } + bool RouterContext::Load () { std::ifstream fk (i2p::util::filesystem::GetFullPath (ROUTER_KEYS).c_str (), std::ifstream::binary | std::ofstream::in); diff --git a/RouterContext.h b/RouterContext.h index f31c343c..fac68651 100644 --- a/RouterContext.h +++ b/RouterContext.h @@ -27,6 +27,8 @@ namespace i2p void OverrideNTCPAddress (const char * host, int port); // temporary void UpdateAddress (const char * host); // called from SSU + void AddIntroducer (const i2p::data::RouterInfo& routerInfo, uint32_t tag); + void RemoveIntroducer (uint32_t tag); // implements LocalDestination const i2p::data::PrivateKeys& GetPrivateKeys () const { return m_Keys; }; diff --git a/RouterInfo.cpp b/RouterInfo.cpp index c23495fe..30bca3e1 100644 --- a/RouterInfo.cpp +++ b/RouterInfo.cpp @@ -316,7 +316,50 @@ namespace data properties << ';'; if (address.transportStyle == eTransportSSU) { - // wtite intro key + // write introducers if any + if (address.introducers.size () > 0) + { + int i = 0; + for (auto introducer: address.introducers) + { + WriteString ("ihost" + boost::lexical_cast(i), properties); + properties << '='; + WriteString (introducer.iHost.to_string (), properties); + properties << ';'; + i++; + } + i = 0; + for (auto introducer: address.introducers) + { + WriteString ("ikey" + boost::lexical_cast(i), properties); + properties << '='; + char value[64]; + size_t l = ByteStreamToBase64 (introducer.iKey, 32, value, 64); + value[l] = 0; + WriteString (value, properties); + properties << ';'; + i++; + } + i = 0; + for (auto introducer: address.introducers) + { + WriteString ("iport" + boost::lexical_cast(i), properties); + properties << '='; + WriteString (boost::lexical_cast(introducer.iPort), properties); + properties << ';'; + i++; + } + i = 0; + for (auto introducer: address.introducers) + { + WriteString ("itag" + boost::lexical_cast(i), properties); + properties << '='; + WriteString (boost::lexical_cast(introducer.iTag), properties); + properties << ';'; + i++; + } + } + // write intro key WriteString ("key", properties); properties << '='; char value[64]; @@ -431,6 +474,50 @@ namespace data m_Caps |= eSSUTesting; m_Caps |= eSSUIntroducer; } + + bool RouterInfo::AddIntroducer (const Address * address, uint32_t tag) + { + for (auto& addr : m_Addresses) + { + if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ()) + { + for (auto intro: addr.introducers) + if (intro.iTag == tag) return false; // already presented + Introducer x; + x.iHost = address->host; + x.iPort = address->port; + x.iTag = tag; + memcpy (x.iKey, address->key, 32); // TODO: replace to Tag<32> + addr.introducers.push_back (x); + return true; + } + } + return false; + } + + bool RouterInfo::RemoveIntroducer (uint32_t tag) + { + for (auto& addr : m_Addresses) + { + if (addr.transportStyle == eTransportSSU && addr.host.is_v4 ()) + { + for (std::vector::iterator it = addr.introducers.begin (); it != addr.introducers.begin (); it++) + if (it->iTag == tag) + { + addr.introducers.erase (it); + return true; + } + } + } + return false; + } + + void RouterInfo::SetCaps (const char * caps) + { + SetProperty ("caps", caps); + m_Caps = 0; + ExtractCaps (caps); + } void RouterInfo::SetProperty (const char * key, const char * value) { diff --git a/RouterInfo.h b/RouterInfo.h index f1505395..1007f7fa 100644 --- a/RouterInfo.h +++ b/RouterInfo.h @@ -83,6 +83,8 @@ namespace data void AddNTCPAddress (const char * host, int port); void AddSSUAddress (const char * host, int port, const uint8_t * key); + bool AddIntroducer (const Address * address, uint32_t tag); + bool RemoveIntroducer (uint32_t tag); void SetProperty (const char * key, const char * value); const char * GetProperty (const char * key) const; bool IsFloodfill () const; @@ -94,7 +96,8 @@ namespace data bool IsPeerTesting () const { return m_Caps & eSSUTesting; }; bool IsHidden () const { return m_Caps & eHidden; }; - uint8_t GetCaps () const { return m_Caps; }; + uint8_t GetCaps () const { return m_Caps; }; + void SetCaps (const char * caps); void SetUnreachable (bool unreachable) { m_IsUnreachable = unreachable; }; bool IsUnreachable () const { return m_IsUnreachable; };