diff --git a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java index 3d8da22b9c..7f76a2919b 100644 --- a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java @@ -25,11 +25,14 @@ import net.i2p.data.DatabaseEntry; import net.i2p.data.DataFormatException; import net.i2p.data.DataHelper; import net.i2p.data.Destination; +import net.i2p.data.EncryptedLeaseSet; import net.i2p.data.Hash; import net.i2p.data.Lease; import net.i2p.data.Lease2; import net.i2p.data.LeaseSet; import net.i2p.data.LeaseSet2; +import net.i2p.data.MetaLease; +import net.i2p.data.MetaLeaseSet; import net.i2p.data.PrivateKey; import net.i2p.data.PublicKey; import net.i2p.data.SessionKey; @@ -48,6 +51,7 @@ import net.i2p.util.Log; */ class RequestLeaseSetMessageHandler extends HandlerImpl { private final Map _existingLeaseSets; + protected int _ls2Type = DatabaseEntry.KEY_TYPE_LS2; // LS 1 private static final String PROP_LS_ENCRYPT = "i2cp.encryptLeaseSet"; @@ -74,9 +78,12 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { /** * Do we send a LeaseSet or a LeaseSet2? + * + * Side effect: sets _ls2Type + * * @since 0.9.38 */ - protected static boolean requiresLS2(I2PSessionImpl session) { + protected boolean requiresLS2(I2PSessionImpl session) { if (!session.supportsLS2()) return false; if (session.isOffline()) @@ -91,9 +98,13 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { if (s != null) { try { int type = Integer.parseInt(s); + _ls2Type = type; if (type != DatabaseEntry.KEY_TYPE_LEASESET) return true; - } catch (NumberFormatException nfe) {} + } catch (NumberFormatException nfe) { + session.propogateError("Bad LS2 type", nfe); + return true; + } } return false; } @@ -103,11 +114,34 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { _log.debug("Handle message " + message); RequestLeaseSetMessage msg = (RequestLeaseSetMessage) message; boolean isLS2 = requiresLS2(session); - LeaseSet leaseSet = isLS2 ? new LeaseSet2() : new LeaseSet(); + LeaseSet leaseSet; + if (isLS2) { + if (_ls2Type == DatabaseEntry.KEY_TYPE_LS2) { + leaseSet = new LeaseSet2(); + } else if (_ls2Type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) { + leaseSet = new EncryptedLeaseSet(); + } else if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) { + leaseSet = new MetaLeaseSet(); + } else { + session.propogateError("Unsupported LS2 type", new Exception()); + return; + } + } else { + leaseSet = new LeaseSet(); + } + // Full Meta and Encrypted support TODO for (int i = 0; i < msg.getEndpoints(); i++) { - Lease lease = isLS2 ? new Lease2() : new Lease(); + Lease lease; + if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) { + lease = new MetaLease(); + } else if (isLS2) { + lease = new Lease2(); + lease.setTunnelId(msg.getTunnelId(i)); + } else { + lease = new Lease(); + lease.setTunnelId(msg.getTunnelId(i)); + } lease.setGateway(msg.getRouter(i)); - lease.setTunnelId(msg.getTunnelId(i)); lease.setEndDate(msg.getEndDate()); //lease.setStartDate(msg.getStartDate()); leaseSet.addLease(lease); @@ -218,7 +252,8 @@ class RequestLeaseSetMessageHandler extends HandlerImpl { + dest); } - leaseSet.setEncryptionKey(li.getPublicKey()); + if (_ls2Type != DatabaseEntry.KEY_TYPE_META_LS2) + leaseSet.setEncryptionKey(li.getPublicKey()); leaseSet.setSigningKey(li.getSigningPublicKey()); // SubSession options aren't updated via the gui, so use the primary options Properties opts; diff --git a/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java index 4fd7c12a59..c7fe692596 100644 --- a/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java +++ b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java @@ -10,10 +10,14 @@ package net.i2p.client.impl; */ import net.i2p.I2PAppContext; +import net.i2p.data.DatabaseEntry; +import net.i2p.data.EncryptedLeaseSet; import net.i2p.data.Lease; import net.i2p.data.Lease2; import net.i2p.data.LeaseSet; import net.i2p.data.LeaseSet2; +import net.i2p.data.MetaLease; +import net.i2p.data.MetaLeaseSet; import net.i2p.data.i2cp.I2CPMessage; import net.i2p.data.i2cp.RequestVariableLeaseSetMessage; import net.i2p.util.Log; @@ -36,15 +40,34 @@ class RequestVariableLeaseSetMessageHandler extends RequestLeaseSetMessageHandle _log.debug("Handle message " + message); RequestVariableLeaseSetMessage msg = (RequestVariableLeaseSetMessage) message; boolean isLS2 = requiresLS2(session); - LeaseSet leaseSet = isLS2 ? new LeaseSet2() : new LeaseSet(); + LeaseSet leaseSet; + if (isLS2) { + if (_ls2Type == DatabaseEntry.KEY_TYPE_LS2) { + leaseSet = new LeaseSet2(); + } else if (_ls2Type == DatabaseEntry.KEY_TYPE_ENCRYPTED_LS2) { + leaseSet = new EncryptedLeaseSet(); + } else if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) { + leaseSet = new MetaLeaseSet(); + } else { + session.propogateError("Unsupported LS2 type", new Exception()); + return; + } + } else { + leaseSet = new LeaseSet(); + } + // Full Meta and Encrypted support TODO for (int i = 0; i < msg.getEndpoints(); i++) { Lease lease; if (isLS2) { // convert Lease to Lease2 Lease old = msg.getEndpoint(i); - lease = new Lease2(); + if (_ls2Type == DatabaseEntry.KEY_TYPE_META_LS2) { + lease = new MetaLease(); + } else { + lease = new Lease2(); + lease.setTunnelId(old.getTunnelId()); + } lease.setGateway(old.getGateway()); - lease.setTunnelId(old.getTunnelId()); lease.setEndDate(old.getEndDate()); } else { lease = msg.getEndpoint(i);