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 5cf8a80db5..4b34200b4d 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("
\n" + + "\n" + "\n" + "\n" + "\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 96c0762496..4ac69d084f 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 ris = analysis.getFloodfills(us); - if (ris.isEmpty()) { - out.write("

No known floodfills

"); - return; + List ris = null; + if (mode != 0 && mode != 12 && mode != 13 && mode != 14) { + ris = analysis.getFloodfills(us); + if (ris.isEmpty()) { + 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. " + - "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.

" + "
"); 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 points = new HashMap(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 dates = ps.load(); if (dates.isEmpty()) { out.write("No stored analysis"); } else { - buf.append("\n" + + buf.append("\n" + "\n" + "\n" + + "\n" + "Select stored analysis: " + "" + "\n"); } - buf.append("
Run new analysis"); + writeBuf(out, buf); + } + + + /** + * @since 0.9.38 + */ + private void renderRunForm(Writer out, StringBuilder buf, String nonce) throws IOException { + buf.append("
\n" + + "\n" + + "\n" + + "\n" + + "" + + "\n"); writeBuf(out, buf); } diff --git a/apps/routerconsole/jsp/netdb.jsp b/apps/routerconsole/jsp/netdb.jsp index 1f098523bb..6409b2d71e 100644 --- a/apps/routerconsole/jsp/netdb.jsp +++ b/apps/routerconsole/jsp/netdb.jsp @@ -12,33 +12,33 @@ <%@include file="summary.jsi" %>

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

- - + <% - netdbHelper.storeWriter(out); + formhandler.storeWriter(out); if (allowIFrame) - netdbHelper.allowGraphical(); + formhandler.allowGraphical(); %> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - " /> - + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> + " /> +<%@include file="formhandler.jsi" %> +
Network Database Search
Enter one search field only:
Capabilities:e.g. f or XOfR