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 2a6fa5c1f..24ba22a07 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java @@ -53,6 +53,9 @@ class SybilRenderer { private static final double POINTS24 = 5.0; // multiplied by size - 1 private static final double POINTS16 = 0.25; + private static final double POINTS_US32 = 25.0; + private static final double POINTS_US24 = 25.0; + private static final double POINTS_US16 = 10.0; private static final double POINTS_FAMILY = -2.0; private static final double MIN_CLOSE = 242.0; private static final double OUR_KEY_FACTOR = 4.0; @@ -176,6 +179,7 @@ class SybilRenderer { // IP analysis renderIPGroupsFamily(out, buf, ris, points); + renderIPGroupsUs(out, buf, ris, points); renderIPGroups32(out, buf, ris, points); renderIPGroups24(out, buf, ris, points); renderIPGroups16(out, buf, ris, points); @@ -295,10 +299,12 @@ class SybilRenderer { renderRouterInfo(buf, p.r1, null, false, false); renderRouterInfo(buf, p.r2, null, false, false); } + String b2 = p.r2.getHash().toBase64(); addPoints(points, p.r1.getHash(), point, "Very close (" + fmt.format(distance) + - ") to other floodfill " + p.r2.getHash().toBase64()); + ") to other floodfill " + b2 + ""); + String b1 = p.r1.getHash().toBase64(); addPoints(points, p.r2.getHash(), point, "Very close (" + fmt.format(distance) + - ") to other floodfill " + p.r1.getHash().toBase64()); + ") to other floodfill " + b1 + ""); } out.write(buf.toString()); out.flush(); @@ -351,9 +357,45 @@ class SybilRenderer { } } + private void renderIPGroupsUs(Writer out, StringBuilder buf, List ris, Map points) throws IOException { + RouterInfo us = _context.router().getRouterInfo(); + byte[] ourIP = getIP(us); + if (ourIP == null) + return; + buf.append("

Floodfills close to Our IP

"); + boolean found = false; + for (RouterInfo info : ris) { + byte[] ip = getIP(info); + if (ip == null) + continue; + if (ip[0] == ourIP[0] && ip[1] == ourIP[1]) { + buf.append("

"); + if (ip[2] == ourIP[2]) { + if (ip[3] == ourIP[3]) { + buf.append("Same IP as us"); + addPoints(points, info.getHash(), POINTS_US32, "Same IP as us"); + } else { + buf.append("Same /24 as us"); + addPoints(points, info.getHash(), POINTS_US24, "Same /24 as us"); + } + } else { + buf.append("Same /16 as us"); + addPoints(points, info.getHash(), POINTS_US16, "Same /16 as us"); + } + buf.append(":

"); + renderRouterInfo(buf, info, null, false, false); + found = true; + } + } + if (!found) + buf.append("

None

"); + out.write(buf.toString()); + out.flush(); + buf.setLength(0); + } + private void renderIPGroups32(Writer out, StringBuilder buf, List ris, Map points) throws IOException { buf.append("

Floodfills with the Same IP

"); - int sz = ris.size(); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -408,7 +450,6 @@ class SybilRenderer { private void renderIPGroups24(Writer out, StringBuilder buf, List ris, Map points) throws IOException { buf.append("

Floodfills in the Same /24 (2 minimum)

"); - int sz = ris.size(); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -459,7 +500,6 @@ class SybilRenderer { private void renderIPGroups16(Writer out, StringBuilder buf, List ris, Map points) throws IOException { buf.append("

Floodfills in the Same /16 (4 minimum)

"); - int sz = ris.size(); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -508,7 +548,6 @@ class SybilRenderer { private void renderIPGroupsFamily(Writer out, StringBuilder buf, List ris, Map points) throws IOException { buf.append("

Floodfills in the Same Declared Family

"); - int sz = ris.size(); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { String fam = info.getOption("family"); @@ -648,7 +687,7 @@ class SybilRenderer { buf.append("Caps: ").append(DataHelper.stripHTML(info.getCapabilities())).append("
\n"); String fam = info.getOption("family"); if (fam != null) - buf.append("Family: ").append(DataHelper.stripHTML(fam)).append("
\n"); + buf.append("Family: ").append(DataHelper.escapeHTML(fam)).append("
\n"); String kls = info.getOption("netdb.knownLeaseSets"); if (kls != null) buf.append("Lease Sets: ").append(DataHelper.stripHTML(kls)).append("
\n"); diff --git a/history.txt b/history.txt index d8679f6e1..dcc1831bf 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,14 @@ +2015-12-10 zzz + * Router: + - Change addCapabilities() to getCapabilities() + - Add netdb family sign/verify utility (ticket #1510) + * RouterInfo: + - Remove addCapability() and delCapability() + * StatPublisher: + - Remove Service interface, not required + - Consolidate getCapabilities() and network ID here + - Add family signatures + 2015-12-08 str4d * Core: Fill in basic datastructure length tests * Ministreaming: Add unit tests @@ -5,6 +16,9 @@ - Add more unit tests - Separate out integration tests +2015-12-08 zzz + * Crypto: Consolidate certificate import methods + 2015-12-06 zzz * Console: Don't force profile creation when loading floodfill tab * Installer: Add wrapper deadlock detection to default wrapper.config diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 7ca1a3ec2..5a58b19bc 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 10; + public final static long BUILD = 11; /** for example "-test" */ public final static String EXTRA = "";