From 3fefb24d71268d2071e879337ebf90375e3e2bb1 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Mon, 11 Nov 2024 11:36:07 -0500 Subject: [PATCH] Retire the legacy disconnection request system --- .../textsecuregcm/WhisperServerService.java | 10 +++--- .../RegistrationLockVerificationManager.java | 4 --- ...socketRefreshApplicationEventListener.java | 5 +-- .../WebsocketRefreshRequestEventListener.java | 5 --- .../push/WebSocketConnectionEventManager.java | 36 ------------------- .../storage/AccountsManager.java | 11 +----- .../workers/CommandDependencies.java | 2 +- ...dDeviceRefreshRequirementProviderTest.java | 17 +++------ ...rChangeRefreshRequirementProviderTest.java | 20 ++--------- ...gistrationLockVerificationManagerTest.java | 6 +--- .../controllers/DeviceControllerTest.java | 2 +- ...ccountCreationDeletionIntegrationTest.java | 9 ----- ...ntsManagerChangeNumberIntegrationTest.java | 6 ---- ...ConcurrentModificationIntegrationTest.java | 1 - ...sManagerDeviceTransferIntegrationTest.java | 1 - .../storage/AccountsManagerTest.java | 12 ++----- ...ccountsManagerUsernameIntegrationTest.java | 5 --- .../AddRemoveDeviceIntegrationTest.java | 4 +-- 18 files changed, 20 insertions(+), 136 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index f9a2f7cda..a32fdfa25 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -619,7 +619,7 @@ public class WhisperServerService extends Application(AuthenticatedDevice.class)); environment.jersey().register(new WebsocketRefreshApplicationEventListener(accountsManager, - disconnectionRequestManager, webSocketConnectionEventManager)); + disconnectionRequestManager)); environment.jersey().register(new TimestampResponseFilter()); /// @@ -995,7 +995,7 @@ public class WhisperServerService extends Application provisioningEnvironment = new WebSocketEnvironment<>(environment, webSocketEnvironment.getRequestLog(), Duration.ofMillis(60000)); provisioningEnvironment.jersey().register(new WebsocketRefreshApplicationEventListener(accountsManager, - disconnectionRequestManager, webSocketConnectionEventManager)); + disconnectionRequestManager)); provisioningEnvironment.setConnectListener(new ProvisioningConnectListener(provisioningManager)); provisioningEnvironment.jersey().register(new MetricsApplicationEventListener(TrafficSource.WEBSOCKET, clientReleaseManager)); provisioningEnvironment.jersey().register(new KeepAliveController(webSocketConnectionEventManager)); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java index 6831640d6..16a44f17c 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManager.java @@ -55,7 +55,6 @@ public class RegistrationLockVerificationManager { private final AccountsManager accounts; private final DisconnectionRequestManager disconnectionRequestManager; - private final WebSocketConnectionEventManager webSocketConnectionEventManager; private final ExternalServiceCredentialsGenerator svr2CredentialGenerator; private final ExternalServiceCredentialsGenerator svr3CredentialGenerator; private final RateLimiters rateLimiters; @@ -65,7 +64,6 @@ public class RegistrationLockVerificationManager { public RegistrationLockVerificationManager( final AccountsManager accounts, final DisconnectionRequestManager disconnectionRequestManager, - final WebSocketConnectionEventManager webSocketConnectionEventManager, final ExternalServiceCredentialsGenerator svr2CredentialGenerator, final ExternalServiceCredentialsGenerator svr3CredentialGenerator, final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager, @@ -73,7 +71,6 @@ public class RegistrationLockVerificationManager { final RateLimiters rateLimiters) { this.accounts = accounts; this.disconnectionRequestManager = disconnectionRequestManager; - this.webSocketConnectionEventManager = webSocketConnectionEventManager; this.svr2CredentialGenerator = svr2CredentialGenerator; this.svr3CredentialGenerator = svr3CredentialGenerator; this.registrationRecoveryPasswordsManager = registrationRecoveryPasswordsManager; @@ -164,7 +161,6 @@ public class RegistrationLockVerificationManager { } final List deviceIds = updatedAccount.getDevices().stream().map(Device::getId).toList(); - webSocketConnectionEventManager.requestDisconnection(updatedAccount.getUuid(), deviceIds); disconnectionRequestManager.requestDisconnection(updatedAccount.getUuid(), deviceIds); try { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshApplicationEventListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshApplicationEventListener.java index ce865de2d..10944cc46 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshApplicationEventListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshApplicationEventListener.java @@ -9,7 +9,6 @@ import org.glassfish.jersey.server.monitoring.ApplicationEvent; import org.glassfish.jersey.server.monitoring.ApplicationEventListener; import org.glassfish.jersey.server.monitoring.RequestEvent; import org.glassfish.jersey.server.monitoring.RequestEventListener; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.storage.AccountsManager; /** @@ -20,12 +19,10 @@ public class WebsocketRefreshApplicationEventListener implements ApplicationEven private final WebsocketRefreshRequestEventListener websocketRefreshRequestEventListener; public WebsocketRefreshApplicationEventListener(final AccountsManager accountsManager, - final DisconnectionRequestManager disconnectionRequestManager, - final WebSocketConnectionEventManager webSocketConnectionEventManager) { + final DisconnectionRequestManager disconnectionRequestManager) { this.websocketRefreshRequestEventListener = new WebsocketRefreshRequestEventListener( disconnectionRequestManager, - webSocketConnectionEventManager, new LinkedDeviceRefreshRequirementProvider(accountsManager), new PhoneNumberChangeRefreshRequirementProvider(accountsManager)); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshRequestEventListener.java b/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshRequestEventListener.java index ff80e24f4..9f6a9bd0e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshRequestEventListener.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/auth/WebsocketRefreshRequestEventListener.java @@ -19,12 +19,10 @@ import org.glassfish.jersey.server.monitoring.RequestEvent.Type; import org.glassfish.jersey.server.monitoring.RequestEventListener; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; public class WebsocketRefreshRequestEventListener implements RequestEventListener { private final DisconnectionRequestManager disconnectionRequestManager; - private final WebSocketConnectionEventManager webSocketConnectionEventManager; private final WebsocketRefreshRequirementProvider[] providers; private static final Counter DISPLACED_ACCOUNTS = Metrics.counter( @@ -37,11 +35,9 @@ public class WebsocketRefreshRequestEventListener implements RequestEventListene public WebsocketRefreshRequestEventListener( final DisconnectionRequestManager disconnectionRequestManager, - final WebSocketConnectionEventManager webSocketConnectionEventManager, final WebsocketRefreshRequirementProvider... providers) { this.disconnectionRequestManager = disconnectionRequestManager; - this.webSocketConnectionEventManager = webSocketConnectionEventManager; this.providers = providers; } @@ -63,7 +59,6 @@ public class WebsocketRefreshRequestEventListener implements RequestEventListene .forEach(pair -> { try { displacedDevices.incrementAndGet(); - webSocketConnectionEventManager.requestDisconnection(pair.first(), List.of(pair.second())); disconnectionRequestManager.requestDisconnection(pair.first(), List.of(pair.second())); } catch (final Exception e) { logger.error("Could not displace device presence", e); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/WebSocketConnectionEventManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/WebSocketConnectionEventManager.java index 2c4c83477..147f0ca43 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/WebSocketConnectionEventManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/WebSocketConnectionEventManager.java @@ -23,7 +23,6 @@ import java.util.List; import java.util.Map; import java.util.Objects; import java.util.UUID; -import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionStage; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.Executor; @@ -36,7 +35,6 @@ import org.whispersystems.textsecuregcm.entities.MessageProtos; import org.whispersystems.textsecuregcm.metrics.MetricsUtil; import org.whispersystems.textsecuregcm.redis.FaultTolerantPubSubClusterConnection; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; -import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.util.RedisClusterUtil; import org.whispersystems.textsecuregcm.util.UUIDUtil; import org.whispersystems.textsecuregcm.util.Util; @@ -77,11 +75,6 @@ public class WebSocketConnectionEventManager extends RedisClusterPubSubAdapter requestDisconnection(final UUID accountIdentifier) { - return requestDisconnection(accountIdentifier, Device.ALL_POSSIBLE_DEVICE_IDS); - } - - /** - * Broadcasts a request that the specified devices associated with the identified account and connected to any event - * manager instance close their network connections. - * - * @param accountIdentifier the account identifier for which to request disconnection - * @param deviceIds the IDs of the devices for which to request disconnection - * - * @return a future that completes when the request has been sent - */ - public CompletableFuture requestDisconnection(final UUID accountIdentifier, final Collection deviceIds) { - return CompletableFuture.allOf(deviceIds.stream() - .map(deviceId -> clusterClient.withBinaryCluster(connection -> connection.async() - .spublish(getClientEventChannel(accountIdentifier, deviceId), DISCONNECT_REQUESTED_EVENT_BYTES)) - .toCompletableFuture()) - .toArray(CompletableFuture[]::new)); - } - @Override public void handleDisconnectionRequest(final UUID accountIdentifier, final Collection deviceIds) { deviceIds.stream() 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 ed2a72266..53db375dc 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -77,7 +77,6 @@ import org.whispersystems.textsecuregcm.entities.RestoreAccountRequest; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.metrics.UserAgentTagUtil; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantPubSubConnection; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; @@ -127,7 +126,6 @@ public class AccountsManager extends RedisPubSubAdapter implemen private final SecureStorageClient secureStorageClient; private final SecureValueRecovery2Client secureValueRecovery2Client; private final DisconnectionRequestManager disconnectionRequestManager; - private final WebSocketConnectionEventManager webSocketConnectionEventManager; private final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager; private final ClientPublicKeysManager clientPublicKeysManager; private final Executor accountLockExecutor; @@ -210,7 +208,6 @@ public class AccountsManager extends RedisPubSubAdapter implemen final SecureStorageClient secureStorageClient, final SecureValueRecovery2Client secureValueRecovery2Client, final DisconnectionRequestManager disconnectionRequestManager, - final WebSocketConnectionEventManager webSocketConnectionEventManager, final RegistrationRecoveryPasswordsManager registrationRecoveryPasswordsManager, final ClientPublicKeysManager clientPublicKeysManager, final Executor accountLockExecutor, @@ -229,7 +226,6 @@ public class AccountsManager extends RedisPubSubAdapter implemen this.secureStorageClient = secureStorageClient; this.secureValueRecovery2Client = secureValueRecovery2Client; this.disconnectionRequestManager = disconnectionRequestManager; - this.webSocketConnectionEventManager = webSocketConnectionEventManager; this.registrationRecoveryPasswordsManager = requireNonNull(registrationRecoveryPasswordsManager); this.clientPublicKeysManager = clientPublicKeysManager; this.accountLockExecutor = accountLockExecutor; @@ -336,7 +332,6 @@ public class AccountsManager extends RedisPubSubAdapter implemen keysManager.deleteSingleUsePreKeys(pni), messagesManager.clear(aci), profilesManager.deleteAll(aci)) - .thenCompose(ignored -> webSocketConnectionEventManager.requestDisconnection(aci)) .thenCompose(ignored -> disconnectionRequestManager.requestDisconnection(aci)) .thenCompose(ignored -> accounts.reclaimAccount(e.getExistingAccount(), account, additionalWriteItems)) .thenCompose(ignored -> { @@ -601,7 +596,6 @@ public class AccountsManager extends RedisPubSubAdapter implemen }) .whenComplete((ignored, throwable) -> { if (throwable == null) { - webSocketConnectionEventManager.requestDisconnection(accountIdentifier, List.of(deviceId)); disconnectionRequestManager.requestDisconnection(accountIdentifier, List.of(deviceId)); } }); @@ -1249,10 +1243,7 @@ public class AccountsManager extends RedisPubSubAdapter implemen registrationRecoveryPasswordsManager.removeForNumber(account.getNumber())) .thenCompose(ignored -> accounts.delete(account.getUuid(), additionalWriteItems)) .thenCompose(ignored -> redisDeleteAsync(account)) - .thenRun(() -> { - webSocketConnectionEventManager.requestDisconnection(account.getUuid()); - disconnectionRequestManager.requestDisconnection(account.getUuid()); - }); + .thenRun(() -> disconnectionRequestManager.requestDisconnection(account.getUuid())); } private String getAccountMapKey(String key) { 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 774cbf912..7a6e9c4ac 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/workers/CommandDependencies.java @@ -228,7 +228,7 @@ record CommandDependencies( new ClientPublicKeysManager(clientPublicKeys, accountLockManager, accountLockExecutor); AccountsManager accountsManager = new AccountsManager(accounts, phoneNumberIdentifiers, cacheCluster, pubsubClient, accountLockManager, keys, messagesManager, profilesManager, - secureStorageClient, secureValueRecovery2Client, disconnectionRequestManager, webSocketConnectionEventManager, + secureStorageClient, secureValueRecovery2Client, disconnectionRequestManager, registrationRecoveryPasswordsManager, clientPublicKeysManager, accountLockExecutor, messagePollExecutor, clock, configuration.getLinkDeviceSecretConfiguration().secret().value(), dynamicConfigurationManager); RateLimiters rateLimiters = RateLimiters.createAndValidate(configuration.getLimitsConfiguration(), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/auth/LinkedDeviceRefreshRequirementProviderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/auth/LinkedDeviceRefreshRequirementProviderTest.java index 14b73efd3..3c44f14c1 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/auth/LinkedDeviceRefreshRequirementProviderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/auth/LinkedDeviceRefreshRequirementProviderTest.java @@ -59,7 +59,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; import org.mockito.ArgumentCaptor; import org.whispersystems.textsecuregcm.filters.RemoteAddressFilter; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.AccountsManager; import org.whispersystems.textsecuregcm.storage.Device; @@ -96,7 +95,6 @@ class LinkedDeviceRefreshRequirementProviderTest { private AccountsManager accountsManager; private DisconnectionRequestManager disconnectionRequestManager; - private WebSocketConnectionEventManager webSocketConnectionEventManager; private LinkedDeviceRefreshRequirementProvider provider; @@ -104,12 +102,11 @@ class LinkedDeviceRefreshRequirementProviderTest { void setup() { accountsManager = mock(AccountsManager.class); disconnectionRequestManager = mock(DisconnectionRequestManager.class); - webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); provider = new LinkedDeviceRefreshRequirementProvider(accountsManager); final WebsocketRefreshRequestEventListener listener = - new WebsocketRefreshRequestEventListener(disconnectionRequestManager, webSocketConnectionEventManager, provider); + new WebsocketRefreshRequestEventListener(disconnectionRequestManager, provider); when(applicationEventListener.onRequest(any())).thenReturn(listener); @@ -141,10 +138,6 @@ class LinkedDeviceRefreshRequirementProviderTest { assertEquals(initialDeviceCount + addedDeviceNames.size(), account.getDevices().size()); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of((byte) 1)); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of((byte) 2)); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of((byte) 3)); - verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of((byte) 1)); verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of((byte) 2)); verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of((byte) 3)); @@ -175,12 +168,10 @@ class LinkedDeviceRefreshRequirementProviderTest { assertEquals(200, response.getStatus()); - initialDeviceIds.forEach(deviceId -> { - verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of(deviceId)); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of(deviceId)); - }); + initialDeviceIds.forEach(deviceId -> + verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of(deviceId))); - verifyNoMoreInteractions(webSocketConnectionEventManager); + verifyNoMoreInteractions(disconnectionRequestManager); } @Test diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/auth/PhoneNumberChangeRefreshRequirementProviderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/auth/PhoneNumberChangeRefreshRequirementProviderTest.java index 69f8adf50..55a47d34e 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/auth/PhoneNumberChangeRefreshRequirementProviderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/auth/PhoneNumberChangeRefreshRequirementProviderTest.java @@ -47,7 +47,6 @@ import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.EnumSource; import org.whispersystems.textsecuregcm.filters.RemoteAddressFilter; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.AccountsManager; import org.whispersystems.textsecuregcm.storage.Device; @@ -77,9 +76,6 @@ class PhoneNumberChangeRefreshRequirementProviderTest { private static final DisconnectionRequestManager DISCONNECTION_REQUEST_MANAGER = mock(DisconnectionRequestManager.class); - private static final WebSocketConnectionEventManager WEB_SOCKET_CONNECTION_EVENT_MANAGER = - mock(WebSocketConnectionEventManager.class); - private WebSocketClient client; private final Account account1 = new Account(); private final Account account2 = new Account(); @@ -88,7 +84,7 @@ class PhoneNumberChangeRefreshRequirementProviderTest { @BeforeEach void setUp() throws Exception { - reset(AUTHENTICATOR, ACCOUNTS_MANAGER, WEB_SOCKET_CONNECTION_EVENT_MANAGER); + reset(AUTHENTICATOR, ACCOUNTS_MANAGER, DISCONNECTION_REQUEST_MANAGER); client = new WebSocketClient(); client.start(); @@ -127,9 +123,9 @@ class PhoneNumberChangeRefreshRequirementProviderTest { .addMappingForUrlPatterns(EnumSet.of(DispatcherType.REQUEST), false, "/*"); webSocketEnvironment.jersey().register(new RemoteAddressFilter()); webSocketEnvironment.jersey() - .register(new WebsocketRefreshApplicationEventListener(ACCOUNTS_MANAGER, DISCONNECTION_REQUEST_MANAGER, WEB_SOCKET_CONNECTION_EVENT_MANAGER)); + .register(new WebsocketRefreshApplicationEventListener(ACCOUNTS_MANAGER, DISCONNECTION_REQUEST_MANAGER)); environment.jersey() - .register(new WebsocketRefreshApplicationEventListener(ACCOUNTS_MANAGER, DISCONNECTION_REQUEST_MANAGER, WEB_SOCKET_CONNECTION_EVENT_MANAGER)); + .register(new WebsocketRefreshApplicationEventListener(ACCOUNTS_MANAGER, DISCONNECTION_REQUEST_MANAGER)); webSocketEnvironment.setConnectListener(webSocketSessionContext -> { }); @@ -203,7 +199,6 @@ class PhoneNumberChangeRefreshRequirementProviderTest { // Event listeners can fire after responses are sent verify(ACCOUNTS_MANAGER, timeout(5000).times(1)).getByAccountIdentifier(eq(account1.getUuid())); - verifyNoMoreInteractions(WEB_SOCKET_CONNECTION_EVENT_MANAGER); verifyNoMoreInteractions(ACCOUNTS_MANAGER); } @@ -220,11 +215,6 @@ class PhoneNumberChangeRefreshRequirementProviderTest { verify(DISCONNECTION_REQUEST_MANAGER, timeout(5000)) .requestDisconnection(account1.getUuid(), List.of(authenticatedDevice.getId())); verifyNoMoreInteractions(DISCONNECTION_REQUEST_MANAGER); - - - verify(WEB_SOCKET_CONNECTION_EVENT_MANAGER, timeout(5000)) - .requestDisconnection(account1.getUuid(), List.of(authenticatedDevice.getId())); - verifyNoMoreInteractions(WEB_SOCKET_CONNECTION_EVENT_MANAGER); } @Test @@ -241,10 +231,6 @@ class PhoneNumberChangeRefreshRequirementProviderTest { verify(DISCONNECTION_REQUEST_MANAGER, timeout(5000)) .requestDisconnection(account1.getUuid(), List.of(authenticatedDevice.getId())); verifyNoMoreInteractions(DISCONNECTION_REQUEST_MANAGER); - - verify(WEB_SOCKET_CONNECTION_EVENT_MANAGER, timeout(5000)) - .requestDisconnection(account1.getUuid(), List.of(authenticatedDevice.getId())); - verifyNoMoreInteractions(WEB_SOCKET_CONNECTION_EVENT_MANAGER); } @ParameterizedTest diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManagerTest.java index fe83bdba1..0a33465cf 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/auth/RegistrationLockVerificationManagerTest.java @@ -47,7 +47,6 @@ class RegistrationLockVerificationManagerTest { private final AccountsManager accountsManager = mock(AccountsManager.class); private final DisconnectionRequestManager disconnectionRequestManager = mock(DisconnectionRequestManager.class); - private final WebSocketConnectionEventManager webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); private final ExternalServiceCredentialsGenerator svr2CredentialsGenerator = mock( ExternalServiceCredentialsGenerator.class); private final ExternalServiceCredentialsGenerator svr3CredentialsGenerator = mock( @@ -57,7 +56,7 @@ class RegistrationLockVerificationManagerTest { private static PushNotificationManager pushNotificationManager = mock(PushNotificationManager.class); private final RateLimiters rateLimiters = mock(RateLimiters.class); private final RegistrationLockVerificationManager registrationLockVerificationManager = new RegistrationLockVerificationManager( - accountsManager, disconnectionRequestManager, webSocketConnectionEventManager, svr2CredentialsGenerator, + accountsManager, disconnectionRequestManager, svr2CredentialsGenerator, svr3CredentialsGenerator, registrationRecoveryPasswordsManager, pushNotificationManager, rateLimiters); private final RateLimiter pinLimiter = mock(RateLimiter.class); @@ -109,7 +108,6 @@ class RegistrationLockVerificationManagerTest { verify(registrationRecoveryPasswordsManager, never()).removeForNumber(account.getNumber()); } verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of(Device.PRIMARY_ID)); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of(Device.PRIMARY_ID)); try { verify(pushNotificationManager).sendAttemptLoginNotification(any(), eq("failedRegistrationLock")); } catch (NotPushRegisteredException npre) {} @@ -133,7 +131,6 @@ class RegistrationLockVerificationManagerTest { } catch (NotPushRegisteredException npre) {} verify(registrationRecoveryPasswordsManager, never()).removeForNumber(account.getNumber()); verify(disconnectionRequestManager, never()).requestDisconnection(any(), any()); - verify(webSocketConnectionEventManager, never()).requestDisconnection(any(), any()); }); } }; @@ -172,7 +169,6 @@ class RegistrationLockVerificationManagerTest { verify(account, never()).lockAuthTokenHash(); verify(registrationRecoveryPasswordsManager, never()).removeForNumber(account.getNumber()); verify(disconnectionRequestManager, never()).requestDisconnection(any(), any()); - verify(webSocketConnectionEventManager, never()).requestDisconnection(any(), any()); } static Stream testSuccess() { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java index 635fbd1cb..d1192cbd7 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java @@ -133,7 +133,7 @@ class DeviceControllerTest { .addProvider(new AuthValueFactoryProvider.Binder<>(AuthenticatedDevice.class)) .addProvider(new RateLimitExceededExceptionMapper()) .setTestContainerFactory(new GrizzlyWebTestContainerFactory()) - .addProvider(new WebsocketRefreshApplicationEventListener(accountsManager, disconnectionRequestManager, webSocketConnectionEventManager)) + .addProvider(new WebsocketRefreshApplicationEventListener(accountsManager, disconnectionRequestManager)) .addProvider(new DeviceLimitExceededExceptionMapper()) .addResource(deviceController) .build(); 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 dfaf4d304..809ee1976 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationDeletionIntegrationTest.java @@ -46,7 +46,6 @@ import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.entities.GcmRegistrationId; import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; import org.whispersystems.textsecuregcm.identity.IdentityType; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -80,7 +79,6 @@ public class AccountCreationDeletionIntegrationTest { private AccountsManager accountsManager; private KeysManager keysManager; private ClientPublicKeysManager clientPublicKeysManager; - private WebSocketConnectionEventManager webSocketConnectionEventManager; private DisconnectionRequestManager disconnectionRequestManager; record DeliveryChannels(boolean fetchesMessages, String apnsToken, String fcmToken) {} @@ -143,10 +141,6 @@ public class AccountCreationDeletionIntegrationTest { when(registrationRecoveryPasswordsManager.removeForNumber(any())) .thenReturn(CompletableFuture.completedFuture(null)); - webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); - when(webSocketConnectionEventManager.requestDisconnection(any())) - .thenReturn(CompletableFuture.completedFuture(null)); - disconnectionRequestManager = mock(DisconnectionRequestManager.class); when(disconnectionRequestManager.requestDisconnection(any())).thenReturn(CompletableFuture.completedFuture(null)); @@ -162,7 +156,6 @@ public class AccountCreationDeletionIntegrationTest { secureStorageClient, svr2Client, disconnectionRequestManager, - webSocketConnectionEventManager, registrationRecoveryPasswordsManager, clientPublicKeysManager, executor, @@ -410,7 +403,6 @@ public class AccountCreationDeletionIntegrationTest { assertEquals(existingAccountUuid, reregisteredAccount.getUuid()); - verify(webSocketConnectionEventManager).requestDisconnection(existingAccountUuid); verify(disconnectionRequestManager).requestDisconnection(existingAccountUuid); } @@ -486,7 +478,6 @@ public class AccountCreationDeletionIntegrationTest { assertFalse(keysManager.getLastResort(account.getPhoneNumberIdentifier(), Device.PRIMARY_ID).join().isPresent()); assertFalse(clientPublicKeysManager.findPublicKey(account.getUuid(), Device.PRIMARY_ID).join().isPresent()); - verify(webSocketConnectionEventManager).requestDisconnection(aci); verify(disconnectionRequestManager).requestDisconnection(aci); } 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 a6c753963..74c8227f7 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java @@ -21,7 +21,6 @@ import java.util.OptionalInt; import java.util.Set; import java.util.UUID; import java.util.concurrent.CompletableFuture; -import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; @@ -38,7 +37,6 @@ import org.whispersystems.textsecuregcm.controllers.MismatchedDevicesException; import org.whispersystems.textsecuregcm.entities.AccountAttributes; import org.whispersystems.textsecuregcm.entities.ECSignedPreKey; import org.whispersystems.textsecuregcm.identity.IdentityType; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -69,7 +67,6 @@ class AccountsManagerChangeNumberIntegrationTest { private KeysManager keysManager; private DisconnectionRequestManager disconnectionRequestManager; - private WebSocketConnectionEventManager webSocketConnectionEventManager; private ScheduledExecutorService executor; private AccountsManager accountsManager; @@ -119,7 +116,6 @@ class AccountsManagerChangeNumberIntegrationTest { final SecureValueRecovery2Client svr2Client = mock(SecureValueRecovery2Client.class); when(svr2Client.deleteBackups(any())).thenReturn(CompletableFuture.completedFuture(null)); - webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); disconnectionRequestManager = mock(DisconnectionRequestManager.class); final PhoneNumberIdentifiers phoneNumberIdentifiers = @@ -149,7 +145,6 @@ class AccountsManagerChangeNumberIntegrationTest { secureStorageClient, svr2Client, disconnectionRequestManager, - webSocketConnectionEventManager, registrationRecoveryPasswordsManager, clientPublicKeysManager, executor, @@ -280,7 +275,6 @@ class AccountsManagerChangeNumberIntegrationTest { assertEquals(secondNumber, accountsManager.getByAccountIdentifier(originalUuid).map(Account::getNumber).orElseThrow()); - verify(webSocketConnectionEventManager).requestDisconnection(existingAccountUuid); verify(disconnectionRequestManager).requestDisconnection(existingAccountUuid); assertEquals(Optional.of(existingAccountUuid), accountsManager.findRecentlyDeletedAccountIdentifier(originalNumber)); 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 d64ec325a..237a8b552 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerConcurrentModificationIntegrationTest.java @@ -136,7 +136,6 @@ class AccountsManagerConcurrentModificationIntegrationTest { mock(SecureStorageClient.class), mock(SecureValueRecovery2Client.class), mock(DisconnectionRequestManager.class), - mock(WebSocketConnectionEventManager.class), mock(RegistrationRecoveryPasswordsManager.class), mock(ClientPublicKeysManager.class), mock(Executor.class), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerDeviceTransferIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerDeviceTransferIntegrationTest.java index 227b23b00..28916b73e 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerDeviceTransferIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerDeviceTransferIntegrationTest.java @@ -65,7 +65,6 @@ public class AccountsManagerDeviceTransferIntegrationTest { mock(SecureStorageClient.class), mock(SecureValueRecovery2Client.class), mock(DisconnectionRequestManager.class), - mock(WebSocketConnectionEventManager.class), mock(RegistrationRecoveryPasswordsManager.class), mock(ClientPublicKeysManager.class), mock(ExecutorService.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 442064d38..7e72d8b94 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -81,7 +81,6 @@ import org.whispersystems.textsecuregcm.entities.KEMSignedPreKey; import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier; import org.whispersystems.textsecuregcm.identity.IdentityType; import org.whispersystems.textsecuregcm.identity.PniServiceIdentifier; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClusterClient; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -120,7 +119,6 @@ class AccountsManagerTest { private MessagesManager messagesManager; private ProfilesManager profilesManager; private DisconnectionRequestManager disconnectionRequestManager; - private WebSocketConnectionEventManager webSocketConnectionEventManager; private ClientPublicKeysManager clientPublicKeysManager; private Map phoneNumberIdentifiersByE164; @@ -156,7 +154,6 @@ class AccountsManagerTest { messagesManager = mock(MessagesManager.class); profilesManager = mock(ProfilesManager.class); disconnectionRequestManager = mock(DisconnectionRequestManager.class); - webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); clientPublicKeysManager = mock(ClientPublicKeysManager.class); dynamicConfiguration = mock(DynamicConfiguration.class); @@ -242,9 +239,6 @@ class AccountsManagerTest { .stringAsyncCommands(asyncClusterCommands) .build(); - when(webSocketConnectionEventManager.requestDisconnection(any())) - .thenReturn(CompletableFuture.completedFuture(null)); - when(disconnectionRequestManager.requestDisconnection(any())).thenReturn(CompletableFuture.completedFuture(null)); accountsManager = new AccountsManager( @@ -259,7 +253,6 @@ class AccountsManagerTest { storageClient, svr2Client, disconnectionRequestManager, - webSocketConnectionEventManager, registrationRecoveryPasswordsManager, clientPublicKeysManager, mock(Executor.class), @@ -799,7 +792,7 @@ class AccountsManagerTest { verify(keysManager, times(2)).deleteSingleUsePreKeys(account.getUuid(), linkedDevice.getId()); verify(keysManager).buildWriteItemsForRemovedDevice(account.getUuid(), account.getPhoneNumberIdentifier(), linkedDevice.getId()); verify(clientPublicKeysManager).buildTransactWriteItemForDeletion(account.getUuid(), linkedDevice.getId()); - verify(webSocketConnectionEventManager).requestDisconnection(account.getUuid(), List.of(linkedDevice.getId())); + verify(disconnectionRequestManager).requestDisconnection(account.getUuid(), List.of(linkedDevice.getId())); } @Test @@ -817,7 +810,7 @@ class AccountsManagerTest { assertDoesNotThrow(account::getPrimaryDevice); verify(messagesManager, never()).clear(any(), anyByte()); verify(keysManager, never()).deleteSingleUsePreKeys(any(), anyByte()); - verify(webSocketConnectionEventManager, never()).requestDisconnection(any(), any()); + verify(disconnectionRequestManager, never()).requestDisconnection(any(), any()); } @Test @@ -886,7 +879,6 @@ class AccountsManagerTest { verify(keysManager, times(2)).deleteSingleUsePreKeys(phoneNumberIdentifiersByE164.get(e164)); verify(messagesManager, times(2)).clear(existingUuid); verify(profilesManager, times(2)).deleteAll(existingUuid); - verify(webSocketConnectionEventManager).requestDisconnection(existingUuid); verify(disconnectionRequestManager).requestDisconnection(existingUuid); } 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 30b8eb90e..2d4f2d158 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerUsernameIntegrationTest.java @@ -36,7 +36,6 @@ import org.junit.jupiter.api.extension.RegisterExtension; import org.mockito.Mockito; import org.whispersystems.textsecuregcm.auth.DisconnectionRequestManager; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.FaultTolerantRedisClient; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -135,9 +134,6 @@ class AccountsManagerUsernameIntegrationTest { when(messageManager.clear(any())).thenReturn(CompletableFuture.completedFuture(null)); when(profileManager.deleteAll(any())).thenReturn(CompletableFuture.completedFuture(null)); - final WebSocketConnectionEventManager webSocketConnectionEventManager = mock(WebSocketConnectionEventManager.class); - when(webSocketConnectionEventManager.requestDisconnection(any())).thenReturn(CompletableFuture.completedFuture(null)); - final DisconnectionRequestManager disconnectionRequestManager = mock(DisconnectionRequestManager.class); when(disconnectionRequestManager.requestDisconnection(any())).thenReturn(CompletableFuture.completedFuture(null)); @@ -153,7 +149,6 @@ class AccountsManagerUsernameIntegrationTest { mock(SecureStorageClient.class), mock(SecureValueRecovery2Client.class), disconnectionRequestManager, - webSocketConnectionEventManager, mock(RegistrationRecoveryPasswordsManager.class), mock(ClientPublicKeysManager.class), 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 a4d2ef779..96f6aa0b8 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AddRemoveDeviceIntegrationTest.java @@ -37,7 +37,6 @@ import org.whispersystems.textsecuregcm.auth.DisconnectionRequestManager; import org.whispersystems.textsecuregcm.configuration.dynamic.DynamicConfiguration; import org.whispersystems.textsecuregcm.entities.DeviceInfo; import org.whispersystems.textsecuregcm.identity.IdentityType; -import org.whispersystems.textsecuregcm.push.WebSocketConnectionEventManager; import org.whispersystems.textsecuregcm.redis.RedisClusterExtension; import org.whispersystems.textsecuregcm.redis.RedisServerExtension; import org.whispersystems.textsecuregcm.securestorage.SecureStorageClient; @@ -158,8 +157,7 @@ public class AddRemoveDeviceIntegrationTest { secureStorageClient, svr2Client, mock(DisconnectionRequestManager.class), - mock(WebSocketConnectionEventManager.class), - registrationRecoveryPasswordsManager, + mock(RegistrationRecoveryPasswordsManager.class), clientPublicKeysManager, accountLockExecutor, messagePollExecutor,