From 086dd5188c4ff73a7f85994fbe767d57c1412c81 Mon Sep 17 00:00:00 2001 From: Jamil Date: Mon, 30 Dec 2024 09:12:05 -0800 Subject: [PATCH] chore(apple): Resolve all Swift compile warnings (#7602) Fixes various warnings Xcode that have cropped up in the 1.4.0 refactor and recent feature additions. --- .../FirezoneKit/Extensions/NEVPNStatus.swift | 2 +- .../FirezoneKit/Keychain/Keychain.swift | 114 ++++++++---------- .../Sources/FirezoneKit/Stores/Store.swift | 2 +- .../Sources/FirezoneKit/Views/AppView.swift | 4 +- .../apple/FirezoneNetworkExtension/Info.plist | 7 -- .../PacketTunnelProvider.swift | 7 +- 6 files changed, 59 insertions(+), 77 deletions(-) diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Extensions/NEVPNStatus.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Extensions/NEVPNStatus.swift index 7c9775753..2553c5e71 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Extensions/NEVPNStatus.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Extensions/NEVPNStatus.swift @@ -8,7 +8,7 @@ import NetworkExtension /// Make NEVPNStatus convertible to a string -extension NEVPNStatus: CustomStringConvertible { +extension NEVPNStatus: @retroactive CustomStringConvertible { public var description: String { switch self { case .disconnected: return "Disconnected" diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Keychain/Keychain.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Keychain/Keychain.swift index 6a4f89bd1..e2b1c75d7 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Keychain/Keychain.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Keychain/Keychain.swift @@ -19,7 +19,6 @@ public enum KeychainError: Error { public actor Keychain { public static let shared = Keychain() - private let workQueue = DispatchQueue(label: "FirezoneKeychainWorkQueue") public typealias PersistentRef = Data @@ -43,19 +42,17 @@ public actor Keychain { public init() {} public func add(query: [CFString: Any]) async throws { - return try await withCheckedThrowingContinuation { [weak self] continuation in - self?.workQueue.async { - var ref: CFTypeRef? - let ret = SecStatus(SecItemAdd(query as CFDictionary, &ref)) - guard ret.isSuccess else { - continuation.resume( - throwing: KeychainError.appleSecError(call: "SecItemAdd", status: ret)) - return - } - - continuation.resume() + return try await withCheckedThrowingContinuation { continuation in + var ref: CFTypeRef? + let ret = SecStatus(SecItemAdd(query as CFDictionary, &ref)) + guard ret.isSuccess else { + continuation.resume( + throwing: KeychainError.appleSecError(call: "SecItemAdd", status: ret)) return } + + continuation.resume() + return } } @@ -63,75 +60,66 @@ public actor Keychain { query: [CFString: Any], attributesToUpdate: [CFString: Any] ) async throws { - return try await withCheckedThrowingContinuation { [weak self] continuation in - self?.workQueue.async { - let ret = SecStatus( - SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)) - guard ret.isSuccess else { - continuation.resume( - throwing: KeychainError.appleSecError(call: "SecItemUpdate", status: ret)) - return - } - continuation.resume() + return try await withCheckedThrowingContinuation { continuation in + let ret = SecStatus( + SecItemUpdate(query as CFDictionary, attributesToUpdate as CFDictionary)) + guard ret.isSuccess else { + continuation.resume( + throwing: KeychainError.appleSecError(call: "SecItemUpdate", status: ret)) + return } + continuation.resume() } } public func load(persistentRef: PersistentRef) async -> Data? { - return await withCheckedContinuation { [weak self] continuation in - self?.workQueue.async { - let query = - [ - kSecClass: kSecClassGenericPassword, - kSecValuePersistentRef: persistentRef, - kSecReturnData: true, - ] as [CFString: Any] - var result: CFTypeRef? - let ret = SecStatus(SecItemCopyMatching(query as CFDictionary, &result)) - if ret.isSuccess, - let resultData = result as? Data - { - continuation.resume(returning: resultData) - } else { - continuation.resume(returning: nil) - } + return await withCheckedContinuation { continuation in + let query = + [ + kSecClass: kSecClassGenericPassword, + kSecValuePersistentRef: persistentRef, + kSecReturnData: true, + ] as [CFString: Any] + var result: CFTypeRef? + let ret = SecStatus(SecItemCopyMatching(query as CFDictionary, &result)) + if ret.isSuccess, + let resultData = result as? Data + { + continuation.resume(returning: resultData) + } else { + continuation.resume(returning: nil) } } } public func search(query: [CFString: Any]) async -> PersistentRef? { - return await withCheckedContinuation { [weak self] continuation in - guard let self = self else { return } - self.workQueue.async { - let query = query.merging([ - kSecClass: kSecClassGenericPassword, - kSecReturnPersistentRef: true, - ]) { (current, new) in new } + return await withCheckedContinuation { continuation in + let query = query.merging([ + kSecClass: kSecClassGenericPassword, + kSecReturnPersistentRef: true, + ]) { (current, new) in new } - var result: CFTypeRef? - let ret = SecStatus(SecItemCopyMatching(query as CFDictionary, &result)) + var result: CFTypeRef? + let ret = SecStatus(SecItemCopyMatching(query as CFDictionary, &result)) - if ret.isSuccess, let persistentRef = result as? Data { - continuation.resume(returning: persistentRef) - } else { - continuation.resume(returning: nil) - } + if ret.isSuccess, let persistentRef = result as? Data { + continuation.resume(returning: persistentRef) + } else { + continuation.resume(returning: nil) } } } public func delete(persistentRef: PersistentRef) async throws { - return try await withCheckedThrowingContinuation { [weak self] continuation in - self?.workQueue.async { - let query = [kSecValuePersistentRef: persistentRef] as [CFString: Any] - let ret = SecStatus(SecItemDelete(query as CFDictionary)) - guard ret.isSuccess || ret == .status(.itemNotFound) else { - continuation.resume( - throwing: KeychainError.appleSecError(call: "SecItemDelete", status: ret)) - return - } - continuation.resume(returning: ()) + return try await withCheckedThrowingContinuation { continuation in + let query = [kSecValuePersistentRef: persistentRef] as [CFString: Any] + let ret = SecStatus(SecItemDelete(query as CFDictionary)) + guard ret.isSuccess || ret == .status(.itemNotFound) else { + continuation.resume( + throwing: KeychainError.appleSecError(call: "SecItemDelete", status: ret)) + return } + continuation.resume(returning: ()) } } diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift index 78c337a17..2d2228ba4 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Stores/Store.swift @@ -146,7 +146,7 @@ public final class Store: ObservableObject { TunnelManager.shared.fetchResources(callback: callback) let intervalInSeconds: TimeInterval = 1 let timer = Timer(timeInterval: intervalInSeconds, repeats: true) { [weak self] _ in - guard let self = self else { return } + guard self != nil else { return } TunnelManager.shared.fetchResources(callback: callback) } RunLoop.main.add(timer, forMode: .common) diff --git a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/AppView.swift b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/AppView.swift index 77ddf8720..27b4fe003 100644 --- a/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/AppView.swift +++ b/swift/apple/FirezoneKit/Sources/FirezoneKit/Views/AppView.swift @@ -116,7 +116,7 @@ public extension AppViewModel { public var externalEventMatchString: String { rawValue } public var externalEventOpenURL: URL { URL(string: "firezone://\(rawValue)")! } - public func openWindow() { + @MainActor public func openWindow() { if let window = NSApp.windows.first(where: { $0.identifier?.rawValue.hasPrefix(identifier) ?? false }) { @@ -129,7 +129,7 @@ public extension AppViewModel { } } - public func window() -> NSWindow? { + @MainActor public func window() -> NSWindow? { NSApp.windows.first { window in if let windowId = window.identifier?.rawValue { return windowId.hasPrefix(self.identifier) diff --git a/swift/apple/FirezoneNetworkExtension/Info.plist b/swift/apple/FirezoneNetworkExtension/Info.plist index 9227ee6ee..64becf88f 100644 --- a/swift/apple/FirezoneNetworkExtension/Info.plist +++ b/swift/apple/FirezoneNetworkExtension/Info.plist @@ -2,13 +2,6 @@ - NSExtension - - NSExtensionPointIdentifier - com.apple.networkextension.packet-tunnel - NSExtensionPrincipalClass - $(PRODUCT_MODULE_NAME).PacketTunnelProvider - AppGroupIdentifier $(APP_GROUP_ID) NetworkExtension diff --git a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift index 39f290a21..5443cf88a 100644 --- a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift +++ b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift @@ -40,8 +40,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { // initialize the id here too. try await FirezoneId.createIfMissing() - var passedToken = options?["token"] as? String - var keychainToken = try await Token.load() + let passedToken = options?["token"] as? String + let keychainToken = try await Token.load() // Use the provided token or try loading one from the Keychain guard let token = Token(passedToken) ?? keychainToken @@ -275,7 +275,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } -extension NEProviderStopReason: CustomStringConvertible { +extension NEProviderStopReason: @retroactive CustomStringConvertible { public var description: String { switch self { case .none: return "None" @@ -295,6 +295,7 @@ extension NEProviderStopReason: CustomStringConvertible { case .connectionFailed: return "Connection failed" case .sleep: return "Sleep" case .appUpdate: return "App update" + case .internalError: return "Internal error" @unknown default: return "Unknown" } }