diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 31245e59f..2cb99e290 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -129,6 +129,7 @@ import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; import org.whispersystems.textsecuregcm.redis.ReplicatedJedisPool; import org.whispersystems.textsecuregcm.s3.PolicySigner; import org.whispersystems.textsecuregcm.s3.PostPolicyGenerator; +import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; import org.whispersystems.textsecuregcm.sms.SmsSender; import org.whispersystems.textsecuregcm.sms.TwilioSmsSender; @@ -318,6 +319,7 @@ public class WhisperServerService extends Application deleteStorageServiceDataFuture = secureStorageClient.deleteStoredData(account.getUuid()); + final CompletableFuture deleteBackupServiceDataFuture = secureBackupClient.deleteBackups(account.getUuid()); usernamesManager.delete(account.getUuid()); directoryQueue.deleteAccount(account); @@ -154,6 +161,7 @@ public class AccountsManager { messagesManager.clear(account.getUuid()); deleteStorageServiceDataFuture.join(); + deleteBackupServiceDataFuture.join(); redisDelete(account); databaseDelete(account); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java index 1871580b8..14f0b2d96 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/DeleteUserCommand.java @@ -28,6 +28,7 @@ import org.whispersystems.textsecuregcm.WhisperServerConfiguration; import org.whispersystems.textsecuregcm.auth.ExternalServiceCredentialGenerator; import org.whispersystems.textsecuregcm.metrics.PushLatencyManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; +import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.storage.Account; @@ -105,9 +106,11 @@ public class DeleteUserCommand extends EnvironmentCommand account = accountsManager.get(user); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java index e08cb2780..214a2c597 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/storage/AccountsManagerTest.java @@ -9,6 +9,7 @@ import io.lettuce.core.RedisException; import io.lettuce.core.cluster.api.sync.RedisAdvancedClusterCommands; import org.junit.Test; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; +import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.storage.Account; @@ -47,6 +48,7 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); @@ -54,7 +56,7 @@ public class AccountsManagerTest { when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(uuid.toString()); when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}"); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional account = accountsManager.get("+14152222222"); assertTrue(account.isPresent()); @@ -77,13 +79,14 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); when(commands.get(eq("Account3::" + uuid.toString()))).thenReturn("{\"number\": \"+14152222222\", \"name\": \"test\"}"); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional account = accountsManager.get(uuid); assertTrue(account.isPresent()); @@ -107,6 +110,7 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); Account account = new Account("+14152222222", uuid, new HashSet<>(), new byte[16]); @@ -114,7 +118,7 @@ public class AccountsManagerTest { when(commands.get(eq("AccountMap::+14152222222"))).thenReturn(null); when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account)); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional retrieved = accountsManager.get("+14152222222"); assertTrue(retrieved.isPresent()); @@ -139,6 +143,7 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); Account account = new Account("+14152222222", uuid, new HashSet<>(), new byte[16]); @@ -146,7 +151,7 @@ public class AccountsManagerTest { when(commands.get(eq("Account3::" + uuid))).thenReturn(null); when(accounts.get(eq(uuid))).thenReturn(Optional.of(account)); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional retrieved = accountsManager.get(uuid); assertTrue(retrieved.isPresent()); @@ -171,6 +176,7 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); Account account = new Account("+14152222222", uuid, new HashSet<>(), new byte[16]); @@ -178,7 +184,7 @@ public class AccountsManagerTest { when(commands.get(eq("AccountMap::+14152222222"))).thenThrow(new RedisException("Connection lost!")); when(accounts.get(eq("+14152222222"))).thenReturn(Optional.of(account)); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional retrieved = accountsManager.get("+14152222222"); assertTrue(retrieved.isPresent()); @@ -203,6 +209,7 @@ public class AccountsManagerTest { MessagesManager messagesManager = mock(MessagesManager.class); UsernamesManager usernamesManager = mock(UsernamesManager.class); ProfilesManager profilesManager = mock(ProfilesManager.class); + SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); SecureStorageClient secureStorageClient = mock(SecureStorageClient.class); UUID uuid = UUID.randomUUID(); Account account = new Account("+14152222222", uuid, new HashSet<>(), new byte[16]); @@ -210,7 +217,7 @@ public class AccountsManagerTest { when(commands.get(eq("Account3::" + uuid))).thenThrow(new RedisException("Connection lost!")); when(accounts.get(eq(uuid))).thenReturn(Optional.of(account)); - AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient); + AccountsManager accountsManager = new AccountsManager(accounts, cacheCluster, directoryQueue, keysDynamoDb, messagesManager, usernamesManager, profilesManager, secureStorageClient, secureBackupClient); Optional retrieved = accountsManager.get(uuid); assertTrue(retrieved.isPresent());