Add a "refresh websocket on number change" provider

This commit is contained in:
Jon Chambers
2021-09-10 15:32:28 -04:00
committed by Jon Chambers
parent 49ccbba2e3
commit 6a5d475198
8 changed files with 185 additions and 23 deletions

View File

@@ -89,10 +89,10 @@ class AuthEnablementRefreshRequirementProviderTest {
private final ApplicationEventListener applicationEventListener = mock(ApplicationEventListener.class);
private Account account = new Account();
private final Account account = new Account();
private Device authenticatedDevice = DevicesHelper.createDevice(1L);
private Supplier<Optional<TestPrincipal>> principalSupplier = () -> Optional.of(
private final Supplier<Optional<TestPrincipal>> principalSupplier = () -> Optional.of(
new TestPrincipal("test", account, authenticatedDevice));
private final ResourceExtension resources = ResourceExtension.builder()
@@ -109,14 +109,15 @@ class AuthEnablementRefreshRequirementProviderTest {
private ClientPresenceManager clientPresenceManager;
private WebsocketRefreshRequestEventListener listener;
private AuthEnablementRefreshRequirementProvider provider;
@BeforeEach
void setup() {
clientPresenceManager = mock(ClientPresenceManager.class);
provider = new AuthEnablementRefreshRequirementProvider();
listener = new WebsocketRefreshRequestEventListener(clientPresenceManager, provider);
final WebsocketRefreshRequestEventListener listener =
new WebsocketRefreshRequestEventListener(clientPresenceManager, provider);
when(applicationEventListener.onRequest(any())).thenReturn(listener);
final UUID uuid = UUID.randomUUID();

View File

@@ -0,0 +1,107 @@
/*
* Copyright 2013-2021 Signal Messenger, LLC
* SPDX-License-Identifier: AGPL-3.0-only
*/
package org.whispersystems.textsecuregcm.auth;
import org.glassfish.jersey.server.ContainerRequest;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.Test;
import org.whispersystems.textsecuregcm.storage.Account;
import org.whispersystems.textsecuregcm.storage.Device;
import org.whispersystems.textsecuregcm.util.Pair;
import javax.annotation.Nullable;
import javax.ws.rs.core.SecurityContext;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import static org.junit.jupiter.api.Assertions.*;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
class PhoneNumberChangeRefreshRequirementProviderTest {
private PhoneNumberChangeRefreshRequirementProvider provider;
private Account account;
private ContainerRequest request;
private static final UUID ACCOUNT_UUID = UUID.randomUUID();
private static final String NUMBER = "+18005551234";
private static final String CHANGED_NUMBER = "+18005554321";
@BeforeEach
void setUp() {
provider = new PhoneNumberChangeRefreshRequirementProvider();
account = mock(Account.class);
final Device device = mock(Device.class);
when(account.getUuid()).thenReturn(ACCOUNT_UUID);
when(account.getNumber()).thenReturn(NUMBER);
when(account.getDevices()).thenReturn(Set.of(device));
when(device.getId()).thenReturn(Device.MASTER_ID);
request = mock(ContainerRequest.class);
final Map<String, Object> requestProperties = new HashMap<>();
doAnswer(invocation -> {
requestProperties.put(invocation.getArgument(0, String.class), invocation.getArgument(1));
return null;
}).when(request).setProperty(anyString(), any());
when(request.getProperty(anyString())).thenAnswer(
invocation -> requestProperties.get(invocation.getArgument(0, String.class)));
}
@Test
void handleRequestNoChange() {
setAuthenticatedAccount(request, account);
provider.handleRequestFiltered(request);
assertEquals(Collections.emptyList(), provider.handleRequestFinished(request));
}
@Test
void handleRequestNumberChange() {
setAuthenticatedAccount(request, account);
provider.handleRequestFiltered(request);
when(account.getNumber()).thenReturn(CHANGED_NUMBER);
assertEquals(List.of(new Pair<>(ACCOUNT_UUID, Device.MASTER_ID)), provider.handleRequestFinished(request));
}
@Test
void handleRequestNoAuthenticatedAccount() {
final ContainerRequest request = mock(ContainerRequest.class);
setAuthenticatedAccount(request, null);
provider.handleRequestFiltered(request);
assertEquals(Collections.emptyList(), provider.handleRequestFinished(request));
}
private void setAuthenticatedAccount(final ContainerRequest mockRequest, @Nullable final Account account) {
final SecurityContext securityContext = mock(SecurityContext.class);
when(mockRequest.getSecurityContext()).thenReturn(securityContext);
if (account != null) {
final AuthenticatedAccount authenticatedAccount = mock(AuthenticatedAccount.class);
when(securityContext.getUserPrincipal()).thenReturn(authenticatedAccount);
when(authenticatedAccount.getAccount()).thenReturn(account);
} else {
when(securityContext.getUserPrincipal()).thenReturn(null);
}
}
}