mirror of
https://github.com/deneraraujo/OpenVPNAdapter.git
synced 2026-04-06 00:00:03 +08:00
Merge branch 'feature/extended-configuration' into develop
This commit is contained in:
@@ -6,10 +6,11 @@ DYLIB_CURRENT_VERSION = $(CURRENT_PROJECT_VERSION)
|
|||||||
APPLICATION_EXTENSION_API_ONLY = YES
|
APPLICATION_EXTENSION_API_ONLY = YES
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = gnu++14
|
CLANG_CXX_LANGUAGE_STANDARD = gnu++14
|
||||||
CLANG_CXX_LIBRARY = libc++
|
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"
|
VENDORS_PATH = $(PROJECT_DIR)/OpenVPN Adapter/Vendors
|
||||||
LIBRARY_SEARCH_PATHS[sdk=iphonesimulator*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/sim" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/sim"
|
HEADER_SEARCH_PATHS = "$(VENDORS_PATH)/asio/asio/include" "$(VENDORS_PATH)/lz4/include" "$(VENDORS_PATH)/mbedtls/include" "$(VENDORS_PATH)/openvpn"
|
||||||
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=iphonesimulator*] = "$(VENDORS_PATH)/lz4/lib/sim" "$(VENDORS_PATH)/mbedtls/lib/sim"
|
||||||
LIBRARY_SEARCH_PATHS[sdk=macosx*] = "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/lz4/lib/macos" "$(PROJECT_DIR)/OpenVPN Adapter/Vendors/mbedtls/lib/macos"
|
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_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_FORCE_TUN_NULL -DUSE_TUN_BUILDER
|
||||||
GCC_WARN_64_TO_32_BIT_CONVERSION = NO
|
GCC_WARN_64_TO_32_BIT_CONVERSION = NO
|
||||||
|
|||||||
@@ -12,18 +12,10 @@ import NetworkExtension
|
|||||||
|
|
||||||
class OpenVPNAdapterTests: XCTestCase {
|
class OpenVPNAdapterTests: XCTestCase {
|
||||||
|
|
||||||
enum ConfigurationType {
|
|
||||||
case withoutCredentials, withCredentials
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ExpectationsType {
|
enum ExpectationsType {
|
||||||
case connection
|
case connection
|
||||||
}
|
}
|
||||||
|
|
||||||
let configurations: [ConfigurationType : String] = [
|
|
||||||
.withoutCredentials: "free_openvpn_udp_us"
|
|
||||||
]
|
|
||||||
|
|
||||||
var expectations = [ExpectationsType : XCTestExpectation]()
|
var expectations = [ExpectationsType : XCTestExpectation]()
|
||||||
|
|
||||||
override func setUp() {
|
override func setUp() {
|
||||||
@@ -35,45 +27,86 @@ class OpenVPNAdapterTests: XCTestCase {
|
|||||||
super.tearDown()
|
super.tearDown()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Test connection without specifying username and password
|
func testApplyConfiguration() {
|
||||||
func testConectionWithoutCredentials() {
|
|
||||||
let configuration = getVPNConfiguration(type: .withoutCredentials)
|
|
||||||
|
|
||||||
let adapter = OpenVPNAdapter()
|
let adapter = OpenVPNAdapter()
|
||||||
|
|
||||||
|
let configuration = OpenVPNConfiguration()
|
||||||
|
configuration.fileContent = ProfileLoader.getVPNProfile(type: .localVPNServer)
|
||||||
|
configuration.settings = ["auth-user-pass": ""]
|
||||||
|
|
||||||
|
let result: OpenVPNProperties
|
||||||
do {
|
do {
|
||||||
try adapter.configure(using: configuration)
|
result = try adapter.apply(configuration: configuration)
|
||||||
} catch {
|
} catch {
|
||||||
XCTFail("Failed to configure OpenVPN adapted due to error: \(error)")
|
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.delegate = self
|
||||||
adapter.connect()
|
adapter.connect()
|
||||||
|
|
||||||
waitForExpectations(timeout: 10.0) { (error) in
|
waitForExpectations(timeout: 30.0) { (error) in
|
||||||
adapter.disconnect()
|
adapter.disconnect()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
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 {
|
extension OpenVPNAdapterTests: OpenVPNAdapterDelegate {
|
||||||
|
|
||||||
func configureTunnel(settings: NEPacketTunnelNetworkSettings, callback: @escaping (OpenVPNAdapterPacketFlow?) -> Void) {
|
func configureTunnel(settings: NEPacketTunnelNetworkSettings, callback: @escaping (OpenVPNAdapterPacketFlow?) -> Void) {
|
||||||
@@ -95,7 +128,10 @@ extension OpenVPNAdapterTests: OpenVPNAdapterDelegate {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func handle(error: Error) {
|
func handle(error: Error) {
|
||||||
|
if let connectionExpectation = expectations[.connection] {
|
||||||
|
XCTFail("Failed to establish conection. \(error.localizedDescription)")
|
||||||
|
connectionExpectation.fulfill()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func handle(logMessage: String) {
|
func handle(logMessage: String) {
|
||||||
|
|||||||
136
OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift
Normal file
136
OpenVPN Adapter Tests/OpenVPNConfigurationTests.swift
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConfigurationTests.swift
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 21.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
import XCTest
|
||||||
|
@testable import OpenVPNAdapter
|
||||||
|
|
||||||
|
// TODO: Test getting/setting of all properties of OpenVPNConfiguration
|
||||||
|
|
||||||
|
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: .localVPNServer)
|
||||||
|
|
||||||
|
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")
|
||||||
|
|
||||||
|
configuration.settings = nil
|
||||||
|
XCTAssert(configuration.settings == nil, "Empty settings should return nil")
|
||||||
|
}
|
||||||
|
|
||||||
|
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()
|
||||||
|
|
||||||
|
guard configuration.ipv6 == .default else {
|
||||||
|
XCTFail("IPv6 option should return default value")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.ipv6 = originalOption
|
||||||
|
guard configuration.ipv6 == originalOption else {
|
||||||
|
XCTFail("IPv6 option should be equal to original value (enabled)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func testGetSetTLSCertProfile() {
|
||||||
|
let originalOption: OpenVPNTLSCertProfile = .preferred
|
||||||
|
|
||||||
|
let configuration = OpenVPNConfiguration()
|
||||||
|
|
||||||
|
guard configuration.tlsCertProfile == .default else {
|
||||||
|
XCTFail("TLS Cert Profile option should return default value")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
configuration.tlsCertProfile = originalOption
|
||||||
|
guard configuration.tlsCertProfile == originalOption else {
|
||||||
|
XCTFail("TLS Cert Profile option should be equal to original value (preferred)")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
31
OpenVPN Adapter Tests/ProfileLoader.swift
Normal file
31
OpenVPN Adapter Tests/ProfileLoader.swift
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
//
|
||||||
|
// ProfileLoader.swift
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 22.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
enum ProfileType: String {
|
||||||
|
case localVPNServer = "local_vpn_server"
|
||||||
|
}
|
||||||
|
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@@ -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
|
|
||||||
<ca>
|
|
||||||
-----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-----
|
|
||||||
</ca>
|
|
||||||
<cert>
|
|
||||||
-----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-----
|
|
||||||
</cert>
|
|
||||||
<key>
|
|
||||||
-----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-----
|
|
||||||
</key>
|
|
||||||
89
OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn
Normal file
89
OpenVPN Adapter Tests/Resources/local_vpn_server.ovpn
Normal file
@@ -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
|
||||||
|
<ca>
|
||||||
|
-----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-----
|
||||||
|
</ca>
|
||||||
|
<cert>
|
||||||
|
-----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-----
|
||||||
|
</cert>
|
||||||
|
<key>
|
||||||
|
-----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-----
|
||||||
|
</key>
|
||||||
@@ -9,13 +9,67 @@
|
|||||||
/* Begin PBXBuildFile section */
|
/* Begin PBXBuildFile section */
|
||||||
C90BAD311E73FF6C00DEFB32 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; };
|
C90BAD311E73FF6C00DEFB32 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; };
|
||||||
C912BB251E7C3339002B9414 /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C912BB241E7C3339002B9414 /* NetworkExtension.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 */; };
|
C93779D51EAE32670030A362 /* OpenVPNCredentials.h in Headers */ = {isa = PBXBuildFile; fileRef = C93779D31EAE32670030A362 /* OpenVPNCredentials.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
C99E2FF11EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */ = {isa = PBXBuildFile; fileRef = C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */; };
|
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 */; };
|
||||||
|
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 */; };
|
||||||
|
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 */; };
|
||||||
|
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 */; };
|
||||||
|
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_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 */; };
|
||||||
|
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, ); }; };
|
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, ); }; };
|
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, ); }; };
|
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 */; };
|
C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */; };
|
||||||
C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */; };
|
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, ); }; };
|
C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
||||||
@@ -25,9 +79,18 @@
|
|||||||
C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; };
|
C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; };
|
||||||
C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; };
|
C9BB47931E71821A00F3F98C /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */; };
|
||||||
C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; };
|
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 */; };
|
||||||
|
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 */; };
|
C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB477E1E7173C700F3F98C /* OpenVPNAdapter.mm */; };
|
||||||
C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47781E7171ED00F3F98C /* OpenVPNClient.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 */; };
|
C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */ = {isa = PBXBuildFile; fileRef = C9FD92191E9A667600374FC4 /* ovpncli.cpp */; };
|
||||||
C9D2ABE01EA20F99007EDF9D /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C912BB241E7C3339002B9414 /* NetworkExtension.framework */; };
|
C9D2ABE01EA20F99007EDF9D /* NetworkExtension.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C912BB241E7C3339002B9414 /* NetworkExtension.framework */; };
|
||||||
C9D2ABE11EA20F99007EDF9D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; };
|
C9D2ABE11EA20F99007EDF9D /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */; };
|
||||||
@@ -39,7 +102,6 @@
|
|||||||
C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB476F1E7171A100F3F98C /* OpenVPNError.h */; settings = {ATTRIBUTES = (Public, ); }; };
|
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 */; };
|
C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.h in Headers */ = {isa = PBXBuildFile; fileRef = C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */; };
|
||||||
C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */ = {isa = PBXBuildFile; fileRef = C9FD92181E9A667600374FC4 /* ovpncli.hpp */; };
|
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 */; };
|
C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */; };
|
||||||
C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; };
|
C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */ = {isa = PBXBuildFile; fileRef = C9BB47A11E7183DB00F3F98C /* Bundle.swift */; };
|
||||||
C9D2AC051EA214EA007EDF9D /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */; };
|
C9D2AC051EA214EA007EDF9D /* OpenVPNAdapter.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */; };
|
||||||
@@ -74,13 +136,39 @@
|
|||||||
C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Tests.xcconfig; sourceTree = "<group>"; };
|
C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Tests.xcconfig; sourceTree = "<group>"; };
|
||||||
C90BAD301E73FF6C00DEFB32 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = System/Library/Frameworks/SystemConfiguration.framework; sourceTree = SDKROOT; };
|
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; };
|
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 = "<group>"; };
|
C93779D31EAE32670030A362 /* OpenVPNCredentials.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNCredentials.h; sourceTree = "<group>"; };
|
||||||
|
C93779D41EAE32670030A362 /* OpenVPNCredentials.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNCredentials.mm; sourceTree = "<group>"; };
|
||||||
|
C93779D91EAE32880030A362 /* OpenVPNCredentials+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNCredentials+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpenVPNConfigurationTests.swift; sourceTree = "<group>"; };
|
||||||
|
C9657A151EB0A7F800EFF210 /* OpenVPNConnectionInfo.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConnectionInfo.h; sourceTree = "<group>"; };
|
||||||
|
C9657A161EB0A7F800EFF210 /* OpenVPNConnectionInfo.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConnectionInfo.mm; sourceTree = "<group>"; };
|
||||||
|
C9657A1B1EB0A8D800EFF210 /* OpenVPNConnectionInfo+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConnectionInfo+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9657A231EB0B60200EFF210 /* OpenVPNTransportStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTransportStats.h; sourceTree = "<group>"; };
|
||||||
|
C9657A241EB0B60200EFF210 /* OpenVPNTransportStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNTransportStats.mm; sourceTree = "<group>"; };
|
||||||
|
C9657A291EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNTransportStats+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNInterfaceStats.h; sourceTree = "<group>"; };
|
||||||
|
C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNInterfaceStats.mm; sourceTree = "<group>"; };
|
||||||
|
C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNInterfaceStats+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9657A3E1EB0CAC200EFF210 /* OpenVPNServerEntry.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNServerEntry.h; sourceTree = "<group>"; };
|
||||||
|
C9657A3F1EB0CAC200EFF210 /* OpenVPNServerEntry.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNServerEntry.mm; sourceTree = "<group>"; };
|
||||||
|
C9657A441EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNServerEntry+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9657A4A1EB0CD6C00EFF210 /* OpenVPNProperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNProperties.h; sourceTree = "<group>"; };
|
||||||
|
C9657A4B1EB0CD6C00EFF210 /* OpenVPNProperties.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNProperties.mm; sourceTree = "<group>"; };
|
||||||
|
C9657A501EB0CD9200EFF210 /* OpenVPNProperties+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNProperties+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9657A5D1EB0D60700EFF210 /* OpenVPNTransportProtocol.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTransportProtocol.h; sourceTree = "<group>"; };
|
||||||
|
C9657A601EB0D64E00EFF210 /* OpenVPNIPv6Preference.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNIPv6Preference.h; sourceTree = "<group>"; };
|
||||||
|
C9657A631EB0D6AD00EFF210 /* OpenVPNCompressionMode.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = OpenVPNCompressionMode.h; sourceTree = "<group>"; };
|
||||||
|
C9657A661EB0D73200EFF210 /* OpenVPNMinTLSVersion.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNMinTLSVersion.h; sourceTree = "<group>"; };
|
||||||
|
C9657A691EB0D75700EFF210 /* OpenVPNTLSCertProfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNTLSCertProfile.h; sourceTree = "<group>"; };
|
||||||
|
C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = local_vpn_server.ovpn; sourceTree = "<group>"; };
|
||||||
|
C98467A41EAA5B7700272A9A /* OpenVPNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNConfiguration.h; sourceTree = "<group>"; };
|
||||||
|
C98467A51EAA5B7700272A9A /* OpenVPNConfiguration.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNConfiguration.mm; sourceTree = "<group>"; };
|
||||||
|
C98467AA1EAA5BB500272A9A /* OpenVPNConfiguration+Internal.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "OpenVPNConfiguration+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ProfileLoader.swift; sourceTree = "<group>"; };
|
||||||
C9BB475C1E71663A00F3F98C /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
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 = "<group>"; };
|
C9BB475E1E71663A00F3F98C /* Umbrella-Header.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = "Umbrella-Header.h"; sourceTree = "<group>"; };
|
||||||
C9BB476F1E7171A100F3F98C /* OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OpenVPNError.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
C9BB476F1E7171A100F3F98C /* OpenVPNError.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; lineEnding = 0; path = OpenVPNError.h; sourceTree = "<group>"; xcLanguageSpecificationIdentifier = xcode.lang.objcpp; };
|
||||||
C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNEvent.h; sourceTree = "<group>"; };
|
C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNEvent.h; sourceTree = "<group>"; };
|
||||||
C9BB47731E7171D900F3F98C /* TUNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNConfiguration.h; sourceTree = "<group>"; };
|
|
||||||
C9BB47741E7171D900F3F98C /* TUNConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TUNConfiguration.m; sourceTree = "<group>"; };
|
|
||||||
C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNClient.h; sourceTree = "<group>"; };
|
C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNClient.h; sourceTree = "<group>"; };
|
||||||
C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNClient.mm; sourceTree = "<group>"; };
|
C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNClient.mm; sourceTree = "<group>"; };
|
||||||
C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNAdapter.h; sourceTree = "<group>"; };
|
C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNAdapter.h; sourceTree = "<group>"; };
|
||||||
@@ -90,6 +178,11 @@
|
|||||||
C9BB478E1E71821A00F3F98C /* OpenVPN Adapter iOS Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "OpenVPN Adapter iOS Tests.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
|
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 = "<group>"; };
|
C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = OpenVPNAdapterTests.swift; sourceTree = "<group>"; };
|
||||||
C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
|
C9BB47A11E7183DB00F3F98C /* Bundle.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Bundle.swift; sourceTree = "<group>"; };
|
||||||
|
C9BCE2561EB3C0D9009D6AC1 /* OpenVPNSessionToken.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OpenVPNSessionToken.h; sourceTree = "<group>"; };
|
||||||
|
C9BCE2571EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = OpenVPNSessionToken.mm; sourceTree = "<group>"; };
|
||||||
|
C9BCE25C1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "OpenVPNSessionToken+Internal.h"; sourceTree = "<group>"; };
|
||||||
|
C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = TUNConfiguration.h; sourceTree = "<group>"; };
|
||||||
|
C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = TUNConfiguration.m; sourceTree = "<group>"; };
|
||||||
C9D2ABF01EA20F99007EDF9D /* OpenVPNAdapter.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = OpenVPNAdapter.framework; sourceTree = BUILT_PRODUCTS_DIR; };
|
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; };
|
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 = "<group>"; };
|
C9FD92181E9A667600374FC4 /* ovpncli.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = ovpncli.hpp; path = Vendors/openvpn/client/ovpncli.hpp; sourceTree = "<group>"; };
|
||||||
@@ -179,9 +272,75 @@
|
|||||||
name = Frameworks;
|
name = Frameworks;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
C9235AC41EB24F0100C7D303 /* Configuration */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C9BDB1331EBCC3B900C204FF /* TUNConfiguration.h */,
|
||||||
|
C9BDB1341EBCC3B900C204FF /* TUNConfiguration.m */,
|
||||||
|
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 = Configuration;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C9235AC51EB24F1100C7D303 /* Stats and 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 */,
|
||||||
|
C9657A321EB0BA3900EFF210 /* OpenVPNInterfaceStats.h */,
|
||||||
|
C9657A381EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h */,
|
||||||
|
C9657A331EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm */,
|
||||||
|
);
|
||||||
|
name = "Stats and Info";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C9235AC61EB24F2A00C7D303 /* Enums and Constants */ = {
|
||||||
|
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 = "Enums and Constants";
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
|
C9B376B71EA53CE700B7F423 /* Client */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */,
|
||||||
|
C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */,
|
||||||
|
);
|
||||||
|
name = Client;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
C9BB475D1E71663A00F3F98C /* OpenVPN Adapter */ = {
|
C9BB475D1E71663A00F3F98C /* OpenVPN Adapter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
C9235AC41EB24F0100C7D303 /* Configuration */,
|
||||||
|
C9235AC51EB24F1100C7D303 /* Stats and Info */,
|
||||||
|
C9B376B71EA53CE700B7F423 /* Client */,
|
||||||
C9BB47671E7169F000F3F98C /* Adapter */,
|
C9BB47671E7169F000F3F98C /* Adapter */,
|
||||||
C9BB47641E7169AF00F3F98C /* Libraries */,
|
C9BB47641E7169AF00F3F98C /* Libraries */,
|
||||||
C9BB47651E7169B700F3F98C /* Framework */,
|
C9BB47651E7169B700F3F98C /* Framework */,
|
||||||
@@ -192,6 +351,7 @@
|
|||||||
C9BB47641E7169AF00F3F98C /* Libraries */ = {
|
C9BB47641E7169AF00F3F98C /* Libraries */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
C9FF73B71EB7421600E995AC /* Helpers */,
|
||||||
C9BB47681E716ABF00F3F98C /* Vendors */,
|
C9BB47681E716ABF00F3F98C /* Vendors */,
|
||||||
);
|
);
|
||||||
name = Libraries;
|
name = Libraries;
|
||||||
@@ -208,12 +368,6 @@
|
|||||||
C9BB47671E7169F000F3F98C /* Adapter */ = {
|
C9BB47671E7169F000F3F98C /* Adapter */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C9BB476F1E7171A100F3F98C /* OpenVPNError.h */,
|
|
||||||
C9BB47701E7171A100F3F98C /* OpenVPNEvent.h */,
|
|
||||||
C9BB47731E7171D900F3F98C /* TUNConfiguration.h */,
|
|
||||||
C9BB47741E7171D900F3F98C /* TUNConfiguration.m */,
|
|
||||||
C9BB47771E7171ED00F3F98C /* OpenVPNClient.h */,
|
|
||||||
C9BB47781E7171ED00F3F98C /* OpenVPNClient.mm */,
|
|
||||||
C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */,
|
C9BB477B1E7173C700F3F98C /* OpenVPNAdapter.h */,
|
||||||
C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */,
|
C9BB477C1E7173C700F3F98C /* OpenVPNAdapter+Internal.h */,
|
||||||
C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */,
|
C9BB477D1E7173C700F3F98C /* OpenVPNAdapter+Public.h */,
|
||||||
@@ -252,7 +406,7 @@
|
|||||||
C9BB479A1E71836100F3F98C /* Resources */ = {
|
C9BB479A1E71836100F3F98C /* Resources */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C99E2FEF1EA7E20700A6518B /* free_openvpn_udp_us.ovpn */,
|
C98467A11EAA559B00272A9A /* local_vpn_server.ovpn */,
|
||||||
);
|
);
|
||||||
path = Resources;
|
path = Resources;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@@ -260,6 +414,7 @@
|
|||||||
C9BB479D1E71837200F3F98C /* Adapter Tests */ = {
|
C9BB479D1E71837200F3F98C /* Adapter Tests */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
|
C94605E81EAA656B00971516 /* OpenVPNConfigurationTests.swift */,
|
||||||
C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */,
|
C9BB47901E71821A00F3F98C /* OpenVPNAdapterTests.swift */,
|
||||||
);
|
);
|
||||||
name = "Adapter Tests";
|
name = "Adapter Tests";
|
||||||
@@ -285,10 +440,19 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
C9BB47A11E7183DB00F3F98C /* Bundle.swift */,
|
C9BB47A11E7183DB00F3F98C /* Bundle.swift */,
|
||||||
|
C9B03A7A1EABA6B500268B85 /* ProfileLoader.swift */,
|
||||||
);
|
);
|
||||||
name = Utils;
|
name = Utils;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
C9FF73B71EB7421600E995AC /* Helpers */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
C9235AC61EB24F2A00C7D303 /* Enums and Constants */,
|
||||||
|
);
|
||||||
|
name = Helpers;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
@@ -297,14 +461,35 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */,
|
C9BB47791E7171ED00F3F98C /* OpenVPNClient.h in Headers */,
|
||||||
|
C9657A3A1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */,
|
||||||
|
C9BCE25E1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */,
|
||||||
C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */,
|
C9BB47721E7171A100F3F98C /* OpenVPNEvent.h in Headers */,
|
||||||
C9BB477F1E7173C700F3F98C /* OpenVPNAdapter.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 */,
|
||||||
|
C9BDB1351EBCC3B900C204FF /* TUNConfiguration.h in Headers */,
|
||||||
|
C9657A401EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */,
|
||||||
|
C98467AB1EAA5BE100272A9A /* OpenVPNConfiguration+Internal.h in Headers */,
|
||||||
|
C98467A61EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */,
|
||||||
|
C9657A2B1EB0B6FA00EFF210 /* OpenVPNTransportStats+Internal.h in Headers */,
|
||||||
C9BB47601E71663A00F3F98C /* Umbrella-Header.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 */,
|
C9BB47811E7173C700F3F98C /* OpenVPNAdapter+Public.h in Headers */,
|
||||||
C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */,
|
C9BB47711E7171A100F3F98C /* OpenVPNError.h in Headers */,
|
||||||
C9BB47801E7173C700F3F98C /* OpenVPNAdapter+Internal.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 */,
|
C9FD921A1E9A667600374FC4 /* ovpncli.hpp in Headers */,
|
||||||
C9BB47751E7171D900F3F98C /* TUNConfiguration.h in Headers */,
|
C93779DB1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */,
|
||||||
|
C9657A6A1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */,
|
||||||
|
C9657A461EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */,
|
||||||
|
C9657A251EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -313,14 +498,35 @@
|
|||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C9D2ABE31EA20F99007EDF9D /* OpenVPNClient.h in Headers */,
|
C9D2ABE31EA20F99007EDF9D /* OpenVPNClient.h in Headers */,
|
||||||
|
C9657A3B1EB0BAAB00EFF210 /* OpenVPNInterfaceStats+Internal.h in Headers */,
|
||||||
|
C9BCE25F1EB3C201009D6AC1 /* OpenVPNSessionToken+Internal.h in Headers */,
|
||||||
C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */,
|
C9D2ABE41EA20F99007EDF9D /* OpenVPNEvent.h in Headers */,
|
||||||
C9D2ABE51EA20F99007EDF9D /* OpenVPNAdapter.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 */,
|
||||||
|
C9BDB1361EBCC3B900C204FF /* TUNConfiguration.h in Headers */,
|
||||||
|
C9657A411EB0CAC200EFF210 /* OpenVPNServerEntry.h in Headers */,
|
||||||
|
C98467AC1EAA5BE200272A9A /* OpenVPNConfiguration+Internal.h in Headers */,
|
||||||
|
C98467A71EAA5B7700272A9A /* OpenVPNConfiguration.h in Headers */,
|
||||||
|
C9657A2F1EB0B79500EFF210 /* OpenVPNTransportStats+Internal.h in Headers */,
|
||||||
C9D2ABE61EA20F99007EDF9D /* Umbrella-Header.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 */,
|
C9D2ABE71EA20F99007EDF9D /* OpenVPNAdapter+Public.h in Headers */,
|
||||||
C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */,
|
C9D2ABE81EA20F99007EDF9D /* OpenVPNError.h in Headers */,
|
||||||
C9D2ABE91EA20F99007EDF9D /* OpenVPNAdapter+Internal.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 */,
|
C9D2ABEA1EA20F99007EDF9D /* ovpncli.hpp in Headers */,
|
||||||
C9D2ABEB1EA20F99007EDF9D /* TUNConfiguration.h in Headers */,
|
C93779DC1EAE32880030A362 /* OpenVPNCredentials+Internal.h in Headers */,
|
||||||
|
C9657A6B1EB0D75700EFF210 /* OpenVPNTLSCertProfile.h in Headers */,
|
||||||
|
C9657A471EB0CB5900EFF210 /* OpenVPNServerEntry+Internal.h in Headers */,
|
||||||
|
C9657A261EB0B60200EFF210 /* OpenVPNTransportStats.h in Headers */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -412,6 +618,7 @@
|
|||||||
TargetAttributes = {
|
TargetAttributes = {
|
||||||
C9BB475B1E71663A00F3F98C = {
|
C9BB475B1E71663A00F3F98C = {
|
||||||
CreatedOnToolsVersion = 8.2.1;
|
CreatedOnToolsVersion = 8.2.1;
|
||||||
|
LastSwiftMigration = 0830;
|
||||||
ProvisioningStyle = Manual;
|
ProvisioningStyle = Manual;
|
||||||
};
|
};
|
||||||
C9BB478D1E71821A00F3F98C = {
|
C9BB478D1E71821A00F3F98C = {
|
||||||
@@ -460,7 +667,7 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C99E2FF01EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */,
|
C98467A21EAA559B00272A9A /* local_vpn_server.ovpn in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -475,7 +682,7 @@
|
|||||||
isa = PBXResourcesBuildPhase;
|
isa = PBXResourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
C99E2FF11EA7E20700A6518B /* free_openvpn_udp_us.ovpn in Resources */,
|
C98467A31EAA559B00272A9A /* local_vpn_server.ovpn in Resources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -517,10 +724,18 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C9657A421EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */,
|
||||||
|
C9BCE25A1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */,
|
||||||
C9BB47821E7173C700F3F98C /* OpenVPNAdapter.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 */,
|
C9BB477A1E7171ED00F3F98C /* OpenVPNClient.mm in Sources */,
|
||||||
C9BB47761E7171D900F3F98C /* TUNConfiguration.m in Sources */,
|
|
||||||
C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */,
|
C9FD921B1E9A667600374FC4 /* ovpncli.cpp in Sources */,
|
||||||
|
C9657A361EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */,
|
||||||
|
C9657A211EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */,
|
||||||
|
C93779D71EAE32670030A362 /* OpenVPNCredentials.mm in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -528,7 +743,9 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C94605E91EAA656B00971516 /* OpenVPNConfigurationTests.swift in Sources */,
|
||||||
C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */,
|
C9BB47911E71821A00F3F98C /* OpenVPNAdapterTests.swift in Sources */,
|
||||||
|
C9B03A7C1EABA82200268B85 /* ProfileLoader.swift in Sources */,
|
||||||
C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */,
|
C9BB47A21E7183DB00F3F98C /* Bundle.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -537,10 +754,18 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C9657A431EB0CAC200EFF210 /* OpenVPNServerEntry.mm in Sources */,
|
||||||
|
C9BCE25B1EB3C0D9009D6AC1 /* OpenVPNSessionToken.mm in Sources */,
|
||||||
C9D2ABDB1EA20F99007EDF9D /* OpenVPNAdapter.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 */,
|
C9D2ABDC1EA20F99007EDF9D /* OpenVPNClient.mm in Sources */,
|
||||||
C9D2ABDD1EA20F99007EDF9D /* TUNConfiguration.m in Sources */,
|
|
||||||
C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */,
|
C9D2ABDE1EA20F99007EDF9D /* ovpncli.cpp in Sources */,
|
||||||
|
C9657A371EB0BA3900EFF210 /* OpenVPNInterfaceStats.mm in Sources */,
|
||||||
|
C9657A221EB0ACAE00EFF210 /* OpenVPNConnectionInfo.mm in Sources */,
|
||||||
|
C93779D81EAE32670030A362 /* OpenVPNCredentials.mm in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
};
|
};
|
||||||
@@ -548,7 +773,9 @@
|
|||||||
isa = PBXSourcesBuildPhase;
|
isa = PBXSourcesBuildPhase;
|
||||||
buildActionMask = 2147483647;
|
buildActionMask = 2147483647;
|
||||||
files = (
|
files = (
|
||||||
|
C94605EA1EAA65F200971516 /* OpenVPNConfigurationTests.swift in Sources */,
|
||||||
C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */,
|
C9D2ABF61EA212A3007EDF9D /* OpenVPNAdapterTests.swift in Sources */,
|
||||||
|
C9B03A7D1EABA82300268B85 /* ProfileLoader.swift in Sources */,
|
||||||
C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */,
|
C9D2ABF71EA212A3007EDF9D /* Bundle.swift in Sources */,
|
||||||
);
|
);
|
||||||
runOnlyForDeploymentPostprocessing = 0;
|
runOnlyForDeploymentPostprocessing = 0;
|
||||||
@@ -573,6 +800,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */;
|
baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
@@ -601,6 +829,7 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */;
|
baseConfigurationReference = C90BAD2A1E73F5AF00DEFB32 /* Project.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_WARN_BOOL_CONVERSION = YES;
|
CLANG_WARN_BOOL_CONVERSION = YES;
|
||||||
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
CLANG_WARN_CONSTANT_CONVERSION = YES;
|
||||||
CLANG_WARN_EMPTY_BODY = YES;
|
CLANG_WARN_EMPTY_BODY = YES;
|
||||||
@@ -627,7 +856,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */;
|
baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
@@ -660,6 +888,7 @@
|
|||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
MTL_ENABLE_DEBUG_INFO = YES;
|
MTL_ENABLE_DEBUG_INFO = YES;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -676,7 +905,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */;
|
baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
@@ -708,6 +936,7 @@
|
|||||||
GCC_WARN_UNUSED_FUNCTION = YES;
|
GCC_WARN_UNUSED_FUNCTION = YES;
|
||||||
GCC_WARN_UNUSED_VARIABLE = YES;
|
GCC_WARN_UNUSED_VARIABLE = YES;
|
||||||
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks";
|
||||||
|
LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks";
|
||||||
MTL_ENABLE_DEBUG_INFO = NO;
|
MTL_ENABLE_DEBUG_INFO = NO;
|
||||||
SDKROOT = iphoneos;
|
SDKROOT = iphoneos;
|
||||||
SKIP_INSTALL = YES;
|
SKIP_INSTALL = YES;
|
||||||
@@ -723,7 +952,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */;
|
baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
@@ -777,7 +1005,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */;
|
baseConfigurationReference = C90BAD2F1E73FA7400DEFB32 /* Tests.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
|
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
ALWAYS_SEARCH_USER_PATHS = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
|
||||||
@@ -825,7 +1052,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */;
|
baseConfigurationReference = C90BAD2B1E73F69500DEFB32 /* Debug.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
@@ -877,7 +1103,6 @@
|
|||||||
isa = XCBuildConfiguration;
|
isa = XCBuildConfiguration;
|
||||||
baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */;
|
baseConfigurationReference = C90BAD2C1E73F69500DEFB32 /* Release.xcconfig */;
|
||||||
buildSettings = {
|
buildSettings = {
|
||||||
ALWAYS_SEARCH_USER_PATHS = NO;
|
|
||||||
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
CLANG_ALLOW_NON_MODULAR_INCLUDES_IN_FRAMEWORK_MODULES = NO;
|
||||||
CLANG_ANALYZER_NONNULL = YES;
|
CLANG_ANALYZER_NONNULL = YES;
|
||||||
CLANG_ENABLE_MODULES = YES;
|
CLANG_ENABLE_MODULES = YES;
|
||||||
|
|||||||
@@ -26,9 +26,29 @@
|
|||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
codeCoverageEnabled = "YES">
|
||||||
<Testables>
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C9BB478D1E71821A00F3F98C"
|
||||||
|
BuildableName = "OpenVPN Adapter iOS Tests.xctest"
|
||||||
|
BlueprintName = "OpenVPN Adapter iOS Tests"
|
||||||
|
ReferencedContainer = "container:OpenVPN Adapter.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C9BB475B1E71663A00F3F98C"
|
||||||
|
BuildableName = "OpenVPNAdapter.framework"
|
||||||
|
BlueprintName = "OpenVPN Adapter iOS"
|
||||||
|
ReferencedContainer = "container:OpenVPN Adapter.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
<AdditionalOptions>
|
<AdditionalOptions>
|
||||||
</AdditionalOptions>
|
</AdditionalOptions>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
|
|||||||
@@ -26,9 +26,29 @@
|
|||||||
buildConfiguration = "Debug"
|
buildConfiguration = "Debug"
|
||||||
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
selectedDebuggerIdentifier = "Xcode.DebuggerFoundation.Debugger.LLDB"
|
||||||
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
selectedLauncherIdentifier = "Xcode.DebuggerFoundation.Launcher.LLDB"
|
||||||
shouldUseLaunchSchemeArgsEnv = "YES">
|
shouldUseLaunchSchemeArgsEnv = "YES"
|
||||||
|
codeCoverageEnabled = "YES">
|
||||||
<Testables>
|
<Testables>
|
||||||
|
<TestableReference
|
||||||
|
skipped = "NO">
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C9D2ABF21EA212A3007EDF9D"
|
||||||
|
BuildableName = "OpenVPN Adapter macOS Tests.xctest"
|
||||||
|
BlueprintName = "OpenVPN Adapter macOS Tests"
|
||||||
|
ReferencedContainer = "container:OpenVPN Adapter.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</TestableReference>
|
||||||
</Testables>
|
</Testables>
|
||||||
|
<MacroExpansion>
|
||||||
|
<BuildableReference
|
||||||
|
BuildableIdentifier = "primary"
|
||||||
|
BlueprintIdentifier = "C9D2ABD81EA20F99007EDF9D"
|
||||||
|
BuildableName = "OpenVPNAdapter.framework"
|
||||||
|
BlueprintName = "OpenVPN Adapter macOS"
|
||||||
|
ReferencedContainer = "container:OpenVPN Adapter.xcodeproj">
|
||||||
|
</BuildableReference>
|
||||||
|
</MacroExpansion>
|
||||||
<AdditionalOptions>
|
<AdditionalOptions>
|
||||||
</AdditionalOptions>
|
</AdditionalOptions>
|
||||||
</TestAction>
|
</TestAction>
|
||||||
|
|||||||
@@ -10,10 +10,9 @@
|
|||||||
|
|
||||||
#import "OpenVPNAdapter.h"
|
#import "OpenVPNAdapter.h"
|
||||||
|
|
||||||
|
|
||||||
using namespace openvpn;
|
using namespace openvpn;
|
||||||
|
|
||||||
@interface OpenVPNAdapter (Client)
|
@interface OpenVPNAdapter (Internal)
|
||||||
|
|
||||||
- (BOOL)configureSockets;
|
- (BOOL)configureSockets;
|
||||||
|
|
||||||
@@ -35,4 +34,6 @@ using namespace openvpn;
|
|||||||
- (void)handleEvent:(const ClientAPI::Event *)event;
|
- (void)handleEvent:(const ClientAPI::Event *)event;
|
||||||
- (void)handleLog:(const ClientAPI::LogInfo *)log;
|
- (void)handleLog:(const ClientAPI::LogInfo *)log;
|
||||||
|
|
||||||
|
- (void)tick;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -1,15 +1,21 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNAdapter+Provider.h
|
// OpenVPNAdapter+Public.h
|
||||||
// OpenVPN iOS Client
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 11.02.17.
|
// Created by Sergey Abramchuk on 11.02.17.
|
||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
#import "OpenVPNEvent.h"
|
#import "OpenVPNEvent.h"
|
||||||
|
|
||||||
#import "OpenVPNAdapter.h"
|
#import "OpenVPNAdapter.h"
|
||||||
|
|
||||||
|
@class OpenVPNConfiguration;
|
||||||
|
@class OpenVPNProperties;
|
||||||
|
@class OpenVPNCredentials;
|
||||||
|
@class OpenVPNConnectionInfo;
|
||||||
|
@class OpenVPNSessionToken;
|
||||||
|
@class OpenVPNTransportStats;
|
||||||
|
@class OpenVPNInterfaceStats;
|
||||||
@class NEPacketTunnelNetworkSettings;
|
@class NEPacketTunnelNetworkSettings;
|
||||||
|
|
||||||
// TODO: Add documentation to properties and methods
|
// TODO: Add documentation to properties and methods
|
||||||
@@ -70,6 +76,8 @@ NS_SWIFT_NAME(handle(event:message:));
|
|||||||
- (void)handleError:(nonnull NSError *)error
|
- (void)handleError:(nonnull NSError *)error
|
||||||
NS_SWIFT_NAME(handle(error:));
|
NS_SWIFT_NAME(handle(error:));
|
||||||
|
|
||||||
|
@optional
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#Description#>
|
||||||
|
|
||||||
@@ -78,44 +86,103 @@ NS_SWIFT_NAME(handle(error:));
|
|||||||
- (void)handleLog:(nonnull NSString *)logMessage
|
- (void)handleLog:(nonnull NSString *)logMessage
|
||||||
NS_SWIFT_NAME(handle(logMessage:));
|
NS_SWIFT_NAME(handle(logMessage:));
|
||||||
|
|
||||||
|
/**
|
||||||
|
<#Description#>
|
||||||
|
*/
|
||||||
|
- (void)tick;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#Description#>
|
||||||
*/
|
*/
|
||||||
@interface OpenVPNAdapter (Provider)
|
@interface OpenVPNAdapter (Public)
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
Return core copyright
|
||||||
*/
|
*/
|
||||||
@property (strong, nonatomic, nullable) NSString *username;
|
@property (class, nonnull, readonly, nonatomic) NSString *copyright;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
Return platform description
|
||||||
*/
|
*/
|
||||||
@property (strong, nonatomic, nullable) NSString *password;
|
@property (class, nonnull, readonly, nonatomic) NSString *platform;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#Description#>
|
||||||
*/
|
*/
|
||||||
@property (weak, nonatomic, null_unspecified) id<OpenVPNAdapterDelegate> delegate;
|
@property (weak, nonatomic, null_unspecified) id<OpenVPNAdapterDelegate> delegate;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return information about the most recent connection. Will be available
|
||||||
|
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
|
||||||
|
*/
|
||||||
|
@property (nonnull, readonly, nonatomic) OpenVPNTransportStats *transportStats;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Return tun stats
|
||||||
|
*/
|
||||||
|
@property (nonnull, readonly, nonatomic) OpenVPNInterfaceStats *interfaceStats;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#Description#>
|
||||||
|
|
||||||
@param settings <#settings description#>
|
@param configuration <#configuration description#>
|
||||||
@param error <#error description#>
|
@param error <#error description#>
|
||||||
@return <#return value description#>
|
@return <#return value description#>
|
||||||
*/
|
*/
|
||||||
- (BOOL)configureUsingSettings:(nonnull NSData *)settings
|
- (nullable OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration
|
||||||
error:(out NSError * __nullable * __nullable)error
|
error:(out NSError * __nullable * __nullable)error
|
||||||
NS_SWIFT_NAME(configure(using:));
|
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
|
Establish connection with the VPN server
|
||||||
*/
|
*/
|
||||||
- (void)connect;
|
- (void)connect;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Pause the client –- useful to avoid continuous reconnection attempts
|
||||||
|
when network is down
|
||||||
|
|
||||||
|
@param pauseReason <#reason description#>
|
||||||
|
*/
|
||||||
|
- (void)pauseWithReason:(nullable NSString *)pauseReason
|
||||||
|
NS_SWIFT_NAME(pause(reason:));
|
||||||
|
|
||||||
|
/**
|
||||||
|
Resume the client after it has been paused
|
||||||
|
*/
|
||||||
|
- (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
|
Close connection with the VPN server
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNAdapter.h
|
// OpenVPNAdapter.h
|
||||||
// OpenVPN iOS Client
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 11.02.17.
|
// Created by Sergey Abramchuk on 11.02.17.
|
||||||
//
|
//
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
|
||||||
@interface OpenVPNAdapter : NSObject
|
@interface OpenVPNAdapter : NSObject
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
//
|
//
|
||||||
// OpenVPNAdapter.m
|
// OpenVPNAdapter.m
|
||||||
// OpenVPN iOS Client
|
// OpenVPN Adapter
|
||||||
//
|
//
|
||||||
// Created by Sergey Abramchuk on 11.02.17.
|
// Created by Sergey Abramchuk on 11.02.17.
|
||||||
//
|
//
|
||||||
@@ -14,11 +14,17 @@
|
|||||||
|
|
||||||
#import <NetworkExtension/NetworkExtension.h>
|
#import <NetworkExtension/NetworkExtension.h>
|
||||||
|
|
||||||
|
#import "TUNConfiguration.h"
|
||||||
|
#import "OpenVPNClient.h"
|
||||||
#import "OpenVPNError.h"
|
#import "OpenVPNError.h"
|
||||||
#import "OpenVPNEvent.h"
|
#import "OpenVPNEvent.h"
|
||||||
#import "OpenVPNClient.h"
|
#import "OpenVPNConfiguration+Internal.h"
|
||||||
#import "TUNConfiguration.h"
|
#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"
|
#import "OpenVPNAdapter.h"
|
||||||
#import "OpenVPNAdapter+Internal.h"
|
#import "OpenVPNAdapter+Internal.h"
|
||||||
#import "OpenVPNAdapter+Public.h"
|
#import "OpenVPNAdapter+Public.h"
|
||||||
@@ -28,11 +34,7 @@ NSString * const OpenVPNAdapterErrorDomain = @"me.ss-abramchuk.openvpn-adapter.e
|
|||||||
NSString * const OpenVPNAdapterErrorFatalKey = @"me.ss-abramchuk.openvpn-adapter.error-key.fatal";
|
NSString * const OpenVPNAdapterErrorFatalKey = @"me.ss-abramchuk.openvpn-adapter.error-key.fatal";
|
||||||
NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter.error-key.event";
|
NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter.error-key.event";
|
||||||
|
|
||||||
|
|
||||||
@interface OpenVPNAdapter () {
|
@interface OpenVPNAdapter () {
|
||||||
NSString *_username;
|
|
||||||
NSString *_password;
|
|
||||||
|
|
||||||
__weak id<OpenVPNAdapterDelegate> _delegate;
|
__weak id<OpenVPNAdapterDelegate> _delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,11 +59,12 @@ NSString * const OpenVPNAdapterErrorEventKey = @"me.ss-abramchuk.openvpn-adapter
|
|||||||
|
|
||||||
- (void)readTUNPackets;
|
- (void)readTUNPackets;
|
||||||
- (void)readVPNData:(NSData *)data;
|
- (void)readVPNData:(NSData *)data;
|
||||||
|
- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName;
|
||||||
- (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength;
|
- (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength;
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation OpenVPNAdapter (Client)
|
@implementation OpenVPNAdapter (Internal)
|
||||||
|
|
||||||
#pragma mark Sockets Configuration
|
#pragma mark Sockets Configuration
|
||||||
|
|
||||||
@@ -280,7 +283,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
// Set MTU
|
// Set MTU
|
||||||
networkSettings.MTU = self.mtu;
|
networkSettings.MTU = self.mtu;
|
||||||
|
|
||||||
// Establish TUN interface
|
// Establish TUN interface
|
||||||
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
|
dispatch_semaphore_t sema = dispatch_semaphore_create(0);
|
||||||
|
|
||||||
[self.delegate configureTunnelWithSettings:networkSettings callback:^(id<OpenVPNAdapterPacketFlow> _Nullable flow) {
|
[self.delegate configureTunnelWithSettings:networkSettings callback:^(id<OpenVPNAdapterPacketFlow> _Nullable flow) {
|
||||||
@@ -335,69 +338,36 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
- (void)handleLog:(const ClientAPI::LogInfo *)log {
|
- (void)handleLog:(const ClientAPI::LogInfo *)log {
|
||||||
NSAssert(self.delegate != nil, @"delegate property should not be nil");
|
NSAssert(self.delegate != nil, @"delegate property should not be nil");
|
||||||
|
|
||||||
NSString *message = [NSString stringWithCString:log->text.c_str() encoding:NSUTF8StringEncoding];
|
if ([self.delegate respondsToSelector:@selector(handleLog:)]) {
|
||||||
[self.delegate handleLog:message];
|
NSString *message = [NSString stringWithCString:log->text.c_str() encoding:NSUTF8StringEncoding];
|
||||||
|
[self.delegate handleLog:message];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
- (OpenVPNEvent)getEventIdentifierByName:(NSString *)eventName {
|
#pragma mark Clock Tick
|
||||||
NSDictionary *events = @{
|
|
||||||
@"DISCONNECTED": @(OpenVPNEventDisconnected),
|
- (void)tick {
|
||||||
@"CONNECTED": @(OpenVPNEventConnected),
|
NSAssert(self.delegate != nil, @"delegate property should not be nil");
|
||||||
@"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;
|
if ([self.delegate respondsToSelector:@selector(tick)]) {
|
||||||
return event;
|
[self.delegate tick];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@end
|
@end
|
||||||
|
|
||||||
@implementation OpenVPNAdapter (Provider)
|
@implementation OpenVPNAdapter (Public)
|
||||||
|
|
||||||
#pragma mark Properties Gettters/Setters
|
#pragma mark Properties
|
||||||
|
|
||||||
- (void)setUsername:(NSString *)username {
|
+ (NSString *)copyright {
|
||||||
_username = username;
|
std::string copyright = OpenVPNClient::copyright();
|
||||||
|
return [NSString stringWithUTF8String:copyright.c_str()];
|
||||||
}
|
}
|
||||||
|
|
||||||
- (NSString *)username {
|
+ (NSString *)platform {
|
||||||
return _username;
|
std::string platform = OpenVPNClient::platform();
|
||||||
}
|
return [NSString stringWithUTF8String:platform.c_str()];
|
||||||
|
|
||||||
- (void)setPassword:(NSString *)password {
|
|
||||||
_password = password;
|
|
||||||
}
|
|
||||||
|
|
||||||
- (NSString *)password {
|
|
||||||
return _password;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
- (void)setDelegate:(id<OpenVPNAdapterDelegate>)delegate {
|
- (void)setDelegate:(id<OpenVPNAdapterDelegate>)delegate {
|
||||||
@@ -408,35 +378,44 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
return _delegate;
|
return _delegate;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (OpenVPNConnectionInfo *)connectionInfo {
|
||||||
|
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];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNInterfaceStats *)interfaceStats {
|
||||||
|
ClientAPI::InterfaceStats stats = self.vpnClient->tun_stats();
|
||||||
|
return [[OpenVPNInterfaceStats alloc] initWithInterfaceStats:stats];
|
||||||
|
}
|
||||||
|
|
||||||
#pragma mark Client Configuration
|
#pragma mark Client Configuration
|
||||||
|
|
||||||
- (BOOL)configureUsingSettings:(NSData *)settings error:(out NSError * __autoreleasing _Nullable *)error {
|
- (OpenVPNProperties *)applyConfiguration:(nonnull OpenVPNConfiguration *)configuration error:(out NSError * __nullable * __nullable)error {
|
||||||
NSString *vpnConfiguration = [[NSString alloc] initWithData:settings encoding:NSUTF8StringEncoding];
|
ClientAPI::EvalConfig eval = self.vpnClient->eval_config(configuration.config);
|
||||||
|
|
||||||
if (vpnConfiguration == nil) {
|
|
||||||
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
|
||||||
NSLocalizedDescriptionKey: @"Failed to read VPN configuration"
|
|
||||||
}];
|
|
||||||
return NO;
|
|
||||||
}
|
|
||||||
|
|
||||||
ClientAPI::Config clientConfiguration;
|
|
||||||
clientConfiguration.content = std::string([vpnConfiguration UTF8String]);
|
|
||||||
clientConfiguration.connTimeout = 30;
|
|
||||||
|
|
||||||
ClientAPI::EvalConfig eval = self.vpnClient->eval_config(clientConfiguration);
|
|
||||||
if (eval.error) {
|
if (eval.error) {
|
||||||
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
||||||
NSLocalizedDescriptionKey: [NSString stringWithUTF8String:eval.message.c_str()]
|
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 (creds_status.error) {
|
||||||
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
if (error) *error = [NSError errorWithDomain:OpenVPNAdapterErrorDomain code:OpenVPNErrorConfigurationFailure userInfo:@{
|
||||||
NSLocalizedDescriptionKey: [NSString stringWithUTF8String:creds_status.message.c_str()]
|
NSLocalizedDescriptionKey: [NSString stringWithUTF8String:creds_status.message.c_str()]
|
||||||
@@ -450,16 +429,15 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
#pragma mark Connection Control
|
#pragma mark Connection Control
|
||||||
|
|
||||||
- (void)connect {
|
- (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_queue_t connectQueue = dispatch_queue_create("me.ss-abramchuk.openvpn-ios-client.connection", NULL);
|
|
||||||
dispatch_async(connectQueue, ^{
|
dispatch_async(connectQueue, ^{
|
||||||
|
OpenVPNClient::init_process();
|
||||||
|
|
||||||
self.tunConfigurationIPv6 = [TUNConfiguration new];
|
self.tunConfigurationIPv6 = [TUNConfiguration new];
|
||||||
self.tunConfigurationIPv4 = [TUNConfiguration new];
|
self.tunConfigurationIPv4 = [TUNConfiguration new];
|
||||||
|
|
||||||
self.searchDomains = [NSMutableArray new];
|
self.searchDomains = [NSMutableArray new];
|
||||||
|
|
||||||
OpenVPNClient::init_process();
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
ClientAPI::Status status = self.vpnClient->connect();
|
ClientAPI::Status status = self.vpnClient->connect();
|
||||||
if (status.error) {
|
if (status.error) {
|
||||||
@@ -479,8 +457,6 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
[self.delegate handleError:error];
|
[self.delegate handleError:error];
|
||||||
}
|
}
|
||||||
|
|
||||||
OpenVPNClient::uninit_process();
|
|
||||||
|
|
||||||
self.remoteAddress = nil;
|
self.remoteAddress = nil;
|
||||||
|
|
||||||
self.tunConfigurationIPv6 = nil;
|
self.tunConfigurationIPv6 = nil;
|
||||||
@@ -499,9 +475,24 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
CFSocketInvalidate(self.tunSocket);
|
CFSocketInvalidate(self.tunSocket);
|
||||||
CFRelease(self.tunSocket);
|
CFRelease(self.tunSocket);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
OpenVPNClient::uninit_process();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
- (void)pauseWithReason:(NSString *)pauseReason {
|
||||||
|
std::string reason = pauseReason ? std::string([pauseReason UTF8String]) : "";
|
||||||
|
self.vpnClient->pause(reason);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)resume {
|
||||||
|
self.vpnClient->resume();
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)reconnectAfterTimeInterval:(NSInteger)interval {
|
||||||
|
self.vpnClient->reconnect(interval);
|
||||||
|
}
|
||||||
|
|
||||||
- (void)disconnect {
|
- (void)disconnect {
|
||||||
self.vpnClient->stop();
|
self.vpnClient->stop();
|
||||||
}
|
}
|
||||||
@@ -516,10 +507,7 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
{
|
{
|
||||||
self = [super init];
|
self = [super init];
|
||||||
if (self) {
|
if (self) {
|
||||||
_username = nil;
|
|
||||||
_password = nil;
|
|
||||||
_delegate = nil;
|
_delegate = nil;
|
||||||
|
|
||||||
self.vpnClient = new OpenVPNClient((__bridge void *)self);
|
self.vpnClient = new OpenVPNClient((__bridge void *)self);
|
||||||
}
|
}
|
||||||
return self;
|
return self;
|
||||||
@@ -571,6 +559,45 @@ static void socketCallback(CFSocketRef socket, CFSocketCallBackType type, CFData
|
|||||||
|
|
||||||
#pragma mark Utils
|
#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 {
|
- (NSString *)getSubnetFromPrefixLength:(NSNumber *)prefixLength {
|
||||||
uint32_t bitmask = UINT_MAX << (sizeof(uint32_t) * 8 - prefixLength.integerValue);
|
uint32_t bitmask = UINT_MAX << (sizeof(uint32_t) * 8 - prefixLength.integerValue);
|
||||||
|
|
||||||
|
|||||||
@@ -6,9 +6,9 @@
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
|
#import <openvpn/tun/client/tunbase.hpp>
|
||||||
#import <client/ovpncli.hpp>
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
|
||||||
using namespace openvpn;
|
using namespace openvpn;
|
||||||
|
|
||||||
class OpenVPNClient : public ClientAPI::OpenVPNClient
|
class OpenVPNClient : public ClientAPI::OpenVPNClient
|
||||||
@@ -62,8 +62,8 @@ public:
|
|||||||
virtual void event(const ClientAPI::Event& ev) override;
|
virtual void event(const ClientAPI::Event& ev) override;
|
||||||
virtual void log(const ClientAPI::LogInfo& log) override;
|
virtual void log(const ClientAPI::LogInfo& log) override;
|
||||||
|
|
||||||
private:
|
virtual void clock_tick() override;
|
||||||
std::string get_subnet(int prefix_length);
|
|
||||||
|
|
||||||
void *adapter;
|
private:
|
||||||
|
void* adapter;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -6,15 +6,11 @@
|
|||||||
//
|
//
|
||||||
//
|
//
|
||||||
|
|
||||||
#import <sstream>
|
|
||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
#import "OpenVPNAdapter+Internal.h"
|
#import "OpenVPNAdapter+Internal.h"
|
||||||
|
|
||||||
#import "OpenVPNClient.h"
|
#import "OpenVPNClient.h"
|
||||||
|
|
||||||
|
|
||||||
OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() {
|
OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() {
|
||||||
this->adapter = adapter;
|
this->adapter = adapter;
|
||||||
}
|
}
|
||||||
@@ -49,7 +45,7 @@ bool OpenVPNClient::tun_builder_exclude_route(const std::string& address, int pr
|
|||||||
return [(__bridge OpenVPNAdapter *)adapter excludeRoute:route prefixLength:@(prefix_length) isIPv6:ipv6];
|
return [(__bridge OpenVPNAdapter *)adapter excludeRoute:route prefixLength:@(prefix_length) isIPv6:ipv6];
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenVPNClient::tun_builder_add_dns_server(const std::string& address, bool ipv6) {
|
bool OpenVPNClient::tun_builder_add_dns_server(const std::string& address, bool ipv6) {
|
||||||
NSString *dnsAddress = [NSString stringWithUTF8String:address.c_str()];
|
NSString *dnsAddress = [NSString stringWithUTF8String:address.c_str()];
|
||||||
return [(__bridge OpenVPNAdapter *)adapter addDNSAddress:dnsAddress isIPv6:ipv6];
|
return [(__bridge OpenVPNAdapter *)adapter addDNSAddress:dnsAddress isIPv6:ipv6];
|
||||||
}
|
}
|
||||||
@@ -95,30 +91,29 @@ bool OpenVPNClient::tun_builder_persist() {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenVPNClient::tun_builder_establish_lite() {
|
void OpenVPNClient::tun_builder_establish_lite() { }
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void OpenVPNClient::tun_builder_teardown(bool disconnect) {
|
void OpenVPNClient::tun_builder_teardown(bool disconnect) { }
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
bool OpenVPNClient::socket_protect(int socket) {
|
bool OpenVPNClient::socket_protect(int socket) {
|
||||||
return true;
|
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() {
|
bool OpenVPNClient::pause_on_connection_timeout() {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
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) {
|
void OpenVPNClient::event(const ClientAPI::Event& ev) {
|
||||||
[(__bridge OpenVPNAdapter *)adapter handleEvent:&ev];
|
[(__bridge OpenVPNAdapter* )adapter handleEvent:&ev];
|
||||||
}
|
}
|
||||||
|
|
||||||
void OpenVPNClient::log(const ClientAPI::LogInfo& log) {
|
void OpenVPNClient::log(const ClientAPI::LogInfo& log) {
|
||||||
[(__bridge OpenVPNAdapter *)adapter handleLog:&log];
|
[(__bridge OpenVPNAdapter* )adapter handleLog:&log];
|
||||||
|
}
|
||||||
|
|
||||||
|
void OpenVPNClient::clock_tick() {
|
||||||
|
[(__bridge OpenVPNAdapter* )adapter tick];
|
||||||
}
|
}
|
||||||
|
|||||||
23
OpenVPN Adapter/OpenVPNCompressionMode.h
Normal file
23
OpenVPN Adapter/OpenVPNCompressionMode.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNCompressionMode.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
};
|
||||||
34
OpenVPN Adapter/OpenVPNConfiguration+Internal.h
Normal file
34
OpenVPN Adapter/OpenVPNConfiguration+Internal.h
Normal file
@@ -0,0 +1,34 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConfiguration+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 21.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNConfiguration.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNConfiguration (Internal)
|
||||||
|
|
||||||
|
@property (readonly) ClientAPI::Config config;
|
||||||
|
|
||||||
|
+ (OpenVPNTransportProtocol)getTransportProtocolFromValue:(nullable NSString *)value;
|
||||||
|
+ (nonnull NSString *)getValueFromTransportProtocol:(OpenVPNTransportProtocol)protocol;
|
||||||
|
|
||||||
|
+ (OpenVPNIPv6Preference)getIPv6PreferenceFromValue:(nullable NSString *)value;
|
||||||
|
+ (nonnull NSString *)getValueFromIPv6Preference:(OpenVPNIPv6Preference)preference;
|
||||||
|
|
||||||
|
+ (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
|
||||||
145
OpenVPN Adapter/OpenVPNConfiguration.h
Normal file
145
OpenVPN Adapter/OpenVPNConfiguration.h
Normal file
@@ -0,0 +1,145 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConfiguration.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 21.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#import "OpenVPNTransportProtocol.h"
|
||||||
|
#import "OpenVPNIPv6Preference.h"
|
||||||
|
#import "OpenVPNCompressionMode.h"
|
||||||
|
#import "OpenVPNMinTLSVersion.h"
|
||||||
|
#import "OpenVPNTLSCertProfile.h"
|
||||||
|
|
||||||
|
/**
|
||||||
|
Class used to pass configuration
|
||||||
|
*/
|
||||||
|
@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<NSString *, NSString *> *settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Set to identity OpenVPN GUI version.
|
||||||
|
Format should be "<gui_identifier><space><version>"
|
||||||
|
Passed to server as IV_GUI_VER.
|
||||||
|
*/
|
||||||
|
@property (nullable, nonatomic) NSString *guiVersion;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Use a different server than that specified in "remote"
|
||||||
|
option of profile
|
||||||
|
*/
|
||||||
|
@property (nullable, nonatomic) NSString *server;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Force a given transport protocol
|
||||||
|
*/
|
||||||
|
@property (nonatomic) OpenVPNTransportProtocol proto;
|
||||||
|
|
||||||
|
/**
|
||||||
|
IPv6 preference
|
||||||
|
*/
|
||||||
|
@property (nonatomic) OpenVPNIPv6Preference ipv6;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Connection timeout in seconds, or 0 to retry indefinitely
|
||||||
|
*/
|
||||||
|
@property (nonatomic) NSInteger connectionTimeout;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Keep tun interface active during pauses or reconnections
|
||||||
|
*/
|
||||||
|
@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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Enable autologin sessions
|
||||||
|
*/
|
||||||
|
@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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Override or default the tls-cert-profile setting
|
||||||
|
*/
|
||||||
|
@property (nonatomic) OpenVPNTLSCertProfile tlsCertProfile;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Pass custom key/value pairs to OpenVPN server
|
||||||
|
*/
|
||||||
|
@property (nullable, nonatomic) NSDictionary<NSString *, NSString *> *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;
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
440
OpenVPN Adapter/OpenVPNConfiguration.mm
Normal file
440
OpenVPN Adapter/OpenVPNConfiguration.mm
Normal file
@@ -0,0 +1,440 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConfiguration.m
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 21.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#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;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
|
|
||||||
|
@implementation OpenVPNConfiguration (Internal)
|
||||||
|
|
||||||
|
- (ClientAPI::Config)config {
|
||||||
|
return _config;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (OpenVPNTransportProtocol)getTransportProtocolFromValue:(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 *)getValueFromTransportProtocol:(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)getIPv6PreferenceFromValue:(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 *)getValueFromIPv6Preference:(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)getCompressionModeFromValue:(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 *)getValueFromCompressionMode:(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;
|
||||||
|
}
|
||||||
|
|
||||||
|
+ (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
|
||||||
|
|
||||||
|
- (NSData *)fileContent {
|
||||||
|
return !_config.content.empty() ? [NSData dataWithBytes:_config.content.data() length:_config.content.size()] : nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setFileContent:(NSData *)fileContent {
|
||||||
|
_config.content = fileContent ? std::string((const char *)fileContent.bytes) : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary<NSString *,NSString *> *)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<NSString *,NSString *> *)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);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)guiVersion {
|
||||||
|
return !_config.guiVersion.empty() ? [NSString stringWithUTF8String:_config.guiVersion.c_str()] : nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setGuiVersion:(NSString *)guiVersion {
|
||||||
|
_config.guiVersion = guiVersion ? std::string([guiVersion UTF8String]) : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSString *)server {
|
||||||
|
return !_config.serverOverride.empty() ? [NSString stringWithUTF8String:_config.serverOverride.c_str()] : nil;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setServer:(NSString *)serverOverride {
|
||||||
|
_config.serverOverride = serverOverride ? std::string([serverOverride UTF8String]) : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNTransportProtocol)proto {
|
||||||
|
NSString *currentValue = [NSString stringWithUTF8String:_config.protoOverride.c_str()];
|
||||||
|
return [OpenVPNConfiguration getTransportProtocolFromValue:currentValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setProto:(OpenVPNTransportProtocol)proto {
|
||||||
|
NSString *value = [OpenVPNConfiguration getValueFromTransportProtocol:proto];
|
||||||
|
_config.protoOverride = std::string([value UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNIPv6Preference)ipv6 {
|
||||||
|
NSString *currentValue = [NSString stringWithUTF8String:_config.ipv6.c_str()];
|
||||||
|
return [OpenVPNConfiguration getIPv6PreferenceFromValue:currentValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setIpv6:(OpenVPNIPv6Preference)ipv6 {
|
||||||
|
NSString *value = [OpenVPNConfiguration getValueFromIPv6Preference:ipv6];
|
||||||
|
_config.ipv6 = std::string([value UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSInteger)connectionTimeout {
|
||||||
|
return _config.connTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setConnectionTimeout:(NSInteger)connectionTimeout {
|
||||||
|
_config.connTimeout = connectionTimeout;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)tunPersist {
|
||||||
|
return _config.tunPersist;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setTunPersist:(BOOL)tunPersist {
|
||||||
|
_config.tunPersist = tunPersist;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)googleDNSFallback {
|
||||||
|
return _config.googleDnsFallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setGoogleDNSFallback:(BOOL)googleDNSFallback {
|
||||||
|
_config.googleDnsFallback = googleDNSFallback;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)autologinSessions {
|
||||||
|
return _config.autologinSessions;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setAutologinSessions:(BOOL)autologinSessions {
|
||||||
|
_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 {
|
||||||
|
NSString *currentValue = [NSString stringWithUTF8String:_config.compressionMode.c_str()];
|
||||||
|
return [OpenVPNConfiguration getCompressionModeFromValue:currentValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setCompressionMode:(OpenVPNCompressionMode)compressionMode {
|
||||||
|
NSString *value = [OpenVPNConfiguration getValueFromCompressionMode:compressionMode];
|
||||||
|
_config.compressionMode = std::string([value UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (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;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)forceCiphersuitesAESCBC {
|
||||||
|
return _config.forceAesCbcCiphersuites;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setForceCiphersuitesAESCBC:(BOOL)forceCiphersuitesAESCBC {
|
||||||
|
_config.forceAesCbcCiphersuites = forceCiphersuitesAESCBC;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNMinTLSVersion)minTLSVersion {
|
||||||
|
NSString *currentValue = [NSString stringWithUTF8String:_config.tlsVersionMinOverride.c_str()];
|
||||||
|
return [OpenVPNConfiguration getMinTLSFromValue:currentValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setMinTLSVersion:(OpenVPNMinTLSVersion)minTLSVersion {
|
||||||
|
NSString *value = [OpenVPNConfiguration getValueFromMinTLS:minTLSVersion];
|
||||||
|
_config.tlsVersionMinOverride = std::string([value UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (OpenVPNTLSCertProfile)tlsCertProfile {
|
||||||
|
NSString *currentValue = [NSString stringWithUTF8String:_config.tlsCertProfileOverride.c_str()];
|
||||||
|
return [OpenVPNConfiguration getTLSCertProfileFromValue:currentValue];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setTlsCertProfile:(OpenVPNTLSCertProfile)tlsCertProfile {
|
||||||
|
NSString *value = [OpenVPNConfiguration getValueFromTLSCertProfile:tlsCertProfile];
|
||||||
|
_config.tlsCertProfileOverride = std::string([value UTF8String]);
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSDictionary<NSString *,NSString *> *)peerInfo {
|
||||||
|
if (_config.peerInfo.empty()) {
|
||||||
|
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<NSString *,NSString *> *)peerInfo {
|
||||||
|
_config.peerInfo.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);
|
||||||
|
}];
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)echo {
|
||||||
|
return _config.echo;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setEcho:(BOOL)echo {
|
||||||
|
_config.echo = echo;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (BOOL)info {
|
||||||
|
return _config.info;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setInfo:(BOOL)info {
|
||||||
|
_config.info = info;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (NSUInteger)clockTick {
|
||||||
|
return _config.clockTickMS;
|
||||||
|
}
|
||||||
|
|
||||||
|
- (void)setClockTick:(NSUInteger)clockTick {
|
||||||
|
_config.clockTickMS = clockTick;
|
||||||
|
}
|
||||||
|
|
||||||
|
@end
|
||||||
19
OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNConnectionInfo+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConnectionInfo+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNConnectionInfo.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNConnectionInfo (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithConnectionInfo:(ClientAPI::ConnectionInfo)info;
|
||||||
|
|
||||||
|
@end
|
||||||
30
OpenVPN Adapter/OpenVPNConnectionInfo.h
Normal file
30
OpenVPN Adapter/OpenVPNConnectionInfo.h
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNConnectionInfo.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Class used to provide extra details about successful connection
|
||||||
|
*/
|
||||||
|
@interface OpenVPNConnectionInfo : NSObject
|
||||||
|
|
||||||
|
@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;
|
||||||
|
|
||||||
|
- (nonnull instancetype) __unavailable init;
|
||||||
|
|
||||||
|
@end
|
||||||
35
OpenVPN Adapter/OpenVPNConnectionInfo.mm
Normal file
35
OpenVPN Adapter/OpenVPNConnectionInfo.mm
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
//
|
||||||
|
// 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) {
|
||||||
|
_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
|
||||||
19
OpenVPN Adapter/OpenVPNCredentials+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNCredentials+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNCredentials+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 24.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNCredentials.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNCredentials (Internal)
|
||||||
|
|
||||||
|
@property (readonly) ClientAPI::ProvideCreds credentials;
|
||||||
|
|
||||||
|
@end
|
||||||
53
OpenVPN Adapter/OpenVPNCredentials.h
Normal file
53
OpenVPN Adapter/OpenVPNCredentials.h
Normal file
@@ -0,0 +1,53 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNCredentials.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 24.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
78
OpenVPN Adapter/OpenVPNCredentials.mm
Normal file
78
OpenVPN Adapter/OpenVPNCredentials.mm
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
//
|
||||||
|
// 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
|
||||||
|
|
||||||
|
- (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
|
||||||
@@ -8,7 +8,6 @@
|
|||||||
|
|
||||||
#import <Foundation/Foundation.h>
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
|
||||||
extern NSString * __nonnull const OpenVPNAdapterErrorDomain;
|
extern NSString * __nonnull const OpenVPNAdapterErrorDomain;
|
||||||
|
|
||||||
extern NSString * __nonnull const OpenVPNAdapterErrorFatalKey;
|
extern NSString * __nonnull const OpenVPNAdapterErrorFatalKey;
|
||||||
@@ -16,9 +15,6 @@ extern NSString * __nonnull const OpenVPNAdapterErrorEventKey;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#Description#>
|
||||||
|
|
||||||
- OpenVPNErrorConfigurationFailure: <#OpenVPNErrorConfigurationFailure description#>
|
|
||||||
- OpenVPNErrorClientFailure: <#OpenVPNErrorClientFailure description#>
|
|
||||||
*/
|
*/
|
||||||
typedef NS_ENUM(NSUInteger, OpenVPNError) {
|
typedef NS_ENUM(NSUInteger, OpenVPNError) {
|
||||||
OpenVPNErrorConfigurationFailure,
|
OpenVPNErrorConfigurationFailure,
|
||||||
|
|||||||
@@ -10,41 +10,6 @@
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
<#Description#>
|
<#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) {
|
typedef NS_ENUM(NSUInteger, OpenVPNEvent) {
|
||||||
OpenVPNEventDisconnected,
|
OpenVPNEventDisconnected,
|
||||||
|
|||||||
21
OpenVPN Adapter/OpenVPNIPv6Preference.h
Normal file
21
OpenVPN Adapter/OpenVPNIPv6Preference.h
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNIPv6Preference.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
};
|
||||||
19
OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNInterfaceStats+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNInterfaceStats+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNInterfaceStats.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNInterfaceStats (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithInterfaceStats:(ClientAPI::InterfaceStats)stats;
|
||||||
|
|
||||||
|
@end
|
||||||
48
OpenVPN Adapter/OpenVPNInterfaceStats.h
Normal file
48
OpenVPN Adapter/OpenVPNInterfaceStats.h
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNInterfaceStats.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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;
|
||||||
|
|
||||||
|
@end
|
||||||
27
OpenVPN Adapter/OpenVPNInterfaceStats.mm
Normal file
27
OpenVPN Adapter/OpenVPNInterfaceStats.mm
Normal file
@@ -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
|
||||||
25
OpenVPN Adapter/OpenVPNMinTLSVersion.h
Normal file
25
OpenVPN Adapter/OpenVPNMinTLSVersion.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNMinTLSVersion.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
};
|
||||||
19
OpenVPN Adapter/OpenVPNProperties+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNProperties+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNProperties+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNProperties.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNProperties (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithEvalConfig:(ClientAPI::EvalConfig)eval;
|
||||||
|
|
||||||
|
@end
|
||||||
79
OpenVPN Adapter/OpenVPNProperties.h
Normal file
79
OpenVPN Adapter/OpenVPNProperties.h
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNProperties.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
#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<OpenVPNServerEntry *> *servers;
|
||||||
|
|
||||||
|
- (nonnull instancetype) __unavailable init;
|
||||||
|
|
||||||
|
@end
|
||||||
61
OpenVPN Adapter/OpenVPNProperties.mm
Normal file
61
OpenVPN Adapter/OpenVPNProperties.mm
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNProperties.m
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <openvpn/common/number.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNConfiguration+Internal.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 = [OpenVPNConfiguration getTransportProtocolFromValue: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
|
||||||
19
OpenVPN Adapter/OpenVPNServerEntry+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNServerEntry+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNServerEntry+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNServerEntry.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNServerEntry (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithServerEntry:(ClientAPI::ServerEntry)entry;
|
||||||
|
|
||||||
|
@end
|
||||||
18
OpenVPN Adapter/OpenVPNServerEntry.h
Normal file
18
OpenVPN Adapter/OpenVPNServerEntry.h
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNServerEntry.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
@interface OpenVPNServerEntry : NSObject
|
||||||
|
|
||||||
|
@property (nullable, readonly, nonatomic) NSString *server;
|
||||||
|
@property (nullable, readonly, nonatomic) NSString *friendlyName;
|
||||||
|
|
||||||
|
- (nonnull instancetype) __unavailable init;
|
||||||
|
|
||||||
|
@end
|
||||||
23
OpenVPN Adapter/OpenVPNServerEntry.mm
Normal file
23
OpenVPN Adapter/OpenVPNServerEntry.mm
Normal file
@@ -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
|
||||||
19
OpenVPN Adapter/OpenVPNSessionToken+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNSessionToken+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNSessionToken+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 28.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNSessionToken.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNSessionToken (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithSessionToken:(ClientAPI::SessionToken)token;
|
||||||
|
|
||||||
|
@end
|
||||||
25
OpenVPN Adapter/OpenVPNSessionToken.h
Normal file
25
OpenVPN Adapter/OpenVPNSessionToken.h
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNSessionToken.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 28.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
24
OpenVPN Adapter/OpenVPNSessionToken.mm
Normal file
24
OpenVPN Adapter/OpenVPNSessionToken.mm
Normal file
@@ -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
|
||||||
27
OpenVPN Adapter/OpenVPNTLSCertProfile.h
Normal file
27
OpenVPN Adapter/OpenVPNTLSCertProfile.h
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNTLSCertProfile.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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
|
||||||
|
};
|
||||||
23
OpenVPN Adapter/OpenVPNTransportProtocol.h
Normal file
23
OpenVPN Adapter/OpenVPNTransportProtocol.h
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNTransportProtocol.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
Transport protocol options
|
||||||
|
*/
|
||||||
|
typedef NS_ENUM(NSInteger, OpenVPNTransportProtocol) {
|
||||||
|
///
|
||||||
|
OpenVPNTransportProtocolUDP,
|
||||||
|
///
|
||||||
|
OpenVPNTransportProtocolTCP,
|
||||||
|
///
|
||||||
|
OpenVPNTransportProtocolAdaptive,
|
||||||
|
/// Use a transport protocol specified in the profile
|
||||||
|
OpenVPNTransportProtocolDefault
|
||||||
|
};
|
||||||
19
OpenVPN Adapter/OpenVPNTransportStats+Internal.h
Normal file
19
OpenVPN Adapter/OpenVPNTransportStats+Internal.h
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNTransportStats+Internal.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <client/ovpncli.hpp>
|
||||||
|
|
||||||
|
#import "OpenVPNTransportStats.h"
|
||||||
|
|
||||||
|
using namespace openvpn;
|
||||||
|
|
||||||
|
@interface OpenVPNTransportStats (Internal)
|
||||||
|
|
||||||
|
- (instancetype)initWithTransportStats:(ClientAPI::TransportStats)stats;
|
||||||
|
|
||||||
|
@end
|
||||||
44
OpenVPN Adapter/OpenVPNTransportStats.h
Normal file
44
OpenVPN Adapter/OpenVPNTransportStats.h
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNTransportStats.h
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#import <Foundation/Foundation.h>
|
||||||
|
|
||||||
|
/**
|
||||||
|
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;
|
||||||
|
|
||||||
|
- (nonnull instancetype) __unavailable init;
|
||||||
|
|
||||||
|
@end
|
||||||
28
OpenVPN Adapter/OpenVPNTransportStats.mm
Normal file
28
OpenVPN Adapter/OpenVPNTransportStats.mm
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
//
|
||||||
|
// OpenVPNTransportStats.m
|
||||||
|
// OpenVPN Adapter
|
||||||
|
//
|
||||||
|
// Created by Sergey Abramchuk on 26.04.17.
|
||||||
|
//
|
||||||
|
//
|
||||||
|
|
||||||
|
#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
|
||||||
@@ -18,5 +18,18 @@ FOUNDATION_EXPORT const unsigned char OpenVPNAdapterVersionString[];
|
|||||||
|
|
||||||
#import <OpenVPNAdapter/OpenVPNError.h>
|
#import <OpenVPNAdapter/OpenVPNError.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNEvent.h>
|
#import <OpenVPNAdapter/OpenVPNEvent.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNTransportProtocol.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNIPv6Preference.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNCompressionMode.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNMinTLSVersion.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNTLSCertProfile.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNConfiguration.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNCredentials.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNServerEntry.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNProperties.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNConnectionInfo.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNSessionToken.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNTransportStats.h>
|
||||||
|
#import <OpenVPNAdapter/OpenVPNInterfaceStats.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNAdapter.h>
|
#import <OpenVPNAdapter/OpenVPNAdapter.h>
|
||||||
#import <OpenVPNAdapter/OpenVPNAdapter+Public.h>
|
#import <OpenVPNAdapter/OpenVPNAdapter+Public.h>
|
||||||
|
|||||||
@@ -180,7 +180,7 @@ namespace openvpn {
|
|||||||
dest.push_back((high<<4) + low);
|
dest.push_back((high<<4) + low);
|
||||||
}
|
}
|
||||||
if (i != len)
|
if (i != len)
|
||||||
throw parse_hex_error(); // straggler char
|
throw parse_hex_error(); // straggler char
|
||||||
}
|
}
|
||||||
|
|
||||||
// note -- currently doesn't detect overflow
|
// note -- currently doesn't detect overflow
|
||||||
@@ -226,7 +226,7 @@ namespace openvpn {
|
|||||||
}
|
}
|
||||||
|
|
||||||
template <typename T>
|
template <typename T>
|
||||||
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)];
|
unsigned char buf[sizeof(T)];
|
||||||
for (size_t i = sizeof(T); i --> 0 ;)
|
for (size_t i = sizeof(T); i --> 0 ;)
|
||||||
@@ -237,7 +237,7 @@ namespace openvpn {
|
|||||||
return render_hex(buf, sizeof(T), caps);
|
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);
|
RenderHexByte b(uc, caps);
|
||||||
return std::string(b.str2(), 2);
|
return std::string(b.str2(), 2);
|
||||||
|
|||||||
Reference in New Issue
Block a user