From 74795a83d6ee4ed6aedc88ca3197559bc121c2cc Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Mon, 6 Jun 2022 16:25:30 -0400
Subject: [PATCH] SSU2: Relay WIP part 8

prevent dup SSU2 introducers
---
 .../transport/udp/IntroductionManager.java      | 17 +++++++++++++----
 1 file changed, 13 insertions(+), 4 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index da454f223b..ec559ca715 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -252,7 +252,16 @@ class IntroductionManager {
             PeerState cur = peers.get(i);
             if (cur.isIPv6() != ipv6)
                 continue;
-            RouterInfo ri = _context.netDb().lookupRouterInfoLocally(cur.getRemotePeer());
+            Hash hash = cur.getRemotePeer();
+            // dup check of reused SSU2 introducers
+            if (SSU2Util.ENABLE_RELAY && cur.getVersion() > 1) {
+                String b64 = hash.toBase64();
+                for (Introducer intro : introducers) {
+                    if (b64.equals(intro.shash))
+                        continue;
+                }
+            }
+            RouterInfo ri = _context.netDb().lookupRouterInfoLocally(hash);
             if (ri == null) {
                 if (_log.shouldLog(Log.INFO))
                     _log.info("Picked peer has no local routerInfo: " + cur);
@@ -267,8 +276,8 @@ class IntroductionManager {
                 continue;
             }
             if ( /* _context.profileOrganizer().isFailing(cur.getRemotePeer()) || */
-                _context.banlist().isBanlisted(cur.getRemotePeer()) ||
-                _transport.wasUnreachable(cur.getRemotePeer())) {
+                _context.banlist().isBanlisted(hash) ||
+                _transport.wasUnreachable(hash)) {
                 if (_log.shouldLog(Log.INFO))
                     _log.info("Peer is failing, blocklisted or was unreachable: " + cur);
                 continue;
@@ -316,7 +325,7 @@ class IntroductionManager {
                         continue;
                     intro = new Introducer(ip, port, ikey, cur.getTheyRelayToUsAs(), exp);
                 } else {
-                    intro = new Introducer(cur.getRemotePeer(), cur.getTheyRelayToUsAs(), exp);
+                    intro = new Introducer(hash, cur.getTheyRelayToUsAs(), exp);
                 }
                 introducers.add(intro);
                 found++;
-- 
GitLab