diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java index d250c7bdb..fafc88039 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/controllers/MessageController.java @@ -190,14 +190,16 @@ public class MessageController { final String senderType; - if (source.isPresent() && !source.get().getAccount().getUuid().equals(destinationUuid)) { - identifiedMeter.mark(); - senderType = "identified"; - } else if (source.isEmpty()) { + if (source.isPresent()) { + if (source.get().getAccount().isIdentifiedBy(destinationUuid)) { + senderType = "self"; + } else { + identifiedMeter.mark(); + senderType = "identified"; + } + } else { unidentifiedMeter.mark(); senderType = "unidentified"; - } else { - senderType = "self"; } for (final IncomingMessage message : messages.getMessages()) { @@ -220,12 +222,13 @@ public class MessageController { } try { - boolean isSyncMessage = source.isPresent() && source.get().getAccount().getUuid().equals(destinationUuid); + boolean isSyncMessage = source.isPresent() && source.get().getAccount().isIdentifiedBy(destinationUuid); Optional destination; if (!isSyncMessage) { - destination = accountsManager.getByAccountIdentifier(destinationUuid); + destination = accountsManager.getByAccountIdentifier(destinationUuid) + .or(() -> accountsManager.getByPhoneNumberIdentifier(destinationUuid)); } else { destination = source.map(AuthenticatedAccount::getAccount); } @@ -233,7 +236,7 @@ public class MessageController { OptionalAccess.verify(source.map(AuthenticatedAccount::getAccount), accessKey, destination); assert (destination.isPresent()); - if (source.isPresent() && !source.get().getAccount().getUuid().equals(destinationUuid)) { + if (source.isPresent() && !source.get().getAccount().isIdentifiedBy(destinationUuid)) { final String senderCountryCode = Util.getCountryCode(source.get().getAccount().getNumber()); try { @@ -278,8 +281,8 @@ public class MessageController { if (destinationDevice.isPresent()) { Metrics.counter(SENT_MESSAGE_COUNTER_NAME, tags).increment(); - sendMessage(source, destination.get(), destinationDevice.get(), messages.getTimestamp(), messages.isOnline(), - incomingMessage, userAgent); + sendMessage(source, destination.get(), destinationDevice.get(), destinationUuid, messages.getTimestamp(), + messages.isOnline(), incomingMessage, userAgent); } } @@ -522,6 +525,7 @@ public class MessageController { private void sendMessage(Optional source, Account destinationAccount, Device destinationDevice, + UUID destinationUuid, long timestamp, boolean online, IncomingMessage incomingMessage, @@ -557,22 +561,20 @@ public class MessageController { messageBuilder.setType(envelopeType) .setTimestamp(timestamp == 0 ? System.currentTimeMillis() : timestamp) - .setServerTimestamp(System.currentTimeMillis()); + .setServerTimestamp(System.currentTimeMillis()) + .setDestinationUuid(destinationUuid.toString()); - if (source.isPresent()) { - messageBuilder.setSource(source.get().getAccount().getNumber()) - .setSourceUuid(source.get().getAccount().getUuid().toString()) - .setSourceDevice((int) source.get().getAuthenticatedDevice().getId()); - } + source.ifPresent(authenticatedAccount -> + messageBuilder.setSource(authenticatedAccount.getAccount().getNumber()) + .setSourceUuid(authenticatedAccount.getAccount().getUuid().toString()) + .setSourceDevice((int) authenticatedAccount.getAuthenticatedDevice().getId())); - if (messageBody.isPresent()) { + messageBody.ifPresent(bytes -> { Metrics.counter(LEGACY_MESSAGE_SENT_COUNTER).increment(); messageBuilder.setLegacyMessage(ByteString.copyFrom(messageBody.get())); - } + }); - if (messageContent.isPresent()) { - messageBuilder.setContent(ByteString.copyFrom(messageContent.get())); - } + messageContent.ifPresent(bytes -> messageBuilder.setContent(ByteString.copyFrom(bytes))); messageSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build(), online); } catch (NotPushRegisteredException e) { @@ -581,8 +583,12 @@ public class MessageController { } } - private void sendMessage(Account destinationAccount, Device destinationDevice, long timestamp, boolean online, - Recipient recipient, byte[] commonPayload) throws NoSuchUserException { + private void sendMessage(Account destinationAccount, + Device destinationDevice, + long timestamp, + boolean online, + Recipient recipient, + byte[] commonPayload) throws NoSuchUserException { try (final Timer.Context ignored = sendCommonMessageInternalTimer.time()) { Envelope.Builder messageBuilder = Envelope.newBuilder(); long serverTimestamp = System.currentTimeMillis(); @@ -597,7 +603,8 @@ public class MessageController { .setType(Type.UNIDENTIFIED_SENDER) .setTimestamp(timestamp == 0 ? serverTimestamp : timestamp) .setServerTimestamp(serverTimestamp) - .setContent(ByteString.copyFrom(payload)); + .setContent(ByteString.copyFrom(payload)) + .setDestinationUuid(destinationAccount.getUuid().toString()); messageSender.sendMessage(destinationAccount, destinationDevice, messageBuilder.build(), online); } catch (NotPushRegisteredException e) { diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java index ceea1bd66..5e77874b1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java @@ -5,6 +5,7 @@ package org.whispersystems.textsecuregcm.entities; +import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonProperty; @@ -15,47 +16,58 @@ import java.util.UUID; public class OutgoingMessageEntity { @JsonIgnore - private long id; + private final long id; @JsonIgnore - private boolean cached; + private final boolean cached; @JsonProperty - private UUID guid; + private final UUID guid; @JsonProperty - private int type; + private final int type; @JsonProperty - private String relay; + private final String relay; @JsonProperty - private long timestamp; + private final long timestamp; @JsonProperty - private String source; + private final String source; @JsonProperty - private UUID sourceUuid; + private final UUID sourceUuid; @JsonProperty - private int sourceDevice; + private final int sourceDevice; @JsonProperty - private byte[] message; + private final UUID destinationUuid; @JsonProperty - private byte[] content; + private final byte[] message; @JsonProperty - private long serverTimestamp; + private final byte[] content; - public OutgoingMessageEntity() {} + @JsonProperty + private final long serverTimestamp; - public OutgoingMessageEntity(long id, boolean cached, - UUID guid, int type, String relay, long timestamp, - String source, UUID sourceUuid, int sourceDevice, - byte[] message, byte[] content, long serverTimestamp) + @JsonCreator + public OutgoingMessageEntity(@JsonProperty("id") final long id, + @JsonProperty("cached") final boolean cached, + @JsonProperty("guid") final UUID guid, + @JsonProperty("type") final int type, + @JsonProperty("relay") final String relay, + @JsonProperty("timestamp") final long timestamp, + @JsonProperty("source") final String source, + @JsonProperty("sourceUuid") final UUID sourceUuid, + @JsonProperty("sourceDevice") final int sourceDevice, + @JsonProperty("destinationUuid") final UUID destinationUuid, + @JsonProperty("message") final byte[] message, + @JsonProperty("content") final byte[] content, + @JsonProperty("serverTimestamp") final long serverTimestamp) { this.id = id; this.cached = cached; @@ -66,6 +78,7 @@ public class OutgoingMessageEntity { this.source = source; this.sourceUuid = sourceUuid; this.sourceDevice = sourceDevice; + this.destinationUuid = destinationUuid; this.message = message; this.content = content; this.serverTimestamp = serverTimestamp; @@ -99,6 +112,10 @@ public class OutgoingMessageEntity { return sourceDevice; } + public UUID getDestinationUuid() { + return destinationUuid; + } + public byte[] getMessage() { return message; } diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java index b767f37a9..9e53d5ca6 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Account.java @@ -112,6 +112,16 @@ public class Account { return Optional.ofNullable(phoneNumberIdentifier); } + /** + * Tests whether this account's account identifier or phone number identifier matches the given UUID. + * + * @param identifier the identifier to test + * @return {@code true} if this account's identifier or phone number identifier matches + */ + public boolean isIdentifiedBy(final UUID identifier) { + return uuid.equals(identifier) || (phoneNumberIdentifier != null && phoneNumberIdentifier.equals(identifier)); + } + public String getNumber() { requireNotStale(); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java index de5420733..3532610c1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesCache.java @@ -385,6 +385,7 @@ public class MessagesCache extends RedisClusterPubSubAdapter imp envelope.getSource(), envelope.hasSourceUuid() ? UUID.fromString(envelope.getSourceUuid()) : null, envelope.getSourceDevice(), + envelope.hasDestinationUuid() ? UUID.fromString(envelope.getDestinationUuid()) : null, envelope.hasLegacyMessage() ? envelope.getLegacyMessage().toByteArray() : null, envelope.hasContent() ? envelope.getContent().toByteArray() : null, envelope.hasServerTimestamp() ? envelope.getServerTimestamp() : 0); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesDynamoDb.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesDynamoDb.java index e97647e72..37b14c34d 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesDynamoDb.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesDynamoDb.java @@ -46,6 +46,7 @@ public class MessagesDynamoDb extends AbstractDynamoDbStore { private static final String KEY_SOURCE = "SN"; private static final String KEY_SOURCE_UUID = "SU"; private static final String KEY_SOURCE_DEVICE = "SD"; + private static final String KEY_DESTINATION_UUID = "DU"; private static final String KEY_MESSAGE = "M"; private static final String KEY_CONTENT = "C"; private static final String KEY_TTL = "E"; @@ -224,9 +225,10 @@ public class MessagesDynamoDb extends AbstractDynamoDbStore { final String source = AttributeValues.getString(message, KEY_SOURCE, null); final UUID sourceUuid = AttributeValues.getUUID(message, KEY_SOURCE_UUID, null); final int sourceDevice = AttributeValues.getInt(message, KEY_SOURCE_DEVICE, 0); + final UUID destinationUuid = AttributeValues.getUUID(message, KEY_DESTINATION_UUID, null); final byte[] messageBytes = AttributeValues.getByteArray(message, KEY_MESSAGE, null); final byte[] content = AttributeValues.getByteArray(message, KEY_CONTENT, null); - return new OutgoingMessageEntity(-1L, false, messageUuid, type, relay, timestamp, source, sourceUuid, sourceDevice, messageBytes, content, sortKey.getServerTimestamp()); + return new OutgoingMessageEntity(-1L, false, messageUuid, type, relay, timestamp, source, sourceUuid, sourceDevice, destinationUuid, messageBytes, content, sortKey.getServerTimestamp()); } private void deleteRowsMatchingQuery(AttributeValue partitionKey, QueryRequest querySpec) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java index edc0646a4..9ccef1376 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/controllers/MessageControllerTest.java @@ -94,6 +94,7 @@ class MessageControllerTest { private static final String SINGLE_DEVICE_RECIPIENT = "+14151111111"; private static final UUID SINGLE_DEVICE_UUID = UUID.randomUUID(); + private static final UUID SINGLE_DEVICE_PNI = UUID.randomUUID(); private static final String MULTI_DEVICE_RECIPIENT = "+14152222222"; private static final UUID MULTI_DEVICE_UUID = UUID.randomUUID(); @@ -156,13 +157,12 @@ class MessageControllerTest { false, false, false))); }}; - Account singleDeviceAccount = new Account(SINGLE_DEVICE_RECIPIENT, SINGLE_DEVICE_UUID, UUID.randomUUID(), - singleDeviceList, "1234".getBytes()); - Account multiDeviceAccount = new Account(MULTI_DEVICE_RECIPIENT, MULTI_DEVICE_UUID, UUID.randomUUID(), - multiDeviceList, "1234".getBytes()); + Account singleDeviceAccount = new Account(SINGLE_DEVICE_RECIPIENT, SINGLE_DEVICE_UUID, SINGLE_DEVICE_PNI, singleDeviceList, "1234".getBytes()); + Account multiDeviceAccount = new Account(MULTI_DEVICE_RECIPIENT, MULTI_DEVICE_UUID, UUID.randomUUID(), multiDeviceList, "1234".getBytes()); internationalAccount = new Account(INTERNATIONAL_RECIPIENT, INTERNATIONAL_UUID, UUID.randomUUID(), singleDeviceList, "1234".getBytes()); when(accountsManager.getByAccountIdentifier(eq(SINGLE_DEVICE_UUID))).thenReturn(Optional.of(singleDeviceAccount)); + when(accountsManager.getByPhoneNumberIdentifier(SINGLE_DEVICE_PNI)).thenReturn(Optional.of(singleDeviceAccount)); when(accountsManager.getByAccountIdentifier(eq(MULTI_DEVICE_UUID))).thenReturn(Optional.of(multiDeviceAccount)); when(accountsManager.getByAccountIdentifier(INTERNATIONAL_UUID)).thenReturn(Optional.of(internationalAccount)); @@ -250,6 +250,25 @@ class MessageControllerTest { ); } + @Test + void testSingleDeviceCurrentByPni() throws Exception { + Response response = + resources.getJerseyTest() + .target(String.format("/v1/messages/%s", SINGLE_DEVICE_PNI)) + .request() + .header("Authorization", AuthHelper.getAuthHeader(AuthHelper.VALID_UUID, AuthHelper.VALID_PASSWORD)) + .put(Entity.entity(mapper.readValue(jsonFixture("fixtures/current_message_single_device.json"), IncomingMessageList.class), + MediaType.APPLICATION_JSON_TYPE)); + + assertThat("Good Response", response.getStatus(), is(equalTo(200))); + + ArgumentCaptor captor = ArgumentCaptor.forClass(Envelope.class); + verify(messageSender, times(1)).sendMessage(any(Account.class), any(Device.class), captor.capture(), eq(false)); + + assertTrue(captor.getValue().hasSource()); + assertTrue(captor.getValue().hasSourceDevice()); + } + @Test void testNullMessageInList() throws Exception { Response response = @@ -440,8 +459,8 @@ class MessageControllerTest { final UUID sourceUuid = UUID.randomUUID(); List messages = new LinkedList<>() {{ - add(new OutgoingMessageEntity(1L, false, messageGuidOne, Envelope.Type.CIPHERTEXT_VALUE, null, timestampOne, "+14152222222", sourceUuid, 2, "hi there".getBytes(), null, 0)); - add(new OutgoingMessageEntity(2L, false, null, Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE, null, timestampTwo, "+14152222222", sourceUuid, 2, null, null, 0)); + add(new OutgoingMessageEntity(1L, false, messageGuidOne, Envelope.Type.CIPHERTEXT_VALUE, null, timestampOne, "+14152222222", sourceUuid, 2, AuthHelper.VALID_UUID, "hi there".getBytes(), null, 0)); + add(new OutgoingMessageEntity(2L, false, null, Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE, null, timestampTwo, "+14152222222", sourceUuid, 2, AuthHelper.VALID_UUID, null, null, 0)); }}; OutgoingMessageEntityList messagesList = new OutgoingMessageEntityList(messages, false); @@ -477,8 +496,8 @@ class MessageControllerTest { final long timestampTwo = 313388; List messages = new LinkedList() {{ - add(new OutgoingMessageEntity(1L, false, UUID.randomUUID(), Envelope.Type.CIPHERTEXT_VALUE, null, timestampOne, "+14152222222", UUID.randomUUID(), 2, "hi there".getBytes(), null, 0)); - add(new OutgoingMessageEntity(2L, false, UUID.randomUUID(), Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE, null, timestampTwo, "+14152222222", UUID.randomUUID(), 2, null, null, 0)); + add(new OutgoingMessageEntity(1L, false, UUID.randomUUID(), Envelope.Type.CIPHERTEXT_VALUE, null, timestampOne, "+14152222222", UUID.randomUUID(), 2, AuthHelper.VALID_UUID, "hi there".getBytes(), null, 0)); + add(new OutgoingMessageEntity(2L, false, UUID.randomUUID(), Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE, null, timestampTwo, "+14152222222", UUID.randomUUID(), 2, AuthHelper.VALID_UUID, null, null, 0)); }}; OutgoingMessageEntityList messagesList = new OutgoingMessageEntityList(messages, false); @@ -504,12 +523,12 @@ class MessageControllerTest { UUID uuid1 = UUID.randomUUID(); when(messagesManager.delete(AuthHelper.VALID_UUID, 1, uuid1)).thenReturn(Optional.of(new OutgoingMessageEntity( 31337L, true, uuid1, Envelope.Type.CIPHERTEXT_VALUE, - null, timestamp, "+14152222222", sourceUuid, 1, "hi".getBytes(), null, 0))); + null, timestamp, "+14152222222", sourceUuid, 1, AuthHelper.VALID_UUID, "hi".getBytes(), null, 0))); UUID uuid2 = UUID.randomUUID(); when(messagesManager.delete(AuthHelper.VALID_UUID, 1, uuid2)).thenReturn(Optional.of(new OutgoingMessageEntity( 31337L, true, uuid2, Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE, - null, System.currentTimeMillis(), "+14152222222", sourceUuid, 1, null, null, 0))); + null, System.currentTimeMillis(), "+14152222222", sourceUuid, 1, AuthHelper.VALID_UUID, null, null, 0))); UUID uuid3 = UUID.randomUUID(); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java index 739595748..7af836f01 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/websocket/WebSocketConnectionTest.java @@ -151,9 +151,9 @@ public class WebSocketConnectionTest { UUID senderTwoUuid = UUID.randomUUID(); List outgoingMessages = new LinkedList () {{ - add(createMessage(1L, false, "sender1", senderOneUuid, 1111, false, "first")); - add(createMessage(2L, false, "sender1", senderOneUuid, 2222, false, "second")); - add(createMessage(3L, false, "sender2", senderTwoUuid, 3333, false, "third")); + add(createMessage(1L, false, "sender1", senderOneUuid, UUID.randomUUID(), 1111, false, "first")); + add(createMessage(2L, false, "sender1", senderOneUuid, UUID.randomUUID(), 2222, false, "second")); + add(createMessage(3L, false, "sender2", senderTwoUuid, UUID.randomUUID(), 3333, false, "third")); }}; OutgoingMessageEntityList outgoingMessagesList = new OutgoingMessageEntityList(outgoingMessages, false); @@ -233,8 +233,8 @@ public class WebSocketConnectionTest { when(messagesManager.getMessagesForDevice(eq(accountUuid), eq(1L), eq("Test-UA"), anyBoolean())) .thenReturn(new OutgoingMessageEntityList(Collections.emptyList(), false)) - .thenReturn(new OutgoingMessageEntityList(List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), 1111, false, "first")), false)) - .thenReturn(new OutgoingMessageEntityList(List.of(createMessage(2L, false, "sender1", UUID.randomUUID(), 2222, false, "second")), false)); + .thenReturn(new OutgoingMessageEntityList(List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 1111, false, "first")), false)) + .thenReturn(new OutgoingMessageEntityList(List.of(createMessage(2L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 2222, false, "second")), false)); final WebSocketResponseMessage successResponse = mock(WebSocketResponseMessage.class); when(successResponse.getStatus()).thenReturn(200); @@ -286,6 +286,7 @@ public class WebSocketConnectionTest { .setLegacyMessage(ByteString.copyFrom("first".getBytes())) .setSource("sender1") .setSourceUuid(UUID.randomUUID().toString()) + .setDestinationUuid(UUID.randomUUID().toString()) .setTimestamp(System.currentTimeMillis()) .setSourceDevice(1) .setType(Envelope.Type.CIPHERTEXT) @@ -295,6 +296,7 @@ public class WebSocketConnectionTest { .setLegacyMessage(ByteString.copyFrom("second".getBytes())) .setSource("sender2") .setSourceUuid(senderTwoUuid.toString()) + .setDestinationUuid(UUID.randomUUID().toString()) .setTimestamp(System.currentTimeMillis()) .setSourceDevice(2) .setType(Envelope.Type.CIPHERTEXT) @@ -303,11 +305,11 @@ public class WebSocketConnectionTest { List pendingMessages = new LinkedList() {{ add(new OutgoingMessageEntity(1, true, UUID.randomUUID(), firstMessage.getType().getNumber(), firstMessage.getRelay(), firstMessage.getTimestamp(), firstMessage.getSource(), UUID.fromString(firstMessage.getSourceUuid()), - firstMessage.getSourceDevice(), firstMessage.getLegacyMessage().toByteArray(), + firstMessage.getSourceDevice(), UUID.fromString(firstMessage.getDestinationUuid()), firstMessage.getLegacyMessage().toByteArray(), firstMessage.getContent().toByteArray(), 0)); add(new OutgoingMessageEntity(2, false, UUID.randomUUID(), secondMessage.getType().getNumber(), secondMessage.getRelay(), secondMessage.getTimestamp(), secondMessage.getSource(), UUID.fromString(secondMessage.getSourceUuid()), - secondMessage.getSourceDevice(), secondMessage.getLegacyMessage().toByteArray(), + secondMessage.getSourceDevice(), UUID.fromString(secondMessage.getDestinationUuid()), secondMessage.getLegacyMessage().toByteArray(), secondMessage.getContent().toByteArray(), 0)); }}; @@ -446,11 +448,11 @@ public class WebSocketConnectionTest { when(client.getUserAgent()).thenReturn("Test-UA"); final List firstPageMessages = - List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), 1111, false, "first"), - createMessage(2L, false, "sender1", UUID.randomUUID(), 2222, false, "second")); + List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 1111, false, "first"), + createMessage(2L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 2222, false, "second")); final List secondPageMessages = - List.of(createMessage(3L, false, "sender1", UUID.randomUUID(), 3333, false, "third")); + List.of(createMessage(3L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 3333, false, "third")); final OutgoingMessageEntityList firstPage = new OutgoingMessageEntityList(firstPageMessages, true); final OutgoingMessageEntityList secondPage = new OutgoingMessageEntityList(secondPageMessages, false); @@ -491,7 +493,7 @@ public class WebSocketConnectionTest { final UUID senderUuid = UUID.randomUUID(); final List messages = List.of( - createMessage(1L, false, "senderE164", senderUuid, 1111L, false, "message the first")); + createMessage(1L, false, "senderE164", senderUuid, UUID.randomUUID(), 1111L, false, "message the first")); final OutgoingMessageEntityList firstPage = new OutgoingMessageEntityList(messages, false); when(messagesManager.getMessagesForDevice(account.getUuid(), 1L, client.getUserAgent(), false)).thenReturn(firstPage); @@ -573,11 +575,11 @@ public class WebSocketConnectionTest { when(client.getUserAgent()).thenReturn("Test-UA"); final List firstPageMessages = - List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), 1111, false, "first"), - createMessage(2L, false, "sender1", UUID.randomUUID(), 2222, false, "second")); + List.of(createMessage(1L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 1111, false, "first"), + createMessage(2L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 2222, false, "second")); final List secondPageMessages = - List.of(createMessage(3L, false, "sender1", UUID.randomUUID(), 3333, false, "third")); + List.of(createMessage(3L, false, "sender1", UUID.randomUUID(), UUID.randomUUID(), 3333, false, "third")); final OutgoingMessageEntityList firstPage = new OutgoingMessageEntityList(firstPageMessages, false); final OutgoingMessageEntityList secondPage = new OutgoingMessageEntityList(secondPageMessages, false); @@ -679,9 +681,9 @@ public class WebSocketConnectionTest { UUID senderTwoUuid = UUID.randomUUID(); List outgoingMessages = new LinkedList () {{ - add(createMessage(1L, false, "sender1", senderOneUuid, 1111, false, "first")); - add(createMessage(2L, false, "sender1", senderOneUuid, 2222, false, RandomStringUtils.randomAlphanumeric(WebSocketConnection.MAX_DESKTOP_MESSAGE_SIZE + 1))); - add(createMessage(3L, false, "sender2", senderTwoUuid, 3333, false, "third")); + add(createMessage(1L, false, "sender1", senderOneUuid, UUID.randomUUID(), 1111, false, "first")); + add(createMessage(2L, false, "sender1", senderOneUuid, UUID.randomUUID(), 2222, false, RandomStringUtils.randomAlphanumeric(WebSocketConnection.MAX_DESKTOP_MESSAGE_SIZE + 1))); + add(createMessage(3L, false, "sender2", senderTwoUuid, UUID.randomUUID(), 3333, false, "third")); }}; OutgoingMessageEntityList outgoingMessagesList = new OutgoingMessageEntityList(outgoingMessages, false); @@ -755,9 +757,9 @@ public class WebSocketConnectionTest { UUID senderTwoUuid = UUID.randomUUID(); List outgoingMessages = new LinkedList () {{ - add(createMessage(1L, false, "sender1", senderOneUuid, 1111, false, "first")); - add(createMessage(2L, false, "sender1", senderOneUuid, 2222, false, RandomStringUtils.randomAlphanumeric(WebSocketConnection.MAX_DESKTOP_MESSAGE_SIZE + 1))); - add(createMessage(3L, false, "sender2", senderTwoUuid, 3333, false, "third")); + add(createMessage(1L, false, "sender1", senderOneUuid, UUID.randomUUID(), 1111, false, "first")); + add(createMessage(2L, false, "sender1", senderOneUuid, UUID.randomUUID(), 2222, false, RandomStringUtils.randomAlphanumeric(WebSocketConnection.MAX_DESKTOP_MESSAGE_SIZE + 1))); + add(createMessage(3L, false, "sender2", senderTwoUuid, UUID.randomUUID(), 3333, false, "third")); }}; OutgoingMessageEntityList outgoingMessagesList = new OutgoingMessageEntityList(outgoingMessages, false); @@ -882,9 +884,9 @@ public class WebSocketConnectionTest { verify(client, never()).close(anyInt(), anyString()); } - private OutgoingMessageEntity createMessage(long id, boolean cached, String sender, UUID senderUuid, long timestamp, boolean receipt, String content) { + private OutgoingMessageEntity createMessage(long id, boolean cached, String sender, UUID senderUuid, UUID destinationUuid, long timestamp, boolean receipt, String content) { return new OutgoingMessageEntity(id, cached, UUID.randomUUID(), receipt ? Envelope.Type.SERVER_DELIVERY_RECEIPT_VALUE : Envelope.Type.CIPHERTEXT_VALUE, - null, timestamp, sender, senderUuid, 1, content.getBytes(), null, 0); + null, timestamp, sender, senderUuid, 1, destinationUuid, content.getBytes(), null, 0); } }