From 76fee5dda2a9d9a85d6f83acb3197b39cb6b0d72 Mon Sep 17 00:00:00 2001 From: AsamK Date: Thu, 10 Sep 2026 17:31:00 +0200 Subject: [PATCH] Fix handling of unknown storage id types that become known Fixes #2112 --- .../signal/manager/helper/StorageHelper.java | 16 ++++++++++------ .../syncStorage/ContactRecordProcessor.java | 3 +-- .../signal/manager/helper/StorageHelperTest.java | 12 ++++++++++++ 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java index c8f13f02..2828a7b3 100644 --- a/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java +++ b/lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java @@ -293,8 +293,7 @@ public class StorageHelper { logger.debug("Found {} of the known-unknowns remotely.", remote.size()); processKnownRecords(connection, remote, identityConflictsPendingRepair); - account.getUnknownStorageIdStore() - .deleteUnknownStorageIds(connection, remote.stream().map(SignalStorageRecord::getId).toList()); + account.getUnknownStorageIdStore().deleteUnknownStorageIds(connection, knownUnknownIds); } connection.commit(); } catch (SQLException e) { @@ -317,10 +316,8 @@ public class StorageHelper { var idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); logger.debug("ID Difference :: {}", idDifference); - final var unknownOnlyLocal = idDifference.localOnlyIds() - .stream() - .filter(id -> !KNOWN_TYPES.contains(id.getType())) - .toList(); + final var unknownStorageIds = account.getUnknownStorageIdStore().getUnknownStorageIds(connection); + final var unknownOnlyLocal = findUnknownOnlyLocalStorageIds(idDifference.localOnlyIds(), unknownStorageIds); if (!unknownOnlyLocal.isEmpty()) { logger.debug("Storage ids with unknown type: {} to delete", unknownOnlyLocal.size()); @@ -406,6 +403,13 @@ public class StorageHelper { } } + static List findUnknownOnlyLocalStorageIds( + final List localOnlyStorageIds, + final Set unknownStorageIds + ) { + return localOnlyStorageIds.stream().filter(unknownStorageIds::contains).toList(); + } + static boolean containsOnlyIdentityConflictsPendingRepair( final WriteOperationResult writeOperation, final Set identityConflictsPendingRepair diff --git a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java index cf7c9971..8d62cddb 100644 --- a/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java +++ b/lib/src/main/java/org/asamk/signal/manager/syncStorage/ContactRecordProcessor.java @@ -98,8 +98,7 @@ public class ContactRecordProcessor extends DefaultStorageRecordProcessor 0 && ( statesDiffer || localIdentityKeySize == 0 || localUnregisteredAtTimestamp > 0 || ( - unrepairableIdentityKeyConflict - && !isPrimaryDevice + unrepairableIdentityKeyConflict && !isPrimaryDevice ) ); } diff --git a/lib/src/test/java/org/asamk/signal/manager/helper/StorageHelperTest.java b/lib/src/test/java/org/asamk/signal/manager/helper/StorageHelperTest.java index f8a5fb85..f9a93c8c 100644 --- a/lib/src/test/java/org/asamk/signal/manager/helper/StorageHelperTest.java +++ b/lib/src/test/java/org/asamk/signal/manager/helper/StorageHelperTest.java @@ -9,11 +9,23 @@ import org.whispersystems.signalservice.internal.storage.protos.StorageRecord; import java.util.List; import java.util.Set; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertTrue; class StorageHelperTest { + @Test + void removesKnownTypeLocalOnlyIdsStoredAsUnknown() { + final var staleStickerPackId = StorageId.forStickerPack(new byte[]{1}); + final var localContactId = StorageId.forContact(new byte[]{2}); + + final var result = StorageHelper.findUnknownOnlyLocalStorageIds(List.of(staleStickerPackId, localContactId), + Set.of(staleStickerPackId)); + + assertEquals(List.of(staleStickerPackId), result); + } + @Test void defersWritesContainingOnlyIdentityConflictsPendingRepair() { final var pendingId = StorageId.forContact(new byte[]{1});