From bfa02f3b8242b4bce926bd8ded3f934cba889f2d Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 1 Mar 2009 19:25:49 +0000 Subject: [PATCH] * I2PTunnel: - Add persistent key option for clients (not hooked in yet) - I2PSink: Send protocol byte --- .../i2p/i2ptunnel/I2PTunnelClientBase.java | 3 + .../net/i2p/i2ptunnel/TunnelController.java | 3 +- .../src/net/i2p/i2ptunnel/udp/I2PSink.java | 3 +- .../i2p/i2ptunnel/udp/I2PSinkAnywhere.java | 3 +- .../src/net/i2p/i2ptunnel/web/EditBean.java | 4 ++ .../src/net/i2p/i2ptunnel/web/IndexBean.java | 13 ++-- apps/i2ptunnel/jsp/editClient.jsp | 68 +++++++++++++------ apps/i2ptunnel/jsp/editServer.jsp | 4 +- 8 files changed, 70 insertions(+), 31 deletions(-) diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java index 38311eaf1d..c926156f42 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java @@ -230,6 +230,9 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna I2PSocketManager sockManager = null; while (sockManager == null) { + // if persistent dest + // sockManager = I2PSocketManagerFactory.createManager(privData, tunnel.host, portNum, props); + // else sockManager = I2PSocketManagerFactory.createManager(tunnel.host, portNum, props); if (sockManager == null) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java index 9cb3762ac9..727b181581 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java @@ -58,7 +58,7 @@ public class TunnelController implements Logging { setConfig(config, prefix); _messages = new ArrayList(4); _running = false; - if (createKey && getType().endsWith("server")) + if (createKey && (getType().endsWith("server") || getPersistentClientKey())) createPrivateKey(); _starting = getStartOnLoad(); } @@ -395,6 +395,7 @@ public class TunnelController implements Logging { public String getProxyList() { return _config.getProperty("proxyList"); } public String getSharedClient() { return _config.getProperty("sharedClient", "true"); } public boolean getStartOnLoad() { return "true".equalsIgnoreCase(_config.getProperty("startOnLoad", "true")); } + public boolean getPersistentClientKey() { return Boolean.valueOf(_config.getProperty("persistentClientKey")).booleanValue(); } public String getMyDestination() { if (_tunnel != null) { List sessions = _tunnel.getSessions(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java index 3cbccf139e..6a32801b7b 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSink.java @@ -44,7 +44,8 @@ public class I2PSink implements Sink { // send message try { - this.sess.sendMessage(this.dest, payload); + this.sess.sendMessage(this.dest, payload, I2PSession.PROTO_DATAGRAM, + I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); } catch(I2PSessionException exc) { // TODO: handle better exc.printStackTrace(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java index 58c5bfda49..8707d97794 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udp/I2PSinkAnywhere.java @@ -42,7 +42,8 @@ public class I2PSinkAnywhere implements Sink { // send message try { - this.sess.sendMessage(to, payload); + this.sess.sendMessage(to, payload, I2PSession.PROTO_DATAGRAM, + I2PSession.PORT_UNSPECIFIED, I2PSession.PORT_UNSPECIFIED); } catch(I2PSessionException exc) { // TODO: handle better exc.printStackTrace(); diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java index e62bd25004..e68d140c5c 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java @@ -156,6 +156,10 @@ public class EditBean extends IndexBean { return getBooleanProperty(tunnel, "i2cp.newDestOnResume"); } + public boolean getPersistentClientKey(int tunnel) { + return getBooleanProperty(tunnel, "persistentClientKey"); + } + private int getProperty(int tunnel, String prop, int def) { TunnelController tun = getController(tunnel); if (tun != null) { diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java index 6fcd9f2fe3..cc1c0d558e 100644 --- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java +++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java @@ -614,8 +614,11 @@ public class IndexBean { public void setAccess(String moo) { _booleanOptions.add("i2cp.enableAccessList"); } - public void setNewDest(String moo) { - _booleanOptions.add("i2cp.newDestOnResume"); + public void setNewDest(String val) { + if ("1".equals(val)) + _booleanOptions.add("i2cp.newDestOnResume"); + else if ("2".equals(val)) + _booleanOptions.add("persistentClientKey"); } public void setReduceTime(String val) { @@ -790,8 +793,6 @@ public class IndexBean { config.setProperty("targetHost", _targetHost); if (_targetPort != null) config.setProperty("targetPort", _targetPort); - if (_privKeyFile != null) - config.setProperty("privKeyFile", _privKeyFile); for (String p : _booleanServerOpts) config.setProperty("option." + p, "" + _booleanOptions.contains(p)); for (String p : _otherServerOpts) @@ -819,7 +820,7 @@ public class IndexBean { "inbound.nickname", "outbound.nickname", "i2p.streaming.connectDelay", "i2p.streaming.maxWindowSize" }; private static final String _booleanClientOpts[] = { - "i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume" + "i2cp.reduceOnIdle", "i2cp.closeOnIdle", "i2cp.newDestOnResume", "persistentClientKey" }; private static final String _booleanServerOpts[] = { "i2cp.reduceOnIdle", "i2cp.encryptLeaseSet", "i2cp.enableAccessList" @@ -852,6 +853,8 @@ public class IndexBean { } else { config.setProperty("i2cpPort", "7654"); } + if (_privKeyFile != null) + config.setProperty("privKeyFile", _privKeyFile); if (_customOptions != null) { StringTokenizer tok = new StringTokenizer(_customOptions); diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp index 6a796eb7df..3c046baddc 100644 --- a/apps/i2ptunnel/jsp/editClient.jsp +++ b/apps/i2ptunnel/jsp/editClient.jsp @@ -288,6 +288,34 @@ <hr /> </div> + <div id="optionsField" class="rowItem"> + <label for="reduce" accesskey="d"> + Re<span class="accessKey">d</span>uce tunnel quantity when idle: + </label> + </div> + <div id="portField" class="rowItem"> + <label for="access" accesskey="d"> + Enable: + </label> + <input value="1" type="checkbox" id="startOnLoad" name="reduce" title="Reduce Tunnels"<%=(editBean.getReduce(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" /> + </div> + <div id="portField" class="rowItem"> + <label for="reduceCount" accesskey="d"> + Reduced tunnel count: + </label> + <input type="text" id="port" name="reduceCount" size="1" maxlength="1" title="Reduced Tunnel Count" value="<%=editBean.getReduceCount(curTunnel)%>" class="freetext" /> + </div> + <div id="portField" class="rowItem"> + <label for="reduceTime" accesskey="d"> + Reduce when idle (minutes): + </label> + <input type="text" id="port" name="reduceTime" size="4" maxlength="4" title="Reduced Tunnel Idle Time" value="<%=editBean.getReduceTime(curTunnel)%>" class="freetext" /> + </div> + + <div class="subdivider"> + <hr /> + </div> + <div id="optionsField" class="rowItem"> <label for="reduce" accesskey="c"> <span class="accessKey">C</span>lose tunnels when idle: @@ -303,43 +331,41 @@ <label for="access" accesskey="c"> Generate New Destination Keys On Reopen: </label> - <input value="1" type="checkbox" id="startOnLoad" name="newDest" title="New Destination"<%=(editBean.getNewDest(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" /> + <table border="0"><tr><!-- I give up --> + <td><input value="1" type="radio" id="startOnLoad" name="newDest" title="New Destination" + <%=(editBean.getNewDest(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" /> + <td valign="center">Enable + <td><input value="0" type="radio" id="startOnLoad" name="newDest" title="New Destination" + <%=(editBean.getNewDest(curTunnel) || editBean.getPersistentClientKey(curTunnel) ? "" : " checked=\"checked\"")%> class="tickbox" /> + <td valign="center">Disable + </table> </div> <div id="portField" class="rowItem"> <label for="reduceTime" accesskey="c"> Close when idle (minutes): </label> - <input type="text" id="port" name="closeTime" size="4" maxlength="4" title="Reduced Tunnel Idle Time" value="<%=editBean.getCloseTime(curTunnel)%>" class="freetext" /> + <input type="text" id="port" name="closeTime" size="4" maxlength="4" title="Close Tunnel Idle Time" value="<%=editBean.getCloseTime(curTunnel)%>" class="freetext" /> </div> <div class="subdivider"> <hr /> </div> - + <div id="optionsField" class="rowItem"> - <label for="reduce" accesskey="d"> - Re<span class="accessKey">d</span>uce tunnel quantity when idle: + <label for="privKeyFile" accesskey="k"> + Persistent private <span class="accessKey">k</span>ey: </label> </div> <div id="portField" class="rowItem"> - <label for="access" accesskey="d"> - Enable: - </label> - <input value="1" type="checkbox" id="startOnLoad" name="reduce" title="Reduce Tunnels"<%=(editBean.getReduce(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" /> + <label>Enable:</label> + <input value="2" type="radio" id="startOnLoad" name="newDest" title="New Destination" + <%=(editBean.getPersistentClientKey(curTunnel) ? " checked=\"checked\"" : "")%> class="tickbox" /> </div> - <div id="portField" class="rowItem"> - <label for="reduceCount" accesskey="d"> - Reduced tunnel count: - </label> - <input type="text" id="port" name="reduceCount" size="1" maxlength="1" title="Reduced Tunnel Count" value="<%=editBean.getReduceCount(curTunnel)%>" class="freetext" /> - </div> - <div id="portField" class="rowItem"> - <label for="reduceTime" accesskey="d"> - Reduce when idle (minutes): - </label> - <input type="text" id="port" name="reduceTime" size="4" maxlength="4" title="Reduced Tunnel Idle Time" value="<%=editBean.getReduceTime(curTunnel)%>" class="freetext" /> + <div id="reachField" class="rowItem"> + <label>File:</label> + <input type="text" size="30" id="clientHost" name="privKeyFile" title="Path to Private Key File" value="<%=editBean.getPrivateKeyFile(curTunnel)%>" class="freetext" /> </div> - + <div class="subdivider"> <hr /> </div> diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp index 70a9df9f72..dbcd6bd865 100644 --- a/apps/i2ptunnel/jsp/editServer.jsp +++ b/apps/i2ptunnel/jsp/editServer.jsp @@ -272,9 +272,9 @@ </div> <div id="portField" class="rowItem"> <label for="force" accesskey="c"> - Generate Key: + Generate New Key: </label> - <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now">Generate New Key</button> + <button id="controlSave" accesskey="S" class="control" type="submit" name="action" value="Generate" title="Generate New Key Now">Generate</button> <span class="comment">(Tunnel must be stopped first)</span> </div> -- GitLab