From c309afc04ba6adb84a608a5eb050f42da0c9c46d Mon Sep 17 00:00:00 2001 From: Katherine Yen Date: Fri, 5 May 2023 11:31:18 -0700 Subject: [PATCH] Displace client presence when existing account reregisters --- .../textsecuregcm/push/ClientPresenceManager.java | 7 +++++++ .../textsecuregcm/storage/AccountsManager.java | 1 + .../org/whispersystems/textsecuregcm/storage/Device.java | 5 +++++ .../textsecuregcm/storage/MessagesCache.java | 2 +- .../textsecuregcm/storage/AccountsManagerTest.java | 5 ++++- 5 files changed, 18 insertions(+), 2 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java index ae1118fa6..963bb0abc 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/ClientPresenceManager.java @@ -33,11 +33,14 @@ import java.util.concurrent.ExecutorService; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; +import java.util.stream.LongStream; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.whispersystems.textsecuregcm.redis.ClusterLuaScript; import org.whispersystems.textsecuregcm.redis.FaultTolerantPubSubConnection; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; +import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.util.Constants; /** @@ -198,6 +201,10 @@ public class ClientPresenceManager extends RedisClusterPubSubAdapter ALL_POSSIBLE_DEVICE_IDS = LongStream.range(1, MAXIMUM_DEVICE_ID).boxed().collect(Collectors.toList()); @JsonProperty private long id; diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java index 0f9879c63..c3c095061 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java @@ -332,7 +332,7 @@ public class MessagesCache extends RedisClusterPubSubAdapter imp public void clear(final UUID destinationUuid) { // TODO Remove null check in a fully UUID-based world if (destinationUuid != null) { - for (int i = 1; i < 256; i++) { + for (int i = 1; i < Device.MAXIMUM_DEVICE_ID; i++) { clear(destinationUuid, i); } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java index ce6c71997..138a9c967 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -73,6 +73,7 @@ class AccountsManagerTest { private Keys keys; private MessagesManager messagesManager; private ProfilesManager profilesManager; + private ClientPresenceManager clientPresenceManager; private ExperimentEnrollmentManager enrollmentManager; private Map phoneNumberIdentifiersByE164; @@ -95,6 +96,7 @@ class AccountsManagerTest { keys = mock(Keys.class); messagesManager = mock(MessagesManager.class); profilesManager = mock(ProfilesManager.class); + clientPresenceManager = mock(ClientPresenceManager.class); //noinspection unchecked commands = mock(RedisAdvancedClusterCommands.class); @@ -155,7 +157,7 @@ class AccountsManagerTest { storageClient, backupClient, svr2Client, - mock(ClientPresenceManager.class), + clientPresenceManager, enrollmentManager, mock(RegistrationRecoveryPasswordsManager.class), mock(Clock.class)); @@ -560,6 +562,7 @@ class AccountsManagerTest { verify(keys).delete(phoneNumberIdentifiersByE164.get(e164)); verify(messagesManager).clear(existingUuid); verify(profilesManager).deleteAll(existingUuid); + verify(clientPresenceManager).disconnectAllPresencesForUuid(existingUuid); } @Test