diff --git a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java index 931630299..62b020150 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java @@ -322,6 +322,9 @@ public class Accounts { existingAccount.getBackupCredentialRequest(BackupCredentialType.MESSAGES).orElse(null), existingAccount.getBackupCredentialRequest(BackupCredentialType.MEDIA).orElse(null)); + // Carry over the existing backup voucher to the new account + accountToCreate.setBackupVoucher(existingAccount.getBackupVoucher()); + final List writeItems = new ArrayList<>(); // If we're reclaiming an account that already has a username, we'd like to give the re-registering client diff --git a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsTest.java b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsTest.java index 593e5c6bc..d712c6989 100644 --- a/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsTest.java +++ b/service/src/test/java/org/whispersystems/textsecuregcm/storage/AccountsTest.java @@ -495,6 +495,10 @@ class AccountsTest { final UUID existingPni = UUID.randomUUID(); final Account existingAccount = generateAccount(e164, existingUuid, existingPni, List.of(device)); + // Backup vouchers should be carried over accross re-registration + final Account.BackupVoucher bv = new Account.BackupVoucher(1, Instant.now().plus(Duration.ofDays(1))); + existingAccount.setBackupVoucher(bv); + createAccount(existingAccount); final byte[] usernameHash = TestRandomUtil.nextBytes(32); @@ -531,6 +535,8 @@ class AccountsTest { assertThat(result.getEncryptedUsername()).isEmpty(); assertArrayEquals(result.getReservedUsernameHash().orElseThrow(), usernameHash); + assertThat(result.getBackupVoucher()).isEqualTo(bv); + // should keep the same usernameLink, now encryptedUsername should be set accounts.confirmUsernameHash(result, usernameHash, encryptedUsername).join(); item = readAccount(existingUuid);