From cd4d5a39bfbf7d35381916c8cf78dd604f0c478a Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 17 Nov 2016 14:33:33 +0000
Subject: [PATCH] Console: Add netdb lookup by family

---
 .../java/src/net/i2p/router/web/NetDbHelper.java      | 11 +++++++++--
 .../java/src/net/i2p/router/web/NetDbRenderer.java    |  9 +++++++--
 .../java/src/net/i2p/router/web/SybilRenderer.java    |  5 +++--
 apps/routerconsole/jsp/netdb.jsp                      |  1 +
 4 files changed, 20 insertions(+), 6 deletions(-)

diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
index ba977a6e80..313018db95 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
@@ -7,6 +7,7 @@ public class NetDbHelper extends HelperBase {
     private String _routerPrefix;
     private String _version;
     private String _country;
+    private String _family;
     private int _full;
     private boolean _lease;
     private boolean _debug;
@@ -49,6 +50,12 @@ public class NetDbHelper extends HelperBase {
             _country = DataHelper.stripHTML(c);  // XSS
     }
 
+    /** @since 0.9.28 */
+    public void setFamily(String c) {
+        if (c != null)
+            _family = DataHelper.stripHTML(c);  // XSS
+    }
+
     public void setFull(String f) {
         try {
             _full = Integer.parseInt(f);
@@ -75,8 +82,8 @@ public class NetDbHelper extends HelperBase {
         NetDbRenderer renderer = new NetDbRenderer(_context);
         try {
             renderNavBar();
-            if (_routerPrefix != null || _version != null || _country != null)
-                renderer.renderRouterInfoHTML(_out, _routerPrefix, _version, _country);
+            if (_routerPrefix != null || _version != null || _country != null || _family != null)
+                renderer.renderRouterInfoHTML(_out, _routerPrefix, _version, _country, _family);
             else if (_lease)
                 renderer.renderLeaseSetHTML(_out, _debug);
             else if (_full == 3)
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
index c9a34ece06..05ef0c1ac4 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -85,8 +85,10 @@ class NetDbRenderer {
      *  @param routerPrefix may be null. "." for our router only
      *  @param version may be null
      *  @param country may be null
+     *  @param family may be null
      */
-    public void renderRouterInfoHTML(Writer out, String routerPrefix, String version, String country) throws IOException {
+    public void renderRouterInfoHTML(Writer out, String routerPrefix, String version,
+                                     String country, String family) throws IOException {
         StringBuilder buf = new StringBuilder(4*1024);
         if (".".equals(routerPrefix)) {
             renderRouterInfo(buf, _context.router().getRouterInfo(), true, true);
@@ -97,7 +99,8 @@ class NetDbRenderer {
                 Hash key = ri.getIdentity().getHash();
                 if ((routerPrefix != null && key.toBase64().startsWith(routerPrefix)) ||
                     (version != null && version.equals(ri.getVersion())) ||
-                    (country != null && country.equals(_context.commSystem().getCountry(key)))) {
+                    (country != null && country.equals(_context.commSystem().getCountry(key))) ||
+                    (family != null && family.equals(ri.getOption("family")))) {
                     renderRouterInfo(buf, ri, false, true);
                     notFound = false;
                 }
@@ -110,6 +113,8 @@ class NetDbRenderer {
                     buf.append(version);
                 else if (country != null)
                     buf.append(country);
+                else if (family != null)
+                    buf.append(_t("Family")).append(' ').append(family);
                 buf.append(' ').append(_t("not found in network database"));
             }
         }
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
index fb45e0cb27..703e93958a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
@@ -588,8 +588,9 @@ class SybilRenderer {
         boolean found = false;
         for (String s : foo) {
             int count = oc.count(s);
-            buf.append("<p><b>").append(count).append(" floodfills in declared family \"").append(DataHelper.escapeHTML(s) + '"')
-               .append("</b></p>");
+            String ss = DataHelper.escapeHTML(s);
+            buf.append("<p><b>").append(count).append(" floodfills in declared family \"<a href=\"/netdb?fam=")
+               .append(ss).append("\">").append(ss).append("</a>\"</b></p>");
             for (RouterInfo info : ris) {
                 String fam = info.getOption("family");
                 if (fam == null)
diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp
index 1b9be5d03f..c323aa760b 100644
--- a/apps/routerconsole/jsp/netdb.jsp
+++ b/apps/routerconsole/jsp/netdb.jsp
@@ -25,5 +25,6 @@
  <jsp:setProperty name="netdbHelper" property="lease" value="<%=request.getParameter(\"l\")%>" />
  <jsp:setProperty name="netdbHelper" property="version" value="<%=request.getParameter(\"v\")%>" />
  <jsp:setProperty name="netdbHelper" property="country" value="<%=request.getParameter(\"c\")%>" />
+ <jsp:setProperty name="netdbHelper" property="family" value="<%=request.getParameter(\"fam\")%>" />
  <jsp:getProperty name="netdbHelper" property="netDbSummary" />
 </div></div></body></html>
-- 
GitLab