diff options
| author | Andrej Mihajlov <and@mullvad.net> | 2023-06-09 21:20:24 +0200 |
|---|---|---|
| committer | Andrej Mihajlov <and@mullvad.net> | 2023-06-09 21:21:03 +0200 |
| commit | b77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5 (patch) | |
| tree | fecf7625cd61fabffa0f9e290822dc95a93626b5 | |
| parent | e528b137273d6f00b1cdf45a809a5fed4a7de87c (diff) | |
| download | mullvadvpn-b77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5.tar.xz mullvadvpn-b77b5d46aabbec8313c09b1e1c1409d1d7cdd3a5.zip | |
Formalize application targets
| -rw-r--r-- | ios/MullvadLogging/Logging.swift | 21 | ||||
| -rw-r--r-- | ios/MullvadVPN.xcodeproj/project.pbxproj | 6 | ||||
| -rw-r--r-- | ios/MullvadVPN/AppDelegate.swift | 33 | ||||
| -rw-r--r-- | ios/MullvadVPN/Supporting Files/Info.plist | 2 | ||||
| -rw-r--r-- | ios/MullvadVPN/TunnelManager/StartTunnelOperation.swift | 3 | ||||
| -rw-r--r-- | ios/MullvadVPN/View controllers/ProblemReport/ProblemReportInteractor.swift | 4 | ||||
| -rw-r--r-- | ios/PacketTunnel/Info.plist | 2 | ||||
| -rw-r--r-- | ios/PacketTunnel/PacketTunnelProvider.swift | 19 | ||||
| -rw-r--r-- | ios/Shared/ApplicationConfiguration.swift | 44 | ||||
| -rw-r--r-- | ios/Shared/ApplicationTarget.swift | 24 |
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" + } + } +} |
