diff --git a/.gitignore b/.gitignore index d203206..f7262ca 100644 --- a/.gitignore +++ b/.gitignore @@ -19,6 +19,7 @@ DerivedData *.perspectivev3 !default.perspectivev3 xcuserdata +*.xcscheme ## Other *.xccheckout diff --git a/WireGuard/Shared/Model/DNSServer.swift b/WireGuard/Shared/Model/DNSServer.swift index 710c656..5a509cb 100644 --- a/WireGuard/Shared/Model/DNSServer.swift +++ b/WireGuard/Shared/Model/DNSServer.swift @@ -12,6 +12,12 @@ struct DNSServer { } } +extension DNSServer: Equatable { + static func == (lhs: DNSServer, rhs: DNSServer) -> Bool { + return lhs.address.rawValue == rhs.address.rawValue + } +} + extension DNSServer { var stringRepresentation: String { return "\(address)" diff --git a/WireGuard/Shared/Model/Endpoint.swift b/WireGuard/Shared/Model/Endpoint.swift index 03de131..bcc74cf 100644 --- a/WireGuard/Shared/Model/Endpoint.swift +++ b/WireGuard/Shared/Model/Endpoint.swift @@ -14,6 +14,19 @@ struct Endpoint { } } +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 { diff --git a/WireGuard/Shared/Model/IPAddressRange.swift b/WireGuard/Shared/Model/IPAddressRange.swift index 7d3e5ec..26dccc3 100644 --- a/WireGuard/Shared/Model/IPAddressRange.swift +++ b/WireGuard/Shared/Model/IPAddressRange.swift @@ -14,6 +14,19 @@ struct IPAddressRange { } } +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)" diff --git a/WireGuard/Shared/Model/InterfaceConfiguration.swift b/WireGuard/Shared/Model/InterfaceConfiguration.swift index ef33907..e28046b 100644 --- a/WireGuard/Shared/Model/InterfaceConfiguration.swift +++ b/WireGuard/Shared/Model/InterfaceConfiguration.swift @@ -2,6 +2,7 @@ // Copyright © 2018 WireGuard LLC. All Rights Reserved. import Foundation +import Network struct InterfaceConfiguration { var privateKey: Data @@ -17,3 +18,16 @@ struct InterfaceConfiguration { 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 + } +} diff --git a/WireGuard/Shared/Model/PeerConfiguration.swift b/WireGuard/Shared/Model/PeerConfiguration.swift index 2e969e6..a684fa6 100644 --- a/WireGuard/Shared/Model/PeerConfiguration.swift +++ b/WireGuard/Shared/Model/PeerConfiguration.swift @@ -25,3 +25,24 @@ struct PeerConfiguration { } } } + +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) + + } +} diff --git a/WireGuard/Shared/Model/TunnelConfiguration.swift b/WireGuard/Shared/Model/TunnelConfiguration.swift index bee3c9d..532212e 100644 --- a/WireGuard/Shared/Model/TunnelConfiguration.swift +++ b/WireGuard/Shared/Model/TunnelConfiguration.swift @@ -22,3 +22,11 @@ final class TunnelConfiguration { } } } + +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) + } +} diff --git a/WireGuard/WireGuard.xcodeproj/project.pbxproj b/WireGuard/WireGuard.xcodeproj/project.pbxproj index 7bdc5e8..2ef4bd2 100644 --- a/WireGuard/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard/WireGuard.xcodeproj/project.pbxproj @@ -477,6 +477,7 @@ isa = PBXNativeTarget; buildConfigurationList = 6FF4AC26211EC472002C96EB /* Build configuration list for PBXNativeTarget "WireGuard" */; buildPhases = ( + 5F784E5721CDF6DD00B8D9A0 /* Strip Trailing Whitespace */, 5F45417A21C0902400994C13 /* Swiftlint */, 6B87860E2189532500C099FB /* Extract wireguard-go Version */, 6FF4AC10211EC46F002C96EB /* Sources */, @@ -606,6 +607,24 @@ 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; diff --git a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift index 86f57d9..8b5311d 100644 --- a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift +++ b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift @@ -64,7 +64,7 @@ class TunnelsManager { } 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) diff --git a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift index e44d298..ca8902f 100644 --- a/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift +++ b/WireGuard/WireGuardNetworkExtension/PacketTunnelProvider.swift @@ -13,6 +13,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider { 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)