From: AsamK Date: Mon, 20 Dec 2021 13:01:24 +0000 (+0100) Subject: Implement simple handling of incoming decryption error message X-Git-Tag: v0.10.1~57 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/baed2b7ead70ccc058c29e9aafff9b5d33f62e12 Implement simple handling of incoming decryption error message --- diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java index 301e0e5a..3fc040bc 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/IncomingMessageHandler.java @@ -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 (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()) { diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java index 340a55ef..645da0bd 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeyRecordStore.java @@ -75,7 +75,9 @@ public class SenderKeyRecordStore implements org.whispersystems.libsignal.groups 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); + } } } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java index 43234165..2b16dc38 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/senderKeys/SenderKeySharedStore.java @@ -163,8 +163,9 @@ public class SenderKeySharedStore { public void deleteAllFor(final DistributionId distributionId) { synchronized (sharedSenderKeys) { - sharedSenderKeys.remove(distributionId.asUuid()); - saveLocked(); + if (sharedSenderKeys.remove(distributionId.asUuid()) != null) { + saveLocked(); + } } } diff --git a/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java b/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java index 9b3e21db..879a276d 100644 --- a/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java +++ b/lib/src/main/java/org/asamk/signal/manager/storage/sessions/SessionStore.java @@ -7,6 +7,7 @@ import org.slf4j.Logger; 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; @@ -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);