diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java index 5a865bedd..1fdad9571 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/KeysController.java @@ -144,11 +144,11 @@ public class KeysController { return updateAccountFuture.thenCompose(updatedAccount -> { final List> storeFutures = new ArrayList<>(3); - if (setKeysRequest.preKeys() != null) { + if (setKeysRequest.preKeys() != null && !setKeysRequest.preKeys().isEmpty()) { storeFutures.add(keys.storeEcOneTimePreKeys(identifier, device.getId(), setKeysRequest.preKeys())); } - if (setKeysRequest.pqPreKeys() != null) { + if (setKeysRequest.pqPreKeys() != null && !setKeysRequest.pqPreKeys().isEmpty()) { storeFutures.add(keys.storeKemOneTimePreKeys(identifier, device.getId(), setKeysRequest.pqPreKeys())); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/KeysControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/KeysControllerTest.java index 6bf1d3ae4..7eac5b2db 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/KeysControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/KeysControllerTest.java @@ -773,6 +773,33 @@ class KeysControllerTest { verify(accounts).updateDeviceTransactionallyAsync(eq(AuthHelper.VALID_ACCOUNT), eq(SAMPLE_DEVICE_ID), any(), any()); } + @Test + void putKeysTestV2EmptySingleUseKeysList() { + final ECKeyPair identityKeyPair = Curve.generateKeyPair(); + final ECSignedPreKey signedPreKey = KeysHelper.signedECPreKey(31338, identityKeyPair); + final IdentityKey identityKey = new IdentityKey(identityKeyPair.getPublicKey()); + + final SetKeysRequest setKeysRequest = new SetKeysRequest(List.of(), signedPreKey, List.of(), null); + + when(AuthHelper.VALID_ACCOUNT.getIdentityKey(IdentityType.ACI)).thenReturn(identityKey); + + try (final Response response = + resources.getJerseyTest() + .target("/v2/keys") + .request() + .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) + .put(Entity.entity(setKeysRequest, MediaType.APPLICATION_JSON_TYPE))) { + + assertThat(response.getStatus()).isEqualTo(204); + + verify(KEYS, never()).storeEcOneTimePreKeys(any(), anyByte(), any()); + verify(KEYS, never()).storeKemOneTimePreKeys(any(), anyByte(), any()); + + verify(AuthHelper.VALID_DEVICE).setSignedPreKey(eq(signedPreKey)); + verify(accounts).updateDeviceTransactionallyAsync(eq(AuthHelper.VALID_ACCOUNT), eq(SAMPLE_DEVICE_ID), any(), any()); + } + } + @Test void putKeysPqTestV2() { final ECPreKey preKey = KeysHelper.ecPreKey(31337);