]> nmode's Git Repositories - signal-cli/commitdiff
Fix issue with broken sessions
authorAsamK <asamk@gmx.de>
Tue, 23 Feb 2021 20:50:31 +0000 (21:50 +0100)
committerAsamK <asamk@gmx.de>
Tue, 23 Feb 2021 20:50:31 +0000 (21:50 +0100)
Fixes #530

lib/src/main/java/org/asamk/signal/manager/storage/protocol/JsonSessionStore.java

index 94d2d681f5e4ff60ecebe1249cd9cfaa3f7c81a0..1b5384a4f5881387f2b006fbf4b44fcfb19660a1 100644 (file)
@@ -12,6 +12,7 @@ import org.asamk.signal.manager.util.Utils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.libsignal.SignalProtocolAddress;
+import org.whispersystems.libsignal.protocol.CiphertextMessage;
 import org.whispersystems.libsignal.state.SessionRecord;
 import org.whispersystems.signalservice.api.SignalServiceSessionStore;
 import org.whispersystems.signalservice.api.push.SignalServiceAddress;
@@ -55,9 +56,7 @@ class JsonSessionStore implements SignalServiceSessionStore {
                     return new SessionRecord(info.sessionRecord);
                 } catch (IOException e) {
                     logger.warn("Failed to load session, resetting session: {}", e.getMessage());
-                    final var sessionRecord = new SessionRecord();
-                    info.sessionRecord = sessionRecord.serialize();
-                    return sessionRecord;
+                    return new SessionRecord();
                 }
             }
         }
@@ -104,7 +103,16 @@ class JsonSessionStore implements SignalServiceSessionStore {
         var serviceAddress = resolveSignalServiceAddress(address.getName());
         for (var info : sessions) {
             if (info.address.matches(serviceAddress) && info.deviceId == address.getDeviceId()) {
-                return true;
+                final SessionRecord sessionRecord;
+                try {
+                    sessionRecord = new SessionRecord(info.sessionRecord);
+                } catch (IOException e) {
+                    logger.warn("Failed to check session: {}", e.getMessage());
+                    return false;
+                }
+
+                return sessionRecord.hasSenderChain()
+                        && sessionRecord.getSessionVersion() == CiphertextMessage.CURRENT_VERSION;
             }
         }
         return false;