diff --git a/WireGuard/WireGuard.xcodeproj/project.pbxproj b/WireGuard/WireGuard.xcodeproj/project.pbxproj index 8120b38..6b77eae 100644 --- a/WireGuard/WireGuard.xcodeproj/project.pbxproj +++ b/WireGuard/WireGuard.xcodeproj/project.pbxproj @@ -41,6 +41,7 @@ 6F919EDA218C65C50023B400 /* wireguard_doc_logo_44x58.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F919ED6218C65C50023B400 /* wireguard_doc_logo_44x58.png */; }; 6F919EDB218C65C50023B400 /* wireguard_doc_logo_64x64.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F919ED7218C65C50023B400 /* wireguard_doc_logo_64x64.png */; }; 6F919EDC218C65C50023B400 /* wireguard_doc_logo_320x320.png in Resources */ = {isa = PBXBuildFile; fileRef = 6F919ED8218C65C50023B400 /* wireguard_doc_logo_320x320.png */; }; + 6FB1017921C57DE600766195 /* MockTunnels.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FB1017821C57DE600766195 /* MockTunnels.swift */; }; 6FDEF7E421846C1A00D8FBF6 /* libwg-go.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 6FDEF7E321846C1A00D8FBF6 /* libwg-go.a */; }; 6FDEF7E62185EFB200D8FBF6 /* QRScanViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7E52185EFAF00D8FBF6 /* QRScanViewController.swift */; }; 6FDEF7FB21863B6100D8FBF6 /* unzip.c in Sources */ = {isa = PBXBuildFile; fileRef = 6FDEF7F621863B6100D8FBF6 /* unzip.c */; }; @@ -141,6 +142,7 @@ 6F919ED6218C65C50023B400 /* wireguard_doc_logo_44x58.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wireguard_doc_logo_44x58.png; sourceTree = ""; }; 6F919ED7218C65C50023B400 /* wireguard_doc_logo_64x64.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wireguard_doc_logo_64x64.png; sourceTree = ""; }; 6F919ED8218C65C50023B400 /* wireguard_doc_logo_320x320.png */ = {isa = PBXFileReference; lastKnownFileType = image.png; path = wireguard_doc_logo_320x320.png; sourceTree = ""; }; + 6FB1017821C57DE600766195 /* MockTunnels.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MockTunnels.swift; sourceTree = ""; }; 6FDEF7E321846C1A00D8FBF6 /* libwg-go.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; path = "libwg-go.a"; sourceTree = BUILT_PRODUCTS_DIR; }; 6FDEF7E52185EFAF00D8FBF6 /* QRScanViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = QRScanViewController.swift; sourceTree = ""; }; 6FDEF7F621863B6100D8FBF6 /* unzip.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = unzip.c; sourceTree = ""; }; @@ -297,6 +299,7 @@ 6F7774EE21722D97006A79B3 /* TunnelsManager.swift */, 6FFA5DA32197085D0001E2F7 /* ActivateOnDemandSetting.swift */, 5F4541A821C451D100994C13 /* TunnelStatus.swift */, + 6FB1017821C57DE600766195 /* MockTunnels.swift */, ); path = Tunnel; sourceTree = ""; @@ -684,6 +687,7 @@ 6F7774F321774263006A79B3 /* TunnelEditTableViewController.swift in Sources */, 6FDEF802218646BA00D8FBF6 /* ZipArchive.swift in Sources */, 5F45419021C2D53800994C13 /* SwitchCell.swift in Sources */, + 6FB1017921C57DE600766195 /* MockTunnels.swift in Sources */, 6FDEF806218725D200D8FBF6 /* SettingsTableViewController.swift in Sources */, 5F4541A221C2D6DF00994C13 /* BorderedTextButton.swift in Sources */, 6F7774E1217181B1006A79B3 /* MainViewController.swift in Sources */, diff --git a/WireGuard/WireGuard/Tunnel/MockTunnels.swift b/WireGuard/WireGuard/Tunnel/MockTunnels.swift new file mode 100644 index 0000000..116a1d8 --- /dev/null +++ b/WireGuard/WireGuard/Tunnel/MockTunnels.swift @@ -0,0 +1,43 @@ +// SPDX-License-Identifier: MIT +// Copyright © 2018 WireGuard LLC. All Rights Reserved. + +import NetworkExtension + +// Creates mock tunnels for the iOS Simulator. + +#if targetEnvironment(simulator) +class MockTunnels { + static let tunnelNames = [ + "demo", + "edgesecurity", + "home", + "office" + ] + static let address = "192.168.4.184/24" + static let dnsServers = ["8.8.8.8", "4.4.4.4"] + static let endpoint = "demo.wireguard.com:12912" + static let allowedIPs = "0.0.0.0/0" + + static func createMockTunnels() -> [NETunnelProviderManager] { + return tunnelNames.map { tunnelName -> NETunnelProviderManager in + + var interface = InterfaceConfiguration(name: tunnelName, privateKey: Curve25519.generatePrivateKey()) + interface.addresses = [IPAddressRange(from: address)!] + interface.dns = dnsServers.map { DNSServer(from: $0)! } + + var peer = PeerConfiguration(publicKey: Curve25519.generatePublicKey(fromPrivateKey: Curve25519.generatePrivateKey())) + peer.endpoint = Endpoint(from: endpoint) + peer.allowedIPs = [IPAddressRange(from: allowedIPs)!] + + let tunnelConfiguration = TunnelConfiguration(interface: interface, peers: [peer]) + + let tunnelProviderManager = NETunnelProviderManager() + tunnelProviderManager.protocolConfiguration = NETunnelProviderProtocol(tunnelConfiguration: tunnelConfiguration) + tunnelProviderManager.localizedDescription = tunnelName + tunnelProviderManager.isEnabled = true + + return tunnelProviderManager + } + } +} +#endif diff --git a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift index 4c2f2ed..ff8c720 100644 --- a/WireGuard/WireGuard/Tunnel/TunnelsManager.swift +++ b/WireGuard/WireGuard/Tunnel/TunnelsManager.swift @@ -92,7 +92,7 @@ class TunnelsManager { static func create(completionHandler: @escaping (WireGuardResult) -> Void) { #if targetEnvironment(simulator) - completionHandler(.success(TunnelsManager(tunnelProviders: []))) + completionHandler(.success(TunnelsManager(tunnelProviders: MockTunnels.createMockTunnels()))) #else NETunnelProviderManager.loadAllFromPreferences { managers, error in if let error = error { @@ -272,13 +272,21 @@ class TunnelsManager { return } + #if targetEnvironment(simulator) + tunnel.status = .active + #else tunnel.startActivation(activationDelegate: activationDelegate) + #endif } func startDeactivation(of tunnel: TunnelContainer) { tunnel.isAttemptingActivation = false guard tunnel.status != .inactive && tunnel.status != .deactivating else { return } + #if targetEnvironment(simulator) + tunnel.status = .inactive + #else tunnel.startDeactivation() + #endif } func refreshStatuses() {