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 845cfd780..c099833f5 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/DeviceController.java @@ -99,9 +99,11 @@ public class DeviceController { throw new WebApplicationException(Response.Status.UNAUTHORIZED); } + messages.clear(account.getUuid(), deviceId); account.removeDevice(deviceId); accounts.update(account); directoryQueue.refreshRegisteredUser(account); + // ensure any messages that came in after the first clear() are also removed messages.clear(account.getUuid(), deviceId); } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java index e30d04016..21e69ac59 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/DeviceControllerTest.java @@ -6,8 +6,10 @@ package org.whispersystems.textsecuregcm.tests.controllers; import static org.assertj.core.api.Assertions.assertThat; import static org.junit.Assert.assertEquals; +import static org.mockito.Mockito.clearInvocations; import static org.mockito.Mockito.eq; import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; import static org.mockito.Mockito.when; @@ -338,4 +340,28 @@ public class DeviceControllerTest { .put(Entity.entity(accountAttributes, MediaType.APPLICATION_JSON_TYPE)); assertThat(response.getStatus()).isEqualTo(200); } + + @Test + public void deviceRemovalClearsMessages() { + + // this is a static mock, so it might have previous invocations + clearInvocations(AuthHelper.VALID_ACCOUNT); + + final long deviceId = 2; + + final Response response = resources + .getJerseyTest() + .target("/v1/devices/" + deviceId) + .request() + .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_NUMBER, AuthHelper.VALID_PASSWORD)) + .header("User-Agent", "Signal-Android/5.42.8675309 Android/30") + .delete(); + + assertThat(response.getStatus()).isEqualTo(204); + + verify(messagesManager, times(2)).clear(AuthHelper.VALID_UUID, deviceId); + verify(accountsManager, times(1)).update(AuthHelper.VALID_ACCOUNT); + verify(AuthHelper.VALID_ACCOUNT).removeDevice(deviceId); + } + }