- /netdb:
  - All Routers/Leasesets/Sybil sections:
    - Each transport instance on own line
    - Better presentation of address characteristics
    - Place flag in table header
  - Container div for leasesets to allow 2 column display at wider viewport width
  - Increased spacing of lease information in leaseset tables
  - Add div for "not initialized" message
  - Reorganize content display in sybil database to reduce horizontal whitespace:
    - Conditional 2-column display of sybil families
    - Sybil router characteristics & threatpoints presented in multi-column view
    - Added empty (n/a) fields to maintain visual consistency in column view
- /tunnels: ensure our tunnel tables display correctly in Arabic
This commit is contained in:
str4d
2017-07-01 19:44:02 +00:00
parent 56c0fbeebe
commit bd74b22b02
13 changed files with 2895 additions and 1765 deletions

View File

@@ -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("&nbsp;&nbsp;<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("&nbsp;&nbsp;<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("&hellip;");
buf.append("&nbsp;&nbsp;<b>Encryption Key:</b> ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("&hellip;");
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,7 +431,9 @@ 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;
}
@@ -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>&nbsp;<code>").append(hash).append("</code></th><th>");
} else {
buf.append("<b>" + _t("Peer info for") + ":</b>&nbsp;<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>&nbsp;&nbsp;");
} 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>&nbsp;&nbsp;");
} 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>&nbsp;&nbsp;");
}
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("&nbsp;<span class=\"netdb_name\">").append(_t("cost")).append("</span>: <span class=\"netdb_info\">").append("" + cost).append("</span>&nbsp;");
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>&nbsp;");
}
}
buf.append("</td></tr>\n");

View File

@@ -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:&nbsp;&nbsp;<a href=\"/netdb?fam=")
buf.append("<p class=\"family\"><b>").append(count).append(" floodfills in family: &nbsp;<a href=\"/netdb?fam=")
.append(ss).append("&amp;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: &nbsp;</b><span class=\"netdb_name\">MIN:</span > " + fmt.format(min) + "&nbsp; <span class=\"netdb_name\">AVG:</span> " +
fmt.format(avg) + "&nbsp; <span class=\"netdb_name\">MEDIAN:</span> " + fmt.format(median) + "&nbsp; <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&amp;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\">&nbsp;</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>&nbsp;");
}
}
buf.append("</td></tr>\n");
buf.append("</table></td></tr>\n");
buf.append("</table>\n");
return distance;
}

View File

@@ -1,4 +1,20 @@
2017-07-01 str4d
* Console:
- /netdb:
- All Routers/Leasesets/Sybil sections:
- Each transport instance on own line
- Better presentation of address characteristics
- Place flag in table header
- Container div for leasesets to allow 2 column display at wider viewport width
- Increased spacing of lease information in leaseset tables
- Add div for "not initialized" message
- Reorganize content display in sybil database to reduce horizontal whitespace:
- Conditional 2-column display of sybil families
- Sybil router characteristics & threatpoints presented in multi-column view
- Added empty (n/a) fields to maintain visual consistency in column view
- /tunnels:
- Tag "Local" for translation (and convert to lowercase in CSS)
- Arabic: ensure our tunnel tables display correctly
* I2PSnark: Fix unclosed <label>
2017-06-19 str4d

File diff suppressed because it is too large Load Diff

View File

@@ -1,29 +1,23 @@
/* Console Theme "Classic" - Mobile Override */
div.routersummaryouter {
body {
margin: 2px 1px !important;
}
.routersummaryouter {
float: none;
margin: 0 !important;
position: relative;
width: auto;
}
div.routersummary {
.routersummary {
float: none;
width: auto;
max-width: 600px;
margin: 0 auto -6px;
}
@media screen and (min-width: 1500px) {
div.routersummary {
width: 600px !important;
}
.routersummary table[id^="sb_"] {
width: 600px !important;
}
}
#xhr {
margin-top: 9px !important;
}
@@ -49,7 +43,11 @@ div.routersummary {
font-size: 9pt !important;
}
div.routersummary table, table[id^="sb_"] {
.routersummary h3, .routersummary h3 a {
font-size: 10.5pt !important;
}
.routersummary table, table[id^="sb_"] {
width: 100% !important;
margin: -6px 0 -7px !important;
}
@@ -152,4 +150,16 @@ div.main {
.sorry {
margin: -1px 0 0 !important;
}
.routersummary {
width: 600px !important;
}
.routersummary div[style="height: 36px;"] {
margin-top: 2px !important;
}
.routersummary table[id^="sb_"] {
width: 600px !important;
}
}

View File

@@ -1415,7 +1415,11 @@ a:active {
/* welcome */
.twocol {
-moz-columns: 2 400px;
-webkit-columns: 2 400px;
columns: 2 400px;
-moz-column-gap: 0 !important;
-webkit-column-gap: 0 !important;
column-gap: 0 !important;
display: block;
}
@@ -1423,7 +1427,7 @@ a:active {
.twocol li {
break-inside: avoid;
page-break-inside: avoid;
-webkit-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.twocol li:first-child {
@@ -2498,7 +2502,7 @@ tr#addnew, tr#addnew:hover {
.themechoice {
background: #000;
background: linear-gradient(to bottom, #010 0%, #000 100%);
width: 110px;
width: 120px;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
@@ -2571,11 +2575,11 @@ tr#addnew, tr#addnew:hover {
}
.themechoice .optbox {
min-width: 114px !important;
min-width: 124px !important;
min-height: 80px !important;
outline: 1px !important; /* placement guide */
opacity: 0; /* hide the radio icon so we can use thumbnail img instead */
margin-left: -33px;
margin-left: -38px;
z-index: 999;
position: absolute;
}
@@ -2633,7 +2637,7 @@ p#helptranslate {
min-height: 16px;
}
div.themelabel {
.themelabel {
border-top: 1px solid #262 !important;
margin-left: -4px;
margin-right: -4px;
@@ -2658,7 +2662,7 @@ h3#themeheading, h3#langheading, h3#passwordheading {
background: linear-gradient(to right, #000 0%, #001000 70%, #001300 90%);
}
div#themesettings {
#themesettings {
clear: both;
border: 1px solid #494;
padding: 8px 7px 0;
@@ -2680,7 +2684,7 @@ td#themeselect {
.langselect { /* containing box for lang selection */
background: #000;
background: linear-gradient(to bottom, #010 0%, #000 80%);
width: 110px;
width: 120px;
float: left;
margin: 4px;
text-align: center;
@@ -2705,7 +2709,7 @@ td#themeselect {
.langselect .optbox {
opacity: 0;
outline: 1px dotted !important;
min-width: 111px !important;
min-width: 124px !important;
margin: -7px 0 -34px -2px;
min-height: 66px;
vertical-align: text-bottom;
@@ -2716,7 +2720,7 @@ td#themeselect {
.langselect img {
border: 1px solid #002000;
margin-bottom: 0;
margin-left: -65px;
margin-left: -71px;
margin-top: 7px !important;
position: absolute;
}
@@ -2765,7 +2769,7 @@ td#themeselect {
border: 1px solid #f60;
box-shadow: 0 0 1px #f30;
margin-top: 6px !important;
margin-left: -67px;
margin-left: -72px;
}
.langselect input[name="lang"]:checked + img + div.ui_lang {
@@ -2774,6 +2778,18 @@ td#themeselect {
font-weight: bold;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
.langselect img {
margin-left: -9px;
margin-top: -17px !important;
}
.langselect input[name="lang"]:checked + img, .langselect input[name="lang"]:checked + #config_ui img[src="/flags.jsp?c=a1"] {
margin-left: -10px;
margin-top: -18px !important;
}
}
/* end flag as radio icons */
div.ui_lang { /* lang text label */
@@ -4900,7 +4916,7 @@ div.debugcontainer {
}
#leasesetdebug, #leasesetsummary {
margin-bottom: 10px;
margin-bottom: 14px;
}
.leaseset th {
@@ -4978,7 +4994,7 @@ div.debugcontainer {
width: 10px;
}
#noleasesets {
#noleasesets, #notinitialized, .netdbnotfound {
background: #000 url(images/infohelp.png) 12px center no-repeat;
padding: 15px 15px 15px 50px;
border: 1px solid #494;
@@ -5105,6 +5121,10 @@ p.sybil_info, p.family, p.threatpoints, p.hashdist, p#sybil_totals, p.notfound {
box-shadow: inset 0 0 0 1px #300;
}
p#sybil_totals {
font-weight: normal;
}
p.family + p.family, p.sybil_info + p.sybil_info {
margin-top: -4px;
}
@@ -5118,14 +5138,20 @@ p.sybil_info + a[name] + table.sybil_routerinfo, p.hashdist + a[name] + table.sy
}
.threatpoints + ul {
background: #000;
border: 1px solid #494;
padding: 5px 5px 0;
margin: -4px 0 10px;
}
.threatpoints + ul li:last-child {
margin-bottom: 5px;
}
.sybil_routerinfo + .threatpoints + ul + a[name] + table {
margin-top: -11px;
}
h3#known {
margin-bottom: 0 !important;
}
@@ -5738,6 +5764,538 @@ p#profiles_overview {
/* end profiles/peers */
/* network status */
.routersummary h4 a {
width: auto !important;
vertical-align: middle;
display: inline;
}
.routersummary .error, .routersummary .warn, .routersummary .testing, .routersummary .hidden,
.routersummary .running, .routersummary .firewalled, .routersummary .vmcomm, .routersummary .clockskew, .tunnelBuildStatus {
display: inline-block;
vertical-align: middle;
border: 1px solid #316f30;
box-sizing: border-box;
border: 1px solid rgba(49, 111, 48, 0.6);
padding: 6px 3px;
width: 100%;
margin: -5px 0;
box-shadow: inset 0 0 0 1px #000;
text-shadow: 0 1px 1px #000;
}
.routersummary .firewalled {
border: 1px dotted #316f30;
border: 1px dotted rgba(49, 111, 48, 0.6);
}
.routersummary .error {
border: 1px solid #900;
border: 1px solid rgba(153, 0, 0, 0.6);
}
.routersummary .warn, .routersummary .clockskew {
border: 1px solid #aa0;
border: 1px solid rgba(170, 170, 0, 0.6);
}
.routersummary .testing {
border: 1px solid #fa0;
border: 1px solid rgba(255, 170, 0, 0.6);
}
.routersummary .hidden, .routersummary .vmcomm {
border: 1px dotted #777;
border: 1px solid rgba(119, 119, 119, 0.6);
}
.routersummary .running {
border: 1px solid #316f30;
border: 1px solid rgba(49, 111, 48, 0.6);
}
.routersummary .error::before, .routersummary .warn::before, .routersummary .testing::before, .routersummary .hidden::before,
.routersummary .running::before, .routersummary .firewalled::before, .routersummary .vmcomm::before, .routersummary .clockskew::before {
padding: 0 2px;
vertical-align: middle;
display: inline-block;
filter: drop-shadow(0 0 1px rgba(192,192,192,0.5));
}
.routersummary .error::before, .routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_error.png);
}
.routersummary .warn::before {
content: url(/themes/console/images/info/network_status/network_warning.png);
}
.routersummary .testing::before {
content: url(/themes/console/images/info/network_status/network_testing.png);
}
.routersummary .hidden::before {
content: url(/themes/console/images/info/network_status/network_hidden.png);
padding: 0 3px;
}
.routersummary .running::before {
content: url(/themes/console/images/info/network_status/network_ok.png);
}
.routersummary .firewalled::before {
content: url(/themes/console/images/info/network_status/network_firewalled.png);
}
.routersummary .vmcomm::before {
content: url(/themes/console/images/info/network_status/network_vm.png);
}
.routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_clockskew.png);
}
/* end network status */
/* /tunnels */
tt a {
letter-spacing: 0.07em;
}
.tunnel_cap {
background: rgba(0,96,0,0.3);
color: #bb7;
border: 1px solid rgba(0,64,0,0.2);
border-radius: 2px;
min-width: 12px;
padding: 0 2px;
display:inline-block;
margin: 1px 2px 1px 8px;
text-align: center !important;
text-shadow: 0 1px 1px #555;
}
.tunnel_cap:empty {
border: none;
}
.tunnel_id {
display: inline-block;
min-width: 78px;
text-align: right;
}
.tunnel_id:empty {
min-width: 0;
}
.tunnel_id:empty + .tunnel_cap {
margin-left: 12px !important;
display: inline-block;
}
.tunnel_peer {
display: inline-block;
min-width: 56px;
text-align: right;
}
.tunnel_local {
font-size: 8pt;
text-transform: lowercase;
background: rgba(0,96,0,0.3);
border-radius: 2px;
text-align: center;
padding: 2px 0;
margin-left: -4px;
margin-right: 4px;
}
.tunnel_peer:empty {
vertical-align: top;
}
#tunnel_defs {
margin-top: -1px;
margin-bottom: 10px;
}
#tunnel_defs td:first-child, #tunnel_defs td:nth-child(even) {
width: 1%;
white-space: nowrap;
}
@media screen and (max-width: 1100px) {
.tunnel_id, .tunnel_peer {
min-width: 0 !important;
text-align: center !important;
}
.tunnel_local {
margin-right: 5px;
margin-left: 2px;
padding: 2px 4px;
}
.tunnel_peer:empty {
vertical-align: middle;
}
.tunnel_peer:empty::before {
margin: 1px 6px 1px 2px;
}
.tunnel_cap {
margin-left: 5px !important;
}
}
@media screen and (max-width: 1200px) {
#tunnel_defs {
margin-bottom: 5px;
}
}
@media screen and (min-width: 1500px) {
.tunnel_cap {
margin-left: 10px;
padding: 0 1px;
min-width: 14px;
}
.tunnel_id:empty {
margin-right: -10px;
}
}
/* end tunnels */
/* /peers */
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10),
#ntcpconnections td:nth-child(6), #ntcpconnections td:nth-child(7), #ntcpconnections td:nth-child(8), #ntcpconnections td:nth-child(9), #ntcpconnections td:nth-child(10),
#udpconnections td:nth-child(6), #udpconnections td:nth-child(7), #udpconnections td:nth-child(9), #udpconnections td:nth-child(10), #udpconnections td:nth-child(11),
#udpconnections td:nth-child(13), #udpconnections td:nth-child(14), #udpconnections td:nth-child(15), #udpconnections td:nth-child(16) {
text-align: right;
white-space: nowrap;
}
#ntcpconnections .tablefooter td:nth-child(3), #ntcpconnections .tablefooter td:nth-child(4), #ntcpconnections .tablefooter td:nth-child(5), #ntcpconnections .tablefooter td:nth-child(6),
#udpconnections .tablefooter td:nth-child(3), #udpconnections .tablefooter td:nth-child(4), #udpconnections .tablefooter td:nth-child(7), #udpconnections .tablefooter td:nth-child(8),
#udpconnections .tablefooter td:nth-child(10), #udpconnections .tablefooter td:nth-child(11), #udpconnections .tablefooter td:nth-child(12), #udpconnections .tablefooter td:nth-child(13) {
text-align: right;
}
#udpconnections .tablefooter td:nth-child(9) {
text-align: center !important;
}
#ntcpconnections td:nth-child(4), #ntcpconnections td:nth-child(5), #udpconnections td:nth-child(4),
#udpconnections td:nth-child(5), #udpconnections td:nth-child(8), #udpconnections td:nth-child(12) {
white-space: nowrap;
}
#udpconnections .tablefooter td, #ntcpconnections .tablefooter td {
padding-left: 5px;
padding-right: 5px;
}
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10) {
text-align: right;
}
#udpconnections th:nth-child(6), #udpconnections th:nth-child(7), #udpconnections th:nth-child(n+9) {
text-align: right;
}
#udpconnections th:nth-child(12) {
text-align: center;
}
.peersort {
text-align: center;
display: inline-block;
}
.right {
text-align: right;
margin: 0 1px;
display: inline-block;
width: 40%
}
.left {
text-align: left;
margin: 0 1px;
display: inline-block;
width: 40%
}
.peeripv6:empty {
padding: 0;
width: 0;
}
.cwnd .left, .cwnd .right {
width: auto;
}
#udpconnections th:nth-child(n+13), #udpconnections .tablefooter th:nth-child(n+10),
#udpconnections td:nth-child(n+13), #udpconnections .tablefooter td:nth-child(n+10) {
padding-right: 1% !important;
}
/* end peers */
/* netdb router address info */
.leasesets_container {
-moz-columns: 680px 2;
-webkit-columns: 680px 2;
columns: 680px 2;
-moz-column-gap: 10px;
-webkit-column-gap: 10px;
column-gap: 10px;
}
th code {
-moz-user-select: all;
-webkit-user-select: all;
user-select: all;
}
@media screen and (min-width: 1634px) {
.leasesets_container {
margin-bottom: 8px;
}
th code {
font-size: 9pt !important;
}
}
.leasesets_container table:first-child {
margin-top: 0;
}
.leasesets_container table {
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.netdb_addresses br:first-child, .sybil_routerinfo tr:last-child td br:first-child {
display: none;
}
.netdbentry th:first-child::after {
content: "";
display: inline-block;
min-height: 20px;
vertical-align: middle;
}
.netdbentry th:last-child > *, .sybil_routerinfo th:nth-child(2) > * {
display: inline-block;
vertical-align: middle !important;
}
.netdbentry th a img {
display: inline-block;
vertical-align: middle;
margin-right: 1px;
margin-bottom: 2px;
}
.netdbentry a.viewfullentry::after {
display: inline-block;
vertical-align: middle !important;
margin-left: 3px;
}
.netdbentry td:first-child {
text-align: right;
min-width: 100px;
padding-right: 5px !important
}
b.netdb_transport {
display: inline-block;
width: 50px;
text-align: right;
margin-right: 5px;
}
#netdb code {
font-weight: normal !important;
}
.netdb_name {
color: #bb3;
text-transform: capitalize;
font-weight: bold;
}
.netdb_info {
margin-right: 1px;
}
.netdb_expiry {
margin-left: 5px;
}
.sybil_routerinfo th img[src^="/flags"] {
height: 11px;
width: 16px;
margin-right: 5px;
}
.sybil_routerinfo b.netdb_transport {
margin-left: -13px;
margin-right: 0;
}
.sybil_routerinfo td:first-child, .netdbentry td:first-child {
text-align: right !important;
padding-right: 0;
}
.sybil_routerinfo td[colspan="3"] {
white-space: normal;
}
.sybil_container {
-moz-columns: 680px 2;
-webkit-columns: 680px 2;
columns: 680px 2;
margin: 10px 0;
}
.sybil_container p {
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.sybil_container p:first-child {
margin-top: 0;
}
.sybil_container p:last-child {
margin-bottom: 0;
}
/* end netdb router address */
/* sybils */
.leaseset th:last-child, .leaseset td:last-child, .sybil_routerinfo th:last-child, .sybil_routerinfo td:last-child {
border-right: 1px solid #494 !important;
}
.sybil_routerinfo table td:last-child {
border-right: none !important;
}
.sybilinfo_params {
padding: 0;
border-bottom: 1px solid #494
}
.sybilinfo_container {
columns: 240px auto;
-moz-columns: 240px auto;
-webkit-columns: 240px auto;
-moz-column-gap: 0;
-webkit-column-gap: 0;
column-gap: 0;
background: #010;
padding: 4px 5px;
}
.sybilinfo_container b {
color: #bb3;
}
.sybil_routerinfo tr:last-child {
border-top: none;
}
.sybil_routerinfo p {
margin: 0;
padding: 0;
line-height: 140%;
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.sybilinfo_familyname {
display: inline-block;
vertical-align: top;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sybil_addresses td:first-child {
max-width: 155px;
font-weight: bold;
padding-right: 9px;
}
.sybil_addresses table {
width: 100%;
margin: 0;
}
.sybil_addresses {
padding: 0;
border-bottom: 1px solid #494
}
.sybil_addresses table, .sybil_addresses td {
border: none;
}
.threatpoints + ul {
-moz-columns: auto 600px;
-webkit-columns: auto 600px;
columns: auto 600px;
-moz-column-rule: 1px solid #2a5f29;
-webkit-column-rule: 1px solid #2a5f29;
column-rule: 1px solid #2a5f29;
padding-top: 3px;
padding-bottom: 3px;
}
.threatpoints + ul li:first-child {
margin-top: 0 !important;
}
.threatpoints + ul li:last-child {
margin-bottom: 0 !important;
}
.threatpoints + ul li {
list-style: none;
margin-left: 5px;
line-height: 100%;
break-inside: avoid !important;
page-break-inside: avoid !important;
-webkit-column-break-inside: avoid !important;
}
.threatpoints + ul li a {
white-space: nowrap;
}
/* end sybils */
/* responsive layout */
@media screen and (max-width: 900px) {
@@ -6202,283 +6760,3 @@ _:-ms-lang(x), .tunnels_client th:first-child::after {
/* end Edge/IE tweaks */
/* network status */
.routersummary h4 a {
width: auto !important;
vertical-align: middle;
display: inline;
}
.routersummary .error, .routersummary .warn, .routersummary .testing, .routersummary .hidden,
.routersummary .running, .routersummary .firewalled, .routersummary .vmcomm, .routersummary .clockskew, .tunnelBuildStatus {
display: inline-block;
vertical-align: middle;
border: 1px solid #316f30;
box-sizing: border-box;
border: 1px solid rgba(49, 111, 48, 0.6);
padding: 6px 3px;
width: 100%;
margin: -5px 0;
box-shadow: inset 0 0 0 1px #000;
text-shadow: 0 1px 1px #000;
}
.routersummary .firewalled {
border: 1px dotted #316f30;
border: 1px dotted rgba(49, 111, 48, 0.6);
}
.routersummary .error {
border: 1px solid #900;
border: 1px solid rgba(153, 0, 0, 0.6);
}
.routersummary .warn, .routersummary .clockskew {
border: 1px solid #aa0;
border: 1px solid rgba(170, 170, 0, 0.6);
}
.routersummary .testing {
border: 1px solid #fa0;
border: 1px solid rgba(255, 170, 0, 0.6);
}
.routersummary .hidden, .routersummary .vmcomm {
border: 1px dotted #777;
border: 1px solid rgba(119, 119, 119, 0.6);
}
.routersummary .running {
border: 1px solid #316f30;
border: 1px solid rgba(49, 111, 48, 0.6);
}
.routersummary .error::before, .routersummary .warn::before, .routersummary .testing::before, .routersummary .hidden::before,
.routersummary .running::before, .routersummary .firewalled::before, .routersummary .vmcomm::before, .routersummary .clockskew::before {
padding: 0 2px;
vertical-align: middle;
display: inline-block;
filter: drop-shadow(0 0 1px rgba(192,192,192,0.5));
}
.routersummary .error::before, .routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_error.png);
}
.routersummary .warn::before {
content: url(/themes/console/images/info/network_status/network_warning.png);
}
.routersummary .testing::before {
content: url(/themes/console/images/info/network_status/network_testing.png);
}
.routersummary .hidden::before {
content: url(/themes/console/images/info/network_status/network_hidden.png);
padding: 0 3px;
}
.routersummary .running::before {
content: url(/themes/console/images/info/network_status/network_ok.png);
}
.routersummary .firewalled::before {
content: url(/themes/console/images/info/network_status/network_firewalled.png);
}
.routersummary .vmcomm::before {
content: url(/themes/console/images/info/network_status/network_vm.png);
}
.routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_clockskew.png);
}
/* end network status */
/* /tunnels */
tt a {
letter-spacing: 0.07em;
}
.tunnel_cap {
background: rgba(0,96,0,0.3);
color: #bb7;
border: 1px solid rgba(0,64,0,0.2);
border-radius: 2px;
min-width: 12px;
padding: 0 2px;
display:inline-block;
margin: 1px 2px 1px 8px;
text-align: center !important;
text-shadow: 0 1px 1px #555;
}
.tunnel_cap:empty {
border: none;
}
.tunnel_id {
display: inline-block;
min-width: 78px;
text-align: right;
}
.tunnel_id:empty {
min-width: 0;
}
.tunnel_id:empty + .tunnel_cap {
margin-left: 12px !important;
display: inline-block;
}
.tunnel_peer {
display: inline-block;
min-width: 56px;
text-align: right;
}
.tunnel_local {
font-size: 8pt;
background: rgba(0,96,0,0.3);
border-radius: 2px;
text-align: center;
padding: 2px 0;
margin-left: -4px;
margin-right: 4px;
}
.tunnel_peer:empty {
vertical-align: top;
}
#tunnel_defs {
margin-top: -1px;
margin-bottom: 10px;
}
@media screen and (max-width: 1100px) {
.tunnel_id, .tunnel_peer {
min-width: 0 !important;
text-align: center !important;
}
.tunnel_local {
margin-right: 5px;
margin-left: 2px;
padding: 2px 4px;
}
.tunnel_peer:empty {
vertical-align: middle;
}
.tunnel_peer:empty::before {
margin: 1px 6px 1px 2px;
}
.tunnel_cap {
margin-left: 5px !important;
}
}
@media screen and (max-width: 1200px) {
#tunnel_defs {
margin-bottom: 5px;
}
}
@media screen and (min-width: 1500px) {
.tunnel_cap {
margin-left: 10px;
padding: 0 1px;
min-width: 14px;
}
.tunnel_id:empty {
margin-right: -10px;
}
}
/* end tunnels */
/* /peers */
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10),
#ntcpconnections td:nth-child(6), #ntcpconnections td:nth-child(7), #ntcpconnections td:nth-child(8), #ntcpconnections td:nth-child(9), #ntcpconnections td:nth-child(10),
#udpconnections td:nth-child(6), #udpconnections td:nth-child(7), #udpconnections td:nth-child(9), #udpconnections td:nth-child(10), #udpconnections td:nth-child(11),
#udpconnections td:nth-child(13), #udpconnections td:nth-child(14), #udpconnections td:nth-child(15), #udpconnections td:nth-child(16) {
text-align: right;
white-space: nowrap;
}
#ntcpconnections .tablefooter td:nth-child(3), #ntcpconnections .tablefooter td:nth-child(4), #ntcpconnections .tablefooter td:nth-child(5), #ntcpconnections .tablefooter td:nth-child(6),
#udpconnections .tablefooter td:nth-child(3), #udpconnections .tablefooter td:nth-child(4), #udpconnections .tablefooter td:nth-child(7), #udpconnections .tablefooter td:nth-child(8),
#udpconnections .tablefooter td:nth-child(10), #udpconnections .tablefooter td:nth-child(11), #udpconnections .tablefooter td:nth-child(12), #udpconnections .tablefooter td:nth-child(13) {
text-align: right;
}
#udpconnections .tablefooter td:nth-child(9) {
text-align: center !important;
}
#ntcpconnections td:nth-child(4), #ntcpconnections td:nth-child(5), #udpconnections td:nth-child(4),
#udpconnections td:nth-child(5), #udpconnections td:nth-child(8), #udpconnections td:nth-child(12) {
white-space: nowrap;
}
#udpconnections .tablefooter td, #ntcpconnections .tablefooter td {
padding-left: 5px;
padding-right: 5px;
}
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10) {
text-align: right;
}
#udpconnections th:nth-child(6), #udpconnections th:nth-child(7), #udpconnections th:nth-child(n+9) {
text-align: right;
}
#udpconnections th:nth-child(12) {
text-align: center;
}
.peersort {
text-align: center;
display: inline-block;
}
.right {
text-align: right;
margin: 0 1px;
display: inline-block;
width: 40%
}
.left {
text-align: left;
margin: 0 1px;
display: inline-block;
width: 40%
}
.peeripv6:empty {
padding: 0;
width: 0;
}
.cwnd .left, .cwnd .right {
width: auto;
}
#udpconnections th:nth-child(n+13), #udpconnections .tablefooter th:nth-child(n+10),
#udpconnections td:nth-child(n+13), #udpconnections .tablefooter td:nth-child(n+10) {
padding-right: 1% !important;
}
/* end peers */

View File

@@ -106,14 +106,6 @@ div.routersummary td:first-child {
text-align: left;
}
div.tunnels {
padding: -3px 0 !important;
}
div.tunnels table {
margin: 0 -7px 0 5px !important;
}
.langbox {
float: left;
text-align: left;
@@ -154,11 +146,23 @@ span.newtab {
/* lang selection */
.langselect img {
margin-right: -61px;
margin-right: -71px;
}
.langselect .optbox:checked + img {
margin-right: -63px;
margin-right: -73px;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
.langselect img {
margin-right: -9px;
margin-top: -17px !important;
}
.langselect input[name="lang"]:checked + img, .langselect input[name="lang"]:checked + #config_ui img[src="/flags.jsp?c=a1"] {
margin-right: -10px;
margin-top: -18px !important;
}
}
/* theme selection */
@@ -172,7 +176,7 @@ span.newtab {
}
.themechoice .optbox {
opacity: 0; /* hide the radio icon so we can use thumbnail img instead */
opacity: 0;
outline: 1px dotted #f00;
position: absolute;
padding: 2px;
@@ -189,6 +193,8 @@ span.newtab {
padding: 0 !important;
}
/* end theme selection */
h3#iptransport a, th#upnpconfig a, h3#bwlimiter a, #config_stats h3 a, #config_logging h3 a, h3#graphdisplay a, #logs h3 a, h3#advancedconfig a {
float: left;
}
@@ -210,31 +216,31 @@ h3#iptransport a, th#upnpconfig a, h3#bwlimiter a, #config_stats h3 a, #config_l
padding: 1px 3px 1px 1px !important;
}
table#leasesetdebug th:first-child, table#leasesetsummary th:first-child {
#leasesetdebug th:first-child, #leasesetsummary th:first-child {
text-align: right;
}
table#leasesetdebug th:last-child, table#leasesetsummary th:last-child {
#leasesetdebug th:last-child, #leasesetsummary th:last-child {
text-align: left;
}
table#leasesetdebug th, table#leasesetsummary th {
#leasesetdebug th, #leasesetsummary th {
padding: 5px;
}
table.leaseset th {
.leaseset th {
text-align: right;
}
table.leaseset th:first-child b {
.leaseset th:first-child b {
float: right;
}
table.leaseset th:last-child, table.leaseset td:nth-child(2) {
.leaseset th:last-child, .leaseset td:nth-child(2) {
text-align: left;
}
#netdboverview th, table.netdbentry th, table#leasesetdebug td:nth-child(2n) {
#netdboverview th, table.netdbentry th, #leasesetdebug td:nth-child(2n) {
text-align: right;
}
@@ -250,7 +256,7 @@ table.leaseset th:last-child, table.leaseset td:nth-child(2) {
text-align: center;
}
table.netdbentry th:last-child, table#leasesetdebug td:nth-child(2n+1) {
table.netdbentry th:last-child, #leasesetdebug td:nth-child(2n+1) {
text-align: left;
}
@@ -258,11 +264,11 @@ table.netdbentry th:last-child, table#leasesetdebug td:nth-child(2n+1) {
float: left;
}
table#enviro td {
#enviro td {
padding: 5px 10px 5px 5px !important;
}
table#enviro td:first-child {
#enviro td:first-child {
text-align: left;
}
@@ -451,6 +457,37 @@ div[lang="ar"] ul, div[lang="ar"] p {
padding: 0;
}
.tunnel_local {
margin-right: -4px;
margin-left: 4px;
}
.tunnel_id:empty + .tunnel_cap {
display: inline-block;
margin-left: 0;
margin-right: 12px;
}
.sybil_routerinfo th img[src^="/flags"], .netdbentry th a img {
margin-left: 5px;
}
.sybil_routerinfo th:last-child {
padding: 1px !important;
}
.sybil_info, .family {
direction: ltr;
}
.leaseset th:last-child, .leaseset td:last-child, .sybil_routerinfo th:last-child, .sybil_routerinfo td:last-child {
border-right: none !important;
}
a.viewfullentry::after, a[href^="viewprofile"]::after {
margin-left: 3px !important;
}
@media screen and (min-width: 1500px) {
.main, .news, h1, .sorry {
margin-right: 232px !important;
@@ -498,3 +535,15 @@ div[lang="ar"], div[lang="ar"] code, div[lang="ar"] b {
margin-right: -82px;
}
}
@media screen and (-webkit-min-device-pixel-ratio:0) and (min-width: 1500px) {
.langselect img {
margin-right: -9px;
margin-top: -18px !important;
}
.langselect input[name="lang"]:checked + img, .langselect input[name="lang"]:checked + #config_ui img[src="/flags.jsp?c=a1"] {
margin-right: -10px;
margin-top: -19px !important;
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -661,7 +661,7 @@ td.subheading {
text-align: left;
}
table.leaseset:last-child, table.netdbentry:last-child, #profile_defs {
table.leaseset:last-child, .netdbentry:last-child, #profile_defs {
margin-bottom: -10px;
}
@@ -684,18 +684,26 @@ table#leasesetdebug td:first-child, table#leasesetsummary td:first-child {
padding-right: 5px !important;
}
table.netdbentry th:first-child {
text-align: right;
.netdbentry th:first-child {
text-align: right !important;
}
table.netdbentry th:last-child {
.netdbentry th:last-child {
text-align: left;
}
table.netdbentry td:nth-child(2) {
.netdbentry td:nth-child(2) {
direction: ltr;
}
.netdbentry th:last-child {
border-left: 1px solid #7778bf !important;
}
.netdbentry th a img {
margin-left: 6px;
}
#sybilnav li {
background: url(images/eye.png) right 5px center no-repeat, linear-gradient(to right, #eef 30%, #fff);
padding: 3px 24px 3px 3px;
@@ -705,6 +713,10 @@ table.netdbentry td:nth-child(2) {
margin-right: 20px;
}
.leaseset th:last-child, .leaseset td:last-child, .sybil_routerinfo th:last-child, .sybil_routerinfo td:last-child {
border-right: none !important;
}
p#profiles_overview, #profiles .widescroll + h3, #thresholds + h3, #profiles #banlist {
margin-right: -16px !important;
}
@@ -745,6 +757,10 @@ p#profiles_overview, #profiles .widescroll + h3, #thresholds + h3, #profiles #ba
padding-right: 10px;
}
.sybil_routerinfo th img[src^="/flags"], .netdbentry th a img {
margin-left: 5px;
}
.wideload .confignav {
margin-left: -3px !important;
margin-right: -35px !important;
@@ -877,6 +893,25 @@ table#bugreports td.infohelp {
margin-right: -2px;
}
.tunnel_local {
margin-right: 0;
margin-left: 4px;
}
.tunnel_id:empty + .tunnel_cap {
display: inline-block;
margin-left: 0;
margin-right: 12px;
}
#tunnel_defs td:nth-child(3) {
border-right: none;
}
#tunnels .cells {
text-align: center !important;
}
@media screen and (min-width: 1500px) {
.main, .news, h1, .sorry {
margin-right: 232px !important;

View File

@@ -460,7 +460,7 @@ td.infohelp {
}
.tunnelConfig td > b {
margin-left: 5px;
margin: 2px 0 2px 5px;
min-width: 30px;
display: inline-block;
}

View File

@@ -2431,7 +2431,11 @@ h2, h3, h4, .confignav {
}
.twocol {
-moz-columns: 2 400px;
-webkit-columns: 2 400px;
columns: 2 400px;
-moz-column-gap: 0 !important;
-webkit-column-gap: 0 !important;
column-gap: 0 !important;
display: block;
margin: 5px 0 -5px;
@@ -2453,7 +2457,7 @@ p + .twocol, div[lang="de"] p + .twocol {
.twocol li {
break-inside: avoid;
page-break-inside: avoid;
-webkit-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.twocol li:first-child {
@@ -4836,6 +4840,7 @@ table#jardump { /* /jars */
.main#jardump {
padding: 0;
overflow: auto;
}
.main#jardump tt {
@@ -5433,10 +5438,11 @@ a.viewfullentry::after, a[href^="viewprofile"]::after {
vertical-align: text-top;
}
#noleasesets {
#noleasesets, #notinitialized, .netdbnotfound {
background: #000 url(/themes/console/images/info/infohelp.png) 12px center no-repeat !important;
padding: 15px 15px 15px 50px !important;
border: 1px solid #443da0;
margin-top: -4px;
margin-bottom: 10px;
text-align: left;
}
@@ -5567,6 +5573,10 @@ p.sybil_info, p.family, p.threatpoints, p.hashdist, p#sybil_totals, p.notfound {
box-shadow: inset 0 0 0 1px #080077;
}
p#sybil_totals {
font-weight: normal;
}
p.sybil_info, p.hashdist, p.family {
margin-top: -1px;
}
@@ -5589,6 +5599,14 @@ p.sybil_info + a[name] + .sybil_routerinfo, p.hashdist + a[name] + .sybil_router
margin-bottom: -5px;
}
.sybil_routerinfo + .threatpoints + ul + a[name] + table {
margin-top: -11px !important;
}
.sybil_routerinfo + .threatpoints + ul {
margin-bottom: 10px;
}
/* end netdb */
/* /confignet, /configadvanced */
@@ -5704,6 +5722,10 @@ h3#pluginmanage {
margin-bottom: -13px !important;
}
.sybils#samefamily {
margin-bottom: 10px !important;
}
h3.tabletitle a {
text-transform: lowercase;
letter-spacing: normal;
@@ -6153,6 +6175,548 @@ form[action="events"] {
background-size: 28px 28px;
}
/* network status */
.routersummary h4 a {
width: auto !important;
vertical-align: middle;
display: inline;
}
.routersummary .error, .routersummary .warn, .routersummary .testing, .routersummary .hidden,
.routersummary .running, .routersummary .firewalled, .routersummary .vmcomm, .routersummary .clockskew, .tunnelBuildStatus {
display: inline-block;
vertical-align: middle;
border: 1px solid rgba(52, 47, 127, 0.6);
border-radius: 2px;
padding: 6px 3px;
width: 100%;
margin: -3px -1px;
box-shadow: inset 0 0 0 1px #000;
text-shadow: 0 1px 1px #000;
box-sizing: border-box;
}
.routersummary .firewalled {
border: 1px dotted #342f7f;
}
.routersummary .error {
border: 1px dotted #700;
}
.routersummary .warn, .routersummary .clockskew {
border: 1px solid #550;
}
.routersummary .testing {
border: 1px dotted #4F4B1D;
}
.routersummary .hidden, .routersummary .vmcomm {
border: 1px dotted #777;
}
.routersummary .running {
border: 1px solid #342f7f;
border: 1px solid rgba(52, 47, 127, 0.6);
}
.routersummary .error::before, .routersummary .warn::before, .routersummary .testing::before, .routersummary .hidden::before,
.routersummary .running::before, .routersummary .firewalled::before, .routersummary .vmcomm::before, .routersummary .clockskew::before {
padding: 0 2px;
vertical-align: middle;
display: inline-block;
filter: drop-shadow(0 0 1px rgba(220,220,220,0.7));
}
.routersummary .error::before, .routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_error.png);
}
.routersummary .warn::before {
content: url(/themes/console/images/info/network_status/network_warning.png);
}
.routersummary .testing::before {
content: url(/themes/console/images/info/network_status/network_testing.png);
}
.routersummary .hidden::before {
content: url(/themes/console/images/info/network_status/network_hidden.png);
padding: 0 3px;
}
.routersummary .running::before {
content: url(/themes/console/images/info/network_status/network_ok.png);
}
.routersummary .firewalled::before {
content: url(/themes/console/images/info/network_status/network_firewalled.png);
}
.routersummary .vmcomm::before {
content: url(/themes/console/images/info/network_status/network_vm.png);
}
.routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_clockskew.png);
}
/* end network status */
#sb_services, #sb_internals, #sb_advanced {
margin-top: -3px !important;
margin-bottom: -5px !important;
}
/* /tunnels */
tt a {
letter-spacing: 0.07em;
}
.tunnel_cap {
background: rgba(0,0,140,0.4);
color: #c9ceff;
border: 1px solid rgba(0,0,64,0.2);
border-radius: 2px;
min-width: 12px;
padding: 0 2px;
display:inline-block;
margin: 1px 2px 1px 8px;
text-align: center !important;
text-shadow: 0 1px 1px #000;
}
.tunnel_cap:empty {
border: none;
}
.tunnel_id {
display: inline-block;
min-width: 78px;
text-align: right;
}
.tunnel_id:empty {
min-width: 0;
}
.tunnel_id:empty + .tunnel_cap {
margin-left: 12px !important;
display: inline-block;
}
.tunnel_peer {
display: inline-block;
min-width: 56px;
text-align: right;
}
.tunnel_local {
font-size: 8pt;
text-transform: lowercase;
background: rgba(0,0,96,0.3);
border-radius: 2px;
text-align: center;
padding: 2px 0;
margin-left: -4px;
margin-right: 4px;
}
.tunnel_peer:empty {
vertical-align: top;
}
#tunnel_defs {
margin-top: -1px;
margin-bottom: 10px;
}
#tunnel_defs td:first-child, #tunnel_defs td:nth-child(even) {
width: 1%;
white-space: nowrap;
}
@media screen and (max-width: 1100px) {
.tunnel_id, .tunnel_peer {
min-width: 0 !important;
text-align: center !important;
}
.tunnel_local {
margin-right: 5px;
margin-left: 2px;
padding: 2px 4px;
}
.tunnel_peer:empty {
vertical-align: middle;
}
.tunnel_peer:empty::before {
margin: 1px 6px 1px 2px;
}
.tunnel_cap {
margin-left: 5px !important;
}
}
@media screen and (min-width: 1500px) {
.tunnel_cap {
margin-left: 10px;
padding: 0 1px;
min-width: 14px;
}
.tunnel_id:empty {
margin-right: -10px;
}
}
/* end tunnels */
/* /peers */
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10),
#ntcpconnections td:nth-child(6), #ntcpconnections td:nth-child(7), #ntcpconnections td:nth-child(8), #ntcpconnections td:nth-child(9), #ntcpconnections td:nth-child(10),
#udpconnections td:nth-child(6), #udpconnections td:nth-child(7), #udpconnections td:nth-child(9), #udpconnections td:nth-child(10), #udpconnections td:nth-child(11),
#udpconnections td:nth-child(13), #udpconnections td:nth-child(14), #udpconnections td:nth-child(15), #udpconnections td:nth-child(16) {
text-align: right;
white-space: nowrap;
}
#ntcpconnections .tablefooter td:nth-child(3), #ntcpconnections .tablefooter td:nth-child(4), #ntcpconnections .tablefooter td:nth-child(5), #ntcpconnections .tablefooter td:nth-child(6),
#udpconnections .tablefooter td:nth-child(3), #udpconnections .tablefooter td:nth-child(4), #udpconnections .tablefooter td:nth-child(7), #udpconnections .tablefooter td:nth-child(8),
#udpconnections .tablefooter td:nth-child(10), #udpconnections .tablefooter td:nth-child(11), #udpconnections .tablefooter td:nth-child(12), #udpconnections .tablefooter td:nth-child(13) {
text-align: right;
}
#udpconnections .tablefooter td:nth-child(9) {
text-align: center !important;
}
#ntcpconnections td:nth-child(4), #ntcpconnections td:nth-child(5), #udpconnections td:nth-child(4),
#udpconnections td:nth-child(5), #udpconnections td:nth-child(8), #udpconnections td:nth-child(12) {
white-space: nowrap;
}
#udpconnections .tablefooter td, #ntcpconnections .tablefooter td {
padding-left: 5px;
padding-right: 5px;
}
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10) {
text-align: right;
}
#udpconnections th:nth-child(6), #udpconnections th:nth-child(7), #udpconnections th:nth-child(n+9) {
text-align: right;
}
#udpconnections th:nth-child(12) {
text-align: center;
}
.peersort {
text-align: center;
display: inline-block;
}
.right {
text-align: right;
margin: 0 1px;
display: inline-block;
width: 40%
}
.left {
text-align: left;
margin: 0 1px;
display: inline-block;
width: 40%
}
.peeripv6:empty {
padding: 0;
width: 0;
}
.cwnd .left, .cwnd .right {
width: auto;
}
#udpconnections th:nth-child(n+13), #udpconnections .tablefooter th:nth-child(n+10),
#udpconnections td:nth-child(n+13), #udpconnections .tablefooter td:nth-child(n+10) {
padding-right: 1% !important;
}
#peerdefs {
line-height: 140%;
}
.peer_arrow {
display: inline-block;
width: 18px;
text-align: center;
margin-right: 3px;
}
/* end peers */
/* netdb router address info */
.leasesets_container {
-moz-columns: 680px 2;
-webkit-columns: 680px 2;
columns: 680px 2;
-moz-column-gap: 10px;
-webkit-column-gap: 10px;
column-gap: 10px;
}
th code {
-moz-user-select: all;
-webkit-user-select: all;
user-select: all;
}
@media screen and (min-width: 1634px) {
.leasesets_container {
margin-bottom: 8px;
}
th code {
font-size: 9pt !important;
}
}
.leasesets_container table:first-child {
margin-top: 0;
}
.leasesets_container table {
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.netdb_addresses br:first-child, .sybil_routerinfo tr:last-child td br:first-child {
display: none;
}
.netdbentry th:first-child::after {
content: "";
display: inline-block;
min-height: 20px;
vertical-align: middle;
}
.netdbentry th:last-child > *, .sybil_routerinfo th:nth-child(2) > * {
display: inline-block;
vertical-align: middle !important;
}
.netdbentry th a img {
display: inline-block;
vertical-align: middle;
margin-right: 1px;
margin-bottom: 2px;
}
.netdbentry a.viewfullentry::after {
display: inline-block;
vertical-align: middle !important;
margin-left: 3px;
}
.netdbentry td:first-child {
text-align: right;
min-width: 100px;
padding-right: 5px !important
}
b.netdb_transport {
display: inline-block;
width: 50px;
text-align: right;
margin-right: 5px;
}
#netdb code {
font-weight: normal !important;
}
.netdb_name {
color: #dfe2ff;
text-transform: capitalize;
font-weight: bold;
}
.netdb_info {
margin-right: 1px;
}
.netdb_expiry {
margin-left: 5px;
}
.sybil_routerinfo th img[src^="/flags"] {
height: 11px;
width: 16px;
margin-right: 5px;
}
.sybil_routerinfo b.netdb_transport {
margin-left: -13px;
margin-right: 0;
}
.sybil_routerinfo td:first-child, .netdbentry td:first-child {
text-align: right !important;
padding-right: 0;
}
.sybil_routerinfo td[colspan="3"] {
white-space: normal;
}
.sybil_container {
-moz-columns: 680px 2;
-webkit-columns: 680px 2;
columns: 680px 2;
margin: 10px 0;
}
.sybil_container p {
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
.sybil_container p:first-child {
margin-top: 0;
}
.sybil_container p:last-child {
margin-bottom: 0;
}
/* end netdb router address */
/* sybils */
.leaseset th:last-child, .leaseset td:last-child, .sybil_routerinfo th:last-child, .sybil_routerinfo td:last-child {
border-right: 1px solid #443da0 !important;
}
.sybil_routerinfo table td:last-child {
border-right: none !important;
}
.sybilinfo_params {
padding: 0;
border-bottom: 1px solid #443da0;
}
.sybilinfo_container {
columns: 240px auto;
-moz-columns: 240px auto;
-webkit-columns: 240px auto;
-moz-column-gap: 0;
-webkit-column-gap: 0;
column-gap: 0;
background: #00001a;
padding: 4px 5px;
}
.sybilinfo_container b {
color: #bb3;
}
.sybil_routerinfo tr:last-child {
border-top: none;
}
.sybil_routerinfo p {
margin: 0;
padding: 0;
line-height: 120%;
break-inside: avoid;
page-break-inside: avoid;
-webkit-column-break-inside: avoid;
}
#sybils_summary {
line-height: 140%;
}
.sybilinfo_familyname {
display: inline-block;
vertical-align: top;
max-width: 150px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.sybil_addresses td:first-child {
max-width: 155px;
font-weight: bold;
padding-right: 9px;
}
.sybil_addresses table {
width: 100%;
margin: 0;
}
.sybil_addresses {
padding: 0;
border-bottom: 1px solid #443da0
}
.sybil_addresses table, .sybil_addresses td {
border: none;
}
.threatpoints + ul {
-moz-columns: auto 600px;
-webkit-columns: auto 600px;
columns: auto 600px;
-moz-column-rule: 1px solid #443da0;
-webkit-column-rule: 1px solid #443da0;
column-rule: 1px solid #443da0;
padding-top: 3px;
padding-bottom: 3px;
}
.threatpoints + ul li:first-child {
margin-top: 0 !important;
padding-top: 0 !important;
}
.threatpoints + ul li:last-child {
padding-bottom: 0 !important;
}
.threatpoints + ul li {
list-style: none;
margin-left: 5px;
line-height: 120%;
break-inside: avoid !important;
page-break-inside: avoid !important;
-webkit-column-break-inside: avoid !important;
}
.threatpoints + ul li a {
white-space: nowrap;
}
/* end sybils */
/* responsive layout */
@media screen and (max-width: 900px) {
@@ -6590,286 +7154,3 @@ _:-ms-lang(x), table + .statusnotes {
/* end IE/Edge tweaks */
/* network status */
.routersummary h4 a {
width: auto !important;
vertical-align: middle;
display: inline;
}
.routersummary .error, .routersummary .warn, .routersummary .testing, .routersummary .hidden,
.routersummary .running, .routersummary .firewalled, .routersummary .vmcomm, .routersummary .clockskew, .tunnelBuildStatus {
display: inline-block;
vertical-align: middle;
border: 1px solid rgba(52, 47, 127, 0.6);
border-radius: 2px;
padding: 6px 3px;
width: 100%;
margin: -3px -1px;
box-shadow: inset 0 0 0 1px #000;
text-shadow: 0 1px 1px #000;
box-sizing: border-box;
}
.routersummary .firewalled {
border: 1px dotted #342f7f;
}
.routersummary .error {
border: 1px dotted #700;
}
.routersummary .warn, .routersummary .clockskew {
border: 1px solid #550;
}
.routersummary .testing {
border: 1px dotted #4F4B1D;
}
.routersummary .hidden, .routersummary .vmcomm {
border: 1px dotted #777;
}
.routersummary .running {
border: 1px solid #342f7f;
border: 1px solid rgba(52, 47, 127, 0.6);
}
.routersummary .error::before, .routersummary .warn::before, .routersummary .testing::before, .routersummary .hidden::before,
.routersummary .running::before, .routersummary .firewalled::before, .routersummary .vmcomm::before, .routersummary .clockskew::before {
padding: 0 2px;
vertical-align: middle;
display: inline-block;
filter: drop-shadow(0 0 1px rgba(220,220,220,0.7));
}
.routersummary .error::before, .routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_error.png);
}
.routersummary .warn::before {
content: url(/themes/console/images/info/network_status/network_warning.png);
}
.routersummary .testing::before {
content: url(/themes/console/images/info/network_status/network_testing.png);
}
.routersummary .hidden::before {
content: url(/themes/console/images/info/network_status/network_hidden.png);
padding: 0 3px;
}
.routersummary .running::before {
content: url(/themes/console/images/info/network_status/network_ok.png);
}
.routersummary .firewalled::before {
content: url(/themes/console/images/info/network_status/network_firewalled.png);
}
.routersummary .vmcomm::before {
content: url(/themes/console/images/info/network_status/network_vm.png);
}
.routersummary .clockskew::before {
content: url(/themes/console/images/info/network_status/network_clockskew.png);
}
/* end network status */
#sb_services, #sb_internals, #sb_advanced {
margin-top: -2px !important;
}
/* /tunnels */
tt a {
letter-spacing: 0.07em;
}
.tunnel_cap {
background: rgba(0,0,140,0.4);
color: #c9ceff;
border: 1px solid rgba(0,0,64,0.2);
border-radius: 2px;
min-width: 12px;
padding: 0 2px;
display:inline-block;
margin: 1px 2px 1px 8px;
text-align: center !important;
text-shadow: 0 1px 1px #000;
}
.tunnel_cap:empty {
border: none;
}
.tunnel_id {
display: inline-block;
min-width: 78px;
text-align: right;
}
.tunnel_id:empty {
min-width: 0;
}
.tunnel_id:empty + .tunnel_cap {
margin-left: 12px !important;
display: inline-block;
}
.tunnel_peer {
display: inline-block;
min-width: 56px;
text-align: right;
}
.tunnel_local {
font-size: 8pt;
background: rgba(0,0,96,0.3);
border-radius: 2px;
text-align: center;
padding: 2px 0;
margin-left: -4px;
margin-right: 4px;
}
.tunnel_peer:empty {
vertical-align: top;
}
#tunnel_defs {
margin-top: -1px;
margin-bottom: 10px;
}
@media screen and (max-width: 1100px) {
.tunnel_id, .tunnel_peer {
min-width: 0 !important;
text-align: center !important;
}
.tunnel_local {
margin-right: 5px;
margin-left: 2px;
padding: 2px 4px;
}
.tunnel_peer:empty {
vertical-align: middle;
}
.tunnel_peer:empty::before {
margin: 1px 6px 1px 2px;
}
.tunnel_cap {
margin-left: 5px !important;
}
}
@media screen and (min-width: 1500px) {
.tunnel_cap {
margin-left: 10px;
padding: 0 1px;
min-width: 14px;
}
.tunnel_id:empty {
margin-right: -10px;
}
}
/* end tunnels */
/* /peers */
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10),
#ntcpconnections td:nth-child(6), #ntcpconnections td:nth-child(7), #ntcpconnections td:nth-child(8), #ntcpconnections td:nth-child(9), #ntcpconnections td:nth-child(10),
#udpconnections td:nth-child(6), #udpconnections td:nth-child(7), #udpconnections td:nth-child(9), #udpconnections td:nth-child(10), #udpconnections td:nth-child(11),
#udpconnections td:nth-child(13), #udpconnections td:nth-child(14), #udpconnections td:nth-child(15), #udpconnections td:nth-child(16) {
text-align: right;
white-space: nowrap;
}
#ntcpconnections .tablefooter td:nth-child(3), #ntcpconnections .tablefooter td:nth-child(4), #ntcpconnections .tablefooter td:nth-child(5), #ntcpconnections .tablefooter td:nth-child(6),
#udpconnections .tablefooter td:nth-child(3), #udpconnections .tablefooter td:nth-child(4), #udpconnections .tablefooter td:nth-child(7), #udpconnections .tablefooter td:nth-child(8),
#udpconnections .tablefooter td:nth-child(10), #udpconnections .tablefooter td:nth-child(11), #udpconnections .tablefooter td:nth-child(12), #udpconnections .tablefooter td:nth-child(13) {
text-align: right;
}
#udpconnections .tablefooter td:nth-child(9) {
text-align: center !important;
}
#ntcpconnections td:nth-child(4), #ntcpconnections td:nth-child(5), #udpconnections td:nth-child(4),
#udpconnections td:nth-child(5), #udpconnections td:nth-child(8), #udpconnections td:nth-child(12) {
white-space: nowrap;
}
#udpconnections .tablefooter td, #ntcpconnections .tablefooter td {
padding-left: 5px;
padding-right: 5px;
}
#ntcpconnections th:nth-child(6), #ntcpconnections th:nth-child(7), #ntcpconnections th:nth-child(8), #ntcpconnections th:nth-child(9), #ntcpconnections th:nth-child(10) {
text-align: right;
}
#udpconnections th:nth-child(6), #udpconnections th:nth-child(7), #udpconnections th:nth-child(n+9) {
text-align: right;
}
#udpconnections th:nth-child(12) {
text-align: center;
}
.peersort {
text-align: center;
display: inline-block;
}
.right {
text-align: right;
margin: 0 1px;
display: inline-block;
width: 40%
}
.left {
text-align: left;
margin: 0 1px;
display: inline-block;
width: 40%
}
.peeripv6:empty {
padding: 0;
width: 0;
}
.cwnd .left, .cwnd .right {
width: auto;
}
#udpconnections th:nth-child(n+13), #udpconnections .tablefooter th:nth-child(n+10),
#udpconnections td:nth-child(n+13), #udpconnections .tablefooter td:nth-child(n+10) {
padding-right: 1% !important;
}
#peerdefs {
line-height: 140%;
}
.peer_arrow {
display: inline-block;
width: 18px;
text-align: center;
margin-right: 3px;
}
/* end peers */

View File

@@ -218,6 +218,10 @@ h3#iptransport a, th#upnpconfig a, h3#bwlimiter a, #config_stats h3 a, #config_l
padding: 1px 3px 1px 1px !important;
}
.sybil_routerinfo th img[src^="/flags"], .netdbentry th a img {
margin-left: 5px;
}
table#leasesetdebug th:first-child, table#leasesetsummary th:first-child {
text-align: right;
}
@@ -242,6 +246,10 @@ table.leaseset th:last-child, table.leaseset td:nth-child(2) {
text-align: left;
}
.leaseset th:last-child, .leaseset td:last-child, .sybil_routerinfo th:last-child, .sybil_routerinfo td:last-child {
border-right: none !important;
}
#netdboverview th, table.netdbentry th, table#leasesetdebug td:nth-child(2n) {
text-align: right;
}
@@ -449,6 +457,21 @@ h4.app, h4.app2 {
text-align: right;
}
.netdbentry th a img {
margin-left: 6px;
}
.tunnel_local {
margin-right: -4px;
margin-left: 4px;
}
.tunnel_id:empty + .tunnel_cap {
display: inline-block;
margin-left: 0;
margin-right: 12px;
}
/* responsive layout */
@media screen and (max-width: 1500px) {

View File

@@ -120,6 +120,12 @@ hr {
margin-top: 10px;
}
@media screen and (-webkit-min-device-pixel-ratio:0) {
hr {
height: 1px;
}
}
iframe {
border: none;
margin: 40px 20px 0 60px;