From 47423fbed067f0c1723ae3e354656d53dc495346 Mon Sep 17 00:00:00 2001 From: Nora Trapp Date: Tue, 30 Nov 2021 12:54:24 -0800 Subject: [PATCH] Allow payments to be enabled if it was previously enabled remotely --- .../Payments/PaymentsHelperImpl.swift | 19 +++++++++++++------ .../StorageServiceProto+Sync.swift | 2 +- .../src/Payments/PaymentsHelper.swift | 4 ++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/SignalMessaging/Payments/PaymentsHelperImpl.swift b/SignalMessaging/Payments/PaymentsHelperImpl.swift index 0f256a673f..bc67b009c9 100644 --- a/SignalMessaging/Payments/PaymentsHelperImpl.swift +++ b/SignalMessaging/Payments/PaymentsHelperImpl.swift @@ -135,7 +135,7 @@ public class PaymentsHelperImpl: NSObject, PaymentsHelperSwift { paymentsEntropy: newPaymentsEntropy) owsAssertDebug(paymentsState.isEnabled) setPaymentsState(paymentsState, - updateStorageService: true, + originatedLocally: true, transaction: transaction) owsAssertDebug(arePaymentsEnabled) return true @@ -145,7 +145,7 @@ public class PaymentsHelperImpl: NSObject, PaymentsHelperSwift { switch paymentsState { case .enabled(let paymentsEntropy): setPaymentsState(.disabledWithPaymentsEntropy(paymentsEntropy: paymentsEntropy), - updateStorageService: true, + originatedLocally: true, transaction: transaction) case .disabled, .disabledWithPaymentsEntropy: owsFailDebug("Payments already disabled.") @@ -154,12 +154,18 @@ public class PaymentsHelperImpl: NSObject, PaymentsHelperSwift { } public func setPaymentsState(_ newPaymentsState: PaymentsState, - updateStorageService: Bool, + originatedLocally: Bool, transaction: SDSAnyWriteTransaction) { let oldPaymentsState = self.paymentsState var newPaymentsState = newPaymentsState - if newPaymentsState.isEnabled && !self.canEnablePayments { + // If payments was enabled remotely (e.g. on another device or previous install) we want + // to enable it even if the current device no longer supports enabling payments. This will + // behave as if the payments kill switch is turned on until the user is on a payments enabled + // install, but preserve their access to payments in the UI. + let canEnablePaymentsLocallyOrRemotely = self.canEnablePayments || !originatedLocally + + if newPaymentsState.isEnabled && !canEnablePaymentsLocallyOrRemotely { // If we cannot enable payments, ensure that any new entropy is always preserved. if let paymentsEntropy = newPaymentsState.paymentsEntropy { newPaymentsState = .disabledWithPaymentsEntropy(paymentsEntropy: paymentsEntropy) @@ -167,6 +173,7 @@ public class PaymentsHelperImpl: NSObject, PaymentsHelperSwift { newPaymentsState = .disabled } } + guard newPaymentsState != oldPaymentsState else { Logger.verbose("Ignoring redundant change.") return @@ -196,9 +203,9 @@ public class PaymentsHelperImpl: NSObject, PaymentsHelperSwift { Self.paymentsEvents.paymentsStateDidChange() - if updateStorageService { + if originatedLocally { // We only need to re-upload the profile if the change originated - // locally, i.e. if updateStorageService is true. + // locally. Logger.info("Re-uploading local profile due to payments state change.") Self.profileManager.reuploadLocalProfile() diff --git a/SignalMessaging/Storage Service/StorageServiceProto+Sync.swift b/SignalMessaging/Storage Service/StorageServiceProto+Sync.swift index 925171a0d2..c1a85ca64d 100644 --- a/SignalMessaging/Storage Service/StorageServiceProto+Sync.swift +++ b/SignalMessaging/Storage Service/StorageServiceProto+Sync.swift @@ -735,7 +735,7 @@ extension StorageServiceProtoAccountRecord: Dependencies { paymentsEntropy: paymentsEntropy) Self.paymentsHelperSwift.setPaymentsState(mergedPaymentsState, - updateStorageService: false, + originatedLocally: false, transaction: transaction) } diff --git a/SignalServiceKit/src/Payments/PaymentsHelper.swift b/SignalServiceKit/src/Payments/PaymentsHelper.swift index 04fb6a530f..4ba08b5b4e 100644 --- a/SignalServiceKit/src/Payments/PaymentsHelper.swift +++ b/SignalServiceKit/src/Payments/PaymentsHelper.swift @@ -70,7 +70,7 @@ public protocol PaymentsHelperSwift: PaymentsHelper { var paymentsState: PaymentsState { get } func setPaymentsState(_ value: PaymentsState, - updateStorageService: Bool, + originatedLocally: Bool, transaction: SDSAnyWriteTransaction) func clearState(transaction: SDSAnyWriteTransaction) } @@ -182,7 +182,7 @@ extension MockPaymentsHelper: PaymentsHelperSwift { public var paymentsState: PaymentsState { .disabled } public func setPaymentsState(_ value: PaymentsState, - updateStorageService: Bool, + originatedLocally: Bool, transaction: SDSAnyWriteTransaction) { owsFail("Not implemented.") }