From 52f3ff5ff6ec34ba64d326cd8fd9251f954c38c2 Mon Sep 17 00:00:00 2001 From: Clark Date: Thu, 14 Dec 2023 16:26:29 -0500 Subject: [PATCH] Fix case where we delete unknown remote records but also handle unknown ids. --- .../securesms/jobs/StorageSyncJob.java | 4 ++-- .../api/SignalServiceAccountManager.java | 17 +++++++++++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java index 583a5fe21d..cadb9f69f6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java @@ -331,9 +331,9 @@ public class StorageSyncJob extends BaseJob { Log.i(TAG, "Removed " + removedUnregistered + " recipients from storage service that have been unregistered for longer than 30 days."); } - List localStorageIds = getAllLocalStorageIds(self).stream().filter(it -> !it.isUnknown()).collect(Collectors.toList()); + List localStorageIds = getAllLocalStorageIds(self); IdDifferenceResult idDifference = StorageSyncHelper.findIdDifference(remoteManifest.getStorageIds(), localStorageIds); - List remoteInserts = buildLocalStorageRecords(context, self, idDifference.getLocalOnlyIds()); + List remoteInserts = buildLocalStorageRecords(context, self, idDifference.getLocalOnlyIds().stream().filter(it -> !it.isUnknown()).collect(Collectors.toList())); List remoteDeletes = Stream.of(idDifference.getRemoteOnlyIds()).map(StorageId::getRaw).toList(); Log.i(TAG, "ID Difference :: " + idDifference); diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index bf600b4d79..f840a6657a 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -6,6 +6,8 @@ package org.whispersystems.signalservice.api; +import com.squareup.wire.FieldEncoding; + import org.signal.libsignal.protocol.IdentityKeyPair; import org.signal.libsignal.protocol.InvalidKeyException; import org.signal.libsignal.protocol.ecc.ECPublicKey; @@ -563,10 +565,17 @@ public class SignalServiceAccountManager { manifestRecordBuilder.identifiers( manifest.getStorageIds().stream() - .map(id -> new ManifestRecord.Identifier.Builder() - .raw(ByteString.of(id.getRaw())) - .type(ManifestRecord.Identifier.Type.Companion.fromValue(id.getType())) - .build()) + .map(id -> { + ManifestRecord.Identifier.Builder builder = new ManifestRecord.Identifier.Builder() + .raw(ByteString.of(id.getRaw())); + if (!id.isUnknown()) { + builder.type(ManifestRecord.Identifier.Type.Companion.fromValue(id.getType())); + } else { + builder.type(ManifestRecord.Identifier.Type.UNKNOWN); + builder.addUnknownField(2, FieldEncoding.VARINT, id.getType()); + } + return builder.build(); + }) .collect(Collectors.toList()) );