summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2022-03-29 13:45:45 +0200
committerAndrej Mihajlov <and@mullvad.net>2022-04-05 09:12:56 +0200
commite92e30a56b85a6e38f75c20ab286096c96166b31 (patch)
tree6a64614a583ef16242c0e1c6fca45d9f4fe9a0a3
parent67a3c6ac5a6073f73434b77550453a198637fc6e (diff)
downloadmullvadvpn-e92e30a56b85a6e38f75c20ab286096c96166b31.tar.xz
mullvadvpn-e92e30a56b85a6e38f75c20ab286096c96166b31.zip
Extract SendAppStoreReceiptOperation
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj4
-rw-r--r--ios/MullvadVPN/AppStorePaymentManager/AppStorePaymentManager.swift76
-rw-r--r--ios/MullvadVPN/AppStorePaymentManager/SendAppStoreReceiptOperation.swift86
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)
+ }
+ }
+ }
+}