From 6fcb2ab5dd99fe4836c0cd64cb7a4ff8d1b90d67 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 21 Mar 2024 10:40:05 -0400 Subject: [PATCH] Remove username phased rollout plumbing (usernames are now available to everybody) --- .../textsecuregcm/WhisperServerService.java | 2 +- .../textsecuregcm/storage/AccountsManager.java | 15 --------------- .../workers/AssignUsernameCommand.java | 6 +----- .../workers/CommandDependencies.java | 6 +----- .../AccountCreationDeletionIntegrationTest.java | 2 -- ...ccountsManagerChangeNumberIntegrationTest.java | 2 -- ...agerConcurrentModificationIntegrationTest.java | 2 -- .../storage/AccountsManagerTest.java | 14 -------------- .../AccountsManagerUsernameIntegrationTest.java | 7 ------- .../storage/AddRemoveDeviceIntegrationTest.java | 2 -- 10 files changed, 3 insertions(+), 55 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index 46e8feb8a..11fdb6ce9 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -576,7 +576,7 @@ public void run(WhisperServerConfiguration config, Environment environment) thro accountLockManager, keysManager, messagesManager, profilesManager, secureStorageClient, secureValueRecovery2Client, clientPresenceManager, - experimentEnrollmentManager, registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, + registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, clock); RemoteConfigsManager remoteConfigsManager = new RemoteConfigsManager(remoteConfigs); APNSender apnSender = new APNSender(apnSenderExecutor, config.getApnConfiguration()); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index 966f1401d..5aebf55f6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -53,7 +53,6 @@ import org.whispersystems.textsecuregcm.entities.AccountAttributes; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; @@ -92,9 +91,6 @@ public class AccountsManager { private static final String COUNTRY_CODE_TAG_NAME = "country"; private static final String DELETION_REASON_TAG_NAME = "reason"; - @VisibleForTesting - public static final String USERNAME_EXPERIMENT_NAME = "usernames"; - private static final Logger logger = LoggerFactory.getLogger(AccountsManager.class); private final Accounts accounts; @@ -107,7 +103,6 @@ public class AccountsManager { private final SecureStorageClient secureStorageClient; private final SecureValueRecovery2Client secureValueRecovery2Client; private final ClientPresenceManager clientPresenceManager; - private final ExperimentEnrollmentManager experimentEnrollmentManager; private final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager; private final Executor accountLockExecutor; private final Executor clientPresenceExecutor; @@ -148,7 +143,6 @@ public AccountsManager(final Accounts accounts, final SecureStorageClient secureStorageClient, final SecureValueRecovery2Client secureValueRecovery2Client, final ClientPresenceManager clientPresenceManager, - final ExperimentEnrollmentManager experimentEnrollmentManager, final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager, final Executor accountLockExecutor, final Executor clientPresenceExecutor, @@ -163,7 +157,6 @@ public AccountsManager(final Accounts accounts, this.secureStorageClient = secureStorageClient; this.secureValueRecovery2Client = secureValueRecovery2Client; this.clientPresenceManager = clientPresenceManager; - this.experimentEnrollmentManager = experimentEnrollmentManager; this.registrationRecoveryPasswordsManager = requireNonNull(registrationRecoveryPasswordsManager); this.accountLockExecutor = accountLockExecutor; this.clientPresenceExecutor = clientPresenceExecutor; @@ -545,10 +538,6 @@ public record UsernameReservation(Account account, byte[] reservedUsernameHash){ * {@link UsernameHashNotAvailableException} if none of the given username hashes are available */ public CompletableFuture reserveUsernameHash(final Account account, final List requestedUsernameHashes) { - if (!experimentEnrollmentManager.isEnrolled(account.getUuid(), USERNAME_EXPERIMENT_NAME)) { - return CompletableFuture.failedFuture(new UsernameHashNotAvailableException()); - } - if (account.getUsernameHash().filter( oldHash -> requestedUsernameHashes.stream().anyMatch(hash -> Arrays.equals(oldHash, hash))) .isPresent()) { @@ -606,10 +595,6 @@ private CompletableFuture checkAndReserveNextUsernameHash(final Account * account */ public CompletableFuture confirmReservedUsernameHash(final Account account, final byte[] reservedUsernameHash, @Nullable final byte[] encryptedUsername) { - if (!experimentEnrollmentManager.isEnrolled(account.getUuid(), USERNAME_EXPERIMENT_NAME)) { - return CompletableFuture.failedFuture(new UsernameHashNotAvailableException()); - } - if (account.getUsernameHash().map(currentUsernameHash -> Arrays.equals(currentUsernameHash, reservedUsernameHash)).orElse(false)) { // the client likely already succeeded and is retrying return CompletableFuture.completedFuture(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 38e45346e..5b4d77132 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/AssignUsernameCommand.java @@ -28,7 +28,6 @@ import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; 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.securestorage.SecureStorageClient; @@ -136,9 +135,6 @@ protected void run(Environment environment, Namespace namespace, ExternalServiceCredentialsGenerator secureValueRecoveryCredentialsGenerator = SecureValueRecovery2Controller.credentialsGenerator( configuration.getSvr2Configuration()); - ExperimentEnrollmentManager experimentEnrollmentManager = new ExperimentEnrollmentManager( - dynamicConfigurationManager); - DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbFromConfig.asyncClient( configuration.getDynamoDbClientConfiguration(), WhisperServerService.AWSSDK_CREDENTIALS_PROVIDER); @@ -207,7 +203,7 @@ protected void run(Environment environment, Namespace namespace, AccountsManager accountsManager = new AccountsManager(accounts, phoneNumberIdentifiers, cacheCluster, accountLockManager, keys, messagesManager, profilesManager, secureStorageClient, secureValueRecovery2Client, clientPresenceManager, - experimentEnrollmentManager, registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, + registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, Clock.systemUTC()); final String usernameHash = namespace.getString("usernameHash"); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java b/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java index ea7ca492c..cb211ac07 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java @@ -21,7 +21,6 @@ import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; import org.whispersystems.textsecuregcm.controllers.SecureStorageController; import org.whispersystems.textsecuregcm.controllers.SecureValueRecovery2Controller; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.metrics.MetricsUtil; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisCluster; @@ -114,9 +113,6 @@ static CommandDependencies build( ExternalServiceCredentialsGenerator secureValueRecoveryCredentialsGenerator = SecureValueRecovery2Controller.credentialsGenerator( configuration.getSvr2Configuration()); - ExperimentEnrollmentManager experimentEnrollmentManager = new ExperimentEnrollmentManager( - dynamicConfigurationManager); - DynamoDbAsyncClient dynamoDbAsyncClient = DynamoDbFromConfig.asyncClient( configuration.getDynamoDbClientConfiguration(), WhisperServerService.AWSSDK_CREDENTIALS_PROVIDER); @@ -187,7 +183,7 @@ static CommandDependencies build( AccountsManager accountsManager = new AccountsManager(accounts, phoneNumberIdentifiers, cacheCluster, accountLockManager, keys, messagesManager, profilesManager, secureStorageClient, secureValueRecovery2Client, clientPresenceManager, - experimentEnrollmentManager, registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, + registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, clock); environment.lifecycle().manage(messagesCache); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java index 2baad47a9..9dca82692 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java @@ -41,7 +41,6 @@ import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.GcmRegistrationId; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; @@ -142,7 +141,6 @@ void setUp() { secureStorageClient, svr2Client, mock(ClientPresenceManager.class), - mock(ExperimentEnrollmentManager.class), registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, 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 d4d76e3a9..eee6c5744 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java @@ -34,7 +34,6 @@ import org.whispersystems.textsecuregcm.controllers.MismatchedDevicesException; import org.whispersystems.textsecuregcm.entities.AccountAttributes; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; @@ -137,7 +136,6 @@ void setup() throws InterruptedException { secureStorageClient, svr2Client, clientPresenceManager, - mock(ExperimentEnrollmentManager.class), registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor, 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 dabb1021f..dd2274660 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java @@ -46,7 +46,6 @@ import org.whispersystems.textsecuregcm.auth.UnidentifiedAccessUtil; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; import org.whispersystems.textsecuregcm.entities.AccountAttributes; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -131,7 +130,6 @@ void setup() throws InterruptedException { mock(SecureStorageClient.class), mock(SecureValueRecovery2Client.class), mock(ClientPresenceManager.class), - mock(ExperimentEnrollmentManager.class), mock(RegistrationRecoveryPasswordsManager.class), mock(Executor.class), mock(Executor.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 dcc9c910c..e3154a6b6 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -70,7 +70,6 @@ import org.whispersystems.textsecuregcm.entities.AccountAttributes; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.identity.PniServiceIdentifier; @@ -106,7 +105,6 @@ class AccountsManagerTest { private MessagesManager messagesManager; private ProfilesManager profilesManager; private ClientPresenceManager clientPresenceManager; - private ExperimentEnrollmentManager enrollmentManager; private Map phoneNumberIdentifiersByE164; @@ -193,9 +191,6 @@ void setup() throws InterruptedException { when(dynamicConfigurationManager.getConfiguration()).thenReturn(dynamicConfiguration); - enrollmentManager = mock(ExperimentEnrollmentManager.class); - when(enrollmentManager.isEnrolled(any(UUID.class), eq(AccountsManager.USERNAME_EXPERIMENT_NAME))).thenReturn(true); - final AccountLockManager accountLockManager = mock(AccountLockManager.class); doAnswer(invocation -> { @@ -235,7 +230,6 @@ void setup() throws InterruptedException { storageClient, svr2Client, clientPresenceManager, - enrollmentManager, registrationRecoveryPasswordsManager, mock(Executor.class), clientPresenceExecutor, @@ -1396,14 +1390,6 @@ void testReserveUsernameHashNotAvailable() { accountsManager.reserveUsernameHash(account, List.of(USERNAME_HASH_1, USERNAME_HASH_2))); } - @Test - void testReserveUsernameDisabled() { - final Account account = AccountsHelper.generateTestAccount("+18005551234", UUID.randomUUID(), UUID.randomUUID(), new ArrayList<>(), new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]); - when(enrollmentManager.isEnrolled(account.getUuid(), AccountsManager.USERNAME_EXPERIMENT_NAME)).thenReturn(false); - CompletableFutureTestUtil.assertFailsWithCause(UsernameHashNotAvailableException.class, - accountsManager.reserveUsernameHash(account, List.of(USERNAME_HASH_1))); - } - @Test void testConfirmReservedUsernameHash() throws UsernameHashNotAvailableException, UsernameReservationNotFoundException { final Account account = AccountsHelper.generateTestAccount("+18005551234", UUID.randomUUID(), UUID.randomUUID(), new ArrayList<>(), new byte[UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH]); 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 713354a85..c97c4ab25 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java @@ -11,7 +11,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.doAnswer; -import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -35,7 +34,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.Mockito; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -128,10 +126,6 @@ private void buildAccountsManager(final int initialWidth, int discriminatorMaxWi final PhoneNumberIdentifiers phoneNumberIdentifiers = new PhoneNumberIdentifiers(DYNAMO_DB_EXTENSION.getDynamoDbClient(), Tables.PNI.tableName()); - final ExperimentEnrollmentManager experimentEnrollmentManager = mock(ExperimentEnrollmentManager.class); - when(experimentEnrollmentManager.isEnrolled(any(UUID.class), eq(AccountsManager.USERNAME_EXPERIMENT_NAME))) - .thenReturn(true); - final MessagesManager messageManager = mock(MessagesManager.class); final ProfilesManager profileManager = mock(ProfilesManager.class); when(messageManager.clear(any())).thenReturn(CompletableFuture.completedFuture(null)); @@ -148,7 +142,6 @@ private void buildAccountsManager(final int initialWidth, int discriminatorMaxWi mock(SecureStorageClient.class), mock(SecureValueRecovery2Client.class), mock(ClientPresenceManager.class), - experimentEnrollmentManager, mock(RegistrationRecoveryPasswordsManager.class), Executors.newSingleThreadExecutor(), Executors.newSingleThreadExecutor(), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java index 2b89392f3..a01f25423 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java @@ -28,7 +28,6 @@ import org.signal.libsignal.protocol.ecc.Curve; import org.signal.libsignal.protocol.ecc.ECKeyPair; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; -import org.whispersystems.textsecuregcm.experiment.ExperimentEnrollmentManager; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.push.ClientPresenceManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; @@ -130,7 +129,6 @@ void setUp() { secureStorageClient, svr2Client, mock(ClientPresenceManager.class), - mock(ExperimentEnrollmentManager.class), registrationRecoveryPasswordsManager, accountLockExecutor, clientPresenceExecutor,