]> git.ipfire.org Git - thirdparty/wireguard-apple.git/commitdiff
Move name from interface to tunnel
authorJason A. Donenfeld <Jason@zx2c4.com>
Fri, 21 Dec 2018 23:28:18 +0000 (00:28 +0100)
committerJason A. Donenfeld <Jason@zx2c4.com>
Fri, 21 Dec 2018 23:28:18 +0000 (00:28 +0100)
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
13 files changed:
WireGuard/Shared/LegacyConfigMigration.swift
WireGuard/Shared/Model/InterfaceConfiguration.swift
WireGuard/Shared/Model/TunnelConfiguration.swift
WireGuard/Shared/NETunnelProviderProtocol+Extension.swift
WireGuard/Shared/TunnelConfiguration+WgQuickConfig.swift
WireGuard/WireGuard/Tunnel/TunnelsManager.swift
WireGuard/WireGuard/UI/TunnelViewModel.swift
WireGuard/WireGuard/UI/iOS/ViewController/QRScanViewController.swift
WireGuard/WireGuard/UI/iOS/ViewController/TunnelEditTableViewController.swift
WireGuard/WireGuard/UI/iOS/ViewController/TunnelsListTableViewController.swift
WireGuard/WireGuard/ZipArchive/ZipExporter.swift
WireGuard/WireGuard/ZipArchive/ZipImporter.swift
WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift

index 6d27fa533745124430123ffff1ad54dd1255f01d..b67301f20f2297c70fdbe7cb130a096323ffe5c4 100644 (file)
@@ -96,7 +96,7 @@ struct LegacyInterfaceConfiguration: LegacyModel {
     let dns: [LegacyDNSServer]
 
     var migrated: InterfaceConfiguration {
-        var interface = InterfaceConfiguration(name: name, privateKey: privateKey)
+        var interface = InterfaceConfiguration(privateKey: privateKey)
         interface.addresses = addresses.migrated
         interface.listenPort = listenPort
         interface.mtu = mtu
@@ -167,7 +167,7 @@ final class LegacyTunnelConfiguration: LegacyModel {
     let peers: [LegacyPeerConfiguration]
 
     var migrated: TunnelConfiguration {
-        return TunnelConfiguration(interface: interface.migrated, peers: peers.migrated)
+        return TunnelConfiguration(name: interface.name, interface: interface.migrated, peers: peers.migrated)
     }
 }
 
index ff804a6a72dbab586ff768924ca1ecc588b91eed..ef33907aab286512f1aaf5178f5348f5a6b86004 100644 (file)
@@ -4,18 +4,16 @@
 import Foundation
 
 struct InterfaceConfiguration {
-    var name: String?
     var privateKey: Data
     var addresses = [IPAddressRange]()
     var listenPort: UInt16?
     var mtu: UInt16?
     var dns = [DNSServer]()
 
-    init(name: String?, privateKey: Data) {
-        self.name = name
-        self.privateKey = privateKey
+    init(privateKey: Data) {
         if privateKey.count != TunnelConfiguration.keyLength {
             fatalError("Invalid private key")
         }
+        self.privateKey = privateKey
     }
 }
index 2e394eed3b968791d986287a26a3fbbc820b0fa6..bee3c9dca1836089495531782b044ddd2b5cdfd1 100644 (file)
@@ -4,14 +4,16 @@
 import Foundation
 
 final class TunnelConfiguration {
+    var name: String?
     var interface: InterfaceConfiguration
     let peers: [PeerConfiguration]
 
     static let keyLength = 32
 
-    init(interface: InterfaceConfiguration, peers: [PeerConfiguration]) {
+    init(name: String?, interface: InterfaceConfiguration, peers: [PeerConfiguration]) {
         self.interface = interface
         self.peers = peers
+        self.name = name
 
         let peerPublicKeysArray = peers.map { $0.publicKey }
         let peerPublicKeysSet = Set<Data>(peerPublicKeysArray)
index 2f6ea1f6c68a244f336d5ae7efe83fe8183b0370..258c96816a6fa2d41a06139587668b64d01feeaa 100644 (file)
@@ -27,13 +27,14 @@ extension NETunnelProviderProtocol {
             serverAddress = "Multiple endpoints"
         }
 
-        username = tunnelConfiguration.interface.name
+        //TODO(roopc): Why are we doing this? Just for kicks? Is it useful? Seems needless.
+        username = tunnelConfiguration.name
     }
 
-    func tunnelConfiguration(name: String?) -> TunnelConfiguration? {
+    func asTunnelConfiguration(called name: String? = nil) -> TunnelConfiguration? {
         migrateConfigurationIfNeeded()
         guard let serializedConfig = providerConfiguration?[Keys.wgQuickConfig.rawValue] as? String else { return nil }
-        return try? TunnelConfiguration(serializedConfig, name: name)
+        return try? TunnelConfiguration(fromWgQuickConfig: serializedConfig, called: name)
     }
 
 }
index 96b5413a551ad508da9207cb3d3dee63bcd90d13..94e10791dab91f675ec26d5ea3a071ba561bfd86 100644 (file)
@@ -20,8 +20,8 @@ extension TunnelConfiguration {
         case invalidPeer
     }
 
-    //swiftlint:disable:next cyclomatic_complexity function_body_length
-    convenience init(_ wgQuickConfig: String, name: String?) throws {
+    //swiftlint:disable:next function_body_length cyclomatic_complexity
+    convenience init(fromWgQuickConfig wgQuickConfig: String, called name: String? = nil) throws {
         var interfaceConfiguration: InterfaceConfiguration?
         var peerConfigurations = [PeerConfiguration]()
 
@@ -62,7 +62,7 @@ extension TunnelConfiguration {
             if isLastLine || lowercasedLine == "[interface]" || lowercasedLine == "[peer]" {
                 // Previous section has ended; process the attributes collected so far
                 if parserState == .inInterfaceSection {
-                    guard let interface = TunnelConfiguration.collate(interfaceAttributes: attributes, name: name) else { throw ParseError.invalidInterface }
+                    guard let interface = TunnelConfiguration.collate(interfaceAttributes: attributes) else { throw ParseError.invalidInterface }
                     guard interfaceConfiguration == nil else { throw ParseError.multipleInterfaces }
                     interfaceConfiguration = interface
                 } else if parserState == .inPeerSection {
@@ -87,7 +87,7 @@ extension TunnelConfiguration {
         }
 
         if let interfaceConfiguration = interfaceConfiguration {
-            self.init(interface: interfaceConfiguration, peers: peerConfigurations)
+            self.init(name: name, interface: interfaceConfiguration, peers: peerConfigurations)
         } else {
             throw ParseError.noInterface
         }
@@ -133,11 +133,11 @@ extension TunnelConfiguration {
     }
 
     //swiftlint:disable:next cyclomatic_complexity
-    private static func collate(interfaceAttributes attributes: [String: String], name: String?) -> InterfaceConfiguration? {
+    private static func collate(interfaceAttributes attributes: [String: String]) -> InterfaceConfiguration? {
         // required wg fields
         guard let privateKeyString = attributes["privatekey"] else { return nil }
         guard let privateKey = Data(base64Encoded: privateKeyString), privateKey.count == TunnelConfiguration.keyLength else { return nil }
-        var interface = InterfaceConfiguration(name: name, privateKey: privateKey)
+        var interface = InterfaceConfiguration(privateKey: privateKey)
         // other wg fields
         if let listenPortString = attributes["listenport"] {
             guard let listenPort = UInt16(listenPortString) else { return nil }
index 8c7bbb32880f9ca129ff43e2b33cee50a5368678..bf5ab526b7819d18b3c7e145e5426a5ebee94896 100644 (file)
@@ -54,7 +54,7 @@ class TunnelsManager {
     }
 
     func add(tunnelConfiguration: TunnelConfiguration, activateOnDemandSetting: ActivateOnDemandSetting = ActivateOnDemandSetting.defaultSetting, completionHandler: @escaping (WireGuardResult<TunnelContainer>) -> Void) {
-        let tunnelName = tunnelConfiguration.interface.name ?? ""
+        let tunnelName = tunnelConfiguration.name ?? ""
         if tunnelName.isEmpty {
             completionHandler(.failure(TunnelsManagerError.tunnelNameEmpty))
             return
@@ -67,7 +67,7 @@ class TunnelsManager {
 
         let tunnelProviderManager = NETunnelProviderManager()
         tunnelProviderManager.protocolConfiguration = NETunnelProviderProtocol(tunnelConfiguration: tunnelConfiguration)
-        tunnelProviderManager.localizedDescription = tunnelConfiguration.interface.name
+        tunnelProviderManager.localizedDescription = tunnelConfiguration.name
         tunnelProviderManager.isEnabled = true
 
         activateOnDemandSetting.apply(on: tunnelProviderManager)
@@ -107,7 +107,7 @@ class TunnelsManager {
     }
 
     func modify(tunnel: TunnelContainer, tunnelConfiguration: TunnelConfiguration, activateOnDemandSetting: ActivateOnDemandSetting, completionHandler: @escaping (TunnelsManagerError?) -> Void) {
-        let tunnelName = tunnelConfiguration.interface.name ?? ""
+        let tunnelName = tunnelConfiguration.name ?? ""
         if tunnelName.isEmpty {
             completionHandler(TunnelsManagerError.tunnelNameEmpty)
             return
@@ -124,7 +124,7 @@ class TunnelsManager {
         }
 
         tunnelProviderManager.protocolConfiguration = NETunnelProviderProtocol(tunnelConfiguration: tunnelConfiguration)
-        tunnelProviderManager.localizedDescription = tunnelConfiguration.interface.name
+        tunnelProviderManager.localizedDescription = tunnelConfiguration.name
         tunnelProviderManager.isEnabled = true
 
         let isActivatingOnDemand = !tunnelProviderManager.isOnDemandEnabled && activateOnDemandSetting.isActivateOnDemandEnabled
@@ -349,7 +349,7 @@ class TunnelContainer: NSObject {
     private var lastTunnelConnectionStatus: NEVPNStatus?
 
     var tunnelConfiguration: TunnelConfiguration? {
-        return (tunnelProvider.protocolConfiguration as? NETunnelProviderProtocol)?.tunnelConfiguration(name: tunnelProvider.localizedDescription)
+        return (tunnelProvider.protocolConfiguration as? NETunnelProviderProtocol)?.asTunnelConfiguration(called: tunnelProvider.localizedDescription)
     }
 
     var activateOnDemandSetting: ActivateOnDemandSetting {
index 0b5b8c02f4743166369cc706357192c8c5c8c0a0..0be3cb875ddcba1f20fd7cfec6b18a8a1c6dc8c4 100644 (file)
@@ -66,6 +66,7 @@ class TunnelViewModel {
         var scratchpad = [InterfaceField: String]()
         var fieldsWithError = Set<InterfaceField>()
         var validatedConfiguration: InterfaceConfiguration?
+        var validatedName: String?
 
         subscript(field: InterfaceField) -> String {
             get {
@@ -83,6 +84,7 @@ class TunnelViewModel {
                     populateScratchpad()
                 }
                 validatedConfiguration = nil
+                validatedName = nil
                 if stringValue.isEmpty {
                     scratchpad.removeValue(forKey: field)
                 } else {
@@ -102,7 +104,8 @@ class TunnelViewModel {
         func populateScratchpad() {
             // Populate the scratchpad from the configuration object
             guard let config = validatedConfiguration else { return }
-            scratchpad[.name] = config.name
+            guard let name = validatedName else { return }
+            scratchpad[.name] = name
             scratchpad[.privateKey] = config.privateKey.base64EncodedString()
             scratchpad[.publicKey] = config.publicKey.base64EncodedString()
             if !config.addresses.isEmpty {
@@ -120,10 +123,10 @@ class TunnelViewModel {
         }
 
         //swiftlint:disable:next cyclomatic_complexity function_body_length
-        func save() -> SaveResult<InterfaceConfiguration> {
-            if let validatedConfiguration = validatedConfiguration {
+        func save() -> SaveResult<(String, InterfaceConfiguration)> {
+            if let config = validatedConfiguration, let name = validatedName {
                 // It's already validated and saved
-                return .saved(validatedConfiguration)
+                return .saved((name, config))
             }
             fieldsWithError.removeAll()
             guard let name = scratchpad[.name]?.trimmingCharacters(in: .whitespacesAndNewlines), (!name.isEmpty) else {
@@ -138,7 +141,7 @@ class TunnelViewModel {
                 fieldsWithError.insert(.privateKey)
                 return .error(tr("alertInvalidInterfaceMessagePrivateKeyInvalid"))
             }
-            var config = InterfaceConfiguration(name: name, privateKey: privateKey)
+            var config = InterfaceConfiguration(privateKey: privateKey)
             var errorMessages = [String]()
             if let addressesString = scratchpad[.addresses] {
                 var addresses = [IPAddressRange]()
@@ -184,7 +187,8 @@ class TunnelViewModel {
             guard errorMessages.isEmpty else { return .error(errorMessages.first!) }
 
             validatedConfiguration = config
-            return .saved(config)
+            validatedName = name
+            return .saved((name, config))
         }
 
         func filterFieldsWithValueOrControl(interfaceFields: [InterfaceField]) -> [InterfaceField] {
@@ -390,6 +394,7 @@ class TunnelViewModel {
         var peersData = [PeerData]()
         if let tunnelConfiguration = tunnelConfiguration {
             interfaceData.validatedConfiguration = tunnelConfiguration.interface
+            interfaceData.validatedName = tunnelConfiguration.name
             for (index, peerConfiguration) in tunnelConfiguration.peers.enumerated() {
                 let peerData = PeerData(index: index)
                 peerData.validatedConfiguration = peerConfiguration
@@ -453,7 +458,7 @@ class TunnelViewModel {
                 return .error(tr("alertInvalidPeerMessagePublicKeyDuplicated"))
             }
 
-            let tunnelConfiguration = TunnelConfiguration(interface: interfaceConfiguration, peers: peerConfigurations)
+            let tunnelConfiguration = TunnelConfiguration(name: interfaceConfiguration.0, interface: interfaceConfiguration.1, peers: peerConfigurations)
             return .saved(tunnelConfiguration)
         }
     }
index a4f71303747202c7d2559e6e51e92c70c65b849d..2f8d41f10c5260532be3b3a354a95b704b2b3ed6 100644 (file)
@@ -101,7 +101,7 @@ class QRScanViewController: UIViewController {
     }
 
     func scanDidComplete(withCode code: String) {
-        let scannedTunnelConfiguration = try? TunnelConfiguration(code, name: "Scanned")
+        let scannedTunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: code, called: "Scanned")
         guard let tunnelConfiguration = scannedTunnelConfiguration else {
             scanDidEncounterError(title: tr("alertScanQRCodeInvalidQRCodeTitle"), message: tr("alertScanQRCodeInvalidQRCodeMessage"))
             return
@@ -114,7 +114,7 @@ class QRScanViewController: UIViewController {
         })
         alert.addAction(UIAlertAction(title: tr("actionSave"), style: .default) { [weak self] _ in
             guard let title = alert.textFields?[0].text?.trimmingCharacters(in: .whitespacesAndNewlines), !title.isEmpty else { return }
-            tunnelConfiguration.interface.name = title
+            tunnelConfiguration.name = title
             if let self = self {
                 self.delegate?.addScannedQRCode(tunnelConfiguration: tunnelConfiguration, qrScanViewController: self) {
                     self.dismiss(animated: true, completion: nil)
index 79dc7b659841da8c6c8775ebdaaf6659e8cb7a78..17e513085ad438f5fbe8d909e3c7f7f8bc75f0ef 100644 (file)
@@ -98,7 +98,7 @@ class TunnelEditTableViewController: UITableViewController {
         let tunnelSaveResult = tunnelViewModel.save()
         switch tunnelSaveResult {
         case .error(let errorMessage):
-            let alertTitle = (tunnelViewModel.interfaceData.validatedConfiguration == nil) ?
+            let alertTitle = (tunnelViewModel.interfaceData.validatedConfiguration == nil || tunnelViewModel.interfaceData.validatedName == nil) ?
                 tr("alertInvalidInterfaceTitle") : tr("alertInvalidPeerTitle")
             ErrorPresenter.showErrorAlert(title: alertTitle, message: errorMessage, from: self)
             tableView.reloadData() // Highlight erroring fields
index 77952c856b0f8eaadde233eb1416b080acc07a1e..5e4583ef065e5d1a55b570ea70ea12086b20ef85 100644 (file)
@@ -180,7 +180,7 @@ class TunnelsListTableViewController: UIViewController {
         } else /* if (url.pathExtension == "conf") -- we assume everything else is a conf */ {
             let fileBaseName = url.deletingPathExtension().lastPathComponent.trimmingCharacters(in: .whitespacesAndNewlines)
             if let fileContents = try? String(contentsOf: url),
-                let tunnelConfiguration = try? TunnelConfiguration(fileContents, name: fileBaseName) {
+                let tunnelConfiguration = try? TunnelConfiguration(fromWgQuickConfig: fileContents, called: fileBaseName) {
                 tunnelsManager.add(tunnelConfiguration: tunnelConfiguration) { [weak self] result in
                     if let error = result.error {
                         ErrorPresenter.showErrorAlert(error: error, from: self, onPresented: completionHandler)
index 052242ad9ca2551c61db76b11647e19bc984360e..1f7c2da92518743e384f0b9de9129569ea42d5a7 100644 (file)
@@ -23,7 +23,7 @@ class ZipExporter {
             var lastTunnelName: String = ""
             for tunnelConfiguration in tunnelConfigurations {
                 if let contents = tunnelConfiguration.asWgQuickConfig().data(using: .utf8) {
-                    let name = tunnelConfiguration.interface.name ?? ""
+                    let name = tunnelConfiguration.name ?? "untitled"
                     if name.isEmpty || name == lastTunnelName { continue }
                     inputsToArchiver.append((fileName: "\(name).conf", contents: contents))
                     lastTunnelName = name
index a8819e27df1c105fe5df3e9b3c38b6c7670c7610..18a00e8be63a642ade1eeffd133b6617487b39e5 100644 (file)
@@ -44,7 +44,7 @@ class ZipImporter {
                     continue
                 }
                 guard let fileContents = String(data: file.contents, encoding: .utf8) else { continue }
-                guard let tunnelConfig = try? TunnelConfiguration(fileContents, name: file.fileBaseName) else { continue }
+                guard let tunnelConfig = try? TunnelConfiguration(fromWgQuickConfig: fileContents, called: file.fileBaseName) else { continue }
                 configs[index] = tunnelConfig
             }
             DispatchQueue.main.async { completion(.success(configs)) }
index df5dd906bad01197e8b525df7db8b5f594e7098e..7a461c423bab69926653e434883c7ce987587a69 100644 (file)
@@ -29,7 +29,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
         let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId, tunnelProvider: self)
 
         guard let tunnelProviderProtocol = protocolConfiguration as? NETunnelProviderProtocol,
-            let tunnelConfiguration = tunnelProviderProtocol.tunnelConfiguration(name: nil) else {
+            let tunnelConfiguration = tunnelProviderProtocol.asTunnelConfiguration() else {
                 errorNotifier.notify(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid)
                 startTunnelCompletionHandler(PacketTunnelProviderError.savedProtocolConfigurationIsInvalid)
                 return