]> nmode's Git Repositories - signal-cli/commitdiff
Improve handling of unknown storage records
authorAsamK <asamk@gmx.de>
Thu, 30 Jan 2025 18:57:44 +0000 (19:57 +0100)
committerAsamK <asamk@gmx.de>
Thu, 30 Jan 2025 18:57:44 +0000 (19:57 +0100)
Fixes #1696

lib/src/main/java/org/asamk/signal/manager/helper/StorageHelper.java

index bb53479b7e288e0b076923150f02a1edf8c79f58..14db7c13c38e3c7c5d85b8e5078eea000a2655e2 100644 (file)
@@ -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;