From: AsamK Date: Thu, 30 Jan 2025 18:57:44 +0000 (+0100) Subject: Improve handling of unknown storage records X-Git-Tag: v0.13.13~17 X-Git-Url: https://git.nmode.ca/signal-cli/commitdiff_plain/47d65586cd82e5b948b88e558b102baef7e5d6e9 Improve handling of unknown storage records Fixes #1696 --- 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 bb53479b..14db7c13 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 @@ -210,12 +210,6 @@ public class StorageHelper { remoteOnlyRecords.size()); } - final var unknownInserts = processKnownRecords(connection, remoteOnlyRecords); - final var unknownDeletes = idDifference.localOnlyIds() - .stream() - .filter(id -> !KNOWN_TYPES.contains(id.getType())) - .toList(); - if (!idDifference.localOnlyIds().isEmpty()) { final var updated = account.getRecipientStore() .removeStorageIdsFromLocalOnlyUnregisteredRecipients(connection, @@ -228,6 +222,12 @@ public class StorageHelper { } } + final var unknownInserts = processKnownRecords(connection, remoteOnlyRecords); + final var unknownDeletes = idDifference.localOnlyIds() + .stream() + .filter(id -> !KNOWN_TYPES.contains(id.getType())) + .toList(); + logger.debug("Storage ids with unknown type: {} inserts, {} deletes", unknownInserts.size(), unknownDeletes.size()); @@ -279,10 +279,22 @@ public class StorageHelper { try (final var connection = account.getAccountDatabase().getConnection()) { connection.setAutoCommit(false); - final var localStorageIds = getAllLocalStorageIds(connection); - final var idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); + var localStorageIds = getAllLocalStorageIds(connection); + 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(); + + if (!unknownOnlyLocal.isEmpty()) { + logger.debug("Storage ids with unknown type: {} to delete", unknownOnlyLocal.size()); + account.getUnknownStorageIdStore().deleteUnknownStorageIds(connection, unknownOnlyLocal); + localStorageIds = getAllLocalStorageIds(connection); + idDifference = findIdDifference(remoteManifest.storageIds, localStorageIds); + } + final var remoteDeletes = idDifference.remoteOnlyIds().stream().map(StorageId::getRaw).toList(); final var remoteInserts = buildLocalStorageRecords(connection, idDifference.localOnlyIds()); // TODO check if local storage record proto matches remote, then reset to remote storage_id @@ -595,7 +607,7 @@ public class StorageHelper { final var remote = remoteByRawId.get(rawId); final var local = localByRawId.get(rawId); - if (remote.getType() != local.getType() && local.getType() != 0) { + if (remote.getType() != local.getType() && KNOWN_TYPES.contains(local.getType())) { remoteOnlyRawIds.remove(rawId); localOnlyRawIds.remove(rawId); hasTypeMismatch = true;