*.perspectivev3
!default.perspectivev3
xcuserdata
+*.xcscheme
## Other
*.xccheckout
}
}
+extension DNSServer: Equatable {
+ static func == (lhs: DNSServer, rhs: DNSServer) -> Bool {
+ return lhs.address.rawValue == rhs.address.rawValue
+ }
+}
+
extension DNSServer {
var stringRepresentation: String {
return "\(address)"
}
}
+extension Endpoint: Equatable {
+ static func == (lhs: Endpoint, rhs: Endpoint) -> Bool {
+ return lhs.host == rhs.host && lhs.port == rhs.port
+ }
+}
+
+extension Endpoint: Hashable {
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(host)
+ hasher.combine(port)
+ }
+}
+
extension Endpoint {
var stringRepresentation: String {
switch host {
}
}
+extension IPAddressRange: Equatable {
+ static func == (lhs: IPAddressRange, rhs: IPAddressRange) -> Bool {
+ return lhs.address.rawValue == rhs.address.rawValue && lhs.networkPrefixLength == rhs.networkPrefixLength
+ }
+}
+
+extension IPAddressRange: Hashable {
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(address.rawValue)
+ hasher.combine(networkPrefixLength)
+ }
+}
+
extension IPAddressRange {
var stringRepresentation: String {
return "\(address)/\(networkPrefixLength)"
// Copyright © 2018 WireGuard LLC. All Rights Reserved.
import Foundation
+import Network
struct InterfaceConfiguration {
var privateKey: Data
self.privateKey = privateKey
}
}
+
+extension InterfaceConfiguration: Equatable {
+ static func == (lhs: InterfaceConfiguration, rhs: InterfaceConfiguration) -> Bool {
+ let lhsAddresses = lhs.addresses.filter { $0.address is IPv4Address } + lhs.addresses.filter { $0.address is IPv6Address }
+ let rhsAddresses = rhs.addresses.filter { $0.address is IPv4Address } + rhs.addresses.filter { $0.address is IPv6Address }
+
+ return lhs.privateKey == rhs.privateKey &&
+ lhsAddresses == rhsAddresses &&
+ lhs.listenPort == rhs.listenPort &&
+ lhs.mtu == rhs.mtu &&
+ lhs.dns == rhs.dns
+ }
+}
}
}
}
+
+extension PeerConfiguration: Equatable {
+ static func == (lhs: PeerConfiguration, rhs: PeerConfiguration) -> Bool {
+ return lhs.publicKey == rhs.publicKey &&
+ lhs.preSharedKey == rhs.preSharedKey &&
+ Set(lhs.allowedIPs) == Set(rhs.allowedIPs) &&
+ lhs.endpoint == rhs.endpoint &&
+ lhs.persistentKeepAlive == rhs.persistentKeepAlive
+ }
+}
+
+extension PeerConfiguration: Hashable {
+ func hash(into hasher: inout Hasher) {
+ hasher.combine(publicKey)
+ hasher.combine(preSharedKey)
+ hasher.combine(Set(allowedIPs))
+ hasher.combine(endpoint)
+ hasher.combine(persistentKeepAlive)
+
+ }
+}
}
}
}
+
+extension TunnelConfiguration: Equatable {
+ static func == (lhs: TunnelConfiguration, rhs: TunnelConfiguration) -> Bool {
+ return lhs.name == rhs.name &&
+ lhs.interface == rhs.interface &&
+ Set(lhs.peers) == Set(rhs.peers)
+ }
+}
isa = PBXNativeTarget;
buildConfigurationList = 6FF4AC26211EC472002C96EB /* Build configuration list for PBXNativeTarget "WireGuard" */;
buildPhases = (
+ 5F784E5721CDF6DD00B8D9A0 /* Strip Trailing Whitespace */,
5F45417A21C0902400994C13 /* Swiftlint */,
6B87860E2189532500C099FB /* Extract wireguard-go Version */,
6FF4AC10211EC46F002C96EB /* Sources */,
shellPath = /bin/sh;
shellScript = "if which swiftlint >/dev/null; then\n swiftlint\nelse\n echo \"warning: SwiftLint not installed, download from https://github.com/realm/SwiftLint\"\nfi\n";
};
+ 5F784E5721CDF6DD00B8D9A0 /* Strip Trailing Whitespace */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ );
+ name = "Strip Trailing Whitespace";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "find . -name '*.swift' -exec sed -i '' -E 's/[[:space:]]+$//g' {} +\n";
+ };
6B87860E2189532500C099FB /* Extract wireguard-go Version */ = {
isa = PBXShellScriptBuildPhase;
buildActionMask = 2147483647;
}
let newTunnels = managers.map { TunnelContainer(tunnel: $0) }.sorted { $0.name < $1.name }
- let hasChanges = self.tunnels.map { $0.name } != newTunnels.map { $0.name }
+ let hasChanges = self.tunnels.map { $0.tunnelConfiguration } != newTunnels.map { $0.tunnelConfiguration }
if hasChanges {
self.tunnels = newTunnels
completionHandler(true)
private var lastFirstInterface: NWInterface?
private var packetTunnelSettingsGenerator: PacketTunnelSettingsGenerator?
+ deinit {
+ networkMonitor?.cancel()
+ }
+
override func startTunnel(options: [String: NSObject]?, completionHandler startTunnelCompletionHandler: @escaping (Error?) -> Void) {
let activationAttemptId = options?["activationAttemptId"] as? String
let errorNotifier = ErrorNotifier(activationAttemptId: activationAttemptId)