From 01258de560f6c53f71be410af5d94c1bbaf69862 Mon Sep 17 00:00:00 2001 From: Jon Chambers <63609320+jon-signal@users.noreply.github.com> Date: Wed, 9 Apr 2025 21:53:58 -0400 Subject: [PATCH] Throw a `MismatchedDevicesException` for empty message lists to support iOS clients --- .../textsecuregcm/push/MessageSender.java | 7 ++++++- .../textsecuregcm/push/MessageSenderTest.java | 15 +++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java b/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java index bbd93d698..da1f47ee2 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/push/MessageSender.java @@ -13,6 +13,7 @@ import io.micrometer.core.instrument.DistributionSummary; import io.micrometer.core.instrument.Metrics; import io.micrometer.core.instrument.Tag; import io.micrometer.core.instrument.Tags; +import java.util.Collections; import java.util.HashMap; import java.util.HashSet; import java.util.Map; @@ -99,7 +100,11 @@ public class MessageSender { @Nullable final String userAgent) throws MismatchedDevicesException, MessageTooLargeException { if (messagesByDeviceId.isEmpty()) { - return; + // TODO Simply return and don't throw an exception when iOS clients no longer depend on this behavior + throw new MismatchedDevicesException(new MismatchedDevices( + destination.getDevices().stream().map(Device::getId).collect(Collectors.toSet()), + Collections.emptySet(), + Collections.emptySet())); } if (!destination.isIdentifiedBy(destinationIdentifier)) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java index 833267df3..14409140f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/push/MessageSenderTest.java @@ -344,4 +344,19 @@ class MessageSenderTest { Optional.of(new MismatchedDevices(Set.of(primaryDeviceId), Set.of(extraDeviceId), Set.of(linkedDeviceId)))) ); } + + @Test + void sendMessageEmptyMessageList() { + final Device device = mock(Device.class); + when(device.getId()).thenReturn(Device.PRIMARY_ID); + + final Account account = mock(Account.class); + when(account.getDevices()).thenReturn(List.of(device)); + + assertThrows(MismatchedDevicesException.class, () -> messageSender.sendMessages(account, + new AciServiceIdentifier(UUID.randomUUID()), + Collections.emptyMap(), + Collections.emptyMap(), + null)); + } }