From db8a843e82be6bfde9f2afd941c362199a6ac73d Mon Sep 17 00:00:00 2001
From: zzz <zzz@i2pmail.org>
Date: Fri, 29 Apr 2022 09:41:10 -0400
Subject: [PATCH] SSU: Enforce peer test message 4 in-session

for routers 0.9.52 or higher
---
 .../router/transport/udp/PeerTestManager.java | 21 +++++++++++++++----
 1 file changed, 17 insertions(+), 4 deletions(-)

diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index 52cad4b9e7..aac9cef81a 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -32,6 +32,7 @@ import net.i2p.util.Addresses;
 import net.i2p.util.Log;
 import net.i2p.util.HexDump;
 import net.i2p.util.SimpleTimer;
+import net.i2p.util.VersionComparator;
 
 /**
  *  Entry points are runTest() to start a new test as Alice,
@@ -388,7 +389,7 @@ class PeerTestManager {
      *
      * SSU 1 only.
      *
-     * @param fromPeer non-null if an associated session was found, otherwise null
+     * @param fromPeer non-null if an associated session was found, otherwise may be null
      * @param inSession true if authenticated in-session
      */
     private synchronized void receiveTestReply(RemoteHostId from, PeerState fromPeer, boolean inSession,
@@ -408,9 +409,21 @@ class PeerTestManager {
                 //if (_log.shouldDebug())
                 //    _log.debug("Bob replied to us (Alice) in-session " + fromPeer);
             } else {
-                // TODO check Bob version, drop if >= 0.9.52
-                if (_log.shouldDebug())
-                    _log.debug("Bob replied to us (Alice) with intro key " + from + ' ' + fromPeer);
+                // Check Bob version, drop if >= 0.9.52
+                fromPeer = test.getBob();
+                Hash bob = fromPeer.getRemotePeer();
+                RouterInfo bobRI = _context.netDb().lookupRouterInfoLocally(bob);
+                if (bobRI == null || VersionComparator.comp(bobRI.getVersion(), "0.9.52") >= 0) {
+                    if (_log.shouldInfo())
+                        _log.info("Bob replied to us (Alice) with intro key " + fromPeer);
+                    // reset all state
+                    // so testComplete() will return UNKNOWN
+                    test.setAlicePortFromCharlie(0);
+                    test.setReceiveCharlieTime(0);
+                    test.setReceiveBobTime(0);
+                    testComplete();
+                    return;
+                }
             }
 
             int ipSize = testInfo.readIPSize();
-- 
GitLab