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