Add provider configuration generation.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
This commit is contained in:
@@ -10,7 +10,90 @@ import Foundation
|
||||
|
||||
extension Tunnel {
|
||||
public func generateProviderConfiguration() -> [String: Any] {
|
||||
//TODO: generate ProviderConfiguration from tunnel with WireGuard config.
|
||||
return [:]
|
||||
var providerConfiguration = [String: Any]()
|
||||
|
||||
providerConfiguration["title"] = self.title
|
||||
var settingsString = "replace_peers=true\n"
|
||||
if let interface = interface {
|
||||
settingsString += generateInterfaceProviderConfiguration(interface)
|
||||
}
|
||||
|
||||
if let peers = peers?.array as? [Peer] {
|
||||
peers.forEach {
|
||||
settingsString += generatePeerProviderConfiguration($0)
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
providerConfiguration["settings"] = settingsString
|
||||
|
||||
return providerConfiguration
|
||||
}
|
||||
|
||||
private func generateInterfaceProviderConfiguration(_ interface: Interface) -> String {
|
||||
var settingsString = "replace_peers=true\n"
|
||||
|
||||
if let hexPrivateKey = base64KeyToHex(interface.privateKey) {
|
||||
settingsString += "private_key=\(hexPrivateKey)\n"
|
||||
}
|
||||
if interface.listenPort > 0 {
|
||||
settingsString += "listen_port=\(interface.listenPort)\n"
|
||||
}
|
||||
if let dns = interface.dns {
|
||||
settingsString += "dns=\(dns)\n"
|
||||
}
|
||||
if interface.mtu > 0 {
|
||||
settingsString += "mtu=\(interface.mtu)\n"
|
||||
}
|
||||
|
||||
return settingsString
|
||||
}
|
||||
|
||||
private func generatePeerProviderConfiguration(_ peer: Peer) -> String {
|
||||
var settingsString = ""
|
||||
|
||||
if let hexPublicKey = base64KeyToHex(peer.publicKey) {
|
||||
settingsString += "public_key=\(hexPublicKey)"
|
||||
}
|
||||
if let presharedKey = peer.presharedKey {
|
||||
settingsString += "preshared_key=\(presharedKey)"
|
||||
}
|
||||
if let endpoint = peer.endpoint {
|
||||
settingsString += "endpoint=\(endpoint)"
|
||||
}
|
||||
if peer.persistentKeepalive > 0 {
|
||||
settingsString += "persistent_keepalive_interval=\(peer.persistentKeepalive)"
|
||||
}
|
||||
if let allowedIPs = peer.allowedIPs {
|
||||
settingsString += "allowed_ip=\(allowedIPs)" // TODO: split on ,
|
||||
}
|
||||
|
||||
return settingsString
|
||||
}
|
||||
}
|
||||
|
||||
private func base64KeyToHex(_ base64: String?) -> String? {
|
||||
guard let base64 = base64 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard base64.count == 44 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard base64.last == "=" else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard let keyData = Data(base64Encoded: base64) else {
|
||||
return nil
|
||||
}
|
||||
|
||||
guard keyData.count == 32 else {
|
||||
return nil
|
||||
}
|
||||
|
||||
let hexKey = keyData.reduce("") {$0 + String(format: "%02x", $1)}
|
||||
|
||||
return hexKey
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user