diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java index 5cf8a80db5be2256edf70ad8c61a714f1fb71d27..4b34200b4d175138561f097a7a5ac5a4b2824e42 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbHelper.java @@ -6,9 +6,14 @@ import java.util.Locale; import net.i2p.crypto.SigType; import net.i2p.data.DataHelper; import net.i2p.util.SystemVersion; -import net.i2p.router.web.HelperBase; +import net.i2p.router.web.FormHandler; -public class NetDbHelper extends HelperBase { +/** + * /netdb + * A FormHandler since 0.9.38. + * Most output is generated in NetDbRenderer and SybilRender. + */ +public class NetDbHelper extends FormHandler { private String _routerPrefix; private String _version; private String _country; @@ -20,6 +25,8 @@ public class NetDbHelper extends HelperBase { private boolean _debug; private boolean _graphical; private SigType _type; + private String _newNonce; + private boolean _postOK; private static final int DEFAULT_LIMIT = SystemVersion.isARM() ? 250 : 500; private static final int DEFAULT_PAGE = 0; @@ -194,6 +201,25 @@ public class NetDbHelper extends HelperBase { public void allowGraphical() { _graphical = true; } + + /** + * Override to save it + * @since 0.9.38 + */ + @Override + public String getNewNonce() { + _newNonce = super.getNewNonce(); + return _newNonce; + } + + /** + * Now we're a FormHandler + * @since 0.9.38 + */ + protected void processForm() { + _postOK = "Run new analysis".equals(_action) || + "Review analysis".equals(_action); + } /** * storeWriter() must be called previously @@ -205,19 +231,24 @@ public class NetDbHelper extends HelperBase { if (_routerPrefix != null || _version != null || _country != null || _family != null || _caps != null || _ip != null || _sybil != null || _port != 0 || _type != null || _mtu != null || _ipv6 != null || - _ssucaps != null || _transport != null || _cost != 0) + _ssucaps != null || _transport != null || _cost != 0) { renderer.renderRouterInfoHTML(_out, _limit, _page, _routerPrefix, _version, _country, _family, _caps, _ip, _sybil, _port, _type, _mtu, _ipv6, _ssucaps, _transport, _cost); - else if (_lease) + } else if (_lease) { renderer.renderLeaseSetHTML(_out, _debug); - else if (_full == 3) - (new SybilRenderer(_context)).getNetDbSummary(_out, _mode, _date); - else if (_full == 4) + } else if (_full == 3) { + if (_mode == 12 && !_postOK) + _mode = 0; + else if (_mode == 13 && !_postOK) + _mode = 14; + (new SybilRenderer(_context)).getNetDbSummary(_out, _newNonce, _mode, _date); + } else if (_full == 4) { renderLookupForm(); - else + } else { renderer.renderStatusHTML(_out, _limit, _page, _full); + } } catch (IOException ioe) { ioe.printStackTrace(); } @@ -292,6 +323,7 @@ public class NetDbHelper extends HelperBase { */ private void renderLookupForm() throws IOException { _out.write("<form action=\"/netdb\" method=\"POST\">\n" + + "<input type=\"hidden\" name=\"nonce\" value=\"" + _newNonce + "\" >\n" + "<table id=\"netdblookup\"><tr><th colspan=\"3\">Network Database Search</th></tr>\n" + "<tr><td colspan=\"3\" class=\"subheading\"><b>Enter one search field <i>only</i>:</b></td></tr>\n" + "<tr><td>Capabilities:</td><td><input type=\"text\" name=\"caps\"></td><td>e.g. f or XOfR</td></tr>\n" + diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java index 96c07624963789745909d18bec0373c3a074a474..4ac69d084f2a43143a6cd510833fb5c2d498e3e8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/SybilRenderer.java @@ -78,8 +78,8 @@ public class SybilRenderer { * @param mode what tab to show * @param date only for mode = 12 */ - public String getNetDbSummary(Writer out, int mode, long date) throws IOException { - renderRouterInfoHTML(out, mode, date); + public String getNetDbSummary(Writer out, String nonce, int mode, long date) throws IOException { + renderRouterInfoHTML(out, nonce, mode, date); return ""; } @@ -125,21 +125,24 @@ public class SybilRenderer { * @param mode what tab to show * @param date only for mode = 12 */ - private void renderRouterInfoHTML(Writer out, int mode, long date) throws IOException { + private void renderRouterInfoHTML(Writer out, String nonce, int mode, long date) throws IOException { Hash us = _context.routerHash(); Analysis analysis = Analysis.getInstance(_context); - List<RouterInfo> ris = analysis.getFloodfills(us); - if (ris.isEmpty()) { - out.write("<h3 class=\"sybils\">No known floodfills</h3>"); - return; + List<RouterInfo> ris = null; + if (mode != 0 && mode != 12 && mode != 13 && mode != 14) { + ris = analysis.getFloodfills(us); + if (ris.isEmpty()) { + out.write("<h3 class=\"sybils\">No known floodfills</h3>"); + return; + } } StringBuilder buf = new StringBuilder(4*1024); buf.append("<p id=\"sybilinfo\"><b>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. " + + "Possible \"threats\" are summarized, 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.</b></p>" + "<div id=\"sybilnav\"><ul><li><a href=\"netdb?f=3\">Review stored analysis</a>" + - "</li><li><a href=\"netdb?f=3&m=13\">Run new analysis</a>" + + "</li><li><a href=\"netdb?f=3&m=14\">Run new analysis</a>" + "</li><li><a href=\"netdb?f=3&m=1\">Floodfill Summary</a>" + "</li><li><a href=\"netdb?f=3&m=2\">Same Family</a>" + "</li><li><a href=\"netdb?f=3&m=3\">IP close to us</a>" + @@ -154,11 +157,14 @@ public class SybilRenderer { "</li></ul></div>"); writeBuf(out, buf); - double avgMinDist = analysis.getAvgMinDist(ris); + double avgMinDist = 0; + if (mode == 1 || mode == 8 || mode == 9 || mode == 10 || mode == 11) { + avgMinDist = analysis.getAvgMinDist(ris); + } Map<Hash, Points> points = new HashMap<Hash, Points>(64); if (mode == 0) { - renderOverview(out, buf, analysis); + renderOverview(out, buf, nonce, analysis); } else if (mode == 1) { renderFFSummary(out, buf, ris, avgMinDist); } else if (mode == 2) { @@ -182,6 +188,7 @@ public class SybilRenderer { } else if (mode == 11) { renderDestSummary(out, buf, analysis, avgMinDist, ris, points); } else if (mode == 12) { + // load stored analysis PersistSybil ps = analysis.getPersister(); try { points = ps.load(date); @@ -195,6 +202,7 @@ public class SybilRenderer { renderThreatsHTML(out, buf, date, points); } } else if (mode == 13) { + // run analysis and store it long now = _context.clock().now(); points = analysis.backgroundAnalysis(); if (!points.isEmpty()) { @@ -206,6 +214,9 @@ public class SybilRenderer { } } renderThreatsHTML(out, buf, now, points); + } else if (mode == 14) { + // show form + renderRunForm(out, buf, nonce); } else { out.write("Unknown mode " + mode); } @@ -215,15 +226,16 @@ public class SybilRenderer { /** * @since 0.9.38 */ - private void renderOverview(Writer out, StringBuilder buf, Analysis analysis) throws IOException { + private void renderOverview(Writer out, StringBuilder buf, String nonce, Analysis analysis) throws IOException { PersistSybil ps = analysis.getPersister(); List<Long> dates = ps.load(); if (dates.isEmpty()) { out.write("No stored analysis"); } else { - buf.append("<form action=\"netdb\" method=\"GET\">\n" + + buf.append("<form action=\"netdb\" method=\"POST\">\n" + "<input type=\"hidden\" name=\"f\" value=\"3\">\n" + "<input type=\"hidden\" name=\"m\" value=\"12\">\n" + + "<input type=\"hidden\" name=\"nonce\" value=\"" + nonce + "\" >\n" + "Select stored analysis: " + "<select name=\"date\">\n"); boolean first = true; @@ -241,7 +253,20 @@ public class SybilRenderer { "<input type=\"submit\" name=\"action\" class=\"go\" value=\"Review analysis\" />" + "</form>\n"); } - buf.append("<br><a href=\"netdb?f=3&m=13\">Run new analysis</a>"); + writeBuf(out, buf); + } + + + /** + * @since 0.9.38 + */ + private void renderRunForm(Writer out, StringBuilder buf, String nonce) throws IOException { + buf.append("<form action=\"netdb\" method=\"POST\">\n" + + "<input type=\"hidden\" name=\"f\" value=\"3\">\n" + + "<input type=\"hidden\" name=\"m\" value=\"13\">\n" + + "<input type=\"hidden\" name=\"nonce\" value=\"" + nonce + "\" >\n" + + "<input type=\"submit\" name=\"action\" class=\"go\" value=\"Run new analysis\" />" + + "</form>\n"); writeBuf(out, buf); } diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 1f098523bb572a644d662f4691149845cddbb3e0..6409b2d71e848298ffcfb43817557ae93223ee29 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -12,33 +12,33 @@ <%@include file="summary.jsi" %> <h1><%=intl._t("I2P Network Database")%></h1> <div class="main" id="netdb"> - <jsp:useBean class="net.i2p.router.web.helpers.NetDbHelper" id="netdbHelper" scope="request" /> - <jsp:setProperty name="netdbHelper" property="contextId" value="<%=i2pcontextId%>" /> + <jsp:useBean class="net.i2p.router.web.helpers.NetDbHelper" id="formhandler" scope="request" /> <% - netdbHelper.storeWriter(out); + formhandler.storeWriter(out); if (allowIFrame) - netdbHelper.allowGraphical(); + formhandler.allowGraphical(); %> - <jsp:setProperty name="netdbHelper" property="full" value="<%=request.getParameter(\"f\")%>" /> - <jsp:setProperty name="netdbHelper" property="router" value="<%=request.getParameter(\"r\")%>" /> - <jsp:setProperty name="netdbHelper" property="lease" value="<%=request.getParameter(\"l\")%>" /> - <jsp:setProperty name="netdbHelper" property="version" value="<%=request.getParameter(\"v\")%>" /> - <jsp:setProperty name="netdbHelper" property="country" value="<%=request.getParameter(\"c\")%>" /> - <jsp:setProperty name="netdbHelper" property="family" value="<%=request.getParameter(\"fam\")%>" /> - <jsp:setProperty name="netdbHelper" property="caps" value="<%=request.getParameter(\"caps\")%>" /> - <jsp:setProperty name="netdbHelper" property="ip" value="<%=request.getParameter(\"ip\")%>" /> - <jsp:setProperty name="netdbHelper" property="sybil" value="<%=request.getParameter(\"sybil\")%>" /> - <jsp:setProperty name="netdbHelper" property="sybil2" value="<%=request.getParameter(\"sybil2\")%>" /> - <jsp:setProperty name="netdbHelper" property="port" value="<%=request.getParameter(\"port\")%>" /> - <jsp:setProperty name="netdbHelper" property="type" value="<%=request.getParameter(\"type\")%>" /> - <jsp:setProperty name="netdbHelper" property="ipv6" value="<%=request.getParameter(\"ipv6\")%>" /> - <jsp:setProperty name="netdbHelper" property="cost" value="<%=request.getParameter(\"cost\")%>" /> - <jsp:setProperty name="netdbHelper" property="mtu" value="<%=request.getParameter(\"mtu\")%>" /> - <jsp:setProperty name="netdbHelper" property="ssucaps" value="<%=request.getParameter(\"ssucaps\")%>" /> - <jsp:setProperty name="netdbHelper" property="transport" value="<%=request.getParameter(\"tr\")%>" /> - <jsp:setProperty name="netdbHelper" property="limit" value="<%=request.getParameter(\"ps\")%>" /> - <jsp:setProperty name="netdbHelper" property="page" value="<%=request.getParameter(\"pg\")%>" /> - <jsp:setProperty name="netdbHelper" property="mode" value="<%=request.getParameter(\"m\")%>" /> - <jsp:setProperty name="netdbHelper" property="date" value="<%=request.getParameter(\"date\")%>" /> - <jsp:getProperty name="netdbHelper" property="netDbSummary" /> + <jsp:setProperty name="formhandler" property="full" value="<%=request.getParameter(\"f\")%>" /> + <jsp:setProperty name="formhandler" property="router" value="<%=request.getParameter(\"r\")%>" /> + <jsp:setProperty name="formhandler" property="lease" value="<%=request.getParameter(\"l\")%>" /> + <jsp:setProperty name="formhandler" property="version" value="<%=request.getParameter(\"v\")%>" /> + <jsp:setProperty name="formhandler" property="country" value="<%=request.getParameter(\"c\")%>" /> + <jsp:setProperty name="formhandler" property="family" value="<%=request.getParameter(\"fam\")%>" /> + <jsp:setProperty name="formhandler" property="caps" value="<%=request.getParameter(\"caps\")%>" /> + <jsp:setProperty name="formhandler" property="ip" value="<%=request.getParameter(\"ip\")%>" /> + <jsp:setProperty name="formhandler" property="sybil" value="<%=request.getParameter(\"sybil\")%>" /> + <jsp:setProperty name="formhandler" property="sybil2" value="<%=request.getParameter(\"sybil2\")%>" /> + <jsp:setProperty name="formhandler" property="port" value="<%=request.getParameter(\"port\")%>" /> + <jsp:setProperty name="formhandler" property="type" value="<%=request.getParameter(\"type\")%>" /> + <jsp:setProperty name="formhandler" property="ipv6" value="<%=request.getParameter(\"ipv6\")%>" /> + <jsp:setProperty name="formhandler" property="cost" value="<%=request.getParameter(\"cost\")%>" /> + <jsp:setProperty name="formhandler" property="mtu" value="<%=request.getParameter(\"mtu\")%>" /> + <jsp:setProperty name="formhandler" property="ssucaps" value="<%=request.getParameter(\"ssucaps\")%>" /> + <jsp:setProperty name="formhandler" property="transport" value="<%=request.getParameter(\"tr\")%>" /> + <jsp:setProperty name="formhandler" property="limit" value="<%=request.getParameter(\"ps\")%>" /> + <jsp:setProperty name="formhandler" property="page" value="<%=request.getParameter(\"pg\")%>" /> + <jsp:setProperty name="formhandler" property="mode" value="<%=request.getParameter(\"m\")%>" /> + <jsp:setProperty name="formhandler" property="date" value="<%=request.getParameter(\"date\")%>" /> +<%@include file="formhandler.jsi" %> + <jsp:getProperty name="formhandler" property="netDbSummary" /> </div></body></html>