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