diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2022-03-29 13:45:45 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2022-04-05 09:12:56 +0200 |
| commit | e92e30a56b85a6e38f75c20ab286096c96166b31 (patch) | |
| tree | 6a64614a583ef16242c0e1c6fca45d9f4fe9a0a3 | |
| parent | 67a3c6ac5a6073f73434b77550453a198637fc6e (diff) | |
| download | mullvadvpn-e92e30a56b85a6e38f75c20ab286096c96166b31.tar.xz mullvadvpn-e92e30a56b85a6e38f75c20ab286096c96166b31.zip | |
Extract SendAppStoreReceiptOperation
3 files changed, 90 insertions, 76 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index 65cf355107..a030a5546b 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -135,6 +135,7 @@ 585DA8A326B14E0D00B8C587 /* ServerRelaysResponse.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA88326B0270700B8C587 /* ServerRelaysResponse.swift */; }; 585DA8A526B14EE000B8C587 /* PacketTunnelStatus.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585DA89826B0329200B8C587 /* PacketTunnelStatus.swift */; }; 585DA8A626B14F5100B8C587 /* SSLPinningURLSessionDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 584789DF26529D72000E45FB /* SSLPinningURLSessionDelegate.swift */; }; + 585E820327F3285E00939F0E /* SendAppStoreReceiptOperation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 585E820227F3285E00939F0E /* SendAppStoreReceiptOperation.swift */; }; 5862805422428EF100F5A6E1 /* TranslucentButtonBlurView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5862805322428EF100F5A6E1 /* TranslucentButtonBlurView.swift */; }; 58655DCE27DA0A5D00911834 /* TunnelMonitorConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58655DCD27DA0A5D00911834 /* TunnelMonitorConfiguration.swift */; }; 58655DCF27DA0A5D00911834 /* TunnelMonitorConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58655DCD27DA0A5D00911834 /* TunnelMonitorConfiguration.swift */; }; @@ -424,6 +425,7 @@ 585DA89226B0323E00B8C587 /* TunnelIPCRequest.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelIPCRequest.swift; sourceTree = "<group>"; }; 585DA89526B0328000B8C587 /* TunnelIPCResponse.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelIPCResponse.swift; sourceTree = "<group>"; }; 585DA89826B0329200B8C587 /* PacketTunnelStatus.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelStatus.swift; sourceTree = "<group>"; }; + 585E820227F3285E00939F0E /* SendAppStoreReceiptOperation.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SendAppStoreReceiptOperation.swift; sourceTree = "<group>"; }; 5862805322428EF100F5A6E1 /* TranslucentButtonBlurView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TranslucentButtonBlurView.swift; sourceTree = "<group>"; }; 58655DCD27DA0A5D00911834 /* TunnelMonitorConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TunnelMonitorConfiguration.swift; sourceTree = "<group>"; }; 5866F39B2243B82D00168AE5 /* MullvadVPN.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = MullvadVPN.entitlements; sourceTree = "<group>"; }; @@ -715,6 +717,7 @@ 58FB865426E8BF3100F188BC /* AppStorePaymentManagerError.swift */, 5846227226E22A160035F7C2 /* AppStorePaymentObserver.swift */, 5846227026E229F20035F7C2 /* AppStoreSubscription.swift */, + 585E820227F3285E00939F0E /* SendAppStoreReceiptOperation.swift */, ); path = AppStorePaymentManager; sourceTree = "<group>"; @@ -1367,6 +1370,7 @@ 58781CC922AE7CA8009B9D8E /* RelayConstraints.swift in Sources */, 584E96BC240FD4DA00D3334F /* Location.swift in Sources */, 581503A124D6F01F00C9C50E /* LogRotation.swift in Sources */, + 585E820327F3285E00939F0E /* SendAppStoreReceiptOperation.swift in Sources */, 584B17AB27637DE40057F3B8 /* ReloadTunnelOperation.swift in Sources */, 5820676426E771DB00655B05 /* TunnelManagerError.swift in Sources */, 585B4B8726D9098900555C4C /* TunnelErrorNotificationProvider.swift in Sources */, diff --git a/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift b/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift index fab80ea9de..7bdc1ce106 100644 --- a/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift +++ b/ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift @@ -295,79 +295,3 @@ class AppStorePaymentManager: NSObject, SKPaymentTransactionObserver { } } - -private class SendAppStoreReceiptOperation: ResultOperation<REST.CreateApplePaymentResponse, AppStorePaymentManager.Error> { - private let restClient: REST.Client - private let accountToken: String - private let forceRefresh: Bool - private let receiptProperties: [String: Any]? - private var fetchReceiptTask: Cancellable? - private var submitReceiptTask: Cancellable? - - private let logger = Logger(label: "AppStorePaymentManager.SendAppStoreReceiptOperation") - - init(restClient: REST.Client, accountToken: String, forceRefresh: Bool, receiptProperties: [String: Any]?, completionHandler: @escaping CompletionHandler) { - self.restClient = restClient - self.accountToken = accountToken - self.forceRefresh = forceRefresh - self.receiptProperties = receiptProperties - - super.init(completionQueue: .main, completionHandler: completionHandler) - } - - override func cancel() { - super.cancel() - - DispatchQueue.main.async { - self.fetchReceiptTask?.cancel() - self.fetchReceiptTask = nil - - self.submitReceiptTask?.cancel() - self.submitReceiptTask = nil - } - } - - override func main() { - DispatchQueue.main.async { - guard !self.isCancelled else { - self.finish(completion: .cancelled) - return - } - - self.fetchReceiptTask = AppStoreReceipt.fetch(forceRefresh: self.forceRefresh, receiptProperties: self.receiptProperties) { completion in - switch completion { - case .success(let receiptData): - self.sendReceipt(receiptData) - - case .failure(let error): - self.logger.error(chainedError: error, message: "Failed to fetch the AppStore receipt.") - self.finish(completion: .failure(.readReceipt(error))) - - case .cancelled: - self.finish(completion: .cancelled) - } - } - } - } - - private func sendReceipt(_ receiptData: Data) { - submitReceiptTask = restClient.createApplePayment( - token: self.accountToken, - receiptString: receiptData, - retryStrategy: .noRetry) { result in - switch result { - case .success(let response): - self.logger.info("AppStore receipt was processed. Time added: \(response.timeAdded), New expiry: \(response.newExpiry.logFormatDate())") - self.finish(completion: .success(response)) - - case .failure(let error): - self.logger.error(chainedError: error, message: "Failed to send the AppStore receipt.") - self.finish(completion: .failure(.sendReceipt(error))) - - case .cancelled: - self.logger.debug("Receipt submission cancelled.") - self.finish(completion: .cancelled) - } - } - } -} diff --git a/ios/MullvadVPN/AppStorePaymentManager/SendAppStoreReceiptOperation.swift b/ios/MullvadVPN/AppStorePaymentManager/SendAppStoreReceiptOperation.swift new file mode 100644 index 0000000000..69ddf4459c --- /dev/null +++ b/ios/MullvadVPN/AppStorePaymentManager/SendAppStoreReceiptOperation.swift @@ -0,0 +1,86 @@ +// +// SendAppStoreReceiptOperation.swift +// MullvadVPN +// +// Created by pronebird on 29/03/2022. +// Copyright © 2022 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import Logging + +class SendAppStoreReceiptOperation: ResultOperation<REST.CreateApplePaymentResponse, AppStorePaymentManager.Error> { + private let restClient: REST.Client + private let accountToken: String + private let forceRefresh: Bool + private let receiptProperties: [String: Any]? + private var fetchReceiptTask: Cancellable? + private var submitReceiptTask: Cancellable? + + private let logger = Logger(label: "AppStorePaymentManager.SendAppStoreReceiptOperation") + + init(restClient: REST.Client, accountToken: String, forceRefresh: Bool, receiptProperties: [String: Any]?, completionHandler: @escaping CompletionHandler) { + self.restClient = restClient + self.accountToken = accountToken + self.forceRefresh = forceRefresh + self.receiptProperties = receiptProperties + + super.init(completionQueue: .main, completionHandler: completionHandler) + } + + override func cancel() { + super.cancel() + + DispatchQueue.main.async { + self.fetchReceiptTask?.cancel() + self.fetchReceiptTask = nil + + self.submitReceiptTask?.cancel() + self.submitReceiptTask = nil + } + } + + override func main() { + DispatchQueue.main.async { + guard !self.isCancelled else { + self.finish(completion: .cancelled) + return + } + + self.fetchReceiptTask = AppStoreReceipt.fetch(forceRefresh: self.forceRefresh, receiptProperties: self.receiptProperties) { completion in + switch completion { + case .success(let receiptData): + self.sendReceipt(receiptData) + + case .failure(let error): + self.logger.error(chainedError: error, message: "Failed to fetch the AppStore receipt.") + self.finish(completion: .failure(.readReceipt(error))) + + case .cancelled: + self.finish(completion: .cancelled) + } + } + } + } + + private func sendReceipt(_ receiptData: Data) { + submitReceiptTask = restClient.createApplePayment( + token: self.accountToken, + receiptString: receiptData, + retryStrategy: .noRetry) { result in + switch result { + case .success(let response): + self.logger.info("AppStore receipt was processed. Time added: \(response.timeAdded), New expiry: \(response.newExpiry.logFormatDate())") + self.finish(completion: .success(response)) + + case .failure(let error): + self.logger.error(chainedError: error, message: "Failed to send the AppStore receipt.") + self.finish(completion: .failure(.sendReceipt(error))) + + case .cancelled: + self.logger.debug("Receipt submission cancelled.") + self.finish(completion: .cancelled) + } + } + } +} |
