From 01fde4f9ca1d5f2edeff25282fc63a1cbc4c30b4 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Mon, 27 Nov 2023 11:32:17 -0500 Subject: [PATCH] Require PNI-associated registration IDs for new devices --- .../java/org/signal/integration/TestUser.java | 8 ++- .../controllers/AccountController.java | 2 +- .../controllers/DeviceController.java | 2 +- .../entities/AccountAttributes.java | 12 ++--- .../storage/AccountsManager.java | 2 +- .../controllers/AccountControllerTest.java | 10 ++-- .../controllers/DeviceControllerTest.java | 52 ++++++++++--------- .../RegistrationControllerTest.java | 30 +++++------ .../AccountCreationIntegrationTest.java | 11 ++-- ...ntsManagerChangeNumberIntegrationTest.java | 2 +- .../storage/AccountsManagerTest.java | 12 ++--- 11 files changed, 74 insertions(+), 69 deletions(-) diff --git a/integration-tests/src/main/java/org/signal/integration/TestUser.java b/integration-tests/src/main/java/org/signal/integration/TestUser.java index 09df391fc..33a2fdc7b 100644 --- a/integration-tests/src/main/java/org/signal/integration/TestUser.java +++ b/integration-tests/src/main/java/org/signal/integration/TestUser.java @@ -28,6 +28,8 @@ public class TestUser { private final int registrationId; + private final int pniRegistrationId; + private final IdentityKeyPair aciIdentityKey; private final Map devices = new ConcurrentHashMap<>(); @@ -54,11 +56,13 @@ public class TestUser { final IdentityKeyPair pniIdentityKey = IdentityKeyPair.generate(); // registration id final int registrationId = KeyHelper.generateRegistrationId(false); + final int pniRegistrationId = KeyHelper.generateRegistrationId(false); // uak final byte[] unidentifiedAccessKey = RandomUtils.nextBytes(UnidentifiedAccessUtil.UNIDENTIFIED_ACCESS_KEY_LENGTH); return new TestUser( registrationId, + pniRegistrationId, aciIdentityKey, phoneNumber, pniIdentityKey, @@ -69,6 +73,7 @@ public class TestUser { public TestUser( final int registrationId, + final int pniRegistrationId, final IdentityKeyPair aciIdentityKey, final String phoneNumber, final IdentityKeyPair pniIdentityKey, @@ -76,6 +81,7 @@ public class TestUser { final String accountPassword, final byte[] registrationPassword) { this.registrationId = registrationId; + this.pniRegistrationId = pniRegistrationId; this.aciIdentityKey = aciIdentityKey; this.phoneNumber = phoneNumber; this.pniIdentityKey = pniIdentityKey; @@ -118,7 +124,7 @@ public class TestUser { } public AccountAttributes accountAttributes() { - return new AccountAttributes(true, registrationId, "", "", true, new Device.DeviceCapabilities(false, false, false, false)) + return new AccountAttributes(true, registrationId, pniRegistrationId, "", "", true, new Device.DeviceCapabilities(false, false, false, false)) .withUnidentifiedAccessKey(unidentifiedAccessKey) .withRecoveryPassword(registrationPassword); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java index dde159280..fca1fd3da 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/AccountController.java @@ -231,7 +231,7 @@ public class AccountController { d.setLastSeen(Util.todayInMillis()); d.setCapabilities(attributes.getCapabilities()); d.setRegistrationId(attributes.getRegistrationId()); - attributes.getPhoneNumberIdentityRegistrationId().ifPresent(d::setPhoneNumberIdentityRegistrationId); + d.setPhoneNumberIdentityRegistrationId(attributes.getPhoneNumberIdentityRegistrationId()); d.setUserAgent(userAgent); }); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java index 5cdab7484..d56abf0b6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java @@ -396,7 +396,7 @@ public class DeviceController { device.setAuthTokenHash(SaltedTokenHash.generateFor(password)); device.setFetchesMessages(accountAttributes.getFetchesMessages()); device.setRegistrationId(accountAttributes.getRegistrationId()); - accountAttributes.getPhoneNumberIdentityRegistrationId().ifPresent(device::setPhoneNumberIdentityRegistrationId); + device.setPhoneNumberIdentityRegistrationId(accountAttributes.getPhoneNumberIdentityRegistrationId()); device.setLastSeen(Util.todayInMillis()); device.setCreated(System.currentTimeMillis()); device.setCapabilities(accountAttributes.getCapabilities()); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java index 916fc9dc9..2236b3572 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/AccountAttributes.java @@ -10,7 +10,6 @@ import com.fasterxml.jackson.annotation.JsonProperty; import com.fasterxml.jackson.databind.annotation.JsonDeserialize; import com.google.common.annotations.VisibleForTesting; import java.util.Optional; -import java.util.OptionalInt; import javax.annotation.Nullable; import javax.validation.constraints.AssertTrue; import javax.validation.constraints.Size; @@ -28,7 +27,7 @@ public class AccountAttributes { private int registrationId; @JsonProperty("pniRegistrationId") - private Integer phoneNumberIdentityRegistrationId; + private int phoneNumberIdentityRegistrationId; @JsonProperty @Size(max = 204, message = "This field must be less than 50 characters") @@ -62,12 +61,14 @@ public class AccountAttributes { public AccountAttributes( final boolean fetchesMessages, final int registrationId, + final int phoneNumberIdentifierRegistrationId, final String name, final String registrationLock, final boolean discoverableByPhoneNumber, final DeviceCapabilities capabilities) { this.fetchesMessages = fetchesMessages; this.registrationId = registrationId; + this.phoneNumberIdentityRegistrationId = phoneNumberIdentifierRegistrationId; this.name = name; this.registrationLock = registrationLock; this.discoverableByPhoneNumber = discoverableByPhoneNumber; @@ -82,8 +83,8 @@ public class AccountAttributes { return registrationId; } - public OptionalInt getPhoneNumberIdentityRegistrationId() { - return phoneNumberIdentityRegistrationId != null ? OptionalInt.of(phoneNumberIdentityRegistrationId) : OptionalInt.empty(); + public int getPhoneNumberIdentityRegistrationId() { + return phoneNumberIdentityRegistrationId; } public String getName() { @@ -133,7 +134,6 @@ public class AccountAttributes { @AssertTrue public boolean isEachRegistrationIdValid() { - return validRegistrationId(registrationId) && - (phoneNumberIdentityRegistrationId == null || validRegistrationId(phoneNumberIdentityRegistrationId)); + return validRegistrationId(registrationId) && validRegistrationId(phoneNumberIdentityRegistrationId); } } 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 44dc4aadb..c3739d84e 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -200,7 +200,7 @@ public class AccountsManager { device.setAuthTokenHash(SaltedTokenHash.generateFor(password)); device.setFetchesMessages(accountAttributes.getFetchesMessages()); device.setRegistrationId(accountAttributes.getRegistrationId()); - accountAttributes.getPhoneNumberIdentityRegistrationId().ifPresent(device::setPhoneNumberIdentityRegistrationId); + device.setPhoneNumberIdentityRegistrationId(accountAttributes.getPhoneNumberIdentityRegistrationId()); device.setName(accountAttributes.getName()); device.setCapabilities(accountAttributes.getCapabilities()); device.setCreated(System.currentTimeMillis()); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/AccountControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/AccountControllerTest.java index 7e1b73e63..0a4db048f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/AccountControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/AccountControllerTest.java @@ -762,7 +762,7 @@ class AccountControllerTest { .target("/v1/accounts/attributes/") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) - .put(Entity.json(new AccountAttributes(false, 2222, null, null, true, null))); + .put(Entity.json(new AccountAttributes(false, 2222, 3333, null, null, true, null))); assertThat(response.getStatus()).isEqualTo(204); } @@ -774,7 +774,7 @@ class AccountControllerTest { .target("/v1/accounts/attributes/") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getAuthHeader(AuthHelper.UNDISCOVERABLE_UUID, AuthHelper.UNDISCOVERABLE_PASSWORD)) - .put(Entity.json(new AccountAttributes(false, 2222, null, null, true, null))); + .put(Entity.json(new AccountAttributes(false, 2222, 3333, null, null, true, null))); assertThat(response.getStatus()).isEqualTo(204); } @@ -787,7 +787,7 @@ class AccountControllerTest { .target("/v1/accounts/attributes/") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getAuthHeader(AuthHelper.UNDISCOVERABLE_UUID, AuthHelper.UNDISCOVERABLE_PASSWORD)) - .put(Entity.json(new AccountAttributes(false, 2222, null, null, true, null) + .put(Entity.json(new AccountAttributes(false, 2222, 3333, null, null, true, null) .withRecoveryPassword(recoveryPassword))); assertThat(response.getStatus()).isEqualTo(204); @@ -801,7 +801,7 @@ class AccountControllerTest { .target("/v1/accounts/attributes/") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) - .put(Entity.json(new AccountAttributes(false, 2222, null, null, false, null))); + .put(Entity.json(new AccountAttributes(false, 2222, 3333, null, null, false, null))); assertThat(response.getStatus()).isEqualTo(204); } @@ -813,7 +813,7 @@ class AccountControllerTest { .target("/v1/accounts/attributes/") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) - .put(Entity.json(new AccountAttributes(false, 2222, null, null, false, null) + .put(Entity.json(new AccountAttributes(false, 2222, 3333, null, null, false, null) .withUnidentifiedAccessKey(new byte[7]))); assertThat(response.getStatus()).isEqualTo(422); 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 d3be3cd7b..418b311bc 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/DeviceControllerTest.java @@ -196,8 +196,8 @@ class DeviceControllerTest { .target("/v1/devices/" + deviceCode.verificationCode()) .request() .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, "password1")) - .put(Entity.entity(new AccountAttributes(false, 1234, null, - null, true, null), + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, + null, null, true, null), MediaType.APPLICATION_JSON_TYPE), DeviceResponse.class); @@ -223,8 +223,8 @@ class DeviceControllerTest { .target("/v1/devices/" + verificationToken) .request() .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, "password1")) - .put(Entity.entity(new AccountAttributes(false, 1234, null, - null, true, null), + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, + null, null, true, null), MediaType.APPLICATION_JSON_TYPE)); assertEquals(Response.Status.FORBIDDEN.getStatusCode(), response.getStatus()); @@ -261,8 +261,8 @@ class DeviceControllerTest { .target("/v1/devices/" + verificationToken) .request() .header("Authorization", "This is not a valid authorization header") - .put(Entity.entity(new AccountAttributes(false, 1234, null, - null, true, null), + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, + null, null, true, null), MediaType.APPLICATION_JSON_TYPE)); assertEquals(401, response.getStatus()); @@ -308,7 +308,7 @@ class DeviceControllerTest { when(keysManager.storePqLastResort(any(), any())).thenReturn(CompletableFuture.completedFuture(null)); final LinkDeviceRequest request = new LinkDeviceRequest(deviceCode.verificationCode(), - new AccountAttributes(fetchesMessages, 1234, null, null, true, null), + new AccountAttributes(fetchesMessages, 1234, 5678, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, apnRegistrationId, gcmRegistrationId)); final DeviceResponse response = resources.getJerseyTest() @@ -389,7 +389,7 @@ class DeviceControllerTest { when(commands.get(anyString())).thenReturn(""); final LinkDeviceRequest request = new LinkDeviceRequest(deviceController.generateVerificationToken(AuthHelper.VALID_UUID), - new AccountAttributes(false, 1234, null, null, true, null), + new AccountAttributes(false, 1234, 5678, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.of(new GcmRegistrationId("gcm-id")))); try (final Response response = resources.getJerseyTest() @@ -437,7 +437,7 @@ class DeviceControllerTest { when(account.getIdentityKey(IdentityType.PNI)).thenReturn(new IdentityKey(pniIdentityKeyPair.getPublicKey())); final LinkDeviceRequest request = new LinkDeviceRequest(deviceCode.verificationCode(), - new AccountAttributes(fetchesMessages, 1234, null, null, true, null), + new AccountAttributes(fetchesMessages, 1234, 5678, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, apnRegistrationId, gcmRegistrationId)); try (final Response response = resources.getJerseyTest() @@ -485,7 +485,7 @@ class DeviceControllerTest { when(account.getIdentityKey(IdentityType.PNI)).thenReturn(pniIdentityKey); final LinkDeviceRequest request = new LinkDeviceRequest(deviceCode.verificationCode(), - new AccountAttributes(true, 1234, null, null, true, null), + new AccountAttributes(true, 1234, 5678, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.empty())); try (final Response response = resources.getJerseyTest() @@ -543,7 +543,7 @@ class DeviceControllerTest { when(account.getIdentityKey(IdentityType.PNI)).thenReturn(pniIdentityKey); final LinkDeviceRequest request = new LinkDeviceRequest(deviceCode.verificationCode(), - new AccountAttributes(true, 1234, null, null, true, null), + new AccountAttributes(true, 1234, 5678, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.empty(), Optional.empty())); try (final Response response = resources.getJerseyTest() @@ -578,7 +578,7 @@ class DeviceControllerTest { @ParameterizedTest @MethodSource - void linkDeviceRegistrationId(final int registrationId, final int expectedStatusCode) { + void linkDeviceRegistrationId(final int registrationId, final int pniRegistrationId, final int expectedStatusCode) { final Device existingDevice = mock(Device.class); when(existingDevice.getId()).thenReturn(Device.PRIMARY_ID); when(AuthHelper.VALID_ACCOUNT.getDevices()).thenReturn(List.of(existingDevice)); @@ -604,7 +604,7 @@ class DeviceControllerTest { when(keysManager.storePqLastResort(any(), any())).thenReturn(CompletableFuture.completedFuture(null)); final LinkDeviceRequest request = new LinkDeviceRequest(deviceCode.verificationCode(), - new AccountAttributes(false, registrationId, null, null, true, null), + new AccountAttributes(false, registrationId, pniRegistrationId, null, null, true, null), new DeviceActivationRequest(aciSignedPreKey, pniSignedPreKey, aciPqLastResortPreKey, pniPqLastResortPreKey, Optional.of(new ApnRegistrationId("apn", null)), Optional.empty())); try (final Response response = resources.getJerseyTest() @@ -618,11 +618,15 @@ class DeviceControllerTest { private static Stream linkDeviceRegistrationId() { return Stream.of( - Arguments.of(0x3FFF, 200), - Arguments.of(0, 422), - Arguments.of(-1, 422), - Arguments.of(0x3FFF + 1, 422), - Arguments.of(Integer.MAX_VALUE, 422) + Arguments.of(0x3FFF, 0x3FFF, 200), + Arguments.of(0, 0x3FFF, 422), + Arguments.of(-1, 0x3FFF, 422), + Arguments.of(0x3FFF + 1, 0x3FFF, 422), + Arguments.of(Integer.MAX_VALUE, 0x3FFF, 422), + Arguments.of(0x3FFF, 0, 422), + Arguments.of(0x3FFF, -1, 422), + Arguments.of(0x3FFF, 0x3FFF + 1, 422), + Arguments.of(0x3FFF, Integer.MAX_VALUE, 422) ); } @@ -661,7 +665,7 @@ class DeviceControllerTest { .target("/v1/devices/" + deviceCode.verificationCode() + "-incorrect") .request() .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, "password1")) - .put(Entity.entity(new AccountAttributes(false, 1234, null, null, true, null), + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, null, null, true, null), MediaType.APPLICATION_JSON_TYPE)); assertThat(response.getStatus()).isEqualTo(403); @@ -676,7 +680,7 @@ class DeviceControllerTest { .request() .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER_TWO, AuthHelper.VALID_PASSWORD_TWO)) - .put(Entity.entity(new AccountAttributes(false, 1234, null, null, true, null), + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, null, null, true, null), MediaType.APPLICATION_JSON_TYPE)); assertThat(response.getStatus()).isEqualTo(403); @@ -711,7 +715,7 @@ class DeviceControllerTest { .target("/v1/devices/" + verificationToken) .request() .header("Authorization", AuthHelper.getProvisioningAuthHeader(AuthHelper.VALID_NUMBER, "password1")) - .put(Entity.entity(new AccountAttributes(false, 1234, + .put(Entity.entity(new AccountAttributes(false, 1234, 5678, "this is a really long name that is longer than 80 characters it's so long that it's even longer than 204 characters. that's a lot of characters. we're talking lots and lots and lots of characters. 12345678", null, true, null), MediaType.APPLICATION_JSON_TYPE)); @@ -725,7 +729,7 @@ class DeviceControllerTest { DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, false, true); AccountAttributes accountAttributes = - new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); + new AccountAttributes(false, 1234, 5678, null, null, true, deviceCapabilities); final String verificationToken = deviceController.generateVerificationToken(AuthHelper.VALID_UUID); @@ -739,7 +743,7 @@ class DeviceControllerTest { assertThat(response.getStatus()).isEqualTo(409); deviceCapabilities = new DeviceCapabilities(true, true, true, true); - accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); + accountAttributes = new AccountAttributes(false, 1234, 5678, null, null, true, deviceCapabilities); response = resources .getJerseyTest() .target("/v1/devices/" + verificationToken) @@ -782,7 +786,7 @@ class DeviceControllerTest { void deviceDowngradePaymentActivationTest(boolean paymentActivation) { // Update when we start returning true value of capability & restricting downgrades DeviceCapabilities deviceCapabilities = new DeviceCapabilities(true, true, true, paymentActivation); - AccountAttributes accountAttributes = new AccountAttributes(false, 1234, null, null, true, deviceCapabilities); + AccountAttributes accountAttributes = new AccountAttributes(false, 1234, 5678, null, null, true, deviceCapabilities); final String verificationToken = deviceController.generateVerificationToken(AuthHelper.VALID_UUID); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java index ef85cd730..a5fc2bf90 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/RegistrationControllerTest.java @@ -141,8 +141,8 @@ class RegistrationControllerTest { static Stream invalidRegistrationId() { return Stream.of( Arguments.of(Optional.of(1), Optional.of(1), 200), - Arguments.of(Optional.of(1), Optional.empty(), 200), - Arguments.of(Optional.of(0x3FFF), Optional.empty(), 200), + Arguments.of(Optional.of(1), Optional.empty(), 422), + Arguments.of(Optional.of(0x3FFF), Optional.empty(), 422), Arguments.of(Optional.empty(), Optional.of(1), 422), Arguments.of(Optional.of(Integer.MAX_VALUE), Optional.empty(), 422), Arguments.of(Optional.of(0x3FFF + 1), Optional.empty(), 422), @@ -170,7 +170,7 @@ class RegistrationControllerTest { when(accountsManager.create(any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any(), any())) .thenReturn(account); - final String json = requestJson("sessionId", new byte[0], true, registrationId.orElse(0), pniRegistrationId); + final String json = requestJson("sessionId", new byte[0], true, registrationId.orElse(0), pniRegistrationId.orElse(0)); try (Response response = request.post(Entity.json(json))) { assertEquals(statusCode, response.getStatus()); @@ -409,7 +409,7 @@ class RegistrationControllerTest { .target("/v1/registration") .request() .header(HttpHeaders.AUTHORIZATION, AuthHelper.getProvisioningAuthHeader(NUMBER, PASSWORD)); - try (Response response = request.post(Entity.json(requestJson("sessionId", new byte[0], skipDeviceTransfer, 1, Optional.of(2))))) { + try (Response response = request.post(Entity.json(requestJson("sessionId", new byte[0], skipDeviceTransfer, 1, 2)))) { assertEquals(expectedStatus, response.getStatus()); } } @@ -477,10 +477,10 @@ class RegistrationControllerTest { } final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + new AccountAttributes(true, 1, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + new AccountAttributes(false, 1, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // "Fetches messages" is true, but an APNs token is provided @@ -566,7 +566,7 @@ class RegistrationControllerTest { } final AccountAttributes accountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + new AccountAttributes(true, 1, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); return Stream.of( // Signed PNI EC pre-key is missing @@ -746,10 +746,10 @@ class RegistrationControllerTest { } final AccountAttributes fetchesMessagesAccountAttributes = - new AccountAttributes(true, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + new AccountAttributes(true, 1, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final AccountAttributes pushAccountAttributes = - new AccountAttributes(false, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + new AccountAttributes(false, 1, 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final String apnsToken = "apns-token"; final String apnsVoipToken = "apns-voip-token"; @@ -853,7 +853,7 @@ class RegistrationControllerTest { final byte[] recoveryPassword, final boolean skipDeviceTransfer, final int registrationId, - @SuppressWarnings("OptionalUsedAsFieldOrParameterType") final Optional pniRegistrationId) { + int pniRegistrationId) { final ECKeyPair aciIdentityKeyPair = Curve.generateKeyPair(); final ECKeyPair pniIdentityKeyPair = Curve.generateKeyPair(); @@ -861,10 +861,8 @@ class RegistrationControllerTest { final IdentityKey aciIdentityKey = new IdentityKey(aciIdentityKeyPair.getPublicKey()); final IdentityKey pniIdentityKey = new IdentityKey(pniIdentityKeyPair.getPublicKey()); - final AccountAttributes accountAttributes = new AccountAttributes(true, registrationId, "name", "reglock", true, - new Device.DeviceCapabilities(true, true, true, true)); - - pniRegistrationId.ifPresent(accountAttributes::setPhoneNumberIdentityRegistrationId); + final AccountAttributes accountAttributes = new AccountAttributes(true, registrationId, pniRegistrationId, "name", "reglock", + true, new Device.DeviceCapabilities(true, true, true, true)); final RegistrationRequest request = new RegistrationRequest( Base64.getEncoder().encodeToString(sessionId.getBytes(StandardCharsets.UTF_8)), @@ -892,14 +890,14 @@ class RegistrationControllerTest { * Valid request JSON with the given session ID */ private static String requestJson(final String sessionId) { - return requestJson(sessionId, new byte[0], false, 1, Optional.of(2)); + return requestJson(sessionId, new byte[0], false, 1, 2); } /** * Valid request JSON with the given Recovery Password */ private static String requestJsonRecoveryPassword(final byte[] recoveryPassword) { - return requestJson("", recoveryPassword, false, 1, Optional.of(2)); + return requestJson("", recoveryPassword, false, 1, 2); } /** diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationIntegrationTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationIntegrationTest.java index ed24f3196..92d1626c1 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountCreationIntegrationTest.java @@ -174,12 +174,10 @@ public class AccountCreationIntegrationTest { final AccountAttributes accountAttributes = new AccountAttributes(deliveryChannels.fetchesMessages(), registrationId, + pniRegistrationId, deviceName, registrationLockSecret, - discoverableByPhoneNumber, - deviceCapabilities); - - accountAttributes.setPhoneNumberIdentityRegistrationId(pniRegistrationId); + discoverableByPhoneNumber, deviceCapabilities); final List badges = new ArrayList<>(List.of(new AccountBadge( RandomStringUtils.randomAlphabetic(8), @@ -259,7 +257,7 @@ public class AccountCreationIntegrationTest { final Account originalAccount = accountsManager.create(number, RandomStringUtils.randomAlphanumeric(16), "OWI", - new AccountAttributes(true, 1, "name", "registration-lock", false, new Device.DeviceCapabilities(false, false, false, false)), + new AccountAttributes(true, 1, 1, "name", "registration-lock", false, new Device.DeviceCapabilities(false, false, false, false)), Collections.emptyList(), new IdentityKey(aciKeyPair.getPublicKey()), new IdentityKey(pniKeyPair.getPublicKey()), @@ -288,13 +286,12 @@ public class AccountCreationIntegrationTest { final AccountAttributes accountAttributes = new AccountAttributes(deliveryChannels.fetchesMessages(), registrationId, + pniRegistrationId, deviceName, registrationLockSecret, discoverableByPhoneNumber, deviceCapabilities); - accountAttributes.setPhoneNumberIdentityRegistrationId(pniRegistrationId); - final List badges = new ArrayList<>(List.of(new AccountBadge( RandomStringUtils.randomAlphabetic(8), CLOCK.instant().plus(Duration.ofDays(7)), 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 6d9d78d9f..8e218b641 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerChangeNumberIntegrationTest.java @@ -178,7 +178,7 @@ class AccountsManagerChangeNumberIntegrationTest { final int rotatedPniRegistrationId = 17; final ECKeyPair rotatedPniIdentityKeyPair = Curve.generateKeyPair(); final ECSignedPreKey rotatedSignedPreKey = KeysHelper.signedECPreKey(1L, rotatedPniIdentityKeyPair); - final AccountAttributes accountAttributes = new AccountAttributes(true, rotatedPniRegistrationId + 1, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); + final AccountAttributes accountAttributes = new AccountAttributes(true, rotatedPniRegistrationId + 1, rotatedPniRegistrationId, "test", null, true, new Device.DeviceCapabilities(false, false, false, false)); final Account account = AccountsHelper.createAccount(accountsManager, originalNumber, accountAttributes); account.getPrimaryDevice().orElseThrow().setSignedPreKey(KeysHelper.signedECPreKey(1, rotatedPniIdentityKeyPair)); 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 e4fd6301b..5237b572e 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -935,7 +935,7 @@ class AccountsManagerTest { when(accounts.create(any(), any())).thenReturn(true); final String e164 = "+18005550123"; - final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, true, null); + final AccountAttributes attributes = new AccountAttributes(false, 1, 2, null, null, true, null); createAccount(e164, attributes); @@ -955,7 +955,7 @@ class AccountsManagerTest { }); final String e164 = "+18005550123"; - final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, true, null); + final AccountAttributes attributes = new AccountAttributes(false, 1, 2, null, null, true, null); createAccount(e164, attributes); @@ -979,7 +979,7 @@ class AccountsManagerTest { when(accounts.create(any(), any())).thenReturn(true); final String e164 = "+18005550123"; - final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, true, null); + final AccountAttributes attributes = new AccountAttributes(false, 1, 2, null, null, true, null); createAccount(e164, attributes); @@ -995,7 +995,7 @@ class AccountsManagerTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void testCreateWithDiscoverability(final boolean discoverable) throws InterruptedException { - final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, discoverable, null); + final AccountAttributes attributes = new AccountAttributes(false, 1, 2, null, null, discoverable, null); final Account account = createAccount("+18005550123", attributes); assertEquals(discoverable, account.isDiscoverableByPhoneNumber()); @@ -1004,8 +1004,8 @@ class AccountsManagerTest { @ParameterizedTest @ValueSource(booleans = {true, false}) void testCreateWithStorageCapability(final boolean hasStorage) throws InterruptedException { - final AccountAttributes attributes = new AccountAttributes(false, 0, null, null, true, - new DeviceCapabilities(hasStorage, false, false, false)); + final AccountAttributes attributes = new AccountAttributes(false, 1, 2, null, null, + true, new DeviceCapabilities(hasStorage, false, false, false)); final Account account = createAccount("+18005550123", attributes);