Add missing token field to OutgoingMessageEntity

This commit is contained in:
erik-signal 2023-02-23 11:18:07 -05:00 committed by GitHub
parent e1fcd3e3f6
commit 378b32d44d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 53 additions and 10 deletions

View File

@ -13,7 +13,7 @@ import javax.annotation.Nullable;
public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullable UUID sourceUuid, int sourceDevice, public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullable UUID sourceUuid, int sourceDevice,
UUID destinationUuid, @Nullable UUID updatedPni, byte[] content, 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() { public MessageProtos.Envelope toEnvelope() {
final MessageProtos.Envelope.Builder builder = MessageProtos.Envelope.newBuilder() 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()); builder.setUpdatedPni(updatedPni().toString());
} }
if (reportSpamToken != null) {
builder.setReportSpamToken(ByteString.copyFrom(reportSpamToken));
}
return builder.build(); return builder.build();
} }
public static OutgoingMessageEntity fromEnvelope(final MessageProtos.Envelope envelope) { public static OutgoingMessageEntity fromEnvelope(final MessageProtos.Envelope envelope) {
ByteString token = envelope.getReportSpamToken();
return new OutgoingMessageEntity( return new OutgoingMessageEntity(
UUID.fromString(envelope.getServerGuid()), UUID.fromString(envelope.getServerGuid()),
envelope.getType().getNumber(), envelope.getType().getNumber(),
@ -53,7 +58,8 @@ public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullab
envelope.getContent().toByteArray(), envelope.getContent().toByteArray(),
envelope.getServerTimestamp(), envelope.getServerTimestamp(),
envelope.getUrgent(), envelope.getUrgent(),
envelope.getStory()); envelope.getStory(),
token.isEmpty() ? null : token.toByteArray());
} }
@Override @Override
@ -75,14 +81,16 @@ public record OutgoingMessageEntity(UUID guid, int type, long timestamp, @Nullab
Arrays.equals(content, that.content) && Arrays.equals(content, that.content) &&
serverTimestamp == that.serverTimestamp && serverTimestamp == that.serverTimestamp &&
urgent == that.urgent && urgent == that.urgent &&
story == that.story; story == that.story &&
Arrays.equals(reportSpamToken, that.reportSpamToken);
} }
@Override @Override
public int hashCode() { public int hashCode() {
int result = Objects.hash(guid, type, timestamp, sourceUuid, sourceDevice, destinationUuid, updatedPni, int result = Objects.hash(
serverTimestamp, urgent, story); guid, type, timestamp, sourceUuid, sourceDevice, destinationUuid, updatedPni, serverTimestamp, urgent, story);
result = 31 * result + Arrays.hashCode(content); result = 31 * result + Arrays.hashCode(content);
result = 71 * result + Arrays.hashCode(reportSpamToken);
return result; return result;
} }
} }

View File

@ -11,23 +11,28 @@ import java.util.Random;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.annotation.Nullable; import javax.annotation.Nullable;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.Arguments; import org.junit.jupiter.params.provider.Arguments;
import org.junit.jupiter.params.provider.MethodSource; import org.junit.jupiter.params.provider.MethodSource;
import org.whispersystems.textsecuregcm.storage.Account;
import org.whispersystems.textsecuregcm.storage.Device; import org.whispersystems.textsecuregcm.storage.Device;
class OutgoingMessageEntityTest { class OutgoingMessageEntityTest {
@ParameterizedTest @ParameterizedTest
@MethodSource @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]; final byte[] messageContent = new byte[16];
new Random().nextBytes(messageContent); new Random().nextBytes(messageContent);
final long messageTimestamp = System.currentTimeMillis(); final long messageTimestamp = System.currentTimeMillis();
final long serverTimestamp = messageTimestamp + 17; 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, MessageProtos.Envelope.Type.CIPHERTEXT_VALUE,
messageTimestamp, messageTimestamp,
UUID.randomUUID(), UUID.randomUUID(),
@ -37,15 +42,45 @@ class OutgoingMessageEntityTest {
messageContent, messageContent,
serverTimestamp, serverTimestamp,
true, true,
false); false,
reportSpamToken);
assertEquals(outgoingMessageEntity, OutgoingMessageEntity.fromEnvelope(outgoingMessageEntity.toEnvelope())); assertEquals(outgoingMessageEntity, OutgoingMessageEntity.fromEnvelope(outgoingMessageEntity.toEnvelope()));
} }
private static Stream<Arguments> toFromEnvelope() { private static Stream<Arguments> roundTripThroughEnvelope() {
return Stream.of( return Stream.of(
Arguments.of(UUID.randomUUID(), UUID.randomUUID()), Arguments.of(UUID.randomUUID(), UUID.randomUUID()),
Arguments.of(UUID.randomUUID(), null), Arguments.of(UUID.randomUUID(), null),
Arguments.of(null, UUID.randomUUID())); 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());
}
} }

View File

@ -70,7 +70,7 @@ class MessageMetricsTest {
} }
private OutgoingMessageEntity createOutgoingMessageEntity(UUID destinationUuid) { 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 @Test