diff --git a/Configuration/Debug.xcconfig b/Configuration/Debug.xcconfig new file mode 100755 index 0000000..49f22e0 --- /dev/null +++ b/Configuration/Debug.xcconfig @@ -0,0 +1,6 @@ +#include "Framework.xcconfig" + +ONLY_ACTIVE_ARCH = YES +SWIFT_OPTIMIZATION_LEVEL = -Onone +SWIFT_ACTIVE_COMPILATION_CONDITIONS = $(inherited) DEBUG +BITCODE_GENERATION_MODE = marker diff --git a/Configuration/Framework.xcconfig b/Configuration/Framework.xcconfig new file mode 100755 index 0000000..8109c13 --- /dev/null +++ b/Configuration/Framework.xcconfig @@ -0,0 +1,15 @@ +PRODUCT_NAME = OpenVPNAdapter +PRODUCT_BUNDLE_IDENTIFIER = me.ss-abramchuk.openvpn-adapter +INFOPLIST_FILE = Configuration/Info-Framework.plist +MODULEMAP_FILE = OpenVPN Adapter/module.modulemap +DYLIB_CURRENT_VERSION = $(CURRENT_PROJECT_VERSION) +APPLICATION_EXTENSION_API_ONLY = YES +CLANG_CXX_LANGUAGE_STANDARD = gnu++14 +CLANG_CXX_LIBRARY = libc++ +HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/asio" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/include" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/polarssl/include" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/openvpn" +LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/sim" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/polarssl/lib/sim" +LIBRARY_SEARCH_PATHS[sdk=iphoneos*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/ios" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/polarssl/lib/ios" +LIBRARY_SEARCH_PATHS[sdk=macosx*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/macos" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/polarssl/lib/macos" +OTHER_LDFLAGS = -lmbedtls -llz4 +OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS) -DASIO_STANDALONE -DASIO_NO_DEPRECATED -DHAVE_LZ4 -DUSE_POLARSSL -DOPENVPN_FORCE_TUN_NULL -DUSE_TUN_BUILDER +GCC_WARN_64_TO_32_BIT_CONVERSION = NO diff --git a/OpenVPN Adapter/Info.plist b/Configuration/Info-Framework.plist similarity index 100% rename from OpenVPN Adapter/Info.plist rename to Configuration/Info-Framework.plist diff --git a/Configuration/Info-Tests.plist b/Configuration/Info-Tests.plist new file mode 100644 index 0000000..6c6c23c --- /dev/null +++ b/Configuration/Info-Tests.plist @@ -0,0 +1,22 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleVersion + 1 + + diff --git a/Configuration/Project.xcconfig b/Configuration/Project.xcconfig new file mode 100755 index 0000000..2e71b19 --- /dev/null +++ b/Configuration/Project.xcconfig @@ -0,0 +1,29 @@ +SUPPORTED_PLATFORMS = iphoneos iphonesimulator macosx +TARGETED_DEVICE_FAMILY = 1,2 + +//////////////////////////////////////////////////////////////////////////////// +// +// iOS-specific settings +// +IPHONEOS_DEPLOYMENT_TARGET = 9.0 + +VALID_ARCHS[sdk=iphoneos*] = arm64 armv7 armv7s +VALID_ARCHS[sdk=iphonesimulator*] = i386 x86_64 + +LD_RUNPATH_SEARCH_PATHS[sdk=iphoneos*] = @executable_path/Frameworks @loader_path/Frameworks +LD_RUNPATH_SEARCH_PATHS[sdk=iphonesimulator*] = @executable_path/Frameworks @loader_path/Frameworks + +ENABLE_BITCODE[sdk=iphonesimulator*] = NO +ENABLE_BITCODE[sdk=iphone*] = NO + +//////////////////////////////////////////////////////////////////////////////// +// +// macOS-specific settings +// +MACOSX_DEPLOYMENT_TARGET = 10.11 + +VALID_ARCHS[sdk=macosx*] = i386 x86_64 + +LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = @executable_path/../Frameworks @loader_path/../Frameworks + +ENABLE_BITCODE[sdk=macosx*] = NO diff --git a/Configuration/Release.xcconfig b/Configuration/Release.xcconfig new file mode 100755 index 0000000..72d6b83 --- /dev/null +++ b/Configuration/Release.xcconfig @@ -0,0 +1,5 @@ +#include "Framework.xcconfig" + +ONLY_ACTIVE_ARCH = NO +SWIFT_OPTIMIZATION_LEVEL = -Owholemodule +BITCODE_GENERATION_MODE = bitcode diff --git a/Configuration/Tests.xcconfig b/Configuration/Tests.xcconfig new file mode 100755 index 0000000..ea91c4f --- /dev/null +++ b/Configuration/Tests.xcconfig @@ -0,0 +1,5 @@ +INFOPLIST_FILE = Configuration/Info-Tests.plist +PRODUCT_NAME = OpenVPN Adapter Tests +PRODUCT_BUNDLE_IDENTIFIER = me.ss-abramchuk.openvpn-adapter.test +SWIFT_OPTIMIZATION_LEVEL = -Onone +ONLY_ACTIVE_ARCH = YES diff --git a/OpenVPN Adapter Tests/Bundle.swift b/OpenVPN Adapter Tests/Bundle.swift new file mode 100644 index 0000000..1b8d8f7 --- /dev/null +++ b/OpenVPN Adapter Tests/Bundle.swift @@ -0,0 +1,19 @@ +// +// Bundle.swift +// OpenVPN iOS Client +// +// Created by Sergey Abramchuk on 09.03.17. +// +// + +import Foundation + +private final class BundleHelper {} + +extension Bundle { + + static var current: Bundle { + return Bundle(for: BundleHelper.self) + } + +} diff --git a/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift new file mode 100644 index 0000000..ddfbd5b --- /dev/null +++ b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift @@ -0,0 +1,89 @@ +// +// OpenVPN_Adapter_Tests.swift +// OpenVPN Adapter Tests +// +// Created by Sergey Abramchuk on 09.03.17. +// +// + +import XCTest +import NetworkExtension +@testable import OpenVPNAdapter + +class OpenVPNAdapterTests: XCTestCase { + + let vpnConfiguration = "free_openvpn_udp" + + var vpnAdapterExpectation: XCTestExpectation? + + override func setUp() { + super.setUp() + } + + override func tearDown() { + vpnAdapterExpectation = nil + + super.tearDown() + } + + // Test connection without specifying username and password + func testConectionWithoutCredentials() { + let configuration = getVPNConfiguration() + + let adapter = OpenVPNAdapter() + do { + try adapter.configure(using: configuration) + } catch { + XCTFail("Failed to configure OpenVPN adapted due to error: \(error)") + } + + vpnAdapterExpectation = expectation(description: "me.ss-abramchuk.openvpn-adapter.connection-w/o-credentials") + + adapter.delegate = self + adapter.connect() + + waitForExpectations(timeout: 10.0) { (error) in + adapter.disconnect() + } + } + +} + +extension OpenVPNAdapterTests { + + func getVPNConfiguration() -> Data { + guard + let path = Bundle.current.url(forResource: vpnConfiguration, withExtension: "ovpn"), + let configuration = try? Data(contentsOf: path) + else { + fatalError("Failed to retrieve OpenVPN configuration") + } + + return configuration + } + +} + +extension OpenVPNAdapterTests: OpenVPNAdapterDelegate { + + func configureTunnel(settings: NEPacketTunnelNetworkSettings, callback: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { + callback(self) + } + + func handle(event: OpenVPNEvent, message: String?) { + + } + + func handle(error: Error) { + + } + +} + +extension OpenVPNAdapterTests: OpenVPNAdapterPacketFlow { + + func readPackets(completionHandler: @escaping ([Data], [NSNumber]) -> Void) { } + + func writePackets(_ packets: [Data], withProtocols protocols: [NSNumber]) -> Bool { return true } + +} diff --git a/OpenVPN Adapter Tests/Resources/free_openvpn_udp.ovpn b/OpenVPN Adapter Tests/Resources/free_openvpn_udp.ovpn new file mode 100644 index 0000000..0805772 --- /dev/null +++ b/OpenVPN Adapter Tests/Resources/free_openvpn_udp.ovpn @@ -0,0 +1,84 @@ +############################### +# FreeOpenVPN.Org config file # +# https://www.freeopenvpn.org # +############################### +dev tun +proto udp +remote 71.83.197.219 1287 +cipher AES-128-CBC +auth SHA1 +resolv-retry infinite +nobind +persist-key +persist-tun +client +verb 3 + +-----BEGIN CERTIFICATE----- +MIIDHjCCAgagAwIBAgIFFBVZERgwDQYJKoZIhvcNAQELBQAwRjEbMBkGA1UEAwwS +bzk1OTQ5d2s2cHhmZXMub3JnMRowGAYDVQQKDBFmbGhncSA1YTZwODMzbTdoOTEL +MAkGA1UEBhMCVVMwHhcNMTcwMTE0MDEzNTA0WhcNMjQwODI4MDEzNTA0WjBGMRsw +GQYDVQQDDBJvOTU5NDl3azZweGZlcy5vcmcxGjAYBgNVBAoMEWZsaGdxIDVhNnA4 +MzNtN2g5MQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC +ggEBANM5r0SjINmEXPnG6birUIcWIS+8Vxw2BX/baKfk7HF5K+/IsbRVWPO+gFdV +1DHyw+uM8PhRvE68doGKMsb4TRMzk2FcFPu3QZ0gFX2qM+6GMF9EnoQa2zpIVba1 +etzWBJUyJ4ma/PPJbxt7iIL8S5q9wNPXsaukRRLw8ZGkoh2Hx25Q6KsUZhiyxpTX +NiMrzl/bdNlhHr4oibIOHHR6F4Q2oH3Z/0xBLKUOdtLmyJU2SGdCP9Vodd5vBhIH +NBEb1QsVutaFvMHO9Fmuk9Uu5Bm7wh5KBrc1RHWdpGtWVMMJK07bchbrJy0Uc38S ++Hko+yOJA/ieTraTMxL/qy/oj1cCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN +BgkqhkiG9w0BAQsFAAOCAQEAIUxFjVEdejXLIRnnEZjS/T/XGbH4NS5uclNWqxGP +skbY0tGCUXQPiX9CgZJeuAS0a8FFp9gAnIwaRVJQ5mktsCV/bTmIVL4XzjLiVo0F +FAGx99KasWClPUa89U9/13nwSBMh/Nw3LEuM0aZ9Q3oM2QkOooGQbQwErqUT9bBi +wNuedZ4eo0sMOmSOr1wpo7u7Nt15Xp7jHaNv0uW92wpeAXpqGAHKINbiNBHaHLqK +u6veAlEWSg5YVDYPfS379bRqm+2YvcdJKhbkbmNpVYEahLYTn/Y18e5ITF/Njk+K +A1az9seo85coDXaH5YmvDDM5JjwrXGKMTIDr7ZkweT5qNQ== +-----END CERTIFICATE----- + + +-----BEGIN CERTIFICATE----- +MIICxjCCAa4CAQAwDQYJKoZIhvcNAQEFBQAwKTEaMBgGA1UEAxMRVlBOR2F0ZUNs +aWVudENlcnQxCzAJBgNVBAYTAkpQMB4XDTEzMDIxMTAzNDk0OVoXDTM3MDExOTAz +MTQwN1owKTEaMBgGA1UEAxMRVlBOR2F0ZUNsaWVudENlcnQxCzAJBgNVBAYTAkpQ +MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5h2lgQQYUjwoKYJbzVZA +5VcIGd5otPc/qZRMt0KItCFA0s9RwReNVa9fDRFLRBhcITOlv3FBcW3E8h1Us7RD +4W8GmJe8zapJnLsD39OSMRCzZJnczW4OCH1PZRZWKqDtjlNca9AF8a65jTmlDxCQ +CjntLIWk5OLLVkFt9/tScc1GDtci55ofhaNAYMPiH7V8+1g66pGHXAoWK6AQVH67 +XCKJnGB5nlQ+HsMYPV/O49Ld91ZN/2tHkcaLLyNtywxVPRSsRh480jju0fcCsv6h +p/0yXnTB//mWutBGpdUlIbwiITbAmrsbYnjigRvnPqX1RNJUbi9Fp6C2c/HIFJGD +ywIDAQABMA0GCSqGSIb3DQEBBQUAA4IBAQChO5hgcw/4oWfoEFLu9kBa1B//kxH8 +hQkChVNn8BRC7Y0URQitPl3DKEed9URBDdg2KOAz77bb6ENPiliD+a38UJHIRMqe +UBHhllOHIzvDhHFbaovALBQceeBzdkQxsKQESKmQmR832950UCovoyRB61UyAV7h ++mZhYPGRKXKSJI6s0Egg/Cri+Cwk4bjJfrb5hVse11yh4D9MHhwSfCOH+0z4hPUT +Fku7dGavURO5SVxMn/sL6En5D+oSeXkadHpDs+Airym2YHh15h0+jPSOoR6yiVp/ +6zZeZkrN43kuS73KpKDFjfFPh8t4r1gOIjttkNcQqBccusnplQ7HJpsk +-----END CERTIFICATE----- + + +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEA5h2lgQQYUjwoKYJbzVZA5VcIGd5otPc/qZRMt0KItCFA0s9R +wReNVa9fDRFLRBhcITOlv3FBcW3E8h1Us7RD4W8GmJe8zapJnLsD39OSMRCzZJnc +zW4OCH1PZRZWKqDtjlNca9AF8a65jTmlDxCQCjntLIWk5OLLVkFt9/tScc1GDtci +55ofhaNAYMPiH7V8+1g66pGHXAoWK6AQVH67XCKJnGB5nlQ+HsMYPV/O49Ld91ZN +/2tHkcaLLyNtywxVPRSsRh480jju0fcCsv6hp/0yXnTB//mWutBGpdUlIbwiITbA +mrsbYnjigRvnPqX1RNJUbi9Fp6C2c/HIFJGDywIDAQABAoIBAERV7X5AvxA8uRiK +k8SIpsD0dX1pJOMIwakUVyvc4EfN0DhKRNb4rYoSiEGTLyzLpyBc/A28Dlkm5eOY +fjzXfYkGtYi/Ftxkg3O9vcrMQ4+6i+uGHaIL2rL+s4MrfO8v1xv6+Wky33EEGCou +QiwVGRFQXnRoQ62NBCFbUNLhmXwdj1akZzLU4p5R4zA3QhdxwEIatVLt0+7owLQ3 +lP8sfXhppPOXjTqMD4QkYwzPAa8/zF7acn4kryrUP7Q6PAfd0zEVqNy9ZCZ9ffho +zXedFj486IFoc5gnTp2N6jsnVj4LCGIhlVHlYGozKKFqJcQVGsHCqq1oz2zjW6LS +oRYIHgECgYEA8zZrkCwNYSXJuODJ3m/hOLVxcxgJuwXoiErWd0E42vPanjjVMhnt +KY5l8qGMJ6FhK9LYx2qCrf/E0XtUAZ2wVq3ORTyGnsMWre9tLYs55X+ZN10Tc75z +4hacbU0hqKN1HiDmsMRY3/2NaZHoy7MKnwJJBaG48l9CCTlVwMHocIECgYEA8jby +dGjxTH+6XHWNizb5SRbZxAnyEeJeRwTMh0gGzwGPpH/sZYGzyu0SySXWCnZh3Rgq +5uLlNxtrXrljZlyi2nQdQgsq2YrWUs0+zgU+22uQsZpSAftmhVrtvet6MjVjbByY +DADciEVUdJYIXk+qnFUJyeroLIkTj7WYKZ6RjksCgYBoCFIwRDeg42oK89RFmnOr +LymNAq4+2oMhsWlVb4ejWIWeAk9nc+GXUfrXszRhS01mUnU5r5ygUvRcarV/T3U7 +TnMZ+I7Y4DgWRIDd51znhxIBtYV5j/C/t85HjqOkH+8b6RTkbchaX3mau7fpUfds +Fq0nhIq42fhEO8srfYYwgQKBgQCyhi1N/8taRwpk+3/IDEzQwjbfdzUkWWSDk9Xs +H/pkuRHWfTMP3flWqEYgW/LW40peW2HDq5imdV8+AgZxe/XMbaji9Lgwf1RY005n +KxaZQz7yqHupWlLGF68DPHxkZVVSagDnV/sztWX6SFsCqFVnxIXifXGC4cW5Nm9g +va8q4QKBgQCEhLVeUfdwKvkZ94g/GFz731Z2hrdVhgMZaU/u6t0V95+YezPNCQZB +wmE9Mmlbq1emDeROivjCfoGhR3kZXW1pTKlLh6ZMUQUOpptdXva8XxfoqQwa3enA +M7muBbF0XN7VO80iJPv+PmIZdEIAkpwKfi201YB+BafCIuGxIF50Vg== +-----END RSA PRIVATE KEY----- + diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 188f819..121c022 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -12,6 +12,8 @@ @class NEPacketTunnelNetworkSettings; +// TODO: Add documentation to properties and methods + @protocol OpenVPNAdapterPacketFlow - (void)readPacketsWithCompletionHandler:(nonnull void (^)(NSArray * _Nonnull packets, NSArray * _Nonnull protocols))completionHandler; diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index b44c35c..fc7989d 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -5,8 +5,11 @@ // Created by Sergey Abramchuk on 09.03.17. // // - -#import +#if TARGET_OS_IPHONE || TARGET_IPHONE_SIMULATO +@import UIKit; +#else +@import AppKit; +#endif //! Project version number for OpenVPNAdapter. FOUNDATION_EXPORT double OpenVPNAdapterVersionNumber; diff --git a/OpenVPN Adapter/Vendors/lz4/lib/macos/liblz4.a b/OpenVPN Adapter/Vendors/lz4/lib/macos/liblz4.a new file mode 100644 index 0000000..e701a08 Binary files /dev/null and b/OpenVPN Adapter/Vendors/lz4/lib/macos/liblz4.a differ diff --git a/OpenVPN Adapter/Vendors/polarssl/lib/macos/libmbedtls.a b/OpenVPN Adapter/Vendors/polarssl/lib/macos/libmbedtls.a new file mode 100644 index 0000000..c16ff70 Binary files /dev/null and b/OpenVPN Adapter/Vendors/polarssl/lib/macos/libmbedtls.a differ diff --git a/OpenVPN iOS Client.xcodeproj/project.pbxproj b/OpenVPN Client.xcodeproj/project.pbxproj similarity index 70% rename from OpenVPN iOS Client.xcodeproj/project.pbxproj rename to OpenVPN Client.xcodeproj/project.pbxproj index 2769b48..6b59adc 100644 --- a/OpenVPN iOS Client.xcodeproj/project.pbxproj +++ b/OpenVPN Client.xcodeproj/project.pbxproj @@ -7,14 +7,18 @@ objects = { /* Begin PBXBuildFile section */ + C90BAD201E73ECE800DEFB32 /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; }; + C90BAD311E73FF6C00DEFB32 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; }; C91031061E47237A0004DFFE /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91031051E47237A0004DFFE /* AppDelegate.swift */; }; C910310B1E47237A0004DFFE /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C91031091E47237A0004DFFE /* Main.storyboard */; }; C910310D1E47237A0004DFFE /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = C910310C1E47237A0004DFFE /* Assets.xcassets */; }; C91031101E47237A0004DFFE /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = C910310E1E47237A0004DFFE /* LaunchScreen.storyboard */; }; C91031271E4727E20004DFFE /* PacketTunnelProvider.swift in Sources */ = {isa = PBXBuildFile; fileRef = C91031261E4727E20004DFFE /* PacketTunnelProvider.swift */; }; - C910312B1E4727E20004DFFE /* OpenVPN Tunnel Provider.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C91031221E4727E20004DFFE /* OpenVPN Tunnel Provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; + C910312B1E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex in Embed App Extensions */ = {isa = PBXBuildFile; fileRef = C91031221E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex */; settings = {ATTRIBUTES = (RemoveHeadersOnCopy, ); }; }; C91031381E472C870004DFFE /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C91031371E472C870004DFFE /* KeychainAccess.framework */; }; C91031391E472C9C0004DFFE /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C91031371E472C870004DFFE /* KeychainAccess.framework */; }; + C92638FC1E71B4B500B3D77A /* NEPacketTunnelFlow+OpenVPN.swift in Sources */ = {isa = PBXBuildFile; fileRef = C92638FB1E71B4B500B3D77A /* NEPacketTunnelFlow+OpenVPN.swift */; }; + C92638FF1E71BF9C00B3D77A /* Then.swift in Sources */ = {isa = PBXBuildFile; fileRef = C92638FE1E71BF9C00B3D77A /* Then.swift */; }; C928AD731E6E952F00DA04BD /* KeychainAccess+Reference.swift in Sources */ = {isa = PBXBuildFile; fileRef = C928AD721E6E952F00DA04BD /* KeychainAccess+Reference.swift */; }; C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB476C1E716AEE00F3F98C /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9BB476A1E716AEE00F3F98C /* ovpncli.hpp */; }; @@ -30,7 +34,10 @@ C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; }; C9BB47841E71762C00F3F98C /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB47831E71762C00F3F98C /* NetworkExtension.framework */; }; - C9BB47851E71770C00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; }; + C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; }; + C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; }; + C9BB479C1E71836100F3F98C /* free_openvpn_udp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */; }; + C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ @@ -41,6 +48,13 @@ remoteGlobalIDString = C91031211E4727E20004DFFE; remoteInfo = "OpenVPN Tunnel Provider"; }; + C9BB47941E71821A00F3F98C /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = C91030F81E471D760004DFFE /* Project object */; + proxyType = 1; + remoteGlobalIDString = C9BB475B1E71663A00F3F98C; + remoteInfo = "OpenVPN Adapter"; + }; /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ @@ -50,7 +64,7 @@ dstPath = ""; dstSubfolderSpec = 13; files = ( - C910312B1E4727E20004DFFE /* OpenVPN Tunnel Provider.appex in Embed App Extensions */, + C910312B1E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex in Embed App Extensions */, ); name = "Embed App Extensions"; runOnlyForDeploymentPostprocessing = 0; @@ -58,22 +72,32 @@ /* End PBXCopyFilesBuildPhase section */ /* Begin PBXFileReference section */ - C91031021E47237A0004DFFE /* OpenVPN Client.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OpenVPN Client.app"; sourceTree = BUILT_PRODUCTS_DIR; }; + C90BAD1E1E73E44E00DEFB32 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; + C90BAD261E73F47E00DEFB32 /* Info-Framework.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Framework.plist"; sourceTree = ""; }; + C90BAD271E73F47E00DEFB32 /* Info-Tests.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "Info-Tests.plist"; sourceTree = ""; }; + C90BAD291E73F56800DEFB32 /* Framework.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Framework.xcconfig; sourceTree = ""; }; + C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Project.xcconfig; sourceTree = ""; }; + C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Debug.xcconfig; sourceTree = ""; }; + C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.xcconfig; path = Release.xcconfig; sourceTree = ""; }; + C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Tests.xcconfig; sourceTree = ""; }; + C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; }; + C91031021E47237A0004DFFE /* OpenVPN iOS Client.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "OpenVPN iOS Client.app"; sourceTree = BUILT_PRODUCTS_DIR; }; C91031051E47237A0004DFFE /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; C910310A1E47237A0004DFFE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; C910310C1E47237A0004DFFE /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; C910310F1E47237A0004DFFE /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; C91031111E47237A0004DFFE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - C91031221E4727E20004DFFE /* OpenVPN Tunnel Provider.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "OpenVPN Tunnel Provider.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; - C91031251E4727E20004DFFE /* OpenVPN Tunnel Provider.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenVPN Tunnel Provider.entitlements"; sourceTree = ""; }; + C91031221E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex */ = {isa = PBXFileReference; explicitFileType = "wrapper.app-extension"; includeInIndex = 0; path = "OpenVPN iOS Tunnel Provider.appex"; sourceTree = BUILT_PRODUCTS_DIR; }; + C91031251E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenVPN iOS Tunnel Provider.entitlements"; sourceTree = ""; }; C91031261E4727E20004DFFE /* PacketTunnelProvider.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PacketTunnelProvider.swift; sourceTree = ""; }; C91031281E4727E20004DFFE /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C91031371E472C870004DFFE /* KeychainAccess.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = KeychainAccess.framework; path = Carthage/Build/iOS/KeychainAccess.framework; sourceTree = ""; }; + C92638FB1E71B4B500B3D77A /* NEPacketTunnelFlow+OpenVPN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "NEPacketTunnelFlow+OpenVPN.swift"; sourceTree = ""; }; + C92638FE1E71BF9C00B3D77A /* Then.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Then.swift; sourceTree = ""; }; C928AD721E6E952F00DA04BD /* KeychainAccess+Reference.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = "KeychainAccess+Reference.swift"; sourceTree = ""; }; - C9990B361E62F0E800474227 /* OpenVPN Client.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenVPN Client.entitlements"; sourceTree = ""; }; + C9990B361E62F0E800474227 /* OpenVPN iOS Client.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = "OpenVPN iOS Client.entitlements"; sourceTree = ""; }; C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Umbrella-Header.h"; sourceTree = ""; }; - C9BB475F1E71663A00F3F98C /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; C9BB476A1E716AEE00F3F98C /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/openvpn/client/ovpncli.hpp; sourceTree = ""; }; C9BB476B1E716AEE00F3F98C /* ovpncli.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ovpncli.cpp; path = Vendors/openvpn/openvpn/client/ovpncli.cpp; sourceTree = ""; }; C9BB476F1E7171A100F3F98C /* OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OpenVPNError.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -87,6 +111,10 @@ C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNAdapter+Public.h"; sourceTree = ""; }; C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = OpenVPNAdapter.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C9BB47831E71762C00F3F98C /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS10.2.sdk/System/Library/Frameworks/NetworkExtension.framework; sourceTree = DEVELOPER_DIR; }; + C9BB478E1E71821A00F3F98C /* OpenVPN Adapter Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenVPN Adapter Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; + C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = ""; }; + C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp.ovpn; sourceTree = ""; }; + C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ @@ -102,7 +130,7 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - C9BB47851E71770C00F3F98C /* OpenVPNAdapter.framework in Frameworks */, + C90BAD201E73ECE800DEFB32 /* OpenVPNAdapter.framework in Frameworks */, C91031381E472C870004DFFE /* KeychainAccess.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -111,19 +139,44 @@ isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( + C90BAD311E73FF6C00DEFB32 /* SystemConfiguration.framework in Frameworks */, C9BB47841E71762C00F3F98C /* NetworkExtension.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; + C9BB478B1E71821A00F3F98C /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ + C90BAD251E73F47E00DEFB32 /* Configuration */ = { + isa = PBXGroup; + children = ( + C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */, + C90BAD291E73F56800DEFB32 /* Framework.xcconfig */, + C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */, + C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */, + C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */, + C90BAD261E73F47E00DEFB32 /* Info-Framework.plist */, + C90BAD271E73F47E00DEFB32 /* Info-Tests.plist */, + ); + path = Configuration; + sourceTree = ""; + }; C91030F71E471D760004DFFE = { isa = PBXGroup; children = ( - C91031041E47237A0004DFFE /* OpenVPN Client */, + C90BAD251E73F47E00DEFB32 /* Configuration */, C9BB475D1E71663A00F3F98C /* OpenVPN Adapter */, - C91031231E4727E20004DFFE /* OpenVPN Tunnel Provider */, + C9BB478F1E71821A00F3F98C /* OpenVPN Adapter Tests */, + C91031041E47237A0004DFFE /* OpenVPN iOS Client */, + C91031231E4727E20004DFFE /* OpenVPN iOS Tunnel Provider */, C91031031E47237A0004DFFE /* Products */, C91031361E472C870004DFFE /* Frameworks */, ); @@ -132,14 +185,15 @@ C91031031E47237A0004DFFE /* Products */ = { isa = PBXGroup; children = ( - C91031021E47237A0004DFFE /* OpenVPN Client.app */, - C91031221E4727E20004DFFE /* OpenVPN Tunnel Provider.appex */, + C91031021E47237A0004DFFE /* OpenVPN iOS Client.app */, + C91031221E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex */, C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */, + C9BB478E1E71821A00F3F98C /* OpenVPN Adapter Tests.xctest */, ); name = Products; sourceTree = ""; }; - C91031041E47237A0004DFFE /* OpenVPN Client */ = { + C91031041E47237A0004DFFE /* OpenVPN iOS Client */ = { isa = PBXGroup; children = ( C91031151E47242D0004DFFE /* Controllers */, @@ -148,7 +202,7 @@ C910311C1E4724FE0004DFFE /* Resources */, C91031161E4724660004DFFE /* Application */, ); - path = "OpenVPN Client"; + path = "OpenVPN iOS Client"; sourceTree = ""; }; C91031151E47242D0004DFFE /* Controllers */ = { @@ -179,7 +233,7 @@ C91031181E4724A90004DFFE /* Configuration */ = { isa = PBXGroup; children = ( - C9990B361E62F0E800474227 /* OpenVPN Client.entitlements */, + C9990B361E62F0E800474227 /* OpenVPN iOS Client.entitlements */, C91031111E47237A0004DFFE /* Info.plist */, ); name = Configuration; @@ -217,22 +271,20 @@ name = Resources; sourceTree = ""; }; - C91031231E4727E20004DFFE /* OpenVPN Tunnel Provider */ = { + C91031231E4727E20004DFFE /* OpenVPN iOS Tunnel Provider */ = { isa = PBXGroup; children = ( C91031301E4728F10004DFFE /* Libraries */, C91031321E4729120004DFFE /* Provider */, ); - path = "OpenVPN Tunnel Provider"; + path = "OpenVPN iOS Tunnel Provider"; sourceTree = ""; }; C91031301E4728F10004DFFE /* Libraries */ = { isa = PBXGroup; children = ( - C91031331E4729220004DFFE /* Base */, C91031341E4729270004DFFE /* Helpers */, C91031311E4728F70004DFFE /* Configuration */, - C91031351E4729D60004DFFE /* Vendors */, ); name = Libraries; sourceTree = ""; @@ -241,7 +293,7 @@ isa = PBXGroup; children = ( C91031281E4727E20004DFFE /* Info.plist */, - C91031251E4727E20004DFFE /* OpenVPN Tunnel Provider.entitlements */, + C91031251E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.entitlements */, ); name = Configuration; sourceTree = ""; @@ -254,41 +306,39 @@ name = Provider; sourceTree = ""; }; - C91031331E4729220004DFFE /* Base */ = { - isa = PBXGroup; - children = ( - ); - name = Base; - sourceTree = ""; - }; C91031341E4729270004DFFE /* Helpers */ = { isa = PBXGroup; children = ( C928AD711E6E94FE00DA04BD /* Extensions */, + C92638FD1E71BF7D00B3D77A /* Utils */, ); name = Helpers; sourceTree = ""; }; - C91031351E4729D60004DFFE /* Vendors */ = { - isa = PBXGroup; - children = ( - ); - name = Vendors; - sourceTree = ""; - }; C91031361E472C870004DFFE /* Frameworks */ = { isa = PBXGroup; children = ( + C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */, + C90BAD1E1E73E44E00DEFB32 /* NetworkExtension.framework */, C9BB47831E71762C00F3F98C /* NetworkExtension.framework */, C91031371E472C870004DFFE /* KeychainAccess.framework */, ); name = Frameworks; sourceTree = ""; }; + C92638FD1E71BF7D00B3D77A /* Utils */ = { + isa = PBXGroup; + children = ( + C92638FE1E71BF9C00B3D77A /* Then.swift */, + ); + name = Utils; + sourceTree = ""; + }; C928AD711E6E94FE00DA04BD /* Extensions */ = { isa = PBXGroup; children = ( C928AD721E6E952F00DA04BD /* KeychainAccess+Reference.swift */, + C92638FB1E71B4B500B3D77A /* NEPacketTunnelFlow+OpenVPN.swift */, ); name = Extensions; sourceTree = ""; @@ -307,7 +357,6 @@ isa = PBXGroup; children = ( C9BB47681E716ABF00F3F98C /* Vendors */, - C9BB47661E7169C400F3F98C /* Configuration */, ); name = Libraries; sourceTree = ""; @@ -320,14 +369,6 @@ name = Framework; sourceTree = ""; }; - C9BB47661E7169C400F3F98C /* Configuration */ = { - isa = PBXGroup; - children = ( - C9BB475F1E71663A00F3F98C /* Info.plist */, - ); - name = Configuration; - sourceTree = ""; - }; C9BB47671E7169F000F3F98C /* Adapter */ = { isa = PBXGroup; children = ( @@ -362,6 +403,56 @@ name = OpenVPN; sourceTree = ""; }; + C9BB478F1E71821A00F3F98C /* OpenVPN Adapter Tests */ = { + isa = PBXGroup; + children = ( + C9BB479D1E71837200F3F98C /* Adapter Tests */, + C9BB479E1E7183B800F3F98C /* Libraries */, + C9BB479A1E71836100F3F98C /* Resources */, + ); + path = "OpenVPN Adapter Tests"; + sourceTree = ""; + }; + C9BB479A1E71836100F3F98C /* Resources */ = { + isa = PBXGroup; + children = ( + C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */, + ); + path = Resources; + sourceTree = ""; + }; + C9BB479D1E71837200F3F98C /* Adapter Tests */ = { + isa = PBXGroup; + children = ( + C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */, + ); + name = "Adapter Tests"; + sourceTree = ""; + }; + C9BB479E1E7183B800F3F98C /* Libraries */ = { + isa = PBXGroup; + children = ( + C9BB479F1E7183C200F3F98C /* Helpers */, + ); + name = Libraries; + sourceTree = ""; + }; + C9BB479F1E7183C200F3F98C /* Helpers */ = { + isa = PBXGroup; + children = ( + C9BB47A01E7183CA00F3F98C /* Utils */, + ); + name = Helpers; + sourceTree = ""; + }; + C9BB47A01E7183CA00F3F98C /* Utils */ = { + isa = PBXGroup; + children = ( + C9BB47A11E7183DB00F3F98C /* Bundle.swift */, + ); + name = Utils; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ @@ -384,9 +475,9 @@ /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - C91031011E47237A0004DFFE /* OpenVPN Client */ = { + C91031011E47237A0004DFFE /* OpenVPN iOS Client */ = { isa = PBXNativeTarget; - buildConfigurationList = C91031141E47237A0004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN Client" */; + buildConfigurationList = C91031141E47237A0004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN iOS Client" */; buildPhases = ( C910311D1E4725740004DFFE /* Check Warning And Error Tags */, C91030FE1E47237A0004DFFE /* Sources */, @@ -400,14 +491,14 @@ dependencies = ( C910312A1E4727E20004DFFE /* PBXTargetDependency */, ); - name = "OpenVPN Client"; + name = "OpenVPN iOS Client"; productName = "OpenVPN Client"; - productReference = C91031021E47237A0004DFFE /* OpenVPN Client.app */; + productReference = C91031021E47237A0004DFFE /* OpenVPN iOS Client.app */; productType = "com.apple.product-type.application"; }; - C91031211E4727E20004DFFE /* OpenVPN Tunnel Provider */ = { + C91031211E4727E20004DFFE /* OpenVPN iOS Tunnel Provider */ = { isa = PBXNativeTarget; - buildConfigurationList = C910312C1E4727E20004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN Tunnel Provider" */; + buildConfigurationList = C910312C1E4727E20004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN iOS Tunnel Provider" */; buildPhases = ( C910313D1E472E170004DFFE /* Check Warning And Error Tags */, C910311E1E4727E20004DFFE /* Sources */, @@ -419,9 +510,9 @@ ); dependencies = ( ); - name = "OpenVPN Tunnel Provider"; + name = "OpenVPN iOS Tunnel Provider"; productName = "OpenVPN Tunnel Provider"; - productReference = C91031221E4727E20004DFFE /* OpenVPN Tunnel Provider.appex */; + productReference = C91031221E4727E20004DFFE /* OpenVPN iOS Tunnel Provider.appex */; productType = "com.apple.product-type.app-extension"; }; C9BB475B1E71663A00F3F98C /* OpenVPN Adapter */ = { @@ -443,6 +534,24 @@ productReference = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; productType = "com.apple.product-type.framework"; }; + C9BB478D1E71821A00F3F98C /* OpenVPN Adapter Tests */ = { + isa = PBXNativeTarget; + buildConfigurationList = C9BB47961E71821A00F3F98C /* Build configuration list for PBXNativeTarget "OpenVPN Adapter Tests" */; + buildPhases = ( + C9BB478A1E71821A00F3F98C /* Sources */, + C9BB478B1E71821A00F3F98C /* Frameworks */, + C9BB478C1E71821A00F3F98C /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + C9BB47951E71821A00F3F98C /* PBXTargetDependency */, + ); + name = "OpenVPN Adapter Tests"; + productName = "OpenVPN Adapter Tests"; + productReference = C9BB478E1E71821A00F3F98C /* OpenVPN Adapter Tests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; /* End PBXNativeTarget section */ /* Begin PBXProject section */ @@ -483,9 +592,14 @@ CreatedOnToolsVersion = 8.2.1; ProvisioningStyle = Manual; }; + C9BB478D1E71821A00F3F98C = { + CreatedOnToolsVersion = 8.2.1; + DevelopmentTeam = 2TWXCGG7R3; + ProvisioningStyle = Manual; + }; }; }; - buildConfigurationList = C91030FB1E471D760004DFFE /* Build configuration list for PBXProject "OpenVPN iOS Client" */; + buildConfigurationList = C91030FB1E471D760004DFFE /* Build configuration list for PBXProject "OpenVPN Client" */; compatibilityVersion = "Xcode 3.2"; developmentRegion = English; hasScannedForEncodings = 0; @@ -498,9 +612,10 @@ projectDirPath = ""; projectRoot = ""; targets = ( - C91031011E47237A0004DFFE /* OpenVPN Client */, C9BB475B1E71663A00F3F98C /* OpenVPN Adapter */, - C91031211E4727E20004DFFE /* OpenVPN Tunnel Provider */, + C9BB478D1E71821A00F3F98C /* OpenVPN Adapter Tests */, + C91031011E47237A0004DFFE /* OpenVPN iOS Client */, + C91031211E4727E20004DFFE /* OpenVPN iOS Tunnel Provider */, ); }; /* End PBXProject section */ @@ -530,6 +645,14 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C9BB478C1E71821A00F3F98C /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C9BB479C1E71836100F3F98C /* free_openvpn_udp.ovpn in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXResourcesBuildPhase section */ /* Begin PBXShellScriptBuildPhase section */ @@ -603,7 +726,7 @@ ); runOnlyForDeploymentPostprocessing = 0; shellPath = /bin/sh; - shellScript = "TAGS=\"TODO:|FIXME:|\\?\\?\\?|\\!\\!\\!\"\nERRORTAG=\"ERROR:\"\nfind \"${SRCROOT}/${TARGET_NAME}\" \\( -name \"*.h\" -or -name \"*.mm\" -or -name \"*.m\" -or -name \"*.swift\" \\) ! -path \"*/Vendors/*\" -print0 | xargs -0 egrep --with-filename --line-number --only-matching \"($TAGS).*\\$|($ERRORTAG).*\\$\" | perl -p -e \"s/($TAGS)/ warning: \\$1/\" | perl -p -e \"s/($ERRORTAG)/ error: \\$1/\""; + shellScript = "TAGS=\"TODO:|FIXME:|\\?\\?\\?|\\!\\!\\!\"\nERRORTAG=\"ERROR:\"\nfind \"${SRCROOT}/OpenVPN Adapter\" \\( -name \"*.h\" -or -name \"*.mm\" -or -name \"*.m\" -or -name \"*.swift\" \\) ! -path \"*/Vendors/*\" -print0 | xargs -0 egrep --with-filename --line-number --only-matching \"($TAGS).*\\$|($ERRORTAG).*\\$\" | perl -p -e \"s/($TAGS)/ warning: \\$1/\" | perl -p -e \"s/($ERRORTAG)/ error: \\$1/\""; }; /* End PBXShellScriptBuildPhase section */ @@ -620,6 +743,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C92638FF1E71BF9C00B3D77A /* Then.swift in Sources */, + C92638FC1E71B4B500B3D77A /* NEPacketTunnelFlow+OpenVPN.swift in Sources */, C91031271E4727E20004DFFE /* PacketTunnelProvider.swift in Sources */, C928AD731E6E952F00DA04BD /* KeychainAccess+Reference.swift in Sources */, ); @@ -636,14 +761,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; + C9BB478A1E71821A00F3F98C /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */, + C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ C910312A1E4727E20004DFFE /* PBXTargetDependency */ = { isa = PBXTargetDependency; - target = C91031211E4727E20004DFFE /* OpenVPN Tunnel Provider */; + target = C91031211E4727E20004DFFE /* OpenVPN iOS Tunnel Provider */; targetProxy = C91031291E4727E20004DFFE /* PBXContainerItemProxy */; }; + C9BB47951E71821A00F3F98C /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = C9BB475B1E71663A00F3F98C /* OpenVPN Adapter */; + targetProxy = C9BB47941E71821A00F3F98C /* PBXContainerItemProxy */; + }; /* End PBXTargetDependency section */ /* Begin PBXVariantGroup section */ @@ -670,6 +809,7 @@ /* Begin XCBuildConfiguration section */ C91030FC1E471D760004DFFE /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */; buildSettings = { IPHONEOS_DEPLOYMENT_TARGET = 9.0; }; @@ -677,6 +817,7 @@ }; C91030FD1E471D760004DFFE /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */; buildSettings = { IPHONEOS_DEPLOYMENT_TARGET = 9.0; }; @@ -705,7 +846,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "OpenVPN Client/OpenVPN Client.entitlements"; + CODE_SIGN_ENTITLEMENTS = "OpenVPN iOS Client/OpenVPN iOS Client.entitlements"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; @@ -731,14 +872,14 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "OpenVPN Client/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/OpenVPN iOS Client/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.openvpn-ios-client"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "c6bdf97a-4a6e-45f5-af63-045d8b3f0ffc"; - PROVISIONING_PROFILE_SPECIFIER = "OpenVPN Client Dev Profile"; + PROVISIONING_PROFILE = "65d9b784-150e-4ccb-a551-8b59e2a558db"; + PROVISIONING_PROFILE_SPECIFIER = "OpenVPN iOS Client Dev Profile"; SDKROOT = iphoneos; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -770,7 +911,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "OpenVPN Client/OpenVPN Client.entitlements"; + CODE_SIGN_ENTITLEMENTS = "OpenVPN iOS Client/OpenVPN iOS Client.entitlements"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -790,7 +931,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - INFOPLIST_FILE = "OpenVPN Client/Info.plist"; + INFOPLIST_FILE = "$(SRCROOT)/OpenVPN iOS Client/Info.plist"; LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.openvpn-ios-client"; @@ -824,7 +965,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "OpenVPN Tunnel Provider/OpenVPN Tunnel Provider.entitlements"; + CODE_SIGN_ENTITLEMENTS = "OpenVPN iOS Tunnel Provider/OpenVPN iOS Tunnel Provider.entitlements"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = dwarf; @@ -856,8 +997,8 @@ ONLY_ACTIVE_ARCH = YES; PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.openvpn-ios-client.tunnel-provider"; PRODUCT_NAME = "$(TARGET_NAME)"; - PROVISIONING_PROFILE = "7eef51df-5e5e-48fe-8743-0409498969ac"; - PROVISIONING_PROFILE_SPECIFIER = "OpenVPN Tunnel Provider Dev Profile"; + PROVISIONING_PROFILE = "3b8150a9-e826-4354-a88b-cf6ac7093f1d"; + PROVISIONING_PROFILE_SPECIFIER = "OpenVPN iOS Tunnel Provider Dev Profile"; SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; @@ -889,7 +1030,7 @@ CLANG_WARN_SUSPICIOUS_MOVE = YES; CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - CODE_SIGN_ENTITLEMENTS = "OpenVPN Tunnel Provider/OpenVPN Tunnel Provider.entitlements"; + CODE_SIGN_ENTITLEMENTS = "OpenVPN iOS Tunnel Provider/OpenVPN iOS Tunnel Provider.entitlements"; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; @@ -926,12 +1067,11 @@ }; C9BB47611E71663A00F3F98C /* Debug */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; @@ -947,7 +1087,6 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = dwarf; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -956,55 +1095,17 @@ ENABLE_BITCODE = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; ENABLE_TESTABILITY = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; GCC_DYNAMIC_NO_PIC = NO; GCC_NO_COMMON_BLOCKS = YES; GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; GCC_WARN_UNDECLARED_SELECTOR = YES; GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/asio\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/include\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/include\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/openvpn\"", - ); - INFOPLIST_FILE = "$(SRCROOT)/OpenVPN Adapter/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/lib/ios\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/lib/ios\"", - ); - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/lib/sim\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/lib/sim\"", - ); - MODULEMAP_FILE = "${TARGET_NAME}/module.modulemap"; MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - OTHER_CFLAGS = "-DAF_APP_EXTENSIONS"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DASIO_STANDALONE", - "-DASIO_NO_DEPRECATED", - "-DHAVE_LZ4", - "-DUSE_POLARSSL", - ); - OTHER_LDFLAGS = ( - "-lmbedtls", - "-llz4", - ); - PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.openvpn-adapter"; - PRODUCT_NAME = OpenVPNAdapter; - SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; SWIFT_OPTIMIZATION_LEVEL = "-Onone"; @@ -1017,12 +1118,11 @@ }; C9BB47621E71663A00F3F98C /* Release */ = { isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */; buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; - CLANG_CXX_LIBRARY = "libc++"; CLANG_ENABLE_MODULES = YES; CLANG_ENABLE_OBJC_ARC = YES; CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; @@ -1035,10 +1135,9 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_IDENTITY = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Distribution"; COPY_PHASE_STRIP = NO; CURRENT_PROJECT_VERSION = 1; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEFINES_MODULE = YES; DEVELOPMENT_TEAM = ""; DYLIB_COMPATIBILITY_VERSION = 1; @@ -1047,7 +1146,7 @@ ENABLE_BITCODE = NO; ENABLE_NS_ASSERTIONS = NO; ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; + ENABLE_TESTABILITY = YES; GCC_NO_COMMON_BLOCKS = YES; GCC_WARN_64_TO_32_BIT_CONVERSION = NO; GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; @@ -1055,54 +1154,123 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/asio\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/include\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/include\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/openvpn\"", - ); - INFOPLIST_FILE = "$(SRCROOT)/OpenVPN Adapter/Info.plist"; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - "LIBRARY_SEARCH_PATHS[sdk=iphoneos*]" = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/lib/ios\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/lib/ios\"", - ); - "LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*]" = ( - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/lz4/lib/sim\"", - "\"$(PROJECT_DIR)/${TARGET_NAME}/Vendors/polarssl/lib/sim\"", - ); - MODULEMAP_FILE = "${TARGET_NAME}/module.modulemap"; MTL_ENABLE_DEBUG_INFO = NO; - OTHER_CFLAGS = "-DAF_APP_EXTENSIONS"; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-DASIO_STANDALONE", - "-DASIO_NO_DEPRECATED", - "-DHAVE_LZ4", - "-DUSE_POLARSSL", - ); - OTHER_LDFLAGS = ( - "-lmbedtls", - "-llz4", - ); - PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.openvpn-adapter"; - PRODUCT_NAME = OpenVPNAdapter; - SDKROOT = iphoneos; SKIP_INSTALL = YES; SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; SWIFT_VERSION = 3.0; TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; VERSIONING_SYSTEM = "apple-generic"; VERSION_INFO_PREFIX = ""; }; name = Release; }; + C9BB47971E71821A00F3F98C /* Debug */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = dwarf; + DEVELOPMENT_TEAM = 2TWXCGG7R3; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_NO_COMMON_BLOCKS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = YES; + PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.OpenVPN-Adapter-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + SWIFT_VERSION = 3.0; + }; + name = Debug; + }; + C9BB47981E71821A00F3F98C /* Release */ = { + isa = XCBuildConfiguration; + baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */; + buildSettings = { + ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_ANALYZER_NONNULL = YES; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_DOCUMENTATION_COMMENTS = YES; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INFINITE_RECURSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_SUSPICIOUS_MOVE = YES; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + DEVELOPMENT_TEAM = 2TWXCGG7R3; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_NO_COMMON_BLOCKS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 10.2; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + MTL_ENABLE_DEBUG_INFO = NO; + PRODUCT_BUNDLE_IDENTIFIER = "me.ss-abramchuk.OpenVPN-Adapter-Tests"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; + SWIFT_VERSION = 3.0; + VALIDATE_PRODUCT = YES; + }; + name = Release; + }; /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - C91030FB1E471D760004DFFE /* Build configuration list for PBXProject "OpenVPN iOS Client" */ = { + C91030FB1E471D760004DFFE /* Build configuration list for PBXProject "OpenVPN Client" */ = { isa = XCConfigurationList; buildConfigurations = ( C91030FC1E471D760004DFFE /* Debug */, @@ -1111,7 +1279,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C91031141E47237A0004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN Client" */ = { + C91031141E47237A0004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN iOS Client" */ = { isa = XCConfigurationList; buildConfigurations = ( C91031121E47237A0004DFFE /* Debug */, @@ -1120,7 +1288,7 @@ defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - C910312C1E4727E20004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN Tunnel Provider" */ = { + C910312C1E4727E20004DFFE /* Build configuration list for PBXNativeTarget "OpenVPN iOS Tunnel Provider" */ = { isa = XCConfigurationList; buildConfigurations = ( C910312D1E4727E20004DFFE /* Debug */, @@ -1136,6 +1304,16 @@ C9BB47621E71663A00F3F98C /* Release */, ); defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + C9BB47961E71821A00F3F98C /* Build configuration list for PBXNativeTarget "OpenVPN Adapter Tests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + C9BB47971E71821A00F3F98C /* Debug */, + C9BB47981E71821A00F3F98C /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; }; /* End XCConfigurationList section */ }; diff --git a/OpenVPN Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OpenVPN Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..523a004 --- /dev/null +++ b/OpenVPN Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/OpenVPN Client.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter.xcscheme b/OpenVPN Client.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter.xcscheme new file mode 100644 index 0000000..b6da6c8 --- /dev/null +++ b/OpenVPN Client.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter.xcscheme @@ -0,0 +1,80 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/OpenVPN iOS Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/OpenVPN iOS Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata deleted file mode 100644 index f93a747..0000000 --- a/OpenVPN iOS Client.xcodeproj/project.xcworkspace/contents.xcworkspacedata +++ /dev/null @@ -1,7 +0,0 @@ - - - - - diff --git a/OpenVPN Client/AppDelegate.swift b/OpenVPN iOS Client/AppDelegate.swift similarity index 100% rename from OpenVPN Client/AppDelegate.swift rename to OpenVPN iOS Client/AppDelegate.swift diff --git a/OpenVPN Client/Assets.xcassets/AppIcon.appiconset/Contents.json b/OpenVPN iOS Client/Assets.xcassets/AppIcon.appiconset/Contents.json similarity index 100% rename from OpenVPN Client/Assets.xcassets/AppIcon.appiconset/Contents.json rename to OpenVPN iOS Client/Assets.xcassets/AppIcon.appiconset/Contents.json diff --git a/OpenVPN Client/Base.lproj/LaunchScreen.storyboard b/OpenVPN iOS Client/Base.lproj/LaunchScreen.storyboard similarity index 100% rename from OpenVPN Client/Base.lproj/LaunchScreen.storyboard rename to OpenVPN iOS Client/Base.lproj/LaunchScreen.storyboard diff --git a/OpenVPN Client/Base.lproj/Main.storyboard b/OpenVPN iOS Client/Base.lproj/Main.storyboard similarity index 100% rename from OpenVPN Client/Base.lproj/Main.storyboard rename to OpenVPN iOS Client/Base.lproj/Main.storyboard diff --git a/OpenVPN Client/Info.plist b/OpenVPN iOS Client/Info.plist similarity index 100% rename from OpenVPN Client/Info.plist rename to OpenVPN iOS Client/Info.plist diff --git a/OpenVPN Client/OpenVPN Client.entitlements b/OpenVPN iOS Client/OpenVPN iOS Client.entitlements similarity index 100% rename from OpenVPN Client/OpenVPN Client.entitlements rename to OpenVPN iOS Client/OpenVPN iOS Client.entitlements diff --git a/OpenVPN Tunnel Provider/Info.plist b/OpenVPN iOS Tunnel Provider/Info.plist similarity index 95% rename from OpenVPN Tunnel Provider/Info.plist rename to OpenVPN iOS Tunnel Provider/Info.plist index abaa3b3..855ea39 100644 --- a/OpenVPN Tunnel Provider/Info.plist +++ b/OpenVPN iOS Tunnel Provider/Info.plist @@ -5,7 +5,7 @@ CFBundleDevelopmentRegion en CFBundleDisplayName - OpenVPN Tunnel Provider + OpenVPN iOS Tunnel Provider CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier diff --git a/OpenVPN Tunnel Provider/KeychainAccess+Reference.swift b/OpenVPN iOS Tunnel Provider/KeychainAccess+Reference.swift similarity index 100% rename from OpenVPN Tunnel Provider/KeychainAccess+Reference.swift rename to OpenVPN iOS Tunnel Provider/KeychainAccess+Reference.swift diff --git a/OpenVPN Tunnel Provider/NEPacketTunnelFlow+OpenVPN.swift b/OpenVPN iOS Tunnel Provider/NEPacketTunnelFlow+OpenVPN.swift similarity index 100% rename from OpenVPN Tunnel Provider/NEPacketTunnelFlow+OpenVPN.swift rename to OpenVPN iOS Tunnel Provider/NEPacketTunnelFlow+OpenVPN.swift diff --git a/OpenVPN Tunnel Provider/OpenVPN Tunnel Provider.entitlements b/OpenVPN iOS Tunnel Provider/OpenVPN iOS Tunnel Provider.entitlements similarity index 100% rename from OpenVPN Tunnel Provider/OpenVPN Tunnel Provider.entitlements rename to OpenVPN iOS Tunnel Provider/OpenVPN iOS Tunnel Provider.entitlements diff --git a/OpenVPN Tunnel Provider/PacketTunnelProvider.swift b/OpenVPN iOS Tunnel Provider/PacketTunnelProvider.swift similarity index 81% rename from OpenVPN Tunnel Provider/PacketTunnelProvider.swift rename to OpenVPN iOS Tunnel Provider/PacketTunnelProvider.swift index cc34c7f..45efedb 100644 --- a/OpenVPN Tunnel Provider/PacketTunnelProvider.swift +++ b/OpenVPN iOS Tunnel Provider/PacketTunnelProvider.swift @@ -11,31 +11,28 @@ import KeychainAccess import OpenVPNAdapter enum PacketTunnelProviderError: Error { - - case startFailure(message: String) - + case fatalError(message: String) } class PacketTunnelProvider: NEPacketTunnelProvider { let keychain = Keychain(service: "me.ss-abramchuk.openvpn-ios-client", accessGroup: "2TWXCGG7R3.keychain-shared") - var vpnAdapter: OpenVPNAdapter? + lazy var vpnAdapter: OpenVPNAdapter = { + return OpenVPNAdapter().then { $0.delegate = self } + }() var startHandler: ((Error?) -> Void)? var stopHandler: (() -> Void)? override func startTunnel(options: [String : NSObject]? = nil, completionHandler: @escaping (Error?) -> Void) { guard let settings = options?["Settings"] as? Data else { - let error = PacketTunnelProviderError.startFailure(message: "Failed to retrieve OpenVPN settings from options") + let error = PacketTunnelProviderError.fatalError(message: "Failed to retrieve OpenVPN settings from options") completionHandler(error) return } - let vpnAdapter = OpenVPNAdapter() - vpnAdapter.delegate = self - if let username = protocolConfiguration.username { vpnAdapter.username = username } @@ -43,7 +40,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { if let reference = protocolConfiguration.passwordReference { do { guard let password = try keychain.get(ref: reference) else { - throw PacketTunnelProviderError.startFailure(message: "Failed to retrieve password from keychain") + throw PacketTunnelProviderError.fatalError(message: "Failed to retrieve password from keychain") } vpnAdapter.password = password @@ -59,15 +56,14 @@ class PacketTunnelProvider: NEPacketTunnelProvider { completionHandler(error) return } - - self.vpnAdapter = vpnAdapter + startHandler = completionHandler - vpnAdapter.connect() } override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { - + stopHandler = completionHandler + vpnAdapter.disconnect() } } diff --git a/OpenVPN Tunnel Provider/Then.swift b/OpenVPN iOS Tunnel Provider/Then.swift similarity index 100% rename from OpenVPN Tunnel Provider/Then.swift rename to OpenVPN iOS Tunnel Provider/Then.swift