diff --git a/SignalServiceKit/ChangePhoneNumber/LegacyChangePhoneNumber.swift b/SignalServiceKit/ChangePhoneNumber/LegacyChangePhoneNumber.swift index dcba8cb566..10654e85fa 100644 --- a/SignalServiceKit/ChangePhoneNumber/LegacyChangePhoneNumber.swift +++ b/SignalServiceKit/ChangePhoneNumber/LegacyChangePhoneNumber.swift @@ -241,8 +241,8 @@ public class LegacyChangePhoneNumber: NSObject { let recipientMerger = DependenciesBridge.shared.recipientMerger let localRecipient = recipientMerger.applyMergeForLocalAccount( aci: serviceAci, - pni: servicePni, phoneNumber: serviceE164, + pni: servicePni, tx: transaction.asV2Write ) localRecipient.markAsRegisteredAndSave(tx: transaction) diff --git a/SignalServiceKit/src/Account/TSAccountManager.swift b/SignalServiceKit/src/Account/TSAccountManager.swift index 7a5f9df3a5..eebac91a86 100644 --- a/SignalServiceKit/src/Account/TSAccountManager.swift +++ b/SignalServiceKit/src/Account/TSAccountManager.swift @@ -303,8 +303,8 @@ public extension TSAccountManager { let localRecipient = DependenciesBridge.shared.recipientMerger.applyMergeForLocalAccount( aci: newAci.wrappedAciValue, - pni: newPni?.wrappedPniValue, phoneNumber: newLocalNumber.wrappedValue, + pni: newPni?.wrappedPniValue, tx: transaction.asV2Write ) localRecipient.markAsRegisteredAndSave(tx: transaction) diff --git a/SignalServiceKit/src/Contacts/RecipientMerger.swift b/SignalServiceKit/src/Contacts/RecipientMerger.swift index 4b04a9d9e0..7f211b96f7 100644 --- a/SignalServiceKit/src/Contacts/RecipientMerger.swift +++ b/SignalServiceKit/src/Contacts/RecipientMerger.swift @@ -12,8 +12,8 @@ public protocol RecipientMerger { /// time we're allowed to "merge" the identifiers for our own account. func applyMergeForLocalAccount( aci: Aci, - pni: Pni?, phoneNumber: E164, + pni: Pni?, tx: DBWriteTransaction ) -> SignalRecipient @@ -160,8 +160,8 @@ class RecipientMergerImpl: RecipientMerger { func applyMergeForLocalAccount( aci: Aci, - pni: Pni?, phoneNumber: E164, + pni: Pni?, tx: DBWriteTransaction ) -> SignalRecipient { return mergeAlways(aci: aci, phoneNumber: phoneNumber, isLocalRecipient: true, tx: tx) diff --git a/SignalServiceKit/src/Contacts/SignalServiceAddress.swift b/SignalServiceKit/src/Contacts/SignalServiceAddress.swift index 32b184af27..35e928f58c 100644 --- a/SignalServiceKit/src/Contacts/SignalServiceAddress.swift +++ b/SignalServiceKit/src/Contacts/SignalServiceAddress.swift @@ -493,19 +493,6 @@ public class SignalServiceAddressCache: NSObject { owsAssertDebug(GRDBSchemaMigrator.areMigrationsComplete) databaseStorage.read { transaction in - if let localIdentifiers = tsAccountManager.localIdentifiers(transaction: transaction) { - updateRecipient( - aci: localIdentifiers.aci, - // PNI TODO: Fetch our own PNI once it's stored on our SignalRecipient. - // - // (Even though our own PNI may be available at this point, we should have - // a recipient for ourselves, so we'd immediately overwrite it during the - // `anyEnumerate` below.) - pni: nil, - phoneNumber: localIdentifiers.phoneNumber - ) - } - SignalRecipient.anyEnumerate(transaction: transaction) { recipient, _ in self.updateRecipient(recipient) } diff --git a/SignalServiceKit/src/SSKEnvironment.swift b/SignalServiceKit/src/SSKEnvironment.swift index ec5feb1790..0da0663f48 100644 --- a/SignalServiceKit/src/SSKEnvironment.swift +++ b/SignalServiceKit/src/SSKEnvironment.swift @@ -229,6 +229,7 @@ public class SSKEnvironment: NSObject { } warmCachesForObject("signalProxy", SignalProxy.warmCaches) warmCachesForObject("tsAccountManager", tsAccountManager.warmCaches) + warmCachesForObject("fixLocalRecipient", fixLocalRecipientIfNeeded) warmCachesForObject("signalServiceAddressCache", signalServiceAddressCache.warmCaches) warmCachesForObject("signalService", signalService.warmCaches) warmCachesForObject("remoteConfigManager", remoteConfigManager.warmCaches) @@ -251,6 +252,29 @@ public class SSKEnvironment: NSObject { NotificationCenter.default.post(name: SSKEnvironment.warmCachesNotification, object: nil) } + /// Ensures the local SignalRecipient is correct. + /// + /// This primarily serves to ensure the local SignalRecipient has its own + /// Pni (a one-time migration), but it also helps ensure that the value is + /// always consistent with TSAccountManager's values. + private func fixLocalRecipientIfNeeded() { + databaseStorage.write { tx in + guard let localIdentifiers = tsAccountManager.localIdentifiers(transaction: tx) else { + return // Not registered yet. + } + guard let phoneNumber = E164(localIdentifiers.phoneNumber) else { + return // Registered with an invalid phone number. + } + let recipientMerger = DependenciesBridge.shared.recipientMerger + _ = recipientMerger.applyMergeForLocalAccount( + aci: localIdentifiers.aci, + phoneNumber: phoneNumber, + pni: localIdentifiers.pni, + tx: tx.asV2Write + ) + } + } + #if TESTABLE_BUILD public func setContactsManagerForUnitTests(_ contactsManager: ContactsManagerProtocol) {