From f7b168e1146be97406efed449d721d5a72fe5e69 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:50:53 +0300 Subject: [PATCH] Return the methods and configurations related to the tun builder which were removed after merging --- Configuration/Framework.xcconfig | 2 +- .../Resources/free_openvpn_udp_us.ovpn | 99 ------ OpenVPN Adapter.xcodeproj/project.pbxproj | 18 +- OpenVPN Adapter/OpenVPNAdapter+Internal.h | 18 + OpenVPN Adapter/OpenVPNAdapter.mm | 327 +++++++++++++++++- OpenVPN Adapter/OpenVPNClient.h | 42 ++- OpenVPN Adapter/OpenVPNClient.mm | 82 ++++- OpenVPN Adapter/TUNConfiguration.h | 23 ++ OpenVPN Adapter/TUNConfiguration.m | 30 ++ 9 files changed, 525 insertions(+), 116 deletions(-) delete mode 100644 OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn create mode 100644 OpenVPN Adapter/TUNConfiguration.h create mode 100644 OpenVPN Adapter/TUNConfiguration.m diff --git a/Configuration/Framework.xcconfig b/Configuration/Framework.xcconfig index bb9aef2..c929a26 100755 --- a/Configuration/Framework.xcconfig +++ b/Configuration/Framework.xcconfig @@ -12,5 +12,5 @@ LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(VENDORS_PATH)/lz4/lib/sim" "$(VE LIBRARY_SEARCH_PATHS[sdk=iphoneos*] = "$(VENDORS_PATH)/lz4/lib/ios" "$(VENDORS_PATH)/mbedtls/lib/ios" LIBRARY_SEARCH_PATHS[sdk=macosx*] = "$(VENDORS_PATH)/lz4/lib/macos" "$(VENDORS_PATH)/mbedtls/lib/macos" OTHER_LDFLAGS = -lmbedtls -lmbedx509 -lmbedcrypto -llz4 -OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS) -DUSE_ASIO -DASIO_STANDALONE -DASIO_NO_DEPRECATED -DHAVE_LZ4 -DUSE_MBEDTLS -DOPENVPN_EXTERNAL_TUN_FACTORY +OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS) -DUSE_ASIO -DASIO_STANDALONE -DASIO_NO_DEPRECATED -DHAVE_LZ4 -DUSE_MBEDTLS -DOPENVPN_FORCE_TUN_NULL -DUSE_TUN_BUILDER GCC_WARN_64_TO_32_BIT_CONVERSION = NO diff --git a/OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn deleted file mode 100644 index 05a1332..0000000 --- a/OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn +++ /dev/null @@ -1,99 +0,0 @@ -############################### -# FreeOpenVPN.Org config file # -# https://www.freeopenvpn.org # -############################### -dev tun -proto udp -remote 76.112.143.39 1302 -cipher AES-128-CBC -auth SHA1 -resolv-retry infinite -nobind -persist-key -persist-tun -client -verb 3 - ------BEGIN CERTIFICATE----- -MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB -hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G -A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV -BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 -MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT -EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR -Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh -dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR -6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X -pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC -9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV -/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf -Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z -+pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w -qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah -SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC -u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf -Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq -crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E -FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB -/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl -wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM -4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV -2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna -FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ -CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK -boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke -jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL -S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb -QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl -0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB -NVOFBkpdn627G190 ------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.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index a50537f..9b1786e 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,8 +9,6 @@ /* Begin PBXBuildFile section */ C90BAD311E73FF6C00DEFB32 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; }; C912BB251E7C3339002B9414 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C912BB241E7C3339002B9414 /* NetworkExtension.framework */; }; - C99E2FF01EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */; }; - C99E2FF11EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */; }; C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D31EAE32670030A362 /* OpenVPNCredentials.h */; settings = {ATTRIBUTES = (Public, ); }; }; C93779D61EAE32670030A362 /* OpenVPNCredentials.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D31EAE32670030A362 /* OpenVPNCredentials.h */; settings = {ATTRIBUTES = (Public, ); }; }; C93779D71EAE32670030A362 /* OpenVPNCredentials.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */; }; @@ -87,6 +85,10 @@ C9BCE25B1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BCE2571EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm */; }; C9BCE25E1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BCE25C1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h */; }; C9BCE25F1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BCE25C1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h */; }; + C9BDB1351EBCC3B900C204FF /* TUNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */; }; + C9BDB1361EBCC3B900C204FF /* TUNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */; }; + C9BDB1371EBCC3B900C204FF /* TUNConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */; }; + C9BDB1381EBCC3B900C204FF /* TUNConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */; }; C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; }; C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */; }; C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; }; @@ -134,7 +136,6 @@ 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; }; C912BB241E7C3339002B9414 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; - C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp_us.ovpn; sourceTree = ""; }; C93779D31EAE32670030A362 /* OpenVPNCredentials.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNCredentials.h; sourceTree = ""; }; C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNCredentials.mm; sourceTree = ""; }; C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNCredentials+Internal.h"; sourceTree = ""; }; @@ -180,6 +181,8 @@ C9BCE2561EB3C0D9009D6AC1 /* OpenVPNSessionToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNSessionToken.h; sourceTree = ""; }; C9BCE2571EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNSessionToken.mm; sourceTree = ""; }; C9BCE25C1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNSessionToken+Internal.h"; sourceTree = ""; }; + C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNConfiguration.h; sourceTree = ""; }; + C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TUNConfiguration.m; sourceTree = ""; }; C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9D2ABFF1EA212A3007EDF9D /* OpenVPN Adapter macOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenVPN Adapter macOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C9FD92181E9A667600374FC4 /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/client/ovpncli.hpp; sourceTree = ""; }; @@ -272,6 +275,8 @@ C9235AC41EB24F0100C7D303 /* Configuration */ = { isa = PBXGroup; children = ( + C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */, + C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */, C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */, C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */, C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */, @@ -401,7 +406,6 @@ C9BB479A1E71836100F3F98C /* Resources */ = { isa = PBXGroup; children = ( - C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */, C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */, ); path = Resources; @@ -465,6 +469,7 @@ C9657A571EB0CDFB00EFF210 /* OpenVPNProperties+Internal.h in Headers */, C9BCE2581EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */, C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, + C9BDB1351EBCC3B900C204FF /* TUNConfiguration.h in Headers */, C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, @@ -501,6 +506,7 @@ C9657A561EB0CDFA00EFF210 /* OpenVPNProperties+Internal.h in Headers */, C9BCE2591EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */, C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, + C9BDB1361EBCC3B900C204FF /* TUNConfiguration.h in Headers */, C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, @@ -661,7 +667,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C99E2FF01EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */, C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -677,7 +682,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C99E2FF11EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */, C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -724,6 +728,7 @@ C9BCE25A1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */, C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, + C9BDB1371EBCC3B900C204FF /* TUNConfiguration.m in Sources */, C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, C9657A581EB0CE1300EFF210 /* OpenVPNProperties.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, @@ -753,6 +758,7 @@ C9BCE25B1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */, C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, + C9BDB1381EBCC3B900C204FF /* TUNConfiguration.m in Sources */, C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, C9657A591EB0CE1400EFF210 /* OpenVPNProperties.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, diff --git a/OpenVPN Adapter/OpenVPNAdapter+Internal.h b/OpenVPN Adapter/OpenVPNAdapter+Internal.h index bbc2593..d2b6f50 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Internal.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Internal.h @@ -14,8 +14,26 @@ using namespace openvpn; @interface OpenVPNAdapter (Internal) +- (BOOL)configureSockets; + +- (BOOL)setRemoteAddress:(NSString *)address isIPv6:(BOOL)isIPv6; + +- (BOOL)addLocalAddress:(NSString *)address prefixLength:(NSNumber *)prefixLength gateway:(NSString *)gateway isIPv6:(BOOL)isIPv6; + +- (BOOL)defaultGatewayRerouteIPv4:(BOOL)rerouteIPv4 rerouteIPv6:(BOOL)rerouteIPv6; +- (BOOL)addRoute:(NSString *)route prefixLength:(NSNumber *)prefixLength isIPv6:(BOOL)isIPv6; +- (BOOL)excludeRoute:(NSString *)route prefixLength:(NSNumber *)prefixLength isIPv6:(BOOL)isIPv6; + +- (BOOL)addDNSAddress:(NSString *)address isIPv6:(BOOL)isIPv6; +- (BOOL)addSearchDomain:(NSString *)domain; + +- (BOOL)setMTU:(NSNumber *)mtu; + +- (NSInteger)establishTunnel; + - (void)handleEvent:(const ClientAPI::Event *)event; - (void)handleLog:(const ClientAPI::LogInfo *)log; + - (void)tick; @end diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 50dc92e..907a064 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -14,6 +14,7 @@ #import +#import "TUNConfiguration.h" #import "OpenVPNClient.h" #import "OpenVPNError.h" #import "OpenVPNEvent.h" @@ -39,8 +40,25 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter @property OpenVPNClient *vpnClient; +@property CFSocketRef vpnSocket; +@property CFSocketRef tunSocket; + +@property (strong, nonatomic) NSString *remoteAddress; + +@property (strong, nonatomic) NSString *defaultGatewayIPv6; +@property (strong, nonatomic) NSString *defaultGatewayIPv4; + +@property (strong, nonatomic) TUNConfiguration *tunConfigurationIPv6; +@property (strong, nonatomic) TUNConfiguration *tunConfigurationIPv4; + +@property (strong, nonatomic) NSMutableArray *searchDomains; + +@property (strong, nonatomic) NSNumber *mtu; + @property (weak, nonatomic) id packetFlow; +- (void)readTUNPackets; +- (void)readVPNData:(NSData *)data; - (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName; - (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength; @@ -48,6 +66,246 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter @implementation OpenVPNAdapter (Internal) +#pragma mark Sockets Configuration + +static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFDataRef address, const void *data, void *info) { + OpenVPNAdapter *adapter = (__bridge OpenVPNAdapter *)info; + + switch (type) { + case kCFSocketDataCallBack: + [adapter readVPNData:(__bridge NSData *)data]; + break; + + default: + break; + } +} + +- (BOOL)configureSockets { + int sockets[2]; + if (socketpair(PF_LOCAL, SOCK_DGRAM, IPPROTO_IP, sockets) == -1) { + NSLog(@"Failed to create a pair of connected sockets: %@", [NSString stringWithUTF8String:strerror(errno)]); + return NO; + } + + CFSocketContext socketCtxt = {0, (__bridge void *)self, NULL, NULL, NULL}; + + self.vpnSocket = CFSocketCreateWithNative(kCFAllocatorDefault, sockets[0], kCFSocketDataCallBack, &socketCallback, &socketCtxt); + self.tunSocket = CFSocketCreateWithNative(kCFAllocatorDefault, sockets[1], kCFSocketNoCallBack, NULL, NULL); + + if (!self.vpnSocket || !self.tunSocket) { + NSLog(@"Failed to create core foundation sockets from native sockets"); + return NO; + } + + CFRunLoopSourceRef tunSocketSource = CFSocketCreateRunLoopSource(kCFAllocatorDefault, self.vpnSocket, 0); + CFRunLoopAddSource(CFRunLoopGetMain(), tunSocketSource, kCFRunLoopDefaultMode); + + CFRelease(tunSocketSource); + + return YES; +} + +#pragma mark TUN Configuration + +- (BOOL)setRemoteAddress:(NSString *)address isIPv6:(BOOL)isIPv6 { + if (address == nil) { + return NO; + } + + self.remoteAddress = address; + + return YES; +} + +- (BOOL)addLocalAddress:(NSString *)address prefixLength:(NSNumber *)prefixLength gateway:(NSString *)gateway isIPv6:(BOOL)isIPv6 { + if (address == nil || prefixLength == nil) { + return NO; + } + + if (isIPv6) { + if (!self.tunConfigurationIPv6.initialized) { + self.tunConfigurationIPv6.initialized = YES; + } + + self.defaultGatewayIPv6 = gateway; + + [self.tunConfigurationIPv6.localAddresses addObject:address]; + [self.tunConfigurationIPv6.prefixLengths addObject:prefixLength]; + } else { + if (!self.tunConfigurationIPv4.initialized) { + self.tunConfigurationIPv4.initialized = YES; + } + + self.defaultGatewayIPv4 = gateway; + + [self.tunConfigurationIPv4.localAddresses addObject:address]; + [self.tunConfigurationIPv4.prefixLengths addObject:prefixLength]; + } + + return YES; +} + +- (BOOL)defaultGatewayRerouteIPv4:(BOOL)rerouteIPv4 rerouteIPv6:(BOOL)rerouteIPv6 { + if (rerouteIPv6) { + NEIPv6Route *includedRoute = [NEIPv6Route defaultRoute]; + includedRoute.gatewayAddress = self.defaultGatewayIPv6; + + [self.tunConfigurationIPv6.includedRoutes addObject:includedRoute]; + } + + if (rerouteIPv4) { + NEIPv4Route *includedRoute = [NEIPv4Route defaultRoute]; + includedRoute.gatewayAddress = self.defaultGatewayIPv4; + + [self.tunConfigurationIPv4.includedRoutes addObject:includedRoute]; + } + + return YES; +} + +- (BOOL)addRoute:(NSString *)route prefixLength:(NSNumber *)prefixLength isIPv6:(BOOL)isIPv6 { + if (route == nil || prefixLength == nil) { + return NO; + } + + if (isIPv6) { + NEIPv6Route *includedRoute = [[NEIPv6Route alloc] initWithDestinationAddress:route networkPrefixLength:prefixLength]; + includedRoute.gatewayAddress = self.defaultGatewayIPv6; + + [self.tunConfigurationIPv6.includedRoutes addObject:includedRoute]; + } else { + NSString *subnet = [self getSubnetFromPrefixLength:prefixLength]; + + NEIPv4Route *includedRoute = [[NEIPv4Route alloc] initWithDestinationAddress:route subnetMask:subnet]; + includedRoute.gatewayAddress = self.defaultGatewayIPv4; + + [self.tunConfigurationIPv4.includedRoutes addObject:includedRoute]; + } + + return YES; +} + +- (BOOL)excludeRoute:(NSString *)route prefixLength:(NSNumber *)prefixLength isIPv6:(BOOL)isIPv6 { + if (route == nil || prefixLength == nil) { + return NO; + } + + if (isIPv6) { + NEIPv6Route *excludedRoute = [[NEIPv6Route alloc] initWithDestinationAddress:route networkPrefixLength:prefixLength]; + [self.tunConfigurationIPv6.excludedRoutes addObject:excludedRoute]; + } else { + NSString *subnet = [self getSubnetFromPrefixLength:prefixLength]; + NEIPv4Route *excludedRoute = [[NEIPv4Route alloc] initWithDestinationAddress:route subnetMask:subnet]; + [self.tunConfigurationIPv4.excludedRoutes addObject:excludedRoute]; + } + + return YES; +} + +- (BOOL)addDNSAddress:(NSString *)address isIPv6:(BOOL)isIPv6 { + if (address == nil) { + return NO; + } + + if (isIPv6) { + [self.tunConfigurationIPv6.dnsAddresses addObject:address]; + } else { + [self.tunConfigurationIPv4.dnsAddresses addObject:address]; + } + + return YES; +} + +- (BOOL)addSearchDomain:(NSString *)domain { + if (domain == nil) { + return NO; + } + + [self.searchDomains addObject:domain]; + + return YES; +} + +- (BOOL)setMTU:(NSNumber *)mtu { + self.mtu = mtu; + return YES; +} + +- (NSInteger)establishTunnel { + NSAssert(self.delegate != nil, @"delegate property should not be nil"); + + NEPacketTunnelNetworkSettings *networkSettings = [[NEPacketTunnelNetworkSettings alloc] initWithTunnelRemoteAddress:self.remoteAddress]; + + // Configure IPv6 addresses and routes + if (self.tunConfigurationIPv6.initialized) { + NEIPv6Settings *settingsIPv6 = [[NEIPv6Settings alloc] initWithAddresses:self.tunConfigurationIPv6.localAddresses networkPrefixLengths:self.tunConfigurationIPv6.prefixLengths]; + settingsIPv6.includedRoutes = self.tunConfigurationIPv6.includedRoutes; + settingsIPv6.excludedRoutes = self.tunConfigurationIPv6.excludedRoutes; + + networkSettings.IPv6Settings = settingsIPv6; + } + + // Configure IPv4 addresses and routes + if (self.tunConfigurationIPv4.initialized) { + NSMutableArray *subnets = [NSMutableArray new]; + [self.tunConfigurationIPv4.prefixLengths enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { + NSString *subnet = [self getSubnetFromPrefixLength:obj]; + [subnets addObject:subnet]; + }]; + + NEIPv4Settings *ipSettings = [[NEIPv4Settings alloc] initWithAddresses:self.tunConfigurationIPv4.localAddresses subnetMasks:subnets]; + ipSettings.includedRoutes = self.tunConfigurationIPv4.includedRoutes; + ipSettings.excludedRoutes = self.tunConfigurationIPv4.excludedRoutes; + + networkSettings.IPv4Settings = ipSettings; + } + + // Configure DNS addresses and search domains + NSMutableArray *dnsAddresses = [NSMutableArray new]; + + if (self.tunConfigurationIPv6.dnsAddresses.count > 0) { + [dnsAddresses addObjectsFromArray:self.tunConfigurationIPv6.dnsAddresses]; + } + + if (self.tunConfigurationIPv4.dnsAddresses.count > 0) { + [dnsAddresses addObjectsFromArray:self.tunConfigurationIPv4.dnsAddresses]; + } + + if (dnsAddresses.count > 0) { + networkSettings.DNSSettings = [[NEDNSSettings alloc] initWithServers:dnsAddresses]; + } + + if (networkSettings.DNSSettings && self.searchDomains.count > 0) { + networkSettings.DNSSettings.searchDomains = self.searchDomains; + } + + // Set MTU + networkSettings.MTU = self.mtu; + + // Establish TUN interface + dispatch_semaphore_t sema = dispatch_semaphore_create(0); + + [self.delegate configureTunnelWithSettings:networkSettings callback:^(id _Nullable flow) { + self.packetFlow = flow; + dispatch_semaphore_signal(sema); + }]; + + // Wait 10 seconds + dispatch_time_t timeout = dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC); + if (dispatch_semaphore_wait(sema, timeout) != 0) { + NSLog(@"Failed to establish tunnel in a reasonable time"); + return -1; + } + + if (self.packetFlow) { + [self readTUNPackets]; + return CFSocketGetNative(self.tunSocket); + } else { + return -1; + } +} + #pragma mark Event and Log Handlers - (void)handleEvent:(const ClientAPI::Event *)event { @@ -171,11 +429,15 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Connection Control - (void)connect { - // TODO: Describe why we use async invocation here dispatch_queue_t connectQueue = dispatch_queue_create("me.ss-abramchuk.openvpn-adapter.connection", NULL); dispatch_async(connectQueue, ^{ OpenVPNClient::init_process(); + self.tunConfigurationIPv6 = [TUNConfiguration new]; + self.tunConfigurationIPv4 = [TUNConfiguration new]; + + self.searchDomains = [NSMutableArray new]; + try { ClientAPI::Status status = self.vpnClient->connect(); if (status.error) { @@ -195,6 +457,25 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter [self.delegate handleError:error]; } + self.remoteAddress = nil; + + self.tunConfigurationIPv6 = nil; + self.tunConfigurationIPv4 = nil; + + self.searchDomains = nil; + + self.mtu = nil; + + if (self.vpnSocket) { + CFSocketInvalidate(self.vpnSocket); + CFRelease(self.vpnSocket); + } + + if (self.tunSocket) { + CFSocketInvalidate(self.tunSocket); + CFRelease(self.tunSocket); + } + OpenVPNClient::uninit_process(); }); } @@ -232,6 +513,50 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter return self; } +#pragma mark TUN -> OpenVPN + +- (void)readTUNPackets { + [self.packetFlow readPacketsWithCompletionHandler:^(NSArray * _Nonnull packets, NSArray * _Nonnull protocols) { + [packets enumerateObjectsUsingBlock:^(NSData * data, NSUInteger idx, BOOL * stop) { + // Prepend data with network protocol. It should be done because OpenVPN uses uint32_t prefixes containing network protocol. + NSNumber *protocol = protocols[idx]; + uint32_t prefix = CFSwapInt32HostToBig((uint32_t)[protocol unsignedIntegerValue]); + + NSMutableData *packet = [NSMutableData new]; + [packet appendBytes:&prefix length:sizeof(prefix)]; + [packet appendData:data]; + + // Send data to the VPN server + CFSocketSendData(self.vpnSocket, NULL, (CFDataRef)packet, 0.05); + }]; + + [self readTUNPackets]; + }]; +} + +#pragma mark OpenVPN -> TUN + +- (void)readVPNData:(NSData *)data { + // Get network protocol from data + NSUInteger prefixSize = sizeof(uint32_t); + + if (data.length < prefixSize) { + NSLog(@"Incorrect OpenVPN packet size"); + return; + } + + uint32_t protocol = UINT32_MAX; + [data getBytes:&protocol length:prefixSize]; + + protocol = CFSwapInt32BigToHost(protocol); + + // Send the packet to the TUN interface + NSData *packet = [data subdataWithRange:NSMakeRange(prefixSize, data.length - prefixSize)]; + if (![self.packetFlow writePackets:@[packet] withProtocols:@[@(protocol)]]) { + NSLog(@"Failed to send OpenVPN packet to the TUN interface"); + } +} + #pragma mark Utils - (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName { diff --git a/OpenVPN Adapter/OpenVPNClient.h b/OpenVPN Adapter/OpenVPNClient.h index dac4247..1fbeec3 100644 --- a/OpenVPN Adapter/OpenVPNClient.h +++ b/OpenVPN Adapter/OpenVPNClient.h @@ -11,15 +11,49 @@ using namespace openvpn; -class OpenVPNClient : public ClientAPI::OpenVPNClient, public TunClientFactory +class OpenVPNClient : public ClientAPI::OpenVPNClient { public: - OpenVPNClient(void* adapter); + OpenVPNClient(void * adapter); - virtual TunClientFactory* new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) override; - virtual TunClient::Ptr new_tun_client_obj(openvpn_io::io_context& io_context, TunClientParent& parent, TransportClient* transcli) override; + virtual bool tun_builder_new() override; + + virtual bool tun_builder_set_remote_address(const std::string& address, bool ipv6) override; + virtual bool tun_builder_add_address(const std::string& address, + int prefix_length, + const std::string& gateway, + bool ipv6, + bool net30) override; + virtual bool tun_builder_reroute_gw(bool ipv4, + bool ipv6, + unsigned int flags) override; + virtual bool tun_builder_add_route(const std::string& address, + int prefix_length, + int metric, + bool ipv6) override; + virtual bool tun_builder_exclude_route(const std::string& address, + int prefix_length, + int metric, + bool ipv6) override; + virtual bool tun_builder_add_dns_server(const std::string& address, bool ipv6) override; + virtual bool tun_builder_add_search_domain(const std::string& domain) override; + virtual bool tun_builder_set_mtu(int mtu) override; + virtual bool tun_builder_set_session_name(const std::string& name) override; + virtual bool tun_builder_add_proxy_bypass(const std::string& bypass_host) override; + virtual bool tun_builder_set_proxy_auto_config_url(const std::string& url) override; + virtual bool tun_builder_set_proxy_http(const std::string& host, int port) override; + virtual bool tun_builder_set_proxy_https(const std::string& host, int port) override; + virtual bool tun_builder_add_wins_server(const std::string& address) override; + + virtual int tun_builder_establish() override; + + virtual bool tun_builder_persist() override; + virtual void tun_builder_establish_lite() override; + + virtual void tun_builder_teardown(bool disconnect) override; virtual bool socket_protect(int socket) override; + virtual bool pause_on_connection_timeout() override; virtual void external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) override; diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index b7168cb..95fabe0 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -11,18 +11,90 @@ #import "OpenVPNAdapter+Internal.h" #import "OpenVPNClient.h" -OpenVPNClient::OpenVPNClient(void* adapter) : ClientAPI::OpenVPNClient() { +OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() { this->adapter = adapter; } -TunClientFactory* OpenVPNClient::new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) { - return this; +bool OpenVPNClient::tun_builder_new() { + return [(__bridge OpenVPNAdapter *)adapter configureSockets]; } -TunClient::Ptr OpenVPNClient::new_tun_client_obj(openvpn_io::io_context& io_context, TunClientParent& parent, TransportClient* transcli) { - return nullptr; +bool OpenVPNClient::tun_builder_set_remote_address(const std::string &address, bool ipv6) { + NSString *remoteAddress = [NSString stringWithUTF8String:address.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter setRemoteAddress:remoteAddress isIPv6:ipv6]; } +bool OpenVPNClient::tun_builder_add_address(const std::string &address, int prefix_length, const std::string &gateway, bool ipv6, bool net30) { + NSString *localAddress = [NSString stringWithUTF8String:address.c_str()]; + NSString *gatewayAddress = [NSString stringWithUTF8String:gateway.c_str()]; + + return [(__bridge OpenVPNAdapter *)adapter addLocalAddress:localAddress prefixLength:@(prefix_length) gateway:gatewayAddress isIPv6:ipv6]; +} + +bool OpenVPNClient::tun_builder_reroute_gw(bool ipv4, bool ipv6, unsigned int flags) { + return [(__bridge OpenVPNAdapter *)adapter defaultGatewayRerouteIPv4:ipv4 rerouteIPv6:ipv6]; +} + +bool OpenVPNClient::tun_builder_add_route(const std::string& address, int prefix_length, int metric, bool ipv6) { + NSString *route = [NSString stringWithUTF8String:address.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter addRoute:route prefixLength:@(prefix_length) isIPv6:ipv6]; +} + +bool OpenVPNClient::tun_builder_exclude_route(const std::string& address, int prefix_length, int metric, bool ipv6) { + NSString *route = [NSString stringWithUTF8String:address.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter excludeRoute:route prefixLength:@(prefix_length) isIPv6:ipv6]; +} + +bool OpenVPNClient::tun_builder_add_dns_server(const std::string& address, bool ipv6) { + NSString *dnsAddress = [NSString stringWithUTF8String:address.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter addDNSAddress:dnsAddress isIPv6:ipv6]; +} + +bool OpenVPNClient::tun_builder_add_search_domain(const std::string& domain) { + NSString *searchDomain = [NSString stringWithUTF8String:domain.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter addSearchDomain:searchDomain]; +} + +bool OpenVPNClient::tun_builder_set_mtu(int mtu) { + return [(__bridge OpenVPNAdapter *)adapter setMTU:@(mtu)]; +} + +bool OpenVPNClient::tun_builder_set_session_name(const std::string& name) { + return true; +} + +bool OpenVPNClient::tun_builder_add_proxy_bypass(const std::string& bypass_host) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_auto_config_url(const std::string& url) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_http(const std::string& host, int port) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_https(const std::string& host, int port) { + return true; +} + +bool OpenVPNClient::tun_builder_add_wins_server(const std::string& address) { + return true; +} + +int OpenVPNClient::tun_builder_establish() { + return (int)[(__bridge OpenVPNAdapter *)adapter establishTunnel]; +} + +bool OpenVPNClient::tun_builder_persist() { + return true; +} + +void OpenVPNClient::tun_builder_establish_lite() { } + +void OpenVPNClient::tun_builder_teardown(bool disconnect) { } + bool OpenVPNClient::socket_protect(int socket) { return true; } diff --git a/OpenVPN Adapter/TUNConfiguration.h b/OpenVPN Adapter/TUNConfiguration.h new file mode 100644 index 0000000..90743db --- /dev/null +++ b/OpenVPN Adapter/TUNConfiguration.h @@ -0,0 +1,23 @@ +// +// TUNConfiguration.h +// OpenVPN iOS Client +// +// Created by Sergey Abramchuk on 26.02.17. +// +// + +#import + +@interface TUNConfiguration : NSObject + +@property (nonatomic) BOOL initialized; + +@property (readonly, strong, nonatomic) NSMutableArray *localAddresses; +@property (readonly, strong, nonatomic) NSMutableArray *prefixLengths; + +@property (readonly, strong, nonatomic) NSMutableArray *includedRoutes; +@property (readonly, strong, nonatomic) NSMutableArray *excludedRoutes; + +@property (readonly, strong, nonatomic) NSMutableArray *dnsAddresses; + +@end diff --git a/OpenVPN Adapter/TUNConfiguration.m b/OpenVPN Adapter/TUNConfiguration.m new file mode 100644 index 0000000..2beb564 --- /dev/null +++ b/OpenVPN Adapter/TUNConfiguration.m @@ -0,0 +1,30 @@ +// +// TUNConfiguration.m +// OpenVPN iOS Client +// +// Created by Sergey Abramchuk on 26.02.17. +// +// + +#import "TUNConfiguration.h" + +@implementation TUNConfiguration + +- (instancetype)init +{ + self = [super init]; + if (self) { + _initialized = NO; + + _localAddresses = [NSMutableArray new]; + _prefixLengths = [NSMutableArray new]; + + _includedRoutes = [NSMutableArray new]; + _excludedRoutes = [NSMutableArray new]; + + _dnsAddresses = [NSMutableArray new]; + } + return self; +} + +@end