From 5440a3402fa7d70914a889d1bb8461314614f278 Mon Sep 17 00:00:00 2001
From: zzz <zzz@mail.i2p>
Date: Thu, 21 Feb 2019 16:16:27 +0000
Subject: [PATCH] I2CP: Force i2cp.leaseSetType option for offline keys

---
 .../src/net/i2p/client/impl/I2CPMessageProducer.java   | 10 ++++++++--
 .../i2p/client/impl/RequestLeaseSetMessageHandler.java |  2 +-
 .../i2p/router/client/ClientMessageEventListener.java  |  6 +++++-
 3 files changed, 14 insertions(+), 4 deletions(-)

diff --git a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
index f49f080860..0eaa069918 100644
--- a/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
+++ b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
@@ -120,8 +120,14 @@ class I2CPMessageProducer {
         updateBandwidth(session);
         CreateSessionMessage msg = new CreateSessionMessage();
         SessionConfig cfg = new SessionConfig(session.getMyDestination());
-        cfg.setOptions(getRouterOptions(session));
-        if (session.isOffline()) {
+        Properties p = getRouterOptions(session);
+        boolean isOffline = session.isOffline();
+        if (isOffline) {
+            if (!p.containsKey(RequestLeaseSetMessageHandler.PROP_LS_TYPE))
+                p.setProperty(RequestLeaseSetMessageHandler.PROP_LS_TYPE, "3");
+        }
+        cfg.setOptions(p);
+        if (isOffline) {
             cfg.setOfflineSignature(session.getOfflineExpiration(),
                                     session.getTransientSigningPublicKey(),
                                     session.getOfflineSignature());
diff --git a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
index 259e6d08d2..bebc2cf277 100644
--- a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
@@ -63,7 +63,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
     private static final String PROP_LS_PK = "i2cp.leaseSetPrivateKey";
     private static final String PROP_LS_SPK = "i2cp.leaseSetSigningPrivateKey";
     // LS 2
-    private static final String PROP_LS_TYPE = "i2cp.leaseSetType";
+    public static final String PROP_LS_TYPE = "i2cp.leaseSetType";
     private static final String PROP_LS_ENCTYPE = "i2cp.leaseSetEncType";
 
     public RequestLeaseSetMessageHandler(I2PAppContext context) {
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index c8731c6c3c..57c1e090b5 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -289,13 +289,17 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
                 }
             }
         }
-        if ("7".equals(props.getProperty("i2cp.leaseSetType"))) {
+        String lsType = props.getProperty("i2cp.leaseSetType");
+        if ("7".equals(lsType)) {
             // Prevent tunnel builds for Meta LS
             // more TODO
             props.setProperty("inbound.length", "0");
             props.setProperty("outbound.length", "0");
             props.setProperty("inbound.lengthVariance", "0");
             props.setProperty("outbound.lengthVariance", "0");
+        } else if (lsType == null && props.getProperty(SessionConfig.PROP_OFFLINE_SIGNATURE) != null) {
+            // force type 3
+            props.setProperty("i2cp.leaseSetType", "3");
         }
         cfg.setOptions(props);
         // this sets the session id
-- 
GitLab