From 7d7bbf15bfd820a4662f3ad19f1702f1ed759ec9 Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Tue, 15 Nov 2016 10:10:13 -0500
Subject: [PATCH 1/3] use DSA for http and socks proxy by defualt

---
 ClientContext.cpp | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/ClientContext.cpp b/ClientContext.cpp
index 4639ec05..7ec699cb 100644
--- a/ClientContext.cpp
+++ b/ClientContext.cpp
@@ -52,7 +52,7 @@ namespace client
 			if (httpProxyKeys.length () > 0)
 			{
 				i2p::data::PrivateKeys keys;
-				if(LoadPrivateKeys (keys, httpProxyKeys))
+				if(LoadPrivateKeys (keys, httpProxyKeys, i2p::data::SIGNING_KEY_TYPE_DSA_SHA1))
 				{
 					std::map<std::string, std::string> params;
 					ReadI2CPOptionsFromConfig ("httpproxy.", params);
@@ -82,7 +82,7 @@ namespace client
 			if (socksProxyKeys.length () > 0)
 			{
 				i2p::data::PrivateKeys keys;
-				if (LoadPrivateKeys (keys, socksProxyKeys))
+				if (LoadPrivateKeys (keys, socksProxyKeys, i2p::data::SIGNING_KEY_TYPE_DSA_SHA1))
 				{
 					std::map<std::string, std::string> params;
 					ReadI2CPOptionsFromConfig ("socksproxy.", params);

From 336cd6092021de60c8303272781b279cd02aa829 Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Tue, 15 Nov 2016 12:17:21 -0500
Subject: [PATCH 2/3] don't insert same floodfill twice

---
 NetDb.cpp | 23 +++++++++++++++++------
 1 file changed, 17 insertions(+), 6 deletions(-)

diff --git a/NetDb.cpp b/NetDb.cpp
index e667dc11..5a622441 100644
--- a/NetDb.cpp
+++ b/NetDb.cpp
@@ -188,23 +188,34 @@ namespace data
 				// TODO: check if floodfill has been changed
 			}
 			else
+			{
 				LogPrint (eLogDebug, "NetDb: RouterInfo is older: ", ident.ToBase64());
-			
+				updated = false;
+			}
 		}	
 		else	
 		{	
 			r = std::make_shared<RouterInfo> (buf, len);
 			if (!r->IsUnreachable ())
 			{
-				LogPrint (eLogInfo, "NetDb: RouterInfo added: ", ident.ToBase64());
+				bool inserted = false;
 				{
 					std::unique_lock<std::mutex> l(m_RouterInfosMutex);
-					m_RouterInfos[r->GetIdentHash ()] = r;
+					inserted = m_RouterInfos.insert ({r->GetIdentHash (), r}).second;
 				}
-				if (r->IsFloodfill () && r->IsReachable ()) // floodfill must be reachable
+				if (inserted)
 				{
-					std::unique_lock<std::mutex> l(m_FloodfillsMutex);
-					m_Floodfills.push_back (r);
+					LogPrint (eLogInfo, "NetDb: RouterInfo added: ", ident.ToBase64());
+					if (r->IsFloodfill () && r->IsReachable ()) // floodfill must be reachable
+					{
+						std::unique_lock<std::mutex> l(m_FloodfillsMutex);
+						m_Floodfills.push_back (r);
+					}
+				}
+				else
+				{
+					LogPrint (eLogWarning, "NetDb: Duplicated RouterInfo ", ident.ToBase64());
+					updated = false;
 				}
 			}	
 			else

From 6bacf94a62874e051f82fd7b99edd3fb8873bf7f Mon Sep 17 00:00:00 2001
From: orignal <i2porignal@yandex.ru>
Date: Tue, 15 Nov 2016 14:11:55 -0500
Subject: [PATCH 3/3] handle all loopback messages

---
 Transports.cpp |  3 ++-
 Transports.h   | 14 ++++++++------
 2 files changed, 10 insertions(+), 7 deletions(-)

diff --git a/Transports.cpp b/Transports.cpp
index d41253d6..d06d8670 100644
--- a/Transports.cpp
+++ b/Transports.cpp
@@ -260,7 +260,8 @@ namespace transport
 		{	
 			// we send it to ourself
 			for (auto& it: msgs)
-				i2p::HandleI2NPMessage (it);
+				m_LoopbackHandler.PutNextMessage (it);
+			m_LoopbackHandler.Flush ();
 			return;
 		}
 		if(RoutesRestricted() && ! IsRestrictedPeer(ident)) return;
diff --git a/Transports.h b/Transports.h
index 1fe262a9..d83c0370 100644
--- a/Transports.h
+++ b/Transports.h
@@ -160,13 +160,15 @@ namespace transport
 			uint64_t m_LastInBandwidthUpdateBytes, m_LastOutBandwidthUpdateBytes;	
 			uint64_t m_LastBandwidthUpdateTime;		
 
-    /** which router families to trust for first hops */
-    std::vector<std::string> m_TrustedFamilies;
-    mutable std::mutex m_FamilyMutex;
+			/** which router families to trust for first hops */
+			std::vector<std::string> m_TrustedFamilies;
+			mutable std::mutex m_FamilyMutex;
 
-    /** which routers for first hop to trust */
-    std::vector<i2p::data::IdentHash> m_TrustedRouters;
-    mutable std::mutex m_TrustedRoutersMutex;
+			/** which routers for first hop to trust */
+			std::vector<i2p::data::IdentHash> m_TrustedRouters;
+			mutable std::mutex m_TrustedRoutersMutex;
+
+			i2p::I2NPMessagesHandler m_LoopbackHandler; 
     
 		public: