diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcService.java b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcService.java index bdbf21a33..c46920636 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcService.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcService.java @@ -53,6 +53,7 @@ import org.signal.chat.account.GetEntitlementsRequest; import org.signal.chat.account.GetEntitlementsResponse; import org.signal.chat.account.ListMfaKeysRequest; import org.signal.chat.account.ListMfaKeysResponse; +import org.signal.chat.account.ListMfaKeysResponse.MfaKeyMetadata.MfaKeyType; import org.signal.chat.account.RegistrationLockFailure; import org.signal.chat.account.RemoveMfaKeyRequest; import org.signal.chat.account.RemoveMfaKeyResponse; @@ -612,14 +613,13 @@ public class AccountsGrpcService extends SimpleAccountsGrpc.AccountsImplBase { getAuthenticatedAccount().getMfaKeys().forEach((keyId, mfaKey) -> { assert mfaKey.metadataCiphertext() != null; - ListMfaKeysResponse.MfaKeyMetadata.Builder metadataBuilder = ListMfaKeysResponse.MfaKeyMetadata.newBuilder() - .setMetadataCiphertext(ByteString.copyFrom(mfaKey.metadataCiphertext())); - - switch (mfaKey) { - case AnnotatedTotpKey k -> metadataBuilder.setTotpParameters(toGrpcTotpParameters(k.totpKey().totpParameters())); - } - - responseBuilder.putKeys(keyId, metadataBuilder.build()); + responseBuilder.putKeys( + keyId, + ListMfaKeysResponse.MfaKeyMetadata.newBuilder() + .setMetadataCiphertext(ByteString.copyFrom(mfaKey.metadataCiphertext())) + .setType(switch (mfaKey) { + case AnnotatedTotpKey _ -> MfaKeyType.MFA_KEY_TYPE_TOTP; + }).build()); }); return responseBuilder.build(); diff --git a/service/src/main/proto/org/signal/chat/account.proto b/service/src/main/proto/org/signal/chat/account.proto index 70e7301e8..06f95b202 100644 --- a/service/src/main/proto/org/signal/chat/account.proto +++ b/service/src/main/proto/org/signal/chat/account.proto @@ -575,13 +575,16 @@ message ListMfaKeysRequest {} message ListMfaKeysResponse { message MfaKeyMetadata { - // The user-provided ciphertext for metadata associated with this MFA key + enum MfaKeyType { + MFA_KEY_TYPE_UNSPECIFIED = 0; + MFA_KEY_TYPE_TOTP = 1; + } + + /// The user-provided ciphertext for metadata associated with this MFA key bytes metadata_ciphertext = 1 [(require.exactlySize) = 160]; - oneof mfa_key { - // The TOTP parameters associated with this key, which is a TOTP key - TotpParameters totp_parameters = 2; - } + /// The type of MFA factor this key is for + MfaKeyType type = 2; } map keys = 1; diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcServiceTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcServiceTest.java index 6c735db6f..98a9da7d5 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcServiceTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/grpc/AccountsGrpcServiceTest.java @@ -92,6 +92,7 @@ import org.signal.chat.account.SetZkCredentialKeyResponse; import org.signal.chat.account.StaleDevices; import org.signal.chat.account.TotpParameters; import org.signal.chat.account.UsernameNotAvailable; +import org.signal.chat.account.ListMfaKeysResponse.MfaKeyMetadata.MfaKeyType; import org.signal.chat.common.AccountIdentifiers; import org.signal.chat.common.EcSignedPreKey; import org.signal.chat.common.KemSignedPreKey; @@ -1236,15 +1237,9 @@ class AccountsGrpcServiceTest extends SimpleBaseGrpcTest expectedTotpKeys = totpKeys.entrySet().stream() .collect(Collectors.toMap(entry -> entry.getKey().intValue(), entry -> ListMfaKeysResponse.MfaKeyMetadata.newBuilder() - .setTotpParameters(expectedTotpParameters) + .setType(MfaKeyType.MFA_KEY_TYPE_TOTP) .setMetadataCiphertext(ByteString.copyFrom(entry.getValue().metadataCiphertext())) .build()));