diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java b/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java index fcdb5b7dd..9041eebf1 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/IncomingMessage.java @@ -51,10 +51,14 @@ public record IncomingMessage(int type, .setClientTimestamp(timestamp) .setServerTimestamp(clock.millis()) .setDestinationServiceId(destinationIdentifier.toServiceIdentifierString()) - .setStory(story) .setEphemeral(ephemeral) .setUrgent(urgent); + if (story) { + // Avoid sending this field if it's false. + envelopeBuilder.setStory(true); + } + if (sourceServiceIdentifier != null && sourceDeviceId != null) { envelopeBuilder .setSourceServiceId(sourceServiceIdentifier.toServiceIdentifierString()) 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 8ffd5a24a..b26cd50d7 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java @@ -46,9 +46,13 @@ public record OutgoingMessageEntity(UUID guid, .setServerTimestamp(serverTimestamp()) .setDestinationServiceId(destinationUuid().toServiceIdentifierString()) .setServerGuid(guid().toString()) - .setStory(story) .setUrgent(urgent); + if (story) { + // Avoid sending this field if it's false. + builder.setStory(true); + } + if (sourceUuid() != null) { builder.setSourceServiceId(sourceUuid().toServiceIdentifierString()); builder.setSourceDevice(sourceDevice()); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcService.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcService.java index c66ea8a92..fc2b8b2eb 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcService.java @@ -168,9 +168,13 @@ public class MessagesAnonymousGrpcService extends SimpleMessagesAnonymousGrpc.Me .setDestinationServiceId(destinationServiceIdentifier.toServiceIdentifierString()) .setEphemeral(ephemeral) .setUrgent(urgent) - .setStory(story) .setContent(entry.getValue().getPayload()); + if (story) { + // Avoid sending this field if it's false. + envelopeBuilder.setStory(true); + } + spamCheckResult.token().ifPresent(reportSpamToken -> envelopeBuilder.setReportSpamToken(ByteString.copyFrom(reportSpamToken))); diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java index 3f049a6fb..16bdf5ba9 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/MessagesManager.java @@ -145,15 +145,20 @@ public class MessagesManager { return insertSharedMultiRecipientMessagePayload(multiRecipientMessage) .thenCompose(sharedMrmKey -> { - final Envelope prototypeMessage = Envelope.newBuilder() + final Envelope.Builder envelopeBuilder = Envelope.newBuilder() .setType(Envelope.Type.UNIDENTIFIED_SENDER) .setClientTimestamp(clientTimestamp == 0 ? serverTimestamp : clientTimestamp) .setServerTimestamp(serverTimestamp) - .setStory(isStory) .setEphemeral(isEphemeral) .setUrgent(isUrgent) - .setSharedMrmKey(ByteString.copyFrom(sharedMrmKey)) - .build(); + .setSharedMrmKey(ByteString.copyFrom(sharedMrmKey)); + + if (isStory) { + // Avoid sending this field if it's false. + envelopeBuilder.setStory(true); + } + + final Envelope prototypeMessage = envelopeBuilder.build(); final Map> clientPresenceByAccountAndDevice = new ConcurrentHashMap<>(); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcServiceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcServiceTest.java index 9549c9a06..63cd263d0 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcServiceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/MessagesAnonymousGrpcServiceTest.java @@ -199,7 +199,6 @@ class MessagesAnonymousGrpcServiceTest extends .setServerTimestamp(CLOCK.millis()) .setEphemeral(ephemeral) .setUrgent(urgent) - .setStory(false) .setContent(ByteString.copyFrom(payload)); if (includeReportSpamToken) { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/ChangeNumberManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/ChangeNumberManagerTest.java index dc6c53682..6704af13c 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/ChangeNumberManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/ChangeNumberManagerTest.java @@ -181,7 +181,6 @@ public class ChangeNumberManagerTest { .setUpdatedPni(updatedPhoneNumberIdentifiersByAccount.get(account).toString()) .setUrgent(true) .setEphemeral(false) - .setStory(false) .build(); verify(messageSender).sendMessages(argThat(a -> a.getIdentifier(IdentityType.ACI).equals(aci)), diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesManagerTest.java index fd01c3a9a..2dd366264 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/MessagesManagerTest.java @@ -152,15 +152,17 @@ class MessagesManagerTest { final boolean isEphemeral = ThreadLocalRandom.current().nextBoolean(); final boolean isUrgent = ThreadLocalRandom.current().nextBoolean(); - final Envelope prototypeExpectedMessage = Envelope.newBuilder() + final Envelope.Builder expectedEnvelopeBuilder = Envelope.newBuilder() .setType(Envelope.Type.UNIDENTIFIED_SENDER) .setClientTimestamp(clientTimestamp) .setServerTimestamp(CLOCK.millis()) - .setStory(isStory) .setEphemeral(isEphemeral) .setUrgent(isUrgent) - .setSharedMrmKey(ByteString.copyFrom(sharedMrmKey)) - .build(); + .setSharedMrmKey(ByteString.copyFrom(sharedMrmKey)); + if (isStory) { + expectedEnvelopeBuilder.setStory(true); + } + final Envelope prototypeExpectedMessage = expectedEnvelopeBuilder.build(); assertEquals(expectedPresenceByAccountAndDeviceId, messagesManager.insertMultiRecipientMessage(multiRecipientMessage, resolvedRecipients, clientTimestamp, isStory, isEphemeral, isUrgent).join());