diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java index b249f7296..56094e26e 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java +++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java @@ -1073,7 +1073,7 @@ public class SnarkManager implements CompleteListener { if (theme != null) { if(!theme.equals(_config.getProperty(PROP_THEME))) { _config.setProperty(PROP_THEME, theme); - addMessage(_t("{0} theme loaded, return to main i2psnark page to view.", theme)); + addMessage(_t("{0} theme loaded.", theme)); changed = true; } } diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java index 820709069..55778eea2 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/DHTNodes.java @@ -138,7 +138,7 @@ class DHTNodes { * @since 0.9.4 */ public void renderStatusHTML(StringBuilder buf) { - buf.append(_kad.toString().replace("\n", "
\n")); + buf.append(_kad.toString().replace("\n", "

\n")); } /** */ diff --git a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java index 27325ee6f..75d9cadac 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java +++ b/apps/i2psnark/java/src/org/klomp/snark/dht/KRPC.java @@ -679,7 +679,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { public String renderStatusHTML() { long uptime = Math.max(1000, _context.clock().now() - _started); StringBuilder buf = new StringBuilder(256); - buf.append("
DHT DEBUG
TX: ").append(_txPkts.get()).append(" pkts / ") + buf.append("

DHT DEBUG

TX: ").append(_txPkts.get()).append(" pkts / ") .append(DataHelper.formatSize2(_txBytes.get())).append("B / ") .append(DataHelper.formatSize2(_txBytes.get() * 1000 / uptime)).append("Bps
" + "RX: ").append(_rxPkts.get()).append(" pkts / ") @@ -689,7 +689,7 @@ public class KRPC implements I2PSessionMuxedListener, DHT { "Blacklisted: ").append(_blacklist.size()).append("
" + "Sent tokens: ").append(_outgoingTokens.size()).append("
" + "Rcvd tokens: ").append(_incomingTokens.size()).append("
" + - "Pending queries: ").append(_sentQueries.size()).append("
"); + "Pending queries: ").append(_sentQueries.size()).append("

"); _tracker.renderStatusHTML(buf); _knownNodes.renderStatusHTML(buf); return buf.toString(); diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java index 8abc08554..4325d3acf 100644 --- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java +++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java @@ -504,7 +504,7 @@ public class I2PSnarkServlet extends BasicServlet { : tx)); if (showSort) out.write(""); - out.write("\n"); + out.write("\n"); if (total > 0 && (start > 0 || total > pageSize)) { writePageNav(out, req, start, pageSize, total, noThinsp); } @@ -830,7 +830,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(""); - out.write(toThemeImg("control_rewind_blue", _t("First"), _t("First page"))); + out.write(toThemeImg("first", _t("First"), _t("First page"))); out.write(" "); int prev = Math.max(0, start - pageSize); //if (prev > 0) { @@ -840,16 +840,16 @@ public class I2PSnarkServlet extends BasicServlet { String sprev = (prev > 0) ? Integer.toString(prev) : ""; out.write(getQueryString(req, null, sprev, null)); out.write("\">"); - out.write(toThemeImg("control_back_blue", _t("Prev"), _t("Previous page"))); + out.write(toThemeImg("previous", _t("Prev"), _t("Previous page"))); out.write(" "); } } else { out.write( "\"\"" + + _imgPath + "first.png\">" + " " + "\"\"" + + _imgPath + "previous.png\">" + " "); } // Page count @@ -873,7 +873,7 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" "); - out.write(toThemeImg("control_play_blue", _t("Next"), _t("Next page"))); + out.write(toThemeImg("next", _t("Next"), _t("Next page"))); out.write(" "); } // Last @@ -881,15 +881,15 @@ public class I2PSnarkServlet extends BasicServlet { out.write(" "); - out.write(toThemeImg("control_fastforward_blue", _t("Last"), _t("Last page"))); + out.write(toThemeImg("last", _t("Last"), _t("Last page"))); out.write(" "); } else { out.write(" " + "\"\"" + + _imgPath + "next.png\">" + " " + "\"\""); + _imgPath + "last.png\">"); } } @@ -2063,24 +2063,26 @@ public class I2PSnarkServlet extends BasicServlet { // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("
\n"); writeHiddenInputs(out, req, "Add"); - out.write("
"); + out.write("
"); + out.write(""); - out.write("
\n
"); + out.write("
\n
"); out.write(_t("From URL")); out.write(": \n"); + out.write("\">\n"); // not supporting from file at the moment, since the file name passed isn't always absolute (so it may not resolve) //out.write("From file:
"); out.write("
\n" + - "
"); + out.write(_t("Data dir")); out.write(":
\n"); out.write(""); } - + private void writeSeedForm(PrintWriter out, HttpServletRequest req, List sortedTrackers) throws IOException { out.write("
\n"); // *not* enctype="multipart/form-data", so that the input type=file sends the filename, not the file out.write("
\n"); writeHiddenInputs(out, req, "Create"); - out.write(""); + out.write("
\n
"); + out.write("
\n
"); //out.write("From file:
\n"); out.write(_t("Data to seed")); out.write(":
" @@ -2112,20 +2114,23 @@ public class I2PSnarkServlet extends BasicServlet { + "\" spellcheck=\"false\" title=\""); out.write(_t("File or directory to seed (full path or within the directory {0} )", _manager.getDataDir().getAbsolutePath() + File.separatorChar)); - out.write("\" >
\n"); + out.write("\" > "); + out.write("
\n"); out.write(_t("Trackers")); - out.write(":
"); + out.write(":\n"); + out.write("\n"); + for (Tracker t : sortedTrackers) { String name = t.name; String announceURL = t.announceURL.replace("=", "="); + String homeURL = t.baseURL; out.write("\n"); + out.write("\" value=\"foo\">\n"); } out.write("
"); out.write(_t("Primary")); out.write(""); out.write(_t("Alternates")); - out.write("" + - " " + - "
"); + out.write(_t("Tracker URL")); + out.write("
"); out.write(name); out.write("
"); + out.write(homeURL); + out.write("
"); out.write(_t("none")); out.write("
\n"); + out.write(">
\n"); // make the user add a tracker on the config form now //out.write(_t("or")); //out.write(" "); + buf.append("
    "); for (Map.Entry e : entries.entrySet()) { Hash key = e.getKey(); @@ -78,8 +78,8 @@ class BanlistRenderer { buf.append(_t(entry.cause)); } if (!key.equals(Hash.FAKE_HASH)) { - buf.append(" (").append(_t("unban now")).append(")"); + buf.append(" [").append(_t("unban now")).append("]"); } buf.append("\n"); } 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 69c4dca69..c615ee0cd 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java @@ -112,7 +112,7 @@ public class ConfigClientsHelper extends HelperBase { /** clients */ public String getForm1() { StringBuilder buf = new StringBuilder(1024); - buf.append("\n" + + buf.append("
    \n" + "
    ").append(_t("Client")).append("") .append(_t("Run at Startup?")).append("") .append(_t("Control")).append("") @@ -198,7 +198,7 @@ public class ConfigClientsHelper extends HelperBase { /** webapps */ public String getForm2() { StringBuilder buf = new StringBuilder(1024); - buf.append("\n" + + buf.append("
    \n" + "") + .append("
    ").append(_t("WebApp")).append("") .append(_t("Run at Startup?")).append("") .append(_t("Control")).append("") @@ -227,7 +227,7 @@ public class ConfigClientsHelper extends HelperBase { /** plugins */ public String getForm3() { StringBuilder buf = new StringBuilder(1024); - buf.append("\n" + + buf.append("
    \n" + "
    ").append(_t("Plugin")).append("") .append(_t("Run at Startup?")).append("") .append(_t("Control")).append("") @@ -290,15 +290,17 @@ public class ConfigClientsHelper extends HelperBase { } s = stripHTML(appProps, "websiteURL"); if (s != null) { - desc.append("
    ") - .append("").append(_t("Website")).append(" "); + desc.append("
    ") + .append(_t("Website")).append("").append(s).append(""); } String updateURL = stripHTML(appProps, "updateURL.su3"); if (updateURL == null) updateURL = stripHTML(appProps, "updateURL"); if (updateURL != null) { - desc.append("
    ") - .append("").append(_t("Update link")).append(" "); + desc.append("
    ") + .append(_t("Update link")).append("").append(updateURL).append(""); } desc.append("
    "); boolean isRunning = PluginStarter.isPluginRunning(app, _context); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java index 758b990ce..769c75f36 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNavHelper.java @@ -57,9 +57,7 @@ public class ConfigNavHelper extends HelperBase { */ public void renderNavBar(String requestURI, boolean graphical) throws IOException { StringBuilder buf = new StringBuilder(1024); - // TODO fix up the non-light themes - String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME); - boolean span = graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME)); + boolean span = graphical; if (!span) buf.append("
    "); List tabs = new ArrayList(pages.length); @@ -84,9 +82,9 @@ public class ConfigNavHelper extends HelperBase { buf.append("").append(tabs.get(i).title).append(""); } if (span) - buf.append(" \n"); + buf.append("\n"); else if (i != pages.length - 1) - buf.append(" |\n"); + buf.append("  \n"); } if (!span) buf.append("
    "); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java index 76b136988..98cba974d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java @@ -210,25 +210,21 @@ public class ConfigNetHelper extends HelperBase { } } StringBuilder buf = new StringBuilder(128); - buf.append("
    "); for (String addr : addrs) { - buf.append("\n      " + - " "); buf.append(addr); - buf.append("
    "); + buf.append("
    \n"); } - buf.append("\n        "); if (!addrs.isEmpty()) { buf.append(_t("Add host name or IP")) .append(": "); } - buf.append("" + - "
    "); + buf.append(""); return buf.toString(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java index 6e93602f4..3d51575a1 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java @@ -26,7 +26,7 @@ public class ConfigTunnelsHelper extends HelperBase { cur++; } - buf.append("\n"); + buf.append("
    \n"); TunnelPoolSettings exploratoryIn = _context.tunnelManager().getInboundSettings(); TunnelPoolSettings exploratoryOut = _context.tunnelManager().getOutboundSettings(); @@ -69,7 +69,7 @@ public class ConfigTunnelsHelper extends HelperBase { boolean advanced = isAdvanced(); - buf.append("\n"); if (in.getLength() <= 0 || in.getLength() + in.getLengthVariance() <= 0 || diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java index dcbad6ed6..e805418d3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUIHelper.java @@ -9,15 +9,23 @@ public class ConfigUIHelper extends HelperBase { public String getSettings() { StringBuilder buf = new StringBuilder(512); + buf.append("
    "); String current = _context.getProperty(CSSHelper.PROP_THEME_NAME, CSSHelper.DEFAULT_THEME); Set themes = themeSet(); for (String theme : themes) { - buf.append("") + .append("").append(_t(theme)).append("
    \n"); + buf.append("value=\"").append(theme).append("\">") + .append("") + .append("\"\"") + .append("
    ") + .append("
    ").append(_t(theme)).append("
    ") + .append("
    \n"); } boolean universalTheming = _context.getBooleanProperty(CSSHelper.PROP_UNIVERSAL_THEMING); + buf.append("
    "); buf.append("") .append(_t("Force the mobile console to be used")) - .append("
    \n"); + .append("
    \n"); return buf.toString(); } @@ -71,6 +79,7 @@ public class ConfigUIHelper extends HelperBase { * Any language-specific flag added to the icon set must be * added to the top-level build.xml for the updater. * As of 0.9.12, ISO 639-2 three-letter codes are supported also. + * Note: To avoid truncation, ensure language name is no longer than 17 chars. */ private static final String langs[][] = { { "ar", "lang_ar", _x("Arabic"), null }, @@ -101,7 +110,7 @@ public class ConfigUIHelper extends HelperBase { { "vi", "vn", _x("Vietnamese"), null }, { "zh", "cn", _x("Chinese"), null }, { "zh_TW", "tw", _x("Chinese"), "Taiwan" }, - { "xx", "a1", "Debug: Find untagged strings", null }, + { "xx", "a1", "Untagged strings", null }, }; @@ -140,11 +149,12 @@ public class ConfigUIHelper extends HelperBase { if (lang.equals("xx") && !isAdvanced()) continue; // we use "lang" so it is set automagically in CSSHelper - buf.append("") - .append("\"\" "); + .append("\"\"") + .append("
    "); int under = lang.indexOf('_'); String slang = (under > 0) ? lang.substring(0, under) : lang; buf.append(Messages.getDisplayLanguage(slang, langs[i][2], _context)); @@ -154,7 +164,7 @@ public class ConfigUIHelper extends HelperBase { .append(Messages.getString(name, _context, Messages.COUNTRY_BUNDLE_NAME)) .append(')'); } - buf.append("
    \n"); + buf.append("
    \n"); } return buf.toString(); } @@ -164,7 +174,7 @@ public class ConfigUIHelper extends HelperBase { StringBuilder buf = new StringBuilder(512); ConsolePasswordManager mgr = new ConsolePasswordManager(_context); Map userpw = mgr.getMD5(RouterConsoleRunner.PROP_CONSOLE_PW); - buf.append("
    "); + buf.append("
    "); buf.append(name).append("
    "); + buf.append("
    "); if (userpw.isEmpty()) { buf.append("\n"); for (String name : userpw.keySet()) { buf.append("\n"); } } - buf.append("" + - "
    "); buf.append(_t("Add a user and password to enable.")); @@ -173,7 +183,7 @@ public class ConfigUIHelper extends HelperBase { buf.append("
    ") .append(_t("Remove")) .append("") - .append(_t("User Name")) + .append(_t("Username")) .append(" 
    ") - .append(_t("Add")).append(":" + - "" + - ""); - buf.append(_t("Password")).append(": " + - "
    \n"); + buf.append("
    ") + .append("").append(_t("Username")).append(": ") + .append("") + .append("").append(_t("Password")).append(": ") + .append("") + .append("
    \n"); return buf.toString(); } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java index 9dd7892f2..b73272c7e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/EventLogHelper.java @@ -99,7 +99,7 @@ public class EventLogHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

    " + _t("Display Events") + "

    "); + _out.write("

    " + _t("Display Events") + "

    "); _out.write("\n" + "\n" + "\n"); @@ -107,7 +107,7 @@ public class EventLogHelper extends FormHandler { for (int i = 0; i < _times.length; i++) { writeOption(_times[i]); } - _out.write("
    "); + _out.write(" "); _out.write(_t("Event type") + ": " + - "
    "); + " "); } catch (IOException ioe) { ioe.printStackTrace(); } @@ -175,7 +175,7 @@ public class EventLogHelper extends FormHandler { return _t("No \"{0}\" events found in previous {1}", xev, DataHelper.formatDuration2(_age)); } StringBuilder buf = new StringBuilder(2048); - buf.append("
    "); + buf.append("
    "); buf.append(_t("Time")); buf.append(""); if (isAll) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FileDumpHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/FileDumpHelper.java index af2074394..69acafa80 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/FileDumpHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/FileDumpHelper.java @@ -29,7 +29,7 @@ public class FileDumpHelper extends HelperBase { public String getFileSummary() { StringBuilder buf = new StringBuilder(16*1024); - buf.append("" + + buf.append("
    FileSizeDateSHA 256Revision
    " + ""); // jars added in wrapper.config diff --git a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java index 5beb2ba23..0f6387b28 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/GraphHelper.java @@ -232,12 +232,13 @@ public class GraphHelper extends FormHandler { name = r.getRateStat().getName(); displayName = name; } - _out.write("

    "); + _out.write("

    "); _out.write(_t("{0} for {1}", displayName, DataHelper.formatDuration2(_periodCount * period))); if (_end > 0) _out.write(' ' + _t("ending {0} ago", DataHelper.formatDuration2(_end * period))); - _out.write("

    [" + _t("Return to main graphs page") + "]\n" + + "

    \n"); + + "\">

    \n"); if (_width < MAX_X && _height < MAX_Y) { _out.write(link(_stat, _showEvents, _periodCount, _end, _width * 3 / 2, _height * 3 / 2)); @@ -353,7 +354,7 @@ public class GraphHelper extends FormHandler { // So just use the "shared/console nonce". String nonce = CSSHelper.getNonce(); try { - _out.write("

    " + _t("Configure Graph Display") + " [" + _t("Select Stats") + "]

    "); + _out.write("

    " + _t("Configure Graph Display") + " [" + _t("Select Stats") + "]

    "); _out.write("\n" + "\n" + "\n"); @@ -384,7 +385,7 @@ public class GraphHelper extends FormHandler { if (persistent) _out.write(HelperBase.CHECKED); _out.write(">" + - "
    "); + "
    "); } catch (IOException ioe) { ioe.printStackTrace(); } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java index c625ac19e..ecd39b685 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/HomeHelper.java @@ -29,48 +29,48 @@ public class HomeHelper extends HelperBase { static final String DEFAULT_SERVICES = _x("Addressbook") + S + _x("Manage your I2P hosts file here (I2P domain name resolution)") + S + "/dns" + S + I + "book_addresses.png" + S + _x("Configure Bandwidth") + S + _x("I2P Bandwidth Configuration") + S + "/config" + S + I + "action_log.png" + S + - _x("Configure Language") + S + _x("Console Language Selection") + S + "/configui" + S + I + "wrench_orange.png" + S + + _x("Configure UI") + S + _x("Select console theme & language & set optional console password") + S + "/configui" + S + I + "wrench_orange.png" + S + _x("Customize Home Page") + S + _x("I2P Home Page Configuration") + S + "/confighome" + S + I + "home_page.png" + S + _x("Email") + S + _x("Anonymous webmail client") + S + "/susimail/susimail" + S + I + "email.png" + S + _x("Help") + S + _x("I2P Router Help") + S + "/help" + S + I + "support.png" + S + _x("Router Console") + S + _x("I2P Router Console") + S + "/console" + S + I + "toolbox.png" + S + _x("Torrents") + S + _x("Built-in anonymous BitTorrent Client") + S + "/i2psnark/" + S + I + "magnet.png" + S + - _x("Website") + S + _x("Local web server") + S + "http://127.0.0.1:7658/" + S + I + "server_32x32.png" + S + + _x("Website") + S + _x("Local web server for hosting your own content on I2P") + S + "http://127.0.0.1:7658/" + S + I + "server_32x32.png" + S + ""; // No commas allowed in text strings! static final String DEFAULT_FAVORITES = "anoncoin.i2p" + S + _x("The Anoncoin project") + S + "http://anoncoin.i2p/" + S + I + "anoncoin_32.png" + S + - _x("Bug Reports") + S + _x("Bug tracker") + S + "http://trac.i2p2.i2p/report/1" + S + I + "bug.png" + S + + _x("I2P Bug Reports") + S + _x("Bug tracker") + S + "http://trac.i2p2.i2p/report/1" + S + I + "bug.png" + S + //"colombo-bt.i2p" + S + _x("The Italian Bittorrent Resource") + S + "http://colombo-bt.i2p/" + S + I + "colomboicon.png" + S + _x("Dev Forum") + S + _x("Development forum") + S + "http://zzz.i2p/" + S + I + "group_gear.png" + S + _x("diftracker") + S + _x("Bittorrent tracker") + S + "http://diftracker.i2p/" + S + I + "magnet.png" + S + "echelon.i2p" + S + _x("I2P Applications") + S + "http://echelon.i2p/" + S + I + "box_open.png" + S + "exchanged.i2p" + S + _x("Anonymous cryptocurrency exchange") + S + "http://exchanged.i2p/" + S + I + "exchanged.png" + S + - _x("FAQ") + S + _x("Frequently Asked Questions") + S + "http://i2p-projekt.i2p/faq" + S + I + "question.png" + S + - _x("Forum") + S + _x("Community forum") + S + "http://forum.i2p/" + S + I + "group.png" + S + - _x("Anonymous Git Hosting") + S + _x("A public anonymous Git hosting site - supports pulling via Git and HTTP and pushing via SSH") + S + "http://git.repo.i2p/" + S + I + "git-logo.png" + S + - "hiddengate.i2p" + S + _x("HiddenGate") + S + "http://hiddengate.i2p/" + S + I + "hglogo32.png" + S + + _x("I2P FAQ") + S + _x("Frequently Asked Questions") + S + "http://i2p-projekt.i2p/faq" + S + I + "question.png" + S + + _x("I2P Forum") + S + _x("Community forum") + S + "http://forum.i2p/" + S + I + "group.png" + S + + "git.repo.i2p" + S + _x("A public anonymous Git hosting site - supports pulling via Git and HTTP and pushing via SSH") + S + "http://git.repo.i2p/" + S + I + "git-logo.png" + S + + "hiddengate [ru]" + S + _x("Russian I2P-related wiki") + S + "http://hiddengate.i2p/" + S + I + "hglogo32.png" + S + _x("I2P Wiki") + S + _x("Anonymous wiki - share the knowledge") + S + "http://i2pwiki.i2p/" + S + I + "i2pwiki_logo.png" + S + "Ident " + _x("Microblog") + S + _x("Your premier microblogging service on I2P") + S + "http://id3nt.i2p/" + S + I + "ident_icon_blue.png" + S + //_x("Javadocs") + S + _x("Technical documentation") + S + "http://i2p-javadocs.i2p/" + S + I + "education.png" + S + //"jisko.i2p" + S + _x("Simple and fast microblogging website") + S + "http://jisko.i2p/" + S + I + "jisko_console_icon.png" + S + //_x("Key Server") + S + _x("OpenPGP Keyserver") + S + "http://keys.i2p/" + S + I + "education.png" + S + //"killyourtv.i2p" + S + _x("Debian and Tahoe-LAFS repositories") + S + "http://killyourtv.i2p/" + S + I + "television_delete.png" + S + - _x("Free Web Hosting") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S + - _x("Pastebin") + S + _x("I2P Pastebin") + S + "http://zerobin.i2p/" + S + I + "paste_plain.png" + S + + _x("Open4You") + S + _x("Free eepsite hosting with PHP and MySQL") + S + "http://open4you.i2p/" + S + I + "open4you-logo.png" + S + + _x("Pastebin") + S + _x("Encrypted I2P Pastebin") + S + "http://zerobin.i2p/" + S + I + "paste_plain.png" + S + _x("Planet I2P") + S + _x("I2P News") + S + "http://planet.i2p/" + S + I + "world.png" + S + - _x("Plugins") + S + _x("Add-on directory") + S + "http://i2pwiki.i2p/index.php?title=Plugins" + S + I + "plugin.png" + S + + _x("I2P Plugins") + S + _x("Add-on directory") + S + "http://i2pwiki.i2p/index.php?title=Plugins" + S + I + "plugin.png" + S + _x("Postman's Tracker") + S + _x("Bittorrent tracker") + S + "http://tracker2.postman.i2p/" + S + I + "magnet.png" + S + _x("Project Website") + S + _x("I2P home page") + S + "http://i2p-projekt.i2p/" + S + I + "info_rhombus.png" + S + - _x("Russian News Feed") + S + "lenta.i2p" + S + "http://lenta.i2p/" + S + I + "lenta_main_logo.png" + S + + _x("lenta news [ru]") + S + _x("Russian News Feed") + S + "http://lenta.i2p/" + S + I + "lenta_main_logo.png" + S + //"Salt" + S + "salt.i2p" + S + "http://salt.i2p/" + S + I + "salt_console.png" + S + "stats.i2p" + S + _x("I2P Network Statistics") + S + "http://stats.i2p/cgi-bin/dashboard.cgi" + S + I + "chart_line.png" + S + - _x("Technical Docs") + S + _x("Technical documentation") + S + "http://i2p-projekt.i2p/how" + S + I + "education.png" + S + + _x("I2P Technical Docs") + S + _x("Technical documentation") + S + "http://i2p-projekt.i2p/how" + S + I + "education.png" + S + _x("The Tin Hat") + S + _x("Privacy guides and tutorials") + S + "http://secure.thetinhat.i2p/" + S + I + "thetinhat.png" + S + _x("Trac Wiki") + S + S + "http://trac.i2p2.i2p/" + S + I + "billiard_marker.png" + S + //_x("Ugha's Wiki") + S + S + "http://ugha.i2p/" + S + I + "billiard_marker.png" + S + - _x("Sponge's main site") + S + _x("Seedless and the Robert BitTorrent applications") + S + "http://sponge.i2p/" + S + I + "user_astronaut.png" + S + + _x("sponge.i2p") + S + _x("Seedless and the Robert BitTorrent applications") + S + "http://sponge.i2p/" + S + I + "user_astronaut.png" + S + ""; @@ -211,9 +211,9 @@ public class HomeHelper extends HelperBase { private String renderConfig(Collection apps) { StringBuilder buf = new StringBuilder(1024); - buf.append("
    FileSizeDateSHA 256RevisionJDKBuiltByMods
    ") + buf.append("\n"); } - buf.append("" + ""); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java index 7bc28287f..2dcd3eeff 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/JobQueueHelper.java @@ -47,13 +47,16 @@ public class JobQueueHelper extends HelperBase { int numRunners = _context.jobQueue().getJobs(readyJobs, timedJobs, activeJobs, justFinishedJobs); StringBuilder buf = new StringBuilder(32*1024); - buf.append("

    ").append(_t("I2P Job Queue")).append("


    ") + buf.append("
    ") + .append("

    ") .append(_t("Job runners")).append(": ").append(numRunners) - .append("
    \n"); + .append("

    \n"); long now = _context.clock().now(); - buf.append("
    ").append(_t("Active jobs")).append(": ").append(activeJobs.size()).append("
      \n"); + buf.append("

      ") + .append(_t("Active jobs")).append(": ").append(activeJobs.size()) + .append("

        "); for (int i = 0; i < activeJobs.size(); i++) { Job j = activeJobs.get(i); buf.append("
      1. (").append(_t("started {0} ago", DataHelper.formatDuration2(now-j.getTiming().getStartAfter()))).append("): "); @@ -61,7 +64,9 @@ public class JobQueueHelper extends HelperBase { } buf.append("
      \n"); - buf.append("
      ").append(_t("Just finished jobs")).append(": ").append(justFinishedJobs.size()).append("
        \n"); + buf.append("

        ") + .append(_t("Just finished jobs")).append(": ").append(justFinishedJobs.size()) + .append("

          "); for (int i = 0; i < justFinishedJobs.size(); i++) { Job j = justFinishedJobs.get(i); buf.append("
        1. (").append(_t("finished {0} ago", DataHelper.formatDuration2(now-j.getTiming().getActualEnd()))).append("): "); @@ -69,7 +74,9 @@ public class JobQueueHelper extends HelperBase { } buf.append("
        \n"); - buf.append("
        ").append(_t("Ready/waiting jobs")).append(": ").append(readyJobs.size()).append("
          \n"); + buf.append("

          ") + .append(_t("Ready/waiting jobs")).append(": ").append(readyJobs.size()) + .append("

            "); ObjectCounter counter = new ObjectCounter(); for (int i = 0; i < readyJobs.size(); i++) { Job j = readyJobs.get(i); @@ -86,7 +93,9 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
            ").append(_t("Scheduled jobs")).append(": ").append(timedJobs.size()).append("
              \n"); + buf.append("

              ") + .append(_t("Scheduled jobs")).append(": ").append(timedJobs.size()) + .append("

                "); long prev = Long.MIN_VALUE; counter.clear(); for (int i = 0; i < timedJobs.size(); i++) { @@ -110,7 +119,9 @@ public class JobQueueHelper extends HelperBase { out.write(buf.toString()); buf.setLength(0); - buf.append("
                ").append(_t("Total Job Statistics")).append("\n"); + buf.append("

                ") + .append(_t("Total Job Statistics")) + .append("

                \n"); getJobStats(buf); out.write(buf.toString()); } @@ -120,8 +131,8 @@ public class JobQueueHelper extends HelperBase { List names = new ArrayList(counter.objects()); if (names.size() < 4) return; - buf.append("
    ") .append(_t("Remove")) - .append("") + .append("") .append(_t("Name")) .append("") .append(_t("URL")) @@ -238,7 +238,7 @@ public class HomeHelper extends HelperBase { buf.append(url); buf.append("
    ") + buf.append("
    ") .append(_t("Add")).append(":" + "
    \n" + - "
    ").append(_t("Job")).append("").append(_t("Queued")).append(""); + buf.append("\n" + + "\n"); Collections.sort(names, new JobCountComparator(counter)); for (String name : names) { buf.append("
    ").append(_t("Job")).append("").append(_t("Queued")).append("
    ").append(name) @@ -137,7 +148,7 @@ public class JobQueueHelper extends HelperBase { * @since 0.8.9 */ private void getJobStats(StringBuilder buf) { - buf.append("\n" + + buf.append("
    \n" + "" + "" + "\n
    ").append(_t("Job")).append("").append(_t("Runs")).append("").append(_t("Dropped")).append("").append(_t("Time")).append("").append(_t("Avg")).append("") diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java index 106c66673..98cd1b71d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java @@ -129,7 +129,7 @@ public class LogsHelper extends HelperBase { return "

    " + _t("File not found") + ": " + f.getAbsolutePath() + "

    "; } else { str = str.replace("&", "&").replace("<", "<").replace(">", ">"); - return "

    " + _t("File location") + ": " + f.getAbsolutePath() + "

    " + str + "
    "; + return "

    " + _t("File location") + ": " + f.getAbsolutePath() + "

    " + str + "
    "; } } @@ -144,10 +144,10 @@ public class LogsHelper extends HelperBase { /** formats in reverse order */ private String formatMessages(List msgs) { if (msgs.isEmpty()) - return "

    " + _t("No log messages") + "

    "; + return "

    " + _t("No log messages") + "

    "; boolean colorize = _context.getBooleanPropertyDefaultTrue("routerconsole.logs.color"); StringBuilder buf = new StringBuilder(16*1024); - buf.append("
      "); + buf.append("
      "); for (int i = msgs.size() - 1; i >= 0; i--) { String msg = msgs.get(i); // don't display the dup message if it is last diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java index ba977a6e8..ad4dcadab 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbHelper.java @@ -116,9 +116,7 @@ public class NetDbHelper extends HelperBase { private void renderNavBar() throws IOException { StringBuilder buf = new StringBuilder(1024); buf.append("
      "); - // TODO fix up the non-light themes - String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME); - boolean span = _graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME)); + boolean span = _graphical; if (!span) buf.append("
      "); int tab = getTab(); @@ -139,9 +137,9 @@ public class NetDbHelper extends HelperBase { buf.append("").append(_t(titles[i])).append(""); } if (span) - buf.append(" \n"); + buf.append("\n"); else if (i != titles.length - 1) - buf.append(" |\n"); + buf.append("  \n"); } if (!span) buf.append("
      "); 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 c9a34ece0..7428cd62e 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NetDbRenderer.java @@ -124,7 +124,7 @@ class NetDbRenderer { public void renderLeaseSetHTML(Writer out, boolean debug) throws IOException { StringBuilder buf = new StringBuilder(4*1024); if (debug) - buf.append("

      Debug mode - Sorted by hash distance, closest first

      \n"); + buf.append("

      Debug mode - Sorted by hash distance, closest first

      \n"); Hash ourRKey; Set leases; DecimalFormat fmt; @@ -142,9 +142,52 @@ class NetDbRenderer { int rapCount = 0; BigInteger median = null; int c = 0; + + + // Summary + FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb(); + if (debug) { + buf.append("\n"); + } else { + buf.append("
      \n"); + } + buf.append("") + .append("\n") + .append("\n"); + if (debug) { + buf.append("\n") + .append("") + .append("\n") + .append("") + .append("\n"); + } + int ff = _context.peerManager().getPeersByCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL).size(); + buf.append("\n") + .append("\n"); + if (debug) { + buf.append("") + .append("\n"); + // 2 for 4 floodfills... -1 for median + // this can be way off for unknown reasons + int total = (int) Math.round(Math.pow(2, 2 + 256 - 1 - log2)); + buf.append("\n"); + buf.append("\n"); + } + buf.append("
      Leaseset Summary[") + .append(_t("Configure Floodfill Participation")) + .append("]
      Total Leasesets:").append(leases.size()).append("
      Published (RAP) Leasesets:").append(netdb.getKnownLeaseSets()).append("
      Mod Data:").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())).append("Last Changed:").append(new Date(_context.routerKeyGenerator().getLastChanged())).append("
      Next Mod Data:").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())).append("Change in:").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())).append("
      Known Floodfills:").append(ff).append("
      Currently Floodfill?").append(netdb.floodfillEnabled() ? "yes" : "no").append("
      Network data (only valid if floodfill):"); + //buf.append("

      Center of Key Space (router hash): " + ourRKey.toBase64()); + if (median != null) { + double log2 = biLog2(median); + buf.append("

      Median distance (bits):").append(fmt.format(log2)).append("
      Estimated total floodfills:").append(total).append("
      Estimated total leasesets:").append(total * rapCount / 4); + } else { + buf.append("Not floodfill or no data."); + } + buf.append("
      \n"); + if (leases.isEmpty()) { if (!debug) - buf.append("").append(_t("none")).append(""); + buf.append("
      ").append(_t("No Leasesets currently active.")).append("
      "); } else { if (debug) { // Find the center of the RAP leasesets @@ -154,109 +197,93 @@ class NetDbRenderer { } medianCount = rapCount / 2; } + long now = _context.clock().now(); for (LeaseSet ls : leases) { Destination dest = ls.getDestination(); Hash key = dest.calculateHash(); - buf.append("").append(_t("LeaseSet")).append(": ").append(key.toBase64()).append("\n"); + buf.append("\n") + .append(""); if (_context.clientManager().isLocal(dest)) { - buf.append(" (" + _t("Local") + " "); + buf.append("\n"); String host = _context.namingService().reverseLookup(dest); if (host == null) { - buf.append("").append(_t("Add to local addressbook")).append("
      \n"); + buf.append(""); } } else { - buf.append(" (").append(_t("Destination")).append(' '); + buf.append(""); } else { String b32 = dest.toBase32(); - buf.append(dest.toBase64().substring(0, 6)).append(")
      \n" + - "").append(b32).append("
      \n" + - "").append(_t("Add to local addressbook")).append("
      \n"); + buf.append("").append(dest.toBase64().substring(0, 6)).append("") + .append("\n") + .append("\n") + .append(""); } } + buf.append("\n\n"); if (debug) { - buf.append("RAP? " + ls.getReceivedAsPublished()); - buf.append(" RAR? " + ls.getReceivedAsReply()); + buf.append("\n\n"); + } for (int i = 0; i < ls.getLeaseCount(); i++) { Lease lease = ls.getLease(i); - buf.append(_t("Lease")).append(' ').append(i + 1).append(": ").append(_t("Gateway")).append(' '); + buf.append("\n"); } - buf.append("
      \n"); + buf.append("
      ").append(_t("LeaseSet")).append(": ").append(key.toBase64()).append("" + _t("Local") + " "); if (! _context.clientManager().shouldPublishLeaseSet(key)) buf.append(_t("Unpublished") + ' '); - buf.append(_t("Destination") + ' '); + buf.append("").append(_t("Destination")).append(": "); TunnelPoolSettings in = _context.tunnelManager().getInboundSettings(key); if (in != null && in.getDestinationNickname() != null) buf.append(in.getDestinationNickname()); else buf.append(dest.toBase64().substring(0, 6)); - buf.append(")
      \n"); + buf.append("
      "); String b32 = dest.toBase32(); - buf.append("").append(b32).append("
      \n"); + buf.append("").append(b32).append("
      ").append("").append(_t("Add to local addressbook")).append("").append(_t("Destination")).append(": "); String host = _context.namingService().reverseLookup(dest); if (host != null) { - buf.append("").append(host).append(")
      \n"); + buf.append("").append(host).append("
      ").append(b32).append("").append(_t("Add to local addressbook")).append("
      \n"); long exp = ls.getLatestLeaseDate()-now; if (exp > 0) - buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exp))); + buf.append("").append(_t("Expires in {0}", DataHelper.formatDuration2(exp))).append(""); else - buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exp))); - buf.append("
      \n"); + buf.append("").append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exp))).append(""); + buf.append("
      "); + buf.append("RAP? ").append(ls.getReceivedAsPublished()); + buf.append(" RAR? ").append(ls.getReceivedAsReply()); BigInteger dist = HashDistance.getDistance(ourRKey, ls.getRoutingKey()); if (ls.getReceivedAsPublished()) { if (c++ == medianCount) median = dist; } - buf.append(" Dist: ").append(fmt.format(biLog2(dist))).append("
      "); + buf.append(" Distance: ").append(fmt.format(biLog2(dist))).append(""); + buf.append("
      "); //buf.append(dest.toBase32()).append("
      "); - buf.append("Sig type: ").append(dest.getSigningPublicKey().getType()).append("
      "); - buf.append("Routing Key: ").append(ls.getRoutingKey().toBase64()); - buf.append("
      "); - buf.append("Encryption Key: ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("...
      "); + buf.append("Signature type: ").append(dest.getSigningPublicKey().getType()); + buf.append(" Encryption Key: ").append(ls.getEncryptionKey().toBase64().substring(0, 20)).append("…"); + buf.append("
      "); + buf.append("Routing Key: ").append(ls.getRoutingKey().toBase64()); + buf.append("
      "); + buf.append("").append(_t("Lease")).append(' ').append(i + 1).append(": ").append(_t("Gateway")).append(' '); buf.append(_context.commSystem().renderPeerHTML(lease.getGateway())); buf.append(' ').append(_t("Tunnel")).append(' ').append(lease.getTunnelId().getTunnelId()).append(' '); if (debug) { long exl = lease.getEndDate().getTime() - now; if (exl > 0) - buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exl))); + buf.append("").append(_t("Expires in {0}", DataHelper.formatDuration2(exl))).append(""); else - buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))); + buf.append("").append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exl))).append(""); } - buf.append("
      \n"); + buf.append("
      \n"); out.write(buf.toString()); buf.setLength(0); } // for each } // !empty - if (debug) { - FloodfillNetworkDatabaseFacade netdb = (FloodfillNetworkDatabaseFacade)_context.netDb(); - buf.append("

      Total Leasesets: ").append(leases.size()); - buf.append("

      Published (RAP) Leasesets: ").append(netdb.getKnownLeaseSets()); - buf.append("

      Mod Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) - .append("\" Last Changed: ").append(new Date(_context.routerKeyGenerator().getLastChanged())); - buf.append("

      Next Mod Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) - .append("\" Change in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())); - int ff = _context.peerManager().getPeersByCapability(FloodfillNetworkDatabaseFacade.CAPABILITY_FLOODFILL).size(); - buf.append("

      Known Floodfills: ").append(ff); - buf.append("

      Currently Floodfill? "); - buf.append(netdb.floodfillEnabled() ? "yes" : "no"); - buf.append("

      Network data (only valid if floodfill):"); - //buf.append("

      Center of Key Space (router hash): " + ourRKey.toBase64()); - if (median != null) { - double log2 = biLog2(median); - buf.append("

      Median distance (bits): ").append(fmt.format(log2)); - // 2 for 4 floodfills... -1 for median - // this can be way off for unknown reasons - int total = (int) Math.round(Math.pow(2, 2 + 256 - 1 - log2)); - buf.append("

      Estimated total floodfills: ").append(total); - buf.append("

      Estimated total leasesets: ").append(total * rapCount / 4); - } else { - buf.append("

      Not floodfill or no data"); - } - buf.append("

      "); - } out.write(buf.toString()); out.flush(); } @@ -338,14 +365,14 @@ class NetDbRenderer { if (!showStats) { // the summary table - buf.append("
      ") + buf.append("
      ") .append(_t("Network Database Router Statistics")) .append("
      "); // versions table List versionList = new ArrayList(versions.objects()); if (!versionList.isEmpty()) { Collections.sort(versionList, Collections.reverseOrder(new VersionComparator())); - buf.append("\n"); + buf.append("
      \n"); buf.append("\n"); for (String routerVersion : versionList) { int num = versions.count(routerVersion); @@ -364,7 +391,7 @@ class NetDbRenderer { start = end; // transports table - buf.append("
      " + _t("Version") + "" + _t("Count") + "
      \n"); + buf.append("
      \n"); buf.append("\n"); for (int i = 0; i < TNAMES.length; i++) { int num = transportCount[i]; @@ -386,7 +413,7 @@ class NetDbRenderer { List countryList = new ArrayList(countries.objects()); if (!countryList.isEmpty()) { Collections.sort(countryList, new CountryComparator()); - buf.append("
      " + _t("Transports") + "" + _t("Count") + "
      \n"); + buf.append("
      \n"); buf.append("\n"); for (String country : countryList) { int num = countries.count(country); @@ -448,31 +475,41 @@ class NetDbRenderer { */ private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) { String hash = info.getIdentity().getHash().toBase64(); - buf.append("
      " + _t("Country") + "" + _t("Count") + "
      "); + buf.append("") + .append("\n"); long age = _context.clock().now() - info.getPublished(); if (isUs && _context.router().isHidden()) { - buf.append("").append(_t("Hidden")).append(", ").append(_t("Updated")).append(": ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
      \n"); + buf.append("") + .append(""); } else if (age > 0) { - buf.append("").append(_t("Published")).append(": ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
      \n"); + buf.append("") + .append(""); } else { // shouldnt happen - buf.append("" + _t("Published") + ": in ").append(DataHelper.formatDuration2(0-age)).append("???
      \n"); + buf.append(""); } + buf.append("\n\n") + .append("") + .append("\n"); if (full) { - buf.append("
      "); if (isUs) { - buf.append("" + _t("Our info") + ": ").append(hash).append("
      \n"); + buf.append("" + _t("Our info") + ": ").append(hash).append(""); } else { - buf.append("" + _t("Peer info for") + ": ").append(hash).append("\n"); + buf.append("" + _t("Peer info for") + ": ").append(hash).append(""); if (!full) { - buf.append("[").append(_t("Full entry")).append("]"); + buf.append("[").append(_t("Full entry")).append("]"); } - buf.append("
      \n"); } - + buf.append("
      ").append(_t("Hidden")).append(", ").append(_t("Updated")).append(":") + .append(_t("{0} ago", DataHelper.formatDuration2(age))) + .append("").append(_t("Published")).append(":") + .append(_t("{0} ago", DataHelper.formatDuration2(age))) + .append("").append(_t("Published")).append(": in ").append(DataHelper.formatDuration2(0-age)).append("???
      "); buf.append("").append(_t("Signing Key")).append(": ") + .append("") .append(info.getIdentity().getSigningPublicKey().getType().toString()); - buf.append("
      \n" + _t("Address(es)") + ": "); + buf.append("
      " + _t("Address(es)") + ":"); String country = _context.commSystem().getCountry(info.getIdentity().getHash()); if(country != null) { buf.append("\"").append(country.toUpperCase(Locale.US)).append('\"');
      " + _t("Stats") + ":
      "); + buf.append("
      " + _t("Stats") + ":"); Map p = info.getOptionsMap(); for (Map.Entry e : p.entrySet()) { String key = (String) e.getKey(); 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 b43fd2518..5414ea7a8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfileOrganizerRenderer.java @@ -78,13 +78,14 @@ class ProfileOrganizerRenderer { if (mode < 2) { //buf.append("

      ").append(_t("Peer Profiles")).append("

      \n

      "); + buf.append("

      "); buf.append(ngettext("Showing 1 recent profile.", "Showing {0} recent profiles.", order.size())).append('\n'); if (older > 0) buf.append(ngettext("Hiding 1 older profile.", "Hiding {0} older profiles.", older)).append('\n'); if (standard > 0) buf.append("").append(ngettext("Hiding 1 standard profile.", "Hiding {0} standard profiles.", standard)).append("\n"); buf.append("

      "); - buf.append(""); + buf.append("
      "); buf.append(""); buf.append(""); buf.append(""); @@ -197,7 +198,7 @@ class ProfileOrganizerRenderer { //buf.append("

      ").append(_t("Floodfill and Integrated Peers")) // .append(" (").append(integratedPeers.size()).append(")

      \n"); - buf.append("
      ").append(_t("Peer")).append("").append(_t("Groups (Caps)")).append("
      "); + buf.append("
      "); buf.append(""); buf.append(""); buf.append(""); @@ -250,7 +251,7 @@ class ProfileOrganizerRenderer { } buf.append("\n"); } - buf.append("
      ").append(_t("Peer")).append("").append(_t("Caps")).append("
      "); + buf.append("
      "); //// //// don't bother reindenting @@ -258,21 +259,24 @@ class ProfileOrganizerRenderer { } if (mode < 2) { - buf.append("

      ").append(_t("Thresholds")).append("

      "); + buf.append("

      ").append(_t("Thresholds")).append("

      \n") + .append("
      "); buf.append("

      ").append(_t("Speed")).append(": ").append(num(_organizer.getSpeedThreshold())) .append(" (").append(fast).append(' ').append(_t("fast peers")).append(")
      "); buf.append("").append(_t("Capacity")).append(": ").append(num(_organizer.getCapacityThreshold())) .append(" (").append(reliable).append(' ').append(_t("high capacity peers")).append(")
      "); buf.append("").append(_t("Integration")).append(": ").append(num(_organizer.getIntegrationThreshold())) - .append(" (").append(integrated).append(' ').append(_t(" well integrated peers")).append(")

      "); - buf.append("

      ").append(_t("Definitions")).append("

        "); + .append(" (").append(integrated).append(' ').append(_t(" well integrated peers")).append(")") + .append("
      \n"); + buf.append("

      ").append(_t("Definitions")).append("

      \n") + .append("
        "); buf.append("
      • ").append(_t("groups")).append(": ").append(_t("as determined by the profile organizer")).append("
      • "); buf.append("
      • ").append(_t("caps")).append(": ").append(_t("capabilities in the netDb, not used to determine profiles")).append("
      • "); buf.append("
      • ").append(_t("speed")).append(": ").append(_t("peak throughput (bytes per second) over a 1 minute period that the peer has sustained in a single tunnel")).append("
      • "); buf.append("
      • ").append(_t("capacity")).append(": ").append(_t("how many tunnels can we ask them to join in an hour?")).append("
      • "); buf.append("
      • ").append(_t("integration")).append(": ").append(_t("how many new peers have they told us about lately?")).append("
      • "); buf.append("
      • ").append(_t("status")).append(": ").append(_t("is the peer banned, or unreachable, or failing tunnel tests?")).append("
      • "); - buf.append("
      "); + buf.append("
      \n"); //// //// don't bother reindenting diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java index 3236d1f12..e9a3eb531 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ProfilesHelper.java @@ -9,7 +9,7 @@ public class ProfilesHelper extends HelperBase { private static final String titles[] = {_x("High Capacity"), // 0 - _x("Floodfill "), // 1 + _x("Floodfill"), // 1 _x("Banned"), // 2 _x("All"), }; // 3 @@ -93,9 +93,7 @@ public class ProfilesHelper extends HelperBase { private void renderNavBar() throws IOException { StringBuilder buf = new StringBuilder(1024); buf.append("
      "); - // TODO fix up the non-light themes - String theme = _context.getProperty(CSSHelper.PROP_THEME_NAME); - boolean span = _graphical && (theme == null || theme.equals(CSSHelper.DEFAULT_THEME)); + boolean span = _graphical; if (!span) buf.append("
      "); int tab = getTab(); @@ -112,9 +110,9 @@ public class ProfilesHelper extends HelperBase { buf.append("").append(_t(titles[i])).append(""); } if (span) - buf.append(" \n"); + buf.append("\n"); else if (i != titles.length - 1) - buf.append(" |\n"); + buf.append("  \n"); } if (!span) buf.append("
      "); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java index 634940edf..568253bfe 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/StatsGenerator.java @@ -30,11 +30,21 @@ public class StatsGenerator { public void generateStatsPage(Writer out, boolean showAll) throws IOException { StringBuilder buf = new StringBuilder(16*1024); - buf.append("
      "); - buf.append(""); out.write(buf.toString()); buf.setLength(0); - + Map> unsorted = _context.statManager().getStatsByGroup(); Map> groups = new TreeMap>(new AlphaComparator()); groups.putAll(unsorted); @@ -56,25 +66,19 @@ public class StatsGenerator { } buf.append(" "); buf.append(""); - - buf.append(_t("Statistics gathered during this router's uptime")).append(" ("); - long uptime = _context.router().getUptime(); - buf.append(DataHelper.formatDuration2(uptime)); - buf.append("). ").append( _t("The data gathered is quantized over a 1 minute period, so should just be used as an estimate.")); - buf.append(' ').append( _t("These statistics are primarily used for development and debugging.")); out.write(buf.toString()); buf.setLength(0); - + for (Map.Entry> entry : groups.entrySet()) { String group = entry.getKey(); Set stats = entry.getValue(); - buf.append("

      "); buf.append(_t(group)); buf.append("

      "); - buf.append("
        "); + buf.append("
          "); out.write(buf.toString()); buf.setLength(0); for (String stat : stats) { @@ -82,7 +86,7 @@ public class StatsGenerator { buf.append(stat); buf.append("\">"); buf.append(stat); - buf.append("
          "); + buf.append(": "); if (_context.statManager().isFrequency(stat)) renderFrequency(stat, buf); else @@ -102,7 +106,7 @@ public class StatsGenerator { buf.append(freq.getDescription()); buf.append("
          "); if (freq.getEventCount() <= 0) { - buf.append(_t("No lifetime events")).append("
          \n"); + buf.append("
          • ").append(_t("No lifetime events")).append("
          \n"); return; } long uptime = _context.router().getUptime(); @@ -153,7 +157,7 @@ public class StatsGenerator { buf.append("
          "); } if (rate.getLifetimeEventCount() <= 0) { - buf.append(_t("No lifetime events")).append("
          \n"); + buf.append("
          • ").append(_t("No lifetime events")).append("
          \n"); return; } long now = _context.clock().now(); @@ -214,7 +218,7 @@ public class StatsGenerator { buf.append(")"); } if (curRate.getSummaryListener() != null) { - buf.append(" ").append(_t("Graph Data")).append(" - "); buf.append(" SECTION_NAMES; static { @@ -49,6 +49,7 @@ class SummaryBarRenderer { aMap.put("TunnelStatus", "Tunnel Status"); aMap.put("Destinations", "Local Tunnels"); aMap.put("NewsHeadings", "News & Updates"); + aMap.put("Advanced", "Advanced"); SECTION_NAMES = Collections.unmodifiableMap(aMap); } @@ -88,6 +89,8 @@ class SummaryBarRenderer { buf.append(renderI2PServicesHTML()); else if ("I2PInternals".equals(section)) buf.append(renderI2PInternalsHTML()); + else if ("Advanced".equals(section)) + buf.append(renderAdvancedHTML()); else if ("General".equals(section)) buf.append(renderGeneralHTML()); else if ("ShortGeneral".equals(section)) @@ -139,7 +142,7 @@ class SummaryBarRenderer { .append(_t("I2P Services")) .append("\n" + - "
          " + + "
          " + "
          \n" + - "
          \n" + + "
          \n" + "\n"); } - buf.append("") - .append(nbsp(_t("Stats"))) - .append("\n" + - - "") .append(nbsp(_t("Addressbook"))) @@ -241,12 +238,74 @@ class SummaryBarRenderer { .append(nbsp(_t("Hidden Services Manager"))) .append("\n"); - if (_context.getBooleanProperty(HelperBase.PROP_ADVANCED)) - buf.append("Debug\n"); + buf.append("
          \n"); + return buf.toString(); + } + + public String renderAdvancedHTML() { + StringBuilder buf = new StringBuilder(512); + + buf.append("

          ") + .append(_t("Advanced")) + .append("

          \n") + + .append("
          ") + + .append("") + .append(nbsp(_t("Certs"))) + .append("\n") + + .append("") + .append(nbsp(_t("Changelog"))) + .append("\n") + + .append("") + .append(nbsp(_t("Debug"))) + .append("\n") + + .append("") + .append(nbsp(_t("Jars"))) + .append("\n"); + File javadoc = new File(_context.getBaseDir(), "docs/javadoc/index.html"); if (javadoc.exists()) buf.append("Javadoc\n"); - buf.append("
          \n"); + + buf.append("") + .append(nbsp(_t("Leasesets"))) + .append("\n") + + .append("") + .append(nbsp(_t("Proof"))) + .append("\n") + + .append("") + .append(nbsp(_t("Stats"))) + .append("\n") + + .append("") + .append(nbsp(_t("Sybils"))) + .append("\n") + + .append("
          "); return buf.toString(); } @@ -259,7 +318,7 @@ class SummaryBarRenderer { .append(_t("General")) .append("

          \n" + - "" + + "
          " + "\n" + - "
          " + // fix for some rows with a big left side and some with a big right side + "
          " + // fix for some rows with a big left side and some with a big right side "" + @@ -288,7 +347,7 @@ class SummaryBarRenderer { .append(_helper.getVersion()) .append("\n" + - "
          " + // fix for some rows with a big left side and some with a big right side + "
          " + // fix for some rows with a big left side and some with a big right side "" + @@ -304,7 +363,7 @@ class SummaryBarRenderer { public String renderShortGeneralHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); - buf.append("
          " + + buf.append("
          " + "" + @@ -330,7 +389,7 @@ class SummaryBarRenderer { public String renderNetworkReachabilityHTML() { if (_helper == null) return ""; StringBuilder buf = new StringBuilder(512); - buf.append("

          ") .append(_t("Network")) @@ -387,7 +446,7 @@ class SummaryBarRenderer { .append(_t("Peers")) .append("


          \n" + - "
          \n" + + "
          \n" + "") .append(_t("Bandwidth in/out")) .append("
          " + - "
          \n" + + "
          \n" + "
          ") .append(DataHelper.formatDuration2(3 * 1000)) // lie and say 3 sec since 1 sec would appear as 1000 ms @@ -500,7 +559,7 @@ class SummaryBarRenderer { .append("\">") .append(_t("Tunnels")) .append("
          " + - "\n" + + "
          \n" + "") .append(_t("Congestion")) .append("
          " + - "
          \n" + + "
          \n" + "").append(_t("Local Tunnels")) - .append("
          "); + .append("
          "); if (!clients.isEmpty()) { Collections.sort(clients, new AlphaComparator()); - buf.append("
          "); + buf.append("
          "); for (Destination client : clients) { String name = getName(client); @@ -477,7 +478,6 @@ public class SummaryHelper extends HelperBase { } else { buf.append("
          ").append(_t("none")).append("
          "); } - buf.append("\n"); return buf.toString(); } @@ -696,7 +696,7 @@ public class SummaryHelper extends HelperBase { String status = NewsHelper.getUpdateStatus(); boolean needSpace = false; if (status.length() > 0) { - buf.append("

          ").append(status).append("

          \n"); + buf.append("

          ").append(status).append("

          \n"); needSpace = true; } String dver = NewsHelper.updateVersionDownloaded(); @@ -712,7 +712,7 @@ public class SummaryHelper extends HelperBase { buf.append("
          "); else needSpace = true; - buf.append("

          ").append(_t("Update downloaded")).append("
          "); + buf.append("

          ").append(_t("Update downloaded")).append("
          "); if (_context.hasWrapper()) buf.append(_t("Click Restart to install")); else @@ -733,7 +733,7 @@ public class SummaryHelper extends HelperBase { buf.append("
          "); else needSpace = true; - buf.append("

          ").append(_t("Update available")).append(":
          "); + buf.append("

          ").append(_t("Update available")).append(":
          "); buf.append(_t("Version {0}", getUpdateVersion())).append("
          "); buf.append(constraint).append("

          "); avail = false; @@ -745,7 +745,7 @@ public class SummaryHelper extends HelperBase { buf.append("
          "); else needSpace = true; - buf.append("

          ").append(_t("Update available")).append(":
          "); + buf.append("

          ").append(_t("Update available")).append(":
          "); buf.append(_t("Version {0}", getUnsignedUpdateVersion())).append("
          "); buf.append(unsignedConstraint).append("

          "); unsignedAvail = false; @@ -757,7 +757,7 @@ public class SummaryHelper extends HelperBase { buf.append("
          "); else needSpace = true; - buf.append("

          ").append(_t("Update available")).append(":
          "); + buf.append("

          ").append(_t("Update available")).append(":
          "); buf.append(_t("Version {0}", getDevSU3UpdateVersion())).append("
          "); buf.append(devSU3Constraint).append("

          "); devSU3Avail = false; @@ -820,7 +820,7 @@ public class SummaryHelper extends HelperBase { public String getFirewallAndReseedStatus() { StringBuilder buf = new StringBuilder(256); if (showFirewallWarning()) { - buf.append("

          ") .append(_t("Check network connection and NAT/firewall")) @@ -928,7 +928,7 @@ public class SummaryHelper extends HelperBase { String imgPath = CSSHelper.BASE_THEME_PATH + theme + "/images/"; StringBuilder buf = new StringBuilder(2048); - buf.append("

          ") + buf.append("
          ") .append(_t("Remove")) .append("") .append(_t("Name")) @@ -997,8 +997,7 @@ public class SummaryHelper extends HelperBase { "") - .append(_t("Add")).append(": " + - "\n" + "\n"); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java index 546d094e6..82be1524b 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryRenderer.java @@ -35,7 +35,9 @@ class SummaryRenderer { private final Log _log; private final SummaryListener _listener; private final I2PAppContext _context; - private static final Color RESTART_BAR_COLOR = new Color(255, 144, 0, 224); + private static final Color AREA_COLOR = new Color(100, 160, 200, 240); + private static final Color LINE_COLOR = new Color(0, 30, 110, 255); + private static final Color RESTART_BAR_COLOR = new Color(210, 10, 10, 200); public SummaryRenderer(I2PAppContext ctx, SummaryListener lsnr) { _log = ctx.logManager().getLog(SummaryRenderer.class); @@ -184,9 +186,9 @@ class SummaryRenderer { def.datasource(plotName, path, plotName, SummaryListener.CF, _listener.getBackendName()); if (descr.length() > 0) { - def.area(plotName, Color.BLUE, descr + "\\r"); + def.area(plotName, AREA_COLOR, descr + "\\r"); } else { - def.area(plotName, Color.BLUE); + def.area(plotName, AREA_COLOR); } if (!hideLegend) { def.gprint(plotName, SummaryListener.CF, _t("avg") + ": %.2f %s"); @@ -200,7 +202,7 @@ class SummaryRenderer { String path2 = lsnr2.getData().getPath(); String descr2 = _t(lsnr2.getRate().getRateStat().getDescription()); def.datasource(plotName2, path2, plotName2, SummaryListener.CF, lsnr2.getBackendName()); - def.line(plotName2, Color.RED, descr2 + "\\r", 3); + def.line(plotName2, LINE_COLOR, descr2 + "\\r", 3); if (!hideLegend) { def.gprint(plotName2, SummaryListener.CF, _t("avg") + ": %.2f %s"); def.gprint(plotName2, "MAX", ' ' + _t("max") + ": %.2f %S"); @@ -227,8 +229,8 @@ class SummaryRenderer { // (but with the same coordinates, so the values may look pretty skewed) def.datasource(dsNames[0], path, dsNames[0], "AVERAGE", "MEMORY"); def.datasource(dsNames[1], path, dsNames[1], "AVERAGE", "MEMORY"); - def.area(dsNames[0], Color.BLUE, _listener.getRate().getRateStat().getDescription()); - def.line(dsNames[1], Color.RED, "Events per period"); + def.area(dsNames[0], AREA_COLOR, _listener.getRate().getRateStat().getDescription()); + def.line(dsNames[1], LINE_COLOR, "Events per period"); */ if (hideLegend) def.setNoLegend(true); diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java index 98671a146..652767842 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SybilRenderer.java @@ -154,15 +154,15 @@ class SybilRenderer { ris.add(ri); } if (ris.isEmpty()) { - out.write("

          No known floodfills

          "); + out.write("

          No known floodfills

          "); return; } StringBuilder buf = new StringBuilder(4*1024); - buf.append("

          This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " + + buf.append("

          This is an experimental network database tool for debugging and analysis. Do not panic even if you see warnings below. " + "Possible \"threats\" are summarized at the bottom, however these are unlikely to be real threats. " + "If you see anything you would like to discuss with the devs, contact us on IRC #i2p-dev.

          " + - ""); renderRouterInfo(buf, _context.router().getRouterInfo(), null, true, false); - buf.append("

          Known Floodfills: ").append(ris.size()).append("

          "); + buf.append("

          Known Floodfills: ").append(ris.size()).append("

          "); double tot = 0; int count = 200; @@ -189,12 +189,13 @@ class SybilRenderer { tot += d; } double avgMinDist = tot / count; - buf.append("

          Average closest floodfill distance: " + fmt.format(avgMinDist) + "

          "); - buf.append("

          Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) - .append("\" Last Changed: ").append(new Date(_context.routerKeyGenerator().getLastChanged())); - buf.append("

          Next Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) - .append("\" Rotates in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())); - buf.append("

          "); + buf.append("
          \n"); + buf.append("Average closest floodfill distance: ").append(fmt.format(avgMinDist)).append("
          \n"); + buf.append("Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getModData())) + .append("\" Last Changed: ").append(new Date(_context.routerKeyGenerator().getLastChanged())).append("
          \n"); + buf.append("Next Routing Data: \"").append(DataHelper.getUTF8(_context.routerKeyGenerator().getNextModData())) + .append("\" Rotates in: ").append(DataHelper.formatDuration(_context.routerKeyGenerator().getTimeTillMidnight())).append("\n"); + buf.append("
          \n"); Map points = new HashMap(64); @@ -209,18 +210,18 @@ class SybilRenderer { renderPairDistance(out, buf, ris, points); // Distance to our router analysis - buf.append("

          Closest Floodfills to Our Routing Key (Where we Store our RI)

          "); + buf.append("

          Closest Floodfills to Our Routing Key (Where we Store our RI)

          "); renderRouterInfoHTML(out, buf, ourRKey, avgMinDist, ris, points); RouterKeyGenerator rkgen = _context.routerKeyGenerator(); Hash nkey = rkgen.getNextRoutingKey(us); - buf.append("

          Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)

          "); + buf.append("

          Closest Floodfills to Tomorrow's Routing Key (Where we will Store our RI)

          "); renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points); - buf.append("

          Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)

          "); + buf.append("

          Closest Floodfills to Our Router Hash (DHT Neighbors if we are Floodfill)

          "); renderRouterInfoHTML(out, buf, us, avgMinDist, ris, points); // Distance to our published destinations analysis - buf.append("

          Floodfills Close to Our Destinations

          "); + buf.append("

          Floodfills Close to Our Destinations

          "); Map clientInboundPools = _context.tunnelManager().getInboundClientPools(); List destinations = new ArrayList(clientInboundPools.keySet()); boolean debug = _context.getBooleanProperty(HelperBase.PROP_ADVANCED); @@ -236,10 +237,10 @@ class SybilRenderer { Hash rkey = ls.getRoutingKey(); TunnelPool in = clientInboundPools.get(client); String name = (in != null) ? in.getSettings().getDestinationNickname() : client.toBase64().substring(0,4); - buf.append("

          Closest floodfills to the Routing Key for " + DataHelper.escapeHTML(name) + " (where we store our LS)

          "); + buf.append("

          Closest floodfills to the Routing Key for " + DataHelper.escapeHTML(name) + " (where we store our LS)

          "); renderRouterInfoHTML(out, buf, rkey, avgMinDist, ris, points); nkey = rkgen.getNextRoutingKey(ls.getHash()); - buf.append("

          Closest floodfills to Tomorrow's Routing Key for " + DataHelper.escapeHTML(name) + " (where we will store our LS)

          "); + buf.append("

          Closest floodfills to Tomorrow's Routing Key for " + DataHelper.escapeHTML(name) + " (where we will store our LS)

          "); renderRouterInfoHTML(out, buf, nkey, avgMinDist, ris, points); } @@ -250,7 +251,7 @@ class SybilRenderer { if (!points.isEmpty()) { List warns = new ArrayList(points.keySet()); Collections.sort(warns, new PointsComparator(points)); - buf.append("

          Routers with Most Threat Points

          "); + buf.append("

          Routers with Most Threat Points

          "); for (Hash h : warns) { RouterInfo ri = _context.netDb().lookupRouterInfoLocally(h); if (ri == null) @@ -259,7 +260,7 @@ class SybilRenderer { double p = pp.points; if (p < MIN_DISPLAY_POINTS) break; // sorted - buf.append("

          Threat Points: " + fmt.format(p) + "

            "); + buf.append("

            Threat Points: " + fmt.format(p) + "

              "); for (String s : pp.reasons) { buf.append("
            • ").append(s).append("
            • "); } @@ -307,9 +308,9 @@ class SybilRenderer { } double avg = total / (sz * sz / 2); - buf.append("

              Average Floodfill Distance is ").append(fmt.format(avg)).append("

              "); + buf.append("

              Average Floodfill Distance is ").append(fmt.format(avg)).append("

              "); - buf.append("

              Closest Floodfill Pairs by Hash

              "); + buf.append("

              Closest Floodfill Pairs by Hash

              "); for (Pair p : pairs) { double distance = biLog2(p.dist); double point = MIN_CLOSE - distance; @@ -317,7 +318,7 @@ class SybilRenderer { break; // sorted; if (point >= 2) { // limit display - buf.append("

              Hash Distance: ").append(fmt.format(distance)).append(": "); + buf.append("

              Hash Distance: ").append(fmt.format(distance)).append(": "); buf.append("

              "); renderRouterInfo(buf, p.r1, null, false, false); renderRouterInfo(buf, p.r2, null, false, false); @@ -386,14 +387,14 @@ class SybilRenderer { byte[] ourIP = getIP(us); if (ourIP == null) return; - buf.append("

              Floodfills close to Our IP

              "); + buf.append("

              Floodfills close to Our IP

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

              "); + buf.append("

              "); if (ip[2] == ourIP[2]) { if (ip[3] == ourIP[3]) { buf.append("Same IP as us"); @@ -412,14 +413,14 @@ class SybilRenderer { } } if (!found) - buf.append("

              None

              "); + buf.append("

              None

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

              Floodfills with the Same IP

              "); + buf.append("

              Floodfills with the Same IP

              "); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -443,7 +444,7 @@ class SybilRenderer { int i1 = (i >> 16) & 0xff; int i2 = (i >> 8) & 0xff; int i3 = i & 0xff; - buf.append("

              ").append(count).append(" floodfills with IP ").append(i0).append('.') + buf.append("

              ").append(count).append(" floodfills with IP ").append(i0).append('.') .append(i1).append('.').append(i2).append('.').append(i3) .append(":

              "); for (RouterInfo info : ris) { @@ -465,14 +466,14 @@ class SybilRenderer { } } if (!found) - buf.append("

              None

              "); + buf.append("

              None

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

              Floodfills in the Same /24 (2 minimum)

              "); + buf.append("

              Floodfills in the Same /24 (2 minimum)

              "); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -495,7 +496,7 @@ class SybilRenderer { int i0 = i >> 16; int i1 = (i >> 8) & 0xff; int i2 = i & 0xff; - buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') + buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') .append(i1).append('.').append(i2).append(".0/24:

              "); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -514,14 +515,14 @@ class SybilRenderer { } } if (!found) - buf.append("

              None

              "); + buf.append("

              None

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

              Floodfills in the Same /16 (4 minimum)

              "); + buf.append("

              Floodfills in the Same /16 (4 minimum)

              "); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -543,7 +544,7 @@ class SybilRenderer { int i = ii.intValue(); int i0 = i >> 8; int i1 = i & 0xff; - buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') + buf.append("

              ").append(count).append(" floodfills in ").append(i0).append('.') .append(i1).append(".0.0/16

              "); for (RouterInfo info : ris) { byte[] ip = getIP(info); @@ -561,14 +562,14 @@ class SybilRenderer { } } if (!found) - buf.append("

              None

              "); + buf.append("

              None

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

              Floodfills in the Same Declared Family

              "); + buf.append("

              Floodfills in the Same Declared Family

              "); ObjectCounter oc = new ObjectCounter(); for (RouterInfo info : ris) { String fam = info.getOption("family"); @@ -581,7 +582,7 @@ class SybilRenderer { boolean found = false; for (String s : foo) { int count = oc.count(s); - buf.append("

              ").append(count).append(" floodfills in declared family \"").append(DataHelper.escapeHTML(s) + '"') + buf.append("

              ").append(count).append(" floodfills in declared family \"").append(DataHelper.escapeHTML(s) + '"') .append("

              "); for (RouterInfo info : ris) { String fam = info.getOption("family"); @@ -600,7 +601,7 @@ class SybilRenderer { } } if (!found) - buf.append("

              None

              "); + buf.append("

              None

              "); out.write(buf.toString()); out.flush(); buf.setLength(0); @@ -725,7 +726,7 @@ class SybilRenderer { break; } double avg = tot / count; - buf.append("

              Totals for " + count + " floodfills: MIN=" + fmt.format(min) + " AVG=" + fmt.format(avg) + " MEDIAN=" + fmt.format(median) + " MAX=" + fmt.format(max) + "

              \n"); + buf.append("

              Totals for " + count + " floodfills: MIN=" + fmt.format(min) + " AVG=" + fmt.format(avg) + " MEDIAN=" + fmt.format(median) + " MAX=" + fmt.format(max) + "

              \n"); out.write(buf.toString()); out.flush(); buf.setLength(0); @@ -760,35 +761,35 @@ class SybilRenderer { */ private double renderRouterInfo(StringBuilder buf, RouterInfo info, Hash us, boolean isUs, boolean full) { String hash = info.getIdentity().getHash().toBase64(); - buf.append("
              "); + buf.append(""); double distance = 0; if (isUs) { - buf.append("" + _t("Our info") + ": ").append(hash).append("\n"); } else { - buf.append("" + _t("Router") + ": ").append(hash).append("\n"); + buf.append("\n"); if (us != null) { BigInteger dist = HashDistance.getDistance(us, info.getHash()); distance = biLog2(dist); - buf.append("Hash Distance: ").append(fmt.format(distance)).append("
              "); + buf.append("\n"); } } - buf.append("Routing Key: ").append(info.getRoutingKey().toBase64()).append("
              \n"); - buf.append("Version: ").append(DataHelper.stripHTML(info.getVersion())).append("
              \n"); - buf.append("Caps: ").append(DataHelper.stripHTML(info.getCapabilities())).append("
              \n"); + buf.append("\n"); + buf.append("\n"); + buf.append("\n"); String fam = info.getOption("family"); if (fam != null) - buf.append("Family: ").append(DataHelper.escapeHTML(fam)).append("
              \n"); + buf.append("\n"); String kls = info.getOption("netdb.knownLeaseSets"); if (kls != null) - buf.append("Lease Sets: ").append(DataHelper.stripHTML(kls)).append("
              \n"); + buf.append("\n"); String kr = info.getOption("netdb.knownRouters"); if (kr != null) - buf.append("Routers: ").append(DataHelper.stripHTML(kr)).append("
              \n"); + buf.append("\n"); long now = _context.clock().now(); if (!isUs) { @@ -797,46 +798,46 @@ class SybilRenderer { long heard = prof.getFirstHeardAbout(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("First heard about: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } heard = prof.getLastHeardAbout(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last heard about: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } heard = prof.getLastHeardFrom(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last heard from: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } DBHistory dbh = prof.getDBHistory(); if (dbh != null) { heard = dbh.getLastLookupSuccessful(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last lookup successful: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } heard = dbh.getLastLookupFailed(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last lookup failed: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } heard = dbh.getLastStoreSuccessful(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last store successful: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } heard = dbh.getLastStoreFailed(); if (heard > 0) { long age = Math.max(now - heard, 1); - buf.append("Last store failed: ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } } // any other profile stuff? @@ -844,15 +845,15 @@ class SybilRenderer { } long age = Math.max(now - info.getPublished(), 1); if (isUs && _context.router().isHidden()) { - buf.append("").append(_t("Hidden")).append(", ").append(_t("Updated")).append(": ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } else { - buf.append("").append(_t("Published")).append(": ") - .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              \n"); + buf.append("\n"); } - buf.append("").append(_t("Signing Key")).append(": ") - .append(info.getIdentity().getSigningPublicKey().getType().toString()); - buf.append("
              \n" + _t("Addresses") + ": "); + buf.append("\n"); + buf.append("
              \n"); + buf.append("" + _t("Our info") + ": ").append(hash).append("
              " + _t("Router") + ": ").append(hash).append("\n"); if (!full) { - buf.append("[").append(_t("Full entry")).append("]"); + buf.append("[").append(_t("Full entry")).append("]"); } - buf.append(" "); - buf.append("
              \n"); + buf.append(" "); + buf.append("
              Hash Distance:").append(fmt.format(distance)).append("
              Routing Key:").append(info.getRoutingKey().toBase64()).append("
              Version:").append(DataHelper.stripHTML(info.getVersion())).append("
              Caps:").append(DataHelper.stripHTML(info.getCapabilities())).append("
              Family:").append(DataHelper.escapeHTML(fam)).append("
              Lease Sets:").append(DataHelper.stripHTML(kls)).append("
              Routers:").append(DataHelper.stripHTML(kr)).append("
              First heard about:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last heard about:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last heard from:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last lookup successful:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last lookup failed: ") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last store successful:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              Last store failed:") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              ").append(_t("Hidden")).append(", ").append(_t("Updated")).append(":") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              ").append(_t("Published")).append(":") + .append(_t("{0} ago", DataHelper.formatDuration2(age))).append("
              ").append(_t("Signing Key")).append(":") + .append(info.getIdentity().getSigningPublicKey().getType().toString()).append("
              " + _t("Addresses") + ":"); String country = _context.commSystem().getCountry(info.getIdentity().getHash()); if(country != null) { buf.append("\"").append(country.toUpperCase(Locale.US)).append('\"');

              " + _t("Exploratory tunnels") + " (" + _t("configure") + ")

              \n"); + out.write("

              " + _t("Exploratory tunnels") + " [" + _t("configure") + "]

              \n"); renderPool(out, _context.tunnelManager().getInboundExploratoryPool(), _context.tunnelManager().getOutboundExploratoryPool()); List destinations = null; @@ -54,20 +54,20 @@ class TunnelRenderer { name = outPool.getSettings().getDestinationNickname(); if (name == null) name = client.toBase64().substring(0,4); - out.write("

              " + _t("Client tunnels for") + ' ' + DataHelper.escapeHTML(_t(name))); if (isLocal) - out.write(" (" + _t("configure") + ")

              \n"); + out.write(" [" + _t("configure") + "]\n"); else - out.write(" (" + _t("dead") + ")\n"); + out.write(" (" + _t("dead") + ")\n"); renderPool(out, in, outPool); } List participating = _context.tunnelDispatcher().listParticipatingTunnels(); - out.write("

              " + _t("Participating tunnels") + "

              \n"); + out.write("

              " + _t("Participating tunnels") + "

              \n"); if (!participating.isEmpty()) { Collections.sort(participating, new TunnelComparator()); - out.write("
              " + _t("Receive on") + "" + _t("From") + "" + out.write("" + "\n"); } @@ -136,7 +136,6 @@ class TunnelRenderer { out.write("
              " + _t("none") + "
              \n"); out.write("
              " + _t("Lifetime bandwidth usage") + ": " + DataHelper.formatSize2(processed*1024) + "B
              \n"); //renderPeers(out); - out.write(""); } private static class TunnelComparator implements Comparator, Serializable { @@ -164,7 +163,7 @@ class TunnelRenderer { if (info.getLength() > maxLength) maxLength = info.getLength(); } - out.write("
              " + _t("Receive on") + "" + _t("From") + "" + _t("Send on") + "" + _t("To") + "" + _t("Expiration") + "" + _t("Usage") + "" + _t("Rate") + "" + _t("Role") + "
              "); + out.write("
              " + _t("In/Out") + "" + _t("Expiry") + "" + _t("Usage") + "" + _t("Gateway") + "
              "); if (maxLength > 3) { out.write(""); diff --git a/apps/routerconsole/jsp/certs.jsp b/apps/routerconsole/jsp/certs.jsp index 3c4e59cf6..1eba5d700 100644 --- a/apps/routerconsole/jsp/certs.jsp +++ b/apps/routerconsole/jsp/certs.jsp @@ -9,7 +9,7 @@ <%@include file="summaryajax.jsi" %> <%@include file="summary.jsi" %>

              <%=intl._t("Certificates")%>

              -
              +
              " /> <% certhelper.storeWriter(out); %> diff --git a/apps/routerconsole/jsp/config.jsp b/apps/routerconsole/jsp/config.jsp index 5e9c0de92..c7cbac7e4 100644 --- a/apps/routerconsole/jsp/config.jsp +++ b/apps/routerconsole/jsp/config.jsp @@ -15,21 +15,22 @@ " />

              <%=intl._t("I2P Bandwidth Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -
              -

              <%=intl._t("Bandwidth limiter")%>

              - + +

              <%=intl._t("Bandwidth Limiter")%> [<%=intl._t("Advanced Network Configuration")%>]

              +
              " + _t("In/Out") + "" + _t("Expiry") + "" + _t("Usage") + "" + _t("Gateway") + "" + _t("Participants") + "
              + + + +
              <%=intl._t("I2P will work best if you configure your rates to match the speed of your internet connection.")%> -

              -
              + <% /******** @@ -55,8 +56,9 @@
              " > +
              " > <%=intl._t("KBps In")%> ()
              <%=intl._t("Share")%> () -
              -

              <% int share = nethelper.getShareBandwidth(); +

              +<% int share = nethelper.getShareBandwidth(); if (share < 12) { out.print(""); out.print(intl._t("NOTE")); @@ -73,11 +75,11 @@ out.print(intl._t("The higher the share bandwidth the more you improve your anonymity and help the network.")); } - %>

              -

              <%=intl._t("Advanced network configuration page")%>


              -
              + %>
              " > " > - +
              - + diff --git a/apps/routerconsole/jsp/configadvanced.jsp b/apps/routerconsole/jsp/configadvanced.jsp index 3ba2deed1..2af2d4d84 100644 --- a/apps/routerconsole/jsp/configadvanced.jsp +++ b/apps/routerconsole/jsp/configadvanced.jsp @@ -16,7 +16,7 @@ " />

              <%=intl._t("I2P Advanced Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> @@ -24,9 +24,14 @@ <%@include file="formhandler.jsi" %>
              -

              <%=intl._t("Floodfill Configuration")%>

              -

              <%=intl._t("Floodill participation helps the network, but may use more of your computer's resources.")%> -

              + +

              <%=intl._t("Floodfill Configuration")%>

              +
              + + + + + +
              +<%=intl._t("Floodill participation helps the network, but may use more of your computer's resources.")%> +
              <% if (advancedhelper.isFloodfill()) { %><%=intl._t("This router is currently a floodfill participant.")%><% @@ -34,33 +39,50 @@ %><%=intl._t("This router is not currently a floodfill participant.")%><% } %> -

              - +
              > -<%=intl._t("Automatic")%>
              +<%=intl._t("Automatic")%>  > -<%=intl._t("Force On")%>
              +<%=intl._t("Force On")%>  > -<%=intl._t("Disable")%>
              -
              +<%=intl._t("Disable")%> +
              " > - -

              <%=intl._t("Advanced I2P Configuration")%>

              +
              + + +

              <%=intl._t("Advanced I2P Configuration")%> [Additional Options]

              <% if (advancedhelper.isAdvanced()) { %>
              <% } // isAdvanced %> -

              + <% if (advancedhelper.isAdvanced()) { %> -
              +
              +<% } else { %> + +<% } // isAdvanced %> + +<% if (advancedhelper.isAdvanced()) { %> + +<% } // isAdvanced %> +
              +<%=intl._t("NOTE")%>: <%=intl._t("Some changes may require a restart to take effect.")%> +
              +<%=intl._t("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> +
              + +
              " > " > -
              <%=intl._t("NOTE")%>: <%=intl._t("Some changes may require a restart to take effect.")%> - -<% } else { %> -<%=intl._t("To make changes, edit the file {0}.", "" + advancedhelper.getConfigFileName() + "")%> +
              +<% if (advancedhelper.isAdvanced()) { %> + <% } // isAdvanced %>
              diff --git a/apps/routerconsole/jsp/configclients.jsp b/apps/routerconsole/jsp/configclients.jsp index 59f236071..8bf1650ac 100644 --- a/apps/routerconsole/jsp/configclients.jsp +++ b/apps/routerconsole/jsp/configclients.jsp @@ -21,23 +21,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; } " /> " />

              <%=intl._t("I2P Client Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %>
              -

              <%=intl._t("Client Configuration")%>

              - <%=intl._t("The Java clients listed below are started by the router and run in the same JVM.")%>
              - <%=intl._t("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%> +

              <%=intl._t("Client Configuration")%>

              +

              + <%=intl._t("The Java clients listed below are started by the router and run in the same JVM.")%>  + <%=intl._t("To change other client options, edit the file")%> + <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>. + <%=intl._t("All changes require restart to take effect.")%> +

              +

              + <%=intl._t("Be careful changing any settings here. The 'router console' and 'application tunnels' are required for most uses of I2P. Only advanced users should change these.")%>

              -

              <%=intl._t("To change other client options, edit the file")%> - <%=net.i2p.router.startup.ClientAppConfig.configFile(net.i2p.I2PAppContext.getGlobalContext()).getAbsolutePath()%>. - <%=intl._t("All changes require restart to take effect.")%> -


              +
              " /> <% if (clientshelper.isClientChangeEnabled() && request.getParameter("edit") == null) { %> " /> diff --git a/apps/routerconsole/jsp/configfamily.jsp b/apps/routerconsole/jsp/configfamily.jsp index 119239098..501c0d076 100644 --- a/apps/routerconsole/jsp/configfamily.jsp +++ b/apps/routerconsole/jsp/configfamily.jsp @@ -14,13 +14,13 @@ " />

              <%=intl._t("I2P Router Family Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

              <%=intl._t("Routers in the same family share a family key.")%> +

              <%=intl._t("Routers in the same family share a family key.")%> <%=intl._t("To join an existing family, import the private key you exported from a router in the family.")%> <%=intl._t("To start a new family, enter a family name.")%>

              @@ -30,27 +30,35 @@ if (family.length() <= 0) { // no family yet %> -
              + -

              <%=intl._t("Join Existing Router Family")%>

              -

              <%=intl._t("Import the secret family key that you exported from an existing router in the family.")%> -

              <%=intl._t("Select secret key file")%> : +

              + + + + + +
              <%=intl._t("Join Existing Router Family")%>
              <%=intl._t("Import the secret family key that you exported from an existing router in the family.")%>
              <%=intl._t("Select secret key file")%>: -

              -
              +
              " /> - +
              -
              + + -

              <%=intl._t("Create New Router Family")%>

              -

              <%=intl._t("Family Name")%> : +

              + + + + + +
              <%=intl._t("Create New Router Family")%>
              <%=intl._t("Family Name")%>: -

              -
              +
              " /> - +
              <% } else { // family is configured @@ -58,30 +66,36 @@ if (keypw.length() > 0) { // family is active %> -
              + -

              <%=intl._t("Export Family Key")%>

              -

              <%=intl._t("Export the secret family key to be imported into other routers you control.")%> -

              -
              +
              + + + + +
              <%=intl._t("Export Family Key")%>
              <%=intl._t("Export the secret family key to be imported into other routers you control.")%>
              " /> - +
              <% } else { // family is not active %> -

              <%=intl._t("Restart required to activate family {0}.", '"' + family + '"')%> +

              <%=intl._t("Restart required to activate family {0}.", '"' + family + '"')%> <%=intl._t("After restarting, you may export the family key.")%>

              <% } %> -
              + + -

              <%=intl._t("Leave Router Family")%>

              -

              <%=intl._t("No longer be a member of the family {0}.", '"' + family + '"')%> -

              +
              + + + + +
              <%=intl._t("Leave Router Family")%>
              <%=intl._t("No longer be a member of the family {0}.", '"' + family + '"')%> " /> - +
              <% } %> diff --git a/apps/routerconsole/jsp/confighome.jsp b/apps/routerconsole/jsp/confighome.jsp index 56be7b8bd..c2d0a145d 100644 --- a/apps/routerconsole/jsp/confighome.jsp +++ b/apps/routerconsole/jsp/confighome.jsp @@ -18,7 +18,7 @@ input.default { <%@include file="summary.jsi" %>

              <%=intl._t("I2P Home Page Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> @@ -26,24 +26,32 @@ input.default { " /> -

              <%=intl._t("Default Home Page")%>

              +

              <%=intl._t("Default Home Page")%>

              + + + + + +
              > <%=intl._t("Use old home page")%> + " > +
              <% if (homehelper.shouldShowSearch()) { %> -

              <%=intl._t("Search Engines")%>

              +

              <%=intl._t("Search Engines")%>

              -
              +
              " > " > " > @@ -55,12 +63,12 @@ input.default { } // shouldShowSearch() %> -

              <%=intl._t("Hidden Services of Interest")%>

              +

              <%=intl._t("Hidden Services of Interest")%>

              -
              +
              " > " > " > @@ -69,12 +77,12 @@ input.default {
              -

              <%=intl._t("Applications and Configuration")%>

              +

              <%=intl._t("Applications and Configuration")%>

              -
              +
              " > " > " > diff --git a/apps/routerconsole/jsp/configi2cp.jsp b/apps/routerconsole/jsp/configi2cp.jsp index e7a89a245..d55822518 100644 --- a/apps/routerconsole/jsp/configi2cp.jsp +++ b/apps/routerconsole/jsp/configi2cp.jsp @@ -27,17 +27,26 @@ input.default { width: 1px; height: 1px; visibility: hidden; } <%@include file="formhandler.jsi" %>
              -

              <%=intl._t("Advanced Client Interface Configuration")%>

              +

              <%=intl._t("Advanced Client Interface Configuration")%>

              -

              -<%=intl._t("External I2CP (I2P Client Protocol) Interface Configuration")%>
              + + + + + + + +
              +<%=intl._t("The default settings will work for most people.")%> +<%=intl._t("Any changes made here must also be configured in the external client.")%> +<%=intl._t("Many clients do not support SSL or authorization.")%> +<%=intl._t("All changes require restart to take effect.")%> + +
              <%=intl._t("External I2CP (I2P Client Protocol) Interface Configuration")%>
              > <%=intl._t("Enabled without SSL")%>
              > <%=intl._t("Enabled with SSL required")%>
              > <%=intl._t("Disabled - Clients outside this Java process may not connect")%>
              + +
              <%=intl._t("I2CP Interface")%>:
              +  <%=intl._t("I2CP Port")%>: -" >
              -<%=intl._t("Authorization")%>
              +" > +
              <%=intl._t("Authorization")%>
              > <%=intl._t("Require username and password")%>
              +
              <%=intl._t("Username")%>: -
              +  <%=intl._t("Password")%>: -
              -

              <%=intl._t("The default settings will work for most people.")%> -<%=intl._t("Any changes made here must also be configured in the external client.")%> -<%=intl._t("Many clients do not support SSL or authorization.")%> -<%=intl._t("All changes require restart to take effect.")%> -


              + +
              " /> " /> " /> - +
              +

              diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp index 3653a9479..c424f09a7 100644 --- a/apps/routerconsole/jsp/configkeyring.jsp +++ b/apps/routerconsole/jsp/configkeyring.jsp @@ -11,28 +11,27 @@ <%@include file="summary.jsi" %>

              <%=intl._t("I2P Keyring Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> " /> -

              <%=intl._t("Keyring")%>

              +

              <%=intl._t("The router keyring is used to decrypt encrypted leaseSets.")%> <%=intl._t("The keyring may contain keys for local or remote encrypted destinations.")%>

              -
              -
              -
              -

              <%=intl._t("Manual Keyring Addition")%>

              +

              <%=intl._t("Manual Keyring Addition")%>

              + + +
              <%=intl._t("Enter keys for encrypted remote destinations here.")%> <%=intl._t("Keys for local destinations must be entered on the")%> <%=intl._t("I2PTunnel page")%>. -

              -
              - + + @@ -43,4 +42,4 @@ " > " > " > -
              <%=intl._t("Dest. name, hash, or full key")%>:
              +
              diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index 84f10ac80..5a0902944 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -14,40 +14,45 @@ <%@include file="summary.jsi" %>

              <%=intl._t("I2P Logging Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -
              -

              <%=intl._t("Configure I2P Logging Options")%>

              -
              - +

              <%=intl._t("Configure I2P Logging Options")%> " href="/logs">[<%=intl._t("View Logs")%>]

              +
              + + + + + + + + + - + + + - + + + - + - - - + +
              <%=intl._t("Log file")%>: " value="" > -
              <%=intl._t("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._t("(the symbol '@' will be replaced during log rotation)")%>
              <%=intl._t("Log record format")%>: " > -
              <%=intl._t("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%> -
              <%=intl._t("(use 'd' = date, 'c' = class, 't' = thread, 'p' = priority, 'm' = message)")%>
              <%=intl._t("Log date format")%>: " > -
              <%=intl._t("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%> -
              <%=intl._t("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%>
              <%=intl._t("Max log file size")%>:" >
              " >
              <%=intl._t("Default log level")%>:
              <%=intl._t("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%> -
              <%=intl._t("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%>
              <%=intl._t("Log level overrides")%>:
              <%=intl._t("New override")%>:

              +
              " > " > -
              +
              diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index 7b81518e3..5079d8b1d 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -14,23 +14,36 @@ " />

              <%=intl._t("I2P Network Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -
              -

              <%=intl._t("IP and Transport Configuration")%>

              - - <%=intl._t("The default settings will work for most people.")%> - <%=intl._t("There is help below.")%> -

              <%=intl._t("UPnP Configuration")%>:
              +

              <%=intl._t("IP and Transport Configuration")%> " href="/help#configurationhelp">[<%=intl._t("Configuration Help")%>]

              + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + <% /******** *********/ %> -

              - <%=intl._t("TCP Configuration")%>:
              +

              + + + + + + + + + + + + + + +
              + <%=intl._t("The default settings will work for most people.")%> + <%=intl._t("Changing these settings will restart your router.")%> +
              <%=intl._t("UPnP Configuration")%> [<%=intl._t("UPnP Status")%>]
              > - <%=intl._t("Enable UPnP to open firewall ports")%> - <%=intl._t("UPnP status")%> -

              <%=intl._t("IP Configuration")%>:
              + <%=intl._t("Enable UPnP to open firewall ports")%> +

              <%=intl._t("IP Configuration")%>
              <%=intl._t("Externally reachable hostname or IP address")%>:
              > <%=intl._t("Use all auto-detect methods")%>
              @@ -43,19 +56,34 @@ > <%=intl._t("Hidden mode - do not publish IP")%> <%=intl._t("(prevents participating traffic)")%>
              > - <%=intl._t("Specify hostname or IP")%>:
              + <%=intl._t("Specify hostname or IP")%>: <%=nethelper.getAddressSelector() %> -

              - <%=intl._t("Action when IP changes")%>:
              +

              <%=intl._t("Action when IP changes")%>
              > <%=intl._t("Laptop mode - Change router identity and UDP port when IP changes for enhanced anonymity")%> (<%=intl._t("Experimental")%>) -

              - <%=intl._t("IPv4 Configuration")%>:
              +

              <%=intl._t("IPv4 Configuration")%>
              > <%=intl._t("Disable inbound (Firewalled by Carrier-grade NAT or DS-Lite)")%> -

              - <%=intl._t("IPv6 Configuration")%>:
              +

              <%=intl._t("IPv6 Configuration")%>
              > <%=intl._t("Disable IPv6")%>
              > @@ -66,12 +94,25 @@ <%=intl._t("Prefer IPv6 over IPv4")%>
              > <%=intl._t("Use IPv6 only (disable IPv4)")%> - (<%=intl._t("Experimental")%>)
              -

              <%=intl._t("UDP Configuration:")%>
              + (<%=intl._t("Experimental")%>) +

              <%=intl._t("UDP Configuration")%>
              + <%=intl._t("Do not reveal your port numbers to anyone as they can be used to discover your ip address.")%> +
              <%=intl._t("UDP port:")%> " >
              > - <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that blocks outbound UDP)")%>
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that blocks outbound UDP)")%> +
              <%=intl._t("TCP Configuration")%>
              <%=intl._t("Externally reachable hostname or IP address")%>:
              > <%=intl._t("Use auto-detected IP address")%> @@ -96,110 +140,36 @@ > <%=intl._t("Disable inbound (Firewalled)")%>
              > - <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that throttles or blocks outbound TCP)")%>
              -

              - <%=intl._t("Externally reachable TCP port")%>:
              + <%=intl._t("Completely disable")%> <%=intl._t("(select only if behind a firewall that throttles or blocks outbound TCP)")%> +

              <%=intl._t("Externally reachable TCP port")%>
              > <%=intl._t("Use the same port configured for UDP")%> (<%=intl._t("currently")%> )
              > <%=intl._t("Specify Port")%>: - " >
              -

              <%=intl._t("Notes")%>: <%=intl._t("a) Do not reveal your port numbers to anyone! b) Changing these settings will restart your router.")%>

              -
              + " > +
              " > " > -

              <%=intl._t("Configuration Help")%>:

              - <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> -

              - <%=intl._t("If you can, please poke a hole in your firewall to allow unsolicited UDP and TCP packets to reach you.")%> - <%=intl._t("If you can't, I2P supports UPnP (Universal Plug and Play) and UDP hole punching with \"SSU introductions\" to relay traffic.")%> - <%=intl._t("Most of the options above are for special situations, for example where UPnP does not work correctly, or a firewall not under your control is doing harm.")%> - <%=intl._t("Certain firewalls such as symmetric NATs may not work well with I2P.")%> -

              +
              + <% /******** *********/ %> -

              - <%=intl._t("UPnP is used to communicate with Internet Gateway Devices (IGDs) to detect the external IP address and forward ports.")%> - <%=intl._t("UPnP support is beta, and may not work for any number of reasons")%>: -

              -
                -
              • <%=intl._t("No UPnP-compatible device present")%> -
              • <%=intl._t("UPnP disabled on the device")%> -
              • <%=intl._t("Software firewall interference with UPnP")%> -
              • <%=intl._t("Bugs in the device's UPnP implementation")%> -
              • <%=intl._t("Multiple firewall/routers in the internet connection path")%> -
              • <%=intl._t("UPnP device change, reset, or address change")%> -
              -

              <%=intl._t("Review the UPnP status here.")%> -<%=intl._t("UPnP may be enabled or disabled above, but a change requires a router restart to take effect.")%>

              -

              <%=intl._t("Hostnames entered above will be published in the network database.")%> - <%=intl._t("They are not private.")%> - <%=intl._t("Also, do not enter a private IP address like 127.0.0.1 or 192.168.1.1.")%> - <%=intl._t("If you specify the wrong IP address or hostname, or do not properly configure your NAT or firewall, your network performance will degrade substantially.")%> - <%=intl._t("When in doubt, leave the settings at the defaults.")%> -

              -

              <%=intl._t("Reachability Help")%>:

              - <%=intl._t("While I2P will work fine behind most firewalls, your speeds and network integration will generally improve if the I2P port is forwarded for both UDP and TCP.")%> - <%=intl._t("If you think you have opened up your firewall and I2P still thinks you are firewalled, remember that you may have multiple firewalls, for example both software packages and external hardware routers.")%> - <%=intl._t("If there is an error, the logs may also help diagnose the problem.")%> -

              -
                -
              • <%=intl._t("OK")%> - - <%=intl._t("Your UDP port does not appear to be firewalled.")%> -
              • <%=intl._t("Firewalled")%> - - <%=intl._t("Your UDP port appears to be firewalled.")%> - <%=intl._t("As the firewall detection methods are not 100% reliable, this may occasionally be displayed in error.")%> - <%=intl._t("However, if it appears consistently, you should check whether both your external and internal firewalls are open for your port.")%> - <%=intl._t("I2P will work fine when firewalled, there is no reason for concern. When firewalled, the router uses \"introducers\" to relay inbound connections.")%> - <%=intl._t("However, you will get more participating traffic and help the network more if you can open your firewall(s).")%> - <%=intl._t("If you think you have already done so, remember that you may have both a hardware and a software firewall, or be behind an additional, institutional firewall you cannot control.")%> - <%=intl._t("Also, some routers cannot correctly forward both TCP and UDP on a single port, or may have other limitations or bugs that prevent them from passing traffic through to I2P.")%> -
              • <%=intl._t("Testing")%> - - <%=intl._t("The router is currently testing whether your UDP port is firewalled.")%> -
              • <%=intl._t("Hidden")%> - - <%=intl._t("The router is not configured to publish its address, therefore it does not expect incoming connections.")%> - <%=intl._t("Hidden mode is automatically enabled for added protection in certain countries.")%> -
              • <%=intl._t("WARN - Firewalled and Fast")%> - - <%=intl._t("You have configured I2P to share more than 128KBps of bandwidth, but you are firewalled.")%> - <%=intl._t("While I2P will work fine in this configuration, if you really have over 128KBps of bandwidth to share, it will be much more helpful to the network if you open your firewall.")%> -
              • <%=intl._t("WARN - Firewalled and Floodfill")%> - - <%=intl._t("You have configured I2P to be a floodfill router, but you are firewalled.")%> - <%=intl._t("For best participation as a floodfill router, you should open your firewall.")%> -
              • <%=intl._t("WARN - Firewalled with Inbound TCP Enabled")%> - - <%=intl._t("You have configured inbound TCP, however your UDP port is firewalled, and therefore it is likely that your TCP port is firewalled as well.")%> - <%=intl._t("If your TCP port is firewalled with inbound TCP enabled, routers will not be able to contact you via TCP, which will hurt the network.")%> - <%=intl._t("Please open your firewall or disable inbound TCP above.")%> -
              • <%=intl._t("WARN - Firewalled with UDP Disabled")%> - - <%=intl._t("You have configured inbound TCP, however you have disabled UDP.")%> - <%=intl._t("You appear to be firewalled on TCP, therefore your router cannot accept inbound connections.")%> - <%=intl._t("Please open your firewall or enable UDP.")%> -
              • <%=intl._t("ERR - Clock Skew")%> - - <%=intl._t("Your system's clock is skewed, which will make it difficult to participate in the network.")%> - <%=intl._t("Correct your clock setting if this error persists.")%> -
              • <%=intl._t("ERR - Private TCP Address")%> - - <%=intl._t("You must never advertise an unroutable IP address such as 127.0.0.1 or 192.168.1.1 as your external address.")%> - <%=intl._t("Correct the address or disable inbound TCP above.")%> -
              • <%=intl._t("ERR - SymmetricNAT")%> - - <%=intl._t("I2P detected that you are firewalled by a Symmetric NAT.")%> - <%=intl._t("I2P does not work well behind this type of firewall. You will probably not be able to accept inbound connections, which will limit your participation in the network.")%> -
              • <%=intl._t("ERR - UDP Port In Use - Set i2np.udp.internalPort=xxxx in advanced config and restart")%> - - <%=intl._t("I2P was unable to bind to the configured port noted on the advanced network configuration page .")%> - <%=intl._t("Check to see if another program is using the configured port. If so, stop that program or configure I2P to use a different port.")%> - <%=intl._t("This may be a transient error, if the other program is no longer using the port.")%> - <%=intl._t("However, a restart is always required after this error.")%> -
              • <%=intl._t("ERR - UDP Disabled and Inbound TCP host/port not set")%> - - <%=intl._t("You have not configured inbound TCP with a hostname and port above, however you have disabled UDP.")%> - <%=intl._t("Therefore your router cannot accept inbound connections.")%> - <%=intl._t("Please configure a TCP host and port above or enable UDP.")%> -
              • <%=intl._t("ERR - Client Manager I2CP Error - check logs")%> - - <%=intl._t("This is usually due to a port 7654 conflict. Check the logs to verify.")%> - <%=intl._t("Do you have another I2P instance running? Stop the conflicting program and restart I2P.")%> -

              <% /******** *********/ %> -
              + diff --git a/apps/routerconsole/jsp/configpeer.jsp b/apps/routerconsole/jsp/configpeer.jsp index 5a9cfcae7..0f9fa3fdc 100644 --- a/apps/routerconsole/jsp/configpeer.jsp +++ b/apps/routerconsole/jsp/configpeer.jsp @@ -11,7 +11,7 @@ <%@include file="summary.jsi" %>

              <%=intl._t("I2P Peer Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> @@ -23,44 +23,55 @@ if (request.getParameter("peer") != null) peer = net.i2p.data.DataHelper.stripHTML(request.getParameter("peer")); // XSS %> -
              -

              <%=intl._t("Manual Peer Controls")%>

              -

              <%=intl._t("Router Hash")%>: -

              -

              <%=intl._t("Manually Ban / Unban a Peer")%>

              -

              <%=intl._t("Banning will prevent the participation of this peer in tunnels you create.")%>

              -
              +

              <%=intl._t("Manual Peer Controls")%>

              + + + + + + + -

              <%=intl._t("Adjust Profile Bonuses")%>

              -

              <%=intl._t("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._t("profiles page")%>.

              + + + + + <% long speed = 0; long capacity = 0; if (! "".equals(peer)) { // get existing bonus values? } %> -

              <%=intl._t("Speed")%>: +

              + + +
              <%=intl._t("Router Hash")%>:
              <%=intl._t("Manually Ban / Unban a Peer")%>
              <%=intl._t("Banning will prevent the participation of this peer in tunnels you create.")%>
              " /> " /> <% if (! "".equals(peer)) { %> <% } %> - +
              <%=intl._t("Adjust Profile Bonuses")%>
              + <%=intl._t("Bonuses may be positive or negative, and affect the peer's inclusion in Fast and High Capacity tiers. Fast peers are used for client tunnels, and High Capacity peers are used for some exploratory tunnels. Current bonuses are displayed on the")%> <%=intl._t("profiles page")%>. +
              <%=intl._t("Speed")%>: <%=intl._t("Capacity")%>: - " />

              +
              + " /> +
              -

              <%=intl._t("Banned Peers")%>

              +

              <%=intl._t("Banned Peers")%>

              " /> <% profilesHelper.storeWriter(out); %> -

              <%=intl._t("Banned IPs")%>

              +

              <%=intl._t("Banned IPs")%>

              -

              +
              diff --git a/apps/routerconsole/jsp/configplugins.jsp b/apps/routerconsole/jsp/configplugins.jsp index 9eb7ec3d2..8000ca64a 100644 --- a/apps/routerconsole/jsp/configplugins.jsp +++ b/apps/routerconsole/jsp/configplugins.jsp @@ -31,13 +31,13 @@ input.default { width: 1px; height: 1px; visibility: hidden; } if (clientshelper.showPlugins()) { if (clientshelper.isPluginUpdateEnabled()) { %> -

              <%=intl._t("Plugin Configuration")%>

              +

              <%=intl._t("Plugin Configuration")%>

              <%=intl._t("The plugins listed below are started by the webConsole client.")%>

              -
              +
              " /> " />
              @@ -45,38 +45,50 @@ input.default { width: 1px; height: 1px; visibility: hidden; } } // pluginUpdateEnabled if (clientshelper.isPluginInstallEnabled()) { %> -

              <%=intl._t("Plugin Installation from URL")%>

              +

              <%=intl._t("Plugin Installation")%>

              + + + + - -

              - -


              - " /> +
              + + + + + + + + + +
              <%=intl._t("Look for available plugins on {0}.", "i2pwiki.i2p")%> - <%=intl._t("To install a plugin, enter the download URL:")%> -

              -
              +
              + <%=intl._t("Installation from URL")%> +
              + + URL:  + " > + + " /> " /> " /> - - - -
              -

              <%=intl._t("Plugin Installation from File")%>

              +
              +<%=intl._t("Installation from File")%> +
              -

              <%=intl._t("Install plugin from file.")%> -
              <%=intl._t("Select xpi2p or su3 file")%> : - -


              +<%=intl._t("Select xpi2p or su3 file")%>:  + +
              " /> - +
              <% } // pluginInstallEnabled if (clientshelper.isPluginUpdateEnabled()) { %> -

              <%=intl._t("Update All Plugins")%>

              -
              +

              <%=intl._t("Update All Plugins")%>

              +
              " /> diff --git a/apps/routerconsole/jsp/configreseed.jsp b/apps/routerconsole/jsp/configreseed.jsp index 25b6704f9..538359b10 100644 --- a/apps/routerconsole/jsp/configreseed.jsp +++ b/apps/routerconsole/jsp/configreseed.jsp @@ -14,61 +14,83 @@ " />

              <%=intl._t("I2P Reseeding Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -

              <%=intl._t("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> +

              +<%=intl._t("Reseeding is the bootstrapping process used to find other routers when you first install I2P, or when your router has too few router references remaining.")%> <%=intl._t("If reseeding has failed, you should first check your network connection.")%> <%=intl._t("See {0} for instructions on reseeding manually.", "" + intl._t("the FAQ") + "")%>

              - -
              - -

              <%=intl._t("Manual Reseed from URL")%>

              -

              <%=intl._t("Enter zip or su3 URL")%> : - -
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> +

              <%=intl._t("Manual Reseed")%>

              + + + + + + + -

              <%=intl._t("Reseeding Configuration")%>

              -

              <%=intl._t("The default settings will work for most people.")%> +

              + + + + + + + + + + + + + + + + + + + + + + +
              +<%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%>  <%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%> -

              -
              -" /> -
              - -
              -
              - -

              <%=intl._t("Manual Reseed from File")%>

              -

              <%=intl._t("Select zip or su3 file")%> : - -
              <%=intl._t("The su3 format is preferred, as it will be verified as signed by a trusted source.")%> -<%=intl._t("The zip format is unsigned; use a zip file only from a source that you trust.")%> -

              -
              -" /> -
              - -
              -
              -

              <%=intl._t("Create Reseed File")%>

              -

              <%=intl._t("Create a new reseed zip file you may share for others to reseed manually.")%> -<%=intl._t("This file will never contain your own router's identity or IP.")%> -

              -
              -" /> -
              - -
              +
              <%=intl._t("Reseed from URL")%>
              +<%=intl._t("Enter zip or su3 URL")%>: + +" /> +
              <%=intl._t("Reseed from File")%>
              +<%=intl._t("Select zip or su3 file")%>: + + +" /> +
              +<%=intl._t("Create Reseed File")%> +
              +<%=intl._t("Create a new reseed zip file you may share for others to reseed manually.")%>  +<%=intl._t("This file will never contain your own router's identity or IP.")%> +
              +
              +" /> +
              +
              + +
              + +

              <%=intl._t("Reseeding Configuration")%>

              + + + + + +
              +<%=intl._t("The default settings will work for most people.")%>  <%=intl._t("Change these only if HTTPS is blocked by a restrictive firewall and reseed has failed.")%> -

              -
              - + + @@ -111,9 +133,12 @@ --> -
              <%=intl._t("Reseed URL Selection")%>: > <%=intl._t("Try SSL first then non-SSL")%>
              @@ -78,7 +100,7 @@ <%=intl._t("Use non-SSL only")%>
              <%=intl._t("Reseed URLs")%>: -
              " />
              +
              " />
              <%=intl._t("Enable HTTP Proxy?")%>" >
              -
              +
              " /> " /> " /> - +
              +
              diff --git a/apps/routerconsole/jsp/configservice.jsp b/apps/routerconsole/jsp/configservice.jsp index b3a21a7d7..5e631b87d 100644 --- a/apps/routerconsole/jsp/configservice.jsp +++ b/apps/routerconsole/jsp/configservice.jsp @@ -11,18 +11,18 @@ <%@include file="summary.jsi" %>

              <%=intl._t("I2P Service Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> <%@include file="formhandler.jsi" %> -
              -

              <%=intl._t("Shutdown the router")%>

              -

              <%=intl._t("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> +

              <%=intl._t("Shutdown the router")%>

              +

              + <%=intl._t("Graceful shutdown lets the router satisfy the agreements it has already made before shutting down, but may take a few minutes.")%> <%=intl._t("If you need to kill the router immediately, that option is available as well.")%>

              -
              +
              " > " > <% if (formhandler.shouldShowCancelGraceful()) { %> @@ -30,19 +30,21 @@ <% } %>
              <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._t("If you want the router to restart itself after shutting down, you can choose one of the following.")%> +

              <%=intl._t("Restart the router")%>

              +

              + <%=intl._t("If you want the router to restart itself after shutting down, you can choose one of the following.")%> <%=intl._t("This is useful in some situations - for example, if you changed some settings that client applications only read at startup, such as the routerconsole password or the interface it listens on.")%> <%=intl._t("A graceful restart will take a few minutes (but your peers will appreciate your patience), while a hard restart does so immediately.")%> <%=intl._t("After tearing down the router, it will wait 1 minute before starting back up again.")%>

              -
              +
              " > " > <% } %>
              <% if (formhandler.shouldShowSystray()) { %> -

              <%=intl._t("Systray integration")%>

              -

              <%=intl._t("Control the system tray icon")%> -


              +

              <%=intl._t("Systray integration")%>

              +

              <%=intl._t("Control the system tray icon")%>

              +
              <% if (!formhandler.isSystrayEnabled()) { %> " > <% } else {%> @@ -53,34 +55,37 @@ } if ( (System.getProperty("os.name") != null) && (System.getProperty("os.name").startsWith("Win")) ) { %> %> -

              <%=intl._t("Run on startup")%>

              -

              <%=intl._t("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> +

              <%=intl._t("Run on startup")%>

              +

              + <%=intl._t("You can control whether I2P is run on startup or not by selecting one of the following options - I2P will install (or remove) a service accordingly.")%> <%=intl._t("If you prefer the command line, you can also run the ")%> install_i2p_service_winnt.bat (<%=intl._t("or")%> uninstall_i2p_service_winnt.bat).

              -
              +
              " > -" >
              -

              <%=intl._t("Note")%>: <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%> + " >

              +

              + <%=intl._t("Note")%>: <%=intl._t("If you are running I2P as service right now, removing it will shut down your router immediately.")%> <%=intl._t("You may want to consider shutting down gracefully, as above, then running uninstall_i2p_service_winnt.bat.")%>

              -<% } %> + <% } %> -

              <%=intl._t("Debugging")%>

              -

              <%=intl._t("View the job queue")%> +

              <%=intl._t("Debugging")%> [<%=intl._t("View the job queue")%>]

              <% if (System.getProperty("wrapper.version") != null) { %> -

              <%=intl._t("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>

              -
              +

              + <%=intl._t("At times, it may be helpful to debug I2P by getting a thread dump. To do so, please select the following option and review the thread dumped to wrapper.log.")%>

              +
              <% } %> -
              +
              " > <% if (System.getProperty("wrapper.version") != null) { %> " > <% } %>
              -

              <%=intl._t("Launch browser on router startup?")%>

              -

              <%=intl._t("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> +

              <%=intl._t("Launch browser on router startup?")%>

              +

              + <%=intl._t("I2P's main configuration interface is this web console, so for your convenience I2P can launch a web browser on startup pointing at")%> http://127.0.0.1:7657/ .

              -
              +
              " > " > -
              +
              diff --git a/apps/routerconsole/jsp/configsidebar.jsp b/apps/routerconsole/jsp/configsidebar.jsp index 63c3ed18c..9ac596667 100644 --- a/apps/routerconsole/jsp/configsidebar.jsp +++ b/apps/routerconsole/jsp/configsidebar.jsp @@ -18,7 +18,7 @@ input.default { <%@include file="summary.jsi" %>

              <%=intl._t("I2P Summary Bar Configuration")%>

              -
              +
              <%@include file="confignav.jsi" %> @@ -29,21 +29,29 @@ input.default { " /> -

              <%=intl._t("Refresh Interval")%>

              +

              <%=intl._t("Refresh Interval")%>

              + + + + + +
              " > <%=intl._t("seconds")%> + " > +
              -

              <%=intl._t("Customize Summary Bar")%>

              +

              <%=intl._t("Customize Summary Bar")%>

              -
              +
              " > " >
              diff --git a/apps/routerconsole/jsp/configstats.jsp b/apps/routerconsole/jsp/configstats.jsp index 802d615e5..cbf3a4c2e 100644 --- a/apps/routerconsole/jsp/configstats.jsp +++ b/apps/routerconsole/jsp/configstats.jsp @@ -6,6 +6,7 @@ <%@include file="css.jsi" %> <%=intl.title("config stats")%> + <%@include file="summaryajax.jsi" %>