diff --git a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java index 39bd87426..0d789a8f2 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java +++ b/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java @@ -144,7 +144,9 @@ public class MessageController { throws IOException { try { - Optional message = messagesManager.delete(account.getNumber(), source, timestamp); + Optional message = messagesManager.delete(account.getNumber(), + account.getAuthenticatedDevice().get().getId(), + source, timestamp); if (message.isPresent() && message.get().getType() != Envelope.Type.RECEIPT_VALUE) { receiptSender.sendReceipt(account, diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java b/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java index ae6e01fdf..54be51292 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/Messages.java @@ -50,8 +50,11 @@ public abstract class Messages { @Bind("destination_device") long destinationDevice); @Mapper(MessageMapper.class) - @SqlQuery("DELETE FROM messages WHERE " + ID + " IN (SELECT " + ID + " FROM messages WHERE " + DESTINATION + " = :destination AND " + SOURCE + " = :source AND " + TIMESTAMP + " = :timestamp ORDER BY " + ID + " LIMIT 1) RETURNING *") - abstract OutgoingMessageEntity remove(@Bind("destination") String destination, @Bind("source") String source, @Bind("timestamp") long timestamp); + @SqlQuery("DELETE FROM messages WHERE " + ID + " IN (SELECT " + ID + " FROM messages WHERE " + DESTINATION + " = :destination AND " + DESTINATION_DEVICE + " = :destination_device AND " + SOURCE + " = :source AND " + TIMESTAMP + " = :timestamp ORDER BY " + ID + " LIMIT 1) RETURNING *") + abstract OutgoingMessageEntity remove(@Bind("destination") String destination, + @Bind("destination_device") long destinationDevice, + @Bind("source") String source, + @Bind("timestamp") long timestamp); @Mapper(MessageMapper.class) @SqlUpdate("DELETE FROM messages WHERE " + ID + " = :id AND " + DESTINATION + " = :destination") diff --git a/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java b/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java index db38a03fc..fff0213bf 100644 --- a/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java +++ b/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java @@ -33,8 +33,9 @@ public class MessagesManager { this.messages.clear(destination, deviceId); } - public Optional delete(String destination, String source, long timestamp) { - return Optional.fromNullable(this.messages.remove(destination, source, timestamp)); + public Optional delete(String destination, long destinationDevice, String source, long timestamp) + { + return Optional.fromNullable(this.messages.remove(destination, destinationDevice, source, timestamp)); } public void delete(String destination, long id) { diff --git a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java index 7d49e3603..3189e8474 100644 --- a/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java +++ b/src/test/java/org/whispersystems/textsecuregcm/tests/controllers/MessageControllerTest.java @@ -214,20 +214,20 @@ public class MessageControllerTest { @Test public synchronized void testDeleteMessages() throws Exception { long timestamp = System.currentTimeMillis(); - when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31337)) + when(messagesManager.delete(AuthHelper.VALID_NUMBER, 1, "+14152222222", 31337)) .thenReturn(Optional.of(new OutgoingMessageEntity(31337L, Envelope.Type.CIPHERTEXT_VALUE, null, timestamp, "+14152222222", 1, "hi".getBytes(), null))); - when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31338)) + when(messagesManager.delete(AuthHelper.VALID_NUMBER, 1, "+14152222222", 31338)) .thenReturn(Optional.of(new OutgoingMessageEntity(31337L, Envelope.Type.RECEIPT_VALUE, null, System.currentTimeMillis(), "+14152222222", 1, null, null))); - when(messagesManager.delete(AuthHelper.VALID_NUMBER, "+14152222222", 31339)) + when(messagesManager.delete(AuthHelper.VALID_NUMBER, 1, "+14152222222", 31339)) .thenReturn(Optional.absent()); Response response = resources.getJerseyTest()