From 09b5289d83acd015d907d8166a9ebcd7313838d0 Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 10 Sep 2026 17:41:29 -0400 Subject: [PATCH] Add a gRPC endpoint for reporting spam --- .../textsecuregcm/WhisperServerService.java | 2 +- .../grpc/MessagesGrpcService.java | 29 ++++++++ .../main/proto/org/signal/chat/messages.proto | 18 +++++ .../grpc/MessagesGrpcServiceTest.java | 72 +++++++++++++++++-- 4 files changed, 113 insertions(+), 8 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java index cfd0d71f8..4789d2424 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/WhisperServerService.java @@ -1132,7 +1132,7 @@ public class WhisperServerService extends Application authenticatedServiceStub().sendMessage( generateRequest(serviceIdentifier, false, true, messages))); @@ -682,7 +693,6 @@ class MessagesGrpcServiceTest extends SimpleBaseGrpcTest authenticatedServiceStub().sendSyncMessage(generateRequest(true, messages))); @@ -719,7 +729,6 @@ class MessagesGrpcServiceTest extends SimpleBaseGrpcTest messages = @@ -783,7 +792,7 @@ class MessagesGrpcServiceTest extends SimpleBaseGrpcTest { Flux ackArg = invocation.getArgument(4); // use mapNotNull instead of `then` because there is an interaction between the blocking client and @@ -793,7 +802,7 @@ class MessagesGrpcServiceTest extends SimpleBaseGrpcTest blockingCall = authenticatedServiceStub().getMessages(); - final CompletableFuture reader = CompletableFuture.supplyAsync(() -> assertThrows(StatusException.class, () -> blockingCall.read())); + final CompletableFuture reader = CompletableFuture.supplyAsync(() -> assertThrows(StatusException.class, blockingCall::read)); blockingCall.write(GetMessagesRequest.newBuilder().setOptions(GetMessagesRequest.GetMessageOptions.getDefaultInstance()).build()); blockingCall.write(request); @@ -814,6 +823,55 @@ class MessagesGrpcServiceTest extends SimpleBaseGrpcTest maybeToken.map(token -> Arrays.equals(token, reportSpamToken)).orElse(false)), + any(), + eq(true)); + } + + @Test + void reportMessageNoToken() throws StatusException { + final AciServiceIdentifier sourceServiceIdentifier = new AciServiceIdentifier(UUID.randomUUID()); + final UUID messageGuid = UUID.randomUUID(); + + //noinspection ResultOfMethodCallIgnored + authenticatedServiceStub().reportMessage(ReportMessageRequest.newBuilder() + .setSourceServiceIdentifier(GrpcServiceIdentifierUtil.toGrpcServiceIdentifier(sourceServiceIdentifier)) + .setMessageGuid(UUIDUtil.toByteString(messageGuid)) + .build()); + + verify(reportMessageManager).report(eq(Optional.empty()), + eq(sourceServiceIdentifier.uuid()), + eq(Optional.empty()), + eq(messageGuid), + eq(AUTHENTICATED_ACI), + eq(Optional.empty()), + any(), + eq(true)); + } + } + private static ThrowingSupplier convertStatusException(final ThrowingSupplier serviceCall) { return () -> { try {