From 378b32d44d124d31627c0a3f2265bdd2bd65b2a5 Mon Sep 17 00:00:00 2001 From: erik-signal <113138376+erik-signal@users.noreply.github.com> Date: Thu, 23 Feb 2023 11:18:07 -0500 Subject: [PATCH] Add missing token field to OutgoingMessageEntity --- .../entities/OutgoingMessageEntity.java | 18 +++++--- .../entities/OutgoingMessageEntityTest.java | 43 +++++++++++++++++-- .../metrics/MessageMetricsTest.java | 2 +- 3 files changed, 53 insertions(+), 10 deletions(-) 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 4de88c0b3..1f61f1a7d 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntity.java @@ -13,7 +13,7 @@ import javax.annotation.Nullable; public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullable UUID sourceUuid, int sourceDevice, UUID destinationUuid, @Nullable UUID updatedPni, byte[] content, - long serverTimestamp, boolean urgent, boolean story) { + long serverTimestamp, boolean urgent, boolean story, @Nullable byte[] reportSpamToken) { public MessageProtos.Envelope toEnvelope() { final MessageProtos.Envelope.Builder builder = MessageProtos.Envelope.newBuilder() @@ -38,10 +38,15 @@ public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullab builder.setUpdatedPni(updatedPni().toString()); } + if (reportSpamToken != null) { + builder.setReportSpamToken(ByteString.copyFrom(reportSpamToken)); + } + return builder.build(); } public static OutgoingMessageEntity fromEnvelope(final MessageProtos.Envelope envelope) { + ByteString token = envelope.getReportSpamToken(); return new OutgoingMessageEntity( UUID.fromString(envelope.getServerGuid()), envelope.getType().getNumber(), @@ -53,7 +58,8 @@ public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullab envelope.getContent().toByteArray(), envelope.getServerTimestamp(), envelope.getUrgent(), - envelope.getStory()); + envelope.getStory(), + token.isEmpty() ? null : token.toByteArray()); } @Override @@ -75,14 +81,16 @@ public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullab Arrays.equals(content, that.content) && serverTimestamp == that.serverTimestamp && urgent == that.urgent && - story == that.story; + story == that.story && + Arrays.equals(reportSpamToken, that.reportSpamToken); } @Override public int hashCode() { - int result = Objects.hash(guid, type, timestamp, sourceUuid, sourceDevice, destinationUuid, updatedPni, - serverTimestamp, urgent, story); + int result = Objects.hash( + guid, type, timestamp, sourceUuid, sourceDevice, destinationUuid, updatedPni, serverTimestamp, urgent, story); result = 31 * result + Arrays.hashCode(content); + result = 71 * result + Arrays.hashCode(reportSpamToken); return result; } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityTest.java index ef22f8727..1ebb97661 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/entities/OutgoingMessageEntityTest.java @@ -11,23 +11,28 @@ import java.util.Random; import java.util.UUID; import java.util.stream.Stream; import javax.annotation.Nullable; +import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.MethodSource; +import org.whispersystems.textsecuregcm.storage.Account; import org.whispersystems.textsecuregcm.storage.Device; class OutgoingMessageEntityTest { @ParameterizedTest @MethodSource - void toFromEnvelope(@Nullable final UUID sourceUuid, @Nullable final UUID updatedPni) { + void roundTripThroughEnvelope(@Nullable final UUID sourceUuid, @Nullable final UUID updatedPni) { final byte[] messageContent = new byte[16]; new Random().nextBytes(messageContent); final long messageTimestamp = System.currentTimeMillis(); final long serverTimestamp = messageTimestamp + 17; - final OutgoingMessageEntity outgoingMessageEntity = new OutgoingMessageEntity(UUID.randomUUID(), + byte[] reportSpamToken = {1, 2, 3, 4, 5}; + + final OutgoingMessageEntity outgoingMessageEntity = new OutgoingMessageEntity( + UUID.randomUUID(), MessageProtos.Envelope.Type.CIPHERTEXT_VALUE, messageTimestamp, UUID.randomUUID(), @@ -37,15 +42,45 @@ class OutgoingMessageEntityTest { messageContent, serverTimestamp, true, - false); + false, + reportSpamToken); assertEquals(outgoingMessageEntity, OutgoingMessageEntity.fromEnvelope(outgoingMessageEntity.toEnvelope())); } - private static Stream toFromEnvelope() { + private static Stream roundTripThroughEnvelope() { return Stream.of( Arguments.of(UUID.randomUUID(), UUID.randomUUID()), Arguments.of(UUID.randomUUID(), null), Arguments.of(null, UUID.randomUUID())); } + + @Test + void entityPreservesEnvelope() { + final Random random = new Random(); + + final byte[] messageContent = new byte[16]; + random.nextBytes(messageContent); + + final byte[] reportSpamToken = new byte[8]; + random.nextBytes(reportSpamToken); + + final Account account = new Account(); + account.setUuid(UUID.randomUUID()); + + IncomingMessage message = new IncomingMessage(1, 4444L, 55, "AAAAAA"); + + MessageProtos.Envelope baseEnvelope = message.toEnvelope( + UUID.randomUUID(), + account, + 123L, + System.currentTimeMillis(), + false, + true, + reportSpamToken); + + MessageProtos.Envelope envelope = baseEnvelope.toBuilder().setServerGuid(UUID.randomUUID().toString()).build(); + + assertEquals(envelope, OutgoingMessageEntity.fromEnvelope(envelope).toEnvelope()); + } } diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java index 97fc3db3d..32c1b5fc2 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/metrics/MessageMetricsTest.java @@ -70,7 +70,7 @@ class MessageMetricsTest { } private OutgoingMessageEntity createOutgoingMessageEntity(UUID destinationUuid) { - return new OutgoingMessageEntity(UUID.randomUUID(), 1, 1L, null, 1, destinationUuid, null, new byte[]{}, 1, true, false); + return new OutgoingMessageEntity(UUID.randomUUID(), 1, 1L, null, 1, destinationUuid, null, new byte[]{}, 1, true, false, null); } @Test