diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java index c2653c7e8..18ee54596 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java @@ -28,6 +28,7 @@ import java.util.TreeSet; import net.i2p.crypto.EncType; import net.i2p.crypto.SigType; +import net.i2p.data.Base64; import net.i2p.data.DatabaseEntry; import net.i2p.data.DataHelper; import net.i2p.data.Destination; @@ -38,6 +39,7 @@ import net.i2p.data.LeaseSet2; import net.i2p.data.PublicKey; import net.i2p.data.router.RouterAddress; import net.i2p.data.router.RouterInfo; +import net.i2p.router.JobImpl; import net.i2p.router.RouterContext; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.util.HashDistance; // debug @@ -113,6 +115,38 @@ class NetDbRenderer { .append(_t("Never reveal your router identity to anyone, as it is uniquely linked to your IP address in the network database.")) .append(""); renderRouterInfo(buf, _context.router().getRouterInfo(), true, true); + } else if (routerPrefix != null && routerPrefix.length() >= 44) { + // easy way, full hash + byte[] h = Base64.decode(routerPrefix); + if (h != null && h.length == Hash.HASH_LENGTH) { + Hash hash = new Hash(h); + RouterInfo ri = _context.netDb().lookupRouterInfoLocally(hash); + if (ri == null) { + // remote lookup + LookupWaiter lw = new LookupWaiter(); + _context.netDb().lookupRouterInfo(hash, lw, lw, 8*1000); + // just wait right here in the middle of the rendering, sure + synchronized(lw) { + try { lw.wait(9*1000); } catch (InterruptedException ie) {} + } + ri = _context.netDb().lookupRouterInfoLocally(hash); + } + if (ri != null) { + renderRouterInfo(buf, ri, false, true); + } else { + buf.append("
"); + buf.append(_t("Router")).append(' '); + if (routerPrefix != null) + buf.append(routerPrefix); + buf.append(' ').append(_t("not found in network database")); + buf.append("
"); + } + } else { + buf.append("
"); + buf.append("Bad Base64 router hash").append(' '); + buf.append(DataHelper.escapeHTML(routerPrefix)); + buf.append("
"); + } } else { StringBuilder ubuf = new StringBuilder(); if (routerPrefix != null) @@ -369,6 +403,19 @@ class NetDbRenderer { SybilRenderer.renderSybilHTML(out, _context, sybils, sybil); } + /** + * @since 0.9.48 + */ + private class LookupWaiter extends JobImpl { + public LookupWaiter() { super(_context); } + public void runJob() { + synchronized(this) { + notifyAll(); + } + } + public String getName() { return "Console netdb lookup"; } + } + /** * Special handling for 'O' cap * @param caps non-null