diff --git a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java index e65f9ec90..8a1b92046 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/CSSHelper.java @@ -28,11 +28,13 @@ public class CSSHelper extends HelperBase { return url; } - /** change default language for the router but don't save it */ + /** change default language for the router AND save it */ public void setLang(String lang) { - // TODO: Protect with nonce or require POST - if (lang != null && lang.length() == 2) + // Protected with nonce in css.jsi + if (lang != null && lang.length() == 2 && !lang.equals(_context.getProperty(Messages.PROP_LANG))) { _context.router().setConfigSetting(Messages.PROP_LANG, lang); + _context.router().saveConfig(); + } } /** needed for conditional css loads for zh */ @@ -61,4 +63,13 @@ public class CSSHelper extends HelperBase { .append(""); return buf.toString(); } + + /** + * Should we allow a refreshing IFrame? + * @since 0.8.5 + */ + public boolean allowIFrame(String ua) { + return ua == null || !(ua.startsWith("Lynx") || ua.startsWith("w3m") || + ua.startsWith("ELinks") || ua.startsWith("Dillo")); + } } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java index 1853ff246..b56108be3 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java @@ -19,15 +19,14 @@ public class ContentHelper extends HelperBase { _startAtBeginning = Boolean.valueOf(""+moo).booleanValue(); } public void setLang(String l) { +/***** if((_lang == null || !_lang.equals(l)) && (l != null)) { //Set language for router console _lang = l; -/***** TODO - Temporary for 0.8.4 Needed for desktopgui. But there's no nonce protection. Move the following to CSSHelper setLang(), or disable completely, See comments in CSSHelper -*****/ if(_context == null) { setContextId(null); } @@ -39,6 +38,7 @@ public class ContentHelper extends HelperBase { _context.setProperty(Messages.PROP_LANG, _lang); } } +*****/ } public void setMaxLines(String lines) { diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java index 55c7b009c..e21102c7f 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryBarRenderer.java @@ -224,25 +224,21 @@ public class SummaryBarRenderer { System.setProperty("net.i2p.router.web.UpdateHandler.noncePrev", prev); System.setProperty("net.i2p.router.web.UpdateHandler.nonce", nonce+""); String uri = _helper.getRequestURI(); - buf.append("

\n"); + buf.append("\n"); buf.append("\n"); if (_helper.updateAvailable()) { buf.append("\n"); + // Note to translators: parameter is a version, e.g. "0.8.4" + .append(_("Download {0} Update", _helper.getUpdateVersion())) + .append("
\n"); } if (_helper.unsignedUpdateAvailable()) { buf.append("\n"); + // Note to translators: parameter is a date and time, e.g. "02-Mar 20:34 UTC" + //
is optional, to help the browser make the lines even in the button + // If the translation is shorter than the English, you should probably not include
+ .append(_("Download Unsigned
Update {0}", _helper.getUnsignedUpdateVersion())) + .append("
\n"); } buf.append("
\n"); } @@ -251,10 +247,9 @@ public class SummaryBarRenderer { - buf.append("

") - .append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) + buf.append(ConfigRestartBean.renderStatus(_helper.getRequestURI(), _helper.getAction(), _helper.getConsoleNonce())) - .append("


") .append(_("Peers")) @@ -456,4 +451,9 @@ public class SummaryBarRenderer { private String _(String s) { return Messages.getString(s, _context); } + + /** translate a string with a parameter */ + private String _(String s, Object o) { + return Messages.getString(s, o, _context); + } } diff --git a/apps/routerconsole/jsp/configlogging.jsp b/apps/routerconsole/jsp/configlogging.jsp index c87fd367d..bd80b8086 100644 --- a/apps/routerconsole/jsp/configlogging.jsp +++ b/apps/routerconsole/jsp/configlogging.jsp @@ -41,7 +41,7 @@
<%=intl._("('MM' = month, 'dd' = day, 'HH' = hour, 'mm' = minute, 'ss' = second, 'SSS' = millisecond)")%> <%=intl._("Max log file size")%>: - " >
+ " >
<%=intl._("Default log level")%>:
<%=intl._("(DEBUG and INFO are not recommended defaults, as they will drastically slow down your router)")%> diff --git a/apps/routerconsole/jsp/css.jsi b/apps/routerconsole/jsp/css.jsi index 613b32a67..e259d0707 100644 --- a/apps/routerconsole/jsp/css.jsi +++ b/apps/routerconsole/jsp/css.jsi @@ -26,7 +26,10 @@ " /> <% - intl.setLang(request.getParameter("lang")); + String conNonceParam = request.getParameter("consoleNonce"); + if (conNonceParam != null && conNonceParam.equals(System.getProperty("router.consoleNonce"))) { + intl.setLang(request.getParameter("lang")); + } %> console.css" rel="stylesheet" type="text/css"> <% diff --git a/apps/routerconsole/jsp/index.jsp b/apps/routerconsole/jsp/index.jsp index 6f29573e6..5aeeeea98 100644 --- a/apps/routerconsole/jsp/index.jsp +++ b/apps/routerconsole/jsp/index.jsp @@ -7,9 +7,11 @@ <%=intl.title("home")%> <% -if (System.getProperty("router.consoleNonce") == null) { - System.setProperty("router.consoleNonce", new java.util.Random().nextLong() + ""); -} + String consoleNonce = System.getProperty("router.consoleNonce"); + if (consoleNonce == null) { + consoleNonce = Long.toString(new java.util.Random().nextLong()); + System.setProperty("router.consoleNonce", consoleNonce); + } %> <%@include file="summary.jsi" %>

<%=intl._("I2P Router Console")%>

@@ -26,10 +28,25 @@ if (System.getProperty("router.consoleNonce") == null) {

+
+
+ English + عربية + 中文 + Deutsch + Français + Español + Português + Nederlands + Русский + Svenska +
+ +

<%=intl._("Welcome to I2P")%>

+
<% fpath = new java.io.File(net.i2p.I2PAppContext.getGlobalContext().getBaseDir(), "docs/readme.html"); %> - " /> " />
diff --git a/apps/routerconsole/jsp/summary.jsi b/apps/routerconsole/jsp/summary.jsi index 5a81e7af3..46cb366fe 100644 --- a/apps/routerconsole/jsp/summary.jsi +++ b/apps/routerconsole/jsp/summary.jsi @@ -1,27 +1,41 @@ -<% // put width here too to prevent bad layout at startup %> -<% // let's remove that for now since we're no longer using percentage width here %>
<% - // skip the iframe if refresh disabled - String d = request.getParameter("refresh"); - String newDelay = ""; - if (d == null || "".equals(d)) - d = intl.getRefresh(); - else { - d = net.i2p.data.DataHelper.stripHTML(d); // XSS - // pass the new delay parameter to the iframe - newDelay = "?refresh=" + d; + // The refresh delay, 0 to disable + String d = "0"; + boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent")); + if (allowIFrame) { + // skip the iframe if refresh disabled + d = request.getParameter("refresh"); + String newDelay = ""; + if (d == null || "".equals(d)) + d = intl.getRefresh(); + else { + d = net.i2p.data.DataHelper.stripHTML(d); // XSS + // pass the new delay parameter to the iframe + newDelay = "?refresh=" + d; + } + if (!"0".equals(d)) + out.print("\n"); - } else { + } else if (allowIFrame) { // since we don't have an iframe this will reload the base page, and // the new delay will be passed to the iframe above out.print("
\n"); @@ -34,6 +48,8 @@ out.print(intl._("Enable")); out.print("\n"); out.print("
\n"); + } else { + out.print("\n"); } %> diff --git a/apps/routerconsole/jsp/summaryframe.jsp b/apps/routerconsole/jsp/summaryframe.jsp index e59fbd44f..d0eb8b72a 100644 --- a/apps/routerconsole/jsp/summaryframe.jsp +++ b/apps/routerconsole/jsp/summaryframe.jsp @@ -15,7 +15,9 @@ String action = request.getParameter("action"); String d = request.getParameter("refresh"); // Normal browsers send value, IE sends button label - boolean shutdownSoon = "shutdownImmediate".equals(action) || "restartImmediate".equals(action) || + boolean allowIFrame = intl.allowIFrame(request.getHeader("User-Agent")); + boolean shutdownSoon = (!allowIFrame) || + "shutdownImmediate".equals(action) || "restartImmediate".equals(action) || "Shutdown immediately".equals(action) || "Restart immediately".equals(action); if (!shutdownSoon) { if (d == null || "".equals(d)) { diff --git a/history.txt b/history.txt index fba494287..0c11021ed 100644 --- a/history.txt +++ b/history.txt @@ -1,8 +1,23 @@ +2011-03-08 zzz + * Console: + - Parameterize download button tags (ticket #425) + - Clean up summary bar HTML warnings + - Just display a summary bar link for text browsers + - Move welcome div from the readme files to index.jsp + - Require a nonce to change language + * i2psnark: + - More efficient metainfo handling, reduce instantiations + - Improved handling of storage errors + - Improved handling of duplicate file names + - More metainfo sanity checks + - Metadata transfer error handling improvements + - Code cleanup, remove dead and duplicated code + 2011-03-02 zzz * BuildHandler: - Limit request queue size - Concurrent request queue - - Remove dead code for queued rely handling + - Remove dead code for queued reply handling * OutNetMessage: Remove dead code * Tunnel cleanups, final, javadoc diff --git a/installer/resources/readme/readme.html b/installer/resources/readme/readme.html index 680a6c52b..a9eda7181 100644 --- a/installer/resources/readme/readme.html +++ b/installer/resources/readme/readme.html @@ -1,20 +1,4 @@
-
-
- English - عربية - 中文 - Deutsch - Français - Español - Português - Nederlands - Русский - Svenska -
- -

Welcome to the Invisible Internet

-