diff options
author | 2020-12-01 11:18:31 +0100 | |
---|---|---|
committer | 2020-12-11 11:15:22 +0100 | |
commit | 9f8d0e24df53cecca0ff38382e7eae9cd2692898 (patch) | |
tree | 7a158e30764a785457e13da45e868ca525864438 /Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift | |
parent | WireGuardGoKit: drop support for armv7 (diff) | |
download | wireguard-apple-9f8d0e24df53cecca0ff38382e7eae9cd2692898.tar.xz wireguard-apple-9f8d0e24df53cecca0ff38382e7eae9cd2692898.zip |
WireGuardKit: Conditionally turn on/off wireguard-go
Signed-off-by: Andrej Mihajlov <and@mullvad.net>
Diffstat (limited to 'Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift')
-rw-r--r-- | Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift | 57 |
1 files changed, 34 insertions, 23 deletions
diff --git a/Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift b/Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift index 9efe1fa..0ddc1b7 100644 --- a/Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift +++ b/Sources/WireGuardKit/PacketTunnelSettingsGenerator.swift @@ -9,6 +9,9 @@ import NetworkExtension import WireGuardKitC #endif +/// A type alias for `Result` type that holds a tuple with source and resolved endpoint. +typealias EndpointResolutionResult = Result<(Endpoint, Endpoint), DNSResolutionError> + class PacketTunnelSettingsGenerator { let tunnelConfiguration: TunnelConfiguration let resolvedEndpoints: [Endpoint?] @@ -18,31 +21,27 @@ class PacketTunnelSettingsGenerator { self.resolvedEndpoints = resolvedEndpoints } - func endpointUapiConfiguration() -> (String, [DNSResolutionError]) { - var resolutionErrors = [DNSResolutionError]() + func endpointUapiConfiguration() -> (String, [EndpointResolutionResult?]) { + var resolutionResults = [EndpointResolutionResult?]() var wgSettings = "" - for (index, peer) in tunnelConfiguration.peers.enumerated() { + + assert(tunnelConfiguration.peers.count == resolvedEndpoints.count) + for (peer, resolvedEndpoint) in zip(self.tunnelConfiguration.peers, self.resolvedEndpoints) { wgSettings.append("public_key=\(peer.publicKey.hexKey)\n") - let result = Result { try resolvedEndpoints[index]?.withReresolvedIP() } - .mapError { error -> DNSResolutionError in - // swiftlint:disable:next force_cast - return error as! DNSResolutionError - } - switch result { - case .success(.some(let endpoint)): - if case .name = endpoint.host { assert(false, "Endpoint is not resolved") } - wgSettings.append("endpoint=\(endpoint.stringRepresentation)\n") - case .success(.none): - break - case .failure(let error): - resolutionErrors.append(error) + let result = resolvedEndpoint.map(Self.reresolveEndpoint) + if case .success((_, let resolvedEndpoint)) = result { + if case .name = resolvedEndpoint.host { assert(false, "Endpoint is not resolved") } + wgSettings.append("endpoint=\(resolvedEndpoint.stringRepresentation)\n") } + resolutionResults.append(result) } - return (wgSettings, resolutionErrors) + + return (wgSettings, resolutionResults) } - func uapiConfiguration() -> String { + func uapiConfiguration() -> (String, [EndpointResolutionResult?]) { + var resolutionResults = [EndpointResolutionResult?]() var wgSettings = "" wgSettings.append("private_key=\(tunnelConfiguration.interface.privateKey.hexKey)\n") if let listenPort = tunnelConfiguration.interface.listenPort { @@ -52,15 +51,19 @@ class PacketTunnelSettingsGenerator { wgSettings.append("replace_peers=true\n") } assert(tunnelConfiguration.peers.count == resolvedEndpoints.count) - for (index, peer) in tunnelConfiguration.peers.enumerated() { + for (peer, resolvedEndpoint) in zip(self.tunnelConfiguration.peers, self.resolvedEndpoints) { wgSettings.append("public_key=\(peer.publicKey.hexKey)\n") if let preSharedKey = peer.preSharedKey?.hexKey { wgSettings.append("preshared_key=\(preSharedKey)\n") } - if let endpoint = try? resolvedEndpoints[index]?.withReresolvedIP() { - if case .name = endpoint.host { assert(false, "Endpoint is not resolved") } - wgSettings.append("endpoint=\(endpoint.stringRepresentation)\n") + + let result = resolvedEndpoint.map(Self.reresolveEndpoint) + if case .success((_, let resolvedEndpoint)) = result { + if case .name = resolvedEndpoint.host { assert(false, "Endpoint is not resolved") } + wgSettings.append("endpoint=\(resolvedEndpoint.stringRepresentation)\n") } + resolutionResults.append(result) + let persistentKeepAlive = peer.persistentKeepAlive ?? 0 wgSettings.append("persistent_keepalive_interval=\(persistentKeepAlive)\n") if !peer.allowedIPs.isEmpty { @@ -68,7 +71,7 @@ class PacketTunnelSettingsGenerator { peer.allowedIPs.forEach { wgSettings.append("allowed_ip=\($0.stringRepresentation)\n") } } } - return wgSettings + return (wgSettings, resolutionResults) } func generateNetworkSettings() -> NEPacketTunnelNetworkSettings { @@ -163,4 +166,12 @@ class PacketTunnelSettingsGenerator { } return (ipv4IncludedRoutes, ipv6IncludedRoutes) } + + private class func reresolveEndpoint(endpoint: Endpoint) -> EndpointResolutionResult { + return Result { (endpoint, try endpoint.withReresolvedIP()) } + .mapError { error -> DNSResolutionError in + // swiftlint:disable:next force_cast + return error as! DNSResolutionError + } + } } |