From 6ecff5bce99b7e95ceacf25e072dc7176bf2cfc6 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Wed, 7 Oct 2020 15:51:18 -0400 Subject: [PATCH] Ensure the storage manifest has all inserts and deletes. A user hit a fishy case where not all inserts were present in the full keyset. It's unclear how that would happen, so I'm being even more explicit here. --- .../securesms/storage/StorageSyncHelper.java | 22 ++++++++++--------- 1 file changed, 12 insertions(+), 10 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java index ca7cb5687..d1e0f9c01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -330,21 +330,23 @@ public final class StorageSyncHelper { @NonNull List currentLocalStorageKeys, @NonNull MergeResult mergeResult) { - Set completeKeys = new HashSet<>(currentLocalStorageKeys); - - completeKeys.addAll(Stream.of(mergeResult.getAllNewRecords()).map(SignalRecord::getId).toList()); - completeKeys.removeAll(Stream.of(mergeResult.getAllRemovedRecords()).map(SignalRecord::getId).toList()); - - SignalStorageManifest manifest = new SignalStorageManifest(currentManifestVersion + 1, new ArrayList<>(completeKeys)); - List inserts = new ArrayList<>(); inserts.addAll(mergeResult.getRemoteInserts()); inserts.addAll(Stream.of(mergeResult.getRemoteUpdates()).map(RecordUpdate::getNew).toList()); - List deletes = Stream.of(mergeResult.getRemoteUpdates()).map(RecordUpdate::getOld).map(SignalStorageRecord::getId).map(StorageId::getRaw).toList(); - deletes.addAll(Stream.of(mergeResult.getRemoteDeletes()).map(SignalRecord::getId).map(StorageId::getRaw).toList()); + List deletes = new ArrayList<>(); + deletes.addAll(Stream.of(mergeResult.getRemoteDeletes()).map(SignalRecord::getId).toList()); + deletes.addAll(Stream.of(mergeResult.getRemoteUpdates()).map(RecordUpdate::getOld).map(SignalStorageRecord::getId).toList()); - return new WriteOperationResult(manifest, inserts, deletes); + Set completeKeys = new HashSet<>(currentLocalStorageKeys); + completeKeys.addAll(Stream.of(mergeResult.getAllNewRecords()).map(SignalRecord::getId).toList()); + completeKeys.removeAll(Stream.of(mergeResult.getAllRemovedRecords()).map(SignalRecord::getId).toList()); + completeKeys.addAll(Stream.of(inserts).map(SignalStorageRecord::getId).toList()); + completeKeys.removeAll(deletes); + + SignalStorageManifest manifest = new SignalStorageManifest(currentManifestVersion + 1, new ArrayList<>(completeKeys)); + + return new WriteOperationResult(manifest, inserts, Stream.of(deletes).map(StorageId::getRaw).toList()); } public static @NonNull byte[] generateKey() {