From 0ba1f66136f6ec7aee89be6b7d883f1b34745064 Mon Sep 17 00:00:00 2001 From: Greyson Parrelli Date: Mon, 27 Apr 2020 13:05:22 -0400 Subject: [PATCH] Use the same Recipient.self() instance in storage sync. --- .../securesms/jobs/StorageForcePushJob.java | 2 +- .../securesms/jobs/StorageSyncJob.java | 21 ++++++++++++------- .../securesms/storage/StorageSyncHelper.java | 18 ++++++++-------- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java index dfae83570d..6952c8c0bf 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageForcePushJob.java @@ -90,7 +90,7 @@ public class StorageForcePushJob extends BaseJob { .map(s -> StorageSyncModels.localToRemoteRecord(s, Objects.requireNonNull(newContactStorageIds.get(s.getId())).getRaw(), archivedRecipients)) .toList(); - SignalStorageRecord accountRecord = StorageSyncHelper.buildAccountRecord(context, StorageId.forAccount(Recipient.self().fresh().getStorageServiceId())); + SignalStorageRecord accountRecord = StorageSyncHelper.buildAccountRecord(context, Recipient.self().fresh()); List allNewStorageIds = new ArrayList<>(newContactStorageIds.values()); inserts.add(accountRecord); 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 e1b356c963..1c7ebccc6b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/StorageSyncJob.java @@ -43,6 +43,7 @@ import org.whispersystems.signalservice.internal.storage.protos.ManifestRecord; import java.io.IOException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; import java.util.List; import java.util.Locale; @@ -145,7 +146,7 @@ public class StorageSyncJob extends BaseJob { if (remoteManifest.isPresent() && remoteManifestVersion > localManifestVersion) { Log.i(TAG, "[Remote Newer] Newer manifest version found!"); - List allLocalStorageKeys = getAllLocalStorageIds(context); + List allLocalStorageKeys = getAllLocalStorageIds(context, Recipient.self().fresh()); KeyDifferenceResult keyDifference = StorageSyncHelper.findKeyDifference(remoteManifest.get().getStorageIds(), allLocalStorageKeys); if (!keyDifference.isEmpty()) { @@ -198,12 +199,14 @@ public class StorageSyncJob extends BaseJob { localManifestVersion = TextSecurePreferences.getStorageManifestVersion(context); - List allLocalStorageKeys = getAllLocalStorageIds(context); + Recipient self = Recipient.self().fresh(); + + List allLocalStorageKeys = getAllLocalStorageIds(context, self); List pendingUpdates = recipientDatabase.getPendingRecipientSyncUpdates(); List pendingInsertions = recipientDatabase.getPendingRecipientSyncInsertions(); List pendingDeletions = recipientDatabase.getPendingRecipientSyncDeletions(); - Optional pendingAccountInsert = StorageSyncHelper.getPendingAccountSyncInsert(context); - Optional pendingAccountUpdate = StorageSyncHelper.getPendingAccountSyncUpdate(context); + Optional pendingAccountInsert = StorageSyncHelper.getPendingAccountSyncInsert(context, self); + Optional pendingAccountUpdate = StorageSyncHelper.getPendingAccountSyncUpdate(context, self); Set archivedRecipients = DatabaseFactory.getThreadDatabase(context).getArchivedRecipients(); Optional localWriteResult = StorageSyncHelper.buildStorageUpdatesForLocal(localManifestVersion, allLocalStorageKeys, @@ -254,15 +257,14 @@ public class StorageSyncJob extends BaseJob { return needsMultiDeviceSync; } - private static @NonNull List getAllLocalStorageIds(@NonNull Context context) { - Recipient self = Recipient.self().fresh(); - + private static @NonNull List getAllLocalStorageIds(@NonNull Context context, @NonNull Recipient self) { return Util.concatenatedList(DatabaseFactory.getRecipientDatabase(context).getContactStorageSyncIds(), Collections.singletonList(StorageId.forAccount(self.getStorageServiceId())), DatabaseFactory.getStorageKeyDatabase(context).getAllKeys()); } private static @NonNull List buildLocalStorageRecords(@NonNull Context context, @NonNull List ids, @NonNull Set archivedRecipients) { + Recipient self = Recipient.self().fresh(); RecipientDatabase recipientDatabase = DatabaseFactory.getRecipientDatabase(context); StorageKeyDatabase storageKeyDatabase = DatabaseFactory.getStorageKeyDatabase(context); @@ -281,7 +283,10 @@ public class StorageSyncJob extends BaseJob { } break; case ManifestRecord.Identifier.Type.ACCOUNT_VALUE: - records.add(StorageSyncHelper.buildAccountRecord(context, id)); + if (!Arrays.equals(self.getStorageServiceId(), id.getRaw())) { + throw new AssertionError("Local storage ID doesn't match self!"); + } + records.add(StorageSyncHelper.buildAccountRecord(context, self)); break; default: SignalStorageRecord unknown = storageKeyDatabase.getById(id.getRaw()); 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 94347322ff..23cf903d67 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -340,23 +340,23 @@ public final class StorageSyncHelper { return !OptionalUtil.byteArrayEquals(update.getOld().getProfileKey(), update.getNew().getProfileKey()); } - public static Optional getPendingAccountSyncUpdate(@NonNull Context context) { - if (DatabaseFactory.getRecipientDatabase(context).getDirtyState(Recipient.self().getId()) != RecipientDatabase.DirtyState.UPDATE) { + public static Optional getPendingAccountSyncUpdate(@NonNull Context context, @NonNull Recipient self) { + if (DatabaseFactory.getRecipientDatabase(context).getDirtyState(self.getId()) != RecipientDatabase.DirtyState.UPDATE) { return Optional.absent(); } - return Optional.of(buildAccountRecord(context, null).getAccount().get()); + return Optional.of(buildAccountRecord(context, self).getAccount().get()); } - public static Optional getPendingAccountSyncInsert(@NonNull Context context) { - if (DatabaseFactory.getRecipientDatabase(context).getDirtyState(Recipient.self().getId()) != RecipientDatabase.DirtyState.INSERT) { + public static Optional getPendingAccountSyncInsert(@NonNull Context context, @NonNull Recipient self) { + if (DatabaseFactory.getRecipientDatabase(context).getDirtyState(self.getId()) != RecipientDatabase.DirtyState.INSERT) { return Optional.absent(); } - return Optional.of(buildAccountRecord(context, null).getAccount().get()); + return Optional.of(buildAccountRecord(context, self).getAccount().get()); } - public static SignalStorageRecord buildAccountRecord(@NonNull Context context, @Nullable StorageId id) { - Recipient self = Recipient.self().fresh(); - SignalAccountRecord account = new SignalAccountRecord.Builder(id != null ? id.getRaw() : self.getStorageServiceId()) + public static SignalStorageRecord buildAccountRecord(@NonNull Context context, @NonNull Recipient self) { + + SignalAccountRecord account = new SignalAccountRecord.Builder(self.getStorageServiceId()) .setProfileKey(self.getProfileKey()) .setGivenName(self.getProfileName().getGivenName()) .setFamilyName(self.getProfileName().getFamilyName())