diff options
Diffstat (limited to 'WireGuard/Shared/Model/InterfaceConfiguration.swift')
-rw-r--r-- | WireGuard/Shared/Model/InterfaceConfiguration.swift | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/WireGuard/Shared/Model/InterfaceConfiguration.swift b/WireGuard/Shared/Model/InterfaceConfiguration.swift new file mode 100644 index 0000000..dfcb1fc --- /dev/null +++ b/WireGuard/Shared/Model/InterfaceConfiguration.swift @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +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 + if name.isEmpty { + fatalError("Empty name") + } + if privateKey.count != TunnelConfiguration.keyLength { + fatalError("Invalid private key") + } + } +} + +extension InterfaceConfiguration: Codable { + enum CodingKeys: String, CodingKey { + case name = "Name" + case privateKey = "PrivateKey" + case addresses = "Address" + case listenPort = "ListenPort" + case mtu = "MTU" + case dns = "DNS" + } + + init(from decoder: Decoder) throws { + let values = try decoder.container(keyedBy: CodingKeys.self) + name = try values.decode(String.self, forKey: .name) + privateKey = try Data(base64Encoded: values.decode(String.self, forKey: .privateKey))! + addresses = try values.decode([IPAddressRange].self, forKey: .addresses) + listenPort = try? values.decode(UInt16.self, forKey: .listenPort) + mtu = try? values.decode(UInt16.self, forKey: .mtu) + dns = try values.decode([DNSServer].self, forKey: .dns) + } + + func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(name, forKey: .name) + try container.encode(privateKey.base64EncodedString(), forKey: .privateKey) + try container.encode(addresses, forKey: .addresses) + if let listenPort = listenPort { + try container.encode(listenPort, forKey: .listenPort) + } + if let mtu = mtu { + try container.encode(mtu, forKey: .mtu) + } + try container.encode(dns, forKey: .dns) + } +} |