From 2d132128e1dcc3442f103ef0f079b4c3ac5c28ab Mon Sep 17 00:00:00 2001 From: Jon Chambers Date: Thu, 27 Jul 2023 14:49:55 -0400 Subject: [PATCH] Switched to a composed request object model for anonymous keys gRPC operations --- .../grpc/KeysAnonymousGrpcService.java | 4 +- .../src/main/proto/org/signal/chat/keys.proto | 13 ++--- .../grpc/KeysAnonymousGrpcServiceTest.java | 53 +++++++++++-------- 3 files changed, 37 insertions(+), 33 deletions(-) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcService.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcService.java index 3e8b90414..a4dd18314 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcService.java @@ -28,14 +28,14 @@ public class KeysAnonymousGrpcService extends ReactorKeysAnonymousGrpc.KeysAnony @Override public Mono getPreKeys(final GetPreKeysAnonymousRequest request) { final ServiceIdentifier serviceIdentifier = - ServiceIdentifierUtil.fromGrpcServiceIdentifier(request.getTargetIdentifier()); + ServiceIdentifierUtil.fromGrpcServiceIdentifier(request.getRequest().getTargetIdentifier()); return Mono.fromFuture(accountsManager.getByServiceIdentifierAsync(serviceIdentifier)) .flatMap(Mono::justOrEmpty) .switchIfEmpty(Mono.error(Status.UNAUTHENTICATED.asException())) .flatMap(targetAccount -> UnidentifiedAccessUtil.checkUnidentifiedAccess(targetAccount, request.getUnidentifiedAccessKey().toByteArray()) - ? KeysGrpcHelper.getPreKeys(targetAccount, serviceIdentifier.identityType(), request.getDeviceId(), keysManager) + ? KeysGrpcHelper.getPreKeys(targetAccount, serviceIdentifier.identityType(), request.getRequest().getDeviceId(), keysManager) : Mono.error(Status.UNAUTHENTICATED.asException())); } } diff --git a/service/src/main/proto/org/signal/chat/keys.proto b/service/src/main/proto/org/signal/chat/keys.proto index 1a8b15ced..d5f06c2d6 100644 --- a/service/src/main/proto/org/signal/chat/keys.proto +++ b/service/src/main/proto/org/signal/chat/keys.proto @@ -146,21 +146,14 @@ message GetPreKeysRequest { message GetPreKeysAnonymousRequest { /** - * The service identifier of the account for which to retrieve pre-keys. + * The request to retrieve pre-keys for a specific account/device(s). */ - common.ServiceIdentifier target_identifier = 1; - - /** - * The ID of the device associated with the targeted account for which to - * retrieve pre-keys. If not set, pre-keys are returned for all devices - * associated with the targeted account. - */ - uint64 device_id = 2; + GetPreKeysRequest request = 1; /** * The unidentified access key (UAK) for the targeted account. */ - bytes unidentified_access_key = 3; + bytes unidentified_access_key = 2; } message GetPreKeysResponse { diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcServiceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcServiceTest.java index dc0640616..89c689a5f 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcServiceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/KeysAnonymousGrpcServiceTest.java @@ -30,6 +30,7 @@ import org.signal.chat.common.EcSignedPreKey; import org.signal.chat.common.KemSignedPreKey; import org.signal.chat.common.ServiceIdentifier; import org.signal.chat.keys.GetPreKeysAnonymousRequest; +import org.signal.chat.keys.GetPreKeysRequest; import org.signal.chat.keys.GetPreKeysResponse; import org.signal.chat.keys.KeysAnonymousGrpc; import org.signal.libsignal.protocol.IdentityKey; @@ -101,13 +102,15 @@ class KeysAnonymousGrpcServiceTest { when(targetDevice.getSignedPreKey(IdentityType.ACI)).thenReturn(ecSignedPreKey); final GetPreKeysResponse response = keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() + .setUnidentifiedAccessKey(ByteString.copyFrom(unidentifiedAccessKey)) + .setRequest(GetPreKeysRequest.newBuilder() .setTargetIdentifier(ServiceIdentifier.newBuilder() .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) .setUuid(UUIDUtil.toByteString(identifier)) .build()) .setDeviceId(Device.MASTER_ID) - .setUnidentifiedAccessKey(ByteString.copyFrom(unidentifiedAccessKey)) - .build()); + .build()) + .build()); final GetPreKeysResponse expectedResponse = GetPreKeysResponse.newBuilder() .setIdentityKey(ByteString.copyFrom(identityKey.serialize())) @@ -152,11 +155,13 @@ class KeysAnonymousGrpcServiceTest { @SuppressWarnings("ResultOfMethodCallIgnored") final StatusRuntimeException statusRuntimeException = assertThrows(StatusRuntimeException.class, () -> keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() - .setTargetIdentifier(ServiceIdentifier.newBuilder() - .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) - .setUuid(UUIDUtil.toByteString(identifier)) + .setRequest(GetPreKeysRequest.newBuilder() + .setTargetIdentifier(ServiceIdentifier.newBuilder() + .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) + .setUuid(UUIDUtil.toByteString(identifier)) + .build()) + .setDeviceId(Device.MASTER_ID) .build()) - .setDeviceId(Device.MASTER_ID) .build())); assertEquals(Status.UNAUTHENTICATED.getCode(), statusRuntimeException.getStatus().getCode()); @@ -168,13 +173,16 @@ class KeysAnonymousGrpcServiceTest { .thenReturn(CompletableFuture.completedFuture(Optional.empty())); @SuppressWarnings("ResultOfMethodCallIgnored") final StatusRuntimeException exception = - assertThrows(StatusRuntimeException.class, () -> keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() - .setUnidentifiedAccessKey(UUIDUtil.toByteString(UUID.randomUUID())) - .setTargetIdentifier(ServiceIdentifier.newBuilder() - .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) - .setUuid(UUIDUtil.toByteString(UUID.randomUUID())) - .build()) - .build())); + assertThrows(StatusRuntimeException.class, + () -> keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() + .setUnidentifiedAccessKey(UUIDUtil.toByteString(UUID.randomUUID())) + .setRequest(GetPreKeysRequest.newBuilder() + .setTargetIdentifier(ServiceIdentifier.newBuilder() + .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) + .setUuid(UUIDUtil.toByteString(UUID.randomUUID())) + .build()) + .build()) + .build())); assertEquals(Status.Code.UNAUTHENTICATED, exception.getStatus().getCode()); } @@ -198,14 +206,17 @@ class KeysAnonymousGrpcServiceTest { .thenReturn(CompletableFuture.completedFuture(Optional.of(targetAccount))); @SuppressWarnings("ResultOfMethodCallIgnored") final StatusRuntimeException exception = - assertThrows(StatusRuntimeException.class, () -> keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() - .setUnidentifiedAccessKey(ByteString.copyFrom(unidentifiedAccessKey)) - .setTargetIdentifier(ServiceIdentifier.newBuilder() - .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) - .setUuid(UUIDUtil.toByteString(accountIdentifier)) - .build()) - .setDeviceId(deviceId) - .build())); + assertThrows(StatusRuntimeException.class, + () -> keysAnonymousStub.getPreKeys(GetPreKeysAnonymousRequest.newBuilder() + .setUnidentifiedAccessKey(ByteString.copyFrom(unidentifiedAccessKey)) + .setRequest(GetPreKeysRequest.newBuilder() + .setTargetIdentifier(ServiceIdentifier.newBuilder() + .setIdentityType(org.signal.chat.common.IdentityType.IDENTITY_TYPE_ACI) + .setUuid(UUIDUtil.toByteString(accountIdentifier)) + .build()) + .setDeviceId(deviceId) + .build()) + .build())); assertEquals(Status.Code.NOT_FOUND, exception.getStatus().getCode()); }