From 2751076089b9021840e92d3a6b16f2dd4a05298c Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Thu, 11 Feb 2021 10:43:04 -0500 Subject: [PATCH] Archive sessions on 409/410 instead of deleting them. --- .../crypto/storage/SignalProtocolStoreImpl.java | 17 ++++++++++++----- .../crypto/storage/TextSecureSessionStore.java | 14 ++++++++++++-- .../api/SignalServiceMessageSender.java | 14 +++++++------- .../api/SignalServiceProtocolStore.java | 10 ++++++++++ .../api/SignalServiceSessionStore.java | 12 ++++++++++++ 5 files changed, 53 insertions(+), 14 deletions(-) create mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceProtocolStore.java create mode 100644 libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceSessionStore.java diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java index 40fef31c9f5..5cf86b80445 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/SignalProtocolStoreImpl.java @@ -14,15 +14,17 @@ import org.whispersystems.libsignal.state.SignalProtocolStore; import org.whispersystems.libsignal.state.SignedPreKeyRecord; import org.whispersystems.libsignal.state.SignedPreKeyStore; +import org.whispersystems.signalservice.api.SignalServiceProtocolStore; +import org.whispersystems.signalservice.api.SignalServiceSessionStore; import java.util.List; -public class SignalProtocolStoreImpl implements SignalProtocolStore { +public class SignalProtocolStoreImpl implements SignalServiceProtocolStore { - private final PreKeyStore preKeyStore; - private final SignedPreKeyStore signedPreKeyStore; - private final IdentityKeyStore identityKeyStore; - private final SessionStore sessionStore; + private final PreKeyStore preKeyStore; + private final SignedPreKeyStore signedPreKeyStore; + private final IdentityKeyStore identityKeyStore; + private final SignalServiceSessionStore sessionStore; public SignalProtocolStoreImpl(Context context) { this.preKeyStore = new TextSecurePreKeyStore(context); @@ -106,6 +108,11 @@ public void deleteAllSessions(String number) { sessionStore.deleteAllSessions(number); } + @Override + public void archiveSession(SignalProtocolAddress address) { + sessionStore.archiveSession(address); + } + @Override public SignedPreKeyRecord loadSignedPreKey(int signedPreKeyId) throws InvalidKeyIdException { return signedPreKeyStore.loadSignedPreKey(signedPreKeyId); diff --git a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java index 28ab63b56f7..267c02f805c 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java +++ b/app/src/main/java/org/thoughtcrime/securesms/crypto/storage/TextSecureSessionStore.java @@ -12,12 +12,12 @@ import org.whispersystems.libsignal.SignalProtocolAddress; import org.whispersystems.libsignal.protocol.CiphertextMessage; import org.whispersystems.libsignal.state.SessionRecord; -import org.whispersystems.libsignal.state.SessionStore; +import org.whispersystems.signalservice.api.SignalServiceSessionStore; import java.util.Collections; import java.util.List; -public class TextSecureSessionStore implements SessionStore { +public class TextSecureSessionStore implements SignalServiceSessionStore { private static final String TAG = TextSecureSessionStore.class.getSimpleName(); @@ -103,6 +103,16 @@ public List getSubDeviceSessions(String name) { } } + @Override + public void archiveSession(SignalProtocolAddress address) { + synchronized (FILE_LOCK) { + if (DatabaseFactory.getRecipientDatabase(context).containsPhoneOrUuid(address.getName())) { + RecipientId recipientId = Recipient.external(context, address.getName()).getId(); + archiveSession(recipientId, address.getDeviceId()); + } + } + } + public void archiveSession(@NonNull RecipientId recipientId, int deviceId) { synchronized (FILE_LOCK) { SessionRecord session = DatabaseFactory.getSessionDatabase(context).load(recipientId, deviceId); diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java index abba3f6e30f..eaf625974ae 100644 --- a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceMessageSender.java @@ -119,7 +119,7 @@ public class SignalServiceMessageSender { private static final int RETRY_COUNT = 4; private final PushServiceSocket socket; - private final SignalProtocolStore store; + private final SignalServiceProtocolStore store; private final SignalServiceAddress localAddress; private final Optional eventListener; @@ -143,7 +143,7 @@ public class SignalServiceMessageSender { */ public SignalServiceMessageSender(SignalServiceConfiguration urls, UUID uuid, String e164, String password, - SignalProtocolStore store, + SignalServiceProtocolStore store, String signalAgent, boolean isMultiDevice, Optional pipe, @@ -158,7 +158,7 @@ public SignalServiceMessageSender(SignalServiceConfiguration urls, public SignalServiceMessageSender(SignalServiceConfiguration urls, CredentialsProvider credentialsProvider, - SignalProtocolStore store, + SignalServiceProtocolStore store, String signalAgent, boolean isMultiDevice, Optional pipe, @@ -1587,10 +1587,10 @@ private void handleMismatchedDevices(PushServiceSocket socket, SignalServiceAddr try { for (int extraDeviceId : mismatchedDevices.getExtraDevices()) { if (recipient.getUuid().isPresent()) { - store.deleteSession(new SignalProtocolAddress(recipient.getUuid().get().toString(), extraDeviceId)); + store.archiveSession(new SignalProtocolAddress(recipient.getUuid().get().toString(), extraDeviceId)); } if (recipient.getNumber().isPresent()) { - store.deleteSession(new SignalProtocolAddress(recipient.getNumber().get(), extraDeviceId)); + store.archiveSession(new SignalProtocolAddress(recipient.getNumber().get(), extraDeviceId)); } } @@ -1612,10 +1612,10 @@ private void handleMismatchedDevices(PushServiceSocket socket, SignalServiceAddr private void handleStaleDevices(SignalServiceAddress recipient, StaleDevices staleDevices) { for (int staleDeviceId : staleDevices.getStaleDevices()) { if (recipient.getUuid().isPresent()) { - store.deleteSession(new SignalProtocolAddress(recipient.getUuid().get().toString(), staleDeviceId)); + store.archiveSession(new SignalProtocolAddress(recipient.getUuid().get().toString(), staleDeviceId)); } if (recipient.getNumber().isPresent()) { - store.deleteSession(new SignalProtocolAddress(recipient.getNumber().get(), staleDeviceId)); + store.archiveSession(new SignalProtocolAddress(recipient.getNumber().get(), staleDeviceId)); } } } diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceProtocolStore.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceProtocolStore.java new file mode 100644 index 00000000000..24b3578d187 --- /dev/null +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceProtocolStore.java @@ -0,0 +1,10 @@ +package org.whispersystems.signalservice.api; + +import org.whispersystems.libsignal.state.SignalProtocolStore; + +/** + * And extension of the normal protocol store interface that has additional methods that are needed + * in the service layer, but not the protocol layer. + */ +public interface SignalServiceProtocolStore extends SignalProtocolStore, SignalServiceSessionStore { +} diff --git a/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceSessionStore.java b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceSessionStore.java new file mode 100644 index 00000000000..8b924f480f3 --- /dev/null +++ b/libsignal/service/src/main/java/org/whispersystems/signalservice/api/SignalServiceSessionStore.java @@ -0,0 +1,12 @@ +package org.whispersystems.signalservice.api; + +import org.whispersystems.libsignal.SignalProtocolAddress; +import org.whispersystems.libsignal.state.SessionStore; + +/** + * And extension of the normal protocol session store interface that has additional methods that are + * needed in the service layer, but not the protocol layer. + */ +public interface SignalServiceSessionStore extends SessionStore { + void archiveSession(SignalProtocolAddress address); +}