From af26f73f997247b7af9b3954a96a336f12e79e89 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Wed, 16 Dec 2015 14:34:05 +0000
Subject: [PATCH] Sybil tool tweaks

---
 .../src/net/i2p/router/web/SybilRenderer.java | 43 +++++++++++++------
 1 file changed, 29 insertions(+), 14 deletions(-)

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 e2f0d4104e..8eba139956 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java
@@ -154,9 +154,23 @@ class SybilRenderer {
         StringBuilder buf = new StringBuilder(4*1024);
         buf.append("<p><b>This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " +
                    "Possible \"threats\" are summarized at the bottom, however these are unlikely to be real threats. " +
-                   "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.</b></p>");
+                   "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.</b></p>" +
+                   "<ul><li><a href=\"#known\">FF Summary</a>" +
+                   "</li><li><a href=\"#family\">Same Family</a>" +
+                   "</li><li><a href=\"#ourIP\">IP close to us</a>" +
+                   "</li><li><a href=\"#sameIP\">Same IP</a>" +
+                   "</li><li><a href=\"#same24\">Same /24</a>" +
+                   "</li><li><a href=\"#same16\">Same /16</a>" +
+                   "</li><li><a href=\"#pairs\">Pair distance</a>" +
+                   "</li><li><a href=\"#ritoday\">Close to us</a>" +
+                   "</li><li><a href=\"#ritmrw\">Close to us tomorrow</a>" +
+                   "</li><li><a href=\"#dht\">DHT neighbors</a>" +
+                   "</li><li><a href=\"#dest\">Close to our destinations</a>" +
+                   "</li><li><a href=\"#threats\">Highest threats</a>" +
+                   "</li></ul>");
+
         renderRouterInfo(buf, _context.router().getRouterInfo(), null, true, false);
-        buf.append("<h3>Known Floodfills: ").append(ris.size()).append("</h3>");
+        buf.append("<h3 id=\"known\">Known Floodfills: ").append(ris.size()).append("</h3>");
 
         double tot = 0;
         int count = 200;
@@ -188,17 +202,18 @@ class SybilRenderer {
         renderPairDistance(out, buf, ris, points);
 
         // Distance to our router analysis
-        buf.append("<h3>Closest Floodfills to Our Routing Key (Where we Store our RI)</h3>");
+        buf.append("<h3 id=\"ritoday\">Closest Floodfills to Our Routing Key (Where we Store our RI)</h3>");
         renderRouterInfoHTML(out, buf, ourRKey, avgMinDist, ris, points);
         RouterKeyGenerator rkgen = _context.routerKeyGenerator();
         Hash nkey = rkgen.getNextRoutingKey(us);
-        buf.append("<h3>Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)</h3>");
+        buf.append("<h3 id=\"ritmrw\">Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)</h3>");
         renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points);
 
-        buf.append("<h3>Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)</h3>");
+        buf.append("<h3 id=\"dht\">Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)</h3>");
         renderRouterInfoHTML(out, buf, us, avgMinDist, ris, points);
 
         // Distance to our published destinations analysis
+        buf.append("<h3 id=\"dest\">Floodfills Close to Our Destinations</h3>");
         Map<Hash, TunnelPool> clientInboundPools = _context.tunnelManager().getInboundClientPools();
         List<Hash> destinations = new ArrayList<Hash>(clientInboundPools.keySet());
         boolean debug = _context.getBooleanProperty(HelperBase.PROP_ADVANCED);
@@ -227,7 +242,7 @@ class SybilRenderer {
         if (!points.isEmpty()) {
             List<Hash> warns = new ArrayList<Hash>(points.keySet());
             Collections.sort(warns, new PointsComparator(points));
-            buf.append("<h3>Routers with Most Threat Points</h3>");
+            buf.append("<h3 id=\"threats\">Routers with Most Threat Points</h3>");
             for (Hash h : warns) {
                 RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h);
                 if (h == null)
@@ -286,7 +301,7 @@ class SybilRenderer {
         double avg = total / (sz * sz / 2);
         buf.append("<h3>Average Floodfill Distance is ").append(fmt.format(avg)).append("</h3>");
 
-        buf.append("<h3>Closest Floodfill Pairs by Hash</h3>");
+        buf.append("<h3 id=\"pairs\">Closest Floodfill Pairs by Hash</h3>");
         for (Pair p : pairs) {
             double distance = biLog2(p.dist);
             double point = MIN_CLOSE - distance;
@@ -363,7 +378,7 @@ class SybilRenderer {
         byte[] ourIP = getIP(us);
         if (ourIP == null)
             return;
-        buf.append("<h3>Floodfills close to Our IP</h3>");
+        buf.append("<h3 \"ourIP\">Floodfills close to Our IP</h3>");
         boolean found = false;
         for (RouterInfo info : ris) {
             byte[] ip = getIP(info);
@@ -396,7 +411,7 @@ class SybilRenderer {
     }
 
     private void renderIPGroups32(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
-        buf.append("<h3>Floodfills with the Same IP</h3>");
+        buf.append("<h3 id=\"sameIP\">Floodfills with the Same IP</h3>");
         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
         for (RouterInfo info : ris) {
             byte[] ip = getIP(info);
@@ -449,7 +464,7 @@ class SybilRenderer {
     }
 
     private void renderIPGroups24(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
-        buf.append("<h3>Floodfills in the Same /24 (2 minimum)</h3>");
+        buf.append("<h3 id=\"same24\">Floodfills in the Same /24 (2 minimum)</h3>");
         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
         for (RouterInfo info : ris) {
             byte[] ip = getIP(info);
@@ -498,7 +513,7 @@ class SybilRenderer {
     }
 
     private void renderIPGroups16(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
-        buf.append("<h3>Floodfills in the Same /16 (4 minimum)</h3>");
+        buf.append("<h3 id=\"same16\">Floodfills in the Same /16 (4 minimum)</h3>");
         ObjectCounter<Integer> oc = new ObjectCounter<Integer>();
         for (RouterInfo info : ris) {
             byte[] ip = getIP(info);
@@ -594,9 +609,9 @@ class SybilRenderer {
                 long heard = prof.getFirstHeardAbout();
                 if (heard > 0) {
                     long age = Math.max(now - heard, 1);
-                    if (age < DAY) {
-                        // .125 point for every hour under 24, max 3 points
-                        double point = Math.min(3.0d, (DAY - age) / (DAY / 3.0d));
+                    if (age < 2 * DAY) {
+                        // .125 point for every hour under 48, max 6 points
+                        double point = Math.min(6.0d, (2 * DAY - age) / (2 * DAY / 6.0d));
                         addPoints(points, h, point,
                                   "First heard about: " + _t("{0} ago", DataHelper.formatDuration2(age)));
                     }
-- 
GitLab