From 3846e08e68ca2e3abb66b2532c9794ad59e1db1d Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 22 Dec 2016 12:46:38 +0000
Subject: [PATCH] Router: More efficiently check blocklist when receiving new
 RI

---
 router/java/src/net/i2p/router/Blocklist.java | 41 ++++++++++++++++---
 ...andleFloodfillDatabaseStoreMessageJob.java |  4 +-
 2 files changed, 37 insertions(+), 8 deletions(-)

diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java
index 5b78e3c930..1ae393ff75 100644
--- a/router/java/src/net/i2p/router/Blocklist.java
+++ b/router/java/src/net/i2p/router/Blocklist.java
@@ -79,6 +79,12 @@ public class Blocklist {
     private final File _blocklistFeedFile;
     // temp
     private Map<Hash, String> _peerBlocklist = new HashMap<Hash, String>(4);
+    
+    private static final String PROP_BLOCKLIST_ENABLED = "router.blocklist.enable";
+    private static final String PROP_BLOCKLIST_DETAIL = "router.blocklist.detail";
+    private static final String PROP_BLOCKLIST_FILE = "router.blocklist.file";
+    private static final String BLOCKLIST_FILE_DEFAULT = "blocklist.txt";
+    private static final String BLOCKLIST_FEED_FILE = "docs/feed/blocklist/blocklist.txt";
 
     /**
      *  Limits of transient (in-memory) blocklists.
@@ -105,12 +111,6 @@ public class Blocklist {
         _log = new Log(Blocklist.class);
         _blocklistFeedFile = new File(BLOCKLIST_FEED_FILE);
     }
-    
-    private static final String PROP_BLOCKLIST_ENABLED = "router.blocklist.enable";
-    private static final String PROP_BLOCKLIST_DETAIL = "router.blocklist.detail";
-    private static final String PROP_BLOCKLIST_FILE = "router.blocklist.file";
-    private static final String BLOCKLIST_FILE_DEFAULT = "blocklist.txt";
-    private static final String BLOCKLIST_FEED_FILE = "docs/feed/blocklist/blocklist.txt";
 
     /**
      *  Loads the following files in-order:
@@ -656,6 +656,14 @@ public class Blocklist {
         RouterInfo pinfo = _context.netDb().lookupRouterInfoLocally(peer);
         if (pinfo == null)
             return Collections.emptyList();
+        return getAddresses(pinfo);
+    }
+
+    /**
+     * Will not contain duplicates.
+     * @since 0.9.29
+     */
+    private static List<byte[]> getAddresses(RouterInfo pinfo) {
         List<byte[]> rv = new ArrayList<byte[]>(4);
         // for each peer address
         for (RouterAddress pa : pinfo.getAddresses()) {
@@ -694,6 +702,27 @@ public class Blocklist {
         return false;
     }
 
+    /**
+     * Does the peer's IP address appear in the blocklist?
+     * If so, and it isn't banlisted, banlist it forever...
+     * @since 0.9.29
+     */
+    public boolean isBlocklisted(RouterInfo pinfo) {
+        List<byte[]> ips = getAddresses(pinfo);
+        if (ips.isEmpty())
+            return false;
+        for (byte[] ip : ips) {
+            if (isBlocklisted(ip)) {
+                Hash peer = pinfo.getHash();
+                if (! _context.banlist().isBanlisted(peer))
+                    // nice knowing you...
+                    banlist(peer, ip);
+                return true;
+            }
+        }
+        return false;
+    }
+
     /**
      * calling this externally won't banlist the peer, this is just an IP check
      *
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
index 56fd1f0eb8..d136843f61 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
@@ -160,7 +160,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                 if (wasNew) {
                     if (prevNetDb == null) {
                         if ((!getContext().banlist().isBanlistedForever(key)) &&
-                            getContext().blocklist().isBlocklisted(key) &&
+                            getContext().blocklist().isBlocklisted(ri) &&
                             _log.shouldLog(Log.WARN))
                                 _log.warn("Blocklisting new peer " + key + ' ' + ri);
                     } else {
@@ -168,7 +168,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
                         Collection<RouterAddress> newAddr = ri.getAddresses();
                         if ((!newAddr.equals(oldAddr)) &&
                             (!getContext().banlist().isBanlistedForever(key)) &&
-                            getContext().blocklist().isBlocklisted(key) &&
+                            getContext().blocklist().isBlocklisted(ri) &&
                             _log.shouldLog(Log.WARN))
                                 _log.warn("New address received, Blocklisting old peer " + key + ' ' + ri);
                     }
-- 
GitLab