From 69f9e0a64fab93eedf171fb4c1c6e84beaaefed9 Mon Sep 17 00:00:00 2001
From: l-n-s <l-n-s@sigaint.org>
Date: Tue, 11 Oct 2016 15:14:20 +0000
Subject: [PATCH] Add addressbook.subscriptions option + delete default
 subscription constant + improved docs

---
 AddressBook.cpp       | 32 +++++++++++++++++---------------
 AddressBook.h         |  6 ------
 Config.cpp            |  7 +++++++
 docs/configuration.md |  1 +
 docs/i2pd.conf        | 12 ++++++++++--
 docs/index.rst        |  2 ++
 6 files changed, 37 insertions(+), 23 deletions(-)

diff --git a/AddressBook.cpp b/AddressBook.cpp
index b993f456..705d4e6f 100644
--- a/AddressBook.cpp
+++ b/AddressBook.cpp
@@ -6,6 +6,7 @@
 #include <chrono>
 #include <condition_variable>
 #include <openssl/rand.h>
+#include <boost/algorithm/string.hpp>
 #include "Base.h"
 #include "util.h"
 #include "Identity.h"
@@ -15,6 +16,7 @@
 #include "NetDb.h"
 #include "ClientContext.h"
 #include "AddressBook.h"
+#include "Config.h"
 
 namespace i2p
 {
@@ -205,7 +207,7 @@ namespace client
 
 //---------------------------------------------------------------------
 	AddressBook::AddressBook (): m_Storage(nullptr), m_IsLoaded (false), m_IsDownloading (false),
-		m_DefaultSubscription (nullptr), m_SubscriptionsUpdateTimer (nullptr)
+		m_SubscriptionsUpdateTimer (nullptr)
 	{
 	}
 
@@ -259,7 +261,6 @@ namespace client
 			delete m_Storage;
 			m_Storage = nullptr;
 		}
-		m_DefaultSubscription = nullptr;	
 		m_Subscriptions.clear ();	
 	}	
 	
@@ -404,9 +405,21 @@ namespace client
 					m_Subscriptions.push_back (std::make_shared<AddressBookSubscription> (*this, s));
 				}
 				LogPrint (eLogInfo, "Addressbook: ", m_Subscriptions.size (), " subscriptions urls loaded");
+				LogPrint (eLogWarning, "Addressbook: subscriptions.txt usage is deprecated, use config file instead");
 			}
 			else
-				LogPrint (eLogWarning, "Addressbook: subscriptions.txt not found in datadir");
+                        {
+                            // using config file items
+                            std::string subscriptionURLs; i2p::config::GetOption("addressbook.subscriptions", subscriptionURLs);
+                            std::vector<std::string> subsList;
+                            boost::split(subsList, subscriptionURLs, boost::is_any_of(","), boost::token_compress_on);
+
+                            for (size_t i = 0; i < subsList.size (); i++)
+                            {
+                                    m_Subscriptions.push_back (std::make_shared<AddressBookSubscription> (*this, subsList[i]));
+                            }
+                            LogPrint (eLogInfo, "Addressbook: ", m_Subscriptions.size (), " subscriptions urls loaded");
+                        }
 		}
 		else
 			LogPrint (eLogError, "Addressbook: subscriptions already loaded");
@@ -460,7 +473,6 @@ namespace client
 		int nextUpdateTimeout = CONTINIOUS_SUBSCRIPTION_RETRY_TIMEOUT;
 		if (success)
 		{	
-			if (m_DefaultSubscription) m_DefaultSubscription = nullptr;
 			if (m_IsLoaded)
 				nextUpdateTimeout = CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT; 
 			else
@@ -509,17 +521,7 @@ namespace client
 			}
 			if (!m_IsDownloading && dest->IsReady ())
 			{
-				if (!m_IsLoaded)
-				{
-					// download it from http://i2p-projekt.i2p/hosts.txt 
-					LogPrint (eLogInfo, "Addressbook: trying to download it from default subscription.");
-					if (!m_DefaultSubscription)
-						m_DefaultSubscription = std::make_shared<AddressBookSubscription>(*this, DEFAULT_SUBSCRIPTION_ADDRESS);
-					m_IsDownloading = true;	
-					std::thread load_hosts(std::bind (&AddressBookSubscription::CheckUpdates, m_DefaultSubscription));
-					load_hosts.detach(); // TODO: use join
-				}	
-				else if (!m_Subscriptions.empty ())
+				if (m_IsLoaded && !m_Subscriptions.empty ())
 				{	
 					// pick random subscription
 					auto ind = rand () % m_Subscriptions.size();	
diff --git a/AddressBook.h b/AddressBook.h
index 7f559cd0..e09d3661 100644
--- a/AddressBook.h
+++ b/AddressBook.h
@@ -18,11 +18,6 @@ namespace i2p
 {
 namespace client
 {
-#ifdef MESHNET
-	const char DEFAULT_SUBSCRIPTION_ADDRESS[] = "http://i42ofzetmgicvui5sshinfckpijix2udewbam4sjo6x5fbukltia.b32.i2p/hosts.txt";
-#else
-	const char DEFAULT_SUBSCRIPTION_ADDRESS[] = "http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt";
-#endif
 	const int INITIAL_SUBSCRIPTION_UPDATE_TIMEOUT = 3; // in minutes	
 	const int INITIAL_SUBSCRIPTION_RETRY_TIMEOUT = 1; // in minutes			
 	const int CONTINIOUS_SUBSCRIPTION_UPDATE_TIMEOUT = 720; // in minutes (12 hours)			
@@ -103,7 +98,6 @@ namespace client
 			AddressBookStorage * m_Storage;
 			volatile bool m_IsLoaded, m_IsDownloading;
 			std::vector<std::shared_ptr<AddressBookSubscription> > m_Subscriptions;
-			std::shared_ptr<AddressBookSubscription> m_DefaultSubscription; // in case if we don't know any addresses yet
 			boost::asio::deadline_timer * m_SubscriptionsUpdateTimer;
 	};
 
diff --git a/Config.cpp b/Config.cpp
index 84633532..c0c4aa45 100644
--- a/Config.cpp
+++ b/Config.cpp
@@ -176,6 +176,12 @@ namespace config {
       ("trust.family", value<std::string>()->default_value(""), "Router Familiy to trust for first hops")
       ("trust.hidden", value<bool>()->default_value(false), "should we hide our router from other routers?");
   
+  	options_description addressbook("AddressBook options");
+  	addressbook.add_options()
+      ("addressbook.subscriptions", value<std::string>()->default_value(
+                "http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt"
+                ), "AddressBook subscriptions URLs, separated by comma");
+
     m_OptionsDesc
       .add(general)
 	  .add(limits)	
@@ -190,6 +196,7 @@ namespace config {
 	  .add(precomputation)
 	  .add(reseed) 
       .add(trust)	
+      .add(addressbook)	
       ;
   }
 
diff --git a/docs/configuration.md b/docs/configuration.md
index 31082dc2..13b2063b 100644
--- a/docs/configuration.md
+++ b/docs/configuration.md
@@ -74,6 +74,7 @@ All options below still possible in cmdline, but better write it in config file:
 * --precomputation.elgamal=  - Use ElGamal precomputated tables. false for x64 and true for other platforms by default  
 * --reseed.file         - Full path to SU3 file to reseed from  
 * --reseed.urls         - Reseed URLs, separated by comma
+* --addressbook.subscriptions         - AddressBook subscriptions URLs, separated by comma
 
 * --limits.transittunnels=  - Override maximum number of transit tunnels. 2500 by default   
 
diff --git a/docs/i2pd.conf b/docs/i2pd.conf
index 94287bd0..6bc5cbfe 100644
--- a/docs/i2pd.conf
+++ b/docs/i2pd.conf
@@ -92,8 +92,16 @@ ipv6 = false
 # name = I2Pd
 
 [reseed]
-## Path to reseed .su3 file (if )
-# file = 
+## URLs to request reseed data from, separated by comma
+## Default: "mainline" I2P Network reseeds
+# urls = https://reseed.i2p-projekt.de/,https://i2p.mooo.com/netDb/,https://netdb.i2p2.no/
+## Path to reseed data file (.su3) for manual reseeding 
+# file = /path/to/i2pseeds.su3
+
+[addressbook]
+## AddressBook subscriptions URLs, separated by comma
+## Default: inr.i2p at "mainline" I2P Network
+# subscriptions = http://joajgazyztfssty4w2on5oaqksz6tqoxbduy553y34mf4byv6gpq.b32.i2p/export/alive-hosts.txt
 
 [http]
 ## Uncomment and set to 'false' to disable Web Console
diff --git a/docs/index.rst b/docs/index.rst
index 5507b075..8cfddb24 100644
--- a/docs/index.rst
+++ b/docs/index.rst
@@ -32,7 +32,9 @@ Contents:
    build_requirements
    build_notes_unix
    build_notes_windows
+   build_notes_cross
    build_notes_android
+   build_notes_ios
    configuration
    family
    usage