From f138d864948d82ffa794331c875bec614ac2487b Mon Sep 17 00:00:00 2001 From: Jamil Date: Fri, 16 May 2025 15:00:16 -0700 Subject: [PATCH] feat(apple): Apply MDM changes to Configuration (#9169) When the MDM installs a configuration payload to `dev.firezone.firezone.network-extension`, the tunnel service will now be notified of a change to its `managedDict`, applying the configuration and updating `packetTunnelProvider`'s local copy so that it'll be returned on the next configuration fetch from the UI. Related: #4505 --- .../ConfigurationManager.swift | 20 ++++++++++++++++--- .../PacketTunnelProvider.swift | 2 +- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift b/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift index 2d87cfcf3..bb89f888c 100644 --- a/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift +++ b/swift/apple/FirezoneNetworkExtension/ConfigurationManager.swift @@ -21,16 +21,26 @@ class ConfigurationManager { // can cause deadlocks in rare cases. private var userDict: [String: Any?] - private var managedDict: [String: Any?] { - userDefaults.dictionary(forKey: managedDictKey) ?? [:] - } + private var managedDict: [String: Any?] private init() { userDefaults = UserDefaults.standard userDict = userDefaults.dictionary(forKey: userDictKey) ?? [:] + managedDict = userDefaults.dictionary(forKey: managedDictKey) ?? [:] migrateFirezoneId() Telemetry.firezoneId = userDict[Configuration.Keys.firezoneId] as? String + + NotificationCenter.default.addObserver( + self, + selector: #selector(handleUserDefaultsChanged), + name: UserDefaults.didChangeNotification, + object: userDefaults + ) + } + + deinit { + NotificationCenter.default.removeObserver(self, name: UserDefaults.didChangeNotification, object: userDefaults) } // Save user-settable configuration @@ -69,6 +79,10 @@ class ConfigurationManager { setFirezoneId(UUID().uuidString) } + @objc private func handleUserDefaultsChanged(_ notification: Notification) { + self.managedDict = userDefaults.dictionary(forKey: managedDictKey) ?? [:] + } + private func saveUserDict() { userDefaults.set(userDict, forKey: userDictKey) } diff --git a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift index cd47665a2..0edd92bb4 100644 --- a/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift +++ b/swift/apple/FirezoneNetworkExtension/PacketTunnelProvider.swift @@ -176,8 +176,8 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler?(configurationPayload) case .setConfiguration(let configuration): - self.configuration = configuration ConfigurationManager.shared.setConfiguration(configuration) + self.configuration = ConfigurationManager.shared.toConfiguration() completionHandler?(nil) case .signOut: