From aeb6635e7185fbd7fdab23d5b428ac85a7e01969 Mon Sep 17 00:00:00 2001 From: zzz Date: Wed, 28 Oct 2009 18:26:50 +0000 Subject: [PATCH] * Console: - Rewrite TrustedUpdate version comparator, use for netdb version table so 0.7.10 will be sorted correctly - Reduce netdb.jsp memory usage - More tagging fixups - configclients.jsp fixup for "Web console" --- .../i2p/router/web/ConfigClientsHandler.java | 27 ++++--- .../i2p/router/web/ConfigClientsHelper.java | 3 +- .../net/i2p/router/web/ConfigRestartBean.java | 4 +- .../i2p/router/web/ConfigTunnelsHandler.java | 4 +- .../src/net/i2p/router/web/NetDbRenderer.java | 17 ++--- .../router/web/ProfileOrganizerRenderer.java | 2 +- .../src/net/i2p/router/web/SummaryHelper.java | 11 ++- .../net/i2p/router/web/TunnelRenderer.java | 5 +- apps/routerconsole/java/strings/Strings.java | 10 +++ build.xml | 4 +- .../src/net/i2p/crypto/TrustedUpdate.java | 71 +++++++++++-------- 11 files changed, 97 insertions(+), 61 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java index 2df83d0864..4d490907a5 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHandler.java @@ -31,9 +31,14 @@ public class ConfigClientsHandler extends FormHandler { protected void processForm() { if (_action.equals(_("Save Client Configuration"))) { saveClientChanges(); - } else if (_action.equals(_("Save WebApp Configuration"))) { + return; + } + if (_action.equals(_("Save WebApp Configuration"))) { saveWebAppChanges(); - } else if (_action.startsWith("Start ")) { + return; + } + // value + if (_action.startsWith("Start ")) { String app = _action.substring(6); int appnum = -1; try { @@ -43,10 +48,14 @@ public class ConfigClientsHandler extends FormHandler { startClient(appnum); else startWebApp(app); - } else if (_action.toLowerCase().startsWith("Start ") && + return; + } + // label (IE) + String xStart = _("Start"); + if (_action.toLowerCase().startsWith(xStart + " ") && _action.toLowerCase().endsWith("")) { // IE sucks - String app = _action.substring(23, _action.length() - 7); + String app = _action.substring(xStart.length() + 18, _action.length() - 7); int appnum = -1; try { appnum = Integer.parseInt(app); @@ -56,7 +65,7 @@ public class ConfigClientsHandler extends FormHandler { else startWebApp(app); } else { - addFormError(_("Unsupported") + " " + _action + "."); + addFormError(_("Unsupported") + ' ' + _action + '.'); } } @@ -67,7 +76,7 @@ public class ConfigClientsHandler extends FormHandler { for (int cur = 0; cur < clients.size(); cur++) { ClientAppConfig ca = (ClientAppConfig) clients.get(cur); Object val = _settings.get(cur + ".enabled"); - if (! "webConsole".equals(ca.clientName)) + if (! ("webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName))) ca.disabled = val == null; } ClientAppConfig.writeClientAppConfig(_context, clients); @@ -82,7 +91,7 @@ public class ConfigClientsHandler extends FormHandler { } ClientAppConfig ca = (ClientAppConfig) clients.get(i); LoadClientAppsJob.runClient(ca.className, ca.clientName, LoadClientAppsJob.parseArgs(ca.args), configClient_log); - addFormNotice(_("Client") + " " + ca.clientName + " " + _("started") + "."); + addFormNotice(_("Client") + ' ' + _(ca.clientName) + ' ' + _("started") + '.'); } private void saveWebAppChanges() { @@ -117,9 +126,9 @@ public class ConfigClientsHandler extends FormHandler { path = new File(path, app + ".war"); s.addWebApplication("/"+ app, path.getAbsolutePath()).start(); // no passwords... initialize(wac); - addFormNotice("WebApp " + app + " " + _("started") + "."); + addFormNotice(_("WebApp") + " " + _(app) + " " + _("started") + '.'); } catch (Exception ioe) { - addFormError(_("Failed to start") + " " + app + " " + ioe + "."); + addFormError(_("Failed to start") + ' ' + _(app) + " " + ioe + '.'); } return; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java index 3ef14e13ab..90738b15bb 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -19,7 +19,8 @@ public class ConfigClientsHelper extends HelperBase { List clients = ClientAppConfig.getClientApps(_context); for (int cur = 0; cur < clients.size(); cur++) { ClientAppConfig ca = (ClientAppConfig) clients.get(cur); - renderForm(buf, ""+cur, ca.clientName, false, !ca.disabled, "webConsole".equals(ca.clientName), + renderForm(buf, ""+cur, ca.clientName, false, !ca.disabled, + "webConsole".equals(ca.clientName) || "Web console".equals(ca.clientName), ca.className + ((ca.args != null) ? " " + ca.args : "")); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java index 035e4a9eba..dcefa84e32 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java @@ -98,11 +98,11 @@ public class ConfigRestartBean { return Long.MAX_VALUE/2; // summaryframe.jsp adds a safety factor so we don't want to overflow... } - public static String _(String s, RouterContext ctx) { + private static String _(String s, RouterContext ctx) { return Messages.getString(s, ctx); } - public static String _(String s, Object o, RouterContext ctx) { + private static String _(String s, Object o, RouterContext ctx) { return Messages.getString(s, o, ctx); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java index e361f96984..68f730e963 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHandler.java @@ -132,7 +132,9 @@ public class ConfigTunnelsHandler extends FormHandler { } if (updated > 0) - addFormNotice("Updated settings for " + updated + " pools."); + // the count isn't really correct anyway, since we don't check for actual changes + //addFormNotice("Updated settings for " + updated + " pools."); + addFormNotice(_("Updated settings for all pools.")); if (saveRequired) { boolean saved = _context.router().saveConfig(); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java index ed501a088a..194a980887 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Set; import java.util.TreeSet; +import net.i2p.crypto.TrustedUpdate; import net.i2p.data.DataHelper; import net.i2p.data.Destination; import net.i2p.data.Hash; @@ -131,14 +132,9 @@ public class NetDbRenderer { } public void renderStatusHTML(Writer out, boolean full) throws IOException { - int size = _context.netDb().getKnownRouters() * 512; - if (full) - size *= 4; - StringBuilder buf = new StringBuilder(size); out.write("

" + _("Network Database Contents") + " (" + _("View") + " LeaseSets)

\n"); if (!_context.netDb().isInitialized()) { - buf.append("" + _("Not initialized") + "\n"); - out.write(buf.toString()); + out.write(_("Not initialized")); out.flush(); return; } @@ -146,11 +142,12 @@ public class NetDbRenderer { Hash us = _context.routerHash(); out.write("

" + _("Routers") + " (" + _("view without") + ""); + out.write("#routers\" >" + _("view without")); else - out.write("?f=1#routers\" >" + _("view with") + ""); - out.write(" " + _("stats") + ")

\n"); + out.write("?f=1#routers\" >" + _("view with")); + out.write(' ' + _("stats") + ")\n"); + StringBuilder buf = new StringBuilder(8192); RouterInfo ourInfo = _context.router().getRouterInfo(); renderRouterInfo(buf, ourInfo, true, true); out.write(buf.toString()); @@ -181,7 +178,7 @@ public class NetDbRenderer { buf.append("
"); List versionList = new ArrayList(versions.objects()); if (versionList.size() > 0) { - Collections.sort(versionList, Collections.reverseOrder()); + Collections.sort(versionList, Collections.reverseOrder(new TrustedUpdate.VersionComparator())); buf.append("\n"); buf.append("\n"); for (String routerVersion : versionList) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java index bce21d7a37..d90f813409 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -339,7 +339,7 @@ class ProfileOrganizerRenderer { * Do not double the single quotes in the parameter. * Use autoboxing to call with ints, longs, floats, etc. */ - public String _(String s, Object o) { + private String _(String s, Object o) { return Messages.getString(s, o, _context); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index 1f2cedbeb2..1fc6c31b70 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -396,18 +396,21 @@ public class SummaryHelper extends HelperBase { return buf.toString(); } + /** compare translated nicknames - put "shared clients" first in the sort */ private class AlphaComparator implements Comparator { public int compare(Object lhs, Object rhs) { String lname = getName((Destination)lhs); String rname = getName((Destination)rhs); - if (lname.equals("shared clients")) + String xsc = _("shared clients"); + if (lname.equals(xsc)) return -1; - if (rname.equals("shared clients")) + if (rname.equals(xsc)) return 1; return Collator.getInstance().compare(lname, rname); } } + /** translate here so collation works above */ private String getName(Destination d) { TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(d.calculateHash()); String name = (in != null ? in.getDestinationNickname() : null); @@ -416,6 +419,10 @@ public class SummaryHelper extends HelperBase { name = (out != null ? out.getDestinationNickname() : null); if (name == null) name = d.calculateHash().toBase64().substring(0,6); + else + name = _(name); + } else { + name = _(name); } return name; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java index c5ec21c0dc..ff4154c7c2 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/TunnelRenderer.java @@ -50,13 +50,14 @@ public class TunnelRenderer { TunnelPool outPool = null; in = clientInboundPools.get(client); outPool = clientOutboundPools.get(client); + // TODO the following code is duplicated in SummaryHelper String name = (in != null ? in.getSettings().getDestinationNickname() : null); if ( (name == null) && (outPool != null) ) name = outPool.getSettings().getDestinationNickname(); if (name == null) name = client.toBase64().substring(0,4); out.write("

" + _("Client tunnels for") + " " + name); + + "\" >" + _("Client tunnels for") + ' ' + _(name)); if (_context.clientManager().isLocal(client)) out.write(" (" + _("config") + "):

\n"); else @@ -68,7 +69,7 @@ public class TunnelRenderer { Collections.sort(participating, new TunnelComparator()); out.write("

" + _("Participating tunnels") + ":

" + _("Version") + "" + _("Count") + "
\n"); out.write("" + + _("Send on") + "" + "\n"); long processed = 0; RateStat rs = _context.statManager().getRate("tunnel.participatingMessageCount"); diff --git a/apps/routerconsole/java/strings/Strings.java b/apps/routerconsole/java/strings/Strings.java index 49ee19bf6b..702d1f178b 100644 --- a/apps/routerconsole/java/strings/Strings.java +++ b/apps/routerconsole/java/strings/Strings.java @@ -25,5 +25,15 @@ class Dummy { _("My eepsite web server"); _("Browser launch at startup"); _("BOB application bridge"); + + // tunnel nicknames, taken from i2ptunnel.config so they will display + // nicely under 'local destinations' in the summary bar + // note that if the wording changes in i2ptunnel.config, we have to + // keep the old string here as well for existing installs + _("shared clients"); + _("IRC proxy"); + _("eepsite"); + // hardcoded in i2psnark + _("I2PSnark"); } } diff --git a/build.xml b/build.xml index 06c3749a6a..3c75faed8c 100644 --- a/build.xml +++ b/build.xml @@ -58,11 +58,11 @@ + + - - diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java index d0f25aec5f..4d8376c13d 100644 --- a/core/java/src/net/i2p/crypto/TrustedUpdate.java +++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java @@ -8,6 +8,7 @@ import java.io.IOException; import java.io.SequenceInputStream; import java.io.UnsupportedEncodingException; import java.util.ArrayList; +import java.util.Comparator; import java.util.StringTokenizer; import net.i2p.CoreVersion; @@ -183,43 +184,51 @@ D8usM7Dxp5yrDrCYZ5AIijc= * version, otherwise false. */ public static final boolean needsUpdate(String currentVersion, String newVersion) { - StringTokenizer newVersionTokens = new StringTokenizer(sanitize(newVersion), "."); - StringTokenizer currentVersionTokens = new StringTokenizer(sanitize(currentVersion), "."); - - while (newVersionTokens.hasMoreTokens() && currentVersionTokens.hasMoreTokens()) { - String newNumber = newVersionTokens.nextToken(); - String currentNumber = currentVersionTokens.nextToken(); - - switch (compare(newNumber, currentNumber)) { - case -1: // newNumber is smaller - return false; - case 0: // eq - break; - case 1: // newNumber is larger - return true; - } - } - - if (newVersionTokens.hasMoreTokens() && !currentVersionTokens.hasMoreTokens()) - return true; - - return false; + return (new VersionComparator()).compare(currentVersion, newVersion) < 0; } - private static final int compare(String lop, String rop) { - try { - int left = Integer.parseInt(lop); - int right = Integer.parseInt(rop); - - if (left < right) - return -1; - else if (left == right) + /** + * Compares versions. + * Characters other than [0-9.] are ignored. + */ + public static class VersionComparator implements Comparator { + /** l and r non-null */ + public int compare(String l, String r) { + // try it the easy way first + if (l.equals(r)) return 0; - else + StringTokenizer lTokens = new StringTokenizer(sanitize(l), "."); + StringTokenizer rTokens = new StringTokenizer(sanitize(r), "."); + + while (lTokens.hasMoreTokens() && rTokens.hasMoreTokens()) { + String lNumber = lTokens.nextToken(); + String rNumber = rTokens.nextToken(); + int diff = intCompare(lNumber, rNumber); + if (diff != 0) + return diff; + } + + if (lTokens.hasMoreTokens() && !rTokens.hasMoreTokens()) return 1; - } catch (NumberFormatException nfe) { + if (rTokens.hasMoreTokens() && !lTokens.hasMoreTokens()) + return -1; return 0; } + + private static final int intCompare(String lop, String rop) { + int left, right; + try { + left = Integer.parseInt(lop); + } catch (NumberFormatException nfe) { + return -1; + } + try { + right = Integer.parseInt(rop); + } catch (NumberFormatException nfe) { + return 1; + } + return left - right; + } } private static final void genKeysCLI(String publicKeyFile, String privateKeyFile) {
" + _("Receive on") + "" + _("From") + "" - + "" + _("Send on") + "" + _("To") + "" + _("Expiration") + "" + _("To") + "" + _("Expiration") + "" + _("Usage") + "" + _("Rate") + "" + _("Role") + "