summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2023-08-18 11:56:09 +0200
committerAndrej Mihajlov <and@mullvad.net>2023-08-18 11:56:09 +0200
commit163391e558a896367d128aa0e3c26b8026e55575 (patch)
tree2b551851a38f06e4c384b943443cfa33a21ce32f
parent615ca2a8040c31a68c33fe0de59d142d4fbc3504 (diff)
parent2c205d7ce66160a061defc820aa47cbed6eeb217 (diff)
downloadmullvadvpn-163391e558a896367d128aa0e3c26b8026e55575.tar.xz
mullvadvpn-163391e558a896367d128aa0e3c26b8026e55575.zip
Merge branch 'refactor-start-options-parsing'
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj4
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift54
-rw-r--r--ios/PacketTunnel/StartOptions.swift48
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"
+ }
+ }
+}