diff --git a/core/java/src/net/i2p/data/i2cp/BlindingInfoMessage.java b/core/java/src/net/i2p/data/i2cp/BlindingInfoMessage.java index 20da15c99b6afcdac9e36deb1d87526e99fb8da7..2a11800aa26585e5f59bfbe4ec5abeb473705fb8 100644 --- a/core/java/src/net/i2p/data/i2cp/BlindingInfoMessage.java +++ b/core/java/src/net/i2p/data/i2cp/BlindingInfoMessage.java @@ -54,6 +54,10 @@ public class BlindingInfoMessage extends I2CPMessageImpl { public BlindingInfoMessage() {} /** + * This is the constructor used by I2CP client-side. + * Will create a DEST or KEY message type, depending on whether + * BlindData has the full destination. + * * @param expiration ms from now or 0 for forever */ public BlindingInfoMessage(BlindData bd, @@ -75,11 +79,15 @@ public class BlindingInfoMessage extends I2CPMessageImpl { } /** + * HASH not supported by router and may not be useful + * * @param authType 0 (none), 1 (DH), 3 (PSK) * @param expiration ms from now or 0 for forever * @param privKey null for auth none, non-null for DH/PSK - * @param secret may be null + * @param secret may be null, 255 UTF-8 bytes max + * @deprecated unimplemented on router side */ + @Deprecated public BlindingInfoMessage(Hash h, SessionId id, int expiration, int authType, SigType blindType, @@ -92,12 +100,16 @@ public class BlindingInfoMessage extends I2CPMessageImpl { } /** + * HOST not supported by router and may not be useful + * * @param h hostname * @param authType 0 (none), 1 (DH), 3 (PSK) * @param expiration ms from now or 0 for forever * @param privKey null for auth none, non-null for DH/PSK - * @param secret may be null + * @param secret may be null, 255 UTF-8 bytes max + * @deprecated unimplemented on router side */ + @Deprecated public BlindingInfoMessage(String h, SessionId id, int expiration, int authType, SigType blindType, @@ -113,7 +125,7 @@ public class BlindingInfoMessage extends I2CPMessageImpl { * @param authType 0 (none), 1 (DH), 3 (PSK) * @param expiration ms from now or 0 for forever * @param privKey null for auth none, non-null for DH/PSK - * @param secret may be null + * @param secret may be null, 255 UTF-8 bytes max */ public BlindingInfoMessage(Destination d, SessionId id, int expiration, @@ -132,7 +144,7 @@ public class BlindingInfoMessage extends I2CPMessageImpl { * @param authType 0 (none), 1 (DH), 3 (PSK) * @param expiration ms from now or 0 for forever * @param privKey null for auth none, non-null for DH/PSK - * @param secret may be null + * @param secret may be null, 255 UTF-8 bytes max */ public BlindingInfoMessage(SigningPublicKey s, SessionId id, int expiration, @@ -250,6 +262,7 @@ public class BlindingInfoMessage extends I2CPMessageImpl { _blindData = new BlindData(I2PAppContext.getGlobalContext(), _dest, _blindType, _secret, _authType, _privkey); else if (_endpointType == TYPE_KEY) _blindData = new BlindData(I2PAppContext.getGlobalContext(), _pubkey, _blindType, _secret, _authType, _privkey); + // HASH and HOST not supported by router yet return _blindData; } @@ -301,19 +314,22 @@ public class BlindingInfoMessage extends I2CPMessageImpl { } protected byte[] doWriteMessage() throws I2CPMessageException, IOException { - int len; if (_endpointType == TYPE_HASH) { if (_hash == null) throw new I2CPMessageException("Unable to write out the message as there is not enough data"); - len = 11 + Hash.HASH_LENGTH; } else if (_endpointType == TYPE_HOST) { if (_host == null) throw new I2CPMessageException("Unable to write out the message as there is not enough data"); - len = 12 + _host.length(); + } else if (_endpointType == TYPE_DEST) { + if (_dest == null) + throw new I2CPMessageException("Unable to write out the message as there is not enough data"); + } else if (_endpointType == TYPE_KEY) { + if (_pubkey == null) + throw new I2CPMessageException("Unable to write out the message as there is not enough data"); } else { throw new I2CPMessageException("bad type"); } - ByteArrayOutputStream os = new ByteArrayOutputStream(len); + ByteArrayOutputStream os = new ByteArrayOutputStream(512); try { _sessionId.writeBytes(os); byte flags = (byte) _authType; diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java index 6c54e51b7ed53ec4277c1389f764a84fe132f951..d7ba34d5eb40409ab6c3eecf6e83556340516c4d 100644 --- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java +++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java @@ -825,6 +825,16 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi String nsec = bd.getSecret(); if ((nkey != null && !nkey.equals(okey)) || (nsec != null && !nsec.equals(osec))) { + // don't lose destination + if (obd.getDestination() != null && bd.getDestination() == null) { + try { + bd.setDestination(obd.getDestination()); + } catch (IllegalArgumentException iae) { + if (_log.shouldWarn()) + _log.warn("Dest mismatch: " + obd + bd, iae); + return; + } + } _context.netDb().setBlindData(bd); if (_log.shouldWarn()) _log.warn("Updated: " + bd);