]> nmode's Git Repositories - signal-cli/commitdiff
Implement simple handling of incoming decryption error message
authorAsamK <asamk@gmx.de>
Mon, 20 Dec 2021 13:01:24 +0000 (14:01 +0100)
committerAsamK <asamk@gmx.de>
Mon, 20 Dec 2021 13:38:48 +0000 (14:38 +0100)
lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java
lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java
lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java
lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java

index 301e0e5a9dd34ef47571c938c2c9593878775f4b..3fc040bc737d917dba057b74b7ef3f129bf9cd3e 100644 (file)
@@ -233,6 +233,16 @@ public final class IncomingMessageHandler {
         if (content.getDecryptionErrorMessage().isPresent()) {
             var message = content.getDecryptionErrorMessage().get();
             logger.debug("Received a decryption error message (resend request for {})", message.getTimestamp());
         if (content.getDecryptionErrorMessage().isPresent()) {
             var message = content.getDecryptionErrorMessage().get();
             logger.debug("Received a decryption error message (resend request for {})", message.getTimestamp());
+            if (message.getRatchetKey().isPresent()) {
+                if (message.getDeviceId() == account.getDeviceId() && account.getSessionStore()
+                        .isCurrentRatchetKey(sender, senderDeviceId, message.getRatchetKey().get())) {
+                    logger.debug("Renewing the session with sender");
+                    actions.add(new RenewSessionAction(sender));
+                }
+            } else {
+                logger.debug("Reset shared sender keys with this recipient");
+                account.getSenderKeyStore().deleteSharedWith(sender);
+            }
         }
 
         if (content.getDataMessage().isPresent()) {
         }
 
         if (content.getDataMessage().isPresent()) {
index 340a55efbca45769d008a6198d7c7d9ef450967f..645da0bd5abf835bf805c2e03c29769bbbd8b366 100644 (file)
@@ -75,7 +75,9 @@ public class SenderKeyRecordStore implements org.whispersystems.libsignal.groups
             cachedSenderKeys.clear();
             final var keys = getKeysLocked(recipientId);
             for (var key : keys) {
             cachedSenderKeys.clear();
             final var keys = getKeysLocked(recipientId);
             for (var key : keys) {
-                if (key.distributionId.equals(distributionId)) deleteSenderKeyLocked(key);
+                if (key.distributionId.equals(distributionId)) {
+                    deleteSenderKeyLocked(key);
+                }
             }
         }
     }
             }
         }
     }
index 432341651c3fa8da0f83d1b38517647b221ca396..2b16dc386dce6f47f565e2e72cd9491e1a996a76 100644 (file)
@@ -163,8 +163,9 @@ public class SenderKeySharedStore {
 
     public void deleteAllFor(final DistributionId distributionId) {
         synchronized (sharedSenderKeys) {
 
     public void deleteAllFor(final DistributionId distributionId) {
         synchronized (sharedSenderKeys) {
-            sharedSenderKeys.remove(distributionId.asUuid());
-            saveLocked();
+            if (sharedSenderKeys.remove(distributionId.asUuid()) != null) {
+                saveLocked();
+            }
         }
     }
 
         }
     }
 
index 9b3e21dbcd6ce7ff8f506283e1ef034f596b224c..879a276db848297928c46448e40d6e760d749abc 100644 (file)
@@ -7,6 +7,7 @@ import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.libsignal.NoSessionException;
 import org.whispersystems.libsignal.SignalProtocolAddress;
 import org.slf4j.LoggerFactory;
 import org.whispersystems.libsignal.NoSessionException;
 import org.whispersystems.libsignal.SignalProtocolAddress;
+import org.whispersystems.libsignal.ecc.ECPublicKey;
 import org.whispersystems.libsignal.protocol.CiphertextMessage;
 import org.whispersystems.libsignal.state.SessionRecord;
 import org.whispersystems.signalservice.api.SignalServiceSessionStore;
 import org.whispersystems.libsignal.protocol.CiphertextMessage;
 import org.whispersystems.libsignal.state.SessionRecord;
 import org.whispersystems.signalservice.api.SignalServiceSessionStore;
@@ -91,6 +92,18 @@ public class SessionStore implements SignalServiceSessionStore {
         }
     }
 
         }
     }
 
+    public boolean isCurrentRatchetKey(RecipientId recipientId, int deviceId, ECPublicKey ratchetKey) {
+        final var key = new Key(recipientId, deviceId);
+
+        synchronized (cachedSessions) {
+            final var session = loadSessionLocked(key);
+            if (session == null) {
+                return false;
+            }
+            return session.currentRatchetKeyMatches(ratchetKey);
+        }
+    }
+
     @Override
     public void storeSession(SignalProtocolAddress address, SessionRecord session) {
         final var key = getKey(address);
     @Override
     public void storeSession(SignalProtocolAddress address, SessionRecord session) {
         final var key = getKey(address);