mirror of
https://github.com/deneraraujo/OpenVPNAdapter.git
synced 2026-04-24 00:00:05 +08:00
Merge branch 'feature/improve-testing' into develop
This commit is contained in:
@@ -7,6 +7,12 @@
|
|||||||
objects = {
|
objects = {
|
||||||
|
|
||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
|
C910EAE524EBB1DA0081AF13 /* OpenVPNReachabilityTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD624123F48005C2EBC /* OpenVPNReachabilityTests.swift */; };
|
||||||
|
C910EAE724EBB5210081AF13 /* OpenVPNConfigurationEvaluation.h in Headers */ = {isa = PBXBuildFile; fileRef = C910EAE624EBB5210081AF13 /* OpenVPNConfigurationEvaluation.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
|
C910EAEE24EBBFB60081AF13 /* client.crt in Resources */ = {isa = PBXBuildFile; fileRef = C910EAEB24EBBFB60081AF13 /* client.crt */; };
|
||||||
|
C910EAEF24EBBFB60081AF13 /* ca.crt in Resources */ = {isa = PBXBuildFile; fileRef = C910EAEC24EBBFB60081AF13 /* ca.crt */; };
|
||||||
|
C910EAF024EBBFB60081AF13 /* client.key in Resources */ = {isa = PBXBuildFile; fileRef = C910EAED24EBBFB60081AF13 /* client.key */; };
|
||||||
|
C910EAF224EBC6F90081AF13 /* client.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C910EAF124EBC6F90081AF13 /* client.ovpn */; };
|
||||||
C97E5F6E24122F12005C2EBC /* NSArray+OpenVPNAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F6D24122F12005C2EBC /* NSArray+OpenVPNAdditions.h */; };
|
C97E5F6E24122F12005C2EBC /* NSArray+OpenVPNAdditions.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F6D24122F12005C2EBC /* NSArray+OpenVPNAdditions.h */; };
|
||||||
C97E5F7024122F22005C2EBC /* NSError+OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F6F24122F22005C2EBC /* NSError+OpenVPNError.h */; };
|
C97E5F7024122F22005C2EBC /* NSError+OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F6F24122F22005C2EBC /* NSError+OpenVPNError.h */; };
|
||||||
C97E5F7224122F5C005C2EBC /* OpenVPNClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F7124122F5C005C2EBC /* OpenVPNClient.h */; };
|
C97E5F7224122F5C005C2EBC /* OpenVPNClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F7124122F5C005C2EBC /* OpenVPNClient.h */; };
|
||||||
@@ -31,8 +37,8 @@
|
|||||||
C97E5F98241230F7005C2EBC /* OpenVPNPacket.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F97241230F7005C2EBC /* OpenVPNPacket.h */; };
|
C97E5F98241230F7005C2EBC /* OpenVPNPacket.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F97241230F7005C2EBC /* OpenVPNPacket.h */; };
|
||||||
C97E5F9A24123135005C2EBC /* OpenVPNPacketFlowBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9924123135005C2EBC /* OpenVPNPacketFlowBridge.h */; };
|
C97E5F9A24123135005C2EBC /* OpenVPNPacketFlowBridge.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9924123135005C2EBC /* OpenVPNPacketFlowBridge.h */; };
|
||||||
C97E5F9C2412313F005C2EBC /* OpenVPNPrivateKey.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */; };
|
C97E5F9C2412313F005C2EBC /* OpenVPNPrivateKey.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */; };
|
||||||
C97E5F9E2412314A005C2EBC /* OpenVPNProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9D24123149005C2EBC /* OpenVPNProperties.h */; };
|
C97E5F9E2412314A005C2EBC /* OpenVPNConfigurationEvaluation.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9D24123149005C2EBC /* OpenVPNConfigurationEvaluation.h */; };
|
||||||
C97E5FA024123152005C2EBC /* OpenVPNProperties+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9F24123151005C2EBC /* OpenVPNProperties+Internal.h */; };
|
C97E5FA024123152005C2EBC /* OpenVPNConfigurationEvaluation+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5F9F24123151005C2EBC /* OpenVPNConfigurationEvaluation+Internal.h */; };
|
||||||
C97E5FA22412315D005C2EBC /* OpenVPNReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */; };
|
C97E5FA22412315D005C2EBC /* OpenVPNReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */; };
|
||||||
C97E5FA424123168005C2EBC /* OpenVPNReachability+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */; };
|
C97E5FA424123168005C2EBC /* OpenVPNReachability+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */; };
|
||||||
C97E5FA62412317B005C2EBC /* OpenVPNReachabilityStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA52412317B005C2EBC /* OpenVPNReachabilityStatus.h */; };
|
C97E5FA62412317B005C2EBC /* OpenVPNReachabilityStatus.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FA52412317B005C2EBC /* OpenVPNReachabilityStatus.h */; };
|
||||||
@@ -46,7 +52,6 @@
|
|||||||
C97E5FB6241231FF005C2EBC /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FB5241231FF005C2EBC /* OpenVPNTransportStats+Internal.h */; };
|
C97E5FB6241231FF005C2EBC /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FB5241231FF005C2EBC /* OpenVPNTransportStats+Internal.h */; };
|
||||||
C97E5FB824123211005C2EBC /* OpenVPNTransportProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FB724123211005C2EBC /* OpenVPNTransportProtocol.h */; };
|
C97E5FB824123211005C2EBC /* OpenVPNTransportProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C97E5FB724123211005C2EBC /* OpenVPNTransportProtocol.h */; };
|
||||||
C97E5FDD24123F48005C2EBC /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */; };
|
C97E5FDD24123F48005C2EBC /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */; };
|
||||||
C97E5FDE24123F48005C2EBC /* CustomFlow.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD824123F48005C2EBC /* CustomFlow.swift */; };
|
|
||||||
C97E5FDF24123F48005C2EBC /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */; };
|
C97E5FDF24123F48005C2EBC /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */; };
|
||||||
C97E5FE024123F48005C2EBC /* VPNProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FDA24123F48005C2EBC /* VPNProfile.swift */; };
|
C97E5FE024123F48005C2EBC /* VPNProfile.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FDA24123F48005C2EBC /* VPNProfile.swift */; };
|
||||||
C97E5FE124123F48005C2EBC /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FDB24123F48005C2EBC /* Bundle.swift */; };
|
C97E5FE124123F48005C2EBC /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C97E5FDB24123F48005C2EBC /* Bundle.swift */; };
|
||||||
@@ -73,7 +78,7 @@
|
|||||||
OBJ_271 /* OpenVPNPacket.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* OpenVPNPacket.mm */; };
|
OBJ_271 /* OpenVPNPacket.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_39 /* OpenVPNPacket.mm */; };
|
||||||
OBJ_272 /* OpenVPNPacketFlowBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* OpenVPNPacketFlowBridge.mm */; };
|
OBJ_272 /* OpenVPNPacketFlowBridge.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_40 /* OpenVPNPacketFlowBridge.mm */; };
|
||||||
OBJ_273 /* OpenVPNPrivateKey.m in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* OpenVPNPrivateKey.m */; };
|
OBJ_273 /* OpenVPNPrivateKey.m in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_41 /* OpenVPNPrivateKey.m */; };
|
||||||
OBJ_274 /* OpenVPNProperties.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* OpenVPNProperties.mm */; };
|
OBJ_274 /* OpenVPNConfigurationEvaluation.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_42 /* OpenVPNConfigurationEvaluation.mm */; };
|
||||||
OBJ_275 /* OpenVPNReachability.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* OpenVPNReachability.mm */; };
|
OBJ_275 /* OpenVPNReachability.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_43 /* OpenVPNReachability.mm */; };
|
||||||
OBJ_276 /* OpenVPNReachabilityTracker.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* OpenVPNReachabilityTracker.mm */; };
|
OBJ_276 /* OpenVPNReachabilityTracker.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_44 /* OpenVPNReachabilityTracker.mm */; };
|
||||||
OBJ_277 /* OpenVPNServerEntry.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* OpenVPNServerEntry.mm */; };
|
OBJ_277 /* OpenVPNServerEntry.mm in Sources */ = {isa = PBXBuildFile; fileRef = OBJ_45 /* OpenVPNServerEntry.mm */; };
|
||||||
@@ -87,7 +92,6 @@
|
|||||||
OBJ_286 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_54 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_286 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_54 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
OBJ_287 /* OpenVPNPrivateKey.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_55 /* OpenVPNPrivateKey.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_287 /* OpenVPNPrivateKey.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_55 /* OpenVPNPrivateKey.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
OBJ_288 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_56 /* OpenVPNInterfaceStats.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_288 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_56 /* OpenVPNInterfaceStats.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
OBJ_289 /* OpenVPNProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_57 /* OpenVPNProperties.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
|
||||||
OBJ_290 /* OpenVPNReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_58 /* OpenVPNReachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_290 /* OpenVPNReachability.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_58 /* OpenVPNReachability.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
OBJ_291 /* OpenVPNIPv6Preference.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_59 /* OpenVPNIPv6Preference.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_291 /* OpenVPNIPv6Preference.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_59 /* OpenVPNIPv6Preference.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
OBJ_292 /* OpenVPNAdapterPacketFlow.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_60 /* OpenVPNAdapterPacketFlow.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
OBJ_292 /* OpenVPNAdapterPacketFlow.h in Headers */ = {isa = PBXBuildFile; fileRef = OBJ_60 /* OpenVPNAdapterPacketFlow.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
@@ -225,6 +229,11 @@
|
|||||||
/* End PBXContainerItemProxy section */
|
/* End PBXContainerItemProxy section */
|
||||||
|
|
||||||
/* Begin PBXFileReference section */
|
/* Begin PBXFileReference section */
|
||||||
|
C910EAE624EBB5210081AF13 /* OpenVPNConfigurationEvaluation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfigurationEvaluation.h; sourceTree = "<group>"; };
|
||||||
|
C910EAEB24EBBFB60081AF13 /* client.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = client.crt; sourceTree = "<group>"; };
|
||||||
|
C910EAEC24EBBFB60081AF13 /* ca.crt */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = ca.crt; sourceTree = "<group>"; };
|
||||||
|
C910EAED24EBBFB60081AF13 /* client.key */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = client.key; sourceTree = "<group>"; };
|
||||||
|
C910EAF124EBC6F90081AF13 /* client.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = client.ovpn; sourceTree = "<group>"; };
|
||||||
C97E5F6D24122F12005C2EBC /* NSArray+OpenVPNAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+OpenVPNAdditions.h"; sourceTree = "<group>"; };
|
C97E5F6D24122F12005C2EBC /* NSArray+OpenVPNAdditions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSArray+OpenVPNAdditions.h"; sourceTree = "<group>"; };
|
||||||
C97E5F6F24122F22005C2EBC /* NSError+OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+OpenVPNError.h"; sourceTree = "<group>"; };
|
C97E5F6F24122F22005C2EBC /* NSError+OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "NSError+OpenVPNError.h"; sourceTree = "<group>"; };
|
||||||
C97E5F7124122F5C005C2EBC /* OpenVPNClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNClient.h; sourceTree = "<group>"; };
|
C97E5F7124122F5C005C2EBC /* OpenVPNClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNClient.h; sourceTree = "<group>"; };
|
||||||
@@ -249,8 +258,8 @@
|
|||||||
C97E5F97241230F7005C2EBC /* OpenVPNPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPacket.h; sourceTree = "<group>"; };
|
C97E5F97241230F7005C2EBC /* OpenVPNPacket.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPacket.h; sourceTree = "<group>"; };
|
||||||
C97E5F9924123135005C2EBC /* OpenVPNPacketFlowBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPacketFlowBridge.h; sourceTree = "<group>"; };
|
C97E5F9924123135005C2EBC /* OpenVPNPacketFlowBridge.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPacketFlowBridge.h; sourceTree = "<group>"; };
|
||||||
C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPrivateKey.h; sourceTree = "<group>"; };
|
C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNPrivateKey.h; sourceTree = "<group>"; };
|
||||||
C97E5F9D24123149005C2EBC /* OpenVPNProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNProperties.h; sourceTree = "<group>"; };
|
C97E5F9D24123149005C2EBC /* OpenVPNConfigurationEvaluation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfigurationEvaluation.h; sourceTree = "<group>"; };
|
||||||
C97E5F9F24123151005C2EBC /* OpenVPNProperties+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNProperties+Internal.h"; sourceTree = "<group>"; };
|
C97E5F9F24123151005C2EBC /* OpenVPNConfigurationEvaluation+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConfigurationEvaluation+Internal.h"; sourceTree = "<group>"; };
|
||||||
C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachability.h; sourceTree = "<group>"; };
|
C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachability.h; sourceTree = "<group>"; };
|
||||||
C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNReachability+Internal.h"; sourceTree = "<group>"; };
|
C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNReachability+Internal.h"; sourceTree = "<group>"; };
|
||||||
C97E5FA52412317B005C2EBC /* OpenVPNReachabilityStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachabilityStatus.h; sourceTree = "<group>"; };
|
C97E5FA52412317B005C2EBC /* OpenVPNReachabilityStatus.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachabilityStatus.h; sourceTree = "<group>"; };
|
||||||
@@ -268,7 +277,6 @@
|
|||||||
C97E5FCD24123F2E005C2EBC /* OpenVPNAdapterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenVPNAdapterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
C97E5FCD24123F2E005C2EBC /* OpenVPNAdapterTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = OpenVPNAdapterTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
|
||||||
C97E5FD624123F48005C2EBC /* OpenVPNReachabilityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNReachabilityTests.swift; sourceTree = "<group>"; };
|
C97E5FD624123F48005C2EBC /* OpenVPNReachabilityTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNReachabilityTests.swift; sourceTree = "<group>"; };
|
||||||
C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = "<group>"; };
|
C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = "<group>"; };
|
||||||
C97E5FD824123F48005C2EBC /* CustomFlow.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = CustomFlow.swift; sourceTree = "<group>"; };
|
|
||||||
C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = "<group>"; };
|
C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = "<group>"; };
|
||||||
C97E5FDA24123F48005C2EBC /* VPNProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNProfile.swift; sourceTree = "<group>"; };
|
C97E5FDA24123F48005C2EBC /* VPNProfile.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = VPNProfile.swift; sourceTree = "<group>"; };
|
||||||
C97E5FDB24123F48005C2EBC /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
|
C97E5FDB24123F48005C2EBC /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
|
||||||
@@ -431,7 +439,7 @@
|
|||||||
OBJ_39 /* OpenVPNPacket.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNPacket.mm; sourceTree = "<group>"; };
|
OBJ_39 /* OpenVPNPacket.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNPacket.mm; sourceTree = "<group>"; };
|
||||||
OBJ_40 /* OpenVPNPacketFlowBridge.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNPacketFlowBridge.mm; sourceTree = "<group>"; };
|
OBJ_40 /* OpenVPNPacketFlowBridge.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNPacketFlowBridge.mm; sourceTree = "<group>"; };
|
||||||
OBJ_41 /* OpenVPNPrivateKey.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OpenVPNPrivateKey.m; sourceTree = "<group>"; };
|
OBJ_41 /* OpenVPNPrivateKey.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = OpenVPNPrivateKey.m; sourceTree = "<group>"; };
|
||||||
OBJ_42 /* OpenVPNProperties.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNProperties.mm; sourceTree = "<group>"; };
|
OBJ_42 /* OpenVPNConfigurationEvaluation.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfigurationEvaluation.mm; sourceTree = "<group>"; };
|
||||||
OBJ_43 /* OpenVPNReachability.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNReachability.mm; sourceTree = "<group>"; };
|
OBJ_43 /* OpenVPNReachability.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNReachability.mm; sourceTree = "<group>"; };
|
||||||
OBJ_44 /* OpenVPNReachabilityTracker.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNReachabilityTracker.mm; sourceTree = "<group>"; };
|
OBJ_44 /* OpenVPNReachabilityTracker.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNReachabilityTracker.mm; sourceTree = "<group>"; };
|
||||||
OBJ_45 /* OpenVPNServerEntry.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNServerEntry.mm; sourceTree = "<group>"; };
|
OBJ_45 /* OpenVPNServerEntry.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNServerEntry.mm; sourceTree = "<group>"; };
|
||||||
@@ -445,7 +453,6 @@
|
|||||||
OBJ_54 /* OpenVPNTLSCertProfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNTLSCertProfile.h; sourceTree = "<group>"; };
|
OBJ_54 /* OpenVPNTLSCertProfile.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNTLSCertProfile.h; sourceTree = "<group>"; };
|
||||||
OBJ_55 /* OpenVPNPrivateKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNPrivateKey.h; sourceTree = "<group>"; };
|
OBJ_55 /* OpenVPNPrivateKey.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNPrivateKey.h; sourceTree = "<group>"; };
|
||||||
OBJ_56 /* OpenVPNInterfaceStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNInterfaceStats.h; sourceTree = "<group>"; };
|
OBJ_56 /* OpenVPNInterfaceStats.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNInterfaceStats.h; sourceTree = "<group>"; };
|
||||||
OBJ_57 /* OpenVPNProperties.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNProperties.h; sourceTree = "<group>"; };
|
|
||||||
OBJ_58 /* OpenVPNReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachability.h; sourceTree = "<group>"; };
|
OBJ_58 /* OpenVPNReachability.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNReachability.h; sourceTree = "<group>"; };
|
||||||
OBJ_59 /* OpenVPNIPv6Preference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNIPv6Preference.h; sourceTree = "<group>"; };
|
OBJ_59 /* OpenVPNIPv6Preference.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNIPv6Preference.h; sourceTree = "<group>"; };
|
||||||
OBJ_60 /* OpenVPNAdapterPacketFlow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNAdapterPacketFlow.h; sourceTree = "<group>"; };
|
OBJ_60 /* OpenVPNAdapterPacketFlow.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNAdapterPacketFlow.h; sourceTree = "<group>"; };
|
||||||
@@ -527,12 +534,23 @@
|
|||||||
/* End PBXFrameworksBuildPhase section */
|
/* End PBXFrameworksBuildPhase section */
|
||||||
|
|
||||||
/* Begin PBXGroup section */
|
/* Begin PBXGroup section */
|
||||||
|
C910EAEA24EBBFB60081AF13 /* Resources */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C910EAF124EBC6F90081AF13 /* client.ovpn */,
|
||||||
|
C910EAEB24EBBFB60081AF13 /* client.crt */,
|
||||||
|
C910EAEC24EBBFB60081AF13 /* ca.crt */,
|
||||||
|
C910EAED24EBBFB60081AF13 /* client.key */,
|
||||||
|
);
|
||||||
|
name = Resources;
|
||||||
|
path = Tests/Resources;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
C97E5FD524123F48005C2EBC /* OpenVPNAdapter */ = {
|
C97E5FD524123F48005C2EBC /* OpenVPNAdapter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C97E5FDB24123F48005C2EBC /* Bundle.swift */,
|
C97E5FDB24123F48005C2EBC /* Bundle.swift */,
|
||||||
C97E5FDA24123F48005C2EBC /* VPNProfile.swift */,
|
C97E5FDA24123F48005C2EBC /* VPNProfile.swift */,
|
||||||
C97E5FD824123F48005C2EBC /* CustomFlow.swift */,
|
|
||||||
C97E5FD624123F48005C2EBC /* OpenVPNReachabilityTests.swift */,
|
C97E5FD624123F48005C2EBC /* OpenVPNReachabilityTests.swift */,
|
||||||
C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */,
|
C97E5FD724123F48005C2EBC /* OpenVPNConfigurationTests.swift */,
|
||||||
C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */,
|
C97E5FD924123F48005C2EBC /* OpenVPNAdapterTests.swift */,
|
||||||
@@ -673,6 +691,7 @@
|
|||||||
OBJ_231 /* Tests */ = {
|
OBJ_231 /* Tests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
C910EAEA24EBBFB60081AF13 /* Resources */,
|
||||||
C97E5FD524123F48005C2EBC /* OpenVPNAdapter */,
|
C97E5FD524123F48005C2EBC /* OpenVPNAdapter */,
|
||||||
);
|
);
|
||||||
name = Tests;
|
name = Tests;
|
||||||
@@ -746,9 +765,9 @@
|
|||||||
OBJ_40 /* OpenVPNPacketFlowBridge.mm */,
|
OBJ_40 /* OpenVPNPacketFlowBridge.mm */,
|
||||||
C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */,
|
C97E5F9B2412313F005C2EBC /* OpenVPNPrivateKey.h */,
|
||||||
OBJ_41 /* OpenVPNPrivateKey.m */,
|
OBJ_41 /* OpenVPNPrivateKey.m */,
|
||||||
C97E5F9D24123149005C2EBC /* OpenVPNProperties.h */,
|
C97E5F9D24123149005C2EBC /* OpenVPNConfigurationEvaluation.h */,
|
||||||
C97E5F9F24123151005C2EBC /* OpenVPNProperties+Internal.h */,
|
C97E5F9F24123151005C2EBC /* OpenVPNConfigurationEvaluation+Internal.h */,
|
||||||
OBJ_42 /* OpenVPNProperties.mm */,
|
OBJ_42 /* OpenVPNConfigurationEvaluation.mm */,
|
||||||
C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */,
|
C97E5FA12412315C005C2EBC /* OpenVPNReachability.h */,
|
||||||
C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */,
|
C97E5FA324123168005C2EBC /* OpenVPNReachability+Internal.h */,
|
||||||
OBJ_43 /* OpenVPNReachability.mm */,
|
OBJ_43 /* OpenVPNReachability.mm */,
|
||||||
@@ -778,7 +797,7 @@
|
|||||||
OBJ_54 /* OpenVPNTLSCertProfile.h */,
|
OBJ_54 /* OpenVPNTLSCertProfile.h */,
|
||||||
OBJ_55 /* OpenVPNPrivateKey.h */,
|
OBJ_55 /* OpenVPNPrivateKey.h */,
|
||||||
OBJ_56 /* OpenVPNInterfaceStats.h */,
|
OBJ_56 /* OpenVPNInterfaceStats.h */,
|
||||||
OBJ_57 /* OpenVPNProperties.h */,
|
C910EAE624EBB5210081AF13 /* OpenVPNConfigurationEvaluation.h */,
|
||||||
OBJ_58 /* OpenVPNReachability.h */,
|
OBJ_58 /* OpenVPNReachability.h */,
|
||||||
OBJ_59 /* OpenVPNIPv6Preference.h */,
|
OBJ_59 /* OpenVPNIPv6Preference.h */,
|
||||||
OBJ_60 /* OpenVPNAdapterPacketFlow.h */,
|
OBJ_60 /* OpenVPNAdapterPacketFlow.h */,
|
||||||
@@ -974,12 +993,11 @@
|
|||||||
C97E5F6E24122F12005C2EBC /* NSArray+OpenVPNAdditions.h in Headers */,
|
C97E5F6E24122F12005C2EBC /* NSArray+OpenVPNAdditions.h in Headers */,
|
||||||
OBJ_286 /* OpenVPNTLSCertProfile.h in Headers */,
|
OBJ_286 /* OpenVPNTLSCertProfile.h in Headers */,
|
||||||
C97E5FAE241231B3005C2EBC /* OpenVPNSessionToken.h in Headers */,
|
C97E5FAE241231B3005C2EBC /* OpenVPNSessionToken.h in Headers */,
|
||||||
C97E5F9E2412314A005C2EBC /* OpenVPNProperties.h in Headers */,
|
C97E5F9E2412314A005C2EBC /* OpenVPNConfigurationEvaluation.h in Headers */,
|
||||||
C97E5FA62412317B005C2EBC /* OpenVPNReachabilityStatus.h in Headers */,
|
C97E5FA62412317B005C2EBC /* OpenVPNReachabilityStatus.h in Headers */,
|
||||||
OBJ_287 /* OpenVPNPrivateKey.h in Headers */,
|
OBJ_287 /* OpenVPNPrivateKey.h in Headers */,
|
||||||
C97E5F7424122FE6005C2EBC /* OpenVPNAdapter.h in Headers */,
|
C97E5F7424122FE6005C2EBC /* OpenVPNAdapter.h in Headers */,
|
||||||
OBJ_288 /* OpenVPNInterfaceStats.h in Headers */,
|
OBJ_288 /* OpenVPNInterfaceStats.h in Headers */,
|
||||||
OBJ_289 /* OpenVPNProperties.h in Headers */,
|
|
||||||
OBJ_290 /* OpenVPNReachability.h in Headers */,
|
OBJ_290 /* OpenVPNReachability.h in Headers */,
|
||||||
OBJ_291 /* OpenVPNIPv6Preference.h in Headers */,
|
OBJ_291 /* OpenVPNIPv6Preference.h in Headers */,
|
||||||
C97E5F8C24123091005C2EBC /* OpenVPNInterfaceStats.h in Headers */,
|
C97E5F8C24123091005C2EBC /* OpenVPNInterfaceStats.h in Headers */,
|
||||||
@@ -987,7 +1005,7 @@
|
|||||||
C97E5F92241230C6005C2EBC /* OpenVPNKeyType.h in Headers */,
|
C97E5F92241230C6005C2EBC /* OpenVPNKeyType.h in Headers */,
|
||||||
C97E5F94241230D9005C2EBC /* OpenVPNMinTLSVersion.h in Headers */,
|
C97E5F94241230D9005C2EBC /* OpenVPNMinTLSVersion.h in Headers */,
|
||||||
C97E5F7E24123046005C2EBC /* OpenVPNConfiguration.h in Headers */,
|
C97E5F7E24123046005C2EBC /* OpenVPNConfiguration.h in Headers */,
|
||||||
C97E5FA024123152005C2EBC /* OpenVPNProperties+Internal.h in Headers */,
|
C97E5FA024123152005C2EBC /* OpenVPNConfigurationEvaluation+Internal.h in Headers */,
|
||||||
C97E5FB2241231DA005C2EBC /* OpenVPNTLSCertProfile.h in Headers */,
|
C97E5FB2241231DA005C2EBC /* OpenVPNTLSCertProfile.h in Headers */,
|
||||||
OBJ_292 /* OpenVPNAdapterPacketFlow.h in Headers */,
|
OBJ_292 /* OpenVPNAdapterPacketFlow.h in Headers */,
|
||||||
C97E5FA824123186005C2EBC /* OpenVPNReachabilityTracker.h in Headers */,
|
C97E5FA824123186005C2EBC /* OpenVPNReachabilityTracker.h in Headers */,
|
||||||
@@ -1009,6 +1027,7 @@
|
|||||||
OBJ_301 /* OpenVPNSessionToken.h in Headers */,
|
OBJ_301 /* OpenVPNSessionToken.h in Headers */,
|
||||||
C97E5FA424123168005C2EBC /* OpenVPNReachability+Internal.h in Headers */,
|
C97E5FA424123168005C2EBC /* OpenVPNReachability+Internal.h in Headers */,
|
||||||
OBJ_302 /* OpenVPNCertificate.h in Headers */,
|
OBJ_302 /* OpenVPNCertificate.h in Headers */,
|
||||||
|
C910EAE724EBB5210081AF13 /* OpenVPNConfigurationEvaluation.h in Headers */,
|
||||||
C97E5FAC241231AA005C2EBC /* OpenVPNServerEntry+Internal.h in Headers */,
|
C97E5FAC241231AA005C2EBC /* OpenVPNServerEntry+Internal.h in Headers */,
|
||||||
C97E5F90241230B3005C2EBC /* OpenVPNIPv6Preference.h in Headers */,
|
C97E5F90241230B3005C2EBC /* OpenVPNIPv6Preference.h in Headers */,
|
||||||
C97E5FE624124B0E005C2EBC /* Umbrella-Header.h in Headers */,
|
C97E5FE624124B0E005C2EBC /* Umbrella-Header.h in Headers */,
|
||||||
@@ -1147,6 +1166,10 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C910EAEE24EBBFB60081AF13 /* client.crt in Resources */,
|
||||||
|
C910EAF024EBBFB60081AF13 /* client.key in Resources */,
|
||||||
|
C910EAEF24EBBFB60081AF13 /* ca.crt in Resources */,
|
||||||
|
C910EAF224EBC6F90081AF13 /* client.ovpn in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -1160,7 +1183,7 @@
|
|||||||
C97E5FE124123F48005C2EBC /* Bundle.swift in Sources */,
|
C97E5FE124123F48005C2EBC /* Bundle.swift in Sources */,
|
||||||
C97E5FDD24123F48005C2EBC /* OpenVPNConfigurationTests.swift in Sources */,
|
C97E5FDD24123F48005C2EBC /* OpenVPNConfigurationTests.swift in Sources */,
|
||||||
C97E5FDF24123F48005C2EBC /* OpenVPNAdapterTests.swift in Sources */,
|
C97E5FDF24123F48005C2EBC /* OpenVPNAdapterTests.swift in Sources */,
|
||||||
C97E5FDE24123F48005C2EBC /* CustomFlow.swift in Sources */,
|
C910EAE524EBB1DA0081AF13 /* OpenVPNReachabilityTests.swift in Sources */,
|
||||||
C97E5FE024123F48005C2EBC /* VPNProfile.swift in Sources */,
|
C97E5FE024123F48005C2EBC /* VPNProfile.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -1194,7 +1217,7 @@
|
|||||||
OBJ_271 /* OpenVPNPacket.mm in Sources */,
|
OBJ_271 /* OpenVPNPacket.mm in Sources */,
|
||||||
OBJ_272 /* OpenVPNPacketFlowBridge.mm in Sources */,
|
OBJ_272 /* OpenVPNPacketFlowBridge.mm in Sources */,
|
||||||
OBJ_273 /* OpenVPNPrivateKey.m in Sources */,
|
OBJ_273 /* OpenVPNPrivateKey.m in Sources */,
|
||||||
OBJ_274 /* OpenVPNProperties.mm in Sources */,
|
OBJ_274 /* OpenVPNConfigurationEvaluation.mm in Sources */,
|
||||||
OBJ_275 /* OpenVPNReachability.mm in Sources */,
|
OBJ_275 /* OpenVPNReachability.mm in Sources */,
|
||||||
OBJ_276 /* OpenVPNReachabilityTracker.mm in Sources */,
|
OBJ_276 /* OpenVPNReachabilityTracker.mm in Sources */,
|
||||||
OBJ_277 /* OpenVPNServerEntry.mm in Sources */,
|
OBJ_277 /* OpenVPNServerEntry.mm in Sources */,
|
||||||
|
|||||||
@@ -26,7 +26,7 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[];
|
|||||||
#import <OpenVPNAdapter/OpenVPNConfiguration.h>
|
#import <OpenVPNAdapter/OpenVPNConfiguration.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNCredentials.h>
|
#import <OpenVPNAdapter/OpenVPNCredentials.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNServerEntry.h>
|
#import <OpenVPNAdapter/OpenVPNServerEntry.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNProperties.h>
|
#import <OpenVPNAdapter/OpenVPNConfigurationEvaluation.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNConnectionInfo.h>
|
#import <OpenVPNAdapter/OpenVPNConnectionInfo.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNSessionToken.h>
|
#import <OpenVPNAdapter/OpenVPNSessionToken.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNTransportStats.h>
|
#import <OpenVPNAdapter/OpenVPNTransportStats.h>
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
../library/OpenVPNConfigurationEvaluation.h
|
||||||
@@ -1 +0,0 @@
|
|||||||
../library/OpenVPNProperties.h
|
|
||||||
@@ -22,7 +22,7 @@ typedef NS_ENUM(NSInteger, OpenVPNAdapterEvent);
|
|||||||
@class OpenVPNConnectionInfo;
|
@class OpenVPNConnectionInfo;
|
||||||
@class OpenVPNCredentials;
|
@class OpenVPNCredentials;
|
||||||
@class OpenVPNInterfaceStats;
|
@class OpenVPNInterfaceStats;
|
||||||
@class OpenVPNProperties;
|
@class OpenVPNConfigurationEvaluation;
|
||||||
@class OpenVPNTransportStats;
|
@class OpenVPNTransportStats;
|
||||||
@class OpenVPNSessionToken;
|
@class OpenVPNSessionToken;
|
||||||
|
|
||||||
@@ -126,15 +126,26 @@ NS_SWIFT_NAME(openVPNAdapter(_:handleEvent:message:));
|
|||||||
*/
|
*/
|
||||||
@property (nonatomic, readonly) OpenVPNTransportStats *transportStatistics;
|
@property (nonatomic, readonly) OpenVPNTransportStats *transportStatistics;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Evaluate the given configuration object and determine needed credentials.
|
||||||
|
|
||||||
|
@param configuration The configuration object.
|
||||||
|
@param error If there is an error applying the configuration, upon return contains an error object that describes the problem.
|
||||||
|
@return An object describing the configuration which has been evaluated.
|
||||||
|
*/
|
||||||
|
+ (nullable OpenVPNConfigurationEvaluation *)evaluateConfiguration:(OpenVPNConfiguration *)configuration
|
||||||
|
error:(NSError **)error
|
||||||
|
NS_SWIFT_NAME(evaluate(configuration:));
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Applies the given configuration object.
|
Applies the given configuration object.
|
||||||
Call this method prior to connecting, this method has no effect after calling connect.
|
Call this method prior to connecting, this method has no effect after calling connect.
|
||||||
|
|
||||||
@param configuration The configuration object.
|
@param configuration The configuration object.
|
||||||
@param error If there is an error applying the configuration, upon return contains an error object that describes the problem.
|
@param error If there is an error applying the configuration, upon return contains an error object that describes the problem.
|
||||||
@return A properties object describing the configuration which has been applied.
|
@return An object describing the configuration which has been applied.
|
||||||
*/
|
*/
|
||||||
- (nullable OpenVPNProperties *)applyConfiguration:(OpenVPNConfiguration *)configuration
|
- (nullable OpenVPNConfigurationEvaluation *)applyConfiguration:(OpenVPNConfiguration *)configuration
|
||||||
error:(NSError **)error
|
error:(NSError **)error
|
||||||
NS_SWIFT_NAME(apply(configuration:));
|
NS_SWIFT_NAME(apply(configuration:));
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
#import "OpenVPNConfiguration+Internal.h"
|
#import "OpenVPNConfiguration+Internal.h"
|
||||||
#import "OpenVPNConnectionInfo+Internal.h"
|
#import "OpenVPNConnectionInfo+Internal.h"
|
||||||
#import "OpenVPNInterfaceStats+Internal.h"
|
#import "OpenVPNInterfaceStats+Internal.h"
|
||||||
#import "OpenVPNProperties+Internal.h"
|
#import "OpenVPNConfigurationEvaluation+Internal.h"
|
||||||
#import "OpenVPNSessionToken+Internal.h"
|
#import "OpenVPNSessionToken+Internal.h"
|
||||||
#import "OpenVPNTransportStats+Internal.h"
|
#import "OpenVPNTransportStats+Internal.h"
|
||||||
#import "NSError+OpenVPNError.h"
|
#import "NSError+OpenVPNError.h"
|
||||||
@@ -50,22 +50,40 @@
|
|||||||
|
|
||||||
#pragma mark - OpenVPNClient Lifecycle
|
#pragma mark - OpenVPNClient Lifecycle
|
||||||
|
|
||||||
- (OpenVPNProperties *)applyConfiguration:(OpenVPNConfiguration *)configuration error:(NSError * __autoreleasing *)error {
|
+ (nullable OpenVPNConfigurationEvaluation *)evaluateConfiguration:(OpenVPNConfiguration *)configuration error:(NSError **)error {
|
||||||
|
ClientAPI::EvalConfig eval = OpenVPNClient::eval_config_static(configuration.config);
|
||||||
|
|
||||||
|
if (eval.error) {
|
||||||
|
if (error) {
|
||||||
|
NSString *message = [NSString stringWithUTF8String:eval.message.c_str()];
|
||||||
|
*error = [NSError ovpn_errorObjectForAdapterError:OpenVPNAdapterErrorConfigurationFailure
|
||||||
|
description:@"Failed to evaluate OpenVPN configuration."
|
||||||
|
message:message
|
||||||
|
fatal:YES];
|
||||||
|
}
|
||||||
|
|
||||||
|
return nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
return [[OpenVPNConfigurationEvaluation alloc] initWithEvalConfig:eval];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNConfigurationEvaluation *)applyConfiguration:(OpenVPNConfiguration *)configuration error:(NSError * __autoreleasing *)error {
|
||||||
ClientAPI::EvalConfig eval = self.vpnClient->apply_config(configuration.config);
|
ClientAPI::EvalConfig eval = self.vpnClient->apply_config(configuration.config);
|
||||||
|
|
||||||
if (eval.error) {
|
if (eval.error) {
|
||||||
if (error) {
|
if (error) {
|
||||||
NSString *message = [NSString stringWithUTF8String:eval.message.c_str()];
|
NSString *message = [NSString stringWithUTF8String:eval.message.c_str()];
|
||||||
*error = [NSError ovpn_errorObjectForAdapterError:OpenVPNAdapterErrorConfigurationFailure
|
*error = [NSError ovpn_errorObjectForAdapterError:OpenVPNAdapterErrorConfigurationFailure
|
||||||
description:@"Failed to apply OpenVPN configuration."
|
description:@"Failed to apply OpenVPN configuration."
|
||||||
message:message
|
message:message
|
||||||
fatal:YES];
|
fatal:YES];
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil;
|
return nil;
|
||||||
}
|
}
|
||||||
|
|
||||||
return [[OpenVPNProperties alloc] initWithEvalConfig:eval];
|
return [[OpenVPNConfigurationEvaluation alloc] initWithEvalConfig:eval];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (BOOL)provideCredentials:(OpenVPNCredentials *)credentials error:(NSError * __autoreleasing *)error {
|
- (BOOL)provideCredentials:(OpenVPNCredentials *)credentials error:(NSError * __autoreleasing *)error {
|
||||||
|
|||||||
+3
-3
@@ -1,18 +1,18 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNProperties+Internal.h
|
// OpenVPNConfigurationEvaluation+Internal.h
|
||||||
// OpenVPN Adapter
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 26.04.17.
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "OpenVPNProperties.h"
|
#import "OpenVPNConfigurationEvaluation.h"
|
||||||
|
|
||||||
#include <ovpnapi.hpp>
|
#include <ovpnapi.hpp>
|
||||||
|
|
||||||
using namespace openvpn;
|
using namespace openvpn;
|
||||||
|
|
||||||
@interface OpenVPNProperties (Internal)
|
@interface OpenVPNConfigurationEvaluation (Internal)
|
||||||
|
|
||||||
- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval;
|
- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval;
|
||||||
|
|
||||||
+7
-2
@@ -1,5 +1,5 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNProperties.h
|
// OpenVPNConfigurationEvaluation.h
|
||||||
// OpenVPN Adapter
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 26.04.17.
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol);
|
typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol);
|
||||||
@class OpenVPNServerEntry;
|
@class OpenVPNServerEntry;
|
||||||
|
|
||||||
@interface OpenVPNProperties : NSObject
|
@interface OpenVPNConfigurationEvaluation : NSObject
|
||||||
|
|
||||||
/**
|
/**
|
||||||
This username must be used with profile
|
This username must be used with profile
|
||||||
@@ -33,6 +33,11 @@ typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol);
|
|||||||
*/
|
*/
|
||||||
@property (readonly, nonatomic) BOOL autologin;
|
@property (readonly, nonatomic) BOOL autologin;
|
||||||
|
|
||||||
|
/**
|
||||||
|
If YES this is an External PKI profile (no cert or key directives)
|
||||||
|
*/
|
||||||
|
@property (readonly, nonatomic) BOOL externalPki;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Static challenge, may be empty, ignored if autologin
|
Static challenge, may be empty, ignored if autologin
|
||||||
*/
|
*/
|
||||||
+5
-4
@@ -1,13 +1,13 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNProperties.m
|
// OpenVPNConfigurationEvaluation.m
|
||||||
// OpenVPN Adapter
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 26.04.17.
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "OpenVPNProperties.h"
|
#import "OpenVPNConfigurationEvaluation.h"
|
||||||
#import "OpenVPNProperties+Internal.h"
|
#import "OpenVPNConfigurationEvaluation+Internal.h"
|
||||||
|
|
||||||
#include <openvpn/common/number.hpp>
|
#include <openvpn/common/number.hpp>
|
||||||
|
|
||||||
@@ -16,7 +16,7 @@
|
|||||||
|
|
||||||
using namespace openvpn;
|
using namespace openvpn;
|
||||||
|
|
||||||
@implementation OpenVPNProperties
|
@implementation OpenVPNConfigurationEvaluation
|
||||||
|
|
||||||
- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval {
|
- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval {
|
||||||
if (self = [super init]) {
|
if (self = [super init]) {
|
||||||
@@ -26,6 +26,7 @@ using namespace openvpn;
|
|||||||
_friendlyName = !eval.friendlyName.empty() ? [NSString stringWithUTF8String:eval.friendlyName.c_str()] : nil;
|
_friendlyName = !eval.friendlyName.empty() ? [NSString stringWithUTF8String:eval.friendlyName.c_str()] : nil;
|
||||||
|
|
||||||
_autologin = eval.autologin;
|
_autologin = eval.autologin;
|
||||||
|
_externalPki = eval.externalPki;
|
||||||
|
|
||||||
_staticChallenge = !eval.staticChallenge.empty() ? [NSString stringWithUTF8String:eval.staticChallenge.c_str()] : nil;
|
_staticChallenge = !eval.staticChallenge.empty() ? [NSString stringWithUTF8String:eval.staticChallenge.c_str()] : nil;
|
||||||
_staticChallengeEcho = eval.staticChallengeEcho;
|
_staticChallengeEcho = eval.staticChallengeEcho;
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
//
|
|
||||||
// CustomFlow.swift
|
|
||||||
// OpenVPN Adapter
|
|
||||||
//
|
|
||||||
// Created by Sergey Abramchuk on 28.10.2017.
|
|
||||||
//
|
|
||||||
|
|
||||||
import NetworkExtension
|
|
||||||
@testable import OpenVPNAdapter
|
|
||||||
|
|
||||||
class CustomFlow: NSObject, OpenVPNAdapterPacketFlow {
|
|
||||||
|
|
||||||
func readPackets(completionHandler: @escaping ([Data], [NSNumber]) -> Void) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
func writePackets(_ packets: [Data], withProtocols protocols: [NSNumber]) -> Bool {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -12,82 +12,124 @@ import NetworkExtension
|
|||||||
|
|
||||||
class OpenVPNAdapterTests: XCTestCase {
|
class OpenVPNAdapterTests: XCTestCase {
|
||||||
|
|
||||||
enum ExpectationsType {
|
private class CustomFlow: NSObject, OpenVPNAdapterPacketFlow {
|
||||||
case connection
|
|
||||||
|
func readPackets(completionHandler: @escaping ([Data], [NSNumber]) -> Void) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func writePackets(_ packets: [Data], withProtocols protocols: [NSNumber]) -> Bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
let customFlow = CustomFlow()
|
private class AdapterDelegate: NSObject, OpenVPNAdapterDelegate {
|
||||||
|
|
||||||
|
let settingsHandler: (NEPacketTunnelNetworkSettings?) -> Void
|
||||||
|
let errorHandler: (Error) -> Void
|
||||||
|
let eventHandler: (OpenVPNAdapterEvent) -> Void
|
||||||
|
|
||||||
|
init(
|
||||||
|
settingsHandler: @escaping (NEPacketTunnelNetworkSettings?) -> Void,
|
||||||
|
errorHandler: @escaping (Error) -> Void,
|
||||||
|
eventHandler: @escaping (OpenVPNAdapterEvent) -> Void
|
||||||
|
) {
|
||||||
|
self.settingsHandler = settingsHandler
|
||||||
|
self.errorHandler = errorHandler
|
||||||
|
self.eventHandler = eventHandler
|
||||||
|
|
||||||
|
super.init()
|
||||||
|
}
|
||||||
|
|
||||||
|
func openVPNAdapter(
|
||||||
|
_ openVPNAdapter: OpenVPNAdapter,
|
||||||
|
configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?,
|
||||||
|
completionHandler: @escaping (Error?) -> Void
|
||||||
|
) {
|
||||||
|
settingsHandler(networkSettings)
|
||||||
|
completionHandler(nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) {
|
||||||
|
errorHandler(error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func openVPNAdapter(
|
||||||
|
_ openVPNAdapter: OpenVPNAdapter, handleEvent event: OpenVPNAdapterEvent, message: String?
|
||||||
|
) {
|
||||||
|
eventHandler(event)
|
||||||
|
}
|
||||||
|
|
||||||
|
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) {
|
||||||
|
print(logMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
var expectations = [ExpectationsType : XCTestExpectation]()
|
private let customFlow = CustomFlow()
|
||||||
|
|
||||||
override func setUp() {
|
override func setUp() {
|
||||||
super.setUp()
|
super.setUp()
|
||||||
expectations.removeAll()
|
|
||||||
}
|
}
|
||||||
|
|
||||||
override func tearDown() {
|
override func tearDown() {
|
||||||
super.tearDown()
|
super.tearDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
func testApplyConfiguration() {
|
func testVPNConnection() {
|
||||||
guard let vpnConfiguration = VPNProfile.configuration.data(using: .utf8) else { fatalError() }
|
|
||||||
|
|
||||||
let adapter = OpenVPNAdapter()
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
let configuration = OpenVPNConfiguration()
|
||||||
configuration.fileContent = vpnConfiguration
|
configuration.fileContent = VPNProfile.live.configuration.data(using: .utf8)
|
||||||
configuration.settings = ["auth-user-pass": ""]
|
|
||||||
|
var settings = VPNProfile.live.settings ?? [:]
|
||||||
let result: OpenVPNProperties
|
|
||||||
|
if let key = VPNProfile.live.key, let cert = VPNProfile.live.cert {
|
||||||
|
settings["cert"] = cert.replacingOccurrences(of: "\n", with: "\\n")
|
||||||
|
settings["key"] = key.replacingOccurrences(of: "\n", with: "\\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.settings = settings
|
||||||
|
|
||||||
|
let preEvaluation: OpenVPNConfigurationEvaluation
|
||||||
do {
|
do {
|
||||||
result = try adapter.apply(configuration: configuration)
|
preEvaluation = try OpenVPNAdapter.evaluate(configuration: configuration)
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Failed to configure OpenVPN adapted due to error: \(error)")
|
XCTFail("Evaluation failed due to error: \(error)")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
XCTAssert(result.remoteHost == VPNProfile.remoteHost)
|
guard !preEvaluation.externalPki else {
|
||||||
XCTAssert(result.remotePort == VPNProfile.remotePort)
|
XCTFail("Currently profile cannot be External PKI as it is not imlemented yet.")
|
||||||
XCTAssert(result.autologin == false)
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func testProvideCredentials() {
|
if preEvaluation.isPrivateKeyPasswordRequired {
|
||||||
|
guard let keyPassword = VPNProfile.live.keyPassword else {
|
||||||
|
XCTFail("Private key password required.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.privateKeyPassword = keyPassword
|
||||||
|
}
|
||||||
|
|
||||||
let adapter = OpenVPNAdapter()
|
let adapter = OpenVPNAdapter()
|
||||||
|
|
||||||
let credentials = OpenVPNCredentials()
|
let finalEvaluation: OpenVPNConfigurationEvaluation
|
||||||
credentials.username = "username"
|
|
||||||
credentials.password = "password"
|
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try adapter.provide(credentials: credentials)
|
finalEvaluation = try adapter.apply(configuration: configuration)
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Failed to provide credentials. \(error)")
|
XCTFail("Failed to apply OpenVPN configuration due to error: \(error)")
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
// Test connection to the VPN server
|
|
||||||
func testConnection() {
|
|
||||||
guard let vpnConfiguration = VPNProfile.configuration.data(using: .utf8) else { fatalError() }
|
|
||||||
|
|
||||||
let adapter = OpenVPNAdapter()
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
|
||||||
configuration.fileContent = vpnConfiguration
|
|
||||||
|
|
||||||
let result: OpenVPNProperties
|
|
||||||
do {
|
|
||||||
result = try adapter.apply(configuration: configuration)
|
|
||||||
} catch {
|
|
||||||
XCTFail("Failed to configure OpenVPN adapted due to error: \(error)")
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if !result.autologin {
|
if !finalEvaluation.autologin {
|
||||||
|
guard let username = VPNProfile.live.username, let password = VPNProfile.live.password else {
|
||||||
|
XCTFail("If unable to autologin, username and password must be provided.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
let credentials = OpenVPNCredentials()
|
let credentials = OpenVPNCredentials()
|
||||||
credentials.username = VPNProfile.username
|
credentials.username = username
|
||||||
credentials.password = VPNProfile.password
|
credentials.password = password
|
||||||
|
|
||||||
do {
|
do {
|
||||||
try adapter.provide(credentials: credentials)
|
try adapter.provide(credentials: credentials)
|
||||||
@@ -97,48 +139,28 @@ class OpenVPNAdapterTests: XCTestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
expectations[.connection] = expectation(description: "me.ss-abramchuk.openvpn-adapter.connection")
|
let connectionExpectation = XCTestExpectation(
|
||||||
|
description: "Establish connection using \(VPNProfile.live.profileName)"
|
||||||
adapter.delegate = self
|
)
|
||||||
adapter.connect(using: customFlow)
|
|
||||||
|
|
||||||
waitForExpectations(timeout: 30.0) { (error) in
|
|
||||||
adapter.disconnect()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
extension OpenVPNAdapterTests: OpenVPNAdapterDelegate {
|
|
||||||
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, completionHandler: @escaping (Error?) -> Void) {
|
|
||||||
completionHandler(nil)
|
|
||||||
}
|
|
||||||
|
|
||||||
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleEvent event: OpenVPNAdapterEvent, message: String?) {
|
|
||||||
switch event {
|
|
||||||
case .connected:
|
|
||||||
guard let connectionExpectation = expectations[.connection] else { return }
|
|
||||||
connectionExpectation.fulfill()
|
|
||||||
|
|
||||||
case .disconnected:
|
|
||||||
break
|
|
||||||
|
|
||||||
default:
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) {
|
|
||||||
if let connectionExpectation = expectations[.connection] {
|
|
||||||
XCTFail("Failed to establish conection.")
|
|
||||||
connectionExpectation.fulfill()
|
|
||||||
}
|
|
||||||
|
|
||||||
dump(error)
|
let adapterDelegate = AdapterDelegate(
|
||||||
|
settingsHandler: { (settings) in
|
||||||
|
|
||||||
|
},
|
||||||
|
errorHandler: { (error) in
|
||||||
|
XCTFail("Failed to establish conection due to error: \(error)")
|
||||||
|
},
|
||||||
|
eventHandler: { (event) in
|
||||||
|
guard event == .connected else { return }
|
||||||
|
|
||||||
|
connectionExpectation.fulfill()
|
||||||
|
adapter.disconnect()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
adapter.delegate = adapterDelegate
|
||||||
|
adapter.connect(using: customFlow)
|
||||||
|
|
||||||
|
wait(for: [connectionExpectation], timeout: 15.0)
|
||||||
}
|
}
|
||||||
|
|
||||||
func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) {
|
|
||||||
print(logMessage)
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,8 +9,6 @@
|
|||||||
import XCTest
|
import XCTest
|
||||||
@testable import OpenVPNAdapter
|
@testable import OpenVPNAdapter
|
||||||
|
|
||||||
// TODO: Test getting/setting of all properties of OpenVPNConfiguration
|
|
||||||
|
|
||||||
class OpenVPNConfigurationTests: XCTestCase {
|
class OpenVPNConfigurationTests: XCTestCase {
|
||||||
|
|
||||||
override func setUp() {
|
override func setUp() {
|
||||||
@@ -23,135 +21,148 @@ class OpenVPNConfigurationTests: XCTestCase {
|
|||||||
super.tearDown()
|
super.tearDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGetSetProfile() {
|
func testEvaluateEmptyConfig() {
|
||||||
guard let originalProfile = VPNProfile.configuration.data(using: .utf8) else { fatalError() }
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
let configuration = OpenVPNConfiguration()
|
||||||
|
|
||||||
guard configuration.fileContent == nil else {
|
do {
|
||||||
XCTFail("Empty file content should return nil")
|
let _ = try OpenVPNAdapter.evaluate(configuration: configuration)
|
||||||
return
|
XCTFail("We shouldn't be here, evaluation should fail.")
|
||||||
|
} catch {
|
||||||
|
guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool else {
|
||||||
|
XCTFail("Error should contain OpenVPNAdapterErrorFatalKey.")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
XCTAssert(fatal)
|
||||||
}
|
}
|
||||||
|
|
||||||
configuration.fileContent = originalProfile
|
|
||||||
|
|
||||||
guard let returnedProfile = configuration.fileContent else {
|
|
||||||
XCTFail("Returned file content should not be nil")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
XCTAssert(originalProfile.elementsEqual(returnedProfile))
|
|
||||||
|
|
||||||
configuration.fileContent = nil
|
|
||||||
XCTAssert(configuration.fileContent == nil, "Empty file content should return nil")
|
|
||||||
|
|
||||||
configuration.fileContent = Data()
|
|
||||||
XCTAssert(configuration.fileContent == nil, "Empty file content should return nil")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGetSetSettings() {
|
func testEvaluateManuallyPopulatedConfig() {
|
||||||
let originalSettings = [
|
let configuration = OpenVPNConfiguration()
|
||||||
|
|
||||||
|
guard let caURL = Bundle.current.url(forResource: "ca", withExtension: "crt"),
|
||||||
|
let caContent = try? String(contentsOf: caURL, encoding: .utf8)
|
||||||
|
else {
|
||||||
|
fatalError("Failed to get ca.crt, check its existance in the Resources folder.")
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let certURL = Bundle.current.url(forResource: "client", withExtension: "crt"),
|
||||||
|
let certContent = try? String(contentsOf: certURL, encoding: .utf8)
|
||||||
|
else {
|
||||||
|
fatalError("Failed to get client.crt, check its existance in the Resources folder.")
|
||||||
|
}
|
||||||
|
|
||||||
|
guard let keyURL = Bundle.current.url(forResource: "client", withExtension: "key"),
|
||||||
|
let keyContent = try? String(contentsOf: keyURL, encoding: .utf8)
|
||||||
|
else {
|
||||||
|
fatalError("Failed to get client.key, check its existance in the Resources folder.")
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.settings = [
|
||||||
"client": "",
|
"client": "",
|
||||||
"dev": "tun",
|
"dev": "tun",
|
||||||
"remote-cert-tls" : "server"
|
"proto": "udp",
|
||||||
|
"remote": "my-server.com 1194",
|
||||||
|
"resolv-retry": "infinite",
|
||||||
|
"nobind": "",
|
||||||
|
"auth-user-pass": "",
|
||||||
|
"cipher": "AES-256-CBC",
|
||||||
|
"comp-lzo": "",
|
||||||
|
"verb": "3",
|
||||||
|
"ca": caContent.replacingOccurrences(of: "\n", with: "\\n"),
|
||||||
|
"cert": certContent.replacingOccurrences(of: "\n", with: "\\n"),
|
||||||
|
"key": keyContent.replacingOccurrences(of: "\n", with: "\\n")
|
||||||
]
|
]
|
||||||
|
|
||||||
|
let evaluation: OpenVPNConfigurationEvaluation
|
||||||
|
do {
|
||||||
|
evaluation = try OpenVPNAdapter.evaluate(configuration: configuration)
|
||||||
|
} catch {
|
||||||
|
XCTFail("Evaluation failed due to error: \(error)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
XCTAssert(evaluation.remoteHost == "my-server.com")
|
||||||
|
XCTAssert(evaluation.remotePort == 1194)
|
||||||
|
|
||||||
|
XCTAssert(
|
||||||
|
!evaluation.autologin, "Username and password are required so autologin should be false."
|
||||||
|
)
|
||||||
|
|
||||||
|
XCTAssert(
|
||||||
|
!evaluation.externalPki,
|
||||||
|
"Key and cert were provided to the configuration so it shouldn't be External PKI profile."
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func testEvaluateConfigFromFile() {
|
||||||
let configuration = OpenVPNConfiguration()
|
let configuration = OpenVPNConfiguration()
|
||||||
|
|
||||||
guard configuration.settings == nil else {
|
guard let configURL = Bundle.current.url(forResource: "client", withExtension: "ovpn"),
|
||||||
XCTFail("Empty settings should return nil")
|
let configContent = try? Data(contentsOf: configURL)
|
||||||
|
else {
|
||||||
|
fatalError("Failed to get client.ovpn, check its existance in the Resources folder.")
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.fileContent = configContent
|
||||||
|
|
||||||
|
let evaluation: OpenVPNConfigurationEvaluation
|
||||||
|
do {
|
||||||
|
evaluation = try OpenVPNAdapter.evaluate(configuration: configuration)
|
||||||
|
} catch {
|
||||||
|
XCTFail("Evaluation failed due to error: \(error)")
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
configuration.settings = originalSettings
|
XCTAssert(evaluation.remoteHost == "my-server.com")
|
||||||
|
XCTAssert(evaluation.remotePort == 1194)
|
||||||
|
|
||||||
guard let returnedSettings = configuration.settings else {
|
XCTAssert(
|
||||||
XCTFail("Returned settings should not be nil")
|
!evaluation.autologin, "Username and password required so autologin should be false."
|
||||||
return
|
)
|
||||||
}
|
|
||||||
|
|
||||||
let equals = originalSettings.allSatisfy { (key, value) in
|
XCTAssert(
|
||||||
returnedSettings[key] == value
|
evaluation.externalPki,
|
||||||
}
|
"Key and cert were not provided to the configuration so it should be External PKI profile."
|
||||||
|
)
|
||||||
XCTAssert(equals)
|
|
||||||
|
|
||||||
configuration.settings = [:]
|
|
||||||
XCTAssert(configuration.settings == nil, "Empty settings should return nil")
|
|
||||||
|
|
||||||
configuration.settings = nil
|
|
||||||
XCTAssert(configuration.settings == nil, "Empty settings should return nil")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGetSetRemote() {
|
func testSetConfigurationProperties() {
|
||||||
guard let originalProfile = VPNProfile.configuration.data(using: .utf8) else { fatalError() }
|
|
||||||
|
|
||||||
let originalServer = "192.168.1.200"
|
|
||||||
let originalPort: UInt = 12000
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
|
||||||
configuration.fileContent = originalProfile
|
|
||||||
|
|
||||||
XCTAssertNil(configuration.server)
|
|
||||||
XCTAssertEqual(configuration.port, 0)
|
|
||||||
|
|
||||||
configuration.server = originalServer
|
|
||||||
configuration.port = originalPort
|
|
||||||
|
|
||||||
XCTAssertNotNil(configuration.server)
|
|
||||||
XCTAssertEqual(configuration.server, originalServer)
|
|
||||||
XCTAssertEqual(configuration.port, originalPort)
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGetSetProto() {
|
|
||||||
let originalOption: OpenVPNTransportProtocol = .UDP
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
let configuration = OpenVPNConfiguration()
|
||||||
|
|
||||||
guard configuration.proto == .default else {
|
guard let configURL = Bundle.current.url(forResource: "client", withExtension: "ovpn"),
|
||||||
XCTFail("proto option should return default value")
|
let configContent = try? Data(contentsOf: configURL)
|
||||||
return
|
else {
|
||||||
|
fatalError("Failed to get client.ovpn, check its existance in the Resources folder.")
|
||||||
}
|
}
|
||||||
|
|
||||||
configuration.proto = originalOption
|
configuration.fileContent = configContent
|
||||||
guard configuration.proto == originalOption else {
|
configuration.settings = [
|
||||||
XCTFail("proto option should be equal to original value (enabled)")
|
"persist-key": "",
|
||||||
return
|
"persist-tun": ""
|
||||||
}
|
]
|
||||||
|
|
||||||
|
configuration.server = "another-server.com"
|
||||||
|
configuration.port = 5000
|
||||||
|
|
||||||
|
XCTAssert(configuration.proto == .default)
|
||||||
|
|
||||||
|
configuration.proto = .adaptive
|
||||||
|
configuration.tlsCertProfile = .preferred
|
||||||
|
|
||||||
|
XCTAssert(configuration.fileContent?.elementsEqual(configContent) == true)
|
||||||
|
XCTAssert(configuration.settings?["persist-key"] != nil)
|
||||||
|
XCTAssert(configuration.settings?["persist-tun"] != nil)
|
||||||
|
|
||||||
|
XCTAssert(configuration.server == "another-server.com")
|
||||||
|
XCTAssert(configuration.port == 5000)
|
||||||
|
|
||||||
|
XCTAssert(configuration.proto == .adaptive)
|
||||||
|
XCTAssert(configuration.tlsCertProfile == .preferred)
|
||||||
|
|
||||||
|
XCTAssert(configuration.ipv6 == .default)
|
||||||
|
|
||||||
|
configuration.ipv6 = .enabled
|
||||||
|
XCTAssert(configuration.ipv6 == .enabled)
|
||||||
}
|
}
|
||||||
|
|
||||||
func testGetSetIPv6() {
|
|
||||||
let originalOption: OpenVPNIPv6Preference = .enabled
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
|
||||||
|
|
||||||
guard configuration.ipv6 == .default else {
|
|
||||||
XCTFail("IPv6 option should return default value")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
configuration.ipv6 = originalOption
|
|
||||||
guard configuration.ipv6 == originalOption else {
|
|
||||||
XCTFail("IPv6 option should be equal to original value (enabled)")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func testGetSetTLSCertProfile() {
|
|
||||||
let originalOption: OpenVPNTLSCertProfile = .preferred
|
|
||||||
|
|
||||||
let configuration = OpenVPNConfiguration()
|
|
||||||
|
|
||||||
guard configuration.tlsCertProfile == .default else {
|
|
||||||
XCTFail("TLS Cert Profile option should return default value")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
configuration.tlsCertProfile = originalOption
|
|
||||||
guard configuration.tlsCertProfile == originalOption else {
|
|
||||||
XCTFail("TLS Cert Profile option should be equal to original value (preferred)")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,7 +7,11 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import XCTest
|
import XCTest
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
import CoreWLAN
|
import CoreWLAN
|
||||||
|
#endif
|
||||||
|
|
||||||
@testable import OpenVPNAdapter
|
@testable import OpenVPNAdapter
|
||||||
|
|
||||||
class OpenVPNReachabilityTests: XCTestCase {
|
class OpenVPNReachabilityTests: XCTestCase {
|
||||||
@@ -22,6 +26,7 @@ class OpenVPNReachabilityTests: XCTestCase {
|
|||||||
super.tearDown()
|
super.tearDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if os(macOS)
|
||||||
func testReachability() {
|
func testReachability() {
|
||||||
let wifiClient = CWWiFiClient.shared()
|
let wifiClient = CWWiFiClient.shared()
|
||||||
guard let interface = wifiClient.interface() else {
|
guard let interface = wifiClient.interface() else {
|
||||||
@@ -62,4 +67,5 @@ class OpenVPNReachabilityTests: XCTestCase {
|
|||||||
waitForExpectations(timeout: 30.0, handler: nil)
|
waitForExpectations(timeout: 30.0, handler: nil)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -9,11 +9,41 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
struct VPNProfile {
|
struct VPNProfile {
|
||||||
static let username: String = <#OPENVPN_USERNAME#>
|
let profileName: String
|
||||||
static let password: String = <#OPENVPN_PASSWORD#>
|
|
||||||
|
|
||||||
static let configuration: String = <#OPENVPN_CONFIGURATION#>
|
let configuration: String
|
||||||
|
|
||||||
static let remoteHost: String = <#OPENVPN_REMOTE_HOST#>
|
let cert: String?
|
||||||
static let remotePort: Int = <#OPENVPN_REMOTE_PORT#>
|
let key: String?
|
||||||
|
|
||||||
|
let keyPassword: String?
|
||||||
|
|
||||||
|
let username: String?
|
||||||
|
let password: String?
|
||||||
|
|
||||||
|
let settings: [String: String]?
|
||||||
|
}
|
||||||
|
|
||||||
|
extension VPNProfile {
|
||||||
|
|
||||||
|
static let live: VPNProfile = {
|
||||||
|
let profileName: String = <#OPENVPN_PROFILE_NAME#>
|
||||||
|
|
||||||
|
let configuration: String = <#OPENVPN_CONFIGURATION#>
|
||||||
|
|
||||||
|
let cert: String? = <#OPENVPN_CERT#>
|
||||||
|
let key: String? = <#OPENVPN_KEY#>
|
||||||
|
|
||||||
|
let keyPassword: String? = <#PRIVATE_KEY_PASSWORD#>
|
||||||
|
|
||||||
|
let username: String? = <#OPENVPN_USERNAME#>
|
||||||
|
let password: String? = <#OPENVPN_PASSWORD#>
|
||||||
|
|
||||||
|
let settings: [String: String]? = <#OPENVPN_ADDITIONAL_SETTINGS#>
|
||||||
|
|
||||||
|
return VPNProfile(
|
||||||
|
profileName: profileName, configuration: configuration, cert: cert, key: key, keyPassword: keyPassword,
|
||||||
|
username: username, password: password, settings: settings
|
||||||
|
)
|
||||||
|
}()
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
Certificate:
|
||||||
|
Data:
|
||||||
|
Version: 3 (0x2)
|
||||||
|
Serial Number: 2 (0x2)
|
||||||
|
Signature Algorithm: sha256WithRSAEncryption
|
||||||
|
Issuer: C=KG, ST=NA, L=BISHKEK, O=OpenVPN-TEST/emailAddress=me@myhost.mydomain
|
||||||
|
Validity
|
||||||
|
Not Before: Oct 22 21:59:53 2014 GMT
|
||||||
|
Not After : Oct 19 21:59:53 2024 GMT
|
||||||
|
Subject: C=KG, ST=NA, O=OpenVPN-TEST, CN=Test-Client/emailAddress=me@myhost.mydomain
|
||||||
|
Subject Public Key Info:
|
||||||
|
Public Key Algorithm: rsaEncryption
|
||||||
|
Public-Key: (2048 bit)
|
||||||
|
Modulus:
|
||||||
|
00:ec:65:8f:e9:12:c2:1a:5b:e6:56:2a:08:a9:82:
|
||||||
|
3a:2d:44:78:a3:00:3b:b0:9f:e7:27:10:40:93:ef:
|
||||||
|
f1:cc:3e:a0:aa:04:a2:80:1b:13:a9:e6:fe:81:d6:
|
||||||
|
70:90:a8:d8:d4:de:30:d8:35:00:d2:be:62:f0:48:
|
||||||
|
da:fc:15:8d:c4:c6:6d:0b:99:f1:2b:83:00:0a:d3:
|
||||||
|
2a:23:0b:e5:cd:f9:35:df:43:61:15:72:ad:95:98:
|
||||||
|
f6:73:21:41:5e:a0:dd:47:27:a0:d5:9a:d4:41:a8:
|
||||||
|
1c:1d:57:20:71:17:8f:f7:28:9e:3e:07:ce:ec:d5:
|
||||||
|
0e:42:4f:1e:74:47:8e:47:9d:d2:14:28:27:2c:14:
|
||||||
|
10:f5:d1:96:b5:93:74:84:ef:f9:04:de:8d:4a:6f:
|
||||||
|
df:77:ab:ea:d1:58:d3:44:fe:5a:04:01:ff:06:7a:
|
||||||
|
97:f7:fd:e3:57:48:e1:f0:df:40:13:9f:66:23:5a:
|
||||||
|
e3:55:54:3d:54:39:ee:00:f9:12:f1:d2:df:74:2e:
|
||||||
|
ba:d7:f0:8d:c6:dd:18:58:1c:93:22:0b:75:fa:a8:
|
||||||
|
d6:e0:b5:2f:2d:b9:d4:fe:b9:4f:86:e2:75:48:16:
|
||||||
|
60:fb:3f:c9:b4:30:42:29:fb:3b:b3:2b:b9:59:81:
|
||||||
|
6a:46:f3:45:83:bf:fd:d5:1a:ff:37:0c:6f:5b:fd:
|
||||||
|
61:f1
|
||||||
|
Exponent: 65537 (0x10001)
|
||||||
|
X509v3 extensions:
|
||||||
|
X509v3 Basic Constraints:
|
||||||
|
CA:FALSE
|
||||||
|
X509v3 Subject Key Identifier:
|
||||||
|
D2:B4:36:0F:B1:FC:DD:A5:EA:2A:F7:C7:23:89:FA:E3:FA:7A:44:1D
|
||||||
|
X509v3 Authority Key Identifier:
|
||||||
|
keyid:2B:40:E5:C9:7D:F5:F4:96:38:E9:2F:E3:2F:D9:40:64:C9:8E:05:9B
|
||||||
|
DirName:/C=KG/ST=NA/L=BISHKEK/O=OpenVPN-TEST/emailAddress=me@myhost.mydomain
|
||||||
|
serial:A1:4E:DE:FA:90:F2:AE:81
|
||||||
|
|
||||||
|
Signature Algorithm: sha256WithRSAEncryption
|
||||||
|
7f:e0:fe:84:a7:ec:df:62:a5:cd:3c:c1:e6:42:b1:31:12:f0:
|
||||||
|
b9:da:a7:9e:3f:bd:96:52:b6:fc:55:74:64:3e:e4:ff:7e:aa:
|
||||||
|
f7:3e:06:18:5f:73:85:f8:c8:e0:67:1b:4d:97:ca:05:d0:37:
|
||||||
|
07:33:64:9b:e6:78:77:14:9a:55:bb:2a:ac:c3:7f:c9:15:08:
|
||||||
|
83:5c:c8:c2:61:d3:71:4c:05:0b:2b:cb:a3:87:6d:a0:32:ed:
|
||||||
|
b0:b3:27:97:4a:55:8d:01:2a:30:56:68:ab:f2:da:5c:10:73:
|
||||||
|
c9:aa:0a:9c:4b:4c:a0:5b:51:6e:0a:7e:6c:53:80:b0:00:e1:
|
||||||
|
1e:9a:4c:0a:37:9e:20:89:bc:c5:e5:79:58:b7:45:ff:d3:c4:
|
||||||
|
a1:fd:d9:78:3d:45:16:74:df:82:44:1d:1d:81:50:5a:b9:32:
|
||||||
|
4c:e2:4f:3f:0e:3a:65:5a:64:83:3b:29:31:c4:99:88:bc:c5:
|
||||||
|
84:39:f2:19:12:e1:66:d0:ea:fb:75:b1:d2:27:be:91:59:a3:
|
||||||
|
2b:09:d5:5c:bf:46:8e:d6:67:d6:0b:ec:da:ab:f0:80:19:87:
|
||||||
|
64:07:a9:77:b1:5e:0c:e2:c5:1d:6a:ac:5d:23:f3:30:75:36:
|
||||||
|
4e:ca:c3:4e:b0:4d:8c:2c:ce:52:61:63:de:d5:f5:ef:ef:0a:
|
||||||
|
6b:23:25:26:3c:3a:f2:c3:c2:16:19:3f:a9:32:ba:68:f9:c9:
|
||||||
|
12:3c:3e:c6:1f:ff:9b:4e:f4:90:b0:63:f5:d1:33:00:30:5a:
|
||||||
|
e8:24:fa:35:44:9b:6a:80:f3:a6:cc:7b:3c:73:5f:50:c4:30:
|
||||||
|
71:d8:74:90:27:0a:01:4e:a5:5e:b1:f8:da:c2:61:81:11:ae:
|
||||||
|
29:a3:8f:fa:7e:4c:4e:62:b1:00:de:92:e3:8f:6a:2e:da:d9:
|
||||||
|
38:5d:6b:7c:0d:e4:01:aa:c8:c6:6d:8b:cd:c0:c8:6e:e4:57:
|
||||||
|
21:8a:f6:46:30:d9:ad:51:a1:87:96:a6:53:c9:1e:c6:bb:c3:
|
||||||
|
eb:55:fe:8c:d6:5c:d5:c6:f3:ca:b0:60:d2:d4:2a:1f:88:94:
|
||||||
|
d3:4c:1a:da:0c:94:fe:c1:5d:0d:2a:db:99:29:5d:f6:dd:16:
|
||||||
|
c4:c8:4d:74:9e:80:d9:d0:aa:ed:7b:e3:30:e4:47:d8:f5:15:
|
||||||
|
c1:71:b8:c6:fd:ee:fc:9e:b2:5f:b5:b7:92:ed:ff:ca:37:f6:
|
||||||
|
c7:82:b4:54:13:9b:83:cd:87:8b:7e:64:f6:2e:54:3a:22:b1:
|
||||||
|
c5:c1:f4:a5:25:53:9a:4d:a8:0f:e7:35:4b:89:df:19:83:66:
|
||||||
|
64:d9:db:d1:61:2b:24:1b:1d:44:44:fb:49:30:87:b7:49:23:
|
||||||
|
08:02:8a:e0:25:f3:f4:43
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
CAKK4CXz9EM=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
-----BEGIN PRIVATE KEY-----
|
||||||
|
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQDsZY/pEsIaW+ZW
|
||||||
|
KgipgjotRHijADuwn+cnEECT7/HMPqCqBKKAGxOp5v6B1nCQqNjU3jDYNQDSvmLw
|
||||||
|
SNr8FY3Exm0LmfErgwAK0yojC+XN+TXfQ2EVcq2VmPZzIUFeoN1HJ6DVmtRBqBwd
|
||||||
|
VyBxF4/3KJ4+B87s1Q5CTx50R45HndIUKCcsFBD10Za1k3SE7/kE3o1Kb993q+rR
|
||||||
|
WNNE/loEAf8Gepf3/eNXSOHw30ATn2YjWuNVVD1UOe4A+RLx0t90LrrX8I3G3RhY
|
||||||
|
HJMiC3X6qNbgtS8tudT+uU+G4nVIFmD7P8m0MEIp+zuzK7lZgWpG80WDv/3VGv83
|
||||||
|
DG9b/WHxAgMBAAECggEBAIOdaCpUD02trOh8LqZxowJhBOl7z7/ex0uweMPk67LT
|
||||||
|
i5AdVHwOlzwZJ8oSIknoOBEMRBWcLQEojt1JMuL2/R95emzjIKshHHzqZKNulFvB
|
||||||
|
TIUpdnwChTKtH0mqUkLlPU3Ienty4IpNlpmfUKimfbkWHERdBJBHbtDsTABhdo3X
|
||||||
|
9pCF/yRKqJS2Fy/Mkl3gv1y/NB1OL4Jhl7vQbf+kmgfQN2qdOVe2BOKQ8NlPUDmE
|
||||||
|
/1XNIDaE3s6uvUaoFfwowzsCCwN2/8QrRMMKkjvV+lEVtNmQdYxj5Xj5IwS0vkK0
|
||||||
|
6icsngW87cpZxxc1zsRWcSTloy5ohub4FgKhlolmigECgYEA+cBlxzLvaMzMlBQY
|
||||||
|
kCac9KQMvVL+DIFHlZA5i5L/9pRVp4JJwj3GUoehFJoFhsxnKr8HZyLwBKlCmUVm
|
||||||
|
VxnshRWiAU18emUmeAtSGawlAS3QXhikVZDdd/L20YusLT+DXV81wlKR97/r9+17
|
||||||
|
klQOLkSdPm9wcMDOWMNHX8bUg8kCgYEA8k+hQv6+TR/+Beao2IIctFtw/EauaJiJ
|
||||||
|
wW5ql1cpCLPMAOQUvjs0Km3zqctfBF8mUjdkcyJ4uhL9FZtfywY22EtRIXOJ/8VR
|
||||||
|
we65mVo6RLR8YVM54sihanuFOnlyF9LIBWB+9pUfh1/Y7DSebh7W73uxhAxQhi3Y
|
||||||
|
QwfIQIFd8OkCgYBalH4VXhLYhpaYCiXSej6ot6rrK2N6c5Tb2MAWMA1nh+r84tMP
|
||||||
|
gMoh+pDgYPAqMI4mQbxUmqZEeoLuBe6VHpDav7rPECRaW781AJ4ZM4cEQ3Jz/inz
|
||||||
|
4qOAMn10CF081/Ez9ykPPlU0bsYNWHNd4eB2xWnmUBKOwk7UgJatVPaUiQKBgQCI
|
||||||
|
f18CVGpzG9CHFnaK8FCnMNOm6VIaTcNcGY0mD81nv5Dt943P054BQMsAHTY7SjZW
|
||||||
|
HioRyZtkhonXAB2oSqnekh7zzxgv4sG5k3ct8evdBCcE1FNJc2eqikZ0uDETRoOy
|
||||||
|
s7cRxNNr+QxDkyikM+80HOPU1PMPgwfOSrX90GJQ8QKBgEBKohGMV/sNa4t14Iau
|
||||||
|
qO8aagoqh/68K9GFXljsl3/iCSa964HIEREtW09Qz1w3dotEgp2w8bsDa+OwWrLy
|
||||||
|
0SY7T5jRViM3cDWRlUBLrGGiL0FiwsfqiRiji60y19erJgrgyGVIb1kIgIBRkgFM
|
||||||
|
2MMweASzTmZcri4PA/5C0HYb
|
||||||
|
-----END PRIVATE KEY-----
|
||||||
Executable
+47
@@ -0,0 +1,47 @@
|
|||||||
|
client
|
||||||
|
dev tun
|
||||||
|
proto udp
|
||||||
|
remote my-server.com 1194
|
||||||
|
resolv-retry infinite
|
||||||
|
nobind
|
||||||
|
auth-user-pass
|
||||||
|
cipher AES-256-CBC
|
||||||
|
comp-lzo
|
||||||
|
verb 3
|
||||||
|
<ca>
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
</ca>
|
||||||
Reference in New Issue
Block a user