From 7695b51d893ed82bd4c583af405c7e151739591c Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Tue, 28 Oct 2014 13:50:09 +0000
Subject: [PATCH] Make recognition of a hidden router consistent, whether
 specified in the caps or the cert

---
 .../java/src/net/i2p/data/router/RouterIdentity.java   |  5 +++++
 router/java/src/net/i2p/data/router/RouterInfo.java    |  5 ++++-
 .../networkdb/HandleDatabaseLookupMessageJob.java      | 10 +---------
 .../i2p/router/networkdb/kademlia/PeerSelector.java    |  2 +-
 .../net/i2p/router/peermanager/ProfileOrganizer.java   |  2 +-
 5 files changed, 12 insertions(+), 12 deletions(-)

diff --git a/router/java/src/net/i2p/data/router/RouterIdentity.java b/router/java/src/net/i2p/data/router/RouterIdentity.java
index 6dc7ca2d75..c649fb14ac 100644
--- a/router/java/src/net/i2p/data/router/RouterIdentity.java
+++ b/router/java/src/net/i2p/data/router/RouterIdentity.java
@@ -29,6 +29,11 @@ public class RouterIdentity extends KeysAndCert {
      * nor queried for the netDb, and that disclosure of their contact information
      * should be limited.
      *
+     * This is ONLY if the certificate is a hidden type.
+     * Hidden mode may also be specified with a capability in the RouterInfo.
+     *
+     * Not recommended for direct use.
+     * Use of RouterInfo.isHidden() (which calls this) is preferred.
      */
     public boolean isHidden() {
         return (_certificate != null) && (_certificate.getCertificateType() == Certificate.CERTIFICATE_TYPE_HIDDEN);
diff --git a/router/java/src/net/i2p/data/router/RouterInfo.java b/router/java/src/net/i2p/data/router/RouterInfo.java
index 390b013ec5..fbcb570676 100644
--- a/router/java/src/net/i2p/data/router/RouterInfo.java
+++ b/router/java/src/net/i2p/data/router/RouterInfo.java
@@ -382,9 +382,12 @@ public class RouterInfo extends DatabaseEntry {
 
     /**
      * Is this a hidden node?
+     *
+     * @return true if either 'H' is in the capbilities, or router indentity contains a hidden cert.
      */
     public boolean isHidden() {
-        return (getCapabilities().indexOf(CAPABILITY_HIDDEN) != -1);
+        return (getCapabilities().indexOf(CAPABILITY_HIDDEN) >= 0) ||
+               (_identity != null && _identity.isHidden());
     }
 
     /**
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
index 1b9dc04031..5a4c3a00b5 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
@@ -154,19 +154,11 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
                    lookupType != DatabaseLookupMessage.Type.LS) {
             RouterInfo info = (RouterInfo) dbe;
             if (info.isCurrent(EXPIRE_DELAY)) {
-                if ( (info.getIdentity().isHidden()) || (isUnreachable(info) && !publishUnreachable()) ) {
+                if ( (info.isHidden()) || (isUnreachable(info) && !publishUnreachable()) ) {
                     if (_log.shouldLog(Log.DEBUG))
                         _log.debug("Not answering a query for a netDb peer who isn't reachable");
                     Set<Hash> us = Collections.singleton(getContext().routerHash());
                     sendClosest(_message.getSearchKey(), us, fromKey, _message.getReplyTunnel());
-                //} else if (info.isHidden()) {
-                //    // Don't return hidden nodes
-                //    ERR: we don't want to explicitly reject lookups for hidden nodes, since they
-                //         may have just sent the hidden mode to only us and bundled a lookup with
-                //         a payload targetting some hidden destination (and if we refused to answer,
-                //         yet answered the bundled data message [e.g. HTTP GET], they'd know that
-                //         *we* were hosting that destination).  To operate safely,
-                //         perhaps we should refuse to honor lookups bundled down client tunnels?
                 } else {
                     // send that routerInfo to the _message.getFromHash peer
                     if (_log.shouldLog(Log.DEBUG))
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
index 4eb23e13cb..946aa0e604 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
@@ -131,7 +131,7 @@ class PeerSelector {
             RouterInfo info = _context.netDb().lookupRouterInfoLocally(entry);
             if (info == null)
                 return;
-            if (info.getIdentity().isHidden())
+            if (info.isHidden())
                 return;
             
             BigInteger diff = HashDistance.getDistance(_key, entry);
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index 60bfab128c..31ff6a03a2 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -1355,7 +1355,7 @@ public class ProfileOrganizer {
             
         RouterInfo info = _context.netDb().lookupRouterInfoLocally(peer);
         if (null != info) {
-            if (info.getIdentity().isHidden()) {
+            if (info.isHidden()) {
                if (_log.shouldLog(Log.WARN))
                     _log.warn("Peer " + peer.toBase64() + " is marked as hidden, disallowing its use");
                 return false;
-- 
GitLab