From c2b73d9fb562c16d0f0e5608cc306132cc991eca Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Mon, 10 May 2010 14:13:55 +0000
Subject: [PATCH]     * i2psnark:       - Add tunnel config dropdowns       -
 Comment out old proxy stuff

---
 .../src/org/klomp/snark/I2PSnarkUtil.java     |  8 ++-
 .../java/src/org/klomp/snark/Snark.java       | 16 ++---
 .../src/org/klomp/snark/SnarkManager.java     | 53 +++++++-------
 .../org/klomp/snark/web/I2PSnarkServlet.java  | 71 ++++++++++++++++++-
 4 files changed, 110 insertions(+), 38 deletions(-)

diff --git a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
index 35139420c2..a82debab36 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/I2PSnarkUtil.java
@@ -45,7 +45,7 @@ public class I2PSnarkUtil {
     private int _proxyPort;
     private String _i2cpHost;
     private int _i2cpPort;
-    private Map _opts;
+    private Map<String, String> _opts;
     private I2PSocketManager _manager;
     private boolean _configured;
     private final Set<Hash> _shitlist;
@@ -65,7 +65,7 @@ public class I2PSnarkUtil {
         _context = ctx;
         _log = _context.logManager().getLog(Snark.class);
         _opts = new HashMap();
-        setProxy("127.0.0.1", 4444);
+        //setProxy("127.0.0.1", 4444);
         setI2CPConfig("127.0.0.1", 7654, null);
         _shitlist = new ConcurrentHashSet();
         _configured = false;
@@ -85,6 +85,7 @@ public class I2PSnarkUtil {
      * host for no proxying)
      *
      */
+/*****
     public void setProxy(String host, int port) {
         if ( (host != null) && (port > 0) ) {
             _shouldProxy = true;
@@ -97,6 +98,7 @@ public class I2PSnarkUtil {
         }
         _configured = true;
     }
+******/
     
     public boolean configured() { return _configured; }
     
@@ -128,7 +130,7 @@ public class I2PSnarkUtil {
     
     public String getI2CPHost() { return _i2cpHost; }
     public int getI2CPPort() { return _i2cpPort; }
-    public Map getI2CPOptions() { return _opts; }
+    public Map<String, String> getI2CPOptions() { return _opts; }
     public String getEepProxyHost() { return _proxyHost; }
     public int getEepProxyPort() { return _proxyPort; }
     public boolean getEepProxySet() { return _shouldProxy; }
diff --git a/apps/i2psnark/java/src/org/klomp/snark/Snark.java b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
index 217cc00a77..12c299840e 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Snark.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Snark.java
@@ -618,14 +618,14 @@ public class Snark
             command_interpreter = false;
             i++;
           }
-        else if (args[i].equals("--eepproxy"))
-          {
-            String proxyHost = args[i+1];
-            String proxyPort = args[i+2];
-            if (!configured)
-                util.setProxy(proxyHost, Integer.parseInt(proxyPort));
-            i += 3;
-          }
+        //else if (args[i].equals("--eepproxy"))
+        //  {
+        //    String proxyHost = args[i+1];
+        //    String proxyPort = args[i+2];
+        //    if (!configured)
+        //        util.setProxy(proxyHost, Integer.parseInt(proxyPort));
+        //    i += 3;
+        //  }
         else if (args[i].equals("--i2cp"))
           {
             String i2cpHost = args[i+1];
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index 33f74707ec..f93f009ee5 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -46,8 +46,8 @@ public class SnarkManager implements Snark.CompleteListener {
     public static final String PROP_I2CP_HOST = "i2psnark.i2cpHost";
     public static final String PROP_I2CP_PORT = "i2psnark.i2cpPort";
     public static final String PROP_I2CP_OPTS = "i2psnark.i2cpOptions";
-    public static final String PROP_EEP_HOST = "i2psnark.eepHost";
-    public static final String PROP_EEP_PORT = "i2psnark.eepPort";
+    //public static final String PROP_EEP_HOST = "i2psnark.eepHost";
+    //public static final String PROP_EEP_PORT = "i2psnark.eepPort";
     public static final String PROP_UPLOADERS_TOTAL = "i2psnark.uploaders.total";
     public static final String PROP_UPBW_MAX = "i2psnark.upbw.max";
     public static final String PROP_DIR = "i2psnark.dir";
@@ -157,10 +157,10 @@ public class SnarkManager implements Snark.CompleteListener {
             _config.setProperty(PROP_I2CP_PORT, "7654");
         if (!_config.containsKey(PROP_I2CP_OPTS))
             _config.setProperty(PROP_I2CP_OPTS, "inbound.length=2 inbound.lengthVariance=0 outbound.length=2 outbound.lengthVariance=0 inbound.quantity=3 outbound.quantity=3");
-        if (!_config.containsKey(PROP_EEP_HOST))
-            _config.setProperty(PROP_EEP_HOST, "127.0.0.1");
-        if (!_config.containsKey(PROP_EEP_PORT))
-            _config.setProperty(PROP_EEP_PORT, "4444");
+        //if (!_config.containsKey(PROP_EEP_HOST))
+        //    _config.setProperty(PROP_EEP_HOST, "127.0.0.1");
+        //if (!_config.containsKey(PROP_EEP_PORT))
+        //    _config.setProperty(PROP_EEP_PORT, "4444");
         if (!_config.containsKey(PROP_UPLOADERS_TOTAL))
             _config.setProperty(PROP_UPLOADERS_TOTAL, "" + Snark.MAX_TOTAL_UPLOADERS);
         if (!_config.containsKey(PROP_DIR))
@@ -198,10 +198,10 @@ public class SnarkManager implements Snark.CompleteListener {
             _log.debug("Configuring with I2CP options " + i2cpOpts);
         }
         //I2PSnarkUtil.instance().setI2CPConfig("66.111.51.110", 7654, new Properties());
-        String eepHost = _config.getProperty(PROP_EEP_HOST);
-        int eepPort = getInt(PROP_EEP_PORT, 4444);
-        if (eepHost != null)
-            _util.setProxy(eepHost, eepPort);
+        //String eepHost = _config.getProperty(PROP_EEP_HOST);
+        //int eepPort = getInt(PROP_EEP_PORT, 4444);
+        //if (eepHost != null)
+        //    _util.setProxy(eepHost, eepPort);
         _util.setMaxUploaders(getInt(PROP_UPLOADERS_TOTAL, Snark.MAX_TOTAL_UPLOADERS));
         _util.setMaxUpBW(getInt(PROP_UPBW_MAX, DEFAULT_MAX_UP_BW));
         String ot = _config.getProperty(I2PSnarkUtil.PROP_OPENTRACKERS);
@@ -226,20 +226,20 @@ public class SnarkManager implements Snark.CompleteListener {
                              String eepPort, String i2cpHost, String i2cpPort, String i2cpOpts,
                              String upLimit, String upBW, boolean useOpenTrackers, String openTrackers) {
         boolean changed = false;
-        if (eepHost != null) {
-            // unused, we use socket eepget
-            int port = _util.getEepProxyPort();
-            try { port = Integer.parseInt(eepPort); } catch (NumberFormatException nfe) {}
-            String host = _util.getEepProxyHost();
-            if ( (eepHost.trim().length() > 0) && (port > 0) &&
-                 ((!host.equals(eepHost) || (port != _util.getEepProxyPort()) )) ) {
-                _util.setProxy(eepHost, port);
-                changed = true;
-                _config.setProperty(PROP_EEP_HOST, eepHost);
-                _config.setProperty(PROP_EEP_PORT, eepPort+"");
-                addMessage("EepProxy location changed to " + eepHost + ":" + port);
-            }
-        }
+        //if (eepHost != null) {
+        //    // unused, we use socket eepget
+        //    int port = _util.getEepProxyPort();
+        //    try { port = Integer.parseInt(eepPort); } catch (NumberFormatException nfe) {}
+        //    String host = _util.getEepProxyHost();
+        //    if ( (eepHost.trim().length() > 0) && (port > 0) &&
+        //         ((!host.equals(eepHost) || (port != _util.getEepProxyPort()) )) ) {
+        //        _util.setProxy(eepHost, port);
+        //        changed = true;
+        //        _config.setProperty(PROP_EEP_HOST, eepHost);
+        //        _config.setProperty(PROP_EEP_PORT, eepPort+"");
+        //        addMessage("EepProxy location changed to " + eepHost + ":" + port);
+        //    }
+        //}
         if (upLimit != null) {
             int limit = _util.getMaxUploaders();
             try { limit = Integer.parseInt(upLimit); } catch (NumberFormatException nfe) {}
@@ -308,7 +308,10 @@ public class SnarkManager implements Snark.CompleteListener {
                     }
                 }
                 if (snarksActive) {
-                    addMessage(_("Cannot change the I2CP settings while torrents are active"));
+                    Properties p = new Properties();
+                    p.putAll(opts);
+                    _util.setI2CPConfig(i2cpHost, port, p);
+                    addMessage(_("I2CP and tunnel changes will take effect after stopping all torrents"));
                     _log.debug("i2cp host [" + i2cpHost + "] i2cp port " + port + " opts [" + opts 
                                + "] oldOpts [" + oldOpts + "]");
                 } else {
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 465f4f908e..0cb19835a7 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -419,7 +419,7 @@ public class I2PSnarkServlet extends Default {
             String eepPort = req.getParameter("eepPort");
             String i2cpHost = req.getParameter("i2cpHost");
             String i2cpPort = req.getParameter("i2cpPort");
-            String i2cpOpts = req.getParameter("i2cpOpts");
+            String i2cpOpts = buildI2CPOpts(req);
             String upLimit = req.getParameter("upLimit");
             String upBW = req.getParameter("upBW");
             boolean useOpenTrackers = req.getParameter("useOpenTrackers") != null;
@@ -486,6 +486,23 @@ public class I2PSnarkServlet extends Default {
         }
     }
     
+    private static final String iopts[] = {"inbound.length", "inbound.quantity",
+                                           "outbound.length", "outbound.quantity" };
+
+    /** put the individual i2cp selections into the option string */
+    private static String buildI2CPOpts(HttpServletRequest req) {
+        StringBuilder buf = new StringBuilder(128);
+        String p = req.getParameter("i2cpOpts");
+        if (p != null)
+            buf.append(p);
+        for (int i = 0; i < iopts.length; i++) {
+            p = req.getParameter(iopts[i]);
+            if (p != null)
+                buf.append(' ').append(iopts[i]).append('=').append(p);
+        }
+        return buf.toString();
+    }
+
     /**
      *  Sort alphabetically in current locale, ignore case, ignore leading "the "
      *  (I guess this is worth it, a lot of torrents start with "The "
@@ -982,6 +999,20 @@ public class I2PSnarkServlet extends Default {
         //out.write("port: <input type=\"text\" name=\"eepPort\" value=\""
         //          + _manager.util().getEepProxyPort() + "\" size=\"5\" maxlength=\"5\" /><br>\n");
 
+        Map<String, String> options = new TreeMap(_manager.util().getI2CPOptions());
+        out.write("<tr><td>");
+        out.write(_("Inbound Settings"));
+        out.write(":<td>");
+        out.write(renderOptions(1, 6, options.remove("inbound.quantity"), "inbound.quantity", TUNNEL));
+        out.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+        out.write(renderOptions(0, 4, options.remove("inbound.length"), "inbound.length", HOP));
+        out.write("<tr><td>");
+        out.write(_("Outbound Settings"));
+        out.write(":<td>");
+        out.write(renderOptions(1, 6, options.remove("outbound.quantity"), "outbound.quantity", TUNNEL));
+        out.write("&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;");
+        out.write(renderOptions(0, 4, options.remove("outbound.length"), "outbound.length", HOP));
+
         out.write("<tr><td>");
         out.write(_("I2CP host"));
         out.write(": <td><input type=\"text\" name=\"i2cpHost\" value=\"" 
@@ -993,7 +1024,6 @@ public class I2PSnarkServlet extends Default {
                   + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" > <br>\n");
 
         StringBuilder opts = new StringBuilder(64);
-        Map options = new TreeMap(_manager.util().getI2CPOptions());
         for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
             Map.Entry entry = (Map.Entry)iter.next();
             String key = (String)entry.getKey();
@@ -1012,6 +1042,38 @@ public class I2PSnarkServlet extends Default {
         out.write("</form></div>");
     }
     
+    /** copied from ConfigTunnelsHelper */
+    private static final String HOP = _x("hop");
+    private static final String TUNNEL = _x("tunnel");
+    /** dummies for translation */
+    private static final String HOPS = _x("hops");
+    private static final String TUNNELS = _x("tunnels");
+
+    /** modded from ConfigTunnelsHelper */
+    private String renderOptions(int min, int max, String strNow, String selName, String name) {
+        int now = 2;
+        try {
+            now = Integer.parseInt(strNow);
+        } catch (Throwable t) {}
+        StringBuilder buf = new StringBuilder(128);
+        buf.append("<select name=\"").append(selName).append("\">\n");
+        for (int i = min; i <= max; i++) {
+            buf.append("<option value=\"").append(i).append("\" ");
+            if (i == now)
+                buf.append("selected=\"true\" ");
+            String pname;
+            // pluralize and then translate
+            if (i != 1 && i != -1)
+                pname = name + 's';
+            else
+                pname = name;
+            buf.append(">").append(i).append(' ').append(_(pname));
+            buf.append("</option>\n");
+        }
+        buf.append("</select>\n");
+        return buf.toString();
+    }
+
     /** translate */
     private String _(String s) {
         return _manager.util().getString(s);
@@ -1022,6 +1084,11 @@ public class I2PSnarkServlet extends Default {
         return _manager.util().getString(s, o);
     }
 
+    /** dummy for tagging */
+    private static String _x(String s) {
+        return s;
+    }
+
     // rounding makes us look faster :)
     private String formatSize(long bytes) {
         if (bytes < 5*1024)
-- 
GitLab