diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java index 90e499ef4b..e9f4966a33 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/ConfigKeyringHelper.java @@ -2,10 +2,13 @@ package net.i2p.router.web.helpers; import java.io.IOException; import java.io.StringWriter; +import java.util.List; import java.util.Map; +import net.i2p.data.BlindData; import net.i2p.data.Destination; import net.i2p.data.Hash; +import net.i2p.data.PrivateKey; import net.i2p.data.SessionKey; import net.i2p.router.TunnelPoolSettings; import net.i2p.router.web.HelperBase; @@ -39,12 +42,18 @@ public class ConfigKeyringHelper extends HelperBase { /** * @since 0.9.33 moved from PersistentKeyRing + * @param local true for local (Enc. LS1 only), false for remote (all types) */ private void render(StringBuilder buf, boolean local) { buf.append("\n"); + .append(""); + // Enc. LS1 for (Map.Entry e : _context.keyRing().entrySet()) { Hash h = e.getKey(); if (local != _context.clientManager().isLocal(h)) @@ -63,10 +72,64 @@ public class ConfigKeyringHelper extends HelperBase { buf.append(host); } buf.append("\n"); } + // LS2 + if (!local) { + List bdata = _context.netDb().getBlindData(); + // TODO sort by hostname + for (BlindData bd : bdata) { + Hash h = bd.getDestHash(); + if (h == null) + continue; + buf.append("\n"); + } + } buf.append("
").append(_t("Destination")) - .append("").append(_t("Name")) - .append("").append(_t("Encryption Key")) - .append("
").append(_t("Name")); + if (!local) + buf.append("").append(_t("Type")); + buf.append("").append(_t("Encryption Key")); + if (!local) + buf.append("").append(_t("Lookup Password")); + buf.append("
"); + if (!local) + buf.append(_t("Encrypted")).append(""); SessionKey sk = e.getValue(); buf.append(sk.toBase64()); + if (!local) + buf.append(""); buf.append("
"); + buf.append(h.toBase32()); + buf.append(""); + String host = _context.namingService().reverseLookup(h); + if (host != null) + buf.append(host); + buf.append(""); + int type = bd.getAuthType(); + PrivateKey pk = bd.getAuthPrivKey(); + String secret = bd.getSecret(); + String s; + if (type == BlindData.AUTH_DH) { + if (secret != null) + s = _t("Blinded with lookup password and per-user key"); + else + s = _t("Blinded with per-user key"); + } else if (type == BlindData.AUTH_PSK) { + if (secret != null) + s = _t("Blinded with lookup password and shared key"); + else + s = _t("Blinded with shared key"); + } else { + if (secret != null) + s = _t("Blinded with lookup password"); + else + s = _t("Blinded"); + } + buf.append(s); + buf.append(""); + if (pk != null) { + // display pubkey for DH for sharing with server + if (type == BlindData.AUTH_DH) + buf.append(pk.toPublic().toBase64()); + else + buf.append(pk.toBase64()); + } + buf.append(""); + if (secret != null) + buf.append(secret); + buf.append("
\n"); } } diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index ccd1009750..3f306384e1 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -38,10 +38,31 @@ <%=intl._t("Full destination, name, base 32, or hash")%>: - + + + <%=intl._t("Type")%>: + <%=intl._t("Encryption Key")%>: - + "> + + <%=intl._t("Optional lookup password")%>: + " class="freetext password" /> " > diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/BlindCache.java b/router/java/src/net/i2p/router/networkdb/kademlia/BlindCache.java index 7bdffccbdf..11a6470072 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/BlindCache.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/BlindCache.java @@ -8,6 +8,8 @@ import java.io.InputStreamReader; import java.io.IOException; import java.io.OutputStreamWriter; import java.io.PrintWriter; +import java.util.ArrayList; +import java.util.List; import java.util.concurrent.ConcurrentHashMap; import net.i2p.crypto.Blinding; @@ -225,6 +227,16 @@ class BlindCache { } } + /** + * For console ConfigKeyringHelper + * @since 0.9.41 + */ + public synchronized List getData() { + List rv = new ArrayList(_cache.size()); + rv.addAll(_cache.values()); + return rv; + } + /** * Load from file. * Format: diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java index 0ee1e4a27b..3e48332b07 100644 --- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java +++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java @@ -16,6 +16,7 @@ import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; +import java.util.List; import java.util.Map; import java.util.Set; @@ -492,6 +493,14 @@ public abstract class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacad _log.warn("Adding to blind cache: " + bd); _blindCache.addToCache(bd); } + + /** + * For console ConfigKeyringHelper + * @since 0.9.41 + */ + public List getBlindData() { + return _blindCache.getData(); + } /** * @return RouterInfo, LeaseSet, or null, validated