From fcb45a778b32a15d11439ce009c386b04b578777 Mon Sep 17 00:00:00 2001 From: orignal Date: Thu, 14 Aug 2014 14:32:00 -0400 Subject: [PATCH] try to find destination at every connect attempt --- AddressBook.cpp | 135 +++++++++++++++++++++++++----------------------- AddressBook.h | 2 +- I2PTunnel.cpp | 24 +++++++-- 3 files changed, 91 insertions(+), 70 deletions(-) diff --git a/AddressBook.cpp b/AddressBook.cpp index b508e01e..a61cc96c 100644 --- a/AddressBook.cpp +++ b/AddressBook.cpp @@ -14,87 +14,92 @@ namespace i2p namespace data { -AddressBook::AddressBook (): m_IsLoaded (false) -{ -} - - -const IdentHash * AddressBook::FindAddress (const std::string& address) -{ - if (!m_IsLoaded) - LoadHosts (); - auto it = m_Addresses.find (address); - if (it != m_Addresses.end ()) - return &it->second; - else - return nullptr; -} - -void AddressBook::LoadHostsFromI2P () -{ - std::string content; - while (true) + AddressBook::AddressBook (): m_IsLoaded (false), m_IsDowloading (false) { - // TODO: hosts link in config - int http_code = i2p::util::http::httpRequestViaI2pProxy("http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt", content); - if (http_code ==200) - if (!boost::starts_with(content, "") && !content.empty()) // TODO: test and remove - break; - std::this_thread::sleep_for(std::chrono::seconds(5)); } - std::ofstream f_save(i2p::util::filesystem::GetFullPath("hosts.txt").c_str(), std::ofstream::out); - if (f_save.is_open()) + + const IdentHash * AddressBook::FindAddress (const std::string& address) { - f_save << content; - f_save.close(); + if (!m_IsLoaded) + LoadHosts (); + if (m_IsLoaded) + { + auto it = m_Addresses.find (address); + if (it != m_Addresses.end ()) + return &it->second; + } + return nullptr; } - else - LogPrint("Can't write hosts.txt"); - m_IsLoaded = false; - return; -} -void AddressBook::LoadHosts () -{ - m_IsLoaded = true; - std::ifstream f (i2p::util::filesystem::GetFullPath ("hosts.txt").c_str (), std::ofstream::in); // in text mode - if (!f.is_open ()) + void AddressBook::LoadHostsFromI2P () { - LogPrint ("hosts.txt not found. Try to load..."); - std::thread load_hosts(&AddressBook::LoadHostsFromI2P, this); - load_hosts.detach(); + std::string content; + int http_code = i2p::util::http::httpRequestViaI2pProxy("http://udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/hosts.txt", content); + if (http_code == 200) + { + std::ofstream f_save(i2p::util::filesystem::GetFullPath("hosts.txt").c_str(), std::ofstream::out); + if (f_save.is_open()) + { + f_save << content; + f_save.close(); + } + else + LogPrint("Can't write hosts.txt"); + m_IsLoaded = false; + } + else + LogPrint ("Failed to download hosts.txt"); + m_IsDowloading = false; + return; } - int numAddresses = 0; - - std::string s; - while (!f.eof ()) + void AddressBook::LoadHosts () { - getline(f, s); - - if (!s.length()) - continue; // skip empty line + std::ifstream f (i2p::util::filesystem::GetFullPath ("hosts.txt").c_str (), std::ofstream::in); // in text mode + if (!f.is_open ()) + { + LogPrint ("hosts.txt not found. Try to load..."); + if (!m_IsDowloading) + { + m_IsDowloading = true; + std::thread load_hosts(&AddressBook::LoadHostsFromI2P, this); + load_hosts.detach(); + } + return; + } + int numAddresses = 0; - size_t pos = s.find('='); + std::string s; - if (pos != std::string::npos) + while (!f.eof ()) { - std::string name = s.substr(0, pos++); - std::string addr = s.substr(pos); + getline(f, s); - Identity ident; - if (!ident.FromBase64(addr)) { - LogPrint ("hosts.txt: ignore ", name); - continue; - } - m_Addresses[name] = ident.Hash(); - numAddresses++; - } + if (!s.length()) + continue; // skip empty line + + size_t pos = s.find('='); + + if (pos != std::string::npos) + { + std::string name = s.substr(0, pos++); + std::string addr = s.substr(pos); + + Identity ident; + if (!ident.FromBase64(addr)) + { + LogPrint ("hosts.txt: ignore ", name); + continue; + } + m_Addresses[name] = ident.Hash(); + numAddresses++; + } + } + LogPrint (numAddresses, " addresses loaded"); + m_IsLoaded = true; } - LogPrint (numAddresses, " addresses loaded"); -} } } diff --git a/AddressBook.h b/AddressBook.h index 90ea94fc..c5a0a48a 100644 --- a/AddressBook.h +++ b/AddressBook.h @@ -26,7 +26,7 @@ namespace data void LoadHostsFromI2P (); std::map m_Addresses; - bool m_IsLoaded; + bool m_IsLoaded, m_IsDowloading; }; } } diff --git a/I2PTunnel.cpp b/I2PTunnel.cpp index bc3fe900..ae1b4d95 100644 --- a/I2PTunnel.cpp +++ b/I2PTunnel.cpp @@ -131,7 +131,6 @@ namespace stream for (auto it: m_Connections) delete it; m_Connections.clear (); - delete m_DestinationIdentHash; m_DestinationIdentHash = nullptr; } @@ -146,16 +145,33 @@ namespace stream { if (!ecode) { - if (!m_RemoteLeaseSet && m_DestinationIdentHash) - m_RemoteLeaseSet = i2p::data::netdb.FindLeaseSet (*m_DestinationIdentHash); - if (m_RemoteLeaseSet) + if (!m_RemoteLeaseSet) + { + // try to get it + if (m_DestinationIdentHash) + m_RemoteLeaseSet = i2p::data::netdb.FindLeaseSet (*m_DestinationIdentHash); + else + { + auto identHash = i2p::data::netdb.FindAddress (m_Destination); + if (identHash) + { + m_DestinationIdentHash = new i2p::data::IdentHash (*identHash); + i2p::data::netdb.Subscribe (*m_DestinationIdentHash); + } + } + } + + if (m_RemoteLeaseSet) // leaseSet found { LogPrint ("New I2PTunnel connection"); auto connection = new I2PTunnelConnection (socket, m_RemoteLeaseSet); m_Connections.insert (connection); } else + { + LogPrint ("LeaseSet for I2PTunnel destination not found"); delete socket; + } Accept (); } else