From fcf12face8e6f84b4d5d6a89274ea63d28fe020e Mon Sep 17 00:00:00 2001 From: Chris Eager Date: Tue, 11 Aug 2026 10:46:01 -0400 Subject: [PATCH] Add explicit check for recovery password in AccountsManger#create --- .../textsecuregcm/storage/AccountsManager.java | 4 ++++ .../textsecuregcm/storage/AccountsManagerTest.java | 11 +++++++++++ 2 files changed, 15 insertions(+) diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java index 61d19a110..58b511824 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/AccountsManager.java @@ -311,6 +311,10 @@ public class AccountsManager extends RedisPubSubAdapter implemen final DeviceSpec primaryDeviceSpec, @Nullable final String userAgent) throws ReceiptAlreadyRedeemedException { + accountAttributes.recoveryPassword().filter(b -> b.length > 0) + .orElseThrow( + () -> new IllegalArgumentException("recovery password is required for accounts without phone numbers")); + // This salt is required for generating PNI-based auth credentials (e.g. group credentials) for accounts without a number final byte[] authCredentialSalt = new byte[AUTH_CREDENTIAL_SALT_SIZE]; SECURE_RANDOM.nextBytes(authCredentialSalt); diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java index c284a131c..22859fc99 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsManagerTest.java @@ -1658,6 +1658,17 @@ class AccountsManagerTest { verify(phoneNumberIdentifiers).getPhoneNumberIdentifier(targetNumber); } + @Test + void createAccountWithoutNumberOrRecoveryPassword() { + assertThrows(IllegalArgumentException.class, + () -> accountsManager.create(new AccountAttributes(), + Collections.emptyList(), + new IdentityKey(ECKeyPair.generate().getPublicKey()), + ReceiptCredentialTestUtil.receiptPresentation(), + mock(DeviceSpec.class), + null)); + } + static Collection updateCurrentProfileVersion() { final byte[] empty = new byte[0];