From 832b9f94bc77cc4fb51b56d07c751c79b74fc77e Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 14:16:13 +0300 Subject: [PATCH 01/76] Fix duplicate symbol issue --- OpenVPN Adapter/Vendors/openvpn/openvpn/common/hexstr.hpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenVPN Adapter/Vendors/openvpn/openvpn/common/hexstr.hpp b/OpenVPN Adapter/Vendors/openvpn/openvpn/common/hexstr.hpp index e0a2f41..caf2e4e 100644 --- a/OpenVPN Adapter/Vendors/openvpn/openvpn/common/hexstr.hpp +++ b/OpenVPN Adapter/Vendors/openvpn/openvpn/common/hexstr.hpp @@ -180,7 +180,7 @@ namespace openvpn { dest.push_back((high<<4) + low); } if (i != len) - throw parse_hex_error(); // straggler char + throw parse_hex_error(); // straggler char } // note -- currently doesn't detect overflow @@ -226,7 +226,7 @@ namespace openvpn { } template - std::string render_hex_number(T value, const bool caps=false) + inline std::string render_hex_number(T value, const bool caps=false) { unsigned char buf[sizeof(T)]; for (size_t i = sizeof(T); i --> 0 ;) @@ -237,7 +237,7 @@ namespace openvpn { return render_hex(buf, sizeof(T), caps); } - std::string render_hex_number(unsigned char uc, const bool caps=false) + inline std::string render_hex_number(unsigned char uc, const bool caps=false) { RenderHexByte b(uc, caps); return std::string(b.str2(), 2); From a51bedaef57597771df6b54db4a28787114eeb4b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 14:17:50 +0300 Subject: [PATCH 02/76] Delete extra lines and spaces --- OpenVPN Adapter/OpenVPNAdapter+Internal.h | 1 - OpenVPN Adapter/OpenVPNAdapter.h | 1 - OpenVPN Adapter/OpenVPNAdapter.mm | 1 - OpenVPN Adapter/OpenVPNClient.h | 1 - OpenVPN Adapter/OpenVPNClient.mm | 2 -- OpenVPN Adapter/OpenVPNError.h | 1 - 6 files changed, 7 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Internal.h b/OpenVPN Adapter/OpenVPNAdapter+Internal.h index 8a61302..887e27a 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Internal.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Internal.h @@ -10,7 +10,6 @@ #import "OpenVPNAdapter.h" - using namespace openvpn; @interface OpenVPNAdapter (Client) diff --git a/OpenVPN Adapter/OpenVPNAdapter.h b/OpenVPN Adapter/OpenVPNAdapter.h index 15ef157..dec3bdd 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.h +++ b/OpenVPN Adapter/OpenVPNAdapter.h @@ -8,7 +8,6 @@ #import - @interface OpenVPNAdapter : NSObject @end diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 18aff2a..182fc82 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -28,7 +28,6 @@ NSString * const OpenVPNAdapterErrorDomain = @"me.ss-abramchuk.openvpn-adapter.e NSString * const OpenVPNAdapterErrorFatalKey = @"me.ss-abramchuk.openvpn-adapter.error-key.fatal"; NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter.error-key.event"; - @interface OpenVPNAdapter () { NSString *_username; NSString *_password; diff --git a/OpenVPN Adapter/OpenVPNClient.h b/OpenVPN Adapter/OpenVPNClient.h index fe80486..91f2fe8 100644 --- a/OpenVPN Adapter/OpenVPNClient.h +++ b/OpenVPN Adapter/OpenVPNClient.h @@ -8,7 +8,6 @@ #import - using namespace openvpn; class OpenVPNClient : public ClientAPI::OpenVPNClient diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index ea94a07..47a3aa6 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -11,10 +11,8 @@ #import #import "OpenVPNAdapter+Internal.h" - #import "OpenVPNClient.h" - OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() { this->adapter = adapter; } diff --git a/OpenVPN Adapter/OpenVPNError.h b/OpenVPN Adapter/OpenVPNError.h index 4c202c7..50e8c0c 100644 --- a/OpenVPN Adapter/OpenVPNError.h +++ b/OpenVPN Adapter/OpenVPNError.h @@ -8,7 +8,6 @@ #import - extern NSString * __nonnull const OpenVPNAdapterErrorDomain; extern NSString * __nonnull const OpenVPNAdapterErrorFatalKey; From 082a70ca7ee26dacf1d04e0296aaff24a86af202 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 14:22:22 +0300 Subject: [PATCH 03/76] Define OPENVPN_EXTERNAL_TUN_FACTORY flag and remove USE_TUN_BUILDER --- Configuration/Framework.xcconfig | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Configuration/Framework.xcconfig b/Configuration/Framework.xcconfig index 7925bcc..3ce7dde 100755 --- a/Configuration/Framework.xcconfig +++ b/Configuration/Framework.xcconfig @@ -11,5 +11,5 @@ LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(PROJECT_DIR)/OpenVPN Adapter/Ven LIBRARY_SEARCH_PATHS[sdk=iphoneos*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/ios" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/ios" LIBRARY_SEARCH_PATHS[sdk=macosx*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/macos" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/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_FORCE_TUN_NULL -DUSE_TUN_BUILDER +OTHER_CPLUSPLUSFLAGS = $(OTHER_CFLAGS) -DUSE_ASIO -DASIO_STANDALONE -DASIO_NO_DEPRECATED -DHAVE_LZ4 -DUSE_MBEDTLS -DOPENVPN_EXTERNAL_TUN_FACTORY GCC_WARN_64_TO_32_BIT_CONVERSION = NO From ef06fec9f7b9e7f43b2505076c6b5bf10babede5 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 14:29:41 +0300 Subject: [PATCH 04/76] Define method returning custom tun factory --- OpenVPN Adapter/OpenVPNClient.h | 2 ++ OpenVPN Adapter/OpenVPNClient.mm | 4 ++++ 2 files changed, 6 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNClient.h b/OpenVPN Adapter/OpenVPNClient.h index 91f2fe8..fcd2c64 100644 --- a/OpenVPN Adapter/OpenVPNClient.h +++ b/OpenVPN Adapter/OpenVPNClient.h @@ -15,6 +15,8 @@ class OpenVPNClient : public ClientAPI::OpenVPNClient public: OpenVPNClient(void * adapter); + virtual TunClientFactory* new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) override; + virtual bool tun_builder_new() override; virtual bool tun_builder_set_remote_address(const std::string& address, bool ipv6) override; diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index 47a3aa6..da45138 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -17,6 +17,10 @@ OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() { this->adapter = adapter; } +TunClientFactory* OpenVPNClient::new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) { + return nullptr; +} + bool OpenVPNClient::tun_builder_new() { return [(__bridge OpenVPNAdapter *)adapter configureSockets]; } From 44f826cb12db2c525c6ccb1c47d09ec4205321a6 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 15:40:32 +0300 Subject: [PATCH 05/76] Declare tun factory and return its instance in new_tun_factory method --- OpenVPN Adapter/OpenVPNClient.mm | 3 ++- OpenVPN Adapter/TUNFactory.h | 18 ++++++++++++++++++ OpenVPN Adapter/TUNFactory.mm | 18 ++++++++++++++++++ 3 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 OpenVPN Adapter/TUNFactory.h create mode 100644 OpenVPN Adapter/TUNFactory.mm diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index da45138..041baae 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -10,6 +10,7 @@ #import +#import "TUNFactory.h" #import "OpenVPNAdapter+Internal.h" #import "OpenVPNClient.h" @@ -18,7 +19,7 @@ OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() { } TunClientFactory* OpenVPNClient::new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) { - return nullptr; + return new TUNFactory(); } bool OpenVPNClient::tun_builder_new() { diff --git a/OpenVPN Adapter/TUNFactory.h b/OpenVPN Adapter/TUNFactory.h new file mode 100644 index 0000000..953ac63 --- /dev/null +++ b/OpenVPN Adapter/TUNFactory.h @@ -0,0 +1,18 @@ +// +// TUNFactory.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 15.04.17. +// +// + +#import + +using namespace openvpn; + +class TUNFactory: public TunClientFactory { +public: + virtual TunClient::Ptr new_tun_client_obj(openvpn_io::io_context& io_context, + TunClientParent& parent, + TransportClient* transcli) override; +}; diff --git a/OpenVPN Adapter/TUNFactory.mm b/OpenVPN Adapter/TUNFactory.mm new file mode 100644 index 0000000..8f05bb1 --- /dev/null +++ b/OpenVPN Adapter/TUNFactory.mm @@ -0,0 +1,18 @@ +// +// TUNFactory.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 15.04.17. +// +// + +#import "TUNFactory.h" + +// !!! tuncli.hpp may be used as example of implementation + +TunClient::Ptr TUNFactory::new_tun_client_obj(openvpn_io::io_context& io_context, + TunClientParent& parent, + TransportClient* transcli) +{ + return nullptr; +} From 06b789e10d0151ff22ecd8c160b8703a4fdd0495 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 15:41:59 +0300 Subject: [PATCH 06/76] Update VPN server configurations --- .../OpenVPNAdapterTests.swift | 4 +- .../Resources/free_openvpn_udp_jp.ovpn | 99 +++++++++++++++++++ ...nvpn_udp.ovpn => free_openvpn_udp_us.ovpn} | 51 ++++++---- 3 files changed, 134 insertions(+), 20 deletions(-) create mode 100644 OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn rename OpenVPN Adapter Tests/Resources/{free_openvpn_udp.ovpn => free_openvpn_udp_us.ovpn} (58%) diff --git a/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift index 8f816bc..9ee9533 100644 --- a/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift @@ -21,7 +21,7 @@ class OpenVPNAdapterTests: XCTestCase { } let configurations: [ConfigurationType : String] = [ - .withoutCredentials: "free_openvpn_udp" + .withoutCredentials: "free_openvpn_udp_jp" ] var expectations = [ExpectationsType : XCTestExpectation]() @@ -51,7 +51,7 @@ class OpenVPNAdapterTests: XCTestCase { adapter.delegate = self adapter.connect() - waitForExpectations(timeout: 10.0) { (error) in + waitForExpectations(timeout: 30.0) { (error) in adapter.disconnect() } } diff --git a/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn new file mode 100644 index 0000000..58ba02a --- /dev/null +++ b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn @@ -0,0 +1,99 @@ +############################### +# FreeOpenVPN.Org config file # +# https://www.freeopenvpn.org # +############################### +dev tun +proto udp +remote 111.110.210.201 1195 +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 Tests/Resources/free_openvpn_udp.ovpn b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn similarity index 58% rename from OpenVPN Adapter Tests/Resources/free_openvpn_udp.ovpn rename to OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn index 0805772..05a1332 100644 --- a/OpenVPN Adapter Tests/Resources/free_openvpn_udp.ovpn +++ b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn @@ -4,7 +4,7 @@ ############################### dev tun proto udp -remote 71.83.197.219 1287 +remote 76.112.143.39 1302 cipher AES-128-CBC auth SHA1 resolv-retry infinite @@ -15,23 +15,38 @@ client verb 3 -----BEGIN CERTIFICATE----- -MIIDHjCCAgagAwIBAgIFFBVZERgwDQYJKoZIhvcNAQELBQAwRjEbMBkGA1UEAwwS -bzk1OTQ5d2s2cHhmZXMub3JnMRowGAYDVQQKDBFmbGhncSA1YTZwODMzbTdoOTEL -MAkGA1UEBhMCVVMwHhcNMTcwMTE0MDEzNTA0WhcNMjQwODI4MDEzNTA0WjBGMRsw -GQYDVQQDDBJvOTU5NDl3azZweGZlcy5vcmcxGjAYBgNVBAoMEWZsaGdxIDVhNnA4 -MzNtN2g5MQswCQYDVQQGEwJVUzCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBANM5r0SjINmEXPnG6birUIcWIS+8Vxw2BX/baKfk7HF5K+/IsbRVWPO+gFdV -1DHyw+uM8PhRvE68doGKMsb4TRMzk2FcFPu3QZ0gFX2qM+6GMF9EnoQa2zpIVba1 -etzWBJUyJ4ma/PPJbxt7iIL8S5q9wNPXsaukRRLw8ZGkoh2Hx25Q6KsUZhiyxpTX -NiMrzl/bdNlhHr4oibIOHHR6F4Q2oH3Z/0xBLKUOdtLmyJU2SGdCP9Vodd5vBhIH -NBEb1QsVutaFvMHO9Fmuk9Uu5Bm7wh5KBrc1RHWdpGtWVMMJK07bchbrJy0Uc38S -+Hko+yOJA/ieTraTMxL/qy/oj1cCAwEAAaMTMBEwDwYDVR0TAQH/BAUwAwEB/zAN -BgkqhkiG9w0BAQsFAAOCAQEAIUxFjVEdejXLIRnnEZjS/T/XGbH4NS5uclNWqxGP -skbY0tGCUXQPiX9CgZJeuAS0a8FFp9gAnIwaRVJQ5mktsCV/bTmIVL4XzjLiVo0F -FAGx99KasWClPUa89U9/13nwSBMh/Nw3LEuM0aZ9Q3oM2QkOooGQbQwErqUT9bBi -wNuedZ4eo0sMOmSOr1wpo7u7Nt15Xp7jHaNv0uW92wpeAXpqGAHKINbiNBHaHLqK -u6veAlEWSg5YVDYPfS379bRqm+2YvcdJKhbkbmNpVYEahLYTn/Y18e5ITF/Njk+K -A1az9seo85coDXaH5YmvDDM5JjwrXGKMTIDr7ZkweT5qNQ== +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----- From 8f7e24633f61a363149dfa91b8ce74e46a40b629 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 15 Apr 2017 15:42:23 +0300 Subject: [PATCH 07/76] Update project configuration --- OpenVPN Adapter.xcodeproj/project.pbxproj | 38 +++++++++++++++++++---- 1 file changed, 32 insertions(+), 6 deletions(-) diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 31b5167..2d53a53 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -22,7 +22,6 @@ C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; }; C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; }; C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; }; - C9BB479C1E71836100F3F98C /* free_openvpn_udp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */; }; C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; }; C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */; }; @@ -41,8 +40,19 @@ C9D2ABEB1EA20F99007EDF9D /* TUNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47731E7171D900F3F98C /* TUNConfiguration.h */; }; C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; }; C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; - C9D2ABFB1EA212A3007EDF9D /* free_openvpn_udp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */; }; C9D2AC051EA214EA007EDF9D /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */; }; + C9D2AC161EA23A40007EDF9D /* TUNFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D2AC141EA23A40007EDF9D /* TUNFactory.h */; }; + C9D2AC171EA23A40007EDF9D /* TUNFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D2AC141EA23A40007EDF9D /* TUNFactory.h */; }; + C9D2AC181EA23A40007EDF9D /* TUNFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */; }; + C9D2AC191EA23A40007EDF9D /* TUNFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */; }; + C9D2AC1B1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; + C9D2AC1C1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; + C9D2AC1D1EA23EDE007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; + C9D2AC1E1EA23EE0007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; + C9D2AC201EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; + C9D2AC211EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; + C9D2AC221EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; + C9D2AC231EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9FD92181E9A667600374FC4 /* ovpncli.hpp */; }; C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; }; /* End PBXBuildFile section */ @@ -88,10 +98,13 @@ C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; lineEnding = 0; path = OpenVPNAdapter.mm; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C9BB478E1E71821A00F3F98C /* OpenVPN Adapter iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenVPN Adapter iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = ""; }; - C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp.ovpn; sourceTree = ""; }; C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; 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; }; + C9D2AC141EA23A40007EDF9D /* TUNFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNFactory.h; sourceTree = ""; }; + C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TUNFactory.mm; sourceTree = ""; }; + C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp_us.ovpn; sourceTree = ""; }; + C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp_jp.ovpn; sourceTree = ""; }; C9FD92181E9A667600374FC4 /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/client/ovpncli.hpp; sourceTree = ""; }; C9FD92191E9A667600374FC4 /* ovpncli.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ovpncli.cpp; path = Vendors/openvpn/client/ovpncli.cpp; sourceTree = ""; }; /* End PBXFileReference section */ @@ -218,6 +231,8 @@ C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */, + C9D2AC141EA23A40007EDF9D /* TUNFactory.h */, + C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */, ); name = Adapter; sourceTree = ""; @@ -252,7 +267,8 @@ C9BB479A1E71836100F3F98C /* Resources */ = { isa = PBXGroup; children = ( - C9BB479B1E71836100F3F98C /* free_openvpn_udp.ovpn */, + C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */, + C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */, ); path = Resources; sourceTree = ""; @@ -301,6 +317,7 @@ C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, + C9D2AC161EA23A40007EDF9D /* TUNFactory.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, @@ -317,6 +334,7 @@ C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, + C9D2AC171EA23A40007EDF9D /* TUNFactory.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, @@ -453,6 +471,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9D2AC1B1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, + C9D2AC201EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -460,7 +480,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9BB479C1E71836100F3F98C /* free_openvpn_udp.ovpn in Resources */, + C9D2AC1D1EA23EDE007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, + C9D2AC221EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -468,6 +489,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9D2AC1C1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, + C9D2AC211EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -475,7 +498,8 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2ABFB1EA212A3007EDF9D /* free_openvpn_udp.ovpn in Resources */, + C9D2AC1E1EA23EE0007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, + C9D2AC231EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -517,6 +541,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9D2AC181EA23A40007EDF9D /* TUNFactory.mm in Sources */, C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C9BB47761E7171D900F3F98C /* TUNConfiguration.m in Sources */, @@ -537,6 +562,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9D2AC191EA23A40007EDF9D /* TUNFactory.mm in Sources */, C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDD1EA20F99007EDF9D /* TUNConfiguration.m in Sources */, From 80b282d34e9c53ba7f10d005f3ddc9a7161239df Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 17:59:49 +0300 Subject: [PATCH 08/76] Delete 3rd parties configs and add configuration file of local OpenVPN server --- .../Resources/free_openvpn_udp_jp.ovpn | 99 ---------------- .../Resources/free_openvpn_udp_us.ovpn | 99 ---------------- .../Resources/local_vpn_server.ovpn | 108 ++++++++++++++++++ 3 files changed, 108 insertions(+), 198 deletions(-) delete mode 100644 OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn delete mode 100644 OpenVPN Adapter Tests/Resources/free_openvpn_udp_us.ovpn create mode 100644 OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn diff --git a/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn b/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn deleted file mode 100644 index 58ba02a..0000000 --- a/OpenVPN Adapter Tests/Resources/free_openvpn_udp_jp.ovpn +++ /dev/null @@ -1,99 +0,0 @@ -############################### -# FreeOpenVPN.Org config file # -# https://www.freeopenvpn.org # -############################### -dev tun -proto udp -remote 111.110.210.201 1195 -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 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 Tests/Resources/local_vpn_server.ovpn b/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn new file mode 100644 index 0000000..37ae92e --- /dev/null +++ b/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn @@ -0,0 +1,108 @@ +client +nobind +dev tun +key-direction 1 +remote-cert-tls server + +remote 192.168.1.229 1194 udp + + +-----BEGIN PRIVATE KEY----- +MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGkQ5i2xooZ+tI +BoJAs9+DWYvsMLfffOnveqx7o+Fiu6xDhpiEvFhupm890kr87b0iJMXVS+S/Mr5u +GyAvcxGrFuYFZM9hMF1ZIYESIOjV40hkAcPSFylLMVzexYdDbD2ZKfMVb6KCkjP9 +vXrDwNQIRipvaqOkA1oyrlWyUVVnTfSAcTrJwZUXh01Lw9XyBXDY6wKX5k7Dmc0J +nmZXEKngBKDTkaVu4X4X3rgPZFiZBD5BG3UT1EZUEx6CJjRgJxUNWy8Z1uQy21Gc +4r3TyetoWh7anO6a7aHvx/IU+zb6gM81FmkUEbJeXKQp5Gd7sSVSYxd8SR6h3yn4 +/ExRawDDAgMBAAECggEAZ1Rk4ByUaCJr1XdNoM35qiiXH7nadXpTYkO8LjsBtpdi +9WC9TZWVjz8c9FbSnvw4R+RK7swnpTeK0VFcVlTTBO1NldD3+eNpMFC3Ee/+Og+k +RCaG+HUFEBQH+AVidjuFcobZ8HW/Y6MhWxGXKPbXX9bjjkc4EMmNzoHaJokcoDyM +29bmB3LyXFpScsnt1kOdd4YJH/YCqm4dn/tKlHiP26+C3xOw/e5vbzByNIO2mdVp +4YRlJuX8ELm07CQlWyaHniGTIbrFMWCEPc1caSu3M/LA9sxcBFRjUn/gLPJpTBy9 +xzwpMn0gnbf7jX9d0LKW4SVcfxCpk07Mhqm9Va1TwQKBgQD6xc0Zu3mrIMNcO6fC +/bGlBz0PGUFV/HoxMFZ5LOFmwzHcqtwyzZEL5pGkxkKTeP3YZ9xo7hfdleXDnNzF +OpFc/i3d4qf/GvczZaJODKN50YRmhkLGh+3QVhw9aNIU0PBLeAhnDNDK1DYuATuC ++LDKiCbGCitQOwEwqno3b6LeXQKBgQDKtKr2At0g6pmN4R3PkzaF5TrjLPsQ6k7P +FklZMwx1tEc3lrvuzf83TL7c13hH75fgAGmxr1nIPA/jKz0sIm7YRaKHTBjN0n0W +XJd+rocvHVX0EbcJBbmPnKY4kdayHf1A/caacw8JzsjkQJkxvNP6zKp4cjKjrOJr +Pl4FRd4pnwKBgDmbXM1Petir8xTqA1TQ0JE3g3hHdfHZyPwpvYOiorjnmDm36lOl +U2+nbMesX7je73laCpD0OPlHKPvxuel41dHF9iVlnvAEcssUyt8hGiCu17pxlz9i +FGhqj5wvyyrLAJhln5CEqiYd78BLui8REBPGiRmvVlnc5B4Y23CGraRlAoGAJ4mr +2wZd+WCpCNqDBQzy0pUOsmcApaD+NDhloCdr472BMp+NEpxNjozCobLJfEaIeiG6 +e/T27y5/7tBtQyGIO1kBxaAbKnJHAciXqBcEuTTgohWefP0H37IvXdNcbCubTUTy +qweMRF54IsVS3De3pTCsg4fKxtAe7cohbqfdGIMCgYEArSGbvwFEbpaHJ4OzpqQf +SrBkxzx0IpO+W+lL1dIaO4DZJEfsY2FLXf6mGstYPSKQPf5Vwl5ma0X99uEYJtIP +/DBZwrTC+GRD+kjGqBElTvzmh9MDYfg7CKTfXscDSLAQrIwI4+2jWWfqPjeOVYrZ +3umbJmmNUQnnfqVmsSw7NJg= +-----END PRIVATE KEY----- + + +-----BEGIN CERTIFICATE----- +MIIDOzCCAiOgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtFYXN5 +LVJTQSBDQTAeFw0xNzA0MjExNDQ2NDVaFw0yNzA0MTkxNDQ2NDVaMBIxEDAOBgNV +BAMMB2FkYXB0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGkQ5i +2xooZ+tIBoJAs9+DWYvsMLfffOnveqx7o+Fiu6xDhpiEvFhupm890kr87b0iJMXV +S+S/Mr5uGyAvcxGrFuYFZM9hMF1ZIYESIOjV40hkAcPSFylLMVzexYdDbD2ZKfMV +b6KCkjP9vXrDwNQIRipvaqOkA1oyrlWyUVVnTfSAcTrJwZUXh01Lw9XyBXDY6wKX +5k7Dmc0JnmZXEKngBKDTkaVu4X4X3rgPZFiZBD5BG3UT1EZUEx6CJjRgJxUNWy8Z +1uQy21Gc4r3TyetoWh7anO6a7aHvx/IU+zb6gM81FmkUEbJeXKQp5Gd7sSVSYxd8 +SR6h3yn4/ExRawDDAgMBAAGjgZcwgZQwCQYDVR0TBAIwADAdBgNVHQ4EFgQUbdma ++bsssuJwlnpYuQch1yrh0WMwRgYDVR0jBD8wPYAUvz2Jmzs+por67s7h05MjGPqY +1XKhGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBggkAwyITdMKx+GkwEwYDVR0l +BAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQBJ +Lg+K8JNDKy0JachCQjInt7ASk9mA7TImdVWulzosakdyVb71aYS83VWAd8DXHbfa +oiBcU+NNx+iC3Wvhp9T6kVf8jqaf1/lJZl5bWQj4azlKgoYhuXqVbnCX+nRIICo9 +yoUPwcFZw88HcRTJxDiDNs+qdfMlrIbHeSAj76Ru09kr4cwj4jrUPufxK76HM4RM +dvjTW4Xf4IjVv/QMz7JxncgdxzdueXEmdlT0OeKs18wVbI08z4/tpDMFRJfADmdX +rMqWEfesdSzpb4tcDCGKQKTg/ng3DHcykWVh/I3aADpQvAWtF4Xgt8yJL76GKFXS +Kv1VKp8Hyvm8oELow22C +-----END CERTIFICATE----- + + +-----BEGIN CERTIFICATE----- +MIIDNTCCAh2gAwIBAgIJAMMiE3TCsfhpMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV +BAMMC0Vhc3ktUlNBIENBMB4XDTE3MDQyMTE0MjUyNVoXDTI3MDQxOTE0MjUyNVow +FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw +ggEKAoIBAQDPZmSh3ZHb0SPBl/CUB/2nFTZxt5c4LQuQhsDNHG+xxQhfTIL0fBnw +RjEh46zdOpDB0DSqMlnCTeOGfbZxVz6xxFiBfpgQloxq6W7FDV8YdxD3jWsD5uSM +mxyJzxmjDtNP30dSKX/9LSOTw9t0tFfJ2yp9hMvjMCD2Kv9RM9sLRCFT4CJ7MHlk +TtSyVuiKxEqnmAtnwQEFf+FOn7rp4tAVKajpzfvBSYVB1QHa66iZ8q+ZR9pp7JQu +SiuicY+bv49wL1TwNLLX6JpQaeO1F1Y7YybE1UZAt7QJKf1SWPoBqYX653W6mAWS +1w32LHofbU3YzVP7rn55/ROTwAuUBzqTAgMBAAGjgYUwgYIwHQYDVR0OBBYEFL89 +iZs7PqaK+u7O4dOTIxj6mNVyMEYGA1UdIwQ/MD2AFL89iZs7PqaK+u7O4dOTIxj6 +mNVyoRqkGDAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQYIJAMMiE3TCsfhpMAwGA1Ud +EwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCHTHJY2JR9 +trqq0ljNh1p/602Of31SDepxqBkq9BPeBTforSqszEQ8ScGjCOYFsH4oojdAMI8Q +RW40V++r6QN7XAMKyyxJmiIykAk5aGf4Mo+OvnkH2dXLEk6Zc7Cdqn/lGMKfx23h +X4dHE0QAHIperAPKnM7xd63wMAp+6N4U4ECFeQDSMDcp2/WSLqaryP6l2OZLFYzf +LMrXSJGEhTGWnsXdhdb/sxwfu25jeTqoxUFZQqy3rNAQsdMirDCeDzNXqitydFJm +/nm5HJ5xU4GXnL+l4OIk7k+3tHTEAbMJ/WsJ5njzn2x/FKkUlSXTsGFcQKTY7+9n +6+HT4SdJI6bQ +-----END CERTIFICATE----- + + +# +# 2048 bit OpenVPN static key +# +-----BEGIN OpenVPN Static key V1----- +f21fa849ff3179ee8123fac3e2502c55 +3f1d7b239ff7a7b00d9dc20a91822776 +8502905e7e3a24ffbc576110914af122 +398f18d29d12f3061895c854e884c158 +1b59706242a5033a42a7134725c3ee72 +abf401b4395734c81a3928b89c6ceb3a +245da404eccc7d54e63d2ef31adcc7e9 +cb172c51f542592a63c3cbe12fa9d3ac +d71fd56bdcdde12c6d0cb3c635d7d17c +1c0da35058cbb68fe8c246c6a36f35e8 +a0d4a7f1c6546df3a65506a053b12310 +0363749d2897c17eae89eb31d5c53a7c +8eee3b3a660b99f901fdfe5b4732e670 +e049987f2975a285f9bc9088aa98e62e +ceacf661b6f7435bc06bccb19d775ec3 +d1fc606aced9f6e52e56c1c4a6608c5f +-----END OpenVPN Static key V1----- + +key-direction 1 + +redirect-gateway def1 From c2f62f134f4541e7cf5837a58424d6abfa26beec Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 18:00:50 +0300 Subject: [PATCH 09/76] Use variable for vendors folder --- Configuration/Framework.xcconfig | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/Configuration/Framework.xcconfig b/Configuration/Framework.xcconfig index 3ce7dde..bb9aef2 100755 --- a/Configuration/Framework.xcconfig +++ b/Configuration/Framework.xcconfig @@ -6,10 +6,11 @@ DYLIB_CURRENT_VERSION = $(CURRENT_PROJECT_VERSION) APPLICATION_EXTENSION_API_ONLY = YES CLANG_CXX_LANGUAGE_STANDARD = gnu++14 CLANG_CXX_LIBRARY = libc++ -HEADER_SEARCH_PATHS = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/asio/asio/include" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/include" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/include" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/openvpn" -LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/sim" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/sim" -LIBRARY_SEARCH_PATHS[sdk=iphoneos*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/ios" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/ios" -LIBRARY_SEARCH_PATHS[sdk=macosx*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/macos" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/macos" +VENDORS_PATH = $(PROJECT_DIR)/OpenVPN Adapter/Vendors +HEADER_SEARCH_PATHS = "$(VENDORS_PATH)/asio/asio/include" "$(VENDORS_PATH)/lz4/include" "$(VENDORS_PATH)/mbedtls/include" "$(VENDORS_PATH)/openvpn" +LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(VENDORS_PATH)/lz4/lib/sim" "$(VENDORS_PATH)/mbedtls/lib/sim" +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 GCC_WARN_64_TO_32_BIT_CONVERSION = NO From 8cba80999bfc4a02aa4e3a5bfc19496d3dded2b2 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 18:04:45 +0300 Subject: [PATCH 10/76] Clean up unnecessary methods and classes --- OpenVPN Adapter.xcodeproj/project.pbxproj | 68 ++--- OpenVPN Adapter/OpenVPNAdapter+Internal.h | 17 -- OpenVPN Adapter/OpenVPNAdapter.mm | 316 +--------------------- OpenVPN Adapter/OpenVPNClient.h | 47 +--- OpenVPN Adapter/OpenVPNClient.mm | 101 +------ OpenVPN Adapter/TUNConfiguration.h | 23 -- OpenVPN Adapter/TUNConfiguration.m | 30 -- OpenVPN Adapter/TUNFactory.h | 18 -- OpenVPN Adapter/TUNFactory.mm | 18 -- 9 files changed, 36 insertions(+), 602 deletions(-) delete mode 100644 OpenVPN Adapter/TUNConfiguration.h delete mode 100644 OpenVPN Adapter/TUNConfiguration.m delete mode 100644 OpenVPN Adapter/TUNFactory.h delete mode 100644 OpenVPN Adapter/TUNFactory.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 2d53a53..ecf6f3d 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,11 +9,11 @@ /* 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 */; }; + C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; + C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB476F1E7171A100F3F98C /* OpenVPNError.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C9BB47751E7171D900F3F98C /* TUNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47731E7171D900F3F98C /* TUNConfiguration.h */; }; - C9BB47761E7171D900F3F98C /* TUNConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47741E7171D900F3F98C /* TUNConfiguration.m */; }; C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */; }; C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */; }; C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -25,7 +25,6 @@ C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; }; C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */; }; - C9D2ABDD1EA20F99007EDF9D /* TUNConfiguration.m in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47741E7171D900F3F98C /* TUNConfiguration.m */; }; C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; }; C9D2ABE01EA20F99007EDF9D /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C912BB241E7C3339002B9414 /* NetworkExtension.framework */; }; C9D2ABE11EA20F99007EDF9D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; }; @@ -37,22 +36,9 @@ C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB476F1E7171A100F3F98C /* OpenVPNError.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */; }; C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9FD92181E9A667600374FC4 /* ovpncli.hpp */; }; - C9D2ABEB1EA20F99007EDF9D /* TUNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47731E7171D900F3F98C /* TUNConfiguration.h */; }; C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; }; C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; C9D2AC051EA214EA007EDF9D /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */; }; - C9D2AC161EA23A40007EDF9D /* TUNFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D2AC141EA23A40007EDF9D /* TUNFactory.h */; }; - C9D2AC171EA23A40007EDF9D /* TUNFactory.h in Headers */ = {isa = PBXBuildFile; fileRef = C9D2AC141EA23A40007EDF9D /* TUNFactory.h */; }; - C9D2AC181EA23A40007EDF9D /* TUNFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */; }; - C9D2AC191EA23A40007EDF9D /* TUNFactory.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */; }; - C9D2AC1B1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; - C9D2AC1C1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; - C9D2AC1D1EA23EDE007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; - C9D2AC1E1EA23EE0007EDF9D /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */; }; - C9D2AC201EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; - C9D2AC211EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; - C9D2AC221EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; - C9D2AC231EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */; }; C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9FD92181E9A667600374FC4 /* ovpncli.hpp */; }; C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; }; /* End PBXBuildFile section */ @@ -84,12 +70,11 @@ 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; }; + C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_vpn_server.ovpn; sourceTree = ""; }; C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Umbrella-Header.h"; sourceTree = ""; }; C9BB476F1E7171A100F3F98C /* OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OpenVPNError.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNEvent.h; sourceTree = ""; }; - C9BB47731E7171D900F3F98C /* TUNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNConfiguration.h; sourceTree = ""; }; - C9BB47741E7171D900F3F98C /* TUNConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TUNConfiguration.m; sourceTree = ""; }; C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNClient.h; sourceTree = ""; }; C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNClient.mm; sourceTree = ""; }; C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNAdapter.h; sourceTree = ""; }; @@ -101,10 +86,6 @@ C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; 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; }; - C9D2AC141EA23A40007EDF9D /* TUNFactory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNFactory.h; sourceTree = ""; }; - C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = TUNFactory.mm; sourceTree = ""; }; - C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp_us.ovpn; sourceTree = ""; }; - C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = free_openvpn_udp_jp.ovpn; sourceTree = ""; }; C9FD92181E9A667600374FC4 /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/client/ovpncli.hpp; sourceTree = ""; }; C9FD92191E9A667600374FC4 /* ovpncli.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = ovpncli.cpp; path = Vendors/openvpn/client/ovpncli.cpp; sourceTree = ""; }; /* End PBXFileReference section */ @@ -192,9 +173,19 @@ name = Frameworks; sourceTree = ""; }; + C9B376B71EA53CE700B7F423 /* Client */ = { + isa = PBXGroup; + children = ( + C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */, + C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */, + ); + name = Client; + sourceTree = ""; + }; C9BB475D1E71663A00F3F98C /* OpenVPN Adapter */ = { isa = PBXGroup; children = ( + C9B376B71EA53CE700B7F423 /* Client */, C9BB47671E7169F000F3F98C /* Adapter */, C9BB47641E7169AF00F3F98C /* Libraries */, C9BB47651E7169B700F3F98C /* Framework */, @@ -223,16 +214,10 @@ children = ( C9BB476F1E7171A100F3F98C /* OpenVPNError.h */, C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */, - C9BB47731E7171D900F3F98C /* TUNConfiguration.h */, - C9BB47741E7171D900F3F98C /* TUNConfiguration.m */, - C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */, - C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */, - C9D2AC141EA23A40007EDF9D /* TUNFactory.h */, - C9D2AC151EA23A40007EDF9D /* TUNFactory.mm */, ); name = Adapter; sourceTree = ""; @@ -267,8 +252,7 @@ C9BB479A1E71836100F3F98C /* Resources */ = { isa = PBXGroup; children = ( - C9D2AC1A1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn */, - C9D2AC1F1EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn */, + C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */, ); path = Resources; sourceTree = ""; @@ -317,11 +301,9 @@ C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, - C9D2AC161EA23A40007EDF9D /* TUNFactory.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, - C9BB47751E7171D900F3F98C /* TUNConfiguration.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -334,11 +316,9 @@ C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, - C9D2AC171EA23A40007EDF9D /* TUNFactory.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, - C9D2ABEB1EA20F99007EDF9D /* TUNConfiguration.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -471,8 +451,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC1B1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, - C9D2AC201EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -480,8 +458,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC1D1EA23EDE007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, - C9D2AC221EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, + C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -489,8 +466,6 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC1C1EA23E65007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, - C9D2AC211EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -498,8 +473,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC1E1EA23EE0007EDF9D /* free_openvpn_udp_us.ovpn in Resources */, - C9D2AC231EA23F81007EDF9D /* free_openvpn_udp_jp.ovpn in Resources */, + C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -541,10 +515,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC181EA23A40007EDF9D /* TUNFactory.mm in Sources */, C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, - C9BB47761E7171D900F3F98C /* TUNConfiguration.m in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -562,10 +534,8 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - C9D2AC191EA23A40007EDF9D /* TUNFactory.mm in Sources */, C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, - C9D2ABDD1EA20F99007EDF9D /* TUNConfiguration.m in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -599,6 +569,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -627,6 +598,7 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */; buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; CLANG_WARN_BOOL_CONVERSION = YES; CLANG_WARN_CONSTANT_CONVERSION = YES; CLANG_WARN_EMPTY_BODY = YES; @@ -653,7 +625,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_MODULES = YES; @@ -702,7 +673,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_MODULES = YES; @@ -851,7 +821,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_MODULES = YES; @@ -903,7 +872,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_ENABLE_MODULES = YES; diff --git a/OpenVPN Adapter/OpenVPNAdapter+Internal.h b/OpenVPN Adapter/OpenVPNAdapter+Internal.h index 887e27a..80a1033 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Internal.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Internal.h @@ -14,23 +14,6 @@ using namespace openvpn; @interface OpenVPNAdapter (Client) -- (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; diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 182fc82..cfb3294 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -17,7 +17,6 @@ #import "OpenVPNError.h" #import "OpenVPNEvent.h" #import "OpenVPNClient.h" -#import "TUNConfiguration.h" #import "OpenVPNAdapter.h" #import "OpenVPNAdapter+Internal.h" @@ -37,255 +36,14 @@ 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) 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; - (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength; @end @implementation OpenVPNAdapter (Client) -#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.tunConfigurationIPv6.localAddresses addObject:address]; - [self.tunConfigurationIPv6.prefixLengths addObject:prefixLength]; - } else { - if (!self.tunConfigurationIPv4.initialized) { - self.tunConfigurationIPv4.initialized = YES; - } - - [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]; - [self.tunConfigurationIPv6.includedRoutes addObject:includedRoute]; - } - - if (rerouteIPv4) { - NEIPv4Route *includedRoute = [NEIPv4Route defaultRoute]; - [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]; - [self.tunConfigurationIPv6.includedRoutes addObject:includedRoute]; - } else { - NSString *subnet = [self getSubnetFromPrefixLength:prefixLength]; - NEIPv4Route *includedRoute = [[NEIPv4Route alloc] initWithDestinationAddress:route subnetMask:subnet]; - [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 { @@ -365,7 +123,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData @implementation OpenVPNAdapter (Provider) -#pragma mark Properties Gettters/Setters +#pragma mark Properties - (void)setUsername:(NSString *)username { _username = username; @@ -398,7 +156,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData if (vpnConfiguration == nil) { if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read VPN configuration" + NSLocalizedDescriptionKey: @"Failed to read OpenVPN configuration file" }]; return NO; } @@ -416,7 +174,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData } ClientAPI::ProvideCreds creds; - creds.username = self.username == nil? "" : [self.username UTF8String]; + creds.username = self.username == nil ? "" : [self.username UTF8String]; creds.password = self.password == nil ? "" : [self.password UTF8String]; ClientAPI::Status creds_status = self.vpnClient->provide_creds(creds); @@ -436,11 +194,6 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData // TODO: Describe why we use async invocation here dispatch_queue_t connectQueue = dispatch_queue_create("me.ss-abramchuk.openvpn-ios-client.connection", NULL); dispatch_async(connectQueue, ^{ - self.tunConfigurationIPv6 = [TUNConfiguration new]; - self.tunConfigurationIPv4 = [TUNConfiguration new]; - - self.searchDomains = [NSMutableArray new]; - OpenVPNClient::init_process(); try { @@ -463,25 +216,6 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData } OpenVPNClient::uninit_process(); - - 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); - } }); } @@ -508,50 +242,6 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData 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:packet]; - - // 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 - (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength { diff --git a/OpenVPN Adapter/OpenVPNClient.h b/OpenVPN Adapter/OpenVPNClient.h index fcd2c64..9356baa 100644 --- a/OpenVPN Adapter/OpenVPNClient.h +++ b/OpenVPN Adapter/OpenVPNClient.h @@ -6,55 +6,20 @@ // // +#import #import using namespace openvpn; -class OpenVPNClient : public ClientAPI::OpenVPNClient +class OpenVPNClient : public ClientAPI::OpenVPNClient, public TunClientFactory { public: - OpenVPNClient(void * adapter); + OpenVPNClient(void* adapter); virtual TunClientFactory* new_tun_factory(const ExternalTun::Config& conf, const OptionList& opt) 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 TunClient::Ptr new_tun_client_obj(openvpn_io::io_context& io_context, TunClientParent& parent, TransportClient* transcli) 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; @@ -64,7 +29,5 @@ public: virtual void log(const ClientAPI::LogInfo& log) override; private: - std::string get_subnet(int prefix_length); - - void *adapter; + void* adapter; }; diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index 041baae..b37eb1d 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -10,118 +10,37 @@ #import -#import "TUNFactory.h" #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 new TUNFactory(); + return this; } -bool OpenVPNClient::tun_builder_new() { - return [(__bridge OpenVPNAdapter *)adapter configureSockets]; -} - -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) { - +TunClient::Ptr OpenVPNClient::new_tun_client_obj(openvpn_io::io_context& io_context, TunClientParent& parent, TransportClient* transcli) { + return nullptr; } bool OpenVPNClient::socket_protect(int socket) { return true; } -// TODO: Provide interfacing with an OS-layer Keychain -void OpenVPNClient::external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) { } -void OpenVPNClient::external_pki_sign_request(ClientAPI::ExternalPKISignRequest& signreq) { } - bool OpenVPNClient::pause_on_connection_timeout() { return false; } +// TODO: Provide interfacing with an OS-layer Keychain +void OpenVPNClient::external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) { } +void OpenVPNClient::external_pki_sign_request(ClientAPI::ExternalPKISignRequest& signreq) { } + void OpenVPNClient::event(const ClientAPI::Event& ev) { - [(__bridge OpenVPNAdapter *)adapter handleEvent:&ev]; + [(__bridge OpenVPNAdapter* )adapter handleEvent:&ev]; } void OpenVPNClient::log(const ClientAPI::LogInfo& log) { - [(__bridge OpenVPNAdapter *)adapter handleLog:&log]; + [(__bridge OpenVPNAdapter* )adapter handleLog:&log]; } diff --git a/OpenVPN Adapter/TUNConfiguration.h b/OpenVPN Adapter/TUNConfiguration.h deleted file mode 100644 index 90743db..0000000 --- a/OpenVPN Adapter/TUNConfiguration.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// 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 deleted file mode 100644 index 2beb564..0000000 --- a/OpenVPN Adapter/TUNConfiguration.m +++ /dev/null @@ -1,30 +0,0 @@ -// -// 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 diff --git a/OpenVPN Adapter/TUNFactory.h b/OpenVPN Adapter/TUNFactory.h deleted file mode 100644 index 953ac63..0000000 --- a/OpenVPN Adapter/TUNFactory.h +++ /dev/null @@ -1,18 +0,0 @@ -// -// TUNFactory.h -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 15.04.17. -// -// - -#import - -using namespace openvpn; - -class TUNFactory: public TunClientFactory { -public: - virtual TunClient::Ptr new_tun_client_obj(openvpn_io::io_context& io_context, - TunClientParent& parent, - TransportClient* transcli) override; -}; diff --git a/OpenVPN Adapter/TUNFactory.mm b/OpenVPN Adapter/TUNFactory.mm deleted file mode 100644 index 8f05bb1..0000000 --- a/OpenVPN Adapter/TUNFactory.mm +++ /dev/null @@ -1,18 +0,0 @@ -// -// TUNFactory.m -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 15.04.17. -// -// - -#import "TUNFactory.h" - -// !!! tuncli.hpp may be used as example of implementation - -TunClient::Ptr TUNFactory::new_tun_client_obj(openvpn_io::io_context& io_context, - TunClientParent& parent, - TransportClient* transcli) -{ - return nullptr; -} From a043f5eb840b34c76f084254612529ee0f2c1b3c Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 18:41:08 +0300 Subject: [PATCH 11/76] Declare class contains client configuration --- .../OpenVPNConfiguration+Internal.h | 19 ++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.h | 13 +++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 29 +++++++++++++++++++ 3 files changed, 61 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNConfiguration+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNConfiguration.h create mode 100644 OpenVPN Adapter/OpenVPNConfiguration.mm diff --git a/OpenVPN Adapter/OpenVPNConfiguration+Internal.h b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h new file mode 100644 index 0000000..a14b00e --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNConfiguration+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 21.04.17. +// +// + +#import + +#import "OpenVPNConfiguration.h" + +using namespace openvpn; + +@interface OpenVPNConfiguration (Internal) + +@property (readonly) ClientAPI::Config config; + +@end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h new file mode 100644 index 0000000..619c887 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -0,0 +1,13 @@ +// +// OpenVPNConfiguration.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 21.04.17. +// +// + +#import + +@interface OpenVPNConfiguration : NSObject + +@end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm new file mode 100644 index 0000000..d1f466f --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -0,0 +1,29 @@ +// +// OpenVPNConfiguration.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 21.04.17. +// +// + +#import "OpenVPNConfiguration.h" +#import "OpenVPNConfiguration+Internal.h" + +@interface OpenVPNConfiguration () { + ClientAPI::Config _config; +} + +@end + +@implementation OpenVPNConfiguration (Internal) + +- (ClientAPI::Config)config { + return _config; +} + +@end + +@implementation OpenVPNConfiguration + + +@end From b33020e4ccf2af6fe1fd47b4ba4e940058cb044a Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 19:28:09 +0300 Subject: [PATCH 12/76] Wrap file content property --- OpenVPN Adapter/OpenVPNConfiguration.h | 4 ++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 7 +++++++ 2 files changed, 11 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 619c887..e6366a8 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -8,6 +8,10 @@ #import +// TODO: Wrap ClientAPI::Config into Objective-C class + @interface OpenVPNConfiguration : NSObject +@property (nullable, nonatomic) NSData *fileContent; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index d1f466f..be6e7ce 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -25,5 +25,12 @@ @implementation OpenVPNConfiguration +-(NSData *)fileContent { + return _config.content.size() != 0 ? [NSData dataWithBytes:_config.content.data() length:_config.content.size()] : nil; +} + +- (void)setFileContent:(NSData *)fileContent { + _config.content = fileContent != nil ? std::string((const char *)fileContent.bytes) : ""; +} @end From 9e7836aae1822b24f4527d8851fffc24c04ff3d1 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 21 Apr 2017 19:28:37 +0300 Subject: [PATCH 13/76] Add header of configuration class into umbrella header --- OpenVPN Adapter/Umbrella-Header.h | 1 + 1 file changed, 1 insertion(+) diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index eca3f8d..ff5f40f 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -18,5 +18,6 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import +#import #import #import From 1fbf4e52b394f2dadd36bb5f51f4a09703d7e422 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 20:19:28 +0300 Subject: [PATCH 14/76] Wrap content list --- OpenVPN Adapter/OpenVPNConfiguration.h | 11 +++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 30 ++++++++++++++++++++++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index e6366a8..a67f47f 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -12,6 +12,17 @@ @interface OpenVPNConfiguration : NSObject +/** + OpenVPN profile as a NSData + */ @property (nullable, nonatomic) NSData *fileContent; +/** + OpenVPN profile as series of key/value pairs (may be provided exclusively + or in addition to file content). + */ +@property (nullable, nonatomic) NSDictionary *settings; + + + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index be6e7ce..651a9fe 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -9,6 +9,8 @@ #import "OpenVPNConfiguration.h" #import "OpenVPNConfiguration+Internal.h" +using namespace openvpn; + @interface OpenVPNConfiguration () { ClientAPI::Config _config; } @@ -25,7 +27,7 @@ @implementation OpenVPNConfiguration --(NSData *)fileContent { +- (NSData *)fileContent { return _config.content.size() != 0 ? [NSData dataWithBytes:_config.content.data() length:_config.content.size()] : nil; } @@ -33,4 +35,30 @@ _config.content = fileContent != nil ? std::string((const char *)fileContent.bytes) : ""; } +- (NSDictionary *)settings { + if (_config.contentList.size() == 0) { + return nil; + } + + NSMutableDictionary *settings = [NSMutableDictionary new]; + + for (ClientAPI::KeyValue param : _config.contentList) { + NSString *key = [NSString stringWithCString:param.key.c_str() encoding:NSUTF8StringEncoding]; + NSString *value = [NSString stringWithCString:param.value.c_str() encoding:NSUTF8StringEncoding]; + + settings[key] = value; + } + + return [settings copy]; +} + +- (void)setSettings:(NSDictionary *)settings { + _config.contentList.clear(); + + [settings enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) { + ClientAPI::KeyValue param = ClientAPI::KeyValue(std::string([key UTF8String]), std::string([obj UTF8String])); + _config.contentList.push_back(param); + }]; +} + @end From 17aa8722ce02ad4b68832aea74e677b82f3b6db3 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 20:20:06 +0300 Subject: [PATCH 15/76] Test getting/setting profile and settings --- .../OpenVPNConfigurationTests.swift | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift diff --git a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift new file mode 100644 index 0000000..8117c64 --- /dev/null +++ b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift @@ -0,0 +1,89 @@ +// +// OpenVPNConfigurationTests.swift +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 21.04.17. +// +// + +import XCTest +@testable import OpenVPNAdapter + +class OpenVPNConfigurationTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testGetSetProfile() { + let originalProfile = ProfileLoader.getVPNProfile(type: .localKeyAuthentication) + + let configuration = OpenVPNConfiguration() + + guard configuration.fileContent == nil else { + XCTFail("Empty file content should return nil") + return + } + + 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() { + let originalSettings = [ + "client": "", + "dev": "tun", + "remote-cert-tls" : "server" + ] + + let configuration = OpenVPNConfiguration() + + guard configuration.settings == nil else { + XCTFail("Empty settings should return nil") + return + } + + configuration.settings = originalSettings + + guard let returnedSettings = configuration.settings else { + XCTFail("Returned settings should not be nil") + return + } + + let equals = originalSettings.elementsEqual(returnedSettings) { (first, second) -> Bool in + first.key == second.key && first.value == second.value + } + XCTAssert(equals) + + configuration.settings = [:] + XCTAssert(configuration.settings == nil, "Empty settings should return nil") + } + + func testCreateConfiguration() { + let configuration = OpenVPNConfiguration() + + let some = configuration.fileContent + + let test = "Some String".data(using: .utf8) + configuration.fileContent = test + } + +} From 0dbce3290d0bb5e27d500da6ac1bf8aefaba915b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 20:20:53 +0300 Subject: [PATCH 16/76] Rename OpenVPN profile file and add profile loader --- OpenVPN Adapter Tests/ProfileLoader.swift | 31 +++++++++++++++++++ ...al_vpn_server.ovpn => local_key_auth.ovpn} | 0 2 files changed, 31 insertions(+) create mode 100644 OpenVPN Adapter Tests/ProfileLoader.swift rename OpenVPN Adapter Tests/Resources/{local_vpn_server.ovpn => local_key_auth.ovpn} (100%) diff --git a/OpenVPN Adapter Tests/ProfileLoader.swift b/OpenVPN Adapter Tests/ProfileLoader.swift new file mode 100644 index 0000000..52a989a --- /dev/null +++ b/OpenVPN Adapter Tests/ProfileLoader.swift @@ -0,0 +1,31 @@ +// +// ProfileLoader.swift +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 22.04.17. +// +// + +import Foundation + +enum ProfileType: String { + case localKeyAuthentication = "local_key_auth" +} + +struct ProfileLoader { + + static func getVPNProfile(type: ProfileType) -> Data { + let fileName = type.rawValue + + guard + let path = Bundle.current.url(forResource: fileName, withExtension: "ovpn"), + let profile = try? Data(contentsOf: path) + else { + fatalError("Failed to retrieve OpenVPN profile") + } + + return profile + } + +} + diff --git a/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn b/OpenVPN Adapter Tests/Resources/local_key_auth.ovpn similarity index 100% rename from OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn rename to OpenVPN Adapter Tests/Resources/local_key_auth.ovpn From f62658439197ddfb78932237b07288a234127680 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 20:21:13 +0300 Subject: [PATCH 17/76] Enable code coverage --- .../xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme | 3 ++- .../xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme index 42a85a6..0d4dbba 100644 --- a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme +++ b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme @@ -26,7 +26,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> diff --git a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme index a27b6c3..d1e7723 100644 --- a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme +++ b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme @@ -26,7 +26,8 @@ buildConfiguration = "Debug" selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB" selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB" - shouldUseLaunchSchemeArgsEnv = "YES"> + shouldUseLaunchSchemeArgsEnv = "YES" + codeCoverageEnabled = "YES"> From a18620102df937c3cd768c6123164e0e877d3849 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 20:21:47 +0300 Subject: [PATCH 18/76] Update project configuration --- OpenVPN Adapter.xcodeproj/project.pbxproj | 47 +++++++++++++++++++---- 1 file changed, 39 insertions(+), 8 deletions(-) diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index ecf6f3d..251bdf0 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,8 +9,18 @@ /* 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 */; }; - C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; - C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; + C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; + C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; + C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; + C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; + C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */ = {isa = PBXBuildFile; fileRef = C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */; }; + C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */ = {isa = PBXBuildFile; fileRef = C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */; }; + C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */; }; + C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */; }; + C9B03A7C1EABA82200268B85 /* ProfileLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */; }; + C9B03A7D1EABA82300268B85 /* ProfileLoader.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */; }; C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB476F1E7171A100F3F98C /* OpenVPNError.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -70,7 +80,12 @@ 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; }; - C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_vpn_server.ovpn; sourceTree = ""; }; + C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = ""; }; + C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; + C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; + C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; + C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConfiguration+Internal.h"; sourceTree = ""; }; + C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileLoader.swift; sourceTree = ""; }; C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; }; C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Umbrella-Header.h"; sourceTree = ""; }; C9BB476F1E7171A100F3F98C /* OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OpenVPNError.h; sourceTree = ""; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; }; @@ -214,6 +229,9 @@ children = ( C9BB476F1E7171A100F3F98C /* OpenVPNError.h */, C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */, + C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */, + C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */, + C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -252,7 +270,7 @@ C9BB479A1E71836100F3F98C /* Resources */ = { isa = PBXGroup; children = ( - C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */, + C98467A11EAA559B00272A9A /* local_key_auth.ovpn */, ); path = Resources; sourceTree = ""; @@ -260,6 +278,7 @@ C9BB479D1E71837200F3F98C /* Adapter Tests */ = { isa = PBXGroup; children = ( + C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */, C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */, ); name = "Adapter Tests"; @@ -285,6 +304,7 @@ isa = PBXGroup; children = ( C9BB47A11E7183DB00F3F98C /* Bundle.swift */, + C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */, ); name = Utils; sourceTree = ""; @@ -299,6 +319,8 @@ C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */, C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */, C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, + C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, + C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, @@ -314,6 +336,8 @@ C9D2ABE31EA20F99007EDF9D /* OpenVPNClient.h in Headers */, C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */, C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, + C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, + C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, @@ -410,6 +434,7 @@ TargetAttributes = { C9BB475B1E71663A00F3F98C = { CreatedOnToolsVersion = 8.2.1; + LastSwiftMigration = 0830; ProvisioningStyle = Manual; }; C9BB478D1E71821A00F3F98C = { @@ -458,7 +483,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, + C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -473,7 +498,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, + C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -516,6 +541,7 @@ buildActionMask = 2147483647; files = ( C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, + C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, ); @@ -525,7 +551,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */, C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */, + C9B03A7C1EABA82200268B85 /* ProfileLoader.swift in Sources */, C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -535,6 +563,7 @@ buildActionMask = 2147483647; files = ( C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, + C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, ); @@ -544,7 +573,9 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */, C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */, + C9B03A7D1EABA82300268B85 /* ProfileLoader.swift in Sources */, C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -657,6 +688,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = YES; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -704,6 +736,7 @@ GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; MTL_ENABLE_DEBUG_INFO = NO; SDKROOT = iphoneos; SKIP_INSTALL = YES; @@ -719,7 +752,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; @@ -773,7 +805,6 @@ isa = XCBuildConfiguration; baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */; buildSettings = { - ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES; ALWAYS_SEARCH_USER_PATHS = NO; CLANG_ANALYZER_NONNULL = YES; CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; From 0bbc860b6fc71ba0d127ae3ddff6389f9aad43c1 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 22:36:23 +0300 Subject: [PATCH 19/76] Early exit if settings is nil and use short format for nil checking --- OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift | 10 ++-------- OpenVPN Adapter/OpenVPNConfiguration.mm | 6 +++++- 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift index 8117c64..f29cafb 100644 --- a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift @@ -75,15 +75,9 @@ class OpenVPNConfigurationTests: XCTestCase { configuration.settings = [:] XCTAssert(configuration.settings == nil, "Empty settings should return nil") - } - - func testCreateConfiguration() { - let configuration = OpenVPNConfiguration() - let some = configuration.fileContent - - let test = "Some String".data(using: .utf8) - configuration.fileContent = test + configuration.settings = nil + XCTAssert(configuration.settings == nil, "Empty settings should return nil") } } diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 651a9fe..be9629f 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -32,7 +32,7 @@ using namespace openvpn; } - (void)setFileContent:(NSData *)fileContent { - _config.content = fileContent != nil ? std::string((const char *)fileContent.bytes) : ""; + _config.content = fileContent ? std::string((const char *)fileContent.bytes) : ""; } - (NSDictionary *)settings { @@ -55,6 +55,10 @@ using namespace openvpn; - (void)setSettings:(NSDictionary *)settings { _config.contentList.clear(); + if (!settings) { + return; + } + [settings enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) { ClientAPI::KeyValue param = ClientAPI::KeyValue(std::string([key UTF8String]), std::string([obj UTF8String])); _config.contentList.push_back(param); From 3343a0e5a868f89606294f0ac973518af0756983 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 22 Apr 2017 22:45:16 +0300 Subject: [PATCH 20/76] Wrap guiVersion property --- OpenVPN Adapter/OpenVPNConfiguration.h | 7 ++++++- OpenVPN Adapter/OpenVPNConfiguration.mm | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index a67f47f..cd6ac2d 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -23,6 +23,11 @@ */ @property (nullable, nonatomic) NSDictionary *settings; - +/** + Set to identity OpenVPN GUI version. + Format should be "" + Passed to server as IV_GUI_VER. + */ +@property (nullable, nonatomic) NSString *guiVersion; @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index be9629f..42373fc 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -65,4 +65,12 @@ using namespace openvpn; }]; } +- (NSString *)guiVersion { + return _config.guiVersion.size() != 0 ? [NSString stringWithUTF8String:_config.guiVersion.c_str()] : nil; +} + +- (void)setGuiVersion:(NSString *)guiVersion { + _config.guiVersion = guiVersion ? std::string([guiVersion UTF8String]) : ""; +} + @end From 283c42b18041d8a910a658c736b0c5d6f0c55a66 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 12:46:31 +0300 Subject: [PATCH 21/76] Hide test schemes and add general scheme to build all targets at once --- .../xcschemes/OpenVPN Adapter iOS.xcscheme | 19 +++++++++++++++++++ .../xcschemes/OpenVPN Adapter macOS.xcscheme | 19 +++++++++++++++++++ 2 files changed, 38 insertions(+) diff --git a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme index 0d4dbba..d707d21 100644 --- a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme +++ b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter iOS.xcscheme @@ -29,7 +29,26 @@ shouldUseLaunchSchemeArgsEnv = "YES" codeCoverageEnabled = "YES"> + + + + + + + + diff --git a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme index d1e7723..9aa010d 100644 --- a/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme +++ b/OpenVPN Adapter.xcodeproj/xcshareddata/xcschemes/OpenVPN Adapter macOS.xcscheme @@ -29,7 +29,26 @@ shouldUseLaunchSchemeArgsEnv = "YES" codeCoverageEnabled = "YES"> + + + + + + + + From 874773b14c61e33f15e6369e3913580ee848918b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 13:07:08 +0300 Subject: [PATCH 22/76] Wrap serverOverride and protoOverride properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 12 ++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index cd6ac2d..07acf6d 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -30,4 +30,16 @@ */ @property (nullable, nonatomic) NSString *guiVersion; +/** + Use a different server than that specified in "remote" + option of profile + */ +@property (nullable, nonatomic) NSString *serverOverride; + +/** + Force a given transport protocol + Should be tcp, udp, or adaptive. + */ +@property (nullable, nonatomic) NSString *protoOverride; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 42373fc..892bdf1 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -73,4 +73,20 @@ using namespace openvpn; _config.guiVersion = guiVersion ? std::string([guiVersion UTF8String]) : ""; } +- (NSString *)serverOverride { + return _config.serverOverride.size() != 0 ? [NSString stringWithUTF8String:_config.serverOverride.c_str()] : nil; +} + +- (void)setServerOverride:(NSString *)serverOverride { + _config.serverOverride = serverOverride ? std::string([serverOverride UTF8String]) : ""; +} + +- (NSString *)protoOverride { + return _config.protoOverride.size() != 0 ? [NSString stringWithUTF8String:_config.protoOverride.c_str()] : nil; +} + +- (void)setProtoOverride:(NSString *)protoOverride { + _config.protoOverride = protoOverride ? std::string([protoOverride UTF8String]) : ""; +} + @end From 092c6a525cd191ca6cad460cd2260feea49297b6 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 13:35:34 +0300 Subject: [PATCH 23/76] Wrap IPv6 preference --- OpenVPN Adapter/OpenVPNConfiguration.h | 18 ++++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 32 +++++++++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 07acf6d..6f2fe17 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -10,6 +10,19 @@ // TODO: Wrap ClientAPI::Config into Objective-C class +/** + IPv6 preference options + + - IPv6PreferenceEnabled: request combined IPv4/IPv6 tunnel + - IPv6PreferenceDisabled: disable IPv6, so tunnel will be IPv4-only + - IPv6PreferenceDefault: leave decision to server + */ +typedef NS_ENUM(NSInteger, IPv6Preference) { + IPv6PreferenceEnabled, + IPv6PreferenceDisabled, + IPv6PreferenceDefault +}; + @interface OpenVPNConfiguration : NSObject /** @@ -42,4 +55,9 @@ */ @property (nullable, nonatomic) NSString *protoOverride; +/** + IPv6 preference + */ +@property (nonatomic) IPv6Preference ipv6; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 892bdf1..188b65f 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -89,4 +89,36 @@ using namespace openvpn; _config.protoOverride = protoOverride ? std::string([protoOverride UTF8String]) : ""; } +- (IPv6Preference)ipv6 { + NSDictionary *options = @{ + @"yes": @(IPv6PreferenceEnabled), + @"no": @(IPv6PreferenceDisabled), + @"default": @(IPv6PreferenceDefault), + @"": @(IPv6PreferenceDefault) + }; + + NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()]; + + NSNumber *preference = options[currentValue]; + NSAssert(preference != nil, @"Incorrect ipv6 value"); + + return (IPv6Preference)[preference integerValue]; +} + +- (void)setIpv6:(IPv6Preference)ipv6 { + switch (ipv6) { + case IPv6PreferenceEnabled: + _config.ipv6 = "yes"; + break; + + case IPv6PreferenceDisabled: + _config.ipv6 = "no"; + break; + + case IPv6PreferenceDefault: + _config.ipv6 = "default"; + break; + } +} + @end From 497dfc96a0860f69354df94c80998402a2a0dc3c Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 13:35:52 +0300 Subject: [PATCH 24/76] Test wrapped IPv6 preference --- .../OpenVPNConfigurationTests.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift index f29cafb..0e09b5f 100644 --- a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift @@ -80,4 +80,21 @@ class OpenVPNConfigurationTests: XCTestCase { XCTAssert(configuration.settings == nil, "Empty settings should return nil") } + func testGetSetIPv6() { + let originalOption: IPv6Preference = .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 + } + } + } From 8decbe13aad9ac90e757580667f67068c425f483 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 13:54:54 +0300 Subject: [PATCH 25/76] Wrap connection timeout property and update documentation for IPv6 preference options --- OpenVPN Adapter/OpenVPNConfiguration.h | 12 ++++++++---- OpenVPN Adapter/OpenVPNConfiguration.mm | 8 ++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 6f2fe17..2580fda 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -12,14 +12,13 @@ /** IPv6 preference options - - - IPv6PreferenceEnabled: request combined IPv4/IPv6 tunnel - - IPv6PreferenceDisabled: disable IPv6, so tunnel will be IPv4-only - - IPv6PreferenceDefault: leave decision to server */ typedef NS_ENUM(NSInteger, IPv6Preference) { + /// Request combined IPv4/IPv6 tunnel IPv6PreferenceEnabled, + /// Disable IPv6, so tunnel will be IPv4-only IPv6PreferenceDisabled, + /// Leave decision to server IPv6PreferenceDefault }; @@ -60,4 +59,9 @@ typedef NS_ENUM(NSInteger, IPv6Preference) { */ @property (nonatomic) IPv6Preference ipv6; +/** + Connection timeout in seconds, or 0 to retry indefinitely + */ +@property (nonatomic) NSInteger connectionTimeout; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 188b65f..392b9dc 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -121,4 +121,12 @@ using namespace openvpn; } } +- (NSInteger)connectionTimeout { + return _config.connTimeout; +} + +- (void)setConnectionTimeout:(NSInteger)connectionTimeout { + _config.connTimeout = connectionTimeout; +} + @end From 6de9f6c7f96d5f49601df72131a794924de5c100 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 14:02:55 +0300 Subject: [PATCH 26/76] Wrap tun persist property and add assertion to ipv6 setter --- OpenVPN Adapter/OpenVPNConfiguration.h | 5 +++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 2580fda..5c1f176 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -64,4 +64,9 @@ typedef NS_ENUM(NSInteger, IPv6Preference) { */ @property (nonatomic) NSInteger connectionTimeout; +/** + Keep tun interface active during pauses or reconnections + */ +@property (nonatomic) BOOL tunPersist; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 392b9dc..552b647 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -118,6 +118,10 @@ using namespace openvpn; case IPv6PreferenceDefault: _config.ipv6 = "default"; break; + + default: + NSAssert(NO, @"Incorrect IPv6Preference value"); + break; } } @@ -129,4 +133,12 @@ using namespace openvpn; _config.connTimeout = connectionTimeout; } +- (BOOL)tunPersist { + return _config.tunPersist; +} + +- (void)setTunPersist:(BOOL)tunPersist { + _config.tunPersist = tunPersist; +} + @end From b6c10d766c89cc50001c1ee10e542f39559d86e7 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 14:10:40 +0300 Subject: [PATCH 27/76] Wrap google DNS fallback property --- OpenVPN Adapter/OpenVPNConfiguration.h | 6 ++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 8 ++++++++ 2 files changed, 14 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 5c1f176..1779657 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -69,4 +69,10 @@ typedef NS_ENUM(NSInteger, IPv6Preference) { */ @property (nonatomic) BOOL tunPersist; +/** + If true and a redirect-gateway profile doesn't also define + DNS servers, use the standard Google DNS servers. + */ +@property (nonatomic) BOOL googleDNSFallback; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 552b647..0f9a04e 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -141,4 +141,12 @@ using namespace openvpn; _config.tunPersist = tunPersist; } +- (BOOL)googleDNSFallback { + return _config.googleDnsFallback; +} + +- (void)setGoogleDNSFallback:(BOOL)googleDNSFallback { + _config.googleDnsFallback = googleDNSFallback; +} + @end From a010c675108483263cc10493d188bb8492629dc3 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 14:33:19 +0300 Subject: [PATCH 28/76] Define enum for transport protocol used in proto property and rename ipv6 preference enum, server and proto --- OpenVPN Adapter/OpenVPNConfiguration.h | 27 ++++++--- OpenVPN Adapter/OpenVPNConfiguration.mm | 76 ++++++++++++++++++------- 2 files changed, 75 insertions(+), 28 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 1779657..76f1c71 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -10,16 +10,23 @@ // TODO: Wrap ClientAPI::Config into Objective-C class +typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol) { + OpenVPNTransportProtocolUDP, + OpenVPNTransportProtocolTCP, + OpenVPNTransportProtocolAdaptive, + OpenVPNTransportProtocolDefault +}; + /** IPv6 preference options */ -typedef NS_ENUM(NSInteger, IPv6Preference) { +typedef NS_ENUM(NSInteger, OpenVPNIPv6Preference) { /// Request combined IPv4/IPv6 tunnel - IPv6PreferenceEnabled, + OpenVPNIPv6PreferenceEnabled, /// Disable IPv6, so tunnel will be IPv4-only - IPv6PreferenceDisabled, + OpenVPNIPv6PreferenceDisabled, /// Leave decision to server - IPv6PreferenceDefault + OpenVPNIPv6PreferenceDefault }; @interface OpenVPNConfiguration : NSObject @@ -46,18 +53,17 @@ typedef NS_ENUM(NSInteger, IPv6Preference) { Use a different server than that specified in "remote" option of profile */ -@property (nullable, nonatomic) NSString *serverOverride; +@property (nullable, nonatomic) NSString *server; /** Force a given transport protocol - Should be tcp, udp, or adaptive. */ -@property (nullable, nonatomic) NSString *protoOverride; +@property (nonatomic) OpenVPNTransportProtocol proto; /** IPv6 preference */ -@property (nonatomic) IPv6Preference ipv6; +@property (nonatomic) OpenVPNIPv6Preference ipv6; /** Connection timeout in seconds, or 0 to retry indefinitely @@ -75,4 +81,9 @@ typedef NS_ENUM(NSInteger, IPv6Preference) { */ @property (nonatomic) BOOL googleDNSFallback; +/** + Enable autologin sessions + */ +@property (nonatomic) BOOL autologinSessions; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 0f9a04e..a8df275 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -73,28 +73,56 @@ using namespace openvpn; _config.guiVersion = guiVersion ? std::string([guiVersion UTF8String]) : ""; } -- (NSString *)serverOverride { +- (NSString *)server { return _config.serverOverride.size() != 0 ? [NSString stringWithUTF8String:_config.serverOverride.c_str()] : nil; } -- (void)setServerOverride:(NSString *)serverOverride { +- (void)setServer:(NSString *)serverOverride { _config.serverOverride = serverOverride ? std::string([serverOverride UTF8String]) : ""; } -- (NSString *)protoOverride { - return _config.protoOverride.size() != 0 ? [NSString stringWithUTF8String:_config.protoOverride.c_str()] : nil; -} - -- (void)setProtoOverride:(NSString *)protoOverride { - _config.protoOverride = protoOverride ? std::string([protoOverride UTF8String]) : ""; -} - -- (IPv6Preference)ipv6 { +- (OpenVPNTransportProtocol)proto { NSDictionary *options = @{ - @"yes": @(IPv6PreferenceEnabled), - @"no": @(IPv6PreferenceDisabled), - @"default": @(IPv6PreferenceDefault), - @"": @(IPv6PreferenceDefault) + @"udp": @(OpenVPNTransportProtocolUDP), + @"tcp": @(OpenVPNTransportProtocolTCP), + @"adaptive": @(OpenVPNTransportProtocolAdaptive), + @"": @(OpenVPNTransportProtocolDefault) + }; + + NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()]; + + NSNumber *transportProtocol = options[currentValue]; + NSAssert(transportProtocol != nil, @"Incorrect ipv6 value"); + + return (OpenVPNTransportProtocol)[transportProtocol integerValue]; +} + +- (void)setProto:(OpenVPNTransportProtocol)proto { + switch (proto) { + case OpenVPNTransportProtocolUDP: + _config.protoOverride = "udp"; + break; + + case OpenVPNTransportProtocolTCP: + _config.protoOverride = "tcp"; + break; + + case OpenVPNTransportProtocolAdaptive: + _config.protoOverride = "adaptive"; + break; + + default: + _config.protoOverride = ""; + break; + } +} + +- (OpenVPNIPv6Preference)ipv6 { + NSDictionary *options = @{ + @"yes": @(OpenVPNIPv6PreferenceEnabled), + @"no": @(OpenVPNIPv6PreferenceDisabled), + @"default": @(OpenVPNIPv6PreferenceDefault), + @"": @(OpenVPNIPv6PreferenceDefault) }; NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()]; @@ -102,20 +130,20 @@ using namespace openvpn; NSNumber *preference = options[currentValue]; NSAssert(preference != nil, @"Incorrect ipv6 value"); - return (IPv6Preference)[preference integerValue]; + return (OpenVPNIPv6Preference)[preference integerValue]; } -- (void)setIpv6:(IPv6Preference)ipv6 { +- (void)setIpv6:(OpenVPNIPv6Preference)ipv6 { switch (ipv6) { - case IPv6PreferenceEnabled: + case OpenVPNIPv6PreferenceEnabled: _config.ipv6 = "yes"; break; - case IPv6PreferenceDisabled: + case OpenVPNIPv6PreferenceDisabled: _config.ipv6 = "no"; break; - case IPv6PreferenceDefault: + case OpenVPNIPv6PreferenceDefault: _config.ipv6 = "default"; break; @@ -149,4 +177,12 @@ using namespace openvpn; _config.googleDnsFallback = googleDNSFallback; } +- (BOOL)autologinSessions { + return _config.autologinSessions; +} + +- (void)setAutologinSessions:(BOOL)autologinSessions { + _config.autologinSessions = autologinSessions; +} + @end From b8861003a3a736908848c327a5f1bf78c71f62fe Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 23 Apr 2017 14:48:23 +0300 Subject: [PATCH 29/76] Add assertion to port setter and update error message in ipv6 setter --- OpenVPN Adapter/OpenVPNConfiguration.mm | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index a8df275..fa74a3a 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -111,9 +111,13 @@ using namespace openvpn; _config.protoOverride = "adaptive"; break; - default: + case OpenVPNTransportProtocolDefault: _config.protoOverride = ""; break; + + default: + NSAssert(NO, @"Incorrect OpenVPNTransportProtocol value"); + break; } } @@ -148,7 +152,7 @@ using namespace openvpn; break; default: - NSAssert(NO, @"Incorrect IPv6Preference value"); + NSAssert(NO, @"Incorrect OpenVPNIPv6Preference value"); break; } } From dcf06ced20c487b5b80ae825277c14997c1604c4 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 12:58:04 +0300 Subject: [PATCH 30/76] Wrap disable cert, ssl debug level and compression mede properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 36 ++++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 62 +++++++++++++++++++++++-- 2 files changed, 95 insertions(+), 3 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 76f1c71..5885bf7 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -10,10 +10,17 @@ // TODO: Wrap ClientAPI::Config into Objective-C class +/** + Transport protocol options + */ typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol) { + /// OpenVPNTransportProtocolUDP, + /// OpenVPNTransportProtocolTCP, + /// OpenVPNTransportProtocolAdaptive, + /// Use a transport protocol specified in the profile OpenVPNTransportProtocolDefault }; @@ -29,6 +36,20 @@ typedef NS_ENUM(NSInteger, OpenVPNIPv6Preference) { OpenVPNIPv6PreferenceDefault }; +/** + Compression mode options + */ +typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { + /// Allow compression on both uplink and downlink + OpenVPNCompressionModeEnabled, + /// Support compression stubs only + OpenVPNCompressionModeDisabled, + /// Allow compression on downlink only (i.e. server -> client) + OpenVPNCompressionModeAsym, + /// Default behavior (support compression stubs only) + OpenVPNCompressionModeDefault +}; + @interface OpenVPNConfiguration : NSObject /** @@ -86,4 +107,19 @@ typedef NS_ENUM(NSInteger, OpenVPNIPv6Preference) { */ @property (nonatomic) BOOL autologinSessions; +/** + If YES, don't send client cert/key to peer + */ +@property (nonatomic) BOOL disableClientCert; + +/** + SSL library debug level + */ +@property (nonatomic) NSInteger sslDebugLevel; + +/** + Compression mode + */ +@property (nonatomic) OpenVPNCompressionMode compressionMode; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index fa74a3a..223b13d 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -28,7 +28,7 @@ using namespace openvpn; @implementation OpenVPNConfiguration - (NSData *)fileContent { - return _config.content.size() != 0 ? [NSData dataWithBytes:_config.content.data() length:_config.content.size()] : nil; + return !_config.content.empty() ? [NSData dataWithBytes:_config.content.data() length:_config.content.size()] : nil; } - (void)setFileContent:(NSData *)fileContent { @@ -66,7 +66,7 @@ using namespace openvpn; } - (NSString *)guiVersion { - return _config.guiVersion.size() != 0 ? [NSString stringWithUTF8String:_config.guiVersion.c_str()] : nil; + return !_config.guiVersion.empty() ? [NSString stringWithUTF8String:_config.guiVersion.c_str()] : nil; } - (void)setGuiVersion:(NSString *)guiVersion { @@ -74,7 +74,7 @@ using namespace openvpn; } - (NSString *)server { - return _config.serverOverride.size() != 0 ? [NSString stringWithUTF8String:_config.serverOverride.c_str()] : nil; + return !_config.serverOverride.empty() ? [NSString stringWithUTF8String:_config.serverOverride.c_str()] : nil; } - (void)setServer:(NSString *)serverOverride { @@ -189,4 +189,60 @@ using namespace openvpn; _config.autologinSessions = autologinSessions; } +- (BOOL)disableClientCert { + return _config.disableClientCert; +} + +- (void)setDisableClientCert:(BOOL)disableClientCert { + _config.disableClientCert = disableClientCert; +} + +- (NSInteger)sslDebugLevel { + return _config.sslDebugLevel; +} + +- (void)setSslDebugLevel:(NSInteger)sslDebugLevel { + _config.sslDebugLevel = sslDebugLevel; +} + +- (OpenVPNCompressionMode)compressionMode { + NSDictionary *options = @{ + @"yes": @(OpenVPNCompressionModeEnabled), + @"no": @(OpenVPNCompressionModeDisabled), + @"asym": @(OpenVPNCompressionModeAsym), + @"": @(OpenVPNCompressionModeDefault) + }; + + NSString *currentValue = [NSString stringWithUTF8String:_config.compressionMode.c_str()]; + + NSNumber *preference = options[currentValue]; + NSAssert(preference != nil, @"Incorrect compressionMode value"); + + return (OpenVPNCompressionMode)[preference integerValue]; +} + +- (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode { + switch (compressionMode) { + case OpenVPNCompressionModeEnabled: + _config.compressionMode = "yes"; + break; + + case OpenVPNCompressionModeDisabled: + _config.compressionMode = "no"; + break; + + case OpenVPNCompressionModeAsym: + _config.compressionMode = "asym"; + break; + + case OpenVPNCompressionModeDefault: + _config.compressionMode = ""; + break; + + default: + NSAssert(NO, @"Incorrect OpenVPNCompressionMode value"); + break; + } +} + @end From 61228ed00d95946281e54f5200448e51258327cb Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 13:11:25 +0300 Subject: [PATCH 31/76] Wrap private key password and key direction properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 12 ++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 16 ++++++++++++++++ 2 files changed, 28 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 5885bf7..4e51949 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -122,4 +122,16 @@ typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { */ @property (nonatomic) OpenVPNCompressionMode compressionMode; +/** + Private key password + */ +@property (nullable, nonatomic) NSString *privateKeyPassword; + +/** + Default key direction parameter for tls-auth (0, 1, + or -1 (bidirectional -- default)) if no key-direction + parameter defined in profile + */ +@property (nonatomic) NSInteger keyDirection; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 223b13d..d62bac9 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -245,4 +245,20 @@ using namespace openvpn; } } +- (NSString *)privateKeyPassword { + return !_config.privateKeyPassword.empty() ? [NSString stringWithUTF8String:_config.privateKeyPassword.c_str()] : nil; +} + +- (void)setPrivateKeyPassword:(NSString *)privateKeyPassword { + _config.privateKeyPassword = privateKeyPassword ? std::string([privateKeyPassword UTF8String]) : ""; +} + +- (NSInteger)keyDirection { + return _config.defaultKeyDirection; +} + +- (void)setKeyDirection:(NSInteger)keyDirection { + _config.defaultKeyDirection = keyDirection; +} + @end From 2fc3e139119970d84549f01e832662fba963801d Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 13:34:50 +0300 Subject: [PATCH 32/76] Wrap force ciphersuite and min tbs version properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 30 ++++++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 54 +++++++++++++++++++++++++ 2 files changed, 84 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 4e51949..9e81e8f 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -50,6 +50,22 @@ typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { OpenVPNCompressionModeDefault }; +/** + Minimum TLS version options + */ +typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { + /// Don't specify a minimum, and disable any minimum specified in profile + OpenVPNMinTLSVersionDisabled, + /// Use TLS 1.0 minimum (overrides profile) + OpenVPNMinTLSVersion10, + /// Use TLS 1.1 minimum (overrides profile) + OpenVPNMinTLSVersion11, + /// Use TLS 1.2 minimum (overrides profile) + OpenVPNMinTLSVersion12, + /// Use profile minimum + OpenVPNMinTLSVersionDefault +}; + @interface OpenVPNConfiguration : NSObject /** @@ -134,4 +150,18 @@ typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { */ @property (nonatomic) NSInteger keyDirection; +/** + If YES, force ciphersuite to be one of: + 1. TLS_DHE_RSA_WITH_AES_256_CBC_SHA, or + 2. TLS_DHE_RSA_WITH_AES_128_CBC_SHA + and disable setting TLS minimum version. + This is intended for compatibility with legacy systems. + */ +@property (nonatomic) BOOL forceCiphersuitesAESCBC; + +/** + Override the minimum TLS version + */ +@property (nonatomic) OpenVPNMinTLSVersion minTLSVersion; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index d62bac9..2626a4a 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -261,4 +261,58 @@ using namespace openvpn; _config.defaultKeyDirection = keyDirection; } +- (BOOL)forceCiphersuitesAESCBC { + return _config.forceAesCbcCiphersuites; +} + +-(void)setForceCiphersuitesAESCBC:(BOOL)forceCiphersuitesAESCBC { + _config.forceAesCbcCiphersuites = forceCiphersuitesAESCBC; +} + +- (OpenVPNMinTLSVersion)minTLSVersion { + NSDictionary *options = @{ + @"disabled": @(OpenVPNMinTLSVersionDisabled), + @"tls_1_0": @(OpenVPNMinTLSVersion10), + @"tls_1_1": @(OpenVPNMinTLSVersion11), + @"tls_1_2": @(OpenVPNMinTLSVersion12), + @"default": @(OpenVPNMinTLSVersionDefault), + @"": @(OpenVPNMinTLSVersionDefault) + }; + + NSString *currentValue = [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; + + NSNumber *preference = options[currentValue]; + NSAssert(preference != nil, @"Incorrect minTLSVersion value"); + + return (OpenVPNMinTLSVersion)[preference integerValue]; +} + +- (void)setMinTLSVersion:(OpenVPNMinTLSVersion)minTLSVersion { + switch (minTLSVersion) { + case OpenVPNMinTLSVersionDisabled: + _config.tlsVersionMinOverride = "disabled"; + break; + + case OpenVPNMinTLSVersion10: + _config.tlsVersionMinOverride = "tls_1_0"; + break; + + case OpenVPNMinTLSVersion11: + _config.tlsVersionMinOverride = "tls_1_1"; + break; + + case OpenVPNMinTLSVersion12: + _config.tlsVersionMinOverride = "tls_1_2"; + break; + + case OpenVPNMinTLSVersionDefault: + _config.tlsVersionMinOverride = "default"; + break; + + default: + NSAssert(NO, @"Incorrect OpenVPNMinTLSVersion value"); + break; + } +} + @end From 92b4a2ee496d77e4a89480e09e288a757f261332 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 14:44:54 +0300 Subject: [PATCH 33/76] Wrap peer info property and refactor getters/setters for min tbs version and tbs cert profile --- OpenVPN Adapter.xcodeproj/project.pbxproj | 28 +++++ OpenVPN Adapter/ConfigurationValues.h | 22 ++++ OpenVPN Adapter/ConfigurationValues.mm | 22 ++++ OpenVPN Adapter/OpenVPNConfiguration.h | 25 +++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 119 ++++++++++++++++------ 5 files changed, 183 insertions(+), 33 deletions(-) create mode 100644 OpenVPN Adapter/ConfigurationValues.h create mode 100644 OpenVPN Adapter/ConfigurationValues.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 251bdf0..65ae32b 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,6 +9,10 @@ /* 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 */; }; + C93779CE1EAE17F50030A362 /* ConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* ConfigurationValues.h */; }; + C93779CF1EAE17F50030A362 /* ConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */; }; + C93779D01EAE18730030A362 /* ConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* ConfigurationValues.h */; }; + C93779D11EAE18760030A362 /* ConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */; }; C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; @@ -80,6 +84,8 @@ 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; }; + C93779CC1EAE17F50030A362 /* ConfigurationValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigurationValues.h; sourceTree = ""; }; + C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ConfigurationValues.mm; sourceTree = ""; }; C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; @@ -188,6 +194,23 @@ name = Frameworks; sourceTree = ""; }; + C93779CA1EAE15EE0030A362 /* Helpers */ = { + isa = PBXGroup; + children = ( + C93779CB1EAE15F50030A362 /* Constants */, + ); + name = Helpers; + sourceTree = ""; + }; + C93779CB1EAE15F50030A362 /* Constants */ = { + isa = PBXGroup; + children = ( + C93779CC1EAE17F50030A362 /* ConfigurationValues.h */, + C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */, + ); + name = Constants; + sourceTree = ""; + }; C9B376B71EA53CE700B7F423 /* Client */ = { isa = PBXGroup; children = ( @@ -211,6 +234,7 @@ C9BB47641E7169AF00F3F98C /* Libraries */ = { isa = PBXGroup; children = ( + C93779CA1EAE15EE0030A362 /* Helpers */, C9BB47681E716ABF00F3F98C /* Vendors */, ); name = Libraries; @@ -321,6 +345,7 @@ C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, + C93779CE1EAE17F50030A362 /* ConfigurationValues.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, @@ -338,6 +363,7 @@ C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, + C93779D01EAE18730030A362 /* ConfigurationValues.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, @@ -543,6 +569,7 @@ C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, + C93779CF1EAE17F50030A362 /* ConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -566,6 +593,7 @@ C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, + C93779D11EAE18760030A362 /* ConfigurationValues.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OpenVPN Adapter/ConfigurationValues.h b/OpenVPN Adapter/ConfigurationValues.h new file mode 100644 index 0000000..e7b3a06 --- /dev/null +++ b/OpenVPN Adapter/ConfigurationValues.h @@ -0,0 +1,22 @@ +// +// ConfigurationValues.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 24.04.17. +// +// + +#import + +extern NSString * __nonnull const OpenVPNMinTLSVersionDisabledValue; +extern NSString * __nonnull const OpenVPNMinTLSVersion10Value; +extern NSString * __nonnull const OpenVPNMinTLSVersion11Value; +extern NSString * __nonnull const OpenVPNMinTLSVersion12Value; +extern NSString * __nonnull const OpenVPNMinTLSVersionDefaultValue; + +extern NSString * __nonnull const OpenVPNTLSCertProfileLegacyValue; +extern NSString * __nonnull const OpenVPNTLSCertProfilePreferredValue; +extern NSString * __nonnull const OpenVPNTLSCertProfileSuiteBValue; +extern NSString * __nonnull const OpenVPNTLSCertProfileLegacyDefaultValue; +extern NSString * __nonnull const OpenVPNTLSCertProfilePreferredDefaultValue; +extern NSString * __nonnull const OpenVPNTLSCertProfileDefaultValue; diff --git a/OpenVPN Adapter/ConfigurationValues.mm b/OpenVPN Adapter/ConfigurationValues.mm new file mode 100644 index 0000000..1ae117c --- /dev/null +++ b/OpenVPN Adapter/ConfigurationValues.mm @@ -0,0 +1,22 @@ +// +// ConfigurationValues.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 24.04.17. +// +// + +#import "ConfigurationValues.h" + +NSString * const OpenVPNMinTLSVersionDisabledValue = @"disabled"; +NSString * const OpenVPNMinTLSVersion10Value = @"tls_1_0"; +NSString * const OpenVPNMinTLSVersion11Value = @"tls_1_1"; +NSString * const OpenVPNMinTLSVersion12Value = @"tls_1_2"; +NSString * const OpenVPNMinTLSVersionDefaultValue = @"default"; + +NSString * const OpenVPNTLSCertProfileLegacyValue = @"legacy"; +NSString * const OpenVPNTLSCertProfilePreferredValue = @"preferred"; +NSString * const OpenVPNTLSCertProfileSuiteBValue = @"suiteb"; +NSString * const OpenVPNTLSCertProfileLegacyDefaultValue = @"legacy-default"; +NSString * const OpenVPNTLSCertProfilePreferredDefaultValue = @"preferred-default"; +NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 9e81e8f..df16027 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -66,6 +66,21 @@ typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { OpenVPNMinTLSVersionDefault }; +typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { + /// Allow 1024-bit RSA certs signed with SHA1 + OpenVPNTLSCertProfileLegacy, + /// Require at least 2048-bit RSA certs signed with SHA256 or higher + OpenVPNTLSCertProfilePreferred, + /// Require NSA Suite-B + OpenVPNTLSCertProfileSuiteB, + /// Use legacy as the default if profile doesn't specify tls-cert-profile + OpenVPNTLSCertProfileLegacyDefault, + /// Use preferred as the default if profile doesn't specify tls-cert-profile + OpenVPNTLSCertProfilePreferredDefault, + /// Use profile default + OpenVPNTLSCertProfileDefault +}; + @interface OpenVPNConfiguration : NSObject /** @@ -164,4 +179,14 @@ typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { */ @property (nonatomic) OpenVPNMinTLSVersion minTLSVersion; +/** + Override or default the tls-cert-profile setting + */ +@property (nonatomic) OpenVPNTLSCertProfile tlsCertProfile; + +/** + Pass custom key/value pairs to OpenVPN server + */ +@property (nullable, nonatomic) NSDictionary *peerInfo; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 2626a4a..e15470d 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -6,6 +6,7 @@ // // +#import "ConfigurationValues.h" #import "OpenVPNConfiguration.h" #import "OpenVPNConfiguration+Internal.h" @@ -92,7 +93,7 @@ using namespace openvpn; NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()]; NSNumber *transportProtocol = options[currentValue]; - NSAssert(transportProtocol != nil, @"Incorrect ipv6 value"); + NSAssert(transportProtocol != nil, @"Incorrect protoOverride value"); return (OpenVPNTransportProtocol)[transportProtocol integerValue]; } @@ -271,48 +272,100 @@ using namespace openvpn; - (OpenVPNMinTLSVersion)minTLSVersion { NSDictionary *options = @{ - @"disabled": @(OpenVPNMinTLSVersionDisabled), - @"tls_1_0": @(OpenVPNMinTLSVersion10), - @"tls_1_1": @(OpenVPNMinTLSVersion11), - @"tls_1_2": @(OpenVPNMinTLSVersion12), - @"default": @(OpenVPNMinTLSVersionDefault), - @"": @(OpenVPNMinTLSVersionDefault) + OpenVPNMinTLSVersionDisabledValue: @(OpenVPNMinTLSVersionDisabled), + OpenVPNMinTLSVersion10Value: @(OpenVPNMinTLSVersion10), + OpenVPNMinTLSVersion11Value: @(OpenVPNMinTLSVersion11), + OpenVPNMinTLSVersion12Value: @(OpenVPNMinTLSVersion12), + OpenVPNMinTLSVersionDefaultValue: @(OpenVPNMinTLSVersionDefault) }; - NSString *currentValue = [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; + NSString *currentValue = _config.tlsVersionMinOverride.empty() ? OpenVPNMinTLSVersionDefaultValue : + [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect minTLSVersion value"); + NSAssert(preference != nil, @"Incorrect tlsVersionMinOverride value: %@", currentValue); return (OpenVPNMinTLSVersion)[preference integerValue]; } - (void)setMinTLSVersion:(OpenVPNMinTLSVersion)minTLSVersion { - switch (minTLSVersion) { - case OpenVPNMinTLSVersionDisabled: - _config.tlsVersionMinOverride = "disabled"; - break; - - case OpenVPNMinTLSVersion10: - _config.tlsVersionMinOverride = "tls_1_0"; - break; - - case OpenVPNMinTLSVersion11: - _config.tlsVersionMinOverride = "tls_1_1"; - break; - - case OpenVPNMinTLSVersion12: - _config.tlsVersionMinOverride = "tls_1_2"; - break; - - case OpenVPNMinTLSVersionDefault: - _config.tlsVersionMinOverride = "default"; - break; - - default: - NSAssert(NO, @"Incorrect OpenVPNMinTLSVersion value"); - break; + NSDictionary *options = @{ + @(OpenVPNMinTLSVersionDisabled): OpenVPNMinTLSVersionDisabledValue, + @(OpenVPNMinTLSVersion10): OpenVPNMinTLSVersion10Value, + @(OpenVPNMinTLSVersion11): OpenVPNMinTLSVersion11Value, + @(OpenVPNMinTLSVersion12): OpenVPNMinTLSVersion12Value, + @(OpenVPNMinTLSVersionDefault): OpenVPNMinTLSVersionDefaultValue + }; + + NSString *value = options[@(minTLSVersion)]; + NSAssert(value != nil, @"Incorrect minTLSVersion value: %li", (NSInteger)minTLSVersion); + + _config.tlsVersionMinOverride = [value UTF8String]; +} + +- (OpenVPNTLSCertProfile)tlsCertProfile { + NSDictionary *options = @{ + OpenVPNTLSCertProfileLegacyValue: @(OpenVPNTLSCertProfileLegacy), + OpenVPNTLSCertProfilePreferredValue: @(OpenVPNTLSCertProfilePreferred), + OpenVPNTLSCertProfileSuiteBValue: @(OpenVPNTLSCertProfileSuiteB), + OpenVPNTLSCertProfileLegacyDefaultValue: @(OpenVPNTLSCertProfileLegacyDefault), + OpenVPNTLSCertProfilePreferredDefaultValue: @(OpenVPNTLSCertProfilePreferredDefault), + OpenVPNTLSCertProfileDefaultValue: @(OpenVPNTLSCertProfileDefault), + }; + + NSString *currentValue = _config.tlsCertProfileOverride.empty() ? OpenVPNTLSCertProfileDefaultValue : + [NSString stringWithUTF8String:_config.tlsCertProfileOverride.c_str()]; + + NSNumber *preference = options[currentValue]; + NSAssert(preference != nil, @"Incorrect tlsCertProfileOverride value: %@", currentValue); + + return (OpenVPNTLSCertProfile)[preference integerValue]; +} + +- (void)setTlsCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile { + NSDictionary *options = @{ + @(OpenVPNTLSCertProfileLegacy): OpenVPNTLSCertProfileLegacyValue, + @(OpenVPNTLSCertProfilePreferred): OpenVPNTLSCertProfilePreferredValue, + @(OpenVPNTLSCertProfileSuiteB): OpenVPNTLSCertProfileSuiteBValue, + @(OpenVPNTLSCertProfileLegacyDefault): OpenVPNTLSCertProfileLegacyDefaultValue, + @(OpenVPNTLSCertProfilePreferredDefault): OpenVPNTLSCertProfilePreferredDefaultValue, + @(OpenVPNTLSCertProfileDefault): OpenVPNTLSCertProfileDefaultValue + }; + + NSString *value = options[@(tlsCertProfile)]; + NSAssert(value != nil, @"Incorrect tlsCertProfile value: %li", (NSInteger)tlsCertProfile); + + _config.tlsCertProfileOverride = [value UTF8String]; +} + +- (NSDictionary *)peerInfo { + if (_config.peerInfo.size() == 0) { + return nil; } + + NSMutableDictionary *peerInfo = [NSMutableDictionary new]; + + for (ClientAPI::KeyValue param : _config.peerInfo) { + NSString *key = [NSString stringWithCString:param.key.c_str() encoding:NSUTF8StringEncoding]; + NSString *value = [NSString stringWithCString:param.value.c_str() encoding:NSUTF8StringEncoding]; + + peerInfo[key] = value; + } + + return [peerInfo copy]; +} + +- (void)setPeerInfo:(NSDictionary *)peerInfo { + _config.contentList.clear(); + + if (!peerInfo) { + return; + } + + [peerInfo enumerateKeysAndObjectsUsingBlock:^(NSString * _Nonnull key, NSString * _Nonnull obj, BOOL * _Nonnull stop) { + ClientAPI::KeyValue param = ClientAPI::KeyValue(std::string([key UTF8String]), std::string([obj UTF8String])); + _config.peerInfo.push_back(param); + }]; } @end From 9b356117838fea90eabebb338d6493d076a1ecaf Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 14:58:22 +0300 Subject: [PATCH 34/76] Rename file contains configuration values and refactor getter/setter for compression mode property --- OpenVPN Adapter.xcodeproj/project.pbxproj | 24 +++++----- OpenVPN Adapter/OpenVPNConfiguration.mm | 47 ++++++++----------- ...nValues.h => OpenVPNConfigurationValues.h} | 7 ++- ...alues.mm => OpenVPNConfigurationValues.mm} | 9 +++- 4 files changed, 44 insertions(+), 43 deletions(-) rename OpenVPN Adapter/{ConfigurationValues.h => OpenVPNConfigurationValues.h} (73%) rename OpenVPN Adapter/{ConfigurationValues.mm => OpenVPNConfigurationValues.mm} (71%) diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 65ae32b..2900cac 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,10 +9,10 @@ /* 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 */; }; - C93779CE1EAE17F50030A362 /* ConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* ConfigurationValues.h */; }; - C93779CF1EAE17F50030A362 /* ConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */; }; - C93779D01EAE18730030A362 /* ConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* ConfigurationValues.h */; }; - C93779D11EAE18760030A362 /* ConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */; }; + C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */; }; + C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; + C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */; }; + C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; @@ -84,8 +84,8 @@ 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; }; - C93779CC1EAE17F50030A362 /* ConfigurationValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ConfigurationValues.h; sourceTree = ""; }; - C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = ConfigurationValues.mm; sourceTree = ""; }; + C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfigurationValues.h; sourceTree = ""; }; + C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfigurationValues.mm; sourceTree = ""; }; C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; @@ -205,8 +205,8 @@ C93779CB1EAE15F50030A362 /* Constants */ = { isa = PBXGroup; children = ( - C93779CC1EAE17F50030A362 /* ConfigurationValues.h */, - C93779CD1EAE17F50030A362 /* ConfigurationValues.mm */, + C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */, + C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */, ); name = Constants; sourceTree = ""; @@ -345,7 +345,7 @@ C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, - C93779CE1EAE17F50030A362 /* ConfigurationValues.h in Headers */, + C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, @@ -363,7 +363,7 @@ C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, - C93779D01EAE18730030A362 /* ConfigurationValues.h in Headers */, + C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, @@ -569,7 +569,7 @@ C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, - C93779CF1EAE17F50030A362 /* ConfigurationValues.mm in Sources */, + C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -593,7 +593,7 @@ C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, - C93779D11EAE18760030A362 /* ConfigurationValues.mm in Sources */, + C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index e15470d..5ed815a 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -6,7 +6,7 @@ // // -#import "ConfigurationValues.h" +#import "OpenVPNConfigurationValues.h" #import "OpenVPNConfiguration.h" #import "OpenVPNConfiguration+Internal.h" @@ -208,42 +208,33 @@ using namespace openvpn; - (OpenVPNCompressionMode)compressionMode { NSDictionary *options = @{ - @"yes": @(OpenVPNCompressionModeEnabled), - @"no": @(OpenVPNCompressionModeDisabled), - @"asym": @(OpenVPNCompressionModeAsym), - @"": @(OpenVPNCompressionModeDefault) + OpenVPNCompressionModeEnabledValue: @(OpenVPNCompressionModeEnabled), + OpenVPNCompressionModeDisabledValue: @(OpenVPNCompressionModeDisabled), + OpenVPNCompressionModeAsymValue: @(OpenVPNCompressionModeAsym), + OpenVPNCompressionModeDefaultValue: @(OpenVPNCompressionModeDefault) }; - NSString *currentValue = [NSString stringWithUTF8String:_config.compressionMode.c_str()]; + NSString *currentValue = _config.compressionMode.empty() ? OpenVPNCompressionModeDefaultValue : + [NSString stringWithUTF8String:_config.compressionMode.c_str()]; NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect compressionMode value"); + NSAssert(preference != nil, @"Incorrect compressionMode value: %@", currentValue); return (OpenVPNCompressionMode)[preference integerValue]; } - (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode { - switch (compressionMode) { - case OpenVPNCompressionModeEnabled: - _config.compressionMode = "yes"; - break; - - case OpenVPNCompressionModeDisabled: - _config.compressionMode = "no"; - break; - - case OpenVPNCompressionModeAsym: - _config.compressionMode = "asym"; - break; - - case OpenVPNCompressionModeDefault: - _config.compressionMode = ""; - break; - - default: - NSAssert(NO, @"Incorrect OpenVPNCompressionMode value"); - break; - } + NSDictionary *options = @{ + @(OpenVPNCompressionModeEnabled): OpenVPNCompressionModeEnabledValue, + @(OpenVPNCompressionModeDisabled): OpenVPNCompressionModeDisabledValue, + @(OpenVPNCompressionModeAsym): OpenVPNCompressionModeAsymValue, + @(OpenVPNCompressionModeDefault): OpenVPNCompressionModeDefaultValue + }; + + NSString *value = options[@(compressionMode)]; + NSAssert(value != nil, @"Incorrect compressionMode value: %li", (NSInteger)compressionMode); + + _config.compressionMode = [value UTF8String]; } - (NSString *)privateKeyPassword { diff --git a/OpenVPN Adapter/ConfigurationValues.h b/OpenVPN Adapter/OpenVPNConfigurationValues.h similarity index 73% rename from OpenVPN Adapter/ConfigurationValues.h rename to OpenVPN Adapter/OpenVPNConfigurationValues.h index e7b3a06..0a95b8b 100644 --- a/OpenVPN Adapter/ConfigurationValues.h +++ b/OpenVPN Adapter/OpenVPNConfigurationValues.h @@ -1,5 +1,5 @@ // -// ConfigurationValues.h +// OpenVPNConfigurationValues.h // OpenVPN Adapter // // Created by Sergey Abramchuk on 24.04.17. @@ -8,6 +8,11 @@ #import +extern NSString * __nonnull const OpenVPNCompressionModeEnabledValue; +extern NSString * __nonnull const OpenVPNCompressionModeDisabledValue; +extern NSString * __nonnull const OpenVPNCompressionModeAsymValue; +extern NSString * __nonnull const OpenVPNCompressionModeDefaultValue; + extern NSString * __nonnull const OpenVPNMinTLSVersionDisabledValue; extern NSString * __nonnull const OpenVPNMinTLSVersion10Value; extern NSString * __nonnull const OpenVPNMinTLSVersion11Value; diff --git a/OpenVPN Adapter/ConfigurationValues.mm b/OpenVPN Adapter/OpenVPNConfigurationValues.mm similarity index 71% rename from OpenVPN Adapter/ConfigurationValues.mm rename to OpenVPN Adapter/OpenVPNConfigurationValues.mm index 1ae117c..a52c4fb 100644 --- a/OpenVPN Adapter/ConfigurationValues.mm +++ b/OpenVPN Adapter/OpenVPNConfigurationValues.mm @@ -1,12 +1,17 @@ // -// ConfigurationValues.m +// OpenVPNConfigurationValues.m // OpenVPN Adapter // // Created by Sergey Abramchuk on 24.04.17. // // -#import "ConfigurationValues.h" +#import "OpenVPNConfigurationValues.h" + +NSString * const OpenVPNCompressionModeEnabledValue = @"yes"; +NSString * const OpenVPNCompressionModeDisabledValue = @"no"; +NSString * const OpenVPNCompressionModeAsymValue = @"asym"; +NSString * const OpenVPNCompressionModeDefaultValue = @""; NSString * const OpenVPNMinTLSVersionDisabledValue = @"disabled"; NSString * const OpenVPNMinTLSVersion10Value = @"tls_1_0"; From 39701d0170424ee0435e427e2c4bca27448f891f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 15:56:35 +0300 Subject: [PATCH 35/76] Refactor getters/setters for port and ipv6 properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 5 +- OpenVPN Adapter/OpenVPNConfiguration.mm | 106 ++++++++---------- OpenVPN Adapter/OpenVPNConfigurationValues.h | 9 ++ OpenVPN Adapter/OpenVPNConfigurationValues.mm | 9 ++ 4 files changed, 66 insertions(+), 63 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index df16027..3ef559f 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -8,8 +8,6 @@ #import -// TODO: Wrap ClientAPI::Config into Objective-C class - /** Transport protocol options */ @@ -66,6 +64,9 @@ typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { OpenVPNMinTLSVersionDefault }; +/** + Options of the tls-cert-profile setting + */ typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { /// Allow 1024-bit RSA certs signed with SHA1 OpenVPNTLSCertProfileLegacy, diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 5ed815a..739de0b 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -84,78 +84,62 @@ using namespace openvpn; - (OpenVPNTransportProtocol)proto { NSDictionary *options = @{ - @"udp": @(OpenVPNTransportProtocolUDP), - @"tcp": @(OpenVPNTransportProtocolTCP), - @"adaptive": @(OpenVPNTransportProtocolAdaptive), - @"": @(OpenVPNTransportProtocolDefault) + OpenVPNTransportProtocolUDPValue: @(OpenVPNTransportProtocolUDP), + OpenVPNTransportProtocolTCPValue: @(OpenVPNTransportProtocolTCP), + OpenVPNTransportProtocolAdaptiveValue: @(OpenVPNTransportProtocolAdaptive), + OpenVPNTransportProtocolDefaultValue: @(OpenVPNTransportProtocolDefault) }; - NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()]; + NSString *currentValue = _config.protoOverride.empty() ? OpenVPNTransportProtocolDefaultValue : + [NSString stringWithUTF8String:_config.protoOverride.c_str()]; NSNumber *transportProtocol = options[currentValue]; - NSAssert(transportProtocol != nil, @"Incorrect protoOverride value"); + NSAssert(transportProtocol != nil, @"Incorrect protoOverride value: %@", currentValue); return (OpenVPNTransportProtocol)[transportProtocol integerValue]; } - (void)setProto:(OpenVPNTransportProtocol)proto { - switch (proto) { - case OpenVPNTransportProtocolUDP: - _config.protoOverride = "udp"; - break; - - case OpenVPNTransportProtocolTCP: - _config.protoOverride = "tcp"; - break; - - case OpenVPNTransportProtocolAdaptive: - _config.protoOverride = "adaptive"; - break; - - case OpenVPNTransportProtocolDefault: - _config.protoOverride = ""; - break; - - default: - NSAssert(NO, @"Incorrect OpenVPNTransportProtocol value"); - break; - } + NSDictionary *options = @{ + @(OpenVPNTransportProtocolUDP): OpenVPNTransportProtocolUDPValue, + @(OpenVPNTransportProtocolTCP): OpenVPNTransportProtocolTCPValue, + @(OpenVPNTransportProtocolAdaptive): OpenVPNTransportProtocolAdaptiveValue, + @(OpenVPNTransportProtocolDefault): OpenVPNTransportProtocolDefaultValue + }; + + NSString *value = options[@(proto)]; + NSAssert(value != nil, @"Incorrect proto value: %li", (NSInteger)proto); + + _config.protoOverride = [value UTF8String]; } - (OpenVPNIPv6Preference)ipv6 { NSDictionary *options = @{ - @"yes": @(OpenVPNIPv6PreferenceEnabled), - @"no": @(OpenVPNIPv6PreferenceDisabled), - @"default": @(OpenVPNIPv6PreferenceDefault), - @"": @(OpenVPNIPv6PreferenceDefault) + OpenVPNIPv6PreferenceEnabledValue: @(OpenVPNIPv6PreferenceEnabled), + OpenVPNIPv6PreferenceDisabledValue: @(OpenVPNIPv6PreferenceDisabled), + OpenVPNIPv6PreferenceDefaultValue: @(OpenVPNIPv6PreferenceDefault) }; - NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()]; + NSString *currentValue = _config.ipv6.empty() ? OpenVPNIPv6PreferenceDefaultValue : + [NSString stringWithUTF8String:_config.ipv6.c_str()]; - NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect ipv6 value"); + NSNumber *ipv6 = options[currentValue]; + NSAssert(ipv6 != nil, @"Incorrect ipv6 value: %@", currentValue); - return (OpenVPNIPv6Preference)[preference integerValue]; + return (OpenVPNIPv6Preference)[ipv6 integerValue]; } - (void)setIpv6:(OpenVPNIPv6Preference)ipv6 { - switch (ipv6) { - case OpenVPNIPv6PreferenceEnabled: - _config.ipv6 = "yes"; - break; - - case OpenVPNIPv6PreferenceDisabled: - _config.ipv6 = "no"; - break; - - case OpenVPNIPv6PreferenceDefault: - _config.ipv6 = "default"; - break; - - default: - NSAssert(NO, @"Incorrect OpenVPNIPv6Preference value"); - break; - } + NSDictionary *options = @{ + @(OpenVPNIPv6PreferenceEnabled): OpenVPNIPv6PreferenceEnabledValue, + @(OpenVPNIPv6PreferenceDisabled): OpenVPNIPv6PreferenceDisabledValue, + @(OpenVPNIPv6PreferenceDefault): OpenVPNIPv6PreferenceDefaultValue + }; + + NSString *value = options[@(ipv6)]; + NSAssert(value != nil, @"Incorrect ipv6 value: %li", (NSInteger)ipv6); + + _config.ipv6 = [value UTF8String]; } - (NSInteger)connectionTimeout { @@ -217,10 +201,10 @@ using namespace openvpn; NSString *currentValue = _config.compressionMode.empty() ? OpenVPNCompressionModeDefaultValue : [NSString stringWithUTF8String:_config.compressionMode.c_str()]; - NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect compressionMode value: %@", currentValue); + NSNumber *compressionMode = options[currentValue]; + NSAssert(compressionMode != nil, @"Incorrect compressionMode value: %@", currentValue); - return (OpenVPNCompressionMode)[preference integerValue]; + return (OpenVPNCompressionMode)[compressionMode integerValue]; } - (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode { @@ -273,10 +257,10 @@ using namespace openvpn; NSString *currentValue = _config.tlsVersionMinOverride.empty() ? OpenVPNMinTLSVersionDefaultValue : [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; - NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect tlsVersionMinOverride value: %@", currentValue); + NSNumber *minTLSVersion = options[currentValue]; + NSAssert(minTLSVersion != nil, @"Incorrect tlsVersionMinOverride value: %@", currentValue); - return (OpenVPNMinTLSVersion)[preference integerValue]; + return (OpenVPNMinTLSVersion)[minTLSVersion integerValue]; } - (void)setMinTLSVersion:(OpenVPNMinTLSVersion)minTLSVersion { @@ -307,10 +291,10 @@ using namespace openvpn; NSString *currentValue = _config.tlsCertProfileOverride.empty() ? OpenVPNTLSCertProfileDefaultValue : [NSString stringWithUTF8String:_config.tlsCertProfileOverride.c_str()]; - NSNumber *preference = options[currentValue]; - NSAssert(preference != nil, @"Incorrect tlsCertProfileOverride value: %@", currentValue); + NSNumber *tlsCertProfile = options[currentValue]; + NSAssert(tlsCertProfile != nil, @"Incorrect tlsCertProfileOverride value: %@", currentValue); - return (OpenVPNTLSCertProfile)[preference integerValue]; + return (OpenVPNTLSCertProfile)[tlsCertProfile integerValue]; } - (void)setTlsCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile { diff --git a/OpenVPN Adapter/OpenVPNConfigurationValues.h b/OpenVPN Adapter/OpenVPNConfigurationValues.h index 0a95b8b..2203c3f 100644 --- a/OpenVPN Adapter/OpenVPNConfigurationValues.h +++ b/OpenVPN Adapter/OpenVPNConfigurationValues.h @@ -8,6 +8,15 @@ #import +extern NSString * __nonnull const OpenVPNTransportProtocolUDPValue; +extern NSString * __nonnull const OpenVPNTransportProtocolTCPValue; +extern NSString * __nonnull const OpenVPNTransportProtocolAdaptiveValue; +extern NSString * __nonnull const OpenVPNTransportProtocolDefaultValue; + +extern NSString * __nonnull const OpenVPNIPv6PreferenceEnabledValue; +extern NSString * __nonnull const OpenVPNIPv6PreferenceDisabledValue; +extern NSString * __nonnull const OpenVPNIPv6PreferenceDefaultValue; + extern NSString * __nonnull const OpenVPNCompressionModeEnabledValue; extern NSString * __nonnull const OpenVPNCompressionModeDisabledValue; extern NSString * __nonnull const OpenVPNCompressionModeAsymValue; diff --git a/OpenVPN Adapter/OpenVPNConfigurationValues.mm b/OpenVPN Adapter/OpenVPNConfigurationValues.mm index a52c4fb..5e1df44 100644 --- a/OpenVPN Adapter/OpenVPNConfigurationValues.mm +++ b/OpenVPN Adapter/OpenVPNConfigurationValues.mm @@ -8,6 +8,15 @@ #import "OpenVPNConfigurationValues.h" +NSString * const OpenVPNTransportProtocolUDPValue = @"udp"; +NSString * const OpenVPNTransportProtocolTCPValue = @"tcp"; +NSString * const OpenVPNTransportProtocolAdaptiveValue = @"adaptive"; +NSString * const OpenVPNTransportProtocolDefaultValue = @""; + +NSString * const OpenVPNIPv6PreferenceEnabledValue = @"yes"; +NSString * const OpenVPNIPv6PreferenceDisabledValue = @"no"; +NSString * const OpenVPNIPv6PreferenceDefaultValue = @"default"; + NSString * const OpenVPNCompressionModeEnabledValue = @"yes"; NSString * const OpenVPNCompressionModeDisabledValue = @"no"; NSString * const OpenVPNCompressionModeAsymValue = @"asym"; From 0b0a7fcddfadfd60dd1c31685079740ee5340afa Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 16:04:25 +0300 Subject: [PATCH 36/76] Wrap echo and info properties --- OpenVPN Adapter/OpenVPNConfiguration.h | 10 ++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 18 +++++++++++++++++- 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 3ef559f..945de23 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -190,4 +190,14 @@ typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { */ @property (nullable, nonatomic) NSDictionary *peerInfo; +/** + Pass through pushed "echo" directives via "ECHO" event + */ +@property (nonatomic) BOOL echo; + +/** + Pass through control channel INFO notifications via "INFO" event + */ +@property (nonatomic) BOOL info; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 739de0b..df2e05d 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -241,7 +241,7 @@ using namespace openvpn; return _config.forceAesCbcCiphersuites; } --(void)setForceCiphersuitesAESCBC:(BOOL)forceCiphersuitesAESCBC { +- (void)setForceCiphersuitesAESCBC:(BOOL)forceCiphersuitesAESCBC { _config.forceAesCbcCiphersuites = forceCiphersuitesAESCBC; } @@ -343,4 +343,20 @@ using namespace openvpn; }]; } +- (BOOL)echo { + return _config.echo; +} + +- (void)setEcho:(BOOL)echo { + _config.echo = echo; +} + +- (BOOL)info { + return _config.info; +} + +- (void)setInfo:(BOOL)info { + _config.info = info; +} + @end From 8d591ba2e92d13492af3f3c334f29d7999c285b4 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 16:06:44 +0300 Subject: [PATCH 37/76] Fix clearing incorrect array --- OpenVPN Adapter/OpenVPNConfiguration.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index df2e05d..b1cf7f4 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -331,7 +331,7 @@ using namespace openvpn; } - (void)setPeerInfo:(NSDictionary *)peerInfo { - _config.contentList.clear(); + _config.peerInfo.clear(); if (!peerInfo) { return; From b792c9ba511b71fe1a327c120ddbe4a5e80ec9a5 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 16:30:15 +0300 Subject: [PATCH 38/76] Declare a class which contains credentials --- OpenVPN Adapter.xcodeproj/project.pbxproj | 18 +++++++++++ OpenVPN Adapter/OpenVPNCredentials+Internal.h | 19 +++++++++++ OpenVPN Adapter/OpenVPNCredentials.h | 13 ++++++++ OpenVPN Adapter/OpenVPNCredentials.mm | 32 +++++++++++++++++++ OpenVPN Adapter/Umbrella-Header.h | 1 + 5 files changed, 83 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNCredentials+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNCredentials.h create mode 100644 OpenVPN Adapter/OpenVPNCredentials.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 2900cac..4940afc 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -13,6 +13,12 @@ C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */; }; C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; + 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 */; }; + C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */; }; + C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */; }; + C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */; }; C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; @@ -86,6 +92,9 @@ C912BB241E7C3339002B9414 /* NetworkExtension.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = NetworkExtension.framework; path = System/Library/Frameworks/NetworkExtension.framework; sourceTree = SDKROOT; }; C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfigurationValues.h; sourceTree = ""; }; C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfigurationValues.mm; 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 = ""; }; C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; @@ -256,6 +265,9 @@ C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */, C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */, C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */, + C93779D31EAE32670030A362 /* OpenVPNCredentials.h */, + C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */, + C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -350,7 +362,9 @@ C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.h in Headers */, + C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, + C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -368,7 +382,9 @@ C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */, + C93779D61EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, + C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -571,6 +587,7 @@ C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, + C93779D71EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -594,6 +611,7 @@ C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, + C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/OpenVPN Adapter/OpenVPNCredentials+Internal.h b/OpenVPN Adapter/OpenVPNCredentials+Internal.h new file mode 100644 index 0000000..bd6cb6f --- /dev/null +++ b/OpenVPN Adapter/OpenVPNCredentials+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNCredentials+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 24.04.17. +// +// + +#import + +#import "OpenVPNCredentials.h" + +using namespace openvpn; + +@interface OpenVPNCredentials (Internal) + +@property (readonly) ClientAPI::ProvideCreds credentials; + +@end diff --git a/OpenVPN Adapter/OpenVPNCredentials.h b/OpenVPN Adapter/OpenVPNCredentials.h new file mode 100644 index 0000000..7a2af91 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNCredentials.h @@ -0,0 +1,13 @@ +// +// OpenVPNCredentials.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 24.04.17. +// +// + +#import + +@interface OpenVPNCredentials : NSObject + +@end diff --git a/OpenVPN Adapter/OpenVPNCredentials.mm b/OpenVPN Adapter/OpenVPNCredentials.mm new file mode 100644 index 0000000..04b8a42 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNCredentials.mm @@ -0,0 +1,32 @@ +// +// OpenVPNCredentials.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 24.04.17. +// +// + +#import "OpenVPNCredentials.h" +#import "OpenVPNCredentials+Internal.h" + +using namespace openvpn; + +@interface OpenVPNCredentials () { + ClientAPI::ProvideCreds _credentials; +} + +@end + +@implementation OpenVPNCredentials (Internal) + +- (ClientAPI::ProvideCreds)credentials { + return _credentials; +} + +@end + +@implementation OpenVPNCredentials + + + +@end diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index ff5f40f..d3c0a3d 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -19,5 +19,6 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import #import +#import #import #import From 447a90d16fdb1adb037ec5c1259761d01fac35ca Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 24 Apr 2017 18:32:59 +0300 Subject: [PATCH 39/76] Remove username and password properties and declare methods for applying configuration and providing credentials --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 32 +++++++++++++------------ 1 file changed, 17 insertions(+), 15 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 5bd5a09..64b4d9e 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -7,9 +7,10 @@ // #import "OpenVPNEvent.h" - #import "OpenVPNAdapter.h" +@class OpenVPNConfiguration; +@class OpenVPNCredentials; @class NEPacketTunnelNetworkSettings; // TODO: Add documentation to properties and methods @@ -85,16 +86,6 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @interface OpenVPNAdapter (Provider) -/** - <#Description#> - */ -@property (strong, nonatomic, nullable) NSString *username; - -/** - <#Description#> - */ -@property (strong, nonatomic, nullable) NSString *password; - /** <#Description#> */ @@ -103,13 +94,24 @@ NS_SWIFT_NAME(handle(logMessage:)); /** <#Description#> - @param settings <#settings description#> + @param configuration <#configuration description#> @param error <#error description#> @return <#return value description#> */ -- (BOOL)configureUsingSettings:(nonnull NSData *)settings - error:(out NSError * __nullable * __nullable)error -NS_SWIFT_NAME(configure(using:)); +- (BOOL)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration + error:(out NSError * __nullable * __nullable)error +NS_SWIFT_NAME(apply(configuration:)); + +/** + <#Description#> + + @param credentials <#credentials description#> + @param error <#error description#> + @return <#return value description#> + */ +- (BOOL)provideCredentials:(nonnull OpenVPNCredentials *)credentials + error:(out NSError * __nullable * __nullable)error +NS_SWIFT_NAME(provide(credentials:)); /** Establish connection with the VPN server From 58cbfbc46015146c4a6b7e6b88d82ebd8e446fca Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 12:21:25 +0300 Subject: [PATCH 40/76] Wrap credentials into Objective-C class --- OpenVPN Adapter/OpenVPNCredentials.h | 40 +++++++++++++++++++++++ OpenVPN Adapter/OpenVPNCredentials.mm | 46 +++++++++++++++++++++++++++ 2 files changed, 86 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNCredentials.h b/OpenVPN Adapter/OpenVPNCredentials.h index 7a2af91..6c310c8 100644 --- a/OpenVPN Adapter/OpenVPNCredentials.h +++ b/OpenVPN Adapter/OpenVPNCredentials.h @@ -8,6 +8,46 @@ #import +/** + Class used to pass credentials + */ @interface OpenVPNCredentials : NSObject +/** + Client username + */ +@property (nullable, nonatomic) NSString *username; + +/** + Client password + */ +@property (nullable, nonatomic) NSString *password; + +/** + Response to challenge + */ +@property (nullable, nonatomic) NSString *response; + +/** + Dynamic challenge/response cookie + */ +@property (nullable, nonatomic) NSString *dynamicChallengeCookie; + +/** + If YES, on successful connect, we will replace the password + with the session ID we receive from the server (if provided). + If NO, the password will be cached for future reconnects + and will not be replaced with a session ID, even if the + server provides one. + */ +@property (nonatomic) BOOL replacePasswordWithSessionID; + +/** + If YES, and if replacePasswordWithSessionID is YES, and if + we actually receive a session ID from the server, cache + the user-provided password for future use before replacing + the active password with the session ID. + */ +@property (nonatomic) BOOL cachePassword; + @end diff --git a/OpenVPN Adapter/OpenVPNCredentials.mm b/OpenVPN Adapter/OpenVPNCredentials.mm index 04b8a42..5c7bbf6 100644 --- a/OpenVPN Adapter/OpenVPNCredentials.mm +++ b/OpenVPN Adapter/OpenVPNCredentials.mm @@ -27,6 +27,52 @@ using namespace openvpn; @implementation OpenVPNCredentials +- (NSString *)username { + return !_credentials.username.empty() ? [NSString stringWithUTF8String:_credentials.username.c_str()] : nil; +} +- (void)setUsername:(NSString *)username { + _credentials.username = username ? std::string([username UTF8String]) : ""; +} + +- (NSString *)password { + return !_credentials.password.empty() ? [NSString stringWithUTF8String:_credentials.password.c_str()] : nil; +} + +- (void)setPassword:(NSString *)password { + _credentials.password = password ? std::string([password UTF8String]) : ""; +} + +- (NSString *)response { + return !_credentials.response.empty() ? [NSString stringWithUTF8String:_credentials.response.c_str()] : nil; +} + +- (void)setResponse:(NSString *)response { + _credentials.response = response ? std::string([response UTF8String]) : ""; +} + +- (NSString *)dynamicChallengeCookie { + return !_credentials.dynamicChallengeCookie.empty() ? [NSString stringWithUTF8String:_credentials.dynamicChallengeCookie.c_str()] : nil; +} + +- (void)setDynamicChallengeCookie:(NSString *)dynamicChallengeCookie { + _credentials.dynamicChallengeCookie = dynamicChallengeCookie ? std::string([dynamicChallengeCookie UTF8String]) : ""; +} + +- (BOOL)replacePasswordWithSessionID { + return _credentials.replacePasswordWithSessionID; +} + +- (void)setReplacePasswordWithSessionID:(BOOL)replacePasswordWithSessionID { + _credentials.replacePasswordWithSessionID = replacePasswordWithSessionID; +} + +- (BOOL)cachePassword { + return _credentials.cachePassword; +} + +- (void)setCachePassword:(BOOL)cachePassword { + _credentials.cachePassword = cachePassword; +} @end From 102e617ad97fb68c9734f405d71d8dfeabd04385 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 12:54:21 +0300 Subject: [PATCH 41/76] Wrap clock tick property --- OpenVPN Adapter/OpenVPNConfiguration.h | 10 ++++++++++ OpenVPN Adapter/OpenVPNConfiguration.mm | 8 ++++++++ 2 files changed, 18 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index 945de23..b5fe882 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -82,6 +82,9 @@ typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { OpenVPNTLSCertProfileDefault }; +/** + Class used to pass configuration + */ @interface OpenVPNConfiguration : NSObject /** @@ -200,4 +203,11 @@ typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { */ @property (nonatomic) BOOL info; +/** + Periodic convenience clock tick in milliseconds. Will call + [OpenVPNAdapterDelegate tick] at a frequency defined by this parameter. + Set to 0 to disable. + */ +@property (nonatomic) NSUInteger clockTick; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index b1cf7f4..2745241 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -359,4 +359,12 @@ using namespace openvpn; _config.info = info; } +- (NSUInteger)clockTick { + return _config.clockTickMS; +} + +- (void)setClockTick:(NSUInteger)clockTick { + _config.clockTickMS = clockTick; +} + @end From d6416eaece2821b792fcce744dc300881705ebbf Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 13:53:38 +0300 Subject: [PATCH 42/76] Wrap connection info --- OpenVPN Adapter.xcodeproj/project.pbxproj | 18 ++++++++++ .../OpenVPNConnectionInfo+Internal.h | 19 ++++++++++ OpenVPN Adapter/OpenVPNConnectionInfo.h | 29 +++++++++++++++ OpenVPN Adapter/OpenVPNConnectionInfo.mm | 36 +++++++++++++++++++ 4 files changed, 102 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNConnectionInfo.h create mode 100644 OpenVPN Adapter/OpenVPNConnectionInfo.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 4940afc..2a18ca3 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -21,6 +21,12 @@ C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */; }; C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */; }; + C9657A171EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A181EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A1D1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */; }; + C9657A1E1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */; }; + C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */; }; + C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -96,6 +102,9 @@ 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 = ""; }; C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = ""; }; + C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConnectionInfo.h; sourceTree = ""; }; + C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConnectionInfo.mm; sourceTree = ""; }; + C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConnectionInfo+Internal.h"; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; @@ -268,6 +277,9 @@ C93779D31EAE32670030A362 /* OpenVPNCredentials.h */, C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */, C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */, + C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, + C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, + C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -359,6 +371,8 @@ C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, + C9657A1D1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, + C9657A171EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.h in Headers */, @@ -379,6 +393,8 @@ C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, + C9657A1E1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, + C9657A181EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */, @@ -587,6 +603,7 @@ C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, + C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, C93779D71EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; @@ -611,6 +628,7 @@ C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, + C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h b/OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h new file mode 100644 index 0000000..829beea --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNConnectionInfo+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNConnectionInfo.h" + +using namespace openvpn; + +@interface OpenVPNConnectionInfo (Internal) + +- (instancetype)initWithConnectionInfo:(ClientAPI::ConnectionInfo)info; + +@end diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo.h b/OpenVPN Adapter/OpenVPNConnectionInfo.h new file mode 100644 index 0000000..b5c35de --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConnectionInfo.h @@ -0,0 +1,29 @@ +// +// OpenVPNConnectionInfo.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Class used to provide extra details about successful connection + */ +@interface OpenVPNConnectionInfo : NSObject + +@property (readonly, nonatomic) BOOL defined; +@property (nullable, readonly, nonatomic) NSString *user; +@property (nullable, readonly, nonatomic) NSString *serverHost; +@property (nullable, readonly, nonatomic) NSString *serverPort; +@property (nullable, readonly, nonatomic) NSString *serverProto; +@property (nullable, readonly, nonatomic) NSString *serverIP; +@property (nullable, readonly, nonatomic) NSString *vpnIPv4; +@property (nullable, readonly, nonatomic) NSString *vpnIPv6; +@property (nullable, readonly, nonatomic) NSString *gatewayIPv4; +@property (nullable, readonly, nonatomic) NSString *gatewayIPv6; +@property (nullable, readonly, nonatomic) NSString *clientIP; +@property (nullable, readonly, nonatomic) NSString *tunName; + +@end diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo.mm b/OpenVPN Adapter/OpenVPNConnectionInfo.mm new file mode 100644 index 0000000..3343a6e --- /dev/null +++ b/OpenVPN Adapter/OpenVPNConnectionInfo.mm @@ -0,0 +1,36 @@ +// +// OpenVPNConnectionInfo.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import "OpenVPNConnectionInfo.h" +#import "OpenVPNConnectionInfo+Internal.h" + +using namespace openvpn; + +@implementation OpenVPNConnectionInfo + +- (instancetype)initWithConnectionInfo:(ClientAPI::ConnectionInfo)info +{ + self = [super init]; + if (self) { + _defined = info.defined; + _user = !info.user.empty() ? [NSString stringWithUTF8String:info.user.c_str()] : nil; + _serverHost = !info.serverHost.empty() ? [NSString stringWithUTF8String:info.serverHost.c_str()] : nil; + _serverPort = !info.serverPort.empty() ? [NSString stringWithUTF8String:info.serverPort.c_str()] : nil; + _serverProto = !info.serverProto.empty() ? [NSString stringWithUTF8String:info.serverProto.c_str()] : nil; + _serverIP = !info.serverIp.empty() ? [NSString stringWithUTF8String:info.serverIp.c_str()] : nil; + _vpnIPv4 = !info.vpnIp4.empty() ? [NSString stringWithUTF8String:info.vpnIp4.c_str()] : nil; + _vpnIPv6 = !info.vpnIp6.empty() ? [NSString stringWithUTF8String:info.vpnIp6.c_str()] : nil; + _gatewayIPv4 = !info.gw4.empty() ? [NSString stringWithUTF8String:info.gw4.c_str()] : nil; + _gatewayIPv6 = !info.gw6.empty() ? [NSString stringWithUTF8String:info.gw6.c_str()] : nil; + _clientIP = !info.clientIp.empty() ? [NSString stringWithUTF8String:info.clientIp.c_str()] : nil; + _tunName = !info.tunName.empty() ? [NSString stringWithUTF8String:info.tunName.c_str()] : nil; + } + return self; +} + +@end From d69f6e8e32dd5d46362dea69464ba9171786ba46 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 14:15:17 +0300 Subject: [PATCH 43/76] Wrap transport stats --- OpenVPN Adapter.xcodeproj/project.pbxproj | 18 ++++++++ .../OpenVPNTransportStats+Internal.h | 19 +++++++++ OpenVPN Adapter/OpenVPNTransportStats.h | 42 +++++++++++++++++++ OpenVPN Adapter/OpenVPNTransportStats.mm | 29 +++++++++++++ 4 files changed, 108 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNTransportStats+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNTransportStats.h create mode 100644 OpenVPN Adapter/OpenVPNTransportStats.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 2a18ca3..88608f0 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -27,6 +27,12 @@ C9657A1E1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */; }; C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */; }; C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */; }; + C9657A251EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A261EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A2B1EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */; }; + C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */; }; + C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; + C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -105,6 +111,9 @@ C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConnectionInfo.h; sourceTree = ""; }; C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConnectionInfo.mm; sourceTree = ""; }; C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConnectionInfo+Internal.h"; sourceTree = ""; }; + C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTransportStats.h; sourceTree = ""; }; + C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNTransportStats.mm; sourceTree = ""; }; + C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNTransportStats+Internal.h"; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; @@ -280,6 +289,9 @@ C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, + C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */, + C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */, + C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -370,6 +382,7 @@ C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, + C9657A2B1EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, C9657A1D1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, C9657A171EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, @@ -379,6 +392,7 @@ C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A251EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -392,6 +406,7 @@ C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, + C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, C9657A1E1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, C9657A181EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, @@ -401,6 +416,7 @@ C93779D61EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A261EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -600,6 +616,7 @@ files = ( C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, + C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, @@ -625,6 +642,7 @@ files = ( C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, + C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, diff --git a/OpenVPN Adapter/OpenVPNTransportStats+Internal.h b/OpenVPN Adapter/OpenVPNTransportStats+Internal.h new file mode 100644 index 0000000..1053fe4 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNTransportStats+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNTransportStats+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import + +using namespace openvpn; + +@interface OpenVPNTransportStats (Internal) + +- (instancetype)initWithTransportStats:(ClientAPI::TransportStats)stats; + +@end diff --git a/OpenVPN Adapter/OpenVPNTransportStats.h b/OpenVPN Adapter/OpenVPNTransportStats.h new file mode 100644 index 0000000..9be8323 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNTransportStats.h @@ -0,0 +1,42 @@ +// +// OpenVPNTransportStats.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Class used to provide basic transport stats + */ +@interface OpenVPNTransportStats : NSObject + +/** + Amount of received bytes + */ +@property (readonly, nonatomic) NSInteger bytesIn; + +/** + Amout of sent bytes + */ +@property (readonly, nonatomic) NSInteger bytesOut; + +/** + Amount of received packets + */ +@property (readonly, nonatomic) NSInteger packetsIn; + +/** + Amout of sent packets + */ +@property (readonly, nonatomic) NSInteger packetsOut; + +/** + Number of binary milliseconds (1/1024th of a second) since + last packet was received, or -1 if undefined + */ +@property (readonly, nonatomic) NSInteger lastPacketReceived; + +@end diff --git a/OpenVPN Adapter/OpenVPNTransportStats.mm b/OpenVPN Adapter/OpenVPNTransportStats.mm new file mode 100644 index 0000000..0ef65d0 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNTransportStats.mm @@ -0,0 +1,29 @@ +// +// OpenVPNTransportStats.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import "OpenVPNTransportStats.h" +#import "OpenVPNTransportStats+Internal.h" + +using namespace openvpn; + +@implementation OpenVPNTransportStats + +- (instancetype)initWithTransportStats:(ClientAPI::TransportStats)stats +{ + self = [super init]; + if (self) { + _bytesIn = stats.bytesIn; + _bytesOut = stats.bytesOut; + _packetsIn = stats.packetsIn; + _packetsOut = stats.packetsOut; + _lastPacketReceived = stats.lastPacketReceived; + } + return self; +} + +@end From c0d720eb3f79895a2d869e4acc35cae4986bfe4f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 14:15:52 +0300 Subject: [PATCH 44/76] Add connection info and transport stats headers to umbrella header --- OpenVPN Adapter/Umbrella-Header.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index d3c0a3d..a258bfe 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -20,5 +20,7 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import #import +#import +#import #import #import From 3efb219597bfdbfb102cd40126c6e9b2d69082f6 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 14:27:54 +0300 Subject: [PATCH 45/76] Wrap interface stats --- OpenVPN Adapter.xcodeproj/project.pbxproj | 18 +++++++++++++ .../OpenVPNInterfaceStats+Internal.h | 19 +++++++++++++ OpenVPN Adapter/OpenVPNInterfaceStats.h | 20 ++++++++++++++ OpenVPN Adapter/OpenVPNInterfaceStats.mm | 27 +++++++++++++++++++ 4 files changed, 84 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNInterfaceStats.h create mode 100644 OpenVPN Adapter/OpenVPNInterfaceStats.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 88608f0..63fa09b 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -33,6 +33,12 @@ C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */; }; C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; + C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; }; + C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; }; + C9657A361EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */; }; + C9657A371EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */; }; + C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */; }; + C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -114,6 +120,9 @@ C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTransportStats.h; sourceTree = ""; }; C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNTransportStats.mm; sourceTree = ""; }; C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNTransportStats+Internal.h"; sourceTree = ""; }; + C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNInterfaceStats.h; sourceTree = ""; }; + C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNInterfaceStats.mm; sourceTree = ""; }; + C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNInterfaceStats+Internal.h"; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; @@ -292,6 +301,9 @@ C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */, C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */, C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */, + C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */, + C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */, + C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -377,8 +389,10 @@ buildActionMask = 2147483647; files = ( C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */, + C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */, C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, + C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, @@ -401,8 +415,10 @@ buildActionMask = 2147483647; files = ( C9D2ABE31EA20F99007EDF9D /* OpenVPNClient.h in Headers */, + C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */, C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, + C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, @@ -620,6 +636,7 @@ C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, + C9657A361EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */, C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, C93779D71EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); @@ -646,6 +663,7 @@ C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, + C9657A371EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */, C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, ); diff --git a/OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h b/OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h new file mode 100644 index 0000000..9c58773 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNInterfaceStats+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNInterfaceStats.h" + +using namespace openvpn; + +@interface OpenVPNInterfaceStats (Internal) + +- (instancetype)initWithInterfaceStats:(ClientAPI::InterfaceStats)stats; + +@end diff --git a/OpenVPN Adapter/OpenVPNInterfaceStats.h b/OpenVPN Adapter/OpenVPNInterfaceStats.h new file mode 100644 index 0000000..6fcf612 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNInterfaceStats.h @@ -0,0 +1,20 @@ +// +// OpenVPNInterfaceStats.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +@interface OpenVPNInterfaceStats : NSObject + +@property (readonly, nonatomic) NSInteger bytesIn; +@property (readonly, nonatomic) NSInteger bytesOut; +@property (readonly, nonatomic) NSInteger packetsIn; +@property (readonly, nonatomic) NSInteger packetsOut; +@property (readonly, nonatomic) NSInteger errorsIn; +@property (readonly, nonatomic) NSInteger errorsOut; + +@end diff --git a/OpenVPN Adapter/OpenVPNInterfaceStats.mm b/OpenVPN Adapter/OpenVPNInterfaceStats.mm new file mode 100644 index 0000000..256a97c --- /dev/null +++ b/OpenVPN Adapter/OpenVPNInterfaceStats.mm @@ -0,0 +1,27 @@ +// +// OpenVPNInterfaceStats.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import "OpenVPNInterfaceStats.h" +#import "OpenVPNInterfaceStats+Internal.h" + +@implementation OpenVPNInterfaceStats + +- (instancetype)initWithInterfaceStats:(ClientAPI::InterfaceStats)stats { + self = [super init]; + if (self) { + _bytesIn = stats.bytesIn; + _bytesOut = stats.bytesOut; + _packetsIn = stats.packetsIn; + _packetsOut = stats.packetsOut; + _errorsIn = stats.errorsIn; + _errorsOut = stats.errorsOut; + } + return self; +} + +@end From c09ab7265777f840dd0ec7b226cb96f237c96eee Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 14:34:36 +0300 Subject: [PATCH 46/76] Disable instantiation of connection info, interface stats and transport stats outside of framework --- OpenVPN Adapter/OpenVPNConnectionInfo.h | 2 ++ OpenVPN Adapter/OpenVPNInterfaceStats.h | 2 ++ OpenVPN Adapter/OpenVPNTransportStats.h | 2 ++ 3 files changed, 6 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo.h b/OpenVPN Adapter/OpenVPNConnectionInfo.h index b5c35de..369b6fd 100644 --- a/OpenVPN Adapter/OpenVPNConnectionInfo.h +++ b/OpenVPN Adapter/OpenVPNConnectionInfo.h @@ -26,4 +26,6 @@ @property (nullable, readonly, nonatomic) NSString *clientIP; @property (nullable, readonly, nonatomic) NSString *tunName; +- (nonnull instancetype) __unavailable init; + @end diff --git a/OpenVPN Adapter/OpenVPNInterfaceStats.h b/OpenVPN Adapter/OpenVPNInterfaceStats.h index 6fcf612..c909a8a 100644 --- a/OpenVPN Adapter/OpenVPNInterfaceStats.h +++ b/OpenVPN Adapter/OpenVPNInterfaceStats.h @@ -17,4 +17,6 @@ @property (readonly, nonatomic) NSInteger errorsIn; @property (readonly, nonatomic) NSInteger errorsOut; +- (nonnull instancetype) __unavailable init; + @end diff --git a/OpenVPN Adapter/OpenVPNTransportStats.h b/OpenVPN Adapter/OpenVPNTransportStats.h index 9be8323..7c07003 100644 --- a/OpenVPN Adapter/OpenVPNTransportStats.h +++ b/OpenVPN Adapter/OpenVPNTransportStats.h @@ -39,4 +39,6 @@ */ @property (readonly, nonatomic) NSInteger lastPacketReceived; +- (nonnull instancetype) __unavailable init; + @end From 423ee16f5310376dcdab5bfa14d2d2f846b11ad4 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 14:40:44 +0300 Subject: [PATCH 47/76] Add documentation comments to interface stats wrapper --- OpenVPN Adapter/OpenVPNInterfaceStats.h | 26 +++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNInterfaceStats.h b/OpenVPN Adapter/OpenVPNInterfaceStats.h index c909a8a..81cddde 100644 --- a/OpenVPN Adapter/OpenVPNInterfaceStats.h +++ b/OpenVPN Adapter/OpenVPNInterfaceStats.h @@ -8,13 +8,39 @@ #import +/** + Class used to provide stats for an interface + */ @interface OpenVPNInterfaceStats : NSObject +/** + Amount of received bytes + */ @property (readonly, nonatomic) NSInteger bytesIn; + +/** + Amout of sent bytes + */ @property (readonly, nonatomic) NSInteger bytesOut; + +/** + Amount of received packets + */ @property (readonly, nonatomic) NSInteger packetsIn; + +/** + Amout of sent packets + */ @property (readonly, nonatomic) NSInteger packetsOut; + +/** + Amount of incoming packets handling errors + */ @property (readonly, nonatomic) NSInteger errorsIn; + +/** + Amount of outgoing packets handling errors + */ @property (readonly, nonatomic) NSInteger errorsOut; - (nonnull instancetype) __unavailable init; From 410ccdd916d4839eaf2a33bdd93837411cdc50ed Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 15:41:38 +0300 Subject: [PATCH 48/76] Wrap server entry --- OpenVPN Adapter.xcodeproj/project.pbxproj | 22 ++++++++++++++++-- OpenVPN Adapter/OpenVPNServerEntry+Internal.h | 19 +++++++++++++++ OpenVPN Adapter/OpenVPNServerEntry.h | 18 +++++++++++++++ OpenVPN Adapter/OpenVPNServerEntry.mm | 23 +++++++++++++++++++ OpenVPN Adapter/Umbrella-Header.h | 2 ++ 5 files changed, 82 insertions(+), 2 deletions(-) create mode 100644 OpenVPN Adapter/OpenVPNServerEntry+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNServerEntry.h create mode 100644 OpenVPN Adapter/OpenVPNServerEntry.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 63fa09b..1f8cbb9 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -33,12 +33,18 @@ C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */; }; C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */; }; - C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; }; - C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; }; + C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9657A361EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */; }; C9657A371EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */; }; C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */; }; C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */; }; + C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A421EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */; }; + C9657A431EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */; }; + C9657A461EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */; }; + C9657A471EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -123,6 +129,9 @@ C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNInterfaceStats.h; sourceTree = ""; }; C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNInterfaceStats.mm; sourceTree = ""; }; C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNInterfaceStats+Internal.h"; sourceTree = ""; }; + C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNServerEntry.h; sourceTree = ""; }; + C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNServerEntry.mm; sourceTree = ""; }; + C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNServerEntry+Internal.h"; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; @@ -295,6 +304,9 @@ C93779D31EAE32670030A362 /* OpenVPNCredentials.h */, C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */, C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */, + C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */, + C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */, + C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */, C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, @@ -393,6 +405,7 @@ C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */, C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, + C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, @@ -406,6 +419,7 @@ C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A461EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */, C9657A251EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -419,6 +433,7 @@ C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */, C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, + C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, @@ -432,6 +447,7 @@ C93779D61EAE32670030A362 /* OpenVPNCredentials.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A471EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */, C9657A261EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; @@ -630,6 +646,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9657A421EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */, C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, @@ -657,6 +674,7 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( + C9657A431EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */, C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, diff --git a/OpenVPN Adapter/OpenVPNServerEntry+Internal.h b/OpenVPN Adapter/OpenVPNServerEntry+Internal.h new file mode 100644 index 0000000..e8685f5 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNServerEntry+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNServerEntry+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNServerEntry.h" + +using namespace openvpn; + +@interface OpenVPNServerEntry (Internal) + +- (instancetype)initWithServerEntry:(ClientAPI::ServerEntry)entry; + +@end diff --git a/OpenVPN Adapter/OpenVPNServerEntry.h b/OpenVPN Adapter/OpenVPNServerEntry.h new file mode 100644 index 0000000..75ecb40 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNServerEntry.h @@ -0,0 +1,18 @@ +// +// OpenVPNServerEntry.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +@interface OpenVPNServerEntry : NSObject + +@property (nullable, readonly, nonatomic) NSString *server; +@property (nullable, readonly, nonatomic) NSString *friendlyName; + +- (nonnull instancetype) __unavailable init; + +@end diff --git a/OpenVPN Adapter/OpenVPNServerEntry.mm b/OpenVPN Adapter/OpenVPNServerEntry.mm new file mode 100644 index 0000000..b87e7d0 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNServerEntry.mm @@ -0,0 +1,23 @@ +// +// OpenVPNServerEntry.mm +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import "OpenVPNServerEntry.h" +#import "OpenVPNServerEntry+Internal.h" + +@implementation OpenVPNServerEntry + +- (instancetype)initWithServerEntry:(ClientAPI::ServerEntry)entry { + self = [super init]; + if (self) { + _server = !entry.server.empty() ? [NSString stringWithUTF8String:entry.server.c_str()] : nil; + _friendlyName = !entry.friendlyName.empty() ? [NSString stringWithUTF8String:entry.friendlyName.c_str()] : nil; + } + return self; +} + +@end diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index a258bfe..70961a4 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -20,7 +20,9 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import #import +#import #import #import +#import #import #import From 73f0c1208400ad0411027c0c6da8f8f77354da11 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 17:00:27 +0300 Subject: [PATCH 49/76] Put configuration enums into separate headers --- OpenVPN Adapter/OpenVPNCompressionMode.h | 23 +++++++ OpenVPN Adapter/OpenVPNConfiguration.h | 78 ++-------------------- OpenVPN Adapter/OpenVPNIPv6Preference.h | 21 ++++++ OpenVPN Adapter/OpenVPNMinTLSVersion.h | 25 +++++++ OpenVPN Adapter/OpenVPNTLSCertProfile.h | 27 ++++++++ OpenVPN Adapter/OpenVPNTransportProtocol.h | 23 +++++++ 6 files changed, 124 insertions(+), 73 deletions(-) create mode 100644 OpenVPN Adapter/OpenVPNCompressionMode.h create mode 100644 OpenVPN Adapter/OpenVPNIPv6Preference.h create mode 100644 OpenVPN Adapter/OpenVPNMinTLSVersion.h create mode 100644 OpenVPN Adapter/OpenVPNTLSCertProfile.h create mode 100644 OpenVPN Adapter/OpenVPNTransportProtocol.h diff --git a/OpenVPN Adapter/OpenVPNCompressionMode.h b/OpenVPN Adapter/OpenVPNCompressionMode.h new file mode 100644 index 0000000..3154398 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNCompressionMode.h @@ -0,0 +1,23 @@ +// +// OpenVPNCompressionMode.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Compression mode options + */ +typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { + /// Allow compression on both uplink and downlink + OpenVPNCompressionModeEnabled, + /// Support compression stubs only + OpenVPNCompressionModeDisabled, + /// Allow compression on downlink only (i.e. server -> client) + OpenVPNCompressionModeAsym, + /// Default behavior (support compression stubs only) + OpenVPNCompressionModeDefault +}; diff --git a/OpenVPN Adapter/OpenVPNConfiguration.h b/OpenVPN Adapter/OpenVPNConfiguration.h index b5fe882..5c431d5 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.h +++ b/OpenVPN Adapter/OpenVPNConfiguration.h @@ -8,79 +8,11 @@ #import -/** - Transport protocol options - */ -typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol) { - /// - OpenVPNTransportProtocolUDP, - /// - OpenVPNTransportProtocolTCP, - /// - OpenVPNTransportProtocolAdaptive, - /// Use a transport protocol specified in the profile - OpenVPNTransportProtocolDefault -}; - -/** - IPv6 preference options - */ -typedef NS_ENUM(NSInteger, OpenVPNIPv6Preference) { - /// Request combined IPv4/IPv6 tunnel - OpenVPNIPv6PreferenceEnabled, - /// Disable IPv6, so tunnel will be IPv4-only - OpenVPNIPv6PreferenceDisabled, - /// Leave decision to server - OpenVPNIPv6PreferenceDefault -}; - -/** - Compression mode options - */ -typedef NS_ENUM(NSInteger, OpenVPNCompressionMode) { - /// Allow compression on both uplink and downlink - OpenVPNCompressionModeEnabled, - /// Support compression stubs only - OpenVPNCompressionModeDisabled, - /// Allow compression on downlink only (i.e. server -> client) - OpenVPNCompressionModeAsym, - /// Default behavior (support compression stubs only) - OpenVPNCompressionModeDefault -}; - -/** - Minimum TLS version options - */ -typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { - /// Don't specify a minimum, and disable any minimum specified in profile - OpenVPNMinTLSVersionDisabled, - /// Use TLS 1.0 minimum (overrides profile) - OpenVPNMinTLSVersion10, - /// Use TLS 1.1 minimum (overrides profile) - OpenVPNMinTLSVersion11, - /// Use TLS 1.2 minimum (overrides profile) - OpenVPNMinTLSVersion12, - /// Use profile minimum - OpenVPNMinTLSVersionDefault -}; - -/** - Options of the tls-cert-profile setting - */ -typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { - /// Allow 1024-bit RSA certs signed with SHA1 - OpenVPNTLSCertProfileLegacy, - /// Require at least 2048-bit RSA certs signed with SHA256 or higher - OpenVPNTLSCertProfilePreferred, - /// Require NSA Suite-B - OpenVPNTLSCertProfileSuiteB, - /// Use legacy as the default if profile doesn't specify tls-cert-profile - OpenVPNTLSCertProfileLegacyDefault, - /// Use preferred as the default if profile doesn't specify tls-cert-profile - OpenVPNTLSCertProfilePreferredDefault, - /// Use profile default - OpenVPNTLSCertProfileDefault -}; +#import "OpenVPNTransportProtocol.h" +#import "OpenVPNIPv6Preference.h" +#import "OpenVPNCompressionMode.h" +#import "OpenVPNMinTLSVersion.h" +#import "OpenVPNTLSCertProfile.h" /** Class used to pass configuration diff --git a/OpenVPN Adapter/OpenVPNIPv6Preference.h b/OpenVPN Adapter/OpenVPNIPv6Preference.h new file mode 100644 index 0000000..6cfc051 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNIPv6Preference.h @@ -0,0 +1,21 @@ +// +// OpenVPNIPv6Preference.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + IPv6 preference options + */ +typedef NS_ENUM(NSInteger, OpenVPNIPv6Preference) { + /// Request combined IPv4/IPv6 tunnel + OpenVPNIPv6PreferenceEnabled, + /// Disable IPv6, so tunnel will be IPv4-only + OpenVPNIPv6PreferenceDisabled, + /// Leave decision to server + OpenVPNIPv6PreferenceDefault +}; diff --git a/OpenVPN Adapter/OpenVPNMinTLSVersion.h b/OpenVPN Adapter/OpenVPNMinTLSVersion.h new file mode 100644 index 0000000..deafb05 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNMinTLSVersion.h @@ -0,0 +1,25 @@ +// +// OpenVPNMinTLSVersion.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Minimum TLS version options + */ +typedef NS_ENUM(NSInteger, OpenVPNMinTLSVersion) { + /// Don't specify a minimum, and disable any minimum specified in profile + OpenVPNMinTLSVersionDisabled, + /// Use TLS 1.0 minimum (overrides profile) + OpenVPNMinTLSVersion10, + /// Use TLS 1.1 minimum (overrides profile) + OpenVPNMinTLSVersion11, + /// Use TLS 1.2 minimum (overrides profile) + OpenVPNMinTLSVersion12, + /// Use profile minimum + OpenVPNMinTLSVersionDefault +}; diff --git a/OpenVPN Adapter/OpenVPNTLSCertProfile.h b/OpenVPN Adapter/OpenVPNTLSCertProfile.h new file mode 100644 index 0000000..6893379 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNTLSCertProfile.h @@ -0,0 +1,27 @@ +// +// OpenVPNTLSCertProfile.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Options of the tls-cert-profile setting + */ +typedef NS_ENUM(NSInteger, OpenVPNTLSCertProfile) { + /// Allow 1024-bit RSA certs signed with SHA1 + OpenVPNTLSCertProfileLegacy, + /// Require at least 2048-bit RSA certs signed with SHA256 or higher + OpenVPNTLSCertProfilePreferred, + /// Require NSA Suite-B + OpenVPNTLSCertProfileSuiteB, + /// Use legacy as the default if profile doesn't specify tls-cert-profile + OpenVPNTLSCertProfileLegacyDefault, + /// Use preferred as the default if profile doesn't specify tls-cert-profile + OpenVPNTLSCertProfilePreferredDefault, + /// Use profile default + OpenVPNTLSCertProfileDefault +}; diff --git a/OpenVPN Adapter/OpenVPNTransportProtocol.h b/OpenVPN Adapter/OpenVPNTransportProtocol.h new file mode 100644 index 0000000..64a83c8 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNTransportProtocol.h @@ -0,0 +1,23 @@ +// +// OpenVPNTransportProtocol.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +/** + Transport protocol options + */ +typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol) { + /// + OpenVPNTransportProtocolUDP, + /// + OpenVPNTransportProtocolTCP, + /// + OpenVPNTransportProtocolAdaptive, + /// Use a transport protocol specified in the profile + OpenVPNTransportProtocolDefault +}; From 9920737837da28c69f09ba8c9b5ec85d7fb6cab1 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 17:37:07 +0300 Subject: [PATCH 50/76] Rename files containing values --- OpenVPN Adapter/OpenVPNConfiguration.mm | 4 ++-- .../{OpenVPNConfigurationValues.h => OpenVPNValues.h} | 0 .../{OpenVPNConfigurationValues.mm => OpenVPNValues.mm} | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) rename OpenVPN Adapter/{OpenVPNConfigurationValues.h => OpenVPNValues.h} (100%) rename OpenVPN Adapter/{OpenVPNConfigurationValues.mm => OpenVPNValues.mm} (97%) diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 2745241..7cee211 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -6,7 +6,7 @@ // // -#import "OpenVPNConfigurationValues.h" +#import "OpenVPNValues.h" #import "OpenVPNConfiguration.h" #import "OpenVPNConfiguration+Internal.h" @@ -314,7 +314,7 @@ using namespace openvpn; } - (NSDictionary *)peerInfo { - if (_config.peerInfo.size() == 0) { + if (_config.peerInfo.empty()) { return nil; } diff --git a/OpenVPN Adapter/OpenVPNConfigurationValues.h b/OpenVPN Adapter/OpenVPNValues.h similarity index 100% rename from OpenVPN Adapter/OpenVPNConfigurationValues.h rename to OpenVPN Adapter/OpenVPNValues.h diff --git a/OpenVPN Adapter/OpenVPNConfigurationValues.mm b/OpenVPN Adapter/OpenVPNValues.mm similarity index 97% rename from OpenVPN Adapter/OpenVPNConfigurationValues.mm rename to OpenVPN Adapter/OpenVPNValues.mm index 5e1df44..53737cd 100644 --- a/OpenVPN Adapter/OpenVPNConfigurationValues.mm +++ b/OpenVPN Adapter/OpenVPNValues.mm @@ -6,7 +6,7 @@ // // -#import "OpenVPNConfigurationValues.h" +#import "OpenVPNValues.h" NSString * const OpenVPNTransportProtocolUDPValue = @"udp"; NSString * const OpenVPNTransportProtocolTCPValue = @"tcp"; From eab5cd72d7497cc43c85ec84cad972c5bb0c3c8b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Wed, 26 Apr 2017 18:06:34 +0300 Subject: [PATCH 51/76] Wrap eval config --- OpenVPN Adapter/OpenVPNProperties+Internal.h | 19 +++++ OpenVPN Adapter/OpenVPNProperties.h | 79 ++++++++++++++++++++ OpenVPN Adapter/OpenVPNProperties.mm | 61 +++++++++++++++ 3 files changed, 159 insertions(+) create mode 100644 OpenVPN Adapter/OpenVPNProperties+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNProperties.h create mode 100644 OpenVPN Adapter/OpenVPNProperties.mm diff --git a/OpenVPN Adapter/OpenVPNProperties+Internal.h b/OpenVPN Adapter/OpenVPNProperties+Internal.h new file mode 100644 index 0000000..c4f0ea9 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNProperties+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNProperties+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNProperties.h" + +using namespace openvpn; + +@interface OpenVPNProperties (Internal) + +- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval; + +@end diff --git a/OpenVPN Adapter/OpenVPNProperties.h b/OpenVPN Adapter/OpenVPNProperties.h new file mode 100644 index 0000000..1182d2d --- /dev/null +++ b/OpenVPN Adapter/OpenVPNProperties.h @@ -0,0 +1,79 @@ +// +// OpenVPNProperties.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNTransportProtocol.h" + +@class OpenVPNServerEntry; + +@interface OpenVPNProperties : NSObject + +/** + This username must be used with profile + */ +@property (nullable, readonly, nonatomic) NSString *username; + +/** + Profile name of config + */ +@property (nullable, readonly, nonatomic) NSString *profileName; + +/** + "Friendly" name of config + */ +@property (nullable, readonly, nonatomic) NSString *friendlyName; + +/** + If YES no creds required, otherwise username/password required + */ +@property (readonly, nonatomic) BOOL autologin; + +/** + Static challenge, may be empty, ignored if autologin + */ +@property (nullable, readonly, nonatomic) NSString *staticChallenge; + +/** + YES if static challenge response should be echoed to UI, ignored if autologin + */ +@property (readonly, nonatomic) BOOL staticChallengeEcho; + +/** + YES if this profile requires a private key password + */ +@property (readonly, nonatomic) BOOL privateKeyPasswordRequired; + +/** + YES if user is allowed to save authentication password in UI + */ +@property (readonly, nonatomic) BOOL allowPasswordSave; + +/** + Address of the first remote item in config + */ +@property (nullable, readonly, nonatomic) NSString *remoteHost; + +/** + Port of the first remote item in config + */ +@property (readonly, nonatomic) NSUInteger remotePort; + +/** + Transport protocol of the first remote item in config + */ +@property (readonly, nonatomic) OpenVPNTransportProtocol remoteProto; + +/** + Optional list of user-selectable VPN servers + */ +@property (nullable, readonly, nonatomic) NSArray *servers; + +- (nonnull instancetype) __unavailable init; + +@end diff --git a/OpenVPN Adapter/OpenVPNProperties.mm b/OpenVPN Adapter/OpenVPNProperties.mm new file mode 100644 index 0000000..b3ec6f0 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNProperties.mm @@ -0,0 +1,61 @@ +// +// OpenVPNProperties.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 26.04.17. +// +// + +#import + +#import "OpenVPNValuesConverter.h" +#import "OpenVPNServerEntry+Internal.h" +#import "OpenVPNProperties.h" +#import "OpenVPNProperties+Internal.h" + +using namespace openvpn; + +@implementation OpenVPNProperties + +- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval { + self = [super init]; + if (self) { + _username = !eval.userlockedUsername.empty() ? [NSString stringWithUTF8String:eval.userlockedUsername.c_str()] : nil; + + _profileName = !eval.profileName.empty() ? [NSString stringWithUTF8String:eval.profileName.c_str()] : nil; + _friendlyName = !eval.friendlyName.empty() ? [NSString stringWithUTF8String:eval.friendlyName.c_str()] : nil; + + _autologin = eval.autologin; + + _staticChallenge = !eval.staticChallenge.empty() ? [NSString stringWithUTF8String:eval.staticChallenge.c_str()] : nil; + _staticChallengeEcho = eval.staticChallengeEcho; + + _privateKeyPasswordRequired = eval.privateKeyPasswordRequired; + _allowPasswordSave = eval.allowPasswordSave; + + _remoteHost = !eval.remoteHost.empty() ? [NSString stringWithUTF8String:eval.remoteHost.c_str()] : nil; + + uint16_t port = 0; + parse_number(eval.remotePort, port); + + _remotePort = port; + + NSString *currentProto = [NSString stringWithUTF8String:eval.remoteProto.c_str()]; + _remoteProto = [OpenVPNPropertyConverter getTransportProtocolFromString:currentProto]; + + _servers = nil; + if (!eval.serverList.empty()) { + NSMutableArray *servers = [NSMutableArray new]; + + for (ClientAPI::ServerEntry entry : eval.serverList) { + OpenVPNServerEntry *serverEntry = [[OpenVPNServerEntry alloc] initWithServerEntry:entry]; + [servers addObject:serverEntry]; + } + + _servers = servers; + } + } + return self; +} + +@end From 0025e4f8ac4706b605f8432def1f50b73dcc86f7 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Thu, 27 Apr 2017 19:17:14 +0300 Subject: [PATCH 52/76] Return values to configuration class and add types to the umbrella header --- OpenVPN Adapter.xcodeproj/project.pbxproj | 120 +++++++---- .../OpenVPNConfiguration+Internal.h | 9 + OpenVPN Adapter/OpenVPNConfiguration.mm | 202 +++++++++++------- OpenVPN Adapter/OpenVPNValues.h | 36 ---- OpenVPN Adapter/OpenVPNValues.mm | 36 ---- OpenVPN Adapter/Umbrella-Header.h | 6 + 6 files changed, 224 insertions(+), 185 deletions(-) delete mode 100644 OpenVPN Adapter/OpenVPNValues.h delete mode 100644 OpenVPN Adapter/OpenVPNValues.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 1f8cbb9..86b0f5e 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -9,10 +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 */; }; - C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */; }; - C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; - C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */; }; - C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */ = {isa = PBXBuildFile; fileRef = C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */; }; 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 */; }; @@ -45,6 +41,22 @@ C9657A431EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */; }; C9657A461EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */; }; C9657A471EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */; }; + C9657A4C1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A4A1EB0CD6C00EFF210 /* OpenVPNProperties.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A4D1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A4A1EB0CD6C00EFF210 /* OpenVPNProperties.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A561EB0CDFA00EFF210 /* OpenVPNProperties+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A501EB0CD9200EFF210 /* OpenVPNProperties+Internal.h */; }; + C9657A571EB0CDFB00EFF210 /* OpenVPNProperties+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A501EB0CD9200EFF210 /* OpenVPNProperties+Internal.h */; }; + C9657A581EB0CE1300EFF210 /* OpenVPNProperties.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A4B1EB0CD6C00EFF210 /* OpenVPNProperties.mm */; }; + C9657A591EB0CE1400EFF210 /* OpenVPNProperties.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9657A4B1EB0CD6C00EFF210 /* OpenVPNProperties.mm */; }; + C9657A5E1EB0D60700EFF210 /* OpenVPNTransportProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A5D1EB0D60700EFF210 /* OpenVPNTransportProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A5F1EB0D60700EFF210 /* OpenVPNTransportProtocol.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A5D1EB0D60700EFF210 /* OpenVPNTransportProtocol.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A611EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A601EB0D64E00EFF210 /* OpenVPNIPv6Preference.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A621EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A601EB0D64E00EFF210 /* OpenVPNIPv6Preference.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A641EB0D6C200EFF210 /* OpenVPNCompressionMode.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A651EB0D6C200EFF210 /* OpenVPNCompressionMode.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A671EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A681EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A6A1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9657A6B1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; @@ -114,8 +126,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; }; - C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfigurationValues.h; sourceTree = ""; }; - C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfigurationValues.mm; 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 = ""; }; @@ -132,6 +142,14 @@ C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNServerEntry.h; sourceTree = ""; }; C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNServerEntry.mm; sourceTree = ""; }; C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNServerEntry+Internal.h"; sourceTree = ""; }; + C9657A4A1EB0CD6C00EFF210 /* OpenVPNProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNProperties.h; sourceTree = ""; }; + C9657A4B1EB0CD6C00EFF210 /* OpenVPNProperties.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNProperties.mm; sourceTree = ""; }; + C9657A501EB0CD9200EFF210 /* OpenVPNProperties+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNProperties+Internal.h"; sourceTree = ""; }; + C9657A5D1EB0D60700EFF210 /* OpenVPNTransportProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTransportProtocol.h; sourceTree = ""; }; + C9657A601EB0D64E00EFF210 /* OpenVPNIPv6Preference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNIPv6Preference.h; sourceTree = ""; }; + C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNCompressionMode.h; sourceTree = ""; }; + C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNMinTLSVersion.h; sourceTree = ""; }; + C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTLSCertProfile.h; sourceTree = ""; }; C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; @@ -239,21 +257,53 @@ name = Frameworks; sourceTree = ""; }; - C93779CA1EAE15EE0030A362 /* Helpers */ = { + C9235AC41EB24F0100C7D303 /* Configuration */ = { isa = PBXGroup; children = ( - C93779CB1EAE15F50030A362 /* Constants */, + C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */, + C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */, + C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */, + C93779D31EAE32670030A362 /* OpenVPNCredentials.h */, + C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */, + C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */, + C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */, + C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */, + C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */, + C9657A4A1EB0CD6C00EFF210 /* OpenVPNProperties.h */, + C9657A501EB0CD9200EFF210 /* OpenVPNProperties+Internal.h */, + C9657A4B1EB0CD6C00EFF210 /* OpenVPNProperties.mm */, ); - name = Helpers; + name = Configuration; sourceTree = ""; }; - C93779CB1EAE15F50030A362 /* Constants */ = { + C9235AC51EB24F1100C7D303 /* Stats */ = { isa = PBXGroup; children = ( - C93779CC1EAE17F50030A362 /* OpenVPNConfigurationValues.h */, - C93779CD1EAE17F50030A362 /* OpenVPNConfigurationValues.mm */, + C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, + C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, + C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, + C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */, + C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */, + C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */, + C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */, + C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */, + C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */, ); - name = Constants; + name = Stats; + sourceTree = ""; + }; + C9235AC61EB24F2A00C7D303 /* Types */ = { + isa = PBXGroup; + children = ( + C9BB476F1E7171A100F3F98C /* OpenVPNError.h */, + C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */, + C9657A5D1EB0D60700EFF210 /* OpenVPNTransportProtocol.h */, + C9657A601EB0D64E00EFF210 /* OpenVPNIPv6Preference.h */, + C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */, + C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */, + C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */, + ); + name = Types; sourceTree = ""; }; C9B376B71EA53CE700B7F423 /* Client */ = { @@ -279,7 +329,6 @@ C9BB47641E7169AF00F3F98C /* Libraries */ = { isa = PBXGroup; children = ( - C93779CA1EAE15EE0030A362 /* Helpers */, C9BB47681E716ABF00F3F98C /* Vendors */, ); name = Libraries; @@ -296,26 +345,9 @@ C9BB47671E7169F000F3F98C /* Adapter */ = { isa = PBXGroup; children = ( - C9BB476F1E7171A100F3F98C /* OpenVPNError.h */, - C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */, - C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */, - C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */, - C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */, - C93779D31EAE32670030A362 /* OpenVPNCredentials.h */, - C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */, - C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */, - C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */, - C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */, - C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */, - C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, - C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, - C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, - C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */, - C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */, - C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */, - C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */, - C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */, - C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */, + C9235AC61EB24F2A00C7D303 /* Types */, + C9235AC41EB24F0100C7D303 /* Configuration */, + C9235AC51EB24F1100C7D303 /* Stats */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -404,21 +436,27 @@ C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */, C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, + C9657A4C1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */, + C9657A571EB0CDFB00EFF210 /* OpenVPNProperties+Internal.h in Headers */, C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, - C93779CE1EAE17F50030A362 /* OpenVPNConfigurationValues.h in Headers */, C9657A2B1EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h in Headers */, C9BB47601E71663A00F3F98C /* Umbrella-Header.h in Headers */, + C9657A5E1EB0D60700EFF210 /* OpenVPNTransportProtocol.h in Headers */, C9657A1D1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, C9657A171EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */, C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */, C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.h in Headers */, + C9657A611EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */, + C9657A671EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */, C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */, + C9657A641EB0D6C200EFF210 /* OpenVPNCompressionMode.h in Headers */, C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */, C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A6A1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */, C9657A461EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */, C9657A251EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); @@ -432,21 +470,27 @@ C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */, C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, + C9657A4D1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */, + C9657A561EB0CDFA00EFF210 /* OpenVPNProperties+Internal.h in Headers */, C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */, - C93779D01EAE18730030A362 /* OpenVPNConfigurationValues.h in Headers */, C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */, C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.h in Headers */, + C9657A5F1EB0D60700EFF210 /* OpenVPNTransportProtocol.h in Headers */, C9657A1E1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h in Headers */, C9657A181EB0A7F800EFF210 /* OpenVPNConnectionInfo.h in Headers */, C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */, C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */, C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */, + C9657A621EB0D64E00EFF210 /* OpenVPNIPv6Preference.h in Headers */, + C9657A681EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */, C93779D61EAE32670030A362 /* OpenVPNCredentials.h in Headers */, + C9657A651EB0D6C200EFF210 /* OpenVPNCompressionMode.h in Headers */, C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */, C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */, + C9657A6B1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */, C9657A471EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */, C9657A261EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */, ); @@ -650,8 +694,8 @@ C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, + C9657A581EB0CE1300EFF210 /* OpenVPNProperties.mm in Sources */, C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */, - C93779CF1EAE17F50030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */, C9657A361EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */, C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, @@ -678,9 +722,9 @@ C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, + C9657A591EB0CE1400EFF210 /* OpenVPNProperties.mm in Sources */, C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */, C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */, - C93779D11EAE18760030A362 /* OpenVPNConfigurationValues.mm in Sources */, C9657A371EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */, C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */, C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */, diff --git a/OpenVPN Adapter/OpenVPNConfiguration+Internal.h b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h index a14b00e..5219545 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration+Internal.h +++ b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h @@ -16,4 +16,13 @@ using namespace openvpn; @property (readonly) ClientAPI::Config config; ++ (OpenVPNTransportProtocol)getTransportProtocolFromString:(nullable NSString *)value; ++ (nonnull NSString *)getStringFromTransportProtocol:(OpenVPNTransportProtocol)protocol; + ++ (OpenVPNIPv6Preference)getIPv6PreferenceFromString:(nullable NSString *)value; ++ (nonnull NSString *)getStringFromIPv6Preference:(OpenVPNIPv6Preference)preference; + ++ (OpenVPNCompressionMode)getCompressionModeFromString:(nullable NSString *)value; ++ (nonnull NSString *)getStringFromCompressionMode:(OpenVPNCompressionMode)compressionMode; + @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index 7cee211..ca06176 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -6,12 +6,37 @@ // // -#import "OpenVPNValues.h" -#import "OpenVPNConfiguration.h" #import "OpenVPNConfiguration+Internal.h" using namespace openvpn; +NSString * const OpenVPNTransportProtocolUDPValue = @"udp"; +NSString * const OpenVPNTransportProtocolTCPValue = @"tcp"; +NSString * const OpenVPNTransportProtocolAdaptiveValue = @"adaptive"; +NSString * const OpenVPNTransportProtocolDefaultValue = @""; + +NSString * const OpenVPNIPv6PreferenceEnabledValue = @"yes"; +NSString * const OpenVPNIPv6PreferenceDisabledValue = @"no"; +NSString * const OpenVPNIPv6PreferenceDefaultValue = @"default"; + +NSString * const OpenVPNCompressionModeEnabledValue = @"yes"; +NSString * const OpenVPNCompressionModeDisabledValue = @"no"; +NSString * const OpenVPNCompressionModeAsymValue = @"asym"; +NSString * const OpenVPNCompressionModeDefaultValue = @""; + +NSString * const OpenVPNMinTLSVersionDisabledValue = @"disabled"; +NSString * const OpenVPNMinTLSVersion10Value = @"tls_1_0"; +NSString * const OpenVPNMinTLSVersion11Value = @"tls_1_1"; +NSString * const OpenVPNMinTLSVersion12Value = @"tls_1_2"; +NSString * const OpenVPNMinTLSVersionDefaultValue = @"default"; + +NSString * const OpenVPNTLSCertProfileLegacyValue = @"legacy"; +NSString * const OpenVPNTLSCertProfilePreferredValue = @"preferred"; +NSString * const OpenVPNTLSCertProfileSuiteBValue = @"suiteb"; +NSString * const OpenVPNTLSCertProfileLegacyDefaultValue = @"legacy-default"; +NSString * const OpenVPNTLSCertProfilePreferredDefaultValue = @"preferred-default"; +NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; + @interface OpenVPNConfiguration () { ClientAPI::Config _config; } @@ -24,6 +49,94 @@ using namespace openvpn; return _config; } ++ (OpenVPNTransportProtocol)getTransportProtocolFromString:(NSString *)value { + NSDictionary *options = @{ + OpenVPNTransportProtocolUDPValue: @(OpenVPNTransportProtocolUDP), + OpenVPNTransportProtocolTCPValue: @(OpenVPNTransportProtocolTCP), + OpenVPNTransportProtocolAdaptiveValue: @(OpenVPNTransportProtocolAdaptive), + OpenVPNTransportProtocolDefaultValue: @(OpenVPNTransportProtocolDefault) + }; + + NSString *currentValue = [value length] == 0 ? OpenVPNTransportProtocolDefaultValue : value; + + NSNumber *transportProtocol = options[currentValue]; + NSAssert(transportProtocol != nil, @"Incorrect protocol value: %@", currentValue); + + return (OpenVPNTransportProtocol)[transportProtocol integerValue]; +} + ++ (nonnull NSString *)getStringFromTransportProtocol:(OpenVPNTransportProtocol)protocol { + NSDictionary *options = @{ + @(OpenVPNTransportProtocolUDP): OpenVPNTransportProtocolUDPValue, + @(OpenVPNTransportProtocolTCP): OpenVPNTransportProtocolTCPValue, + @(OpenVPNTransportProtocolAdaptive): OpenVPNTransportProtocolAdaptiveValue, + @(OpenVPNTransportProtocolDefault): OpenVPNTransportProtocolDefaultValue + }; + + NSString *value = options[@(protocol)]; + NSAssert(value != nil, @"Incorrect protocol value: %li", (NSInteger)protocol); + + return value; +} + ++ (OpenVPNIPv6Preference)getIPv6PreferenceFromString:(nullable NSString *)value { + NSDictionary *options = @{ + OpenVPNIPv6PreferenceEnabledValue: @(OpenVPNIPv6PreferenceEnabled), + OpenVPNIPv6PreferenceDisabledValue: @(OpenVPNIPv6PreferenceDisabled), + OpenVPNIPv6PreferenceDefaultValue: @(OpenVPNIPv6PreferenceDefault) + }; + + NSString *currentValue = [value length] == 0 ? OpenVPNIPv6PreferenceDefaultValue : value; + + NSNumber *ipv6 = options[currentValue]; + NSAssert(ipv6 != nil, @"Incorrect ipv6 value: %@", currentValue); + + return (OpenVPNIPv6Preference)[ipv6 integerValue]; +} + ++ (nonnull NSString *)getStringFromIPv6Preference:(OpenVPNIPv6Preference)preference { + NSDictionary *options = @{ + @(OpenVPNIPv6PreferenceEnabled): OpenVPNIPv6PreferenceEnabledValue, + @(OpenVPNIPv6PreferenceDisabled): OpenVPNIPv6PreferenceDisabledValue, + @(OpenVPNIPv6PreferenceDefault): OpenVPNIPv6PreferenceDefaultValue + }; + + NSString *value = options[@(preference)]; + NSAssert(value != nil, @"Incorrect ipv6 value: %li", (NSInteger)preference); + + return value; +} + ++ (OpenVPNCompressionMode)getCompressionModeFromString:(nullable NSString *)value { + NSDictionary *options = @{ + OpenVPNCompressionModeEnabledValue: @(OpenVPNCompressionModeEnabled), + OpenVPNCompressionModeDisabledValue: @(OpenVPNCompressionModeDisabled), + OpenVPNCompressionModeAsymValue: @(OpenVPNCompressionModeAsym), + OpenVPNCompressionModeDefaultValue: @(OpenVPNCompressionModeDefault) + }; + + NSString *currentValue = [value length] == 0 ? OpenVPNCompressionModeDefaultValue : value; + + NSNumber *compressionMode = options[currentValue]; + NSAssert(compressionMode != nil, @"Incorrect compressionMode value: %@", currentValue); + + return (OpenVPNCompressionMode)[compressionMode integerValue]; +} + ++ (nonnull NSString *)getStringFromCompressionMode:(OpenVPNCompressionMode)compressionMode { + NSDictionary *options = @{ + @(OpenVPNCompressionModeEnabled): OpenVPNCompressionModeEnabledValue, + @(OpenVPNCompressionModeDisabled): OpenVPNCompressionModeDisabledValue, + @(OpenVPNCompressionModeAsym): OpenVPNCompressionModeAsymValue, + @(OpenVPNCompressionModeDefault): OpenVPNCompressionModeDefaultValue + }; + + NSString *value = options[@(compressionMode)]; + NSAssert(value != nil, @"Incorrect compressionMode value: %li", (NSInteger)compressionMode); + + return value; +} + @end @implementation OpenVPNConfiguration @@ -83,63 +196,23 @@ using namespace openvpn; } - (OpenVPNTransportProtocol)proto { - NSDictionary *options = @{ - OpenVPNTransportProtocolUDPValue: @(OpenVPNTransportProtocolUDP), - OpenVPNTransportProtocolTCPValue: @(OpenVPNTransportProtocolTCP), - OpenVPNTransportProtocolAdaptiveValue: @(OpenVPNTransportProtocolAdaptive), - OpenVPNTransportProtocolDefaultValue: @(OpenVPNTransportProtocolDefault) - }; - - NSString *currentValue = _config.protoOverride.empty() ? OpenVPNTransportProtocolDefaultValue : - [NSString stringWithUTF8String:_config.protoOverride.c_str()]; - - NSNumber *transportProtocol = options[currentValue]; - NSAssert(transportProtocol != nil, @"Incorrect protoOverride value: %@", currentValue); - - return (OpenVPNTransportProtocol)[transportProtocol integerValue]; + NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()]; + return [OpenVPNConfiguration getTransportProtocolFromString:currentValue]; } - (void)setProto:(OpenVPNTransportProtocol)proto { - NSDictionary *options = @{ - @(OpenVPNTransportProtocolUDP): OpenVPNTransportProtocolUDPValue, - @(OpenVPNTransportProtocolTCP): OpenVPNTransportProtocolTCPValue, - @(OpenVPNTransportProtocolAdaptive): OpenVPNTransportProtocolAdaptiveValue, - @(OpenVPNTransportProtocolDefault): OpenVPNTransportProtocolDefaultValue - }; - - NSString *value = options[@(proto)]; - NSAssert(value != nil, @"Incorrect proto value: %li", (NSInteger)proto); - - _config.protoOverride = [value UTF8String]; + NSString *value = [OpenVPNConfiguration getStringFromTransportProtocol:proto]; + _config.protoOverride = std::string([value UTF8String]); } - (OpenVPNIPv6Preference)ipv6 { - NSDictionary *options = @{ - OpenVPNIPv6PreferenceEnabledValue: @(OpenVPNIPv6PreferenceEnabled), - OpenVPNIPv6PreferenceDisabledValue: @(OpenVPNIPv6PreferenceDisabled), - OpenVPNIPv6PreferenceDefaultValue: @(OpenVPNIPv6PreferenceDefault) - }; - - NSString *currentValue = _config.ipv6.empty() ? OpenVPNIPv6PreferenceDefaultValue : - [NSString stringWithUTF8String:_config.ipv6.c_str()]; - - NSNumber *ipv6 = options[currentValue]; - NSAssert(ipv6 != nil, @"Incorrect ipv6 value: %@", currentValue); - - return (OpenVPNIPv6Preference)[ipv6 integerValue]; + NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()]; + return [OpenVPNConfiguration getIPv6PreferenceFromString:currentValue]; } - (void)setIpv6:(OpenVPNIPv6Preference)ipv6 { - NSDictionary *options = @{ - @(OpenVPNIPv6PreferenceEnabled): OpenVPNIPv6PreferenceEnabledValue, - @(OpenVPNIPv6PreferenceDisabled): OpenVPNIPv6PreferenceDisabledValue, - @(OpenVPNIPv6PreferenceDefault): OpenVPNIPv6PreferenceDefaultValue - }; - - NSString *value = options[@(ipv6)]; - NSAssert(value != nil, @"Incorrect ipv6 value: %li", (NSInteger)ipv6); - - _config.ipv6 = [value UTF8String]; + NSString *value = [OpenVPNConfiguration getStringFromIPv6Preference:ipv6]; + _config.ipv6 = std::string([value UTF8String]); } - (NSInteger)connectionTimeout { @@ -191,34 +264,13 @@ using namespace openvpn; } - (OpenVPNCompressionMode)compressionMode { - NSDictionary *options = @{ - OpenVPNCompressionModeEnabledValue: @(OpenVPNCompressionModeEnabled), - OpenVPNCompressionModeDisabledValue: @(OpenVPNCompressionModeDisabled), - OpenVPNCompressionModeAsymValue: @(OpenVPNCompressionModeAsym), - OpenVPNCompressionModeDefaultValue: @(OpenVPNCompressionModeDefault) - }; - - NSString *currentValue = _config.compressionMode.empty() ? OpenVPNCompressionModeDefaultValue : - [NSString stringWithUTF8String:_config.compressionMode.c_str()]; - - NSNumber *compressionMode = options[currentValue]; - NSAssert(compressionMode != nil, @"Incorrect compressionMode value: %@", currentValue); - - return (OpenVPNCompressionMode)[compressionMode integerValue]; + NSString *currentValue = [NSString stringWithUTF8String:_config.compressionMode.c_str()]; + return [OpenVPNConfiguration getCompressionModeFromString:currentValue]; } - (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode { - NSDictionary *options = @{ - @(OpenVPNCompressionModeEnabled): OpenVPNCompressionModeEnabledValue, - @(OpenVPNCompressionModeDisabled): OpenVPNCompressionModeDisabledValue, - @(OpenVPNCompressionModeAsym): OpenVPNCompressionModeAsymValue, - @(OpenVPNCompressionModeDefault): OpenVPNCompressionModeDefaultValue - }; - - NSString *value = options[@(compressionMode)]; - NSAssert(value != nil, @"Incorrect compressionMode value: %li", (NSInteger)compressionMode); - - _config.compressionMode = [value UTF8String]; + NSString *value = [OpenVPNConfiguration getStringFromCompressionMode:compressionMode]; + _config.compressionMode = std::string([value UTF8String]); } - (NSString *)privateKeyPassword { diff --git a/OpenVPN Adapter/OpenVPNValues.h b/OpenVPN Adapter/OpenVPNValues.h deleted file mode 100644 index 2203c3f..0000000 --- a/OpenVPN Adapter/OpenVPNValues.h +++ /dev/null @@ -1,36 +0,0 @@ -// -// OpenVPNConfigurationValues.h -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 24.04.17. -// -// - -#import - -extern NSString * __nonnull const OpenVPNTransportProtocolUDPValue; -extern NSString * __nonnull const OpenVPNTransportProtocolTCPValue; -extern NSString * __nonnull const OpenVPNTransportProtocolAdaptiveValue; -extern NSString * __nonnull const OpenVPNTransportProtocolDefaultValue; - -extern NSString * __nonnull const OpenVPNIPv6PreferenceEnabledValue; -extern NSString * __nonnull const OpenVPNIPv6PreferenceDisabledValue; -extern NSString * __nonnull const OpenVPNIPv6PreferenceDefaultValue; - -extern NSString * __nonnull const OpenVPNCompressionModeEnabledValue; -extern NSString * __nonnull const OpenVPNCompressionModeDisabledValue; -extern NSString * __nonnull const OpenVPNCompressionModeAsymValue; -extern NSString * __nonnull const OpenVPNCompressionModeDefaultValue; - -extern NSString * __nonnull const OpenVPNMinTLSVersionDisabledValue; -extern NSString * __nonnull const OpenVPNMinTLSVersion10Value; -extern NSString * __nonnull const OpenVPNMinTLSVersion11Value; -extern NSString * __nonnull const OpenVPNMinTLSVersion12Value; -extern NSString * __nonnull const OpenVPNMinTLSVersionDefaultValue; - -extern NSString * __nonnull const OpenVPNTLSCertProfileLegacyValue; -extern NSString * __nonnull const OpenVPNTLSCertProfilePreferredValue; -extern NSString * __nonnull const OpenVPNTLSCertProfileSuiteBValue; -extern NSString * __nonnull const OpenVPNTLSCertProfileLegacyDefaultValue; -extern NSString * __nonnull const OpenVPNTLSCertProfilePreferredDefaultValue; -extern NSString * __nonnull const OpenVPNTLSCertProfileDefaultValue; diff --git a/OpenVPN Adapter/OpenVPNValues.mm b/OpenVPN Adapter/OpenVPNValues.mm deleted file mode 100644 index 53737cd..0000000 --- a/OpenVPN Adapter/OpenVPNValues.mm +++ /dev/null @@ -1,36 +0,0 @@ -// -// OpenVPNConfigurationValues.m -// OpenVPN Adapter -// -// Created by Sergey Abramchuk on 24.04.17. -// -// - -#import "OpenVPNValues.h" - -NSString * const OpenVPNTransportProtocolUDPValue = @"udp"; -NSString * const OpenVPNTransportProtocolTCPValue = @"tcp"; -NSString * const OpenVPNTransportProtocolAdaptiveValue = @"adaptive"; -NSString * const OpenVPNTransportProtocolDefaultValue = @""; - -NSString * const OpenVPNIPv6PreferenceEnabledValue = @"yes"; -NSString * const OpenVPNIPv6PreferenceDisabledValue = @"no"; -NSString * const OpenVPNIPv6PreferenceDefaultValue = @"default"; - -NSString * const OpenVPNCompressionModeEnabledValue = @"yes"; -NSString * const OpenVPNCompressionModeDisabledValue = @"no"; -NSString * const OpenVPNCompressionModeAsymValue = @"asym"; -NSString * const OpenVPNCompressionModeDefaultValue = @""; - -NSString * const OpenVPNMinTLSVersionDisabledValue = @"disabled"; -NSString * const OpenVPNMinTLSVersion10Value = @"tls_1_0"; -NSString * const OpenVPNMinTLSVersion11Value = @"tls_1_1"; -NSString * const OpenVPNMinTLSVersion12Value = @"tls_1_2"; -NSString * const OpenVPNMinTLSVersionDefaultValue = @"default"; - -NSString * const OpenVPNTLSCertProfileLegacyValue = @"legacy"; -NSString * const OpenVPNTLSCertProfilePreferredValue = @"preferred"; -NSString * const OpenVPNTLSCertProfileSuiteBValue = @"suiteb"; -NSString * const OpenVPNTLSCertProfileLegacyDefaultValue = @"legacy-default"; -NSString * const OpenVPNTLSCertProfilePreferredDefaultValue = @"preferred-default"; -NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index 70961a4..502099a 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -18,9 +18,15 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import +#import +#import +#import +#import +#import #import #import #import +#import #import #import #import From 05cbfa5dad36cfa8c6a23a20b1ea27580932498f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Thu, 27 Apr 2017 19:44:52 +0300 Subject: [PATCH 53/76] Refactor getters/setters for min TLS version andTLS cert profile and rename class methods --- .../OpenVPNConfiguration+Internal.h | 18 +- OpenVPN Adapter/OpenVPNConfiguration.mm | 198 ++++++++++-------- OpenVPN Adapter/OpenVPNProperties.mm | 4 +- 3 files changed, 122 insertions(+), 98 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConfiguration+Internal.h b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h index 5219545..62d01cf 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration+Internal.h +++ b/OpenVPN Adapter/OpenVPNConfiguration+Internal.h @@ -16,13 +16,19 @@ using namespace openvpn; @property (readonly) ClientAPI::Config config; -+ (OpenVPNTransportProtocol)getTransportProtocolFromString:(nullable NSString *)value; -+ (nonnull NSString *)getStringFromTransportProtocol:(OpenVPNTransportProtocol)protocol; ++ (OpenVPNTransportProtocol)getTransportProtocolFromValue:(nullable NSString *)value; ++ (nonnull NSString *)getValueFromTransportProtocol:(OpenVPNTransportProtocol)protocol; -+ (OpenVPNIPv6Preference)getIPv6PreferenceFromString:(nullable NSString *)value; -+ (nonnull NSString *)getStringFromIPv6Preference:(OpenVPNIPv6Preference)preference; ++ (OpenVPNIPv6Preference)getIPv6PreferenceFromValue:(nullable NSString *)value; ++ (nonnull NSString *)getValueFromIPv6Preference:(OpenVPNIPv6Preference)preference; -+ (OpenVPNCompressionMode)getCompressionModeFromString:(nullable NSString *)value; -+ (nonnull NSString *)getStringFromCompressionMode:(OpenVPNCompressionMode)compressionMode; ++ (OpenVPNCompressionMode)getCompressionModeFromValue:(nullable NSString *)value; ++ (nonnull NSString *)getValueFromCompressionMode:(OpenVPNCompressionMode)compressionMode; + ++ (OpenVPNMinTLSVersion)getMinTLSFromValue:(nullable NSString *)value; ++ (nonnull NSString *)getValueFromMinTLS:(OpenVPNMinTLSVersion)minTLS; + ++ (OpenVPNTLSCertProfile)getTLSCertProfileFromValue:(nullable NSString *)value; ++ (nonnull NSString *)getValueFromTLSCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile; @end diff --git a/OpenVPN Adapter/OpenVPNConfiguration.mm b/OpenVPN Adapter/OpenVPNConfiguration.mm index ca06176..5008af8 100644 --- a/OpenVPN Adapter/OpenVPNConfiguration.mm +++ b/OpenVPN Adapter/OpenVPNConfiguration.mm @@ -10,32 +10,32 @@ using namespace openvpn; -NSString * const OpenVPNTransportProtocolUDPValue = @"udp"; -NSString * const OpenVPNTransportProtocolTCPValue = @"tcp"; -NSString * const OpenVPNTransportProtocolAdaptiveValue = @"adaptive"; -NSString * const OpenVPNTransportProtocolDefaultValue = @""; +NSString *const OpenVPNTransportProtocolUDPValue = @"udp"; +NSString *const OpenVPNTransportProtocolTCPValue = @"tcp"; +NSString *const OpenVPNTransportProtocolAdaptiveValue = @"adaptive"; +NSString *const OpenVPNTransportProtocolDefaultValue = @""; -NSString * const OpenVPNIPv6PreferenceEnabledValue = @"yes"; -NSString * const OpenVPNIPv6PreferenceDisabledValue = @"no"; -NSString * const OpenVPNIPv6PreferenceDefaultValue = @"default"; +NSString *const OpenVPNIPv6PreferenceEnabledValue = @"yes"; +NSString *const OpenVPNIPv6PreferenceDisabledValue = @"no"; +NSString *const OpenVPNIPv6PreferenceDefaultValue = @"default"; -NSString * const OpenVPNCompressionModeEnabledValue = @"yes"; -NSString * const OpenVPNCompressionModeDisabledValue = @"no"; -NSString * const OpenVPNCompressionModeAsymValue = @"asym"; -NSString * const OpenVPNCompressionModeDefaultValue = @""; +NSString *const OpenVPNCompressionModeEnabledValue = @"yes"; +NSString *const OpenVPNCompressionModeDisabledValue = @"no"; +NSString *const OpenVPNCompressionModeAsymValue = @"asym"; +NSString *const OpenVPNCompressionModeDefaultValue = @""; -NSString * const OpenVPNMinTLSVersionDisabledValue = @"disabled"; -NSString * const OpenVPNMinTLSVersion10Value = @"tls_1_0"; -NSString * const OpenVPNMinTLSVersion11Value = @"tls_1_1"; -NSString * const OpenVPNMinTLSVersion12Value = @"tls_1_2"; -NSString * const OpenVPNMinTLSVersionDefaultValue = @"default"; +NSString *const OpenVPNMinTLSVersionDisabledValue = @"disabled"; +NSString *const OpenVPNMinTLSVersion10Value = @"tls_1_0"; +NSString *const OpenVPNMinTLSVersion11Value = @"tls_1_1"; +NSString *const OpenVPNMinTLSVersion12Value = @"tls_1_2"; +NSString *const OpenVPNMinTLSVersionDefaultValue = @"default"; -NSString * const OpenVPNTLSCertProfileLegacyValue = @"legacy"; -NSString * const OpenVPNTLSCertProfilePreferredValue = @"preferred"; -NSString * const OpenVPNTLSCertProfileSuiteBValue = @"suiteb"; -NSString * const OpenVPNTLSCertProfileLegacyDefaultValue = @"legacy-default"; -NSString * const OpenVPNTLSCertProfilePreferredDefaultValue = @"preferred-default"; -NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; +NSString *const OpenVPNTLSCertProfileLegacyValue = @"legacy"; +NSString *const OpenVPNTLSCertProfilePreferredValue = @"preferred"; +NSString *const OpenVPNTLSCertProfileSuiteBValue = @"suiteb"; +NSString *const OpenVPNTLSCertProfileLegacyDefaultValue = @"legacy-default"; +NSString *const OpenVPNTLSCertProfilePreferredDefaultValue = @"preferred-default"; +NSString *const OpenVPNTLSCertProfileDefaultValue = @"default"; @interface OpenVPNConfiguration () { ClientAPI::Config _config; @@ -49,7 +49,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return _config; } -+ (OpenVPNTransportProtocol)getTransportProtocolFromString:(NSString *)value { ++ (OpenVPNTransportProtocol)getTransportProtocolFromValue:(NSString *)value { NSDictionary *options = @{ OpenVPNTransportProtocolUDPValue: @(OpenVPNTransportProtocolUDP), OpenVPNTransportProtocolTCPValue: @(OpenVPNTransportProtocolTCP), @@ -65,7 +65,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return (OpenVPNTransportProtocol)[transportProtocol integerValue]; } -+ (nonnull NSString *)getStringFromTransportProtocol:(OpenVPNTransportProtocol)protocol { ++ (nonnull NSString *)getValueFromTransportProtocol:(OpenVPNTransportProtocol)protocol { NSDictionary *options = @{ @(OpenVPNTransportProtocolUDP): OpenVPNTransportProtocolUDPValue, @(OpenVPNTransportProtocolTCP): OpenVPNTransportProtocolTCPValue, @@ -79,7 +79,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return value; } -+ (OpenVPNIPv6Preference)getIPv6PreferenceFromString:(nullable NSString *)value { ++ (OpenVPNIPv6Preference)getIPv6PreferenceFromValue:(nullable NSString *)value { NSDictionary *options = @{ OpenVPNIPv6PreferenceEnabledValue: @(OpenVPNIPv6PreferenceEnabled), OpenVPNIPv6PreferenceDisabledValue: @(OpenVPNIPv6PreferenceDisabled), @@ -94,7 +94,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return (OpenVPNIPv6Preference)[ipv6 integerValue]; } -+ (nonnull NSString *)getStringFromIPv6Preference:(OpenVPNIPv6Preference)preference { ++ (nonnull NSString *)getValueFromIPv6Preference:(OpenVPNIPv6Preference)preference { NSDictionary *options = @{ @(OpenVPNIPv6PreferenceEnabled): OpenVPNIPv6PreferenceEnabledValue, @(OpenVPNIPv6PreferenceDisabled): OpenVPNIPv6PreferenceDisabledValue, @@ -107,7 +107,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return value; } -+ (OpenVPNCompressionMode)getCompressionModeFromString:(nullable NSString *)value { ++ (OpenVPNCompressionMode)getCompressionModeFromValue:(nullable NSString *)value { NSDictionary *options = @{ OpenVPNCompressionModeEnabledValue: @(OpenVPNCompressionModeEnabled), OpenVPNCompressionModeDisabledValue: @(OpenVPNCompressionModeDisabled), @@ -123,7 +123,7 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return (OpenVPNCompressionMode)[compressionMode integerValue]; } -+ (nonnull NSString *)getStringFromCompressionMode:(OpenVPNCompressionMode)compressionMode { ++ (nonnull NSString *)getValueFromCompressionMode:(OpenVPNCompressionMode)compressionMode { NSDictionary *options = @{ @(OpenVPNCompressionModeEnabled): OpenVPNCompressionModeEnabledValue, @(OpenVPNCompressionModeDisabled): OpenVPNCompressionModeDisabledValue, @@ -137,6 +137,72 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; return value; } ++ (OpenVPNMinTLSVersion)getMinTLSFromValue:(nullable NSString *)value { + NSDictionary *options = @{ + OpenVPNMinTLSVersionDisabledValue: @(OpenVPNMinTLSVersionDisabled), + OpenVPNMinTLSVersion10Value: @(OpenVPNMinTLSVersion10), + OpenVPNMinTLSVersion11Value: @(OpenVPNMinTLSVersion11), + OpenVPNMinTLSVersion12Value: @(OpenVPNMinTLSVersion12), + OpenVPNMinTLSVersionDefaultValue: @(OpenVPNMinTLSVersionDefault) + }; + + NSString *currentValue = [value length] == 0 ? OpenVPNMinTLSVersionDefaultValue : value; + + NSNumber *minTLSVersion = options[currentValue]; + NSAssert(minTLSVersion != nil, @"Incorrect minTLS value: %@", currentValue); + + return (OpenVPNMinTLSVersion)[minTLSVersion integerValue]; +} + ++ (nonnull NSString *)getValueFromMinTLS:(OpenVPNMinTLSVersion)minTLS { + NSDictionary *options = @{ + @(OpenVPNMinTLSVersionDisabled): OpenVPNMinTLSVersionDisabledValue, + @(OpenVPNMinTLSVersion10): OpenVPNMinTLSVersion10Value, + @(OpenVPNMinTLSVersion11): OpenVPNMinTLSVersion11Value, + @(OpenVPNMinTLSVersion12): OpenVPNMinTLSVersion12Value, + @(OpenVPNMinTLSVersionDefault): OpenVPNMinTLSVersionDefaultValue + }; + + NSString *value = options[@(minTLS)]; + NSAssert(value != nil, @"Incorrect minTLS value: %li", (NSInteger)minTLS); + + return value; +} + ++ (OpenVPNTLSCertProfile)getTLSCertProfileFromValue:(nullable NSString *)value { + NSDictionary *options = @{ + OpenVPNTLSCertProfileLegacyValue: @(OpenVPNTLSCertProfileLegacy), + OpenVPNTLSCertProfilePreferredValue: @(OpenVPNTLSCertProfilePreferred), + OpenVPNTLSCertProfileSuiteBValue: @(OpenVPNTLSCertProfileSuiteB), + OpenVPNTLSCertProfileLegacyDefaultValue: @(OpenVPNTLSCertProfileLegacyDefault), + OpenVPNTLSCertProfilePreferredDefaultValue: @(OpenVPNTLSCertProfilePreferredDefault), + OpenVPNTLSCertProfileDefaultValue: @(OpenVPNTLSCertProfileDefault), + }; + + NSString *currentValue = [value length] == 0 ? OpenVPNTLSCertProfileDefaultValue : value; + + NSNumber *tlsCertProfile = options[currentValue]; + NSAssert(tlsCertProfile != nil, @"Incorrect tlsCertProfile value: %@", currentValue); + + return (OpenVPNTLSCertProfile)[tlsCertProfile integerValue]; +} + ++ (nonnull NSString *)getValueFromTLSCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile { + NSDictionary *options = @{ + @(OpenVPNTLSCertProfileLegacy): OpenVPNTLSCertProfileLegacyValue, + @(OpenVPNTLSCertProfilePreferred): OpenVPNTLSCertProfilePreferredValue, + @(OpenVPNTLSCertProfileSuiteB): OpenVPNTLSCertProfileSuiteBValue, + @(OpenVPNTLSCertProfileLegacyDefault): OpenVPNTLSCertProfileLegacyDefaultValue, + @(OpenVPNTLSCertProfilePreferredDefault): OpenVPNTLSCertProfilePreferredDefaultValue, + @(OpenVPNTLSCertProfileDefault): OpenVPNTLSCertProfileDefaultValue + }; + + NSString *value = options[@(tlsCertProfile)]; + NSAssert(value != nil, @"Incorrect tlsCertProfile value: %li", (NSInteger)tlsCertProfile); + + return value; +} + @end @implementation OpenVPNConfiguration @@ -197,21 +263,21 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; - (OpenVPNTransportProtocol)proto { NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()]; - return [OpenVPNConfiguration getTransportProtocolFromString:currentValue]; + return [OpenVPNConfiguration getTransportProtocolFromValue:currentValue]; } - (void)setProto:(OpenVPNTransportProtocol)proto { - NSString *value = [OpenVPNConfiguration getStringFromTransportProtocol:proto]; + NSString *value = [OpenVPNConfiguration getValueFromTransportProtocol:proto]; _config.protoOverride = std::string([value UTF8String]); } - (OpenVPNIPv6Preference)ipv6 { NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()]; - return [OpenVPNConfiguration getIPv6PreferenceFromString:currentValue]; + return [OpenVPNConfiguration getIPv6PreferenceFromValue:currentValue]; } - (void)setIpv6:(OpenVPNIPv6Preference)ipv6 { - NSString *value = [OpenVPNConfiguration getStringFromIPv6Preference:ipv6]; + NSString *value = [OpenVPNConfiguration getValueFromIPv6Preference:ipv6]; _config.ipv6 = std::string([value UTF8String]); } @@ -265,11 +331,11 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; - (OpenVPNCompressionMode)compressionMode { NSString *currentValue = [NSString stringWithUTF8String:_config.compressionMode.c_str()]; - return [OpenVPNConfiguration getCompressionModeFromString:currentValue]; + return [OpenVPNConfiguration getCompressionModeFromValue:currentValue]; } - (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode { - NSString *value = [OpenVPNConfiguration getStringFromCompressionMode:compressionMode]; + NSString *value = [OpenVPNConfiguration getValueFromCompressionMode:compressionMode]; _config.compressionMode = std::string([value UTF8String]); } @@ -298,71 +364,23 @@ NSString * const OpenVPNTLSCertProfileDefaultValue = @"default"; } - (OpenVPNMinTLSVersion)minTLSVersion { - NSDictionary *options = @{ - OpenVPNMinTLSVersionDisabledValue: @(OpenVPNMinTLSVersionDisabled), - OpenVPNMinTLSVersion10Value: @(OpenVPNMinTLSVersion10), - OpenVPNMinTLSVersion11Value: @(OpenVPNMinTLSVersion11), - OpenVPNMinTLSVersion12Value: @(OpenVPNMinTLSVersion12), - OpenVPNMinTLSVersionDefaultValue: @(OpenVPNMinTLSVersionDefault) - }; - - NSString *currentValue = _config.tlsVersionMinOverride.empty() ? OpenVPNMinTLSVersionDefaultValue : - [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; - - NSNumber *minTLSVersion = options[currentValue]; - NSAssert(minTLSVersion != nil, @"Incorrect tlsVersionMinOverride value: %@", currentValue); - - return (OpenVPNMinTLSVersion)[minTLSVersion integerValue]; + NSString *currentValue = [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()]; + return [OpenVPNConfiguration getMinTLSFromValue:currentValue]; } - (void)setMinTLSVersion:(OpenVPNMinTLSVersion)minTLSVersion { - NSDictionary *options = @{ - @(OpenVPNMinTLSVersionDisabled): OpenVPNMinTLSVersionDisabledValue, - @(OpenVPNMinTLSVersion10): OpenVPNMinTLSVersion10Value, - @(OpenVPNMinTLSVersion11): OpenVPNMinTLSVersion11Value, - @(OpenVPNMinTLSVersion12): OpenVPNMinTLSVersion12Value, - @(OpenVPNMinTLSVersionDefault): OpenVPNMinTLSVersionDefaultValue - }; - - NSString *value = options[@(minTLSVersion)]; - NSAssert(value != nil, @"Incorrect minTLSVersion value: %li", (NSInteger)minTLSVersion); - - _config.tlsVersionMinOverride = [value UTF8String]; + NSString *value = [OpenVPNConfiguration getValueFromMinTLS:minTLSVersion]; + _config.tlsVersionMinOverride = std::string([value UTF8String]); } - (OpenVPNTLSCertProfile)tlsCertProfile { - NSDictionary *options = @{ - OpenVPNTLSCertProfileLegacyValue: @(OpenVPNTLSCertProfileLegacy), - OpenVPNTLSCertProfilePreferredValue: @(OpenVPNTLSCertProfilePreferred), - OpenVPNTLSCertProfileSuiteBValue: @(OpenVPNTLSCertProfileSuiteB), - OpenVPNTLSCertProfileLegacyDefaultValue: @(OpenVPNTLSCertProfileLegacyDefault), - OpenVPNTLSCertProfilePreferredDefaultValue: @(OpenVPNTLSCertProfilePreferredDefault), - OpenVPNTLSCertProfileDefaultValue: @(OpenVPNTLSCertProfileDefault), - }; - - NSString *currentValue = _config.tlsCertProfileOverride.empty() ? OpenVPNTLSCertProfileDefaultValue : - [NSString stringWithUTF8String:_config.tlsCertProfileOverride.c_str()]; - - NSNumber *tlsCertProfile = options[currentValue]; - NSAssert(tlsCertProfile != nil, @"Incorrect tlsCertProfileOverride value: %@", currentValue); - - return (OpenVPNTLSCertProfile)[tlsCertProfile integerValue]; + NSString *currentValue = [NSString stringWithUTF8String:_config.tlsCertProfileOverride.c_str()]; + return [OpenVPNConfiguration getTLSCertProfileFromValue:currentValue]; } - (void)setTlsCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile { - NSDictionary *options = @{ - @(OpenVPNTLSCertProfileLegacy): OpenVPNTLSCertProfileLegacyValue, - @(OpenVPNTLSCertProfilePreferred): OpenVPNTLSCertProfilePreferredValue, - @(OpenVPNTLSCertProfileSuiteB): OpenVPNTLSCertProfileSuiteBValue, - @(OpenVPNTLSCertProfileLegacyDefault): OpenVPNTLSCertProfileLegacyDefaultValue, - @(OpenVPNTLSCertProfilePreferredDefault): OpenVPNTLSCertProfilePreferredDefaultValue, - @(OpenVPNTLSCertProfileDefault): OpenVPNTLSCertProfileDefaultValue - }; - - NSString *value = options[@(tlsCertProfile)]; - NSAssert(value != nil, @"Incorrect tlsCertProfile value: %li", (NSInteger)tlsCertProfile); - - _config.tlsCertProfileOverride = [value UTF8String]; + NSString *value = [OpenVPNConfiguration getValueFromTLSCertProfile:tlsCertProfile]; + _config.tlsCertProfileOverride = std::string([value UTF8String]); } - (NSDictionary *)peerInfo { diff --git a/OpenVPN Adapter/OpenVPNProperties.mm b/OpenVPN Adapter/OpenVPNProperties.mm index b3ec6f0..edf54a7 100644 --- a/OpenVPN Adapter/OpenVPNProperties.mm +++ b/OpenVPN Adapter/OpenVPNProperties.mm @@ -8,7 +8,7 @@ #import -#import "OpenVPNValuesConverter.h" +#import "OpenVPNConfiguration+Internal.h" #import "OpenVPNServerEntry+Internal.h" #import "OpenVPNProperties.h" #import "OpenVPNProperties+Internal.h" @@ -41,7 +41,7 @@ using namespace openvpn; _remotePort = port; NSString *currentProto = [NSString stringWithUTF8String:eval.remoteProto.c_str()]; - _remoteProto = [OpenVPNPropertyConverter getTransportProtocolFromString:currentProto]; + _remoteProto = [OpenVPNConfiguration getTransportProtocolFromValue:currentProto]; _servers = nil; if (!eval.serverList.empty()) { From 0b1e8117f0af187e0c719d9eb08bcc9b200481fc Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Thu, 27 Apr 2017 23:43:10 +0300 Subject: [PATCH 54/76] Rename category from Client to Internal. Set tick and handleLog methods of adapter delegate as optional. Delete unnecessary properties ad methods. Implement applying configuration and providing credentials. --- OpenVPN Adapter/OpenVPNAdapter+Internal.h | 2 +- OpenVPN Adapter/OpenVPNAdapter+Public.h | 16 ++++-- OpenVPN Adapter/OpenVPNAdapter.h | 2 +- OpenVPN Adapter/OpenVPNAdapter.mm | 60 ++++++----------------- 4 files changed, 28 insertions(+), 52 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Internal.h b/OpenVPN Adapter/OpenVPNAdapter+Internal.h index 80a1033..454906c 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Internal.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Internal.h @@ -12,7 +12,7 @@ using namespace openvpn; -@interface OpenVPNAdapter (Client) +@interface OpenVPNAdapter (Internal) - (void)handleEvent:(const ClientAPI::Event *)event; - (void)handleLog:(const ClientAPI::LogInfo *)log; diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 64b4d9e..e182629 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -1,6 +1,6 @@ // -// OpenVPNAdapter+Provider.h -// OpenVPN iOS Client +// OpenVPNAdapter+Public.h +// OpenVPN Adapter // // Created by Sergey Abramchuk on 11.02.17. // @@ -10,6 +10,7 @@ #import "OpenVPNAdapter.h" @class OpenVPNConfiguration; +@class OpenVPNProperties; @class OpenVPNCredentials; @class NEPacketTunnelNetworkSettings; @@ -71,6 +72,8 @@ NS_SWIFT_NAME(handle(event:message:)); - (void)handleError:(nonnull NSError *)error NS_SWIFT_NAME(handle(error:)); +@optional + /** <#Description#> @@ -79,12 +82,17 @@ NS_SWIFT_NAME(handle(error:)); - (void)handleLog:(nonnull NSString *)logMessage NS_SWIFT_NAME(handle(logMessage:)); +/** + <#Description#> + */ +- (void)tick; + @end /** <#Description#> */ -@interface OpenVPNAdapter (Provider) +@interface OpenVPNAdapter (Public) /** <#Description#> @@ -98,7 +106,7 @@ NS_SWIFT_NAME(handle(logMessage:)); @param error <#error description#> @return <#return value description#> */ -- (BOOL)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration +- (nullable OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error NS_SWIFT_NAME(apply(configuration:)); diff --git a/OpenVPN Adapter/OpenVPNAdapter.h b/OpenVPN Adapter/OpenVPNAdapter.h index dec3bdd..5ee94d7 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.h +++ b/OpenVPN Adapter/OpenVPNAdapter.h @@ -1,6 +1,6 @@ // // OpenVPNAdapter.h -// OpenVPN iOS Client +// OpenVPN Adapter // // Created by Sergey Abramchuk on 11.02.17. // diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index cfb3294..3999502 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -1,6 +1,6 @@ // // OpenVPNAdapter.m -// OpenVPN iOS Client +// OpenVPN Adapter // // Created by Sergey Abramchuk on 11.02.17. // @@ -16,8 +16,11 @@ #import "OpenVPNError.h" #import "OpenVPNEvent.h" +#import "OpenVPNConfiguration+Internal.h" +#import "OpenVPNCredentials+Internal.h" +#import "OpenVPNProperties+Internal.h" +#import "OpenVPNConnectionInfo+Internal.h" #import "OpenVPNClient.h" - #import "OpenVPNAdapter.h" #import "OpenVPNAdapter+Internal.h" #import "OpenVPNAdapter+Public.h" @@ -28,9 +31,6 @@ NSString * const OpenVPNAdapterErrorFatalKey = @"me.ss-abramchuk.openvpn-adapter NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter.error-key.event"; @interface OpenVPNAdapter () { - NSString *_username; - NSString *_password; - __weak id _delegate; } @@ -42,7 +42,7 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter @end -@implementation OpenVPNAdapter (Client) +@implementation OpenVPNAdapter (Internal) #pragma mark Event and Log Handlers @@ -125,22 +125,6 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Properties -- (void)setUsername:(NSString *)username { - _username = username; -} - -- (NSString *)username { - return _username; -} - -- (void)setPassword:(NSString *)password { - _password = password; -} - -- (NSString *)password { - return _password; -} - - (void)setDelegate:(id)delegate { _delegate = delegate; } @@ -151,33 +135,20 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Client Configuration -- (BOOL)configureUsingSettings:(NSData *)settings error:(out NSError * __autoreleasing _Nullable *)error { - NSString *vpnConfiguration = [[NSString alloc] initWithData:settings encoding:NSUTF8StringEncoding]; - - if (vpnConfiguration == nil) { - if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{ - NSLocalizedDescriptionKey: @"Failed to read OpenVPN configuration file" - }]; - return NO; - } - - ClientAPI::Config clientConfiguration; - clientConfiguration.content = std::string([vpnConfiguration UTF8String]); - clientConfiguration.connTimeout = 30; - - ClientAPI::EvalConfig eval = self.vpnClient->eval_config(clientConfiguration); +- (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error { + ClientAPI::EvalConfig eval = self.vpnClient->eval_config(configuration.config); if (eval.error) { if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithUTF8String:eval.message.c_str()] }]; - return NO; + return nil; } - - ClientAPI::ProvideCreds creds; - creds.username = self.username == nil ? "" : [self.username UTF8String]; - creds.password = self.password == nil ? "" : [self.password UTF8String]; - ClientAPI::Status creds_status = self.vpnClient->provide_creds(creds); + return [[OpenVPNProperties alloc] initWithEvalConfig:eval]; +} + +- (BOOL)provideCredentials:(nonnull OpenVPNCredentials *)credentials error:(out NSError * __nullable * __nullable)error { + ClientAPI::Status creds_status = self.vpnClient->provide_creds(credentials.credentials); if (creds_status.error) { if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{ NSLocalizedDescriptionKey: [NSString stringWithUTF8String:creds_status.message.c_str()] @@ -233,10 +204,7 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter { self = [super init]; if (self) { - _username = nil; - _password = nil; _delegate = nil; - self.vpnClient = new OpenVPNClient((__bridge void *)self); } return self; From 3ef90dcabdd1f52301beea7fecd7a207c02db7de Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 28 Apr 2017 21:47:48 +0300 Subject: [PATCH 55/76] Wrap session token --- OpenVPN Adapter.xcodeproj/project.pbxproj | 24 +++++++++++++++--- .../OpenVPNSessionToken+Internal.h | 19 ++++++++++++++ OpenVPN Adapter/OpenVPNSessionToken.h | 25 +++++++++++++++++++ OpenVPN Adapter/OpenVPNSessionToken.mm | 24 ++++++++++++++++++ OpenVPN Adapter/Umbrella-Header.h | 1 + 5 files changed, 90 insertions(+), 3 deletions(-) create mode 100644 OpenVPN Adapter/OpenVPNSessionToken+Internal.h create mode 100644 OpenVPN Adapter/OpenVPNSessionToken.h create mode 100644 OpenVPN Adapter/OpenVPNSessionToken.mm diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 86b0f5e..c119a7b 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -79,6 +79,12 @@ C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; }; C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; }; C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; }; + C9BCE2581EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BCE2561EB3C0D9009D6AC1 /* OpenVPNSessionToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9BCE2591EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BCE2561EB3C0D9009D6AC1 /* OpenVPNSessionToken.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C9BCE25A1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BCE2571EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm */; }; + 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 */; }; 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 */; }; @@ -168,6 +174,9 @@ C9BB478E1E71821A00F3F98C /* OpenVPN Adapter iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenVPN Adapter iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; }; C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = ""; }; C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = ""; }; + 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 = ""; }; 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 = ""; }; @@ -276,12 +285,15 @@ name = Configuration; sourceTree = ""; }; - C9235AC51EB24F1100C7D303 /* Stats */ = { + C9235AC51EB24F1100C7D303 /* Info */ = { isa = PBXGroup; children = ( C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */, C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */, + C9BCE2561EB3C0D9009D6AC1 /* OpenVPNSessionToken.h */, + C9BCE25C1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h */, + C9BCE2571EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm */, C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */, C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */, C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */, @@ -289,7 +301,7 @@ C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */, C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */, ); - name = Stats; + name = Info; sourceTree = ""; }; C9235AC61EB24F2A00C7D303 /* Types */ = { @@ -347,7 +359,7 @@ children = ( C9235AC61EB24F2A00C7D303 /* Types */, C9235AC41EB24F0100C7D303 /* Configuration */, - C9235AC51EB24F1100C7D303 /* Stats */, + C9235AC51EB24F1100C7D303 /* Info */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -434,10 +446,12 @@ files = ( C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */, C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, + C9BCE25E1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */, C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */, C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */, C9657A4C1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */, C9657A571EB0CDFB00EFF210 /* OpenVPNProperties+Internal.h in Headers */, + C9BCE2581EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */, C9657A341EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */, @@ -468,10 +482,12 @@ files = ( C9D2ABE31EA20F99007EDF9D /* OpenVPNClient.h in Headers */, C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */, + C9BCE25F1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */, C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */, C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.h in Headers */, C9657A4D1EB0CD6C00EFF210 /* OpenVPNProperties.h in Headers */, C9657A561EB0CDFA00EFF210 /* OpenVPNProperties+Internal.h in Headers */, + C9BCE2591EB3C0D9009D6AC1 /* OpenVPNSessionToken.h in Headers */, C9657A351EB0BA3900EFF210 /* OpenVPNInterfaceStats.h in Headers */, C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */, C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */, @@ -691,6 +707,7 @@ buildActionMask = 2147483647; files = ( C9657A421EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */, + C9BCE25A1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */, C9BB47821E7173C700F3F98C /* OpenVPNAdapter.mm in Sources */, C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A311EB0B7A900EFF210 /* OpenVPNTransportStats.mm in Sources */, @@ -719,6 +736,7 @@ buildActionMask = 2147483647; files = ( C9657A431EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */, + C9BCE25B1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */, C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */, C98467A91EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */, C9657A301EB0B7A600EFF210 /* OpenVPNTransportStats.mm in Sources */, diff --git a/OpenVPN Adapter/OpenVPNSessionToken+Internal.h b/OpenVPN Adapter/OpenVPNSessionToken+Internal.h new file mode 100644 index 0000000..667bf3b --- /dev/null +++ b/OpenVPN Adapter/OpenVPNSessionToken+Internal.h @@ -0,0 +1,19 @@ +// +// OpenVPNSessionToken+Internal.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 28.04.17. +// +// + +#import + +#import "OpenVPNSessionToken.h" + +using namespace openvpn; + +@interface OpenVPNSessionToken (Internal) + +- (instancetype)initWithSessionToken:(ClientAPI::SessionToken)token; + +@end diff --git a/OpenVPN Adapter/OpenVPNSessionToken.h b/OpenVPN Adapter/OpenVPNSessionToken.h new file mode 100644 index 0000000..c7bbb42 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNSessionToken.h @@ -0,0 +1,25 @@ +// +// OpenVPNSessionToken.h +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 28.04.17. +// +// + +#import + +/** + Class used to get session token from VPN core + */ +@interface OpenVPNSessionToken : NSObject + +@property (nullable, readonly, nonatomic) NSString *username; + +/** + An OpenVPN Session ID, used as a proxy for password + */ +@property (nullable, readonly, nonatomic) NSString *session; + +- (nonnull instancetype) __unavailable init; + +@end diff --git a/OpenVPN Adapter/OpenVPNSessionToken.mm b/OpenVPN Adapter/OpenVPNSessionToken.mm new file mode 100644 index 0000000..027e0f9 --- /dev/null +++ b/OpenVPN Adapter/OpenVPNSessionToken.mm @@ -0,0 +1,24 @@ +// +// OpenVPNSessionToken.m +// OpenVPN Adapter +// +// Created by Sergey Abramchuk on 28.04.17. +// +// + +#import "OpenVPNSessionToken+Internal.h" + +using namespace openvpn; + +@implementation OpenVPNSessionToken + +- (instancetype)initWithSessionToken:(ClientAPI::SessionToken)token { + self = [super init]; + if (self) { + _username = !token.username.empty() ? [NSString stringWithUTF8String:token.username.c_str()] : nil; + _session = !token.session_id.empty() ? [NSString stringWithUTF8String:token.session_id.c_str()] : nil; + } + return self; +} + +@end diff --git a/OpenVPN Adapter/Umbrella-Header.h b/OpenVPN Adapter/Umbrella-Header.h index 502099a..96c85a6 100644 --- a/OpenVPN Adapter/Umbrella-Header.h +++ b/OpenVPN Adapter/Umbrella-Header.h @@ -28,6 +28,7 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[]; #import #import #import +#import #import #import #import From 0c1ce5037f7e1bb6da194eee2cb542189ffb2542 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 28 Apr 2017 22:33:53 +0300 Subject: [PATCH 56/76] Change queue name --- OpenVPN Adapter/OpenVPNAdapter.mm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 3999502..70bfdfa 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -163,7 +163,7 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter - (void)connect { // TODO: Describe why we use async invocation here - dispatch_queue_t connectQueue = dispatch_queue_create("me.ss-abramchuk.openvpn-ios-client.connection", NULL); + dispatch_queue_t connectQueue = dispatch_queue_create("me.ss-abramchuk.openvpn-adapter.connection", NULL); dispatch_async(connectQueue, ^{ OpenVPNClient::init_process(); From c3be4189365ced2368736f71fc9450804063eba3 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 17:28:01 +0300 Subject: [PATCH 57/76] Return connection info --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 7 +++++++ OpenVPN Adapter/OpenVPNAdapter.mm | 8 +++++++- 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index e182629..60d0b30 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -12,6 +12,7 @@ @class OpenVPNConfiguration; @class OpenVPNProperties; @class OpenVPNCredentials; +@class OpenVPNConnectionInfo; @class NEPacketTunnelNetworkSettings; // TODO: Add documentation to properties and methods @@ -99,6 +100,12 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @property (weak, nonatomic, null_unspecified) id delegate; +/** + Return information about the most recent connection. Will be available + after an event of type "CONNECTED, otherwise return nil + */ +@property (nullable, readonly, nonatomic) OpenVPNConnectionInfo *connectionInfo; + /** <#Description#> diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 70bfdfa..b600786 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -121,7 +121,7 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter @end -@implementation OpenVPNAdapter (Provider) +@implementation OpenVPNAdapter (Public) #pragma mark Properties @@ -133,6 +133,12 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter return _delegate; } +- (OpenVPNConnectionInfo *)connectionInfo { + // TODO: Check correctness of using "defined" property + ClientAPI::ConnectionInfo info = self.vpnClient->connection_info(); + return info.defined ? [[OpenVPNConnectionInfo alloc] initWithConnectionInfo:info] : nil; +} + #pragma mark Client Configuration - (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error { From f73c83f3724733d876a5abfe6ab60ccf86f15d3b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 17:59:58 +0300 Subject: [PATCH 58/76] Fix incorrect header --- OpenVPN Adapter/OpenVPNTransportStats+Internal.h | 2 +- OpenVPN Adapter/OpenVPNTransportStats.mm | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNTransportStats+Internal.h b/OpenVPN Adapter/OpenVPNTransportStats+Internal.h index 1053fe4..974d694 100644 --- a/OpenVPN Adapter/OpenVPNTransportStats+Internal.h +++ b/OpenVPN Adapter/OpenVPNTransportStats+Internal.h @@ -8,7 +8,7 @@ #import -#import +#import "OpenVPNTransportStats.h" using namespace openvpn; diff --git a/OpenVPN Adapter/OpenVPNTransportStats.mm b/OpenVPN Adapter/OpenVPNTransportStats.mm index 0ef65d0..bb7cb83 100644 --- a/OpenVPN Adapter/OpenVPNTransportStats.mm +++ b/OpenVPN Adapter/OpenVPNTransportStats.mm @@ -6,7 +6,6 @@ // // -#import "OpenVPNTransportStats.h" #import "OpenVPNTransportStats+Internal.h" using namespace openvpn; From b32f7e2496013ee418dc60cb2c5a1b82d3d7bd5d Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 18:00:58 +0300 Subject: [PATCH 59/76] Return transport stats and interface stats --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 14 +++++++++++++- OpenVPN Adapter/OpenVPNAdapter.mm | 14 +++++++++++++- 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 60d0b30..d86baef 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -13,6 +13,8 @@ @class OpenVPNProperties; @class OpenVPNCredentials; @class OpenVPNConnectionInfo; +@class OpenVPNTransportStats; +@class OpenVPNInterfaceStats; @class NEPacketTunnelNetworkSettings; // TODO: Add documentation to properties and methods @@ -102,10 +104,20 @@ NS_SWIFT_NAME(handle(logMessage:)); /** Return information about the most recent connection. Will be available - after an event of type "CONNECTED, otherwise return nil + after an event of type "CONNECTED, otherwise return nil. */ @property (nullable, readonly, nonatomic) OpenVPNConnectionInfo *connectionInfo; +/** + Return transport stats + */ +@property (nonnull, readonly, nonatomic) OpenVPNTransportStats *transportStats; + +/** + Return tun stats + */ +@property (nonnull, readonly, nonatomic) OpenVPNInterfaceStats *interfaceStats; + /** <#Description#> diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index b600786..9f08cef 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -14,13 +14,15 @@ #import +#import "OpenVPNClient.h" #import "OpenVPNError.h" #import "OpenVPNEvent.h" #import "OpenVPNConfiguration+Internal.h" #import "OpenVPNCredentials+Internal.h" #import "OpenVPNProperties+Internal.h" #import "OpenVPNConnectionInfo+Internal.h" -#import "OpenVPNClient.h" +#import "OpenVPNTransportStats+Internal.h" +#import "OpenVPNInterfaceStats+Internal.h" #import "OpenVPNAdapter.h" #import "OpenVPNAdapter+Internal.h" #import "OpenVPNAdapter+Public.h" @@ -139,6 +141,16 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter return info.defined ? [[OpenVPNConnectionInfo alloc] initWithConnectionInfo:info] : nil; } +- (OpenVPNTransportStats *)transportStats { + ClientAPI::TransportStats stats = self.vpnClient->transport_stats(); + return [[OpenVPNTransportStats alloc] initWithTransportStats:stats]; +} + +- (OpenVPNInterfaceStats *)interfaceStats { + ClientAPI::InterfaceStats stats = self.vpnClient->tun_stats(); + return [[OpenVPNInterfaceStats alloc] initWithInterfaceStats:stats]; +} + #pragma mark Client Configuration - (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error { From 25e85136e840385cf38128869a9e3ad3141f122f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 18:10:42 +0300 Subject: [PATCH 60/76] Remove "defined" property --- OpenVPN Adapter/OpenVPNConnectionInfo.h | 1 - OpenVPN Adapter/OpenVPNConnectionInfo.mm | 1 - 2 files changed, 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo.h b/OpenVPN Adapter/OpenVPNConnectionInfo.h index 369b6fd..895b87a 100644 --- a/OpenVPN Adapter/OpenVPNConnectionInfo.h +++ b/OpenVPN Adapter/OpenVPNConnectionInfo.h @@ -13,7 +13,6 @@ */ @interface OpenVPNConnectionInfo : NSObject -@property (readonly, nonatomic) BOOL defined; @property (nullable, readonly, nonatomic) NSString *user; @property (nullable, readonly, nonatomic) NSString *serverHost; @property (nullable, readonly, nonatomic) NSString *serverPort; diff --git a/OpenVPN Adapter/OpenVPNConnectionInfo.mm b/OpenVPN Adapter/OpenVPNConnectionInfo.mm index 3343a6e..9854fa0 100644 --- a/OpenVPN Adapter/OpenVPNConnectionInfo.mm +++ b/OpenVPN Adapter/OpenVPNConnectionInfo.mm @@ -17,7 +17,6 @@ using namespace openvpn; { self = [super init]; if (self) { - _defined = info.defined; _user = !info.user.empty() ? [NSString stringWithUTF8String:info.user.c_str()] : nil; _serverHost = !info.serverHost.empty() ? [NSString stringWithUTF8String:info.serverHost.c_str()] : nil; _serverPort = !info.serverPort.empty() ? [NSString stringWithUTF8String:info.serverPort.c_str()] : nil; From a195d65e965817ac31fea6823bb44cb930805a08 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 18:25:48 +0300 Subject: [PATCH 61/76] Return session token --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 8 +++++++- OpenVPN Adapter/OpenVPNAdapter.mm | 9 ++++++++- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index d86baef..7adb60d 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -13,6 +13,7 @@ @class OpenVPNProperties; @class OpenVPNCredentials; @class OpenVPNConnectionInfo; +@class OpenVPNSessionToken; @class OpenVPNTransportStats; @class OpenVPNInterfaceStats; @class NEPacketTunnelNetworkSettings; @@ -104,10 +105,15 @@ NS_SWIFT_NAME(handle(logMessage:)); /** Return information about the most recent connection. Will be available - after an event of type "CONNECTED, otherwise return nil. + after an event of type "OpenVPNEventConnected, otherwise return nil. */ @property (nullable, readonly, nonatomic) OpenVPNConnectionInfo *connectionInfo; +/** + Return current session token or nil if session token is unavailable + */ +@property (nullable, readonly, nonatomic) OpenVPNSessionToken *sessionToken; + /** Return transport stats */ diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 9f08cef..526fd44 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -21,6 +21,7 @@ #import "OpenVPNCredentials+Internal.h" #import "OpenVPNProperties+Internal.h" #import "OpenVPNConnectionInfo+Internal.h" +#import "OpenVPNSessionToken+Internal.h" #import "OpenVPNTransportStats+Internal.h" #import "OpenVPNInterfaceStats+Internal.h" #import "OpenVPNAdapter.h" @@ -136,11 +137,17 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter } - (OpenVPNConnectionInfo *)connectionInfo { - // TODO: Check correctness of using "defined" property ClientAPI::ConnectionInfo info = self.vpnClient->connection_info(); return info.defined ? [[OpenVPNConnectionInfo alloc] initWithConnectionInfo:info] : nil; } +- (OpenVPNSessionToken *)sessionToken { + ClientAPI::SessionToken token; + bool gotToken = self.vpnClient->session_token(token); + + return gotToken ? [[OpenVPNSessionToken alloc] initWithSessionToken:token] : nil; +} + - (OpenVPNTransportStats *)transportStats { ClientAPI::TransportStats stats = self.vpnClient->transport_stats(); return [[OpenVPNTransportStats alloc] initWithTransportStats:stats]; From 0ca03b10c948a5a1e1ec896ff4bbe7eee5428ce2 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 18:30:12 +0300 Subject: [PATCH 62/76] Rename openvpn configuration file --- OpenVPN Adapter Tests/ProfileLoader.swift | 2 +- .../Resources/local_key_auth.ovpn | 108 ------------------ .../Resources/local_vpn_server.ovpn | 89 +++++++++++++++ OpenVPN Adapter.xcodeproj/project.pbxproj | 12 +- 4 files changed, 96 insertions(+), 115 deletions(-) delete mode 100644 OpenVPN Adapter Tests/Resources/local_key_auth.ovpn create mode 100644 OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn diff --git a/OpenVPN Adapter Tests/ProfileLoader.swift b/OpenVPN Adapter Tests/ProfileLoader.swift index 52a989a..89fd8c2 100644 --- a/OpenVPN Adapter Tests/ProfileLoader.swift +++ b/OpenVPN Adapter Tests/ProfileLoader.swift @@ -9,7 +9,7 @@ import Foundation enum ProfileType: String { - case localKeyAuthentication = "local_key_auth" + case localVPNServer = "local_vpn_server" } struct ProfileLoader { diff --git a/OpenVPN Adapter Tests/Resources/local_key_auth.ovpn b/OpenVPN Adapter Tests/Resources/local_key_auth.ovpn deleted file mode 100644 index 37ae92e..0000000 --- a/OpenVPN Adapter Tests/Resources/local_key_auth.ovpn +++ /dev/null @@ -1,108 +0,0 @@ -client -nobind -dev tun -key-direction 1 -remote-cert-tls server - -remote 192.168.1.229 1194 udp - - ------BEGIN PRIVATE KEY----- -MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDGkQ5i2xooZ+tI -BoJAs9+DWYvsMLfffOnveqx7o+Fiu6xDhpiEvFhupm890kr87b0iJMXVS+S/Mr5u -GyAvcxGrFuYFZM9hMF1ZIYESIOjV40hkAcPSFylLMVzexYdDbD2ZKfMVb6KCkjP9 -vXrDwNQIRipvaqOkA1oyrlWyUVVnTfSAcTrJwZUXh01Lw9XyBXDY6wKX5k7Dmc0J -nmZXEKngBKDTkaVu4X4X3rgPZFiZBD5BG3UT1EZUEx6CJjRgJxUNWy8Z1uQy21Gc -4r3TyetoWh7anO6a7aHvx/IU+zb6gM81FmkUEbJeXKQp5Gd7sSVSYxd8SR6h3yn4 -/ExRawDDAgMBAAECggEAZ1Rk4ByUaCJr1XdNoM35qiiXH7nadXpTYkO8LjsBtpdi -9WC9TZWVjz8c9FbSnvw4R+RK7swnpTeK0VFcVlTTBO1NldD3+eNpMFC3Ee/+Og+k -RCaG+HUFEBQH+AVidjuFcobZ8HW/Y6MhWxGXKPbXX9bjjkc4EMmNzoHaJokcoDyM -29bmB3LyXFpScsnt1kOdd4YJH/YCqm4dn/tKlHiP26+C3xOw/e5vbzByNIO2mdVp -4YRlJuX8ELm07CQlWyaHniGTIbrFMWCEPc1caSu3M/LA9sxcBFRjUn/gLPJpTBy9 -xzwpMn0gnbf7jX9d0LKW4SVcfxCpk07Mhqm9Va1TwQKBgQD6xc0Zu3mrIMNcO6fC -/bGlBz0PGUFV/HoxMFZ5LOFmwzHcqtwyzZEL5pGkxkKTeP3YZ9xo7hfdleXDnNzF -OpFc/i3d4qf/GvczZaJODKN50YRmhkLGh+3QVhw9aNIU0PBLeAhnDNDK1DYuATuC -+LDKiCbGCitQOwEwqno3b6LeXQKBgQDKtKr2At0g6pmN4R3PkzaF5TrjLPsQ6k7P -FklZMwx1tEc3lrvuzf83TL7c13hH75fgAGmxr1nIPA/jKz0sIm7YRaKHTBjN0n0W -XJd+rocvHVX0EbcJBbmPnKY4kdayHf1A/caacw8JzsjkQJkxvNP6zKp4cjKjrOJr -Pl4FRd4pnwKBgDmbXM1Petir8xTqA1TQ0JE3g3hHdfHZyPwpvYOiorjnmDm36lOl -U2+nbMesX7je73laCpD0OPlHKPvxuel41dHF9iVlnvAEcssUyt8hGiCu17pxlz9i -FGhqj5wvyyrLAJhln5CEqiYd78BLui8REBPGiRmvVlnc5B4Y23CGraRlAoGAJ4mr -2wZd+WCpCNqDBQzy0pUOsmcApaD+NDhloCdr472BMp+NEpxNjozCobLJfEaIeiG6 -e/T27y5/7tBtQyGIO1kBxaAbKnJHAciXqBcEuTTgohWefP0H37IvXdNcbCubTUTy -qweMRF54IsVS3De3pTCsg4fKxtAe7cohbqfdGIMCgYEArSGbvwFEbpaHJ4OzpqQf -SrBkxzx0IpO+W+lL1dIaO4DZJEfsY2FLXf6mGstYPSKQPf5Vwl5ma0X99uEYJtIP -/DBZwrTC+GRD+kjGqBElTvzmh9MDYfg7CKTfXscDSLAQrIwI4+2jWWfqPjeOVYrZ -3umbJmmNUQnnfqVmsSw7NJg= ------END PRIVATE KEY----- - - ------BEGIN CERTIFICATE----- -MIIDOzCCAiOgAwIBAgIBAjANBgkqhkiG9w0BAQsFADAWMRQwEgYDVQQDDAtFYXN5 -LVJTQSBDQTAeFw0xNzA0MjExNDQ2NDVaFw0yNzA0MTkxNDQ2NDVaMBIxEDAOBgNV -BAMMB2FkYXB0ZXIwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDGkQ5i -2xooZ+tIBoJAs9+DWYvsMLfffOnveqx7o+Fiu6xDhpiEvFhupm890kr87b0iJMXV -S+S/Mr5uGyAvcxGrFuYFZM9hMF1ZIYESIOjV40hkAcPSFylLMVzexYdDbD2ZKfMV -b6KCkjP9vXrDwNQIRipvaqOkA1oyrlWyUVVnTfSAcTrJwZUXh01Lw9XyBXDY6wKX -5k7Dmc0JnmZXEKngBKDTkaVu4X4X3rgPZFiZBD5BG3UT1EZUEx6CJjRgJxUNWy8Z -1uQy21Gc4r3TyetoWh7anO6a7aHvx/IU+zb6gM81FmkUEbJeXKQp5Gd7sSVSYxd8 -SR6h3yn4/ExRawDDAgMBAAGjgZcwgZQwCQYDVR0TBAIwADAdBgNVHQ4EFgQUbdma -+bsssuJwlnpYuQch1yrh0WMwRgYDVR0jBD8wPYAUvz2Jmzs+por67s7h05MjGPqY -1XKhGqQYMBYxFDASBgNVBAMMC0Vhc3ktUlNBIENBggkAwyITdMKx+GkwEwYDVR0l -BAwwCgYIKwYBBQUHAwIwCwYDVR0PBAQDAgeAMA0GCSqGSIb3DQEBCwUAA4IBAQBJ -Lg+K8JNDKy0JachCQjInt7ASk9mA7TImdVWulzosakdyVb71aYS83VWAd8DXHbfa -oiBcU+NNx+iC3Wvhp9T6kVf8jqaf1/lJZl5bWQj4azlKgoYhuXqVbnCX+nRIICo9 -yoUPwcFZw88HcRTJxDiDNs+qdfMlrIbHeSAj76Ru09kr4cwj4jrUPufxK76HM4RM -dvjTW4Xf4IjVv/QMz7JxncgdxzdueXEmdlT0OeKs18wVbI08z4/tpDMFRJfADmdX -rMqWEfesdSzpb4tcDCGKQKTg/ng3DHcykWVh/I3aADpQvAWtF4Xgt8yJL76GKFXS -Kv1VKp8Hyvm8oELow22C ------END CERTIFICATE----- - - ------BEGIN CERTIFICATE----- -MIIDNTCCAh2gAwIBAgIJAMMiE3TCsfhpMA0GCSqGSIb3DQEBCwUAMBYxFDASBgNV -BAMMC0Vhc3ktUlNBIENBMB4XDTE3MDQyMTE0MjUyNVoXDTI3MDQxOTE0MjUyNVow -FjEUMBIGA1UEAwwLRWFzeS1SU0EgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAw -ggEKAoIBAQDPZmSh3ZHb0SPBl/CUB/2nFTZxt5c4LQuQhsDNHG+xxQhfTIL0fBnw -RjEh46zdOpDB0DSqMlnCTeOGfbZxVz6xxFiBfpgQloxq6W7FDV8YdxD3jWsD5uSM -mxyJzxmjDtNP30dSKX/9LSOTw9t0tFfJ2yp9hMvjMCD2Kv9RM9sLRCFT4CJ7MHlk -TtSyVuiKxEqnmAtnwQEFf+FOn7rp4tAVKajpzfvBSYVB1QHa66iZ8q+ZR9pp7JQu -SiuicY+bv49wL1TwNLLX6JpQaeO1F1Y7YybE1UZAt7QJKf1SWPoBqYX653W6mAWS -1w32LHofbU3YzVP7rn55/ROTwAuUBzqTAgMBAAGjgYUwgYIwHQYDVR0OBBYEFL89 -iZs7PqaK+u7O4dOTIxj6mNVyMEYGA1UdIwQ/MD2AFL89iZs7PqaK+u7O4dOTIxj6 -mNVyoRqkGDAWMRQwEgYDVQQDDAtFYXN5LVJTQSBDQYIJAMMiE3TCsfhpMAwGA1Ud -EwQFMAMBAf8wCwYDVR0PBAQDAgEGMA0GCSqGSIb3DQEBCwUAA4IBAQCHTHJY2JR9 -trqq0ljNh1p/602Of31SDepxqBkq9BPeBTforSqszEQ8ScGjCOYFsH4oojdAMI8Q -RW40V++r6QN7XAMKyyxJmiIykAk5aGf4Mo+OvnkH2dXLEk6Zc7Cdqn/lGMKfx23h -X4dHE0QAHIperAPKnM7xd63wMAp+6N4U4ECFeQDSMDcp2/WSLqaryP6l2OZLFYzf -LMrXSJGEhTGWnsXdhdb/sxwfu25jeTqoxUFZQqy3rNAQsdMirDCeDzNXqitydFJm -/nm5HJ5xU4GXnL+l4OIk7k+3tHTEAbMJ/WsJ5njzn2x/FKkUlSXTsGFcQKTY7+9n -6+HT4SdJI6bQ ------END CERTIFICATE----- - - -# -# 2048 bit OpenVPN static key -# ------BEGIN OpenVPN Static key V1----- -f21fa849ff3179ee8123fac3e2502c55 -3f1d7b239ff7a7b00d9dc20a91822776 -8502905e7e3a24ffbc576110914af122 -398f18d29d12f3061895c854e884c158 -1b59706242a5033a42a7134725c3ee72 -abf401b4395734c81a3928b89c6ceb3a -245da404eccc7d54e63d2ef31adcc7e9 -cb172c51f542592a63c3cbe12fa9d3ac -d71fd56bdcdde12c6d0cb3c635d7d17c -1c0da35058cbb68fe8c246c6a36f35e8 -a0d4a7f1c6546df3a65506a053b12310 -0363749d2897c17eae89eb31d5c53a7c -8eee3b3a660b99f901fdfe5b4732e670 -e049987f2975a285f9bc9088aa98e62e -ceacf661b6f7435bc06bccb19d775ec3 -d1fc606aced9f6e52e56c1c4a6608c5f ------END OpenVPN Static key V1----- - -key-direction 1 - -redirect-gateway def1 diff --git a/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn b/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn new file mode 100644 index 0000000..e07238c --- /dev/null +++ b/OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn @@ -0,0 +1,89 @@ +dev tun +proto udp +remote 192.168.1.200 1194 +cipher AES-256-CBC +resolv-retry infinite +nobind +persist-key +persist-tun +client +verb 3 + +-----BEGIN CERTIFICATE----- +MIIDpjCCAo6gAwIBAgIBADANBgkqhkiG9w0BAQsFADBSMRUwEwYDVQQDEww5ZTQ3 +NThlOTVlZTIxFTATBgNVBAoTDDllNDc1OGU5NWVlMjEVMBMGA1UECxMMOWU0NzU4 +ZTk1ZWUyMQswCQYDVQQGEwJVUzAeFw0xNzA0MjgxODU3MjhaFw0zNzEyMzExODU3 +MjhaMFIxFTATBgNVBAMTDDllNDc1OGU5NWVlMjEVMBMGA1UEChMMOWU0NzU4ZTk1 +ZWUyMRUwEwYDVQQLEww5ZTQ3NThlOTVlZTIxCzAJBgNVBAYTAlVTMIIBIjANBgkq +hkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA3ecfScl3JGwRhbmHgIrNx7LItVyTX9V3 +CSZOjBOZymXIKt7/vNt9w6suebtK64/YCRAyPsUbvqUwYqfZhd6jngua/917LrnO +SKHMrGtwDLfnxKY3WTPl1tI5GlrojgF2Z3wCgzRr/+KkFAk8Fq2iffJDRi2Iptqn +5PlOosGfpA1fQKYsedKx7DAXbwTvXPbE/tJ0m8WfdiHIUkWWrNxAFOuctWLk+oBi +vAmlb3/GSctXEIcVPHdF5AKU/GR5AjY1Qqde4LcMS+54YV+g/rpFYNUFsySNSvLQ +Lxg3zZ79HAd9DMwYSt47MP9pih8dT2jdt7df6y+/RXq32B6SoqrYPwIDAQABo4GG +MIGDMA8GA1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgH2MGMGA1UdJQRcMFoGCCsG +AQUFBwMBBggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDBQYI +KwYBBQUHAwYGCCsGAQUFBwMHBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcN +AQELBQADggEBAKnWRxFiKPR7mhbH+JKg8uxu1ONe8TpBygMw6B0XM0WXFY0byTnK +7IX1X1TzIeJNaeDiBKvrm8o4SJGXy8qC1DM+tFAlcRCwwBl5Yi89TcbLup0SSYnw +QEJQ169+u1WNS6H14ED2p0Um8kslRXqSC04yLjImy3Sr4d52h1TQNjkpSGKggBbN +L6YR29j8LX+3ls+Jx5e+allaw6v9Dft+jjsPEZE6KznhtQa6Zyw6Afk44yPLWjne +ShcnY1Au3meaU98Q/S891i7o1tEFUKNBy+n4Qu3J/BnK77NPw1g7FJOcOD0JZIUq +XtjqsiTviTpsUFcwp/Bl3BTXT0b6BwKi978= +-----END CERTIFICATE----- + + +-----BEGIN CERTIFICATE----- +MIID0DCCArigAwIBAgIBADANBgkqhkiG9w0BAQsFADBnMRwwGgYDVQQDExM2OTg1 +MzIwMzIwNzkwNTYyMDkzMRwwGgYDVQQKExM2OTg1MzIwMzIwNzkwNTYyMDkzMRww +GgYDVQQLExM2OTg1MzIwMzIwNzkwNTYyMDkzMQswCQYDVQQGEwJVUzAeFw0xNzA0 +MjgxODU3MzFaFw0zNzEyMzExODU3MzFaMGcxHDAaBgNVBAMTEzY5ODUzMjAzMjA3 +OTA1NjIwOTMxHDAaBgNVBAoTEzY5ODUzMjAzMjA3OTA1NjIwOTMxHDAaBgNVBAsT +EzY5ODUzMjAzMjA3OTA1NjIwOTMxCzAJBgNVBAYTAlVTMIIBIjANBgkqhkiG9w0B +AQEFAAOCAQ8AMIIBCgKCAQEAx9oRmlK91IFxB3WWjrRJkR8l4csle9EmrH+6r6US +Utq/Ik9SctVZz7n8L5IrJc1/hpPvdSyD8uq3lI0U9/h0eDca5pKy0b9Oe4qS75wv +JFkebg/5V2grRL9//125ux/2zytOPG3WIQF0p2NT4Y4OSOPG0RCdQRd2pZBS1sIu +AMO+jRZGlrLxc+QyokR64wlkTHnv3dWJBUm8iuVaQpr5X22a5urCPk3H79zRPJuO +1u74a0AaMRREzAp9F547VghvMWKxd6y38jOVteSQyB6E4c/T7rnO0MWk8GPO3JEj +qNQ/9N0OE9kVWNuKVQf6UHV2cknyfHyg9Va0IgWvRoLt7QIDAQABo4GGMIGDMA8G +A1UdEwEB/wQFMAMBAf8wCwYDVR0PBAQDAgH2MGMGA1UdJQRcMFoGCCsGAQUFBwMB +BggrBgEFBQcDAgYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEFBQcDBQYIKwYBBQUH +AwYGCCsGAQUFBwMHBggrBgEFBQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQELBQAD +ggEBAFZZJLTP84lo46eZkaRfvXiv0qKO2FHHTSJtrHl7C6mR9ffZzp6nTd0EPB6T +AkQZong8LqjcDmTk+3JGTHDSdy+5E6TkDTp1oiOoVApxRd13TIFmxpPslBczyHwt +u5MrWNMMk+urGHK4tm/TBCm13AQAv20CQBsI+s+3pW3blcUpD7HbZvahZgNg978h +g/y5hFtffBJbCEzJpYV9bvh7tyI0ndhyxB6ew93jfaGukDtIbpTjLTD1qvmnaGvW +dEY8VmtmQ7gKuSMvfkW7ClN0XxTfDwkT8jxADF4P9RGHeUW2AUwMKw2dV2LbX933 +BNZuIgS6Lcaxso+R20VwQnefPvM= +-----END CERTIFICATE----- + + +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDH2hGaUr3UgXEH +dZaOtEmRHyXhyyV70Sasf7qvpRJS2r8iT1Jy1VnPufwvkislzX+Gk+91LIPy6reU +jRT3+HR4NxrmkrLRv057ipLvnC8kWR5uD/lXaCtEv3//Xbm7H/bPK048bdYhAXSn +Y1Phjg5I48bREJ1BF3alkFLWwi4Aw76NFkaWsvFz5DKiRHrjCWRMee/d1YkFSbyK +5VpCmvlfbZrm6sI+Tcfv3NE8m47W7vhrQBoxFETMCn0XnjtWCG8xYrF3rLfyM5W1 +5JDIHoThz9Puuc7QxaTwY87ckSOo1D/03Q4T2RVY24pVB/pQdXZySfJ8fKD1VrQi +Ba9Ggu3tAgMBAAECggEAU6V8FKFo/pam3j5jI5tl5y2oR1cleytRCoXzdyyZ/L+9 +m/ijQ5j0nDL10FtXX90g8Qzd/qcBGx0OdUiPbDI7XU2DHtprqcpuaNrZIRy3xnje +eaaJ8AGTipS0WAe8gwuf25n+huBZ7TqUvrKeGxu/8tYTEtHnX6UYbbd4VJa1dm+5 +16LfueOIricLu5JJ7TFLls4kFY6R//cFu6wzmlHwYvU7xsTQg8yWReojCifyvPqW +yvF/MARb+1XWGCWKfT9B/A64uy8a4vqT52JHoG53t35luAjtHni65r+HDdiEf2Ph ++gvpH/g0bOBBDFLQe5j1CdZr1PdzBNv9a1rxVVVgAQKBgQDoyKM9pTbNjmMPSb64 +3SsbBpF8M4JuIVg2qmu+xs25CoRKT+S6sMnnY/2uLzvYeUQWAQRPCqjL6jYWoLyZ +AwDAl3uvAGG6LNuMqscSkDfO5hpr2y+fXRyh1+vTl9Fau3ZCSlCwJy/wBIfKbls9 +4Y0aLBlaS4AivMh9dSJe7e9MAQKBgQDbyJ+wcS8QcyRtOAZ7MQMRqsLjXRk6E2aY +1a/WhLDfcsew56dh6F6VGE75DTvnOVmw19+HHj+bmmqbwU4Ook46E+BIWeonK6yZ +8hBq6VFYutNaiid9MzV+90u1VYPT1C7/H28WkQ5F2obzSEdpQUs+z/Kb2wTRbgEx +ECYTGe2R7QKBgF3Do21LRR3bQq9/xuDzxU8ngCaFIP53U+8BClFYBrmIMO017S39 +0/XuYtpskDCL+A7c7f1gj8lDV/IZYJ5JhV4OJnXBM5woQW8RwwoJKVGfgfj72tzY +RpYyQP2D44ImjGX7RTEPN9H4ITI67Wmplop6ROQIEV7sp91Q9z1BnegBAoGAHMU3 +ej5mvc2E0DNMTeYNk8t5tY+jVMHjZVBbs0YtbSK2V0cL1zo232eONvXviIYuYoLv +xN1F0FW3bOoyEKJYgSvG6VGz4CrMbl6MnaIrPuU985UwNCh28UboBzXJivo0qLrx +rM+SQbyoe8JTbsjYU8Ge7Z4PFGdFCqolgcycF8UCgYBEVR50Ze1j8XK8oyySePqn +YN1/CPQHkMv4Z9J511uDOw+rZpo8BtZX19jj4MWpFtcR7EAj4OyCe8gdn7YRv/n9 +Hw+zm4o54mkL4tgWg0/9jt0eCR3j3Ph03mTlkqwE/PPXaRIb1E8EmEYSwT0hDzjc +Wb3dqIAxzkHucnvInG+TEw== +-----END PRIVATE KEY----- + diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index c119a7b..705dc26 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -57,8 +57,8 @@ C9657A681EB0D73200EFF210 /* OpenVPNMinTLSVersion.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9657A6A1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; C9657A6B1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */ = {isa = PBXBuildFile; fileRef = C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */; settings = {ATTRIBUTES = (Public, ); }; }; - C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; - C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_key_auth.ovpn */; }; + C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; + C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */; }; C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */ = {isa = PBXBuildFile; fileRef = C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */; settings = {ATTRIBUTES = (Public, ); }; }; C98467A81EAA5B7700272A9A /* OpenVPNConfiguration.mm in Sources */ = {isa = PBXBuildFile; fileRef = C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */; }; @@ -156,7 +156,7 @@ C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNCompressionMode.h; sourceTree = ""; }; C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNMinTLSVersion.h; sourceTree = ""; }; C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTLSCertProfile.h; sourceTree = ""; }; - C98467A11EAA559B00272A9A /* local_key_auth.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_key_auth.ovpn; sourceTree = ""; }; + C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_vpn_server.ovpn; sourceTree = ""; }; C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = ""; }; C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = ""; }; C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConfiguration+Internal.h"; sourceTree = ""; }; @@ -398,7 +398,7 @@ C9BB479A1E71836100F3F98C /* Resources */ = { isa = PBXGroup; children = ( - C98467A11EAA559B00272A9A /* local_key_auth.ovpn */, + C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */, ); path = Resources; sourceTree = ""; @@ -649,7 +649,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C98467A21EAA559B00272A9A /* local_key_auth.ovpn in Resources */, + C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -664,7 +664,7 @@ isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - C98467A31EAA559B00272A9A /* local_key_auth.ovpn in Resources */, + C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; From 7d9f0abe76330de57cb268cb7959f57511163ec1 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 19:15:41 +0300 Subject: [PATCH 63/76] Return expiration and platform --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 10 ++++++++++ OpenVPN Adapter/OpenVPNAdapter.mm | 10 ++++++++++ 2 files changed, 20 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 7adb60d..d4a4bd8 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -124,6 +124,16 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @property (nonnull, readonly, nonatomic) OpenVPNInterfaceStats *interfaceStats; +/** + Returns date/time of app expiration + */ ++ (nonnull NSDate *)expiration; + +/** + Returns platform description + */ ++ (nonnull NSString *)platform; + /** <#Description#> diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 526fd44..e342463 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -158,6 +158,16 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter return [[OpenVPNInterfaceStats alloc] initWithInterfaceStats:stats]; } ++ (NSDate *)expiration { + NSNumber *time = [NSNumber numberWithInteger:OpenVPNClient::app_expire()]; + return [NSDate dateWithTimeIntervalSince1970:[time doubleValue]]; +} + ++ (NSString *)platform { + std::string platform = OpenVPNClient::platform(); + return [NSString stringWithUTF8String:platform.c_str()]; +} + #pragma mark Client Configuration - (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error { From c05b7215eb696ce1d40dd392ad17a6f2a1847224 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 23:51:24 +0300 Subject: [PATCH 64/76] Remove expiration class method and convert platform to class property --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 15 +++++---------- OpenVPN Adapter/OpenVPNAdapter.mm | 15 +++++---------- 2 files changed, 10 insertions(+), 20 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index d4a4bd8..8ea7d24 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -98,6 +98,11 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @interface OpenVPNAdapter (Public) +/** + Returns platform description + */ +@property (class, nonnull, readonly, nonatomic) NSString *platform; + /** <#Description#> */ @@ -124,16 +129,6 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @property (nonnull, readonly, nonatomic) OpenVPNInterfaceStats *interfaceStats; -/** - Returns date/time of app expiration - */ -+ (nonnull NSDate *)expiration; - -/** - Returns platform description - */ -+ (nonnull NSString *)platform; - /** <#Description#> diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index e342463..cfbc686 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -128,6 +128,11 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Properties ++ (NSString *)platform { + std::string platform = OpenVPNClient::platform(); + return [NSString stringWithUTF8String:platform.c_str()]; +} + - (void)setDelegate:(id)delegate { _delegate = delegate; } @@ -158,16 +163,6 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter return [[OpenVPNInterfaceStats alloc] initWithInterfaceStats:stats]; } -+ (NSDate *)expiration { - NSNumber *time = [NSNumber numberWithInteger:OpenVPNClient::app_expire()]; - return [NSDate dateWithTimeIntervalSince1970:[time doubleValue]]; -} - -+ (NSString *)platform { - std::string platform = OpenVPNClient::platform(); - return [NSString stringWithUTF8String:platform.c_str()]; -} - #pragma mark Client Configuration - (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error { From 1cf30b1175776deda2a26307d1e2007485681f4b Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sun, 30 Apr 2017 23:56:03 +0300 Subject: [PATCH 65/76] Return core copyright --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 5 +++++ OpenVPN Adapter/OpenVPNAdapter.mm | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 8ea7d24..70f0066 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -98,6 +98,11 @@ NS_SWIFT_NAME(handle(logMessage:)); */ @interface OpenVPNAdapter (Public) +/** + Returns core copyright + */ +@property (class, nonnull, readonly, nonatomic) NSString *copyright; + /** Returns platform description */ diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index cfbc686..7aed431 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -128,6 +128,11 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Properties ++ (NSString *)copyright { + std::string copyright = OpenVPNClient::copyright(); + return [NSString stringWithUTF8String:copyright.c_str()]; +} + + (NSString *)platform { std::string platform = OpenVPNClient::platform(); return [NSString stringWithUTF8String:platform.c_str()]; From 105810082f93bc0445d14bd4688b4592ad5bca2d Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 00:24:27 +0300 Subject: [PATCH 66/76] Call handleLog only if delegate responds to selector --- OpenVPN Adapter/OpenVPNAdapter.mm | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 7aed431..c81d30b 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -79,8 +79,10 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter - (void)handleLog:(const ClientAPI::LogInfo *)log { NSAssert(self.delegate != nil, @"delegate property should not be nil"); - NSString *message = [NSString stringWithCString:log->text.c_str() encoding:NSUTF8StringEncoding]; - [self.delegate handleLog:message]; + if ([self.delegate respondsToSelector:@selector(handleLog:)]) { + NSString *message = [NSString stringWithCString:log->text.c_str() encoding:NSUTF8StringEncoding]; + [self.delegate handleLog:message]; + } } - (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName { From 099309c4983fc75cefb222055989c5753058164f Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 12:26:09 +0300 Subject: [PATCH 67/76] Pause vpn client --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 8 ++++++++ OpenVPN Adapter/OpenVPNAdapter.mm | 5 +++++ 2 files changed, 13 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index 70f0066..e801f34 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -161,6 +161,14 @@ NS_SWIFT_NAME(provide(credentials:)); */ - (void)connect; +/** + Pause the client –- useful to avoid continuous reconnection attempts + when network is down + + @param pauseReason <#reason description#> + */ +- (void)pauseWithReason:(nullable NSString *)pauseReason; + /** Close connection with the VPN server */ diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index c81d30b..acb4fc5 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -227,6 +227,11 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter }); } +- (void)pauseWithReason:(NSString *)pauseReason { + std::string reason = pauseReason ? std::string([pauseReason UTF8String]) : ""; + self.vpnClient->pause(reason); +} + - (void)disconnect { self.vpnClient->stop(); } From a66c3eed27b5579cb6f4e8f17ca8fc76e4ca842d Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 12:29:28 +0300 Subject: [PATCH 68/76] Resume vpn client --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 8 +++++++- OpenVPN Adapter/OpenVPNAdapter.mm | 4 ++++ 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index e801f34..e767f09 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -167,7 +167,13 @@ NS_SWIFT_NAME(provide(credentials:)); @param pauseReason <#reason description#> */ -- (void)pauseWithReason:(nullable NSString *)pauseReason; +- (void)pauseWithReason:(nullable NSString *)pauseReason +NS_SWIFT_NAME(pause(reason:)); + +/** + Resume the client after it has been paused + */ +- (void)resume; /** Close connection with the VPN server diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index acb4fc5..54e95b7 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -232,6 +232,10 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter self.vpnClient->pause(reason); } +- (void)resume { + self.vpnClient->resume(); +} + - (void)disconnect { self.vpnClient->stop(); } From 1464cd1ce97fcf7db34ed182f5876749e5dbfbe3 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 12:48:24 +0300 Subject: [PATCH 69/76] Reconnect vpn client --- OpenVPN Adapter/OpenVPNAdapter+Public.h | 8 ++++++++ OpenVPN Adapter/OpenVPNAdapter.mm | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index e767f09..c023a7c 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -175,6 +175,14 @@ NS_SWIFT_NAME(pause(reason:)); */ - (void)resume; +/** + Do a disconnect/reconnect cycle after given amount of seconds from now + + @param interval <#interval description#> + */ +- (void)reconnectAfterTimeInterval:(NSInteger)interval +NS_SWIFT_NAME(reconnect(interval:)); + /** Close connection with the VPN server */ diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 54e95b7..32809f1 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -236,6 +236,10 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter self.vpnClient->resume(); } +- (void)reconnectAfterTimeInterval:(NSInteger)interval { + self.vpnClient->reconnect(interval); +} + - (void)disconnect { self.vpnClient->stop(); } From 036e9f9ab403ebc29e71e6a86c66b4eed7d75a5d Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 13:07:07 +0300 Subject: [PATCH 70/76] Call clock_tick method --- OpenVPN Adapter/OpenVPNAdapter+Internal.h | 1 + OpenVPN Adapter/OpenVPNAdapter+Public.h | 4 +- OpenVPN Adapter/OpenVPNAdapter.mm | 83 +++++++++++++---------- OpenVPN Adapter/OpenVPNClient.h | 2 + OpenVPN Adapter/OpenVPNClient.mm | 5 +- 5 files changed, 56 insertions(+), 39 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNAdapter+Internal.h b/OpenVPN Adapter/OpenVPNAdapter+Internal.h index 454906c..bbc2593 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Internal.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Internal.h @@ -16,5 +16,6 @@ using namespace openvpn; - (void)handleEvent:(const ClientAPI::Event *)event; - (void)handleLog:(const ClientAPI::LogInfo *)log; +- (void)tick; @end diff --git a/OpenVPN Adapter/OpenVPNAdapter+Public.h b/OpenVPN Adapter/OpenVPNAdapter+Public.h index c023a7c..7eb5831 100644 --- a/OpenVPN Adapter/OpenVPNAdapter+Public.h +++ b/OpenVPN Adapter/OpenVPNAdapter+Public.h @@ -99,12 +99,12 @@ NS_SWIFT_NAME(handle(logMessage:)); @interface OpenVPNAdapter (Public) /** - Returns core copyright + Return core copyright */ @property (class, nonnull, readonly, nonatomic) NSString *copyright; /** - Returns platform description + Return platform description */ @property (class, nonnull, readonly, nonatomic) NSString *platform; diff --git a/OpenVPN Adapter/OpenVPNAdapter.mm b/OpenVPN Adapter/OpenVPNAdapter.mm index 32809f1..50dc92e 100644 --- a/OpenVPN Adapter/OpenVPNAdapter.mm +++ b/OpenVPN Adapter/OpenVPNAdapter.mm @@ -41,6 +41,7 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter @property (weak, nonatomic) id packetFlow; +- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName; - (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength; @end @@ -85,43 +86,14 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter } } -- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName { - NSDictionary *events = @{ - @"DISCONNECTED": @(OpenVPNEventDisconnected), - @"CONNECTED": @(OpenVPNEventConnected), - @"RECONNECTING": @(OpenVPNEventReconnecting), - @"RESOLVE": @(OpenVPNEventResolve), - @"WAIT": @(OpenVPNEventWait), - @"WAIT_PROXY": @(OpenVPNEventWaitProxy), - @"CONNECTING": @(OpenVPNEventConnecting), - @"GET_CONFIG": @(OpenVPNEventGetConfig), - @"ASSIGN_IP": @(OpenVPNEventAssignIP), - @"ADD_ROUTES": @(OpenVPNEventAddRoutes), - @"ECHO": @(OpenVPNEventEcho), - @"INFO": @(OpenVPNEventInfo), - @"PAUSE": @(OpenVPNEventPause), - @"RESUME": @(OpenVPNEventResume), - @"TRANSPORT_ERROR": @(OpenVPNEventTransportError), - @"TUN_ERROR": @(OpenVPNEventTunError), - @"CLIENT_RESTART": @(OpenVPNEventClientRestart), - @"AUTH_FAILED": @(OpenVPNEventAuthFailed), - @"CERT_VERIFY_FAIL": @(OpenVPNEventCertVerifyFail), - @"TLS_VERSION_MIN": @(OpenVPNEventTLSVersionMin), - @"CLIENT_HALT": @(OpenVPNEventClientHalt), - @"CONNECTION_TIMEOUT": @(OpenVPNEventConnectionTimeout), - @"INACTIVE_TIMEOUT": @(OpenVPNEventInactiveTimeout), - @"DYNAMIC_CHALLENGE": @(OpenVPNEventDynamicChallenge), - @"PROXY_NEED_CREDS": @(OpenVPNEventProxyNeedCreds), - @"PROXY_ERROR": @(OpenVPNEventProxyError), - @"TUN_SETUP_FAILED": @(OpenVPNEventTunSetupFailed), - @"TUN_IFACE_CREATE": @(OpenVPNEventTunIfaceCreate), - @"TUN_IFACE_DISABLED": @(OpenVPNEventTunIfaceDisabled), - @"EPKI_ERROR": @(OpenVPNEventEPKIError), - @"EPKI_INVALID_ALIAS": @(OpenVPNEventEPKIInvalidAlias), - }; +#pragma mark Clock Tick + +- (void)tick { + NSAssert(self.delegate != nil, @"delegate property should not be nil"); - OpenVPNEvent event = events[eventName] != nil ? (OpenVPNEvent)[(NSNumber *)events[eventName] unsignedIntegerValue] : OpenVPNEventUnknown; - return event; + if ([self.delegate respondsToSelector:@selector(tick)]) { + [self.delegate tick]; + } } @end @@ -262,6 +234,45 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter #pragma mark Utils +- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName { + NSDictionary *events = @{ + @"DISCONNECTED": @(OpenVPNEventDisconnected), + @"CONNECTED": @(OpenVPNEventConnected), + @"RECONNECTING": @(OpenVPNEventReconnecting), + @"RESOLVE": @(OpenVPNEventResolve), + @"WAIT": @(OpenVPNEventWait), + @"WAIT_PROXY": @(OpenVPNEventWaitProxy), + @"CONNECTING": @(OpenVPNEventConnecting), + @"GET_CONFIG": @(OpenVPNEventGetConfig), + @"ASSIGN_IP": @(OpenVPNEventAssignIP), + @"ADD_ROUTES": @(OpenVPNEventAddRoutes), + @"ECHO": @(OpenVPNEventEcho), + @"INFO": @(OpenVPNEventInfo), + @"PAUSE": @(OpenVPNEventPause), + @"RESUME": @(OpenVPNEventResume), + @"TRANSPORT_ERROR": @(OpenVPNEventTransportError), + @"TUN_ERROR": @(OpenVPNEventTunError), + @"CLIENT_RESTART": @(OpenVPNEventClientRestart), + @"AUTH_FAILED": @(OpenVPNEventAuthFailed), + @"CERT_VERIFY_FAIL": @(OpenVPNEventCertVerifyFail), + @"TLS_VERSION_MIN": @(OpenVPNEventTLSVersionMin), + @"CLIENT_HALT": @(OpenVPNEventClientHalt), + @"CONNECTION_TIMEOUT": @(OpenVPNEventConnectionTimeout), + @"INACTIVE_TIMEOUT": @(OpenVPNEventInactiveTimeout), + @"DYNAMIC_CHALLENGE": @(OpenVPNEventDynamicChallenge), + @"PROXY_NEED_CREDS": @(OpenVPNEventProxyNeedCreds), + @"PROXY_ERROR": @(OpenVPNEventProxyError), + @"TUN_SETUP_FAILED": @(OpenVPNEventTunSetupFailed), + @"TUN_IFACE_CREATE": @(OpenVPNEventTunIfaceCreate), + @"TUN_IFACE_DISABLED": @(OpenVPNEventTunIfaceDisabled), + @"EPKI_ERROR": @(OpenVPNEventEPKIError), + @"EPKI_INVALID_ALIAS": @(OpenVPNEventEPKIInvalidAlias), + }; + + OpenVPNEvent event = events[eventName] != nil ? (OpenVPNEvent)[(NSNumber *)events[eventName] unsignedIntegerValue] : OpenVPNEventUnknown; + return event; +} + - (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength { uint32_t bitmask = UINT_MAX << (sizeof(uint32_t) * 8 - prefixLength.integerValue); diff --git a/OpenVPN Adapter/OpenVPNClient.h b/OpenVPN Adapter/OpenVPNClient.h index 9356baa..dac4247 100644 --- a/OpenVPN Adapter/OpenVPNClient.h +++ b/OpenVPN Adapter/OpenVPNClient.h @@ -28,6 +28,8 @@ public: virtual void event(const ClientAPI::Event& ev) override; virtual void log(const ClientAPI::LogInfo& log) override; + virtual void clock_tick() override; + private: void* adapter; }; diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index b37eb1d..f444e0c 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -33,7 +33,6 @@ bool OpenVPNClient::pause_on_connection_timeout() { return false; } -// TODO: Provide interfacing with an OS-layer Keychain void OpenVPNClient::external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) { } void OpenVPNClient::external_pki_sign_request(ClientAPI::ExternalPKISignRequest& signreq) { } @@ -44,3 +43,7 @@ void OpenVPNClient::event(const ClientAPI::Event& ev) { void OpenVPNClient::log(const ClientAPI::LogInfo& log) { [(__bridge OpenVPNAdapter* )adapter handleLog:&log]; } + +void OpenVPNClient::clock_tick() { + [(__bridge OpenVPNAdapter* )adapter tick]; +} From af5fb0583cd66e0b44e516c8bb9317e0c0f417df Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Mon, 1 May 2017 13:18:20 +0300 Subject: [PATCH 71/76] Update project configuration --- OpenVPN Adapter.xcodeproj/project.pbxproj | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/OpenVPN Adapter.xcodeproj/project.pbxproj b/OpenVPN Adapter.xcodeproj/project.pbxproj index 705dc26..2e8b8d5 100644 --- a/OpenVPN Adapter.xcodeproj/project.pbxproj +++ b/OpenVPN Adapter.xcodeproj/project.pbxproj @@ -285,7 +285,7 @@ name = Configuration; sourceTree = ""; }; - C9235AC51EB24F1100C7D303 /* Info */ = { + C9235AC51EB24F1100C7D303 /* Stats and Info */ = { isa = PBXGroup; children = ( C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */, @@ -301,10 +301,10 @@ C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */, C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */, ); - name = Info; + name = "Stats and Info"; sourceTree = ""; }; - C9235AC61EB24F2A00C7D303 /* Types */ = { + C9235AC61EB24F2A00C7D303 /* Enums and Constants */ = { isa = PBXGroup; children = ( C9BB476F1E7171A100F3F98C /* OpenVPNError.h */, @@ -315,7 +315,7 @@ C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */, C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */, ); - name = Types; + name = "Enums and Constants"; sourceTree = ""; }; C9B376B71EA53CE700B7F423 /* Client */ = { @@ -330,6 +330,8 @@ C9BB475D1E71663A00F3F98C /* OpenVPN Adapter */ = { isa = PBXGroup; children = ( + C9235AC41EB24F0100C7D303 /* Configuration */, + C9235AC51EB24F1100C7D303 /* Stats and Info */, C9B376B71EA53CE700B7F423 /* Client */, C9BB47671E7169F000F3F98C /* Adapter */, C9BB47641E7169AF00F3F98C /* Libraries */, @@ -341,6 +343,7 @@ C9BB47641E7169AF00F3F98C /* Libraries */ = { isa = PBXGroup; children = ( + C9FF73B71EB7421600E995AC /* Helpers */, C9BB47681E716ABF00F3F98C /* Vendors */, ); name = Libraries; @@ -357,9 +360,6 @@ C9BB47671E7169F000F3F98C /* Adapter */ = { isa = PBXGroup; children = ( - C9235AC61EB24F2A00C7D303 /* Types */, - C9235AC41EB24F0100C7D303 /* Configuration */, - C9235AC51EB24F1100C7D303 /* Info */, C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */, C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */, C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */, @@ -437,6 +437,14 @@ name = Utils; sourceTree = ""; }; + C9FF73B71EB7421600E995AC /* Helpers */ = { + isa = PBXGroup; + children = ( + C9235AC61EB24F2A00C7D303 /* Enums and Constants */, + ); + name = Helpers; + sourceTree = ""; + }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ From 2a052ef558738fa0868d5ba0cc015a21a08c3c49 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:00:12 +0300 Subject: [PATCH 72/76] Remove unnecessary link to sstream --- OpenVPN Adapter/OpenVPNClient.mm | 2 -- 1 file changed, 2 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNClient.mm b/OpenVPN Adapter/OpenVPNClient.mm index f444e0c..b7168cb 100644 --- a/OpenVPN Adapter/OpenVPNClient.mm +++ b/OpenVPN Adapter/OpenVPNClient.mm @@ -6,8 +6,6 @@ // // -#import - #import #import "OpenVPNAdapter+Internal.h" From 5488eae00a43fa6886c8b4bc64834b7680037a88 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:00:52 +0300 Subject: [PATCH 73/76] Delete templates for enum elements --- OpenVPN Adapter/OpenVPNError.h | 3 --- OpenVPN Adapter/OpenVPNEvent.h | 35 ---------------------------------- 2 files changed, 38 deletions(-) diff --git a/OpenVPN Adapter/OpenVPNError.h b/OpenVPN Adapter/OpenVPNError.h index 50e8c0c..9911d81 100644 --- a/OpenVPN Adapter/OpenVPNError.h +++ b/OpenVPN Adapter/OpenVPNError.h @@ -15,9 +15,6 @@ extern NSString * __nonnull const OpenVPNAdapterErrorEventKey; /** <#Description#> - - - OpenVPNErrorConfigurationFailure: <#OpenVPNErrorConfigurationFailure description#> - - OpenVPNErrorClientFailure: <#OpenVPNErrorClientFailure description#> */ typedef NS_ENUM(NSUInteger, OpenVPNError) { OpenVPNErrorConfigurationFailure, diff --git a/OpenVPN Adapter/OpenVPNEvent.h b/OpenVPN Adapter/OpenVPNEvent.h index fae7e00..7a531dd 100644 --- a/OpenVPN Adapter/OpenVPNEvent.h +++ b/OpenVPN Adapter/OpenVPNEvent.h @@ -10,41 +10,6 @@ /** <#Description#> - - - OpenVPNEventDisconnected: <#OpenVPNEventDisconnected description#> - - OpenVPNEventConnected: <#OpenVPNEventConnected description#> - - OpenVPNEventReconnecting: <#OpenVPNEventReconnecting description#> - - OpenVPNEventResolve: <#OpenVPNEventResolve description#> - - OpenVPNEventWait: <#OpenVPNEventWait description#> - - OpenVPNEventWaitProxy: <#OpenVPNEventWaitProxy description#> - - OpenVPNEventConnecting: <#OpenVPNEventConnecting description#> - - OpenVPNEventGetConfig: <#OpenVPNEventGetConfig description#> - - OpenVPNEventAssignIP: <#OpenVPNEventAssignIP description#> - - OpenVPNEventAddRoutes: <#OpenVPNEventAddRoutes description#> - - OpenVPNEventEcho: <#OpenVPNEventEcho description#> - - OpenVPNEventInfo: <#OpenVPNEventInfo description#> - - OpenVPNEventPause: <#OpenVPNEventPause description#> - - OpenVPNEventResume: <#OpenVPNEventResume description#> - - OpenVPNEventTransportError: <#OpenVPNEventTransportError description#> - - OpenVPNEventTunError: <#OpenVPNEventTunError description#> - - OpenVPNEventClientRestart: <#OpenVPNEventClientRestart description#> - - OpenVPNEventAuthFailed: <#OpenVPNEventAuthFailed description#> - - OpenVPNEventCertVerifyFail: <#OpenVPNEventCertVerifyFail description#> - - OpenVPNEventTLSVersionMin: <#OpenVPNEventTLSVersionMin description#> - - OpenVPNEventClientHalt: <#OpenVPNEventClientHalt description#> - - OpenVPNEventConnectionTimeout: <#OpenVPNEventConnectionTimeout description#> - - OpenVPNEventInactiveTimeout: <#OpenVPNEventInactiveTimeout description#> - - OpenVPNEventDynamicChallenge: <#OpenVPNEventDynamicChallenge description#> - - OpenVPNEventProxyNeedCreds: <#OpenVPNEventProxyNeedCreds description#> - - OpenVPNEventProxyError: <#OpenVPNEventProxyError description#> - - OpenVPNEventTunSetupFailed: <#OpenVPNEventTunSetupFailed description#> - - OpenVPNEventTunIfaceCreate: <#OpenVPNEventTunIfaceCreate description#> - - OpenVPNEventTunIfaceDisabled: <#OpenVPNEventTunIfaceDisabled description#> - - OpenVPNEventEPKIError: <#OpenVPNEventEPKIError description#> - - OpenVPNEventEPKIInvalidAlias: <#OpenVPNEventEPKIInvalidAlias description#> - - OpenVPNEventInitializationFailed: <#OpenVPNEventInitializationFailed description#> - - OpenVPNEventConnectionFailed: <#OpenVPNEventConnectionFailed description#> - - OpenVPNEventUnknown: <#OpenVPNEventUnknown description#> */ typedef NS_ENUM(NSUInteger, OpenVPNEvent) { OpenVPNEventDisconnected, From e9db078ab0eb0625aaa60cf9e187fa51cfc489ff Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:01:17 +0300 Subject: [PATCH 74/76] Update adapter tests --- .../OpenVPNAdapterTests.swift | 98 +++++++++++++------ 1 file changed, 67 insertions(+), 31 deletions(-) diff --git a/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift index 9ee9533..537c8c3 100644 --- a/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNAdapterTests.swift @@ -12,18 +12,10 @@ import NetworkExtension class OpenVPNAdapterTests: XCTestCase { - enum ConfigurationType { - case withoutCredentials, withCredentials - } - enum ExpectationsType { case connection } - let configurations: [ConfigurationType : String] = [ - .withoutCredentials: "free_openvpn_udp_jp" - ] - var expectations = [ExpectationsType : XCTestExpectation]() override func setUp() { @@ -35,18 +27,75 @@ class OpenVPNAdapterTests: XCTestCase { super.tearDown() } - // Test connection without specifying username and password - func testConectionWithoutCredentials() { - let configuration = getVPNConfiguration(type: .withoutCredentials) - + func testApplyConfiguration() { let adapter = OpenVPNAdapter() + + let configuration = OpenVPNConfiguration() + configuration.fileContent = ProfileLoader.getVPNProfile(type: .localVPNServer) + configuration.settings = ["auth-user-pass": ""] + + let result: OpenVPNProperties do { - try adapter.configure(using: configuration) + result = try adapter.apply(configuration: configuration) } catch { XCTFail("Failed to configure OpenVPN adapted due to error: \(error)") + return } - expectations[.connection] = expectation(description: "me.ss-abramchuk.openvpn-adapter.connection-w/o-credentials") + XCTAssert(result.remoteHost == "192.168.1.200") + XCTAssert(result.remotePort == 1194) + XCTAssert(result.remoteProto == .UDP) + XCTAssert(result.autologin == false) + } + + func testProvideCredentials() { + let adapter = OpenVPNAdapter() + + let credentials = OpenVPNCredentials() + credentials.username = "username" + credentials.password = "password" + + do { + try adapter.provide(credentials: credentials) + } catch { + XCTFail("Failed to provide credentials. \(error)") + return + } + } + + // Test connection without specifying username and password + func testConection() { + let adapter = OpenVPNAdapter() + + let configuration = OpenVPNConfiguration() + configuration.fileContent = ProfileLoader.getVPNProfile(type: .localVPNServer) + configuration.settings = ["auth-user-pass": ""] + + let result: OpenVPNProperties + do { + result = try adapter.apply(configuration: configuration) + } catch { + XCTFail("Failed to configure OpenVPN adapted due to error: \(error)") + return + } + + guard !result.autologin else { + XCTFail() + return + } + + let credentials = OpenVPNCredentials() + credentials.username = "testuser" + credentials.password = "nonsecure" + + do { + try adapter.provide(credentials: credentials) + } catch { + XCTFail("Failed to provide credentials. \(error)") + return + } + + expectations[.connection] = expectation(description: "me.ss-abramchuk.openvpn-adapter.connection") adapter.delegate = self adapter.connect() @@ -58,22 +107,6 @@ class OpenVPNAdapterTests: XCTestCase { } -extension OpenVPNAdapterTests { - - func getVPNConfiguration(type: ConfigurationType) -> Data { - guard - let fileName = configurations[type], - let path = Bundle.current.url(forResource: fileName, withExtension: "ovpn"), - let configuration = try? Data(contentsOf: path) - else { - fatalError("Failed to retrieve OpenVPN configuration") - } - - return configuration - } - -} - extension OpenVPNAdapterTests: OpenVPNAdapterDelegate { func configureTunnel(settings: NEPacketTunnelNetworkSettings, callback: @escaping (OpenVPNAdapterPacketFlow?) -> Void) { @@ -95,7 +128,10 @@ extension OpenVPNAdapterTests: OpenVPNAdapterDelegate { } func handle(error: Error) { - + if let connectionExpectation = expectations[.connection] { + XCTFail("Failed to establish conection. \(error.localizedDescription)") + connectionExpectation.fulfill() + } } func handle(logMessage: String) { From 228df6ede35cf7dad392e9a4cf369ca717c3ea32 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:01:35 +0300 Subject: [PATCH 75/76] Update configuration tests --- .../OpenVPNConfigurationTests.swift | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift index 0e09b5f..dcb2aef 100644 --- a/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift +++ b/OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift @@ -9,6 +9,8 @@ import XCTest @testable import OpenVPNAdapter +// TODO: Test getting/setting of all properties of OpenVPNConfiguration + class OpenVPNConfigurationTests: XCTestCase { override func setUp() { @@ -22,7 +24,7 @@ class OpenVPNConfigurationTests: XCTestCase { } func testGetSetProfile() { - let originalProfile = ProfileLoader.getVPNProfile(type: .localKeyAuthentication) + let originalProfile = ProfileLoader.getVPNProfile(type: .localVPNServer) let configuration = OpenVPNConfiguration() @@ -80,8 +82,25 @@ class OpenVPNConfigurationTests: XCTestCase { XCTAssert(configuration.settings == nil, "Empty settings should return nil") } - func testGetSetIPv6() { - let originalOption: IPv6Preference = .enabled + func testGetSetProto() { + let originalOption: OpenVPNTransportProtocol = .UDP + + let configuration = OpenVPNConfiguration() + + guard configuration.proto == .default else { + XCTFail("proto option should return default value") + return + } + + configuration.proto = originalOption + guard configuration.proto == originalOption else { + XCTFail("proto option should be equal to original value (enabled)") + return + } + } + + func testGetSetIPv6() { + let originalOption: OpenVPNIPv6Preference = .enabled let configuration = OpenVPNConfiguration() @@ -90,11 +109,28 @@ class OpenVPNConfigurationTests: XCTestCase { return } - configuration.ipv6 = originalOption + 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 + } + } + } From f7b168e1146be97406efed449d721d5a72fe5e69 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Fri, 5 May 2017 17:50:53 +0300 Subject: [PATCH 76/76] 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