diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java index 3a8003cb5..d9dbaa60e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerConfiguration.java @@ -33,7 +33,6 @@ import org.whispersystems.textsecuregcm.configuration.MaxDeviceConfiguration; import org.whispersystems.textsecuregcm.configuration.MessageCacheConfiguration; import org.whispersystems.textsecuregcm.configuration.OneTimeDonationConfiguration; import org.whispersystems.textsecuregcm.configuration.PaymentsServiceConfiguration; -import org.whispersystems.textsecuregcm.limits.RateLimiterConfig; import org.whispersystems.textsecuregcm.configuration.RecaptchaConfiguration; import org.whispersystems.textsecuregcm.configuration.RedisClusterConfiguration; import org.whispersystems.textsecuregcm.configuration.RedisConfiguration; @@ -49,6 +48,7 @@ import org.whispersystems.textsecuregcm.configuration.SubscriptionConfiguration; import org.whispersystems.textsecuregcm.configuration.TestDeviceConfiguration; import org.whispersystems.textsecuregcm.configuration.UnidentifiedDeliveryConfiguration; import org.whispersystems.textsecuregcm.configuration.ZkConfig; +import org.whispersystems.textsecuregcm.limits.RateLimiterConfig; import org.whispersystems.websocket.configuration.WebSocketConfiguration; /** @noinspection MismatchedQueryAndUpdateOfCollection, WeakerAccess */ diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 2ba46edab..ac24d9fcf 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -165,6 +165,7 @@ 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.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.spam.FilterSpam; import org.whispersystems.textsecuregcm.spam.RateLimitChallengeListener; import org.whispersystems.textsecuregcm.spam.ReportSpamTokenProvider; @@ -418,9 +419,12 @@ public class WhisperServerService extends Application deleteStorageServiceDataFuture = secureStorageClient.deleteStoredData(account.getUuid()); + final CompletableFuture deleteStorageServiceDataFuture = secureStorageClient.deleteStoredData( + account.getUuid()); final CompletableFuture deleteBackupServiceDataFuture = secureBackupClient.deleteBackups(account.getUuid()); + final CompletableFuture deleteSecureValueRecoveryServiceDataFuture = secureValueRecovery2Client.deleteBackups( + account.getUuid()); profilesManager.deleteAll(account.getUuid()); keys.delete(account.getUuid()); @@ -667,6 +674,7 @@ public class AccountsManager { deleteStorageServiceDataFuture.join(); deleteBackupServiceDataFuture.join(); + deleteSecureValueRecoveryServiceDataFuture.join(); accounts.delete(account.getUuid()); redisDelete(account); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java index 96b949a31..68471df97 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java @@ -29,11 +29,13 @@ import org.whispersystems.textsecuregcm.auth.ExternalServiceCredentialsGenerator import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; import org.whispersystems.textsecuregcm.controllers.SecureBackupController; import org.whispersystems.textsecuregcm.controllers.SecureStorageController; +import org.whispersystems.textsecuregcm.controllers.SecureValueRecovery2Controller; import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; +import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.Accounts; @@ -109,8 +111,8 @@ public class AssignUsernameCommand extends EnvironmentCommand dynamicConfigurationManager = new DynamicConfigurationManager<>( configuration.getAppConfig().getApplication(), configuration.getAppConfig().getEnvironment(), @@ -188,8 +192,10 @@ public class AssignUsernameCommand extends EnvironmentCommand dynamicConfigurationManager = new DynamicConfigurationManager<>( configuration.getAppConfig().getApplication(), configuration.getAppConfig().getEnvironment(), @@ -165,8 +169,12 @@ record CommandDependencies( configuration.getClientPresenceClusterConfiguration(), redisClusterClientResources); FaultTolerantRedisCluster rateLimitersCluster = new FaultTolerantRedisCluster("rate_limiters", configuration.getRateLimitersCluster(), redisClusterClientResources); - SecureBackupClient secureBackupClient = new SecureBackupClient(backupCredentialsGenerator, backupServiceExecutor, + SecureBackupClient secureBackupClient = new SecureBackupClient(backupCredentialsGenerator, + secureValueRecoveryServiceExecutor, configuration.getSecureBackupServiceConfiguration()); + SecureValueRecovery2Client secureValueRecovery2Client = new SecureValueRecovery2Client( + secureValueRecoveryCredentialsGenerator, secureValueRecoveryServiceExecutor, + configuration.getSvr2Configuration()); SecureStorageClient secureStorageClient = new SecureStorageClient(storageCredentialsGenerator, storageServiceExecutor, configuration.getSecureStorageServiceConfiguration()); ClientPresenceManager clientPresenceManager = new ClientPresenceManager(clientPresenceCluster, @@ -189,7 +197,7 @@ record CommandDependencies( StoredVerificationCodeManager pendingAccountsManager = new StoredVerificationCodeManager(pendingAccounts); AccountsManager accountsManager = new AccountsManager(accounts, phoneNumberIdentifiers, cacheCluster, deletedAccountsManager, directoryQueue, keys, messagesManager, profilesManager, - pendingAccountsManager, secureStorageClient, secureBackupClient, clientPresenceManager, + pendingAccountsManager, secureStorageClient, secureBackupClient, secureValueRecovery2Client, clientPresenceManager, experimentEnrollmentManager, registrationRecoveryPasswordsManager, clock); return new CommandDependencies( diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java index 169f69d45..e3ba36750 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java @@ -32,6 +32,7 @@ import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; +import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition; import software.amazon.awssdk.services.dynamodb.model.CreateTableRequest; @@ -178,6 +179,9 @@ class AccountsManagerChangeNumberIntegrationTest { final SecureBackupClient secureBackupClient = mock(SecureBackupClient.class); when(secureBackupClient.deleteBackups(any())).thenReturn(CompletableFuture.completedFuture(null)); + final SecureValueRecovery2Client svr2Client = mock(SecureValueRecovery2Client.class); + when(svr2Client.deleteBackups(any())).thenReturn(CompletableFuture.completedFuture(null)); + clientPresenceManager = mock(ClientPresenceManager.class); final PhoneNumberIdentifiers phoneNumberIdentifiers = @@ -195,6 +199,7 @@ class AccountsManagerChangeNumberIntegrationTest { mock(StoredVerificationCodeManager.class), secureStorageClient, secureBackupClient, + svr2Client, clientPresenceManager, mock(ExperimentEnrollmentManager.class), mock(RegistrationRecoveryPasswordsManager.class), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java index e1ff343b9..7398385f2 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java @@ -46,6 +46,7 @@ import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; +import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.tests.util.DevicesHelper; import org.whispersystems.textsecuregcm.tests.util.JsonHelpers; @@ -162,6 +163,7 @@ class AccountsManagerConcurrentModificationIntegrationTest { mock(StoredVerificationCodeManager.class), mock(SecureStorageClient.class), mock(SecureBackupClient.class), + mock(SecureValueRecovery2Client.class), mock(ClientPresenceManager.class), mock(ExperimentEnrollmentManager.class), mock(RegistrationRecoveryPasswordsManager.class), 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 263121ca2..db28c03db 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -55,6 +55,7 @@ import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; +import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.storage.Device.DeviceCapabilities; import org.whispersystems.textsecuregcm.tests.util.AccountsHelper; @@ -121,6 +122,9 @@ class AccountsManagerTest { final SecureBackupClient backupClient = mock(SecureBackupClient.class); when(backupClient.deleteBackups(any())).thenReturn(CompletableFuture.completedFuture(null)); + final SecureValueRecovery2Client svr2Client = mock(SecureValueRecovery2Client.class); + when(svr2Client.deleteBackups(any())).thenReturn(CompletableFuture.completedFuture(null)); + final PhoneNumberIdentifiers phoneNumberIdentifiers = mock(PhoneNumberIdentifiers.class); phoneNumberIdentifiersByE164 = new HashMap<>(); @@ -152,6 +156,7 @@ class AccountsManagerTest { mock(StoredVerificationCodeManager.class), storageClient, backupClient, + svr2Client, mock(ClientPresenceManager.class), enrollmentManager, mock(RegistrationRecoveryPasswordsManager.class), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java index ab41b791b..c63c2c1a6 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java @@ -43,6 +43,7 @@ import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securebackup.SecureBackupClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; +import org.whispersystems.textsecuregcm.securevaluerecovery.SecureValueRecovery2Client; import org.whispersystems.textsecuregcm.sqs.DirectoryQueue; import org.whispersystems.textsecuregcm.util.AttributeValues; import software.amazon.awssdk.services.dynamodb.model.AttributeDefinition; @@ -183,6 +184,7 @@ class AccountsManagerUsernameIntegrationTest { mock(StoredVerificationCodeManager.class), mock(SecureStorageClient.class), mock(SecureBackupClient.class), + mock(SecureValueRecovery2Client.class), mock(ClientPresenceManager.class), experimentEnrollmentManager, mock(RegistrationRecoveryPasswordsManager.class),