diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NoticeHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NoticeHelper.java index 9ad54a1f1..07e930792 100644 --- a/apps/routerconsole/java/src/net/i2p/router/web/NoticeHelper.java +++ b/apps/routerconsole/java/src/net/i2p/router/web/NoticeHelper.java @@ -25,8 +25,11 @@ public class NoticeHelper { public String getSystemNotice() { if (_context.router().gracefulShutdownInProgress()) { - return "Graceful shutdown in " - + DataHelper.formatDuration(_context.router().getShutdownTimeRemaining()); + long remaining = _context.router().getShutdownTimeRemaining(); + if (remaining > 0) + return "Graceful shutdown in " + DataHelper.formatDuration(remaining); + else + return "Graceful shutdown imminent, please be patient as state is written to disk"; } else { return ""; } diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java index 9ece426b8..9da1b4aec 100644 --- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java +++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionManager.java @@ -129,6 +129,8 @@ public class ConnectionManager { } else { _connectionByInboundId.put(ba, oldCon); // receiveId already taken, try another + // (need to realloc receiveId, as ba.getData() points to the old value) + receiveId = new byte[4]; _context.random().nextBytes(receiveId); } } diff --git a/core/java/src/net/i2p/data/ByteArray.java b/core/java/src/net/i2p/data/ByteArray.java index b36efbc27..f0339a13c 100644 --- a/core/java/src/net/i2p/data/ByteArray.java +++ b/core/java/src/net/i2p/data/ByteArray.java @@ -27,8 +27,9 @@ public class ByteArray implements Serializable, Comparable { } public ByteArray(byte[] data) { + _offset = 0; _data = data; - _valid = 0; + _valid = (data != null ? data.length : 0); } public ByteArray(byte[] data, int offset, int length) { _data = data; diff --git a/core/java/src/net/i2p/data/SessionTag.java b/core/java/src/net/i2p/data/SessionTag.java index 9b5af9c73..fb0886a19 100644 --- a/core/java/src/net/i2p/data/SessionTag.java +++ b/core/java/src/net/i2p/data/SessionTag.java @@ -37,7 +37,8 @@ public class SessionTag extends ByteArray { } public void setData(byte val[]) throws IllegalArgumentException { - if (val == null) super.setData(null); + if (val == null) + throw new NullPointerException("SessionTags cannot be null"); if (val.length != BYTE_LENGTH) throw new IllegalArgumentException("SessionTags must be " + BYTE_LENGTH + " bytes"); super.setData(val); diff --git a/history.txt b/history.txt index 4c74b2cc8..c6303a94e 100644 --- a/history.txt +++ b/history.txt @@ -1,4 +1,10 @@ -$Id: history.txt,v 1.214 2005/07/19 16:00:25 jrandom Exp $ +$Id: history.txt,v 1.215 2005/07/20 14:24:47 jrandom Exp $ + +2005-07-21 jrandom + * Fix in the SDK for a bug which would manifest itself as misrouted + streaming packets when a destination has many concurrent streaming + connections (thanks duck!) + * No more "Graceful shutdown in -18140121441141s" 2005-07-20 jrandom * Allow the user to specify an external port # for SSU even if the external diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java index 4fcfe38be..3ae5b7df0 100644 --- a/router/java/src/net/i2p/router/RouterVersion.java +++ b/router/java/src/net/i2p/router/RouterVersion.java @@ -15,9 +15,9 @@ import net.i2p.CoreVersion; * */ public class RouterVersion { - public final static String ID = "$Revision: 1.205 $ $Date: 2005/07/19 16:00:26 $"; + public final static String ID = "$Revision: 1.206 $ $Date: 2005/07/20 14:24:47 $"; public final static String VERSION = "0.5.0.7"; - public final static long BUILD = 17; + public final static long BUILD = 18; public static void main(String args[]) { System.out.println("I2P Router version: " + VERSION); System.out.println("Router ID: " + RouterVersion.ID); 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 91242a213..9482445f9 100644 --- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java +++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java @@ -251,6 +251,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority if (explicitAddressSpecified()) return; + boolean updated = false; synchronized (this) { if ( (_externalListenHost == null) || (!eq(_externalListenHost.getAddress(), _externalListenPort, ourIP, ourPort)) ) { @@ -259,11 +260,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority _externalListenPort = ourPort; rebuildExternalAddress(); replaceAddress(_externalAddress); + updated = true; } catch (UnknownHostException uhe) { _externalListenHost = null; } } } + + if (updated) + _context.router().rebuildRouterInfo(); } private static final boolean eq(byte laddr[], int lport, byte raddr[], int rport) { diff --git a/router/java/src/net/i2p/router/tunnel/HopProcessor.java b/router/java/src/net/i2p/router/tunnel/HopProcessor.java index 9a900ed87..5947fcc64 100644 --- a/router/java/src/net/i2p/router/tunnel/HopProcessor.java +++ b/router/java/src/net/i2p/router/tunnel/HopProcessor.java @@ -24,6 +24,12 @@ public class HopProcessor { /** helpful flag for debugging */ static final boolean USE_ENCRYPTION = true; + /** + * as of i2p 0.6, the tunnel crypto will change by encrypting the IV both before + * and after using it at each hop so as to prevent a certain type of replay/confirmation + * attack. + */ + static final boolean USE_DOUBLE_IV_ENCRYPTION = false; static final int IV_LENGTH = 16; private static final ByteCache _cache = ByteCache.getInstance(128, IV_LENGTH); @@ -78,6 +84,8 @@ public class HopProcessor { //_log.debug("Before:" + Base64.encode(orig, IV_LENGTH, orig.length - IV_LENGTH)); } if (USE_ENCRYPTION) { + if (USE_DOUBLE_IV_ENCRYPTION) + updateIV(orig, offset); encrypt(orig, offset, length); updateIV(orig, offset); } diff --git a/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java b/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java index 4aa706cec..36593db09 100644 --- a/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java +++ b/router/java/src/net/i2p/router/tunnel/OutboundGatewayProcessor.java @@ -95,5 +95,8 @@ public class OutboundGatewayProcessor { prev = cur; cur = xf; } + + if (HopProcessor.USE_DOUBLE_IV_ENCRYPTION) + ctx.aes().decryptBlock(orig, offset, config.getIVKey(), orig, offset); } }