diff --git a/AddressBook.h b/AddressBook.h new file mode 100644 index 00000000..6d134247 --- /dev/null +++ b/AddressBook.h @@ -0,0 +1,73 @@ +#ifndef ADDRESS_BOOK_H__ +#define ADDRESS_BOOK_H__ + +#include +#include +#include +#include "base64.h" +#include "util.h" +#include "Identity.h" +#include "Log.h" + +namespace i2p +{ +namespace data +{ + class AddressBook + { + public: + + AddressBook (): m_IsLoaded (false) {}; + + const IdentHash * 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; + } + + private: + + void 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 ()) + { + LogPrint ("hosts.txt not found"); + return; + } + int numAddresses = 0; + char str[1024]; + while (!f.eof ()) + { + f.getline (str, 1024); + char * key = strchr (str, '='); + if (key) + { + *key = 0; + key++; + Identity ident; + Base64ToByteStream (key, strlen(key), (uint8_t *)&ident, sizeof (ident)); + m_Addresses[str] = CalculateIdentHash (ident); + numAddresses++; + } + } + LogPrint (numAddresses, " addresses loaded"); + } + + private: + + std::map m_Addresses; + bool m_IsLoaded; + }; +} +} + +#endif + + diff --git a/NetDb.h b/NetDb.h index 39f87df0..96188513 100644 --- a/NetDb.h +++ b/NetDb.h @@ -12,6 +12,7 @@ #include "RouterInfo.h" #include "LeaseSet.h" #include "Tunnel.h" +#include "AddressBook.h" namespace i2p { @@ -104,6 +105,7 @@ namespace data int m_ReseedRetries; std::thread * m_Thread; i2p::util::Queue m_Queue; // of I2NPDatabaseStoreMsg + AddressBook m_AddressBook; static const char m_NetDbPath[]; }; diff --git a/util.cpp b/util.cpp index 262b6e25..ef4c2e86 100644 --- a/util.cpp +++ b/util.cpp @@ -121,6 +121,18 @@ namespace filesystem return path; } + std::string GetFullPath (const std::string& filename) + { + std::string fullPath = GetDataDir ().string (); +#ifndef _WIN32 + fullPath.append ("/"); +#else + fullPath.append ("\\"); +#endif + fullPath.append (filename); + return fullPath; + } + boost::filesystem::path GetConfigFile() { boost::filesystem::path pathConfigFile(i2p::util::config::GetArg("-conf", "i2p.conf")); diff --git a/util.h b/util.h index 519e51b3..6bd367e2 100644 --- a/util.h +++ b/util.h @@ -25,6 +25,7 @@ namespace util namespace filesystem { const boost::filesystem::path &GetDataDir(); + std::string GetFullPath (const std::string& filename); boost::filesystem::path GetDefaultDataDir(); boost::filesystem::path GetConfigFile(); void ReadConfigFile(std::map& mapSettingsRet,