diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2023-08-16 14:09:11 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2023-08-17 15:12:20 +0200 |
| commit | 2c205d7ce66160a061defc820aa47cbed6eeb217 (patch) | |
| tree | 2b551851a38f06e4c384b943443cfa33a21ce32f | |
| parent | 615ca2a8040c31a68c33fe0de59d142d4fbc3504 (diff) | |
| download | mullvadvpn-2c205d7ce66160a061defc820aa47cbed6eeb217.tar.xz mullvadvpn-2c205d7ce66160a061defc820aa47cbed6eeb217.zip | |
PacketTunnel: refactor parsing of start options
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 4 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider.swift | 54 | ||||
| -rw-r--r-- | ios/PacketTunnel/StartOptions.swift | 48 |
3 files changed, 74 insertions, 32 deletions
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj index f905c92b0c..b018f4102e 100644 --- a/ios/MullvadVPN.xcodeproj/project.pbxproj +++ b/ios/MullvadVPN.xcodeproj/project.pbxproj @@ -378,6 +378,7 @@ 58E511E828DDDF2400B0BCDE /* CodingErrors+CustomErrorDescription.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58E511E528DDDEAC00B0BCDE /* CodingErrors+CustomErrorDescription.swift */; }; 58EC067A2A8D208D00BEB973 /* MockTunnelDeviceInfo.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EC06792A8D208D00BEB973 /* MockTunnelDeviceInfo.swift */; }; 58EC067C2A8D2A0B00BEB973 /* NetworkCounters.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EC067B2A8D2A0B00BEB973 /* NetworkCounters.swift */; }; + 58ED3A142A7C199C0085CE65 /* StartOptions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58ED3A132A7C199C0085CE65 /* StartOptions.swift */; }; 58EE2E3A272FF814003BFF93 /* SettingsDataSource.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EE2E38272FF814003BFF93 /* SettingsDataSource.swift */; }; 58EE2E3B272FF814003BFF93 /* SettingsDataSourceDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EE2E39272FF814003BFF93 /* SettingsDataSourceDelegate.swift */; }; 58EF580B25D69D7A00AEBA94 /* ProblemReportSubmissionOverlayView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58EF580A25D69D7A00AEBA94 /* ProblemReportSubmissionOverlayView.swift */; }; @@ -1235,6 +1236,7 @@ 58EC06792A8D208D00BEB973 /* MockTunnelDeviceInfo.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTunnelDeviceInfo.swift; sourceTree = "<group>"; }; 58EC067B2A8D2A0B00BEB973 /* NetworkCounters.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NetworkCounters.swift; sourceTree = "<group>"; }; 58ECD29123F178FD004298B6 /* Screenshots.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Screenshots.xcconfig; sourceTree = "<group>"; }; + 58ED3A132A7C199C0085CE65 /* StartOptions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = StartOptions.swift; sourceTree = "<group>"; }; 58EE2E38272FF814003BFF93 /* SettingsDataSource.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsDataSource.swift; sourceTree = "<group>"; }; 58EE2E39272FF814003BFF93 /* SettingsDataSourceDelegate.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SettingsDataSourceDelegate.swift; sourceTree = "<group>"; }; 58EF580A25D69D7A00AEBA94 /* ProblemReportSubmissionOverlayView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ProblemReportSubmissionOverlayView.swift; sourceTree = "<group>"; }; @@ -2318,6 +2320,7 @@ 58E0729C28814AAE008902F8 /* PacketTunnelConfiguration.swift */, 58CE5E7B224146470008646E /* PacketTunnelProvider.swift */, 58E072A028814B0E008902F8 /* MullvadEndpoint+WgEndpoint.swift */, + 58ED3A132A7C199C0085CE65 /* StartOptions.swift */, 58E07298288031D5008902F8 /* WireGuardAdapterError+Localization.swift */, 58E0729E28814ACC008902F8 /* WireGuardLogLevel+Logging.swift */, 58906DDF2445C7A5002F0673 /* NEProviderStopReason+Debug.swift */, @@ -3737,6 +3740,7 @@ 58CE38C728992C8700A6D6E5 /* WireGuardAdapterError+Localization.swift in Sources */, 58E511E828DDDF2400B0BCDE /* CodingErrors+CustomErrorDescription.swift in Sources */, 58FDF2D92A0BA11A00C2B061 /* DeviceCheckOperation.swift in Sources */, + 58ED3A142A7C199C0085CE65 /* StartOptions.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift index 5b7bdd3013..11bde83717 100644 --- a/ios/PacketTunnel/PacketTunnelProvider.swift +++ b/ios/PacketTunnel/PacketTunnelProvider.swift @@ -191,41 +191,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider { override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) { dispatchQueue.async { - let tunnelOptions = PacketTunnelOptions(rawOptions: options ?? [:]) - var appSelectorResult: RelaySelectorResult? - // Parse relay selector from tunnel options. - do { - appSelectorResult = try tunnelOptions.getSelectorResult() - - switch appSelectorResult { - case let .some(selectorResult): - self.providerLogger.debug( - "Start the tunnel via app, connect to \(selectorResult.relay.hostname)." - ) - - case .none: - if tunnelOptions.isOnDemand() { - self.providerLogger.debug("Start the tunnel via on-demand rule.") - } else { - self.providerLogger.debug("Start the tunnel via system.") - } - } - } catch { - self.providerLogger.debug("Start the tunnel via app.") - self.providerLogger.error( - error: error, - message: """ - Failed to decode relay selector result passed from the app. \ - Will continue by picking new relay. - """ - ) - } + let parsedOptions = self.parseStartOptions(options ?? [:]) + self.providerLogger.debug("\(parsedOptions.logFormat())") // Read tunnel configuration. let tunnelConfiguration: PacketTunnelConfiguration do { - let initialRelay: NextRelay = appSelectorResult.map { .set($0) } ?? .automatic + let initialRelay: NextRelay = parsedOptions.selectorResult.map { .set($0) } ?? .automatic tunnelConfiguration = try self.makeConfiguration(initialRelay) } catch { @@ -564,8 +537,25 @@ class PacketTunnelProvider: NEPacketTunnelProvider { } } - private func makeConfiguration(_ nextRelay: NextRelay) - throws -> PacketTunnelConfiguration { + private func parseStartOptions(_ options: [String: NSObject]) -> StartOptions { + let tunnelOptions = PacketTunnelOptions(rawOptions: options) + var parsedOptions = StartOptions(launchSource: tunnelOptions.isOnDemand() ? .onDemand : .app) + + do { + if let selectorResult = try tunnelOptions.getSelectorResult() { + parsedOptions.launchSource = .app + parsedOptions.selectorResult = selectorResult + } else { + parsedOptions.launchSource = tunnelOptions.isOnDemand() ? .onDemand : .system + } + } catch { + providerLogger.error(error: error, message: "Failed to decode relay selector result passed from the app.") + } + + return parsedOptions + } + + private func makeConfiguration(_ nextRelay: NextRelay) throws -> PacketTunnelConfiguration { let tunnelSettings = try SettingsManager.readSettings() let selectorResult: RelaySelectorResult diff --git a/ios/PacketTunnel/StartOptions.swift b/ios/PacketTunnel/StartOptions.swift new file mode 100644 index 0000000000..773c2e3430 --- /dev/null +++ b/ios/PacketTunnel/StartOptions.swift @@ -0,0 +1,48 @@ +// +// StartOptions.swift +// PacketTunnel +// +// Created by pronebird on 03/08/2023. +// Copyright © 2023 Mullvad VPN AB. All rights reserved. +// + +import Foundation +import RelaySelector + +/// Packet tunnel start options parsed from dictionary passed to packet tunnel with a call to `startTunnel()`. +struct StartOptions { + var launchSource: LaunchSource + var selectorResult: RelaySelectorResult? + + /// Returns a brief description suitable for output to tunnel provider log. + func logFormat() -> String { + var s = "Start the tunnel via \(launchSource)" + if let selectorResult { + s += ", connect to \(selectorResult.relay.hostname)" + } + s += "." + return s + } +} + +/// The source facility that triggered a launch of packet tunnel extension. +enum LaunchSource: String, CustomStringConvertible { + /// Launched by the main bundle app using network extension framework. + case app + + /// Launched via on-demand rule. + case onDemand + + /// Launched by system, either on boot or via system VPN settings. + case system + + /// Returns a human readable description of launch source. + var description: String { + switch self { + case .app, .system: + return rawValue + case .onDemand: + return "on-demand rule" + } + } +} |
