summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorAndrej Mihajlov <and@mullvad.net>2023-06-09 21:20:24 +0200
committerAndrej Mihajlov <and@mullvad.net>2023-06-09 21:21:03 +0200
commitb77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5 (patch)
treefecf7625cd61fabffa0f9e290822dc95a93626b5
parente528b137273d6f00b1cdf45a809a5fed4a7de87c (diff)
downloadmullvadvpn-b77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5.tar.xz
mullvadvpn-b77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5.zip
Formalize application targets
-rw-r--r--ios/MullvadLogging/Logging.swift21
-rw-r--r--ios/MullvadVPN.xcodeproj/project.pbxproj6
-rw-r--r--ios/MullvadVPN/AppDelegate.swift33
-rw-r--r--ios/MullvadVPN/Supporting Files/Info.plist2
-rw-r--r--ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift3
-rw-r--r--ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift4
-rw-r--r--ios/PacketTunnel/Info.plist2
-rw-r--r--ios/PacketTunnel/PacketTunnelProvider.swift19
-rw-r--r--ios/Shared/ApplicationConfiguration.swift44
-rw-r--r--ios/Shared/ApplicationTarget.swift24
10 files changed, 59 insertions, 99 deletions
diff --git a/ios/MullvadLogging/Logging.swift b/ios/MullvadLogging/Logging.swift
index c56daeed52..a7a19ce7e1 100644
--- a/ios/MullvadLogging/Logging.swift
+++ b/ios/MullvadLogging/Logging.swift
@@ -14,12 +14,6 @@ private enum LoggerOutput {
case osLogOutput(_ subsystem: String)
}
-public struct MissingSharedContainerError: LocalizedError {
- public var errorDescription: String? {
- return "Cannot obtain shared container URL."
- }
-}
-
public struct LoggerBuilder {
private(set) var logRotationErrors: [Error] = []
private var outputs: [LoggerOutput] = []
@@ -29,16 +23,9 @@ public struct LoggerBuilder {
public init() {}
- public mutating func addFileOutput(securityGroupIdentifier: String, basename: String) throws {
- guard let containerURL = FileManager.default.containerURL(
- forSecurityApplicationGroupIdentifier: securityGroupIdentifier
- ) else {
- throw MissingSharedContainerError()
- }
-
- let logsDirectoryURL = containerURL.appendingPathComponent("Logs", isDirectory: true)
- let logFileName = "\(basename).log"
- let logFileURL = logsDirectoryURL.appendingPathComponent(logFileName, isDirectory: false)
+ public mutating func addFileOutput(fileURL: URL) {
+ let logFileName = fileURL.lastPathComponent
+ let logsDirectoryURL = fileURL.deletingLastPathComponent()
try? FileManager.default.createDirectory(
at: logsDirectoryURL,
@@ -52,7 +39,7 @@ public struct LoggerBuilder {
logRotationErrors.append(error)
}
- outputs.append(.fileOutput(LogFileOutputStream(fileURL: logFileURL)))
+ outputs.append(.fileOutput(LogFileOutputStream(fileURL: fileURL)))
}
public mutating func addOSLogOutput(subsystem: String) {
diff --git a/ios/MullvadVPN.xcodeproj/project.pbxproj b/ios/MullvadVPN.xcodeproj/project.pbxproj
index 5914fadb0f..8a0c116d86 100644
--- a/ios/MullvadVPN.xcodeproj/project.pbxproj
+++ b/ios/MullvadVPN.xcodeproj/project.pbxproj
@@ -251,6 +251,8 @@
58C3A4B222456F1B00340BDB /* AccountInputGroupView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C3A4B122456F1A00340BDB /* AccountInputGroupView.swift */; };
58C3F4F92964B08300D72515 /* MapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C3F4F82964B08300D72515 /* MapViewController.swift */; };
58C3F4FB296C3AD500D72515 /* SettingsCoordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C3F4FA296C3AD500D72515 /* SettingsCoordinator.swift */; };
+ 58C76A082A33850E00100D75 /* ApplicationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C76A072A33850E00100D75 /* ApplicationTarget.swift */; };
+ 58C76A092A33850E00100D75 /* ApplicationTarget.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C76A072A33850E00100D75 /* ApplicationTarget.swift */; };
58C774BE29A7A249003A1A56 /* CustomNavigationController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C774BD29A7A249003A1A56 /* CustomNavigationController.swift */; };
58C8191829FAA2C400DEB1B4 /* NotificationConfiguration.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58C8191729FAA2C400DEB1B4 /* NotificationConfiguration.swift */; };
58CAF9F82983D36800BE19F7 /* Coordinator.swift in Sources */ = {isa = PBXBuildFile; fileRef = 58CAF9F72983D36800BE19F7 /* Coordinator.swift */; };
@@ -1017,6 +1019,7 @@
58C3A4B122456F1A00340BDB /* AccountInputGroupView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AccountInputGroupView.swift; sourceTree = "<group>"; };
58C3F4F82964B08300D72515 /* MapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MapViewController.swift; sourceTree = "<group>"; };
58C3F4FA296C3AD500D72515 /* SettingsCoordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SettingsCoordinator.swift; sourceTree = "<group>"; };
+ 58C76A072A33850E00100D75 /* ApplicationTarget.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ApplicationTarget.swift; sourceTree = "<group>"; };
58C774BD29A7A249003A1A56 /* CustomNavigationController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CustomNavigationController.swift; sourceTree = "<group>"; };
58C8191729FAA2C400DEB1B4 /* NotificationConfiguration.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = NotificationConfiguration.swift; sourceTree = "<group>"; };
58CAF9F72983D36800BE19F7 /* Coordinator.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coordinator.swift; sourceTree = "<group>"; };
@@ -1829,6 +1832,7 @@
isa = PBXGroup;
children = (
58BFA5CB22A7CE1F00A6173D /* ApplicationConfiguration.swift */,
+ 58C76A072A33850E00100D75 /* ApplicationTarget.swift */,
);
path = Shared;
sourceTree = "<group>";
@@ -2965,6 +2969,7 @@
5893C6FC29C311E9009090D1 /* ApplicationRouter.swift in Sources */,
58E25F812837BBBB002CFB2C /* SceneDelegate.swift in Sources */,
5867771629097C5B006F721F /* ProductState.swift in Sources */,
+ 58C76A082A33850E00100D75 /* ApplicationTarget.swift in Sources */,
F07BF2622A26279100042943 /* RedeemVoucherOperation.swift in Sources */,
585E820327F3285E00939F0E /* SendStoreReceiptOperation.swift in Sources */,
5820676426E771DB00655B05 /* TunnelManagerErrors.swift in Sources */,
@@ -3086,6 +3091,7 @@
58E0729F28814ACC008902F8 /* WireGuardLogLevel+Logging.swift in Sources */,
580F8B8428197884002E0998 /* TunnelSettingsV2.swift in Sources */,
06410E08292D117800AFC18C /* SettingsStore.swift in Sources */,
+ 58C76A092A33850E00100D75 /* ApplicationTarget.swift in Sources */,
583D86482A2678DC0060D63B /* DeviceStateAccessor.swift in Sources */,
58906DE02445C7A5002F0673 /* NEProviderStopReason+Debug.swift in Sources */,
068CE57229278F6D00A068BB /* MigrationFromV1ToV2.swift in Sources */,
diff --git a/ios/MullvadVPN/AppDelegate.swift b/ios/MullvadVPN/AppDelegate.swift
index c105797191..ebe452c23b 100644
--- a/ios/MullvadVPN/AppDelegate.swift
+++ b/ios/MullvadVPN/AppDelegate.swift
@@ -17,9 +17,7 @@ import UIKit
import UserNotifications
@UIApplicationMain
-class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate,
- StorePaymentManagerDelegate
-{
+class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterDelegate, StorePaymentManagerDelegate {
private var logger: Logger!
#if targetEnvironment(simulator)
@@ -52,12 +50,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
logger = Logger(label: "AppDelegate")
- let containerURL = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier)!
-
- addressCache = REST.AddressCache(
- canWriteToCache: true, cacheFolder: containerURL
- )
+ addressCache = REST.AddressCache(canWriteToCache: true, cacheFolder: ApplicationConfiguration.containerURL)
proxyFactory = REST.ProxyFactory.makeProxyFactory(
transportProvider: { [weak self] in self?.transportMonitor },
@@ -112,9 +105,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
#if targetEnvironment(simulator)
// Configure mock tunnel provider on simulator
- simulatorTunnelProviderHost = SimulatorTunnelProviderHost(
- relayCacheTracker: relayCacheTracker
- )
+ simulatorTunnelProviderHost = SimulatorTunnelProviderHost(relayCacheTracker: relayCacheTracker)
SimulatorTunnelProvider.shared.delegate = simulatorTunnelProviderHost
#endif
@@ -318,19 +309,10 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
private func configureLogging() {
var loggerBuilder = LoggerBuilder()
- let bundleIdentifier = Bundle.main.bundleIdentifier!
-
- try? loggerBuilder.addFileOutput(
- securityGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier,
- basename: bundleIdentifier
- )
-
+ loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.logFileURL(for: .mainApp))
#if DEBUG
- loggerBuilder.addOSLogOutput(subsystem: bundleIdentifier)
+ loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.mainApp.bundleIdentifier)
#endif
-
- loggerBuilder.logLevel = .debug
-
loggerBuilder.install()
}
@@ -475,10 +457,7 @@ class AppDelegate: UIResponder, UIApplicationDelegate, UNUserNotificationCenterD
// MARK: - StorePaymentManagerDelegate
- func storePaymentManager(
- _ manager: StorePaymentManager,
- didRequestAccountTokenFor payment: SKPayment
- ) -> String? {
+ func storePaymentManager(_ manager: StorePaymentManager, didRequestAccountTokenFor payment: SKPayment) -> String? {
// Since we do not persist the relation between payment and account number between the
// app launches, we assume that all successful purchases belong to the active account
// number.
diff --git a/ios/MullvadVPN/Supporting Files/Info.plist b/ios/MullvadVPN/Supporting Files/Info.plist
index fb5f71916f..fc66f677ff 100644
--- a/ios/MullvadVPN/Supporting Files/Info.plist
+++ b/ios/MullvadVPN/Supporting Files/Info.plist
@@ -4,6 +4,8 @@
<dict>
<key>ApplicationSecurityGroupIdentifier</key>
<string>$(SECURITY_GROUP_IDENTIFIER)</string>
+ <key>MainApplicationIdentifier</key>
+ <string>$(APPLICATION_IDENTIFIER)</string>
<key>BGTaskSchedulerPermittedIdentifiers</key>
<array>
<string>net.mullvad.MullvadVPN.AppRefresh</string>
diff --git a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
index 6954fd3c24..a83d18f146 100644
--- a/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
+++ b/ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift
@@ -121,8 +121,7 @@ class StartTunnelOperation: ResultOperation<Void> {
private class func makeTunnelConfiguration() -> TunnelConfiguration {
let protocolConfig = NETunnelProviderProtocol()
- protocolConfig.providerBundleIdentifier = ApplicationConfiguration
- .packetTunnelExtensionIdentifier
+ protocolConfig.providerBundleIdentifier = ApplicationTarget.packetTunnel.bundleIdentifier
protocolConfig.serverAddress = ""
let alwaysOnRule = NEOnDemandRuleConnect()
diff --git a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
index bac2c375a4..65ab298d66 100644
--- a/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
+++ b/ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift
@@ -27,7 +27,9 @@ final class ProblemReportInteractor {
redactContainerPathsForSecurityGroupIdentifiers: [securityGroupIdentifier]
)
- report.addLogFiles(fileURLs: ApplicationConfiguration.logFileURLs, includeLogBackups: true)
+ let logFileURLs = ApplicationTarget.allCases.map { ApplicationConfiguration.logFileURL(for: $0) }
+
+ report.addLogFiles(fileURLs: logFileURLs, includeLogBackups: true)
return report
}()
diff --git a/ios/PacketTunnel/Info.plist b/ios/PacketTunnel/Info.plist
index d7c46d333a..f6e4c63b45 100644
--- a/ios/PacketTunnel/Info.plist
+++ b/ios/PacketTunnel/Info.plist
@@ -4,6 +4,8 @@
<dict>
<key>ApplicationSecurityGroupIdentifier</key>
<string>$(SECURITY_GROUP_IDENTIFIER)</string>
+ <key>MainApplicationIdentifier</key>
+ <string>$(APPLICATION_IDENTIFIER)</string>
<key>CFBundleDevelopmentRegion</key>
<string>$(DEVELOPMENT_LANGUAGE)</string>
<key>CFBundleDisplayName</key>
diff --git a/ios/PacketTunnel/PacketTunnelProvider.swift b/ios/PacketTunnel/PacketTunnelProvider.swift
index 92855e7444..820b59e7e6 100644
--- a/ios/PacketTunnel/PacketTunnelProvider.swift
+++ b/ios/PacketTunnel/PacketTunnelProvider.swift
@@ -125,31 +125,18 @@ class PacketTunnelProvider: NEPacketTunnelProvider, TunnelMonitorDelegate {
override init() {
var loggerBuilder = LoggerBuilder()
-
let pid = ProcessInfo.processInfo.processIdentifier
loggerBuilder.metadata["pid"] = .string("\(pid)")
-
- let bundleIdentifier = Bundle.main.bundleIdentifier!
-
- try? loggerBuilder.addFileOutput(
- securityGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier,
- basename: bundleIdentifier
- )
-
+ loggerBuilder.addFileOutput(fileURL: ApplicationConfiguration.logFileURL(for: .packetTunnel))
#if DEBUG
- loggerBuilder.addOSLogOutput(subsystem: bundleIdentifier)
+ loggerBuilder.addOSLogOutput(subsystem: ApplicationTarget.packetTunnel.bundleIdentifier)
#endif
-
loggerBuilder.install()
providerLogger = Logger(label: "PacketTunnelProvider")
tunnelLogger = Logger(label: "WireGuard")
- let containerURL = FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: ApplicationConfiguration.securityGroupIdentifier)!
- let addressCache = REST.AddressCache(
- canWriteToCache: false, cacheFolder: containerURL
- )
+ let addressCache = REST.AddressCache(canWriteToCache: false, cacheFolder: ApplicationConfiguration.containerURL)
let urlSession = REST.makeURLSession()
let urlSessionTransport = URLSessionTransport(urlSession: urlSession)
diff --git a/ios/Shared/ApplicationConfiguration.swift b/ios/Shared/ApplicationConfiguration.swift
index 92d362c806..e06d24ed2a 100644
--- a/ios/Shared/ApplicationConfiguration.swift
+++ b/ios/Shared/ApplicationConfiguration.swift
@@ -9,46 +9,20 @@
import Foundation
import struct Network.IPv4Address
-class ApplicationConfiguration {
+enum ApplicationConfiguration {
/// Shared container security group identifier.
static var securityGroupIdentifier: String {
- let securityGroupIdentifier = Bundle(for: Self.self)
- .object(forInfoDictionaryKey: "ApplicationSecurityGroupIdentifier") as? String
- return securityGroupIdentifier!
+ return Bundle.main.object(forInfoDictionaryKey: "ApplicationSecurityGroupIdentifier") as! String
}
- /// The application identifier for packet tunnel extension.
- static var packetTunnelExtensionIdentifier: String {
- let mainBundleIdentifier = Bundle.main.bundleIdentifier!
-
- return "\(mainBundleIdentifier).PacketTunnel"
- }
-
- /// Container URL for security group
- static var containerURL: URL? {
- return FileManager.default
- .containerURL(forSecurityApplicationGroupIdentifier: Self.securityGroupIdentifier)
- }
-
- /// The main application log file located in a shared container
- static var mainApplicationLogFileURL: URL? {
- return Self.containerURL?.appendingPathComponent(
- "Logs/net.mullvad.MullvadVPN.log",
- isDirectory: false
- )
- }
-
- /// The packet tunnel log file located in a shared container
- static var packetTunnelLogFileURL: URL? {
- return Self.containerURL?.appendingPathComponent(
- "Logs/net.mullvad.MullvadVPN.PacketTunnel.log",
- isDirectory: false
- )
+ /// Container URL for security group.
+ static var containerURL: URL {
+ return FileManager.default.containerURL(forSecurityApplicationGroupIdentifier: securityGroupIdentifier)!
}
- /// All log files located in a shared container
- static var logFileURLs: [URL] {
- return [mainApplicationLogFileURL, packetTunnelLogFileURL].compactMap { $0 }
+ /// Returns URL for log file associated with application target and located within shared container.
+ static func logFileURL(for target: ApplicationTarget) -> URL {
+ return containerURL.appendingPathComponent("\(target.bundleIdentifier).log", isDirectory: false)
}
/// Privacy policy URL.
@@ -68,6 +42,4 @@ class ApplicationConfiguration {
/// API address background task identifier
static let addressCacheUpdateTaskIdentifier = "net.mullvad.MullvadVPN.AddressCacheUpdate"
-
- private init() {}
}
diff --git a/ios/Shared/ApplicationTarget.swift b/ios/Shared/ApplicationTarget.swift
new file mode 100644
index 0000000000..88a2674728
--- /dev/null
+++ b/ios/Shared/ApplicationTarget.swift
@@ -0,0 +1,24 @@
+//
+// ApplicationTarget.swift
+// MullvadVPN
+//
+// Created by pronebird on 09/06/2023.
+// Copyright © 2023 Mullvad VPN AB. All rights reserved.
+//
+
+import Foundation
+
+enum ApplicationTarget: CaseIterable {
+ case mainApp, packetTunnel
+
+ /// Returns target bundle identifier.
+ var bundleIdentifier: String {
+ let mainBundleIdentifier = Bundle.main.object(forInfoDictionaryKey: "MainApplicationIdentifier") as! String
+ switch self {
+ case .mainApp:
+ return mainBundleIdentifier
+ case .packetTunnel:
+ return "\(mainBundleIdentifier).PacketTunnel"
+ }
+ }
+}