diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java index 491b38770..fd6de0a34 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/ProfileController.java @@ -23,7 +23,6 @@ import java.util.Collections; import java.util.HexFormat; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.concurrent.CompletableFuture; import java.util.concurrent.Executor; @@ -351,7 +350,7 @@ public class ProfileController { private void checkFingerprintAndAdd(BatchIdentityCheckRequest.Element element, Collection responseElements, MessageDigest md) { - final ServiceIdentifier identifier = Objects.requireNonNullElse(element.uuid(), element.aci()); + final ServiceIdentifier identifier = element.uuid(); final Optional maybeAccount = accountsManager.getByServiceIdentifier(identifier); maybeAccount.ifPresent(account -> { @@ -365,7 +364,7 @@ public class ProfileController { byte[] fingerprint = Util.truncate(digest, 4); if (!Arrays.equals(fingerprint, element.fingerprint())) { - responseElements.add(new BatchIdentityCheckResponse.Element(element.uuid(), element.aci(), identityKey)); + responseElements.add(new BatchIdentityCheckResponse.Element(element.uuid(), identityKey)); } }); } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/BatchIdentityCheckRequest.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/BatchIdentityCheckRequest.java index 45ab13963..daf3cc0c7 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/BatchIdentityCheckRequest.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/BatchIdentityCheckRequest.java @@ -12,7 +12,6 @@ import javax.annotation.Nullable; import javax.validation.Valid; import javax.validation.constraints.NotNull; import javax.validation.constraints.Size; -import org.whispersystems.textsecuregcm.identity.AciServiceIdentifier; import org.whispersystems.textsecuregcm.identity.ServiceIdentifier; import org.whispersystems.textsecuregcm.util.ExactlySize; import org.whispersystems.textsecuregcm.util.ServiceIdentifierAdapter; @@ -24,30 +23,13 @@ public record BatchIdentityCheckRequest(@Valid @NotNull @Size(max = 1000) List elements) { public record Element(@JsonInclude(JsonInclude.Include.NON_EMPTY) @JsonSerialize(using = ServiceIdentifierAdapter.ServiceIdentifierSerializer.class) @JsonDeserialize(using = ServiceIdentifierAdapter.ServiceIdentifierDeserializer.class) - @Nullable + @NotNull ServiceIdentifier uuid, - @JsonInclude(JsonInclude.Include.NON_EMPTY) - @JsonSerialize(using = ServiceIdentifierAdapter.ServiceIdentifierSerializer.class) - @JsonDeserialize(using = ServiceIdentifierAdapter.AciServiceIdentifierDeserializer.class) - @Nullable - @Deprecated // remove after 2023-11-01 - ServiceIdentifier aci, - @NotNull @JsonSerialize(using = IdentityKeyAdapter.Serializer.class) @JsonDeserialize(using = IdentityKeyAdapter.Deserializer.class) IdentityKey identityKey) { - - public Element { - if (aci == null && uuid == null) { - throw new IllegalArgumentException("aci and uuid cannot both be null"); - } - - if (aci != null && uuid != null) { - throw new IllegalArgumentException("aci and uuid cannot both be non-null"); - } - } } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java index bb176a17b..04cd94b25 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/ProfileControllerTest.java @@ -36,7 +36,6 @@ import java.util.Collections; import java.util.HexFormat; import java.util.List; import java.util.Map; -import java.util.Objects; import java.util.Optional; import java.util.UUID; import java.util.concurrent.CompletableFuture; @@ -1299,13 +1298,11 @@ class ProfileControllerTest { void testBatchIdentityCheck() { try (final Response response = resources.getJerseyTest().target("/v1/profile/identity_check/batch").request() .post(Entity.json(new BatchIdentityCheckRequest(List.of( - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), convertKeyToFingerprint(ACCOUNT_IDENTITY_KEY)), - new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), null, + new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), convertKeyToFingerprint(ACCOUNT_TWO_PHONE_NUMBER_IDENTITY_KEY)), - new BatchIdentityCheckRequest.Element(null, new AciServiceIdentifier(AuthHelper.VALID_UUID_TWO), - convertKeyToFingerprint(ACCOUNT_TWO_IDENTITY_KEY)), - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), convertKeyToFingerprint(ACCOUNT_TWO_PHONE_NUMBER_IDENTITY_KEY)) ))))) { assertThat(response).isNotNull(); @@ -1322,46 +1319,42 @@ class ProfileControllerTest { final Condition isAnExpectedUuid = new Condition<>(element -> element.identityKey() - .equals(expectedIdentityKeys.get(Objects.requireNonNullElse(element.uuid(), element.aci()))), + .equals(expectedIdentityKeys.get(element.uuid())), "is an expected UUID with the correct identity key"); final IdentityKey validAciIdentityKey = new IdentityKey(Curve.generateKeyPair().getPublicKey()); final IdentityKey secondValidPniIdentityKey = new IdentityKey(Curve.generateKeyPair().getPublicKey()); - final IdentityKey secondValidAciIdentityKey = new IdentityKey(Curve.generateKeyPair().getPublicKey()); final IdentityKey invalidAciIdentityKey = new IdentityKey(Curve.generateKeyPair().getPublicKey()); try (final Response response = resources.getJerseyTest().target("/v1/profile/identity_check/batch").request() .post(Entity.json(new BatchIdentityCheckRequest(List.of( - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), convertKeyToFingerprint(validAciIdentityKey)), - new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), null, + new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), convertKeyToFingerprint(secondValidPniIdentityKey)), - new BatchIdentityCheckRequest.Element(null, new AciServiceIdentifier(AuthHelper.VALID_UUID_TWO), - convertKeyToFingerprint(secondValidAciIdentityKey)), - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), convertKeyToFingerprint(invalidAciIdentityKey)) ))))) { assertThat(response).isNotNull(); assertThat(response.getStatus()).isEqualTo(200); BatchIdentityCheckResponse identityCheckResponse = response.readEntity(BatchIdentityCheckResponse.class); assertThat(identityCheckResponse).isNotNull(); - assertThat(identityCheckResponse.elements()).isNotNull().hasSize(3); + assertThat(identityCheckResponse.elements()).isNotNull().hasSize(2); assertThat(identityCheckResponse.elements()).element(0).isNotNull().is(isAnExpectedUuid); assertThat(identityCheckResponse.elements()).element(1).isNotNull().is(isAnExpectedUuid); - assertThat(identityCheckResponse.elements()).element(2).isNotNull().is(isAnExpectedUuid); } final List largeElementList = new ArrayList<>(List.of( - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.VALID_UUID), convertKeyToFingerprint(validAciIdentityKey)), - new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), null, + new BatchIdentityCheckRequest.Element(new PniServiceIdentifier(AuthHelper.VALID_PNI_TWO), convertKeyToFingerprint(secondValidPniIdentityKey)), - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(AuthHelper.INVALID_UUID), convertKeyToFingerprint(invalidAciIdentityKey)))); for (int i = 0; i < 900; i++) { largeElementList.add( - new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(UUID.randomUUID()), null, + new BatchIdentityCheckRequest.Element(new AciServiceIdentifier(UUID.randomUUID()), convertKeyToFingerprint(new IdentityKey(Curve.generateKeyPair().getPublicKey())))); } @@ -1437,14 +1430,16 @@ class ProfileControllerTest { new ServiceId.Aci(AuthHelper.VALID_UUID)); final byte[] name = TestRandomUtil.nextBytes(81); - final Response response = resources.getJerseyTest() + try (final Response response = resources.getJerseyTest() .target("/v1/profile/") .request() .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) .put(Entity.entity(new CreateProfileRequest(commitment, version, name, null, null, - null, true, false, Optional.of(List.of()), null), MediaType.APPLICATION_JSON_TYPE)); - assertThat(response.getStatus()).isEqualTo(422); + null, true, false, Optional.of(List.of()), null), MediaType.APPLICATION_JSON_TYPE))) { + + assertThat(response.getStatus()).isEqualTo(422); + } } static Stream testBatchIdentityCheckDeserializationBadRequest() { @@ -1457,7 +1452,7 @@ class ProfileControllerTest { ] } """, Base64.getEncoder().encodeToString(convertKeyToFingerprint(new IdentityKey(Curve.generateKeyPair().getPublicKey())))), - 400), + 422), Arguments.of( // a blank string is invalid String.format(""" {