Simplify versioning of stored data
This commit is contained in:
parent
df698658d2
commit
d540c1811c
|
@ -3,20 +3,17 @@
|
||||||
|
|
||||||
import NetworkExtension
|
import NetworkExtension
|
||||||
|
|
||||||
let tunnelConfigurationVersion = 2
|
|
||||||
|
|
||||||
extension NETunnelProviderProtocol {
|
extension NETunnelProviderProtocol {
|
||||||
|
|
||||||
enum Keys: String {
|
enum Keys: String {
|
||||||
case tunnelConfiguration = "TunnelConfiguration"
|
case wgQuickConfig = "WgQuickConfigV1"
|
||||||
case tunnelConfigurationVersion = "TunnelConfigurationVersion"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
var tunnelConfiguration: TunnelConfiguration? {
|
var tunnelConfiguration: TunnelConfiguration? {
|
||||||
migrateConfigurationIfNeeded()
|
migrateConfigurationIfNeeded()
|
||||||
|
|
||||||
let tunnelConfigurationData: Data?
|
let tunnelConfigurationData: Data?
|
||||||
if let configurationDictionary = providerConfiguration?[Keys.tunnelConfiguration.rawValue] {
|
if let configurationDictionary = providerConfiguration?[Keys.wgQuickConfig.rawValue] {
|
||||||
tunnelConfigurationData = try? JSONSerialization.data(withJSONObject: configurationDictionary, options: [])
|
tunnelConfigurationData = try? JSONSerialization.data(withJSONObject: configurationDictionary, options: [])
|
||||||
} else {
|
} else {
|
||||||
tunnelConfigurationData = nil
|
tunnelConfigurationData = nil
|
||||||
|
@ -36,10 +33,7 @@ extension NETunnelProviderProtocol {
|
||||||
|
|
||||||
let appId = Bundle.main.bundleIdentifier!
|
let appId = Bundle.main.bundleIdentifier!
|
||||||
providerBundleIdentifier = "\(appId).network-extension"
|
providerBundleIdentifier = "\(appId).network-extension"
|
||||||
providerConfiguration = [
|
providerConfiguration = [ Keys.wgQuickConfig.rawValue: tunnelConfigDictionary ]
|
||||||
Keys.tunnelConfiguration.rawValue: tunnelConfigDictionary,
|
|
||||||
Keys.tunnelConfigurationVersion.rawValue: tunnelConfigurationVersion
|
|
||||||
]
|
|
||||||
|
|
||||||
let endpoints = tunnelConfiguration.peers.compactMap { $0.endpoint }
|
let endpoints = tunnelConfiguration.peers.compactMap { $0.endpoint }
|
||||||
if endpoints.count == 1 {
|
if endpoints.count == 1 {
|
||||||
|
@ -60,32 +54,22 @@ extension NETunnelProviderProtocol {
|
||||||
|
|
||||||
@discardableResult
|
@discardableResult
|
||||||
func migrateConfigurationIfNeeded() -> Bool {
|
func migrateConfigurationIfNeeded() -> Bool {
|
||||||
guard let providerConfiguration = providerConfiguration else { return false }
|
guard let configurationVersion = providerConfiguration?["tunnelConfigurationVersion"] as? Int else { return false }
|
||||||
guard let configurationVersion = providerConfiguration[Keys.tunnelConfigurationVersion.rawValue] as? Int ?? providerConfiguration["tunnelConfigurationVersion"] as? Int else { return false }
|
if configurationVersion == 1 {
|
||||||
|
|
||||||
if configurationVersion < tunnelConfigurationVersion {
|
|
||||||
switch configurationVersion {
|
|
||||||
case 1:
|
|
||||||
migrateFromConfigurationV1()
|
migrateFromConfigurationV1()
|
||||||
default:
|
} else {
|
||||||
fatalError("No migration from configuration version \(configurationVersion) exists.")
|
fatalError("No migration from configuration version \(configurationVersion) exists.")
|
||||||
}
|
}
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
|
|
||||||
private func migrateFromConfigurationV1() {
|
private func migrateFromConfigurationV1() {
|
||||||
guard let serializedTunnelConfiguration = providerConfiguration?["tunnelConfiguration"] as? Data else { return }
|
guard let serializedTunnelConfiguration = providerConfiguration?["tunnelConfiguration"] as? Data else { return }
|
||||||
guard let configuration = try? JSONDecoder().decode(LegacyTunnelConfiguration.self, from: serializedTunnelConfiguration) else { return }
|
guard let configuration = try? JSONDecoder().decode(LegacyTunnelConfiguration.self, from: serializedTunnelConfiguration) else { return }
|
||||||
guard let tunnelConfigData = try? JSONEncoder().encode(configuration.migrated) else { return }
|
guard let tunnelConfigData = try? JSONEncoder().encode(configuration.migrated) else { return }
|
||||||
guard let tunnelConfigDictionary = try? JSONSerialization.jsonObject(with: tunnelConfigData, options: .allowFragments) else { return }
|
guard let tunnelConfigDictionary = try? JSONSerialization.jsonObject(with: tunnelConfigData, options: .allowFragments) else { return }
|
||||||
|
|
||||||
providerConfiguration = [
|
providerConfiguration = [ Keys.wgQuickConfig.rawValue: tunnelConfigDictionary ]
|
||||||
Keys.tunnelConfiguration.rawValue: tunnelConfigDictionary,
|
|
||||||
Keys.tunnelConfigurationVersion.rawValue: tunnelConfigurationVersion
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue