From 6421438f648d04b69c6fb62e0b2582d2deb1f6fe Mon Sep 17 00:00:00 2001 From: Jonathan Klabunde Tomer Date: Fri, 22 Nov 2024 12:15:03 -0800 Subject: [PATCH] Delete deleted-account records by PNI as well as e164 --- .../textsecuregcm/storage/Accounts.java | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) 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 c4a96306d..4bd9b3d41 100644 --- a/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java +++ b/service/src/main/java/org/whispersystems/textsecuregcm/storage/Accounts.java @@ -240,9 +240,10 @@ public class Accounts extends AbstractDynamoDbStore { // Clear any "recently deleted account" record for this number since, if it existed, we've used its old ACI for // the newly-created account. final TransactWriteItem deletedAccountDelete = buildRemoveDeletedAccount(account.getNumber()); + final TransactWriteItem deletedAccountDeletePNI = buildRemoveDeletedAccount(account.getPhoneNumberIdentifier()); final Collection writeItems = new ArrayList<>( - List.of(phoneNumberConstraintPut, phoneNumberIdentifierConstraintPut, accountPut, deletedAccountDelete)); + List.of(phoneNumberConstraintPut, phoneNumberIdentifierConstraintPut, accountPut, deletedAccountDeletePNI, deletedAccountDelete)); writeItems.addAll(additionalWriteItems); @@ -436,6 +437,7 @@ public class Accounts extends AbstractDynamoDbStore { writeItems.add(buildDelete(phoneNumberIdentifierConstraintTableName, ATTR_PNI_UUID, originalPni)); writeItems.add(buildConstraintTablePut(phoneNumberIdentifierConstraintTableName, uuidAttr, ATTR_PNI_UUID, pniAttr)); writeItems.add(buildRemoveDeletedAccount(number)); + writeItems.add(buildRemoveDeletedAccount(phoneNumberIdentifier)); maybeDisplacedAccountIdentifier.ifPresent(displacedAccountIdentifier -> writeItems.add(buildPutDeletedAccount(displacedAccountIdentifier, originalNumber))); @@ -1174,6 +1176,15 @@ public class Accounts extends AbstractDynamoDbStore { .build(); } + private TransactWriteItem buildRemoveDeletedAccount(final UUID pni) { + return TransactWriteItem.builder() + .delete(Delete.builder() + .tableName(deletedAccountsTableName) + .key(Map.of(DELETED_ACCOUNTS_KEY_ACCOUNT_E164, AttributeValues.fromString(pni.toString()))) + .build()) + .build(); + } + @Nonnull public CompletableFuture> getByAccountIdentifierAsync(final UUID uuid) { return AsyncTimerUtil.record(GET_BY_UUID_TIMER, () -> itemByKeyAsync(accountsTableName, KEY_ACCOUNT_UUID, AttributeValues.fromUUID(uuid))