* Console:

- Use CSS for form messages
      - Goodbye nonce spoof message
      - tunnels.jsp improvements
This commit is contained in:
zzz
2009-05-26 20:04:20 +00:00
parent 32dddac75b
commit 2f1d6e3f90
17 changed files with 88 additions and 34 deletions

View File

@ -145,7 +145,7 @@ public class IndexBean {
if ( (_action == null) || (_action.trim().length() <= 0) || ("Cancel".equals(_action))) if ( (_action == null) || (_action.trim().length() <= 0) || ("Cancel".equals(_action)))
return ""; return "";
if ( (_prevNonce != _curNonce) && (!validPassphrase(_passphrase)) ) if ( (_prevNonce != _curNonce) && (!validPassphrase(_passphrase)) )
return "Invalid nonce, are you being spoofed?"; return "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
if ("Stop all".equals(_action)) if ("Stop all".equals(_action))
return stopAll(); return stopAll();
else if ("Start all".equals(_action)) else if ("Start all".equals(_action))

View File

@ -12,7 +12,7 @@ import net.i2p.util.Log;
* <jsp:setProperty name="handler" property="*" /> * <jsp:setProperty name="handler" property="*" />
* *
* The form is "processed" after the properties are set and the first output * The form is "processed" after the properties are set and the first output
* property is retrieved - either getNotices() or getErrors(). * property is retrieved - either getAll(), getNotices() or getErrors().
* *
*/ */
public class FormHandler { public class FormHandler {
@ -21,8 +21,8 @@ public class FormHandler {
private String _nonce; private String _nonce;
protected String _action; protected String _action;
protected String _passphrase; protected String _passphrase;
private List _errors; private List<String> _errors;
private List _notices; private List<String> _notices;
private boolean _processed; private boolean _processed;
private boolean _valid; private boolean _valid;
@ -78,6 +78,31 @@ public class FormHandler {
_notices.add(msg); _notices.add(msg);
} }
/**
* Display everything, wrap it in a div for consistent presentation
*
*/
public String getAllMessages() {
validate();
process();
if (_errors.size() <= 0 && _notices.size() <= 0)
return "";
StringBuffer buf = new StringBuffer(512);
buf.append("<div class=\"messages\" id=\"messages\"><p>");
if (_errors.size() > 0) {
buf.append("<span class=\"error\">");
buf.append(render(_errors));
buf.append("</span>");
}
if (_notices.size() > 0) {
buf.append("<span class=\"notice\">");
buf.append(render(_notices));
buf.append("</span>");
}
buf.append("</p></div>");
return buf.toString();
}
/** /**
* Display any error messages (processing the form if it hasn't * Display any error messages (processing the form if it hasn't
* been yet) * been yet)
@ -85,6 +110,7 @@ public class FormHandler {
*/ */
public String getErrors() { public String getErrors() {
validate(); validate();
process();
return render(_errors); return render(_errors);
} }
@ -95,6 +121,7 @@ public class FormHandler {
*/ */
public String getNotices() { public String getNotices() {
validate(); validate();
process();
return render(_notices); return render(_notices);
} }
@ -133,28 +160,29 @@ public class FormHandler {
if ( (expected != null) && (expected.trim().length() > 0) && (expected.equals(_passphrase)) ) { if ( (expected != null) && (expected.trim().length() > 0) && (expected.equals(_passphrase)) ) {
// ok // ok
} else { } else {
addFormError("Invalid nonce, are you being spoofed?"); addFormError("Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.");
_valid = false; _valid = false;
} }
} }
} }
private String render(List source) { private void process() {
if (!_processed) { if (!_processed) {
if (_valid) if (_valid)
processForm(); processForm();
_processed = true; _processed = true;
} }
}
private String render(List<String> source) {
if (source.size() <= 0) { if (source.size() <= 0) {
return ""; return "";
} else if (source.size() == 1) {
return (String)source.get(0);
} else { } else {
StringBuffer buf = new StringBuffer(512); StringBuffer buf = new StringBuffer(512);
buf.append("<ul>\n"); buf.append("<ul>\n");
for (int i = 0; i < source.size(); i++) { for (int i = 0; i < source.size(); i++) {
buf.append("<li>"); buf.append("<li>");
buf.append((String)source.get(i)); buf.append(source.get(i));
buf.append("</li>\n"); buf.append("</li>\n");
} }
buf.append("</ul>\n"); buf.append("</ul>\n");

View File

@ -18,8 +18,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigNetHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigNetHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<form action="config.jsp" method="POST"> <form action="config.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce"); <% String prev = System.getProperty("net.i2p.router.web.ConfigNetHandler.nonce");
@ -116,7 +115,7 @@
%> %>
<br /> <br />
<input type="radio" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> /> <input type="radio" name="udpAutoIP" value="hidden" <%=nethelper.getUdpAutoIPChecked(2) %> />
Hidden mode - do not publish IP<i>(prevents participating traffic; change restarts router)</i><br /> Hidden mode - do not publish IP <i>(prevents participating traffic; change restarts router)</i><br />
</p><p> </p><p>
<b>UDP Configuration:</b><br /> <b>UDP Configuration:</b><br />
UDP port: UDP port:

View File

@ -19,8 +19,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigAdvancedHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigAdvancedHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<form action="configadvanced.jsp" method="POST"> <form action="configadvanced.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce"); <% String prev = System.getProperty("net.i2p.router.web.ConfigAdvancedHandler.nonce");

View File

@ -26,8 +26,7 @@ button span.hide{
<jsp:setProperty name="formhandler" property="action" value="<%=request.getParameter("action")%>" /> <jsp:setProperty name="formhandler" property="action" value="<%=request.getParameter("action")%>" />
<jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" /> <jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" />
<jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" /> <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<form action="configclients.jsp" method="POST"> <form action="configclients.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce"); <% String prev = System.getProperty("net.i2p.router.web.ConfigClientsHandler.nonce");

View File

@ -16,8 +16,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigKeyringHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigKeyringHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>

View File

@ -18,8 +18,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigLoggingHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigLoggingHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<form action="configlogging.jsp" method="POST"> <form action="configlogging.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce"); <% String prev = System.getProperty("net.i2p.router.web.ConfigLoggingHandler.nonce");

View File

@ -16,8 +16,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigPeerHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigPeerHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>

View File

@ -16,8 +16,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigServiceHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigServiceHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<form action="configservice.jsp" method="POST"> <form action="configservice.jsp" method="POST">
<% String prev = System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce"); <% String prev = System.getProperty("net.i2p.router.web.ConfigServiceHandler.nonce");

View File

@ -61,8 +61,7 @@ function toggleAll(category)
<jsp:useBean class="net.i2p.router.web.ConfigStatsHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigStatsHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<jsp:useBean class="net.i2p.router.web.ConfigStatsHelper" id="statshelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigStatsHelper" id="statshelper" scope="request" />
<jsp:setProperty name="statshelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="statshelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />

View File

@ -22,8 +22,7 @@
<jsp:setProperty name="formhandler" property="action" value="<%=request.getParameter("action")%>" /> <jsp:setProperty name="formhandler" property="action" value="<%=request.getParameter("action")%>" />
<jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" /> <jsp:setProperty name="formhandler" property="nonce" value="<%=request.getParameter("nonce")%>" />
<jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" /> <jsp:setProperty name="formhandler" property="settings" value="<%=request.getParameterMap()%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<p><i> <p><i>
NOTE: The default settings work for most people. NOTE: The default settings work for most people.

View File

@ -16,8 +16,7 @@
<jsp:useBean class="net.i2p.router.web.ConfigUpdateHandler" id="formhandler" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigUpdateHandler" id="formhandler" scope="request" />
<jsp:setProperty name="formhandler" property="*" /> <jsp:setProperty name="formhandler" property="*" />
<jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="formhandler" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />
<font color="red"><jsp:getProperty name="formhandler" property="errors" /></font> <jsp:getProperty name="formhandler" property="allMessages" />
<i><jsp:getProperty name="formhandler" property="notices" /></i>
<jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" /> <jsp:useBean class="net.i2p.router.web.ConfigUpdateHelper" id="updatehelper" scope="request" />
<jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" /> <jsp:setProperty name="updatehelper" property="contextId" value="<%=(String)session.getAttribute("i2p.contextId")%>" />

View File

@ -89,9 +89,24 @@ div.news {
} }
div.confignav { div.confignav {
padding: 1em;
background-color: #efefff; background-color: #efefff;
} }
div.configure { div.configure {
padding: 1em;
background-color: #ffffc0; background-color: #ffffc0;
} }
div.messages {
padding: 1em;
background-color: #fafaff;
}
div.messages span.error {
color: #d00000;
}
div.messages span.notice {
font-style: italic;
}

View File

@ -270,7 +270,7 @@ public class AddressbookBean
} }
} }
else { else {
message += "Invalid nonce. Are you being spoofed?"; message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
} }
} }

View File

@ -142,7 +142,7 @@ public class ConfigBean implements Serializable {
} }
} }
else { else {
message = "Invalid nonce. Are you being spoofed?"; message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
} }
} }
if( message.length() > 0 ) if( message.length() > 0 )

View File

@ -136,7 +136,7 @@ public class SubscriptionsBean
} }
} }
else { else {
message = "Invalid nonce. Are you being spoofed?"; message = "Invalid form submission, probably because you used the 'back' or 'reload' button on your browser. Please resubmit.";
} }
} }
if( message.length() > 0 ) if( message.length() > 0 )

View File

@ -523,8 +523,25 @@ public class TunnelPoolManager implements TunnelManagerFacade {
long processedIn = (in != null ? in.getLifetimeProcessed() : 0); long processedIn = (in != null ? in.getLifetimeProcessed() : 0);
long processedOut = (outPool != null ? outPool.getLifetimeProcessed() : 0); long processedOut = (outPool != null ? outPool.getLifetimeProcessed() : 0);
out.write("<table border=\"1\"><tr><td><b>Direction</b></td><td><b>Expiration</b></td><td><b>Usage</b></td><td align=\"left\">Hops (gateway first)</td></tr>\n");
int live = 0; int live = 0;
int maxLength = 1;
for (int i = 0; i < tunnels.size(); i++) {
TunnelInfo info = (TunnelInfo)tunnels.get(i);
if (info.getLength() > maxLength)
maxLength = info.getLength();
}
out.write("<table border=\"1\"><tr><th>Direction</th><th>Expiration</th><th>Usage</th><th>Gateway</th>");
if (maxLength > 3) {
out.write("<th align=\"center\" colspan=\"" + (maxLength - 2));
out.write("\">Participants</th>");
}
else if (maxLength == 3) {
out.write("<th>Participant</th>");
}
if (maxLength > 1) {
out.write("<th>Endpoint</th>");
}
out.write("</tr>\n");
for (int i = 0; i < tunnels.size(); i++) { for (int i = 0; i < tunnels.size(); i++) {
TunnelInfo info = (TunnelInfo)tunnels.get(i); TunnelInfo info = (TunnelInfo)tunnels.get(i);
long timeLeft = info.getExpiration()-_context.clock().now(); long timeLeft = info.getExpiration()-_context.clock().now();
@ -546,6 +563,10 @@ public class TunnelPoolManager implements TunnelManagerFacade {
String cap = getCapacity(peer); String cap = getCapacity(peer);
out.write("<td>" + netDbLink(peer) + (id == null ? "" : " " + id) + cap + "</td>"); out.write("<td>" + netDbLink(peer) + (id == null ? "" : " " + id) + cap + "</td>");
} }
if (info.getLength() < maxLength && (info.getLength() == 1 || j == info.getLength() - 2)) {
for (int k = info.getLength(); k < maxLength; k++)
out.write("<td>&nbsp</td>");
}
} }
out.write("</tr>\n"); out.write("</tr>\n");