From e2ca74963f46c06dcbd8e8150f9fb1259b99a7a1 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 3 Jun 2015 16:55:01 +0000
Subject: [PATCH] Console: Click on version or country in /netdb table to get
 list of those routers

---
 .../src/net/i2p/router/web/NetDbHelper.java   | 18 ++++++++--
 .../src/net/i2p/router/web/NetDbRenderer.java | 34 ++++++++++++++-----
 apps/routerconsole/jsp/netdb.jsp              |  2 ++
 3 files changed, 44 insertions(+), 10 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 a72e2cd651..8cbd02304a 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java
@@ -5,6 +5,8 @@ import net.i2p.data.DataHelper;
 
 public class NetDbHelper extends HelperBase {
     private String _routerPrefix;
+    private String _version;
+    private String _country;
     private int _full;
     private boolean _lease;
     private boolean _debug;
@@ -33,6 +35,18 @@ public class NetDbHelper extends HelperBase {
             _routerPrefix = DataHelper.stripHTML(r);  // XSS
     }
 
+    /** @since 0.9.21 */
+    public void setVersion(String v) {
+        if (v != null)
+            _version = DataHelper.stripHTML(v);  // XSS
+    }
+
+    /** @since 0.9.21 */
+    public void setCountry(String c) {
+        if (c != null)
+            _country = DataHelper.stripHTML(c);  // XSS
+    }
+
     public void setFull(String f) {
         try {
             _full = Integer.parseInt(f);
@@ -59,8 +73,8 @@ public class NetDbHelper extends HelperBase {
         NetDbRenderer renderer = new NetDbRenderer(_context);
         try {
             renderNavBar();
-            if (_routerPrefix != null)
-                renderer.renderRouterInfoHTML(_out, _routerPrefix);
+            if (_routerPrefix != null || _version!= null || _country != null)
+                renderer.renderRouterInfoHTML(_out, _routerPrefix, _version, _country);
             else if (_lease)
                 renderer.renderLeaseSetHTML(_out, _debug);
             else
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 01e4659878..89b4a7000e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java
@@ -78,7 +78,14 @@ public class NetDbRenderer {
         }
     }
 
-    public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException {
+    /**
+     *  One String must be non-null
+     *
+     *  @param routerPrefix may be null. "." for our router only
+     *  @param version may be null
+     *  @param country may be null
+     */
+    public void renderRouterInfoHTML(Writer out, String routerPrefix, String version, String country) throws IOException {
         StringBuilder buf = new StringBuilder(4*1024);
         if (".".equals(routerPrefix)) {
             renderRouterInfo(buf, _context.router().getRouterInfo(), true, true);
@@ -87,13 +94,23 @@ public class NetDbRenderer {
             Set<RouterInfo> routers = _context.netDb().getRouters();
             for (RouterInfo ri : routers) {
                 Hash key = ri.getIdentity().getHash();
-                if (key.toBase64().startsWith(routerPrefix)) {
+                if ((routerPrefix != null && key.toBase64().startsWith(routerPrefix)) ||
+                    (version != null && version.equals(ri.getVersion())) ||
+                    (country != null && country.equals(_context.commSystem().getCountry(key)))) {
                     renderRouterInfo(buf, ri, false, true);
                     notFound = false;
                 }
             }
-            if (notFound)
-                buf.append(_("Router") + ' ').append(routerPrefix).append(' ' + _("not found in network database") );
+            if (notFound) {
+                buf.append(_("Router")).append(' ');
+                if (routerPrefix != null)
+                    buf.append(routerPrefix);
+                else if (version != null)
+                    buf.append(version);
+                else if (country != null)
+                    buf.append(country);
+                buf.append(' ').append(_("not found in network database"));
+            }
         }
         out.write(buf.toString());
         out.flush();
@@ -320,8 +337,9 @@ public class NetDbRenderer {
             buf.append("<tr><th>" + _("Version") + "</th><th>" + _("Count") + "</th></tr>\n");
             for (String routerVersion : versionList) {
                 int num = versions.count(routerVersion);
-                buf.append("<tr><td align=\"center\">").append(DataHelper.stripHTML(routerVersion));
-                buf.append("</td><td align=\"center\">").append(num).append("</td></tr>\n");
+                String ver = DataHelper.stripHTML(routerVersion);
+                buf.append("<tr><td align=\"center\"><a href=\"/netdb?v=").append(ver).append("\">").append(ver);
+                buf.append("</a></td><td align=\"center\">").append(num).append("</td></tr>\n");
             }
             buf.append("</table>\n");
         }
@@ -353,9 +371,9 @@ public class NetDbRenderer {
             for (String country : countryList) {
                 int num = countries.count(country);
                 buf.append("<tr><td><img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append("\"");
-                buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ");
+                buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> <a href=\"/netdb?c=").append(country).append("\">");
                 buf.append(getTranslatedCountry(country));
-                buf.append("</td><td align=\"center\">").append(num).append("</td></tr>\n");
+                buf.append("</a></td><td align=\"center\">").append(num).append("</td></tr>\n");
             }
             buf.append("</table>\n");
         }
diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp
index ccbbccfee7..15231ec852 100644
--- a/apps/routerconsole/jsp/netdb.jsp
+++ b/apps/routerconsole/jsp/netdb.jsp
@@ -23,5 +23,7 @@
  <jsp:setProperty name="netdbHelper" property="full" value="<%=request.getParameter(\"f\")%>" />
  <jsp:setProperty name="netdbHelper" property="router" value="<%=request.getParameter(\"r\")%>" />
  <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:getProperty name="netdbHelper" property="netDbSummary" />
 </div></div></body></html>
-- 
GitLab