From d8baf62966dedfcaf23aa3ad6269842a34cec37f Mon Sep 17 00:00:00 2001 From: zzz <zzz@mail.i2p> Date: Sun, 19 Apr 2015 03:11:37 +0000 Subject: [PATCH] I2CP Multisession - Work in progress: Stub out hardcoded list of DSA-only destinations Tweak client name length in summary bar Force initial leaseset request for subsession Send SessionStatus msg before LS request for subsession --- .../src/net/i2p/router/web/SummaryHelper.java | 4 +-- .../streaming/impl/I2PSocketManagerFull.java | 36 +++++++++++++++++-- .../net/i2p/router/client/ClientManager.java | 6 +++- .../client/ClientMessageEventListener.java | 7 ++-- .../router/tunnel/pool/AliasedTunnelPool.java | 1 + .../i2p/router/tunnel/pool/TunnelPool.java | 2 +- 6 files changed, 48 insertions(+), 8 deletions(-) diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java index e97dd34806..a458b60ee7 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java @@ -435,10 +435,10 @@ public class SummaryHelper extends HelperBase { buf.append("client.png\" alt=\"Client\" title=\"").append(_("Client")).append("\">"); buf.append("</td><td align=\"left\"><b><a href=\"tunnels#").append(h.toBase64().substring(0,4)); buf.append("\" target=\"_top\" title=\"").append(_("Show tunnels")).append("\">"); - if (name.length() < 18) + if (name.length() <= 20) buf.append(DataHelper.escapeHTML(name)); else - buf.append(DataHelper.escapeHTML(name.substring(0,15))).append("…"); + buf.append(DataHelper.escapeHTML(name.substring(0,18))).append("…"); buf.append("</a></b></td>\n"); LeaseSet ls = _context.netDb().lookupLeaseSetLocally(h); if (ls != null && _context.tunnelManager().getOutboundClientTunnelCount(h) > 0) { diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java index 20e3ff55c3..a501a8d224 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketManagerFull.java @@ -11,6 +11,7 @@ import java.net.Socket; import java.net.SocketTimeoutException; import java.util.HashSet; import java.util.List; +import java.util.Map; import java.util.Properties; import java.util.Set; import java.util.concurrent.ConcurrentHashMap; @@ -29,9 +30,11 @@ import net.i2p.client.streaming.I2PSocketOptions; import net.i2p.crypto.SigType; import net.i2p.data.Certificate; import net.i2p.data.Destination; +import net.i2p.data.Hash; import net.i2p.data.PrivateKey; import net.i2p.data.PublicKey; import net.i2p.data.SimpleDataStructure; +import net.i2p.util.ConvertToHash; import net.i2p.util.Log; /** @@ -57,7 +60,23 @@ public class I2PSocketManagerFull implements I2PSocketManager { private static final AtomicInteger __managerId = new AtomicInteger(); private final ConnectionManager _connectionManager; private final AtomicBoolean _isDestroyed = new AtomicBoolean(); + + private static final Set<Hash> _dsaOnly = new HashSet<Hash>(16); + private static final String[] DSA_ONLY_HASHES = { + "3t5Ar2NCTIOId70uzX2bZyJljR0aBogxMEzNyHirB7A=" // forum.i2p + }; + static { + for (int i = 0; i < DSA_ONLY_HASHES.length; i++) { + String s = DSA_ONLY_HASHES[i]; + Hash h = ConvertToHash.getHash(s); + if (h != null) + _dsaOnly.add(h); + else + System.out.println("Bad hash " + s); + } + } + /** * How long to wait for the client app to accept() before sending back CLOSE? * This includes the time waiting in the queue. Currently set to 5 seconds. @@ -401,9 +420,22 @@ public class I2PSocketManagerFull implements I2PSocketManager { if (_log.shouldLog(Log.INFO)) _log.info("Connecting to " + peer.calculateHash().toBase64().substring(0,6) + " with options: " + opts); -// fixme pick the subsession here + // pick the subsession here + ConnectionManager cm = _connectionManager; + if (!_subsessions.isEmpty()) { + Hash h = peer.calculateHash(); + if (_dsaOnly.contains(h)) { + // FIXME just taking the first one for now + for (Map.Entry<I2PSession, ConnectionManager> e : _subsessions.entrySet()) { + if (e.getKey().getMyDestination().getSigType() == SigType.DSA_SHA1) { + cm = e.getValue(); + break; + } + } + } + } // the following blocks unless connect delay > 0 - Connection con = _connectionManager.connect(peer, opts); + Connection con = cm.connect(peer, opts); if (con == null) throw new TooManyStreamsException("Too many streams, max " + _defaultOptions.getMaxConns()); I2PSocketFull socket = new I2PSocketFull(con,_context); diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java index f8fc2bb8e3..5004baedd0 100644 --- a/router/java/src/net/i2p/router/client/ClientManager.java +++ b/router/java/src/net/i2p/router/client/ClientManager.java @@ -401,7 +401,7 @@ class ClientManager { public void requestLeaseSet(Destination dest, LeaseSet set, long timeout, Job onCreateJob, Job onFailedJob) { ClientConnectionRunner runner = getRunner(dest); if (runner == null) { - if (_log.shouldLog(Log.ERROR)) + if (_log.shouldLog(Log.WARN)) _log.warn("Cannot request the lease set, as we can't find a client runner for " + dest.calculateHash().toBase64() + ". disconnected?"); _ctx.jobQueue().addJob(onFailedJob); @@ -424,6 +424,10 @@ class ClientManager { if (runner != null) { // no need to fire off any jobs... runner.requestLeaseSet(dest, ls, REQUEST_LEASESET_TIMEOUT, null, null); + } else { + if (_log.shouldLog(Log.WARN)) + _log.warn("Cannot request the lease set, as we can't find a client runner for " + + dest + ". disconnected?"); } } diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index ead5dcd262..628d8b0a5d 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -289,16 +289,19 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi if (pcfg != null) { ClientTunnelSettings settings = new ClientTunnelSettings(dest.calculateHash()); settings.readFromProperties(props); + // addAlias() sends the create lease set msg, so we have to send the SMS first + sendStatusMessage(id, status); boolean ok = _context.tunnelManager().addAlias(dest, settings, pcfg.getDestination()); if (!ok) { _log.error("Add alias failed"); - status = SessionStatusMessage.STATUS_REFUSED; + // FIXME cleanup } } else { _log.error("no primary config?"); status = SessionStatusMessage.STATUS_INVALID; + sendStatusMessage(id, status); + // FIXME cleanup } - sendStatusMessage(id, status); } } diff --git a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java index 05132c9ade..d4d6ccc23a 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java @@ -34,6 +34,7 @@ public class AliasedTunnelPool extends TunnelPool { if (_log.shouldLog(Log.INFO)) _log.info(toString() + ": Startup() called, was already alive? " + _alive, new Exception()); _alive = true; + super.refreshLeaseSet(); } @Override diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java index b69caa7896..ef6403a5bc 100644 --- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java +++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java @@ -607,7 +607,7 @@ public class TunnelPool { if (_settings.isInbound() && !_settings.isExploratory()) { if (_log.shouldLog(Log.DEBUG)) _log.debug(toString() + ": refreshing leaseSet on tunnel expiration (but prior to grace timeout)"); - LeaseSet ls = null; + LeaseSet ls; synchronized (_tunnels) { ls = locked_buildNewLeaseSet(); } -- GitLab