* configclients.jsp:
- Add form for I2CP options - Fix HTML errors
This commit is contained in:
@ -9,6 +9,7 @@ import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import net.i2p.router.client.ClientManagerFacadeImpl;
|
||||
import net.i2p.router.startup.ClientAppConfig;
|
||||
import net.i2p.router.startup.LoadClientAppsJob;
|
||||
|
||||
@ -35,6 +36,10 @@ public class ConfigClientsHandler extends FormHandler {
|
||||
saveClientChanges();
|
||||
return;
|
||||
}
|
||||
if (_action.equals(_("Save Interface Configuration"))) {
|
||||
saveInterfaceChanges();
|
||||
return;
|
||||
}
|
||||
if (_action.equals(_("Save WebApp Configuration"))) {
|
||||
saveWebAppChanges();
|
||||
return;
|
||||
@ -193,7 +198,7 @@ public class ConfigClientsHandler extends FormHandler {
|
||||
String[] arr = (String[]) _settings.get(key);
|
||||
if (arr == null)
|
||||
return null;
|
||||
return arr[0];
|
||||
return arr[0].trim();
|
||||
}
|
||||
|
||||
private void startClient(int i) {
|
||||
@ -337,4 +342,37 @@ public class ConfigClientsHandler extends FormHandler {
|
||||
_log.error("Error starting plugin " + app, e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Handle interface form
|
||||
* @since 0.8.3
|
||||
*/
|
||||
private void saveInterfaceChanges() {
|
||||
String port = getJettyString("port");
|
||||
if (port != null)
|
||||
_context.router().setConfigSetting(ClientManagerFacadeImpl.PROP_CLIENT_PORT, port);
|
||||
String intfc = getJettyString("interface");
|
||||
if (intfc != null)
|
||||
_context.router().setConfigSetting(ClientManagerFacadeImpl.PROP_CLIENT_HOST, intfc);
|
||||
String user = getJettyString("user");
|
||||
if (user != null)
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.PROP_USER, user);
|
||||
String pw = getJettyString("pw");
|
||||
if (pw != null)
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.PROP_PW, pw);
|
||||
String mode = getJettyString("mode");
|
||||
boolean disabled = "0".equals(mode);
|
||||
boolean ssl = "2".equals(mode);
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.PROP_DISABLE_EXTERNAL,
|
||||
Boolean.toString(disabled));
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.PROP_ENABLE_SSL,
|
||||
Boolean.toString(ssl));
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.PROP_AUTH,
|
||||
Boolean.toString((_settings.get("auth") != null)));
|
||||
boolean all = "0.0.0.0".equals(intfc) || "0:0:0:0:0:0:0:0".equals(intfc) ||
|
||||
"::".equals(intfc);
|
||||
_context.router().setConfigSetting(ConfigClientsHelper.BIND_ALL_INTERFACES, Boolean.toString(all));
|
||||
_context.router().saveConfig();
|
||||
addFormNotice(_("Interface configuration saved successfully - restart required to take effect."));
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,9 @@
|
||||
package net.i2p.router.web;
|
||||
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.Collections;
|
||||
import java.util.Date;
|
||||
import java.util.Iterator;
|
||||
import java.util.List;
|
||||
@ -8,13 +11,90 @@ import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.TreeSet;
|
||||
|
||||
import net.i2p.router.client.ClientManagerFacadeImpl;
|
||||
import net.i2p.router.startup.ClientAppConfig;
|
||||
import net.i2p.router.transport.Addresses;
|
||||
|
||||
public class ConfigClientsHelper extends HelperBase {
|
||||
private String _edit;
|
||||
|
||||
/** from ClientListenerRunner */
|
||||
public static final String BIND_ALL_INTERFACES = "i2cp.tcp.bindAllInterfaces";
|
||||
/** from ClientManager */
|
||||
public static final String PROP_DISABLE_EXTERNAL = "i2cp.disableInterface";
|
||||
public static final String PROP_ENABLE_SSL = "i2cp.SSL";
|
||||
/** from ClientMessageEventListener */
|
||||
public static final String PROP_AUTH = "i2cp.auth";
|
||||
public static final String PROP_USER = "i2cp.username";
|
||||
public static final String PROP_PW = "i2cp.password";
|
||||
|
||||
public ConfigClientsHelper() {}
|
||||
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String getPort() {
|
||||
return _context.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_PORT,
|
||||
Integer.toString(ClientManagerFacadeImpl.DEFAULT_PORT));
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String getUser() {
|
||||
return _context.getProperty(PROP_USER, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String getPw() {
|
||||
return _context.getProperty(PROP_PW, "");
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String i2cpModeChecked(int mode) {
|
||||
boolean disabled = _context.getBooleanProperty(PROP_DISABLE_EXTERNAL);
|
||||
boolean ssl = _context.getBooleanProperty(PROP_ENABLE_SSL);
|
||||
if ((mode == 0 && disabled) ||
|
||||
(mode == 1 && (!disabled) && (!ssl)) ||
|
||||
(mode == 2 && (!disabled) && ssl))
|
||||
return "checked=\"true\"";
|
||||
return "";
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String getAuth() {
|
||||
boolean enabled = _context.getBooleanProperty(PROP_AUTH);
|
||||
if (enabled)
|
||||
return "checked=\"true\"";
|
||||
return "";
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public String[] intfcAddresses() {
|
||||
String[] addrs = Addresses.getAllAddresses();
|
||||
List<String> aList = new ArrayList();
|
||||
aList.addAll(Arrays.asList(addrs));
|
||||
boolean ipv6 = false;
|
||||
for (String a : aList) {
|
||||
if (a.indexOf(':') >= 0) {
|
||||
ipv6 = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!aList.contains("0.0.0.0"))
|
||||
aList.add("0.0.0.0");
|
||||
if (ipv6 && !aList.contains("0:0:0:0:0:0:0:0"))
|
||||
aList.add("0:0:0:0:0:0:0:0"); // we could do "::" but all the other ones are probably in long form
|
||||
Collections.sort(aList);
|
||||
return aList.toArray(addrs);
|
||||
}
|
||||
|
||||
/** @since 0.8.3 */
|
||||
public boolean isIFSelected(String addr) {
|
||||
boolean bindAll = _context.getBooleanProperty(BIND_ALL_INTERFACES);
|
||||
if (bindAll && addr.equals("0.0.0.0") || addr.equals("::"))
|
||||
return true;
|
||||
String host = _context.getProperty(ClientManagerFacadeImpl.PROP_CLIENT_HOST,
|
||||
ClientManagerFacadeImpl.DEFAULT_HOST);
|
||||
return (host.equals(addr));
|
||||
}
|
||||
|
||||
public void setEdit(String edit) {
|
||||
if (edit == null)
|
||||
return;
|
||||
@ -92,9 +172,9 @@ public class ConfigClientsHelper extends HelperBase {
|
||||
continue;
|
||||
StringBuilder desc = new StringBuilder(256);
|
||||
desc.append("<table border=\"0\">")
|
||||
.append("<tr><td><b>").append(_("Version")).append("<td>").append(stripHTML(appProps, "version"))
|
||||
.append("<tr><td><b>").append(_("Version")).append("</b></td><td>").append(stripHTML(appProps, "version"))
|
||||
.append("<tr><td><b>")
|
||||
.append(_("Signed by")).append("<td>");
|
||||
.append(_("Signed by")).append("</b></td><td>");
|
||||
String s = stripHTML(appProps, "signer");
|
||||
if (s != null) {
|
||||
if (s.indexOf("@") > 0)
|
||||
@ -111,13 +191,13 @@ public class ConfigClientsHelper extends HelperBase {
|
||||
if (ms > 0) {
|
||||
String date = (new SimpleDateFormat("yyyy-MM-dd HH:mm")).format(new Date(ms));
|
||||
desc.append("<tr><td><b>")
|
||||
.append(_("Date")).append("<td>").append(date);
|
||||
.append(_("Date")).append("</b></td><td>").append(date);
|
||||
}
|
||||
}
|
||||
s = stripHTML(appProps, "author");
|
||||
if (s != null) {
|
||||
desc.append("<tr><td><b>")
|
||||
.append(_("Author")).append("<td>");
|
||||
.append(_("Author")).append("</b></td><td>");
|
||||
if (s.indexOf("@") > 0)
|
||||
desc.append("<a href=\"mailto:").append(s).append("\">").append(s).append("</a>");
|
||||
else
|
||||
@ -128,12 +208,12 @@ public class ConfigClientsHelper extends HelperBase {
|
||||
s = stripHTML(appProps, "description");
|
||||
if (s != null) {
|
||||
desc.append("<tr><td><b>")
|
||||
.append(_("Description")).append("<td>").append(s);
|
||||
.append(_("Description")).append("</b></td><td>").append(s);
|
||||
}
|
||||
s = stripHTML(appProps, "license");
|
||||
if (s != null) {
|
||||
desc.append("<tr><td><b>")
|
||||
.append(_("License")).append("<td>").append(s);
|
||||
.append(_("License")).append("</b></td><td>").append(s);
|
||||
}
|
||||
s = stripHTML(appProps, "websiteURL");
|
||||
if (s != null) {
|
||||
|
@ -47,7 +47,51 @@ button span.hide{
|
||||
<input type="submit" name="edit" value="<%=intl._("Add Client")%>" />
|
||||
<% } %>
|
||||
<input type="submit" name="action" value="<%=intl._("Save Client Configuration")%>" />
|
||||
</div></div><h3><a name="webapp"></a><%=intl._("WebApp Configuration")%></h3><p>
|
||||
</div></div>
|
||||
|
||||
<h3><a name="i2cp"></a><%=intl._("Advanced Client Interface Configuration")%></h3><p>
|
||||
<b><%=intl._("External I2CP (I2P Client Protocol) Interface Configuration")%></b><br>
|
||||
<input type="radio" class="optbox" name="mode" value="1" <%=clientshelper.i2cpModeChecked(1) %> >
|
||||
<%=intl._("Enabled without SSL")%><br>
|
||||
<input type="radio" class="optbox" name="mode" value="2" <%=clientshelper.i2cpModeChecked(2) %> >
|
||||
<%=intl._("Enabled with SSL required")%><br>
|
||||
<input type="radio" class="optbox" name="mode" value="0" <%=clientshelper.i2cpModeChecked(0) %> >
|
||||
<%=intl._("Disabled - Clients outside this Java process may not connect")%><br>
|
||||
<%=intl._("I2CP Port")%>:
|
||||
<input name="port" type="text" size="5" maxlength="5" value="<jsp:getProperty name="clientshelper" property="port" />" ><br>
|
||||
<%=intl._("I2CP Interface")%>:
|
||||
<select name="interface">
|
||||
<%
|
||||
String[] ips = clientshelper.intfcAddresses();
|
||||
for (int i = 0; i < ips.length; i++) {
|
||||
out.print("<option value=\"");
|
||||
out.print(ips[i]);
|
||||
out.print('\"');
|
||||
if (clientshelper.isIFSelected(ips[i]))
|
||||
out.print(" selected=\"selected\"");
|
||||
out.print('>');
|
||||
out.print(ips[i]);
|
||||
out.print("</option>\n");
|
||||
}
|
||||
%>
|
||||
</select><br>
|
||||
<b><%=intl._("Authorization")%></b><br>
|
||||
<input type="checkbox" class="optbox" name="auth" value="true" <jsp:getProperty name="clientshelper" property="auth" /> >
|
||||
<%=intl._("Requre username and password")%><br>
|
||||
<%=intl._("Username")%>:
|
||||
<input name="user" type="text" value="<jsp:getProperty name="clientshelper" property="user" />" ><br>
|
||||
<%=intl._("Password")%>:
|
||||
<input name="pw" type="password" value="<jsp:getProperty name="clientshelper" property="pw" />" ><br>
|
||||
</p><p><b><%=intl._("The default settings will work for most people.")%></b>
|
||||
<%=intl._("Any changes made here must also be configured in the external client.")%>
|
||||
<%=intl._("Many clients do not support SSL or authorization.")%>
|
||||
<i><%=intl._("All changes require restart to take effect.")%></i>
|
||||
</p><hr><div class="formaction">
|
||||
<input type="submit" name="foo" value="<%=intl._("Cancel")%>" />
|
||||
<input type="submit" name="action" value="<%=intl._("Save Interface Configuration")%>" />
|
||||
</div>
|
||||
|
||||
<h3><a name="webapp"></a><%=intl._("WebApp Configuration")%></h3><p>
|
||||
<%=intl._("The Java web applications listed below are started by the webConsole client and run in the same JVM as the router. They are usually web applications accessible through the router console. They may be complete applications (e.g. i2psnark),front-ends to another client or application which must be separately enabled (e.g. susidns, i2ptunnel), or have no web interface at all (e.g. addressbook).")%>
|
||||
</p><p>
|
||||
<%=intl._("A web app may also be disabled by removing the .war file from the webapps directory; however the .war file and web app will reappear when you update your router to a newer version, so disabling the web app here is the preferred method.")%>
|
||||
|
@ -714,7 +714,7 @@ input {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
input[type=text], input[type=password] {
|
||||
margin: 3px 5px 3px 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
@ -910,4 +910,4 @@ div.footnote hr{
|
||||
margin-top: -8px;
|
||||
margin-bottom: -5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
@ -843,7 +843,7 @@ input:active {
|
||||
color: #EE9;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
input[type=text], input[type=password] {
|
||||
background: #000;
|
||||
color: #EE9;
|
||||
margin: 5px 10px;
|
||||
@ -859,7 +859,7 @@ input[type=text] {
|
||||
box-shadow: inset 1px 1px 1px 0px #000;
|
||||
}
|
||||
|
||||
input[type=text]:active, input[type=text]:hover {
|
||||
input[type=text]:active, input[type=text]:hover, input[type=password]:active, input[type=password]:hover {
|
||||
background: #000;
|
||||
}
|
||||
|
||||
@ -1058,4 +1058,4 @@ div.footnote hr{
|
||||
margin-top: -5px;
|
||||
margin-bottom: -5px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
@ -911,7 +911,7 @@ input:active {
|
||||
-moz-box-shadow: inset 0px 0px 0px 1px #f60;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
input[type=text], input[type=password] {
|
||||
background: #ffe;
|
||||
color: #001;
|
||||
margin: 5px 10px 5px 10px;
|
||||
@ -1166,4 +1166,4 @@ div.footnote hr{
|
||||
margin-top: 0px;
|
||||
margin-bottom: -18px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
@ -750,7 +750,7 @@ input {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
input[type=text] {
|
||||
input[type=text], input[type=password] {
|
||||
margin: 3px 5px 3px 5px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
@ -760,7 +760,7 @@ select {
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
input[type=text], select {
|
||||
input[type=text], input[type=password] select {
|
||||
background: #001;
|
||||
color: #eef;
|
||||
border: 1px solid #99f;
|
||||
@ -959,4 +959,4 @@ div.footnote hr{
|
||||
margin-top: -5px;
|
||||
margin-bottom: -10px;
|
||||
margin-right: 5px;
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user