diff --git a/AddressBook.cpp b/AddressBook.cpp index 5fe7d0f3..ce0873fd 100644 --- a/AddressBook.cpp +++ b/AddressBook.cpp @@ -340,12 +340,12 @@ namespace client std::ifstream f (i2p::fs::DataDirPath("hosts.txt"), std::ifstream::in); // in text mode if (f.is_open ()) { - LoadHostsFromStream (f); + LoadHostsFromStream (f, false); m_IsLoaded = true; } } - bool AddressBook::LoadHostsFromStream (std::istream& f) + bool AddressBook::LoadHostsFromStream (std::istream& f, bool is_update) { std::unique_lock l(m_AddressBookMutex); int numAddresses = 0; @@ -366,17 +366,18 @@ namespace client std::string addr = s.substr(pos); auto ident = std::make_shared (); - if (ident->FromBase64(addr)) - { - m_Addresses[name] = ident->GetIdentHash (); - m_Storage->AddAddress (ident); - numAddresses++; - } - else - { + if (!ident->FromBase64(addr)) { LogPrint (eLogError, "Addressbook: malformed address ", addr, " for ", name); incomplete = f.eof (); + continue; } + numAddresses++; + if (m_Addresses.count(name) > 0) + continue; /* already exists */ + m_Addresses[name] = ident->GetIdentHash (); + m_Storage->AddAddress (ident); + if (is_update) + LogPrint(eLogInfo, "Addressbook: added new host: ", name); } else incomplete = f.eof (); @@ -776,7 +777,7 @@ namespace client } std::stringstream ss(response); LogPrint (eLogInfo, "Addressbook: got update from ", dest_host); - m_Book.LoadHostsFromStream (ss); + m_Book.LoadHostsFromStream (ss, true); return true; } diff --git a/AddressBook.h b/AddressBook.h index 514187fc..fd852907 100644 --- a/AddressBook.h +++ b/AddressBook.h @@ -70,7 +70,7 @@ namespace client void InsertAddress (const std::string& address, const std::string& base64); // for jump service void InsertAddress (std::shared_ptr address); - bool LoadHostsFromStream (std::istream& f); + bool LoadHostsFromStream (std::istream& f, bool is_update); void DownloadComplete (bool success, const i2p::data::IdentHash& subscription, const std::string& etag, const std::string& lastModified); //This method returns the ".b32.i2p" address std::string ToAddress(const i2p::data::IdentHash& ident) { return GetB32Address(ident); }