From de5f2940ceb19ec3c939aaead37ede4e22bfaa8c Mon Sep 17 00:00:00 2001 From: zzz Date: Fri, 30 Aug 2013 10:27:22 +0000 Subject: [PATCH] * SSU, confignet: Add support for specifiying multiple addresses --- .../net/i2p/router/web/ConfigNetHandler.java | 58 +++++++++++++------ .../net/i2p/router/web/ConfigNetHelper.java | 56 +++++++++++++++--- apps/routerconsole/jsp/confignet.jsp | 20 +------ history.txt | 5 ++ .../src/net/i2p/router/RouterVersion.java | 2 +- .../router/transport/udp/UDPTransport.java | 54 ++++++++++++----- 6 files changed, 137 insertions(+), 58 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java index cece337513..9765d0dbe8 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHandler.java @@ -1,9 +1,12 @@ package net.i2p.router.web; import java.util.ArrayList; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Set; +import java.util.TreeSet; import net.i2p.router.Router; import net.i2p.router.transport.FIFOBandwidthRefiller; @@ -94,9 +97,6 @@ public class ConfigNetHandler extends FormHandler { public void setUdpHost1(String host) { _udpHost1 = (host != null ? host.trim() : null); } - public void setUdpHost2(String host) { - _udpHost2 = (host != null ? host.trim() : null); - } public void setUdpPort(String port) { _udpPort = (port != null ? port.trim() : null); } @@ -160,26 +160,48 @@ public class ConfigNetHandler extends FormHandler { if (_udpAutoIP != null) { String uhost = ""; if (_udpAutoIP.equals("fixed")) { - if (_udpHost1 != null && _udpHost1.length() > 0) - uhost = _udpHost1; - else if (_udpHost2 != null && _udpHost2.length() > 0) - uhost = _udpHost2; - else - _udpAutoIP = UDPTransport.DEFAULT_SOURCES; - } - changes.put(UDPTransport.PROP_SOURCES, _udpAutoIP); - boolean valid = true; - if (uhost.length() > 0) { - valid = verifyAddress(uhost); - if (valid) { + if (_settings == null) + _settings = Collections.EMPTY_MAP; + Set addrs = new TreeSet(); + for (Object o : _settings.keySet()) { + String k = (String) o; + if (k.startsWith("addr_")) { + String v = k.substring(5); + if (v.length() > 0) + addrs.add(v); + } + } + if (getJettyString("addrnew") != null) { + if (_udpHost1 != null && _udpHost1.length() > 0) { + if (verifyAddress(_udpHost1)) { + addrs.add(_udpHost1); + } else { + error = true; + } + } + } + int tot = addrs.size(); + int i = 0; + if (tot > 0) { + StringBuilder buf = new StringBuilder(128); + for (String addr : addrs) { + buf.append(addr); + if (++i < tot) + buf.append(','); + } + uhost = buf.toString(); changes.put(UDPTransport.PROP_EXTERNAL_HOST, uhost); } else { - error = true; + _udpAutoIP = UDPTransport.DEFAULT_SOURCES; + removes.add(UDPTransport.PROP_EXTERNAL_HOST); } } else { - removes.add(UDPTransport.PROP_EXTERNAL_HOST); + // not fixed + if (oldUHost.length() > 0) + removes.add(UDPTransport.PROP_EXTERNAL_HOST); } - if (valid && ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost)))) { + changes.put(UDPTransport.PROP_SOURCES, _udpAutoIP); + if ((!oldUdp.equals(_udpAutoIP)) || (!oldUHost.equals(uhost))) { addFormNotice(_("Updating IP address")); restartRequired = true; } diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java index 1d90ba66f9..3263e2fa8d 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java @@ -1,6 +1,9 @@ package net.i2p.router.web; import java.util.ArrayList; +import java.util.Collections; +import java.util.HashSet; +import java.util.Set; import net.i2p.data.DataHelper; import net.i2p.data.RouterAddress; @@ -18,10 +21,10 @@ import net.i2p.util.Addresses; public class ConfigNetHelper extends HelperBase { /** copied from various private components */ - public final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname"; - public final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port"; - public final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport"; - public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip"; + final static String PROP_I2NP_NTCP_HOSTNAME = "i2np.ntcp.hostname"; + final static String PROP_I2NP_NTCP_PORT = "i2np.ntcp.port"; + final static String PROP_I2NP_NTCP_AUTO_PORT = "i2np.ntcp.autoport"; + final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip"; private final static String CHECKED = " checked=\"checked\" "; public String getUdphostname() { @@ -175,9 +178,48 @@ public class ConfigNetHelper extends HelperBase { return ""; } - public String[] getAddresses() { - ArrayList al = new ArrayList(Addresses.getAddresses()); - return al.toArray(new String[al.size()]); + public Set getAddresses() { + // exclude local, include IPv6 + return Addresses.getAddresses(false, true); + } + + /** @since IPv6 */ + public String getAddressSelector() { + Set addrs = getAddresses(); + Set configs; + String cs = getUdphostname(); + if (cs.length() <= 0) { + configs = Collections.EMPTY_SET; + } else { + configs = new HashSet(4); + String[] ca = cs.split("[,; \r\n\t]"); + for (int i = 0; i < ca.length; i++) { + String c = ca[i]; + if (c.length() > 0) { + configs.add(c); + addrs.add(c); + } + } + } + StringBuilder buf = new StringBuilder(128); + buf.append("
"); + for (String addr : addrs) { + buf.append("\n      " + + " "); + buf.append(addr); + buf.append("
"); + } + buf.append("\n      " + + "" + + "
"); + return buf.toString(); } public String getInboundRate() { diff --git a/apps/routerconsole/jsp/confignet.jsp b/apps/routerconsole/jsp/confignet.jsp index a97b2d49b3..d0e32405f1 100644 --- a/apps/routerconsole/jsp/confignet.jsp +++ b/apps/routerconsole/jsp/confignet.jsp @@ -40,25 +40,11 @@ <%=intl._("Ignore local interface IP address")%>
> <%=intl._("Use SSU IP address detection only")%>
- > - <%=intl._("Specify hostname or IP")%>: - " > - <% String[] ips = nethelper.getAddresses(); - if (ips.length > 0) { - out.print(intl._("or") + " \n"); - } - %> -
> <%=intl._("Hidden mode - do not publish IP")%> <%=intl._("(prevents participating traffic)")%>
+ > + <%=intl._("Specify hostname or IP")%>:
+ <%=nethelper.getAddressSelector() %>

<%=intl._("Action when IP changes")%>:
> diff --git a/history.txt b/history.txt index 4b429fcf61..7cf6a59346 100644 --- a/history.txt +++ b/history.txt @@ -1,3 +1,8 @@ +2013-08-30 zzz + * Addresses: Treat Teredo addresses 2001:0::/32 as local + * SSU, confignet: Add support for specifiying multiple addresses + * SusiDNS: Don't require last subscription to be terminated by newline (ticket #1000) + 2013-08-11 zzz * Jetty 7.6.12.v20130726 diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index f5c9264549..43dca92409 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -18,7 +18,7 @@ public class RouterVersion { /** deprecated */ public final static String ID = "Monotone"; public final static String VERSION = CoreVersion.VERSION; - public final static long BUILD = 20; + public final static long BUILD = 21; /** for example "-test" */ public final static String EXTRA = ""; diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java index 9889303158..562fb456da 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -329,15 +329,21 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } - InetAddress bindToAddr = null; + List bindToAddrs = new ArrayList(4); if (bindTo != null) { - try { - bindToAddr = InetAddress.getByName(bindTo); - } catch (UnknownHostException uhe) { - _log.error("Invalid SSU bind interface specified [" + bindTo + "]", uhe); - //setReachabilityStatus(CommSystemFacade.STATUS_HOSED); - //return; - // fall thru... + String[] bta = bindTo.split("[,; \r\n\t]"); + for (int i = 0; i < bta.length; i++) { + String bt = bta[i]; + if (bt.length() <= 0) + continue; + try { + bindToAddrs.add(InetAddress.getByName(bt)); + } catch (UnknownHostException uhe) { + _log.error("Invalid SSU bind interface specified [" + bt + "]", uhe); + //setReachabilityStatus(CommSystemFacade.STATUS_HOSED); + //return; + // fall thru... + } } } @@ -355,15 +361,23 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority port = oldBindPort; else port = oldEPort; - if (bindToAddr != null && _log.shouldLog(Log.WARN)) - _log.warn("Binding only to " + bindToAddr); + if (!bindToAddrs.isEmpty() && _log.shouldLog(Log.WARN)) + _log.warn("Binding only to " + bindToAddrs); if (_log.shouldLog(Log.INFO)) _log.info("Binding to the port: " + port); if (_endpoints.isEmpty()) { // will always be empty since we are removing them above - UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, bindToAddr); - _endpoints.add(endpoint); - // TODO add additional endpoints for additional addresses/ports + if (bindToAddrs.isEmpty()) { + UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, null); + _endpoints.add(endpoint); + setMTU(null); + } else { + for (InetAddress bindToAddr : bindToAddrs) { + UDPEndpoint endpoint = new UDPEndpoint(_context, this, port, bindToAddr); + _endpoints.add(endpoint); + setMTU(bindToAddr); + } + } } else { // unused for now for (UDPEndpoint endpoint : _endpoints) { @@ -375,7 +389,6 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority } } } - setMTU(bindToAddr); if (_establisher == null) _establisher = new EstablishmentManager(_context, this); @@ -440,7 +453,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority // set up external addresses // REA param is false; // TransportManager.startListening() calls router.rebuildRouterInfo() - if (newPort > 0 && bindToAddr == null) { + if (newPort > 0 && bindToAddrs.isEmpty()) { for (InetAddress ia : getSavedLocalAddresses()) { rebuildExternalAddress(ia.getHostAddress(), newPort, false); } @@ -1725,6 +1738,17 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority String host = null; if (explicitAddressSpecified()) { host = _context.getProperty(PROP_EXTERNAL_HOST); + if (host != null) { + String[] hosts = host.split("[,; \r\n\t]"); + RouterAddress rv = null; + for (int i = 0; i < hosts.length; i++) { + String h = hosts[i]; + if (h.length() <= 0) + continue; + rv = rebuildExternalAddress(h, port, allowRebuildRouterInfo); + } + return rv; + } } else { RouterAddress cur = getCurrentAddress(false); if (cur != null)