forked from I2P_Developers/i2p.i2p
merge of '95d429bc46db23b3e3181caf4e622b763cff51eb'
and 'ca23007c18cf5894a1b6b4efa92207aa025473d2'
This commit is contained in:
@@ -88,8 +88,8 @@
|
||||
<attribute name="X-Compile-Target-JDK" value="${javac.version}" />
|
||||
</manifest>
|
||||
</jar>
|
||||
</target>
|
||||
|
||||
</target>
|
||||
|
||||
<target name="jarUpToDate">
|
||||
<uptodate property="jar.uptodate" targetfile="build/i2psnark.jar" >
|
||||
<srcfiles dir= "build/obj" includes="**/*.class" excludes="**/web/* **/messages_*.class" />
|
||||
@@ -137,13 +137,13 @@
|
||||
</manifest>
|
||||
</war>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="warUpToDate">
|
||||
<uptodate property="war.uptodate" targetfile="../i2psnark.war" >
|
||||
<srcfiles dir= "." includes="build/obj/org/klomp/snark/web/*.class ../resources/**/* ../web.xml" />
|
||||
</uptodate>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="bundle" depends="compile" unless="no.bundle">
|
||||
<mkdir dir="build/messages-src" />
|
||||
<!-- Update the messages_*.po files.
|
||||
@@ -155,7 +155,7 @@
|
||||
<exec executable="sh" osfamily="mac" failifexecutionfails="true" failonerror="${require.gettext}" >
|
||||
<arg value="./bundle-messages.sh" />
|
||||
</exec>
|
||||
<!-- multi-lang is optional -->
|
||||
<!-- multi-lang is optional -->
|
||||
<exec executable="sh" osfamily="windows" failifexecutionfails="false" >
|
||||
<arg value="./bundle-messages.sh" />
|
||||
</exec>
|
||||
@@ -242,51 +242,66 @@
|
||||
<copy todir="build/standalone-resources/.resources/themes/snark" >
|
||||
<fileset dir="../../../installer/resources/themes/snark/" />
|
||||
</copy>
|
||||
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url('/themes/"
|
||||
value="url('/i2psnark/.resources/themes/" >
|
||||
token="url(/themes/console/classic/images/"
|
||||
value="url(/i2psnark/.resources/themes/snark/classic/images/" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url('../../console/images/"
|
||||
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
|
||||
token="url(/themes/console/dark/images/"
|
||||
value="url(/i2psnark/.resources/themes/snark/dark/images/" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url('../../console/dark/images/"
|
||||
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
|
||||
token="url(../../console/light/images/"
|
||||
value="url(/i2psnark/.resources/themes/snark/light/images/" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url('../../console/light/images/"
|
||||
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
|
||||
token="url(/themes/console/light/images/"
|
||||
value="url(/i2psnark/.resources/themes/snark/light/images/" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url('images/"
|
||||
value="url('/i2psnark/.resources/themes/snark/ubergine/images/" >
|
||||
token="url(/themes/console/images/transparent.gif"
|
||||
value="url(/i2psnark/.resources/themes/snark/ubergine/images/transparent.gif" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
<copy todir="build/standalone-resources/.resources/themes/snark/ubergine/images" >
|
||||
<!-- we really don't need all of these -->
|
||||
<fileset dir="../../../installer/resources/themes/console/images/" />
|
||||
</copy>
|
||||
<replace dir="build/standalone-resources/.resources/themes/snark"
|
||||
summary="true"
|
||||
token="url(/themes/console/images/info/"
|
||||
value="url(/i2psnark/.resources/themes/snark/ubergine/images/" >
|
||||
<include name="**/*.css" />
|
||||
</replace>
|
||||
|
||||
<!-- Rather than pulling in all the console theme images, let's just specify the ones we need -->
|
||||
<copy file="../../../installer/resources/themes/console/images/transparent.gif"
|
||||
todir="build/standalone-resources/.resources/themes/snark/ubergine/images" />
|
||||
<copy file="../../../installer/resources/themes/console/dark/images/header.png"
|
||||
todir="build/standalone-resources/.resources/themes/snark/dark/images" />
|
||||
<copy file="../../../installer/resources/themes/console/light/images/header.png"
|
||||
todir="build/standalone-resources/.resources/themes/snark/light/images" />
|
||||
<copy file="../../../installer/resources/themes/console/dark/images/camotile2.png"
|
||||
todir="build/standalone-resources/.resources/themes/snark/dark/images" />
|
||||
<copy file="../../../installer/resources/themes/console/images/info/errortriangle.png"
|
||||
todir="build/standalone-resources/.resources/themes/snark/ubergine/images" />
|
||||
<copy file="../../../installer/resources/themes/console/classic/images/bg0.png"
|
||||
todir="build/standalone-resources/.resources/themes/snark/classic/images" />
|
||||
|
||||
<mkdir dir="build/standalone-resources/.resources/js" />
|
||||
<copy file="../../routerconsole/jsp/js/ajax.js" todir="build/standalone-resources/.resources/js" />
|
||||
|
||||
<zip destfile="../i2psnark.war" update="true" duplicate="preserve" >
|
||||
<fileset dir="build/standalone-resources" />
|
||||
</zip>
|
||||
</target>
|
||||
|
||||
|
||||
<target name="standalone_prep" depends="standalone_jar, standalone_war">
|
||||
<delete dir="./dist" />
|
||||
<mkdir dir="./dist" />
|
||||
|
@@ -850,7 +850,7 @@ public class SnarkManager implements CompleteListener, ClientApp {
|
||||
themes = new String[0];
|
||||
}
|
||||
} else {
|
||||
themes = new String[] { "light", "ubergine", "vanilla" };
|
||||
themes = new String[] { "classic", "dark", "light", "midnight", "ubergine", "vanilla" };
|
||||
}
|
||||
return themes;
|
||||
}
|
||||
|
@@ -2560,7 +2560,7 @@ public class I2PSnarkServlet extends BasicServlet {
|
||||
buf.append("<tr class=\"knownTracker\"><td><input type=\"checkbox\" class=\"optbox\" id=\"").append(name).append("\" name=\"delete_")
|
||||
.append(name).append("\" title=\"").append(_t("Mark tracker for deletion")).append("\">" +
|
||||
"</td><td><label for=\"").append(name).append("\">").append(name)
|
||||
.append("</td><td>").append(urlify(homeURL, 35))
|
||||
.append("</label></td><td>").append(urlify(homeURL, 35))
|
||||
.append("</td><td><input type=\"radio\" class=\"optbox\" value=\"0\" tabindex=\"-1\" name=\"ttype_")
|
||||
.append(announceURL).append("\"");
|
||||
if (!(isOpen || isPrivate))
|
||||
|
@@ -203,6 +203,7 @@ class NetDbRenderer {
|
||||
}
|
||||
}
|
||||
if (notFound) {
|
||||
buf.append("<div class=\"netdbnotfound\">");
|
||||
buf.append(_t("Router")).append(' ');
|
||||
if (routerPrefix != null)
|
||||
buf.append(routerPrefix);
|
||||
@@ -213,6 +214,7 @@ class NetDbRenderer {
|
||||
else if (family != null)
|
||||
buf.append(_t("Family")).append(' ').append(family);
|
||||
buf.append(' ').append(_t("not found in network database"));
|
||||
buf.append("</div>");
|
||||
}
|
||||
}
|
||||
out.write(buf.toString());
|
||||
@@ -303,6 +305,7 @@ class NetDbRenderer {
|
||||
}
|
||||
|
||||
long now = _context.clock().now();
|
||||
buf.append("<div class=\"leasesets_container\">");
|
||||
for (LeaseSet ls : leases) {
|
||||
Destination dest = ls.getDestination();
|
||||
Hash key = dest.calculateHash();
|
||||
@@ -312,7 +315,7 @@ class NetDbRenderer {
|
||||
buf.append("<th><a href=\"tunnels#" + key.toBase64().substring(0,4) + "\">" + _t("Local") + "</a> ");
|
||||
boolean unpublished = ! _context.clientManager().shouldPublishLeaseSet(key);
|
||||
if (unpublished)
|
||||
buf.append(_t("Unpublished") + ' ');
|
||||
buf.append("<b>").append(_t("Unpublished")).append("</b> ");
|
||||
buf.append("<b>").append(_t("Destination")).append(":</b> ");
|
||||
TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key);
|
||||
if (in != null && in.getDestinationNickname() != null)
|
||||
@@ -365,17 +368,17 @@ class NetDbRenderer {
|
||||
if (debug) {
|
||||
buf.append("<tr><td colspan=\"2\">");
|
||||
buf.append("<b>RAP?</b> ").append(ls.getReceivedAsPublished());
|
||||
buf.append(" <b>RAR?</b> ").append(ls.getReceivedAsReply());
|
||||
buf.append(" <b>RAR?</b> ").append(ls.getReceivedAsReply());
|
||||
BigInteger dist = HashDistance.getDistance(ourRKey, ls.getRoutingKey());
|
||||
if (ls.getReceivedAsPublished()) {
|
||||
if (c++ == medianCount)
|
||||
median = dist;
|
||||
}
|
||||
buf.append(" <b>Distance: </b><span id=\"distance\">").append(fmt.format(biLog2(dist))).append("</span>");
|
||||
buf.append(" <b>Distance: </b>").append(fmt.format(biLog2(dist)));
|
||||
buf.append("</td></tr>\n<tr><td colspan=\"2\">");
|
||||
//buf.append(dest.toBase32()).append("<br>");
|
||||
buf.append("<b>Signature type:</b> ").append(dest.getSigningPublicKey().getType());
|
||||
buf.append(" <b>Encryption Key:</b> ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("…");
|
||||
buf.append(" <b>Encryption Key:</b> ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("…");
|
||||
buf.append("</td></tr>\n<tr><td colspan=\"2\">");
|
||||
buf.append("<b>Routing Key:</b> ").append(ls.getRoutingKey().toBase64());
|
||||
buf.append("</td></tr>");
|
||||
@@ -390,9 +393,9 @@ class NetDbRenderer {
|
||||
if (debug) {
|
||||
long exl = lease.getEndDate().getTime() - now;
|
||||
if (exl > 0)
|
||||
buf.append("<b>").append(_t("Expires in {0}", DataHelper.formatDuration2(exl))).append("</b>");
|
||||
buf.append("<b class=\"netdb_expiry\">").append(_t("Expires in {0}", DataHelper.formatDuration2(exl))).append("</b>");
|
||||
else
|
||||
buf.append("<b>").append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))).append("</b>");
|
||||
buf.append("<b class=\"netdb_expiry\">").append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))).append("</b>");
|
||||
}
|
||||
buf.append("</td></tr>\n");
|
||||
}
|
||||
@@ -400,6 +403,7 @@ class NetDbRenderer {
|
||||
out.write(buf.toString());
|
||||
buf.setLength(0);
|
||||
} // for each
|
||||
buf.append("</div>");
|
||||
} // !empty
|
||||
out.write(buf.toString());
|
||||
out.flush();
|
||||
@@ -427,18 +431,20 @@ class NetDbRenderer {
|
||||
*/
|
||||
public void renderStatusHTML(Writer out, int mode) throws IOException {
|
||||
if (!_context.netDb().isInitialized()) {
|
||||
out.write("<div id=\"notinitialized\">");
|
||||
out.write(_t("Not initialized"));
|
||||
out.write("</div>");
|
||||
out.flush();
|
||||
return;
|
||||
}
|
||||
Log log = _context.logManager().getLog(NetDbRenderer.class);
|
||||
long start = System.currentTimeMillis();
|
||||
|
||||
|
||||
boolean full = mode == 1;
|
||||
boolean shortStats = mode == 2;
|
||||
boolean showStats = full || shortStats; // this means show the router infos
|
||||
Hash us = _context.routerHash();
|
||||
|
||||
|
||||
StringBuilder buf = new StringBuilder(8192);
|
||||
if (showStats) {
|
||||
RouterInfo ourInfo = _context.router().getRouterInfo();
|
||||
@@ -446,11 +452,11 @@ class NetDbRenderer {
|
||||
out.write(buf.toString());
|
||||
buf.setLength(0);
|
||||
}
|
||||
|
||||
|
||||
ObjectCounter<String> versions = new ObjectCounter<String>();
|
||||
ObjectCounter<String> countries = new ObjectCounter<String>();
|
||||
int[] transportCount = new int[TNAMES.length];
|
||||
|
||||
|
||||
Set<RouterInfo> routers = new TreeSet<RouterInfo>(new RouterInfoComparator());
|
||||
routers.addAll(_context.netDb().getRouters());
|
||||
for (RouterInfo ri : routers) {
|
||||
@@ -475,7 +481,7 @@ class NetDbRenderer {
|
||||
if (log.shouldWarn())
|
||||
log.warn("part 1 took " + (end - start));
|
||||
start = end;
|
||||
|
||||
|
||||
//
|
||||
// don't bother to reindent
|
||||
//
|
||||
@@ -506,7 +512,7 @@ class NetDbRenderer {
|
||||
if (log.shouldWarn())
|
||||
log.warn("part 2 took " + (end - start));
|
||||
start = end;
|
||||
|
||||
|
||||
// transports table
|
||||
buf.append("<table id=\"netdbtransports\">\n");
|
||||
buf.append("<tr><th align=\"left\">" + _t("Transports") + "</th><th>" + _t("Count") + "</th></tr>\n");
|
||||
@@ -591,6 +597,7 @@ class NetDbRenderer {
|
||||
* Be careful to use stripHTML for any displayed routerInfo data
|
||||
* to prevent vulnerabilities
|
||||
*/
|
||||
|
||||
private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) {
|
||||
String hash = info.getIdentity().getHash().toBase64();
|
||||
buf.append("<table class=\"netdbentry\">")
|
||||
@@ -599,6 +606,13 @@ class NetDbRenderer {
|
||||
buf.append("<a name=\"our-info\" ></a><b>" + _t("Our info") + ":</b> <code>").append(hash).append("</code></th><th>");
|
||||
} else {
|
||||
buf.append("<b>" + _t("Peer info for") + ":</b> <code>").append(hash).append("</code></th><th>");
|
||||
String country = _context.commSystem().getCountry(info.getIdentity().getHash());
|
||||
if (country != null) {
|
||||
buf.append("<a href=\"/netdb?c=").append(country).append("\">");
|
||||
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append('\"');
|
||||
buf.append(" title=\"").append(getTranslatedCountry(country)).append('\"');
|
||||
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ").append("</a>");
|
||||
}
|
||||
if (!full) {
|
||||
buf.append("<a title=\"").append(_t("View extended router info"))
|
||||
.append("\" class=\"viewfullentry\" href=\"netdb?r=").append(hash.substring(0, 6))
|
||||
@@ -609,43 +623,36 @@ class NetDbRenderer {
|
||||
long age = _context.clock().now() - info.getPublished();
|
||||
if (isUs && _context.router().isHidden()) {
|
||||
buf.append("<td><b>").append(_t("Hidden")).append(", ").append(_t("Updated")).append(":</b></td>")
|
||||
.append("<td colspan=\"2\">")
|
||||
.append("<td colspan=\"2\"><span class=\"netdb_info\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age)))
|
||||
.append("</td>");
|
||||
.append("</span> ");
|
||||
} else if (age > 0) {
|
||||
buf.append("<td><b>").append(_t("Published")).append(":</b></td>")
|
||||
.append("<td colspan=\"2\">")
|
||||
.append("<td colspan=\"2\"><span class=\"netdb_info\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age)))
|
||||
.append("</td>");
|
||||
.append("</span> ");
|
||||
} else {
|
||||
// shouldnt happen
|
||||
buf.append("<td colspan=\"2\"><b>").append(_t("Published")).append(":</b> in ").append(DataHelper.formatDuration2(0-age)).append("???</td>");
|
||||
buf.append("<td><b>").append(_t("Published")).append("</td><td colspan=\"2\">:</b> in ")
|
||||
.append(DataHelper.formatDuration2(0-age)).append("<span class=\"netdb_info\">???</span> ");
|
||||
}
|
||||
buf.append("</tr>\n<tr><td>");
|
||||
buf.append("<b>").append(_t("Signing Key")).append(":</b> ")
|
||||
.append("</td><td colspan=\"2\">")
|
||||
.append(info.getIdentity().getSigningPublicKey().getType().toString());
|
||||
buf.append("</td></tr>\n<tr>")
|
||||
.append("<td><b>" + _t("Address(es)") + ":</b></td>")
|
||||
.append("<td colspan=\"2\">");
|
||||
String country = _context.commSystem().getCountry(info.getIdentity().getHash());
|
||||
if(country != null) {
|
||||
buf.append("<a href=\"/netdb?c=").append(country).append("\">");
|
||||
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append('\"');
|
||||
buf.append(" title=\"").append(getTranslatedCountry(country)).append('\"');
|
||||
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ").append("</a>");
|
||||
}
|
||||
.append("<td colspan=\"2\" class=\"netdb_addresses\">");
|
||||
for (RouterAddress addr : info.getAddresses()) {
|
||||
String style = addr.getTransportStyle();
|
||||
buf.append("<b>").append(DataHelper.stripHTML(style)).append(":</b> ");
|
||||
buf.append("<br><b class=\"netdb_transport\">").append(DataHelper.stripHTML(style)).append(":</b>");
|
||||
int cost = addr.getCost();
|
||||
if (!((style.equals("SSU") && cost == 5) || (style.equals("NTCP") && cost == 10)))
|
||||
buf.append('[').append(_t("cost")).append('=').append("" + cost).append("] ");
|
||||
buf.append(" <span class=\"netdb_name\">").append(_t("cost")).append("</span>: <span class=\"netdb_info\">").append("" + cost).append("</span> ");
|
||||
Map<Object, Object> p = addr.getOptionsMap();
|
||||
for (Map.Entry<Object, Object> e : p.entrySet()) {
|
||||
String name = (String) e.getKey();
|
||||
String val = (String) e.getValue();
|
||||
buf.append('[').append(_t(DataHelper.stripHTML(name))).append('=').append(DataHelper.stripHTML(val)).append("] ");
|
||||
buf.append(" <span class=\"nowrap\"><span class=\"netdb_name\">").append(_t(DataHelper.stripHTML(name)))
|
||||
.append(":</span> <span class=\"netdb_info\">").append(DataHelper.stripHTML(val)).append("</span></span> ");
|
||||
}
|
||||
}
|
||||
buf.append("</td></tr>\n");
|
||||
|
@@ -271,11 +271,11 @@ class SybilRenderer {
|
||||
double p = pp.points;
|
||||
if (p < MIN_DISPLAY_POINTS)
|
||||
break; // sorted
|
||||
buf.append("<p class=\"threatpoints\"><b>Threat Points: " + fmt.format(p) + "</b><ul>");
|
||||
buf.append("<p class=\"threatpoints\"><b>Threat Points: " + fmt.format(p) + "</b></p><ul>");
|
||||
for (String s : pp.reasons) {
|
||||
buf.append("<li>").append(s).append("</li>");
|
||||
}
|
||||
buf.append("</ul></p>");
|
||||
buf.append("</ul>");
|
||||
renderRouterInfo(buf, ri, null, false, false);
|
||||
}
|
||||
}
|
||||
@@ -586,7 +586,7 @@ class SybilRenderer {
|
||||
}
|
||||
|
||||
private void renderIPGroupsFamily(Writer out, StringBuilder buf, List<RouterInfo> ris, Map<Hash, Points> points) throws IOException {
|
||||
buf.append("<h3 id=\"samefamily\" class=\"sybils\">Floodfills in the Same Declared Family</h3>");
|
||||
buf.append("<h3 id=\"samefamily\" class=\"sybils\">Floodfills in the Same Declared Family</h3><div class=\"sybil_container\">");
|
||||
ObjectCounter<String> oc = new ObjectCounter<String>();
|
||||
for (RouterInfo info : ris) {
|
||||
String fam = info.getOption("family");
|
||||
@@ -602,7 +602,7 @@ class SybilRenderer {
|
||||
for (String s : foo) {
|
||||
int count = oc.count(s);
|
||||
String ss = DataHelper.escapeHTML(s);
|
||||
buf.append("<p class=\"family\"><b>").append(count).append(" floodfills in family: <a href=\"/netdb?fam=")
|
||||
buf.append("<p class=\"family\"><b>").append(count).append(" floodfills in family: <a href=\"/netdb?fam=")
|
||||
.append(ss).append("&sybil\">").append(ss).append("</a></b></p>");
|
||||
for (RouterInfo info : ris) {
|
||||
String fam = info.getOption("family");
|
||||
@@ -628,6 +628,7 @@ class SybilRenderer {
|
||||
}
|
||||
if (!found)
|
||||
buf.append("<p class=\"notfound\">None</p>");
|
||||
buf.append("</div>");
|
||||
out.write(buf.toString());
|
||||
out.flush();
|
||||
buf.setLength(0);
|
||||
@@ -754,7 +755,8 @@ class SybilRenderer {
|
||||
break;
|
||||
}
|
||||
double avg = tot / count;
|
||||
buf.append("<p id=\"sybil_totals\"><b>Totals for " + count + " floodfills: </b>MIN=" + fmt.format(min) + " AVG=" + fmt.format(avg) + " MEDIAN=" + fmt.format(median) + " MAX=" + fmt.format(max) + "</p>\n");
|
||||
buf.append("<p id=\"sybil_totals\"><b>Totals for " + count + " floodfills: </b><span class=\"netdb_name\">MIN:</span > " + fmt.format(min) + " <span class=\"netdb_name\">AVG:</span> " +
|
||||
fmt.format(avg) + " <span class=\"netdb_name\">MEDIAN:</span> " + fmt.format(median) + " <span class=\"netdb_name\">MAX:</span> " + fmt.format(max) + "</p>\n");
|
||||
out.write(buf.toString());
|
||||
out.flush();
|
||||
buf.setLength(0);
|
||||
@@ -789,36 +791,53 @@ class SybilRenderer {
|
||||
*/
|
||||
private double renderRouterInfo(StringBuilder buf, RouterInfo info, Hash us, boolean isUs, boolean full) {
|
||||
String hash = info.getIdentity().getHash().toBase64();
|
||||
buf.append("<table class=\"sybil_routerinfo\"><a name=\"").append(hash.substring(0, 6)).append("\" ></a><tr>");
|
||||
buf.append("<a name=\"").append(hash.substring(0, 6)).append("\"></a><table class=\"sybil_routerinfo\"><tr>");
|
||||
double distance = 0;
|
||||
if (isUs) {
|
||||
buf.append("<th colspan=\"4\"><a name=\"our-info\" ></a><b>" + _t("Our info") + ":</b> <code>").append(hash).append("</code></th></tr>\n");
|
||||
buf.append("<th colspan=\"2\"><a name=\"our-info\" ></a><b>" + _t("Our info") + ":</b> <code>").append(hash)
|
||||
.append("</code></th></tr>\n<tr><td class=\"sybilinfo_params\" colspan=\"2\"><div class=\"sybilinfo_container\">");
|
||||
} else {
|
||||
buf.append("<th colspan=\"2\"><b>" + _t("Router") + ":</b> <code>").append(hash).append("</code>\n");
|
||||
buf.append("<th><b>" + _t("Router") + ":</b> <code>").append(hash).append("</code>\n");
|
||||
|
||||
String country = _context.commSystem().getCountry(info.getIdentity().getHash());
|
||||
buf.append("</th><th>");
|
||||
if(country != null) {
|
||||
buf.append("<a href=\"/netdb?c=").append(country).append("\">");
|
||||
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append('\"');
|
||||
buf.append(" title=\"").append(getTranslatedCountry(country)).append('\"');
|
||||
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ").append("</a>");
|
||||
}
|
||||
if (!full) {
|
||||
buf.append("</th><th><a title=\"View extended router info\" class=\"viewfullentry\" href=\"netdb?r=").append(hash.substring(0, 6)).append("\" >[").append(_t("Full entry")).append("]</a></th><th>");
|
||||
buf.append("<a title=\"View extended router info\" class=\"viewfullentry\" href=\"netdb?r=")
|
||||
.append(hash.substring(0, 6)).append("\" >[").append(_t("Full entry")).append("]</a></th><th>");
|
||||
}
|
||||
buf.append("<img src=\"/imagegen/id?s=32&c=" + hash.replace("=", "%3d") + "\" height=\"32\" width=\"32\"> ");
|
||||
buf.append("</th></tr>\n");
|
||||
buf.append("</th></tr>\n<tr><td class=\"sybilinfo_params\" colspan=\"3\"><div class=\"sybilinfo_container\">");
|
||||
if (us != null) {
|
||||
BigInteger dist = HashDistance.getDistance(us, info.getHash());
|
||||
distance = biLog2(dist);
|
||||
buf.append("<tr><td><b>Hash Distance:</b></td><td colspan=\"3\">").append(fmt.format(distance)).append("</td></tr>\n");
|
||||
buf.append("<p><b>Hash Distance:</b> ").append(fmt.format(distance)).append("</p>\n");
|
||||
}
|
||||
}
|
||||
buf.append("<tr><td><b>Routing Key:</b></td><td colspan=\"3\">").append(info.getRoutingKey().toBase64()).append("</td></tr>\n");
|
||||
buf.append("<tr><td><b>Version:</b></td><td colspan=\"3\">").append(DataHelper.stripHTML(info.getVersion())).append("</td></tr>\n");
|
||||
buf.append("<tr><td><b>Caps:</b></td><td colspan=\"3\">").append(DataHelper.stripHTML(info.getCapabilities())).append("</td></tr>\n");
|
||||
String fam = info.getOption("family");
|
||||
if (fam != null)
|
||||
buf.append("<tr><td><b>Family:</b></td><td colspan=\"3\">").append(DataHelper.escapeHTML(fam)).append("</td></tr>\n");
|
||||
String kls = info.getOption("netdb.knownLeaseSets");
|
||||
if (kls != null)
|
||||
buf.append("<tr><td><b>Lease Sets:</b></td><td colspan=\"3\">").append(DataHelper.stripHTML(kls)).append("</td></tr>\n");
|
||||
buf.append("<p><b>Version:</b> ").append(DataHelper.stripHTML(info.getVersion())).append("</p>\n");
|
||||
buf.append("<p><b>Caps:</b> ").append(DataHelper.stripHTML(info.getCapabilities())).append("</p>\n");
|
||||
String kr = info.getOption("netdb.knownRouters");
|
||||
if (kr != null)
|
||||
buf.append("<tr><td><b>Routers:</b></td><td colspan=\"3\">").append(DataHelper.stripHTML(kr)).append("</td></tr>\n");
|
||||
|
||||
;
|
||||
if (kr != null) {
|
||||
buf.append("<p><b>Routers:</b> ").append(DataHelper.stripHTML(kr)).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Routers:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
String kls = info.getOption("netdb.knownLeaseSets");
|
||||
if (kls != null) {
|
||||
buf.append("<p class=\"sybilinfo_leasesets\"><b>Lease Sets:</b> ").append(DataHelper.stripHTML(kls)).append("</p>\n");
|
||||
} else {
|
||||
buf.append("<p class=\"sybilinfo_leasesets filler\"><b>Lease Sets:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
String fam = info.getOption("family");
|
||||
if (fam != null) {
|
||||
buf.append("<p><b>Family:</b> <span class=\"sybilinfo_familyname\">").append(DataHelper.escapeHTML(fam)).append("</span></p>\n");
|
||||
}
|
||||
long now = _context.clock().now();
|
||||
if (!isUs) {
|
||||
PeerProfile prof = _context.profileOrganizer().getProfileNonblocking(info.getHash());
|
||||
@@ -826,46 +845,53 @@ class SybilRenderer {
|
||||
long heard = prof.getFirstHeardAbout();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>First heard about:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>First heard about:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>First heard about:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
heard = prof.getLastHeardAbout();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last heard about:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last heard about:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last heard about:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
heard = prof.getLastHeardFrom();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last heard from:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last heard from:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>\n");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last heard from:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
DBHistory dbh = prof.getDBHistory();
|
||||
if (dbh != null) {
|
||||
heard = dbh.getLastLookupSuccessful();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last lookup successful:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last lookup successful:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last lookup successful:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
heard = dbh.getLastLookupFailed();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last lookup failed:</b></td><td colspan=\"3\"> ")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last lookup failed:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last lookup failed:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
heard = dbh.getLastStoreSuccessful();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last store successful:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last store successful:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last store successful:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
heard = dbh.getLastStoreFailed();
|
||||
if (heard > 0) {
|
||||
long age = Math.max(now - heard, 1);
|
||||
buf.append("<tr><td><b>Last store failed:</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>Last store failed:</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>");
|
||||
} else {
|
||||
buf.append("<p class=\"sybil_filler\"><b>Last store failed:</b> ").append(_t("n/a")).append("</p>");
|
||||
}
|
||||
}
|
||||
// any other profile stuff?
|
||||
@@ -873,25 +899,18 @@ class SybilRenderer {
|
||||
}
|
||||
long age = Math.max(now - info.getPublished(), 1);
|
||||
if (isUs && _context.router().isHidden()) {
|
||||
buf.append("<tr><td><b>").append(_t("Hidden")).append(", ").append(_t("Updated")).append(":</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
buf.append("<p><b>").append(_t("Hidden")).append(", ").append(_t("Updated")).append(":</b> ")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>\n");
|
||||
} else {
|
||||
buf.append("<tr><td><b>").append(_t("Published")).append(":</b></td><td colspan=\"3\">")
|
||||
.append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</td></tr>\n");
|
||||
}
|
||||
buf.append("<tr><td><b>").append(_t("Signing Key")).append(":</b></td><td colspan=\"3\">")
|
||||
.append(info.getIdentity().getSigningPublicKey().getType().toString()).append("</td></tr>\n");
|
||||
buf.append("<tr><td><b>" + _t("Addresses") + ":</b></td><td colspan=\"3\">");
|
||||
String country = _context.commSystem().getCountry(info.getIdentity().getHash());
|
||||
if(country != null) {
|
||||
buf.append("<a href=\"/netdb?c=").append(country).append("\">");
|
||||
buf.append("<img height=\"11\" width=\"16\" alt=\"").append(country.toUpperCase(Locale.US)).append('\"');
|
||||
buf.append(" title=\"").append(getTranslatedCountry(country)).append('\"');
|
||||
buf.append(" src=\"/flags.jsp?c=").append(country).append("\"> ").append("</a>");
|
||||
buf.append("<p><b>").append(_t("Published")).append(":</b> ").append(_t("{0} ago", DataHelper.formatDuration2(age))).append("</p>\n");
|
||||
}
|
||||
buf.append("<p><b>").append(_t("Signing Key")).append(":</b> ")
|
||||
.append(info.getIdentity().getSigningPublicKey().getType().toString()).append("</p>\n");
|
||||
buf.append("<p class=\"sybil_filler\"> </p>");
|
||||
buf.append("</div></td></tr><tr><td class=\"sybil_addresses\" colspan=\"3\"><table><tr><td><b>" + _t("Addresses") + ":</b></td><td>");
|
||||
for (RouterAddress addr : info.getAddresses()) {
|
||||
String style = addr.getTransportStyle();
|
||||
buf.append("<b>").append(DataHelper.stripHTML(style)).append(":</b> ");
|
||||
buf.append("<br><b class=\"netdb_transport\">").append(DataHelper.stripHTML(style)).append(":</b> ");
|
||||
Map<Object, Object> p = addr.getOptionsMap();
|
||||
for (Map.Entry<Object, Object> e : p.entrySet()) {
|
||||
String name = (String) e.getKey();
|
||||
@@ -899,15 +918,12 @@ class SybilRenderer {
|
||||
name.startsWith("iport") || name.equals("mtu"))
|
||||
continue;
|
||||
String val = (String) e.getValue();
|
||||
buf.append('[').append(_t(DataHelper.stripHTML(name))).append('=');
|
||||
if (name.equals("host"))
|
||||
buf.append("<b>");
|
||||
buf.append(DataHelper.stripHTML(val)).append("] ");
|
||||
if (name.equals("host"))
|
||||
buf.append("</b>");
|
||||
buf.append(" <span class=\"nowrap\"><span class=\"netdb_name\">").append(_t(DataHelper.stripHTML(name))).append(":</span> <span class=\"netdb_info\">");
|
||||
buf.append(DataHelper.stripHTML(val));
|
||||
buf.append("</span></span> ");
|
||||
}
|
||||
}
|
||||
buf.append("</td></tr>\n");
|
||||
buf.append("</table></td></tr>\n");
|
||||
buf.append("</table>\n");
|
||||
return distance;
|
||||
}
|
||||
|
@@ -212,8 +212,8 @@ class TunnelRenderer {
|
||||
Hash peer = info.getPeer(j);
|
||||
TunnelId id = (info.isInbound() ? info.getReceiveTunnelId(j) : info.getSendTunnelId(j));
|
||||
if (_context.routerHash().equals(peer)) {
|
||||
// Add empty content placeholders to force alignment. TODO tag "local" + tooltips for bandwidth tier / tunnel id for translation
|
||||
out.write(" <td class=\"cells\" align=\"center\"><span class=\"tunnel_peer tunnel_local\" title=\"Locally hosted tunnel\">local</span> "
|
||||
// Add empty content placeholders to force alignment. TODO tag tooltips for bandwidth tier / tunnel id for translation
|
||||
out.write(" <td class=\"cells\" align=\"center\"><span class=\"tunnel_peer tunnel_local\" title=\"Locally hosted tunnel\">" + _t("Local") + "</span> "
|
||||
+ "<span class=\"tunnel_id\" title=\"Tunnel identity\">" +
|
||||
(id == null ? "" : "" + id) + "</span><b class=\"tunnel_cap\" title=\"Bandwidth tier\"></b></td>");
|
||||
} else {
|
||||
|
Reference in New Issue
Block a user