OpenVPN integrated successfully

This commit is contained in:
Shahzain Ali 2022-12-07 20:35:43 +05:00
parent dd1adda1a6
commit fb585cbac0
3 changed files with 258 additions and 160 deletions

View file

@ -24,6 +24,27 @@ find_package(Qt6 REQUIRED COMPONENTS
) )
qt_standard_project_setup() qt_standard_project_setup()
if(IOS)
execute_process(COMMAND bash ${CMAKE_CURRENT_LIST_DIR}/scripts/openvpn.sh)
# add_custom_command(
# # On Visual Studio Generators, run before any other rules are executed within the target. On other generators, run just before PRE_LINK commands
# OUTPUT ${TEST_FILE}
# PRE_BUILD
# COMMAND echo -e ${CMAKE_CURRENT_LIST_DIR}/scripts/openvpn.sh
# COMMENT "This command will be executed before building bar"
# VERBATIM # to support \t for example
# )
## ADD_CUSTOM_COMMAND(
## OUTPUT ${TEST_FILE}
## COMMAND ${CMAKE_CURRENT_LIST_DIR}/scripts/openvpn.sh
## COMMENT "Building OpenVPN"
## )
message(STATUS "${openvpnlogs}")
endif()
# silent builds on CI env # silent builds on CI env
set(IS_CI ${CI}) set(IS_CI ${CI})
@ -206,6 +227,10 @@ if(APPLE)
if(IOS) if(IOS)
message("ios in mac") message("ios in mac")
#do nothing, IOS is added in below #do nothing, IOS is added in below
else() #mac else() #mac
set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE) set(CMAKE_OSX_ARCHITECTURES "x86_64" CACHE INTERNAL "" FORCE)
@ -234,7 +259,7 @@ if(APPLE)
find_library(FW_APPKIT AppKit) find_library(FW_APPKIT AppKit)
find_library(FW_SECURITY Security) find_library(FW_SECURITY Security)
set(LIBS ${LIBS} FW_COCOA FW_APPLICATIONSERVICES FW_FOUNDATION FW_APPKIT FW_SECURITY FW_CORESERVICES set(LIBS ${LIBS} FW_COCOA FW_APPLICATIONSERVICES FW_FOUNDATION FW_APPKIT FW_SECURITY FW_CORESERVICES FW_OPENVPN
LIB_LIBCRYPTO LIB_SSL) LIB_LIBCRYPTO LIB_SSL)
@ -368,10 +393,55 @@ if(IOS)
enable_language(OBJCXX) enable_language(OBJCXX)
enable_language(Swift) enable_language(Swift)
include(src/cmake/osxtools.cmake) include(src/cmake/osxtools.cmake)
# set(CMAKE_XCODE_GENERATE_TOP_LEVEL_PROJECT_ONLY TRUE)
set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "NO") set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_ENABLE_BITCODE "NO")
#find_library(FW_OPENVPN OpenVPNAdapter "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos")
#add_library(OpenVPNAdapter SHARED "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework")
#set_target_properties(${PROJECT} PROPERTIES FRAMEWORK TRUE)
#target_link_libraries(${PROJECT} PUBLIC OpenVPNAdapter)
# set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
# "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework"
# OpenVPNAdapter)
# set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_PATH "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos")
set_target_properties(${PROJECT} PROPERTIES XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION)
set(CMAKE_XCODE_ATTRIBUTE_LD_RUNPATH_SEARCH_PATHS "@executable_path/Frameworks")
set(CMAKE_XCODE_ATTRIBUTE_FRAMEWORK_SEARCH_PATHS ${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos)
# set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY ON)
# set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON)
# target_link_libraries(${PROJECT} PRIVATE FW_OPENVPN)
# set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS FW_OPENVPN)
#=====================================================
# add_library(MyLib SHARED "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework")
#set_target_properties(${PROJECT} PROPERTIES FRAMEWORK TRUE)
# target_link_libraries(${PROJECT} PUBLIC MyLib)
#set_property(TARGET ${PROJECT} PROPERTY XCODE_EMBED_FRAMEWORKS
# "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework"
# )
#set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_PATH "${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos")
#set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_REMOVE_HEADERS_ON_COPY ON)
#set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON)
#======================================================
set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.amnezia.${PROJECT}" set_target_properties(${PROJECT} PROPERTIES XCODE_ATTRIBUTE_PRODUCT_BUNDLE_IDENTIFIER "org.amnezia.${PROJECT}"
XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1" XCODE_ATTRIBUTE_TARGETED_DEVICE_FAMILY "1"
XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK" XCODE_ATTRIBUTE_DEVELOPMENT_TEAM "X7UJ388FXK"
@ -449,6 +519,14 @@ target_include_directories(${PROJECT} PRIVATE ${CMAKE_SOURCE_DIR})
add_dependencies(${PROJECT} networkextension) add_dependencies(${PROJECT} networkextension)
set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension) set_target_properties(${PROJECT} PROPERTIES XCODE_EMBED_APP_EXTENSIONS networkextension)
set_property(TARGET "networkextension" PROPERTY XCODE_EMBED_FRAMEWORKS
"${CMAKE_CURRENT_LIST_DIR}/3rd/OpenVPNAdapter/build/Release-iphoneos/OpenVPNAdapter.framework"
)
set_target_properties(networkextension PROPERTIES XCODE_EMBED_FRAMEWORKS_CODE_SIGN_ON_COPY ON)
set_target_properties(networkextension PROPERTIES XCODE_LINK_BUILD_PHASE_MODE KNOWN_LOCATION)
endif() endif()

View file

@ -2,9 +2,8 @@ import Foundation
import NetworkExtension import NetworkExtension
import os import os
import Darwin import Darwin
//import OpenVPNAdapter import OpenVPNAdapter
//import Tun2socks //import Tun2socks
enum TunnelProtoType: String { enum TunnelProtoType: String {
case wireguard, openvpn, shadowsocks, none case wireguard, openvpn, shadowsocks, none
} }
@ -48,11 +47,11 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
}() }()
// private lazy var ovpnAdapter: OpenVPNAdapter = { private lazy var ovpnAdapter: OpenVPNAdapter = {
// let adapter = OpenVPNAdapter() let adapter = OpenVPNAdapter()
// adapter.delegate = self adapter.delegate = self
// return adapter return adapter
// }() }()
private var shadowSocksConfig: Data? = nil private var shadowSocksConfig: Data? = nil
private var openVPNConfig: Data? = nil private var openVPNConfig: Data? = nil
@ -70,7 +69,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
// private var session: NWUDPSession? = nil // private var session: NWUDPSession? = nil
// private var observer: AnyObject? // private var observer: AnyObject?
// let vpnReachability = OpenVPNReachability() let vpnReachability = OpenVPNReachability()
var startHandler: ((Error?) -> Void)? var startHandler: ((Error?) -> Void)?
var stopHandler: (() -> Void)? var stopHandler: (() -> Void)?
@ -97,8 +96,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
errorNotifier: errorNotifier, errorNotifier: errorNotifier,
completionHandler: completionHandler) completionHandler: completionHandler)
case .openvpn: case .openvpn:
break startOpenVPN(completionHandler: completionHandler)
//startOpenVPN(completionHandler: completionHandler)
case .shadowsocks: case .shadowsocks:
break break
// startShadowSocks(completionHandler: completionHandler) // startShadowSocks(completionHandler: completionHandler)
@ -112,8 +110,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
case .wireguard: case .wireguard:
stopWireguard(with: reason, completionHandler: completionHandler) stopWireguard(with: reason, completionHandler: completionHandler)
case .openvpn: case .openvpn:
break stopOpenVPN(with: reason, completionHandler: completionHandler)
// stopOpenVPN(with: reason, completionHandler: completionHandler)
case .shadowsocks: case .shadowsocks:
break break
// stopShadowSocks(with: reason, completionHandler: completionHandler) // stopShadowSocks(with: reason, completionHandler: completionHandler)
@ -127,7 +124,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
case .wireguard: case .wireguard:
handleWireguardAppMessage(messageData, completionHandler: completionHandler) handleWireguardAppMessage(messageData, completionHandler: completionHandler)
case .openvpn: case .openvpn:
handleWireguardAppMessage(messageData, completionHandler: completionHandler) handleOpenVPNAppMessage(messageData, completionHandler: completionHandler)
case .shadowsocks: case .shadowsocks:
break break
// handleShadowSocksAppMessage(messageData, completionHandler: completionHandler) // handleShadowSocksAppMessage(messageData, completionHandler: completionHandler)
@ -189,17 +186,17 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
// private func startOpenVPN(completionHandler: @escaping (Error?) -> Void) { private func startOpenVPN(completionHandler: @escaping (Error?) -> Void) {
// guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
// let providerConfiguration = protocolConfiguration.providerConfiguration, let providerConfiguration = protocolConfiguration.providerConfiguration,
// let ovpnConfiguration: Data = providerConfiguration[Constants.ovpnConfigKey] as? Data else { let ovpnConfiguration: Data = providerConfiguration[Constants.ovpnConfigKey] as? Data else {
// // TODO: handle errors properly // TODO: handle errors properly
// wg_log(.error, message: "Can't start startOpenVPN()") wg_log(.error, message: "Can't start startOpenVPN()")
// return return
// } }
//
// setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler) setupAndlaunchOpenVPN(withConfig: ovpnConfiguration, completionHandler: completionHandler)
// } }
/* /*
private func startShadowSocks(completionHandler: @escaping (Error?) -> Void) { private func startShadowSocks(completionHandler: @escaping (Error?) -> Void) {
guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol, guard let protocolConfiguration = self.protocolConfiguration as? NETunnelProviderProtocol,
@ -238,13 +235,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
// private func stopOpenVPN(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { private func stopOpenVPN(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
// stopHandler = completionHandler stopHandler = completionHandler
// if vpnReachability.isTracking { if vpnReachability.isTracking {
// vpnReachability.stopTracking() vpnReachability.stopTracking()
// } }
// ovpnAdapter.disconnect() ovpnAdapter.disconnect()
// } }
/* /*
private func stopShadowSocks(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { private func stopShadowSocks(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
stopOpenVPN(with: reason) { [weak self] in stopOpenVPN(with: reason) { [weak self] in
@ -299,6 +296,21 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
private func handleOpenVPNAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
guard let completionHandler = completionHandler else { return }
if messageData.count == 1 && messageData[0] == 0 {
let bytesin = ovpnAdapter.transportStatistics.bytesIn
let strBytesin = "rx_bytes=" + String(bytesin);
let bytesout = ovpnAdapter.transportStatistics.bytesOut
let strBytesout = "tx_bytes=" + String(bytesout);
let strData = strBytesin + "\n" + strBytesout;
let data = Data(strData.utf8)
completionHandler(data)
}
}
/* /*
private func handleShadowSocksAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) { private func handleShadowSocksAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)? = nil) {
guard let completionHandler = completionHandler else { return } guard let completionHandler = completionHandler else { return }
@ -402,9 +414,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
} }
// MARK: -- Leaf provider methods // MARK: -- Leaf provider methods
private func prepareConfig(onInterface iface: String, fromSSConfig ssConfig: Data, andOvpnConfig ovpnConfig: Data) -> UnsafePointer<CChar>? { private func prepareConfig(onInterface iface: String, fromSSConfig ssConfig: Data, andOvpnConfig ovpnConfig: Data) -> UnsafePointer<CChar>? {
guard let ssConfig = try? JSONSerialization.jsonObject(with: ssConfig, options: []) as? [String: Any] else { guard let ssConfig = try? JSONSerialization.jsonObject(with: ssConfig, options: []) as? [String: Any] else {
self.ssCompletion?(0, NSError(domain: Bundle.main.bundleIdentifier ?? "unknown", self.ssCompletion?(0, NSError(domain: Bundle.main.bundleIdentifier ?? "unknown",
@ -412,7 +422,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
userInfo: [NSLocalizedDescriptionKey: "Cannot parse json for ss in tunnel"])) userInfo: [NSLocalizedDescriptionKey: "Cannot parse json for ss in tunnel"]))
return nil return nil
} }
guard let remoteHost = ssConfig[Constants.ssRemoteHost] as? String, guard let remoteHost = ssConfig[Constants.ssRemoteHost] as? String,
let remotePort = ssConfig[Constants.ssRemotePort] as? Int, let remotePort = ssConfig[Constants.ssRemotePort] as? Int,
let method = ssConfig[Constants.ssCipherKey] as? String, let method = ssConfig[Constants.ssCipherKey] as? String,
@ -422,19 +431,16 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
userInfo: [NSLocalizedDescriptionKey: "Cannot asign profile params for ss in tunnel"])) userInfo: [NSLocalizedDescriptionKey: "Cannot asign profile params for ss in tunnel"]))
return nil return nil
} }
var insettings: [String: Any] = .init() var insettings: [String: Any] = .init()
insettings["name"] = iface insettings["name"] = iface
insettings["address"] = "127.0.0.2" insettings["address"] = "127.0.0.2"
insettings["netmask"] = "255.255.255.0" insettings["netmask"] = "255.255.255.0"
insettings["gateway"] = "127.0.0.1" insettings["gateway"] = "127.0.0.1"
insettings["mtu"] = 1600 insettings["mtu"] = 1600
var inbounds: [String: Any] = .init() var inbounds: [String: Any] = .init()
inbounds["protocol"] = "tun" inbounds["protocol"] = "tun"
inbounds["settings"] = insettings inbounds["settings"] = insettings
inbounds["tag"] = "tun_in" inbounds["tag"] = "tun_in"
var outbounds: [String: Any] = .init() var outbounds: [String: Any] = .init()
var outsettings: [String: Any] = .init() var outsettings: [String: Any] = .init()
outsettings["address"] = remoteHost outsettings["address"] = remoteHost
@ -444,18 +450,13 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
outbounds["protocol"] = "shadowsocks" outbounds["protocol"] = "shadowsocks"
outbounds["settings"] = outsettings outbounds["settings"] = outsettings
outbounds["tag"] = "shadowsocks_out" outbounds["tag"] = "shadowsocks_out"
var params: [String: Any] = .init() var params: [String: Any] = .init()
params["inbounds"] = [inbounds] params["inbounds"] = [inbounds]
params["outbounds"] = [outbounds] params["outbounds"] = [outbounds]
wg_log(.error, message: "Config dictionary: \(params)") wg_log(.error, message: "Config dictionary: \(params)")
guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted), guard let jsonData = try? JSONSerialization.data(withJSONObject: params, options: .prettyPrinted),
let jsonString = String(data: jsonData, encoding: .utf8) else { return nil } let jsonString = String(data: jsonData, encoding: .utf8) else { return nil }
wg_log(.error, message: "JSON String: \(jsonString)") wg_log(.error, message: "JSON String: \(jsonString)")
var path = "" var path = ""
if let documentDirectory = FileManager.default.urls(for: .documentDirectory, if let documentDirectory = FileManager.default.urls(for: .documentDirectory,
in: .userDomainMask).first { in: .userDomainMask).first {
@ -525,7 +526,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
private func stopLeafRedirector(completion: @escaping () -> Void) { private func stopLeafRedirector(completion: @escaping () -> Void) {
leafProvider?.stopTunnel { error in leafProvider?.stopTunnel { error in
// TODO: handle errors // TODO: handle errors
@ -558,7 +558,6 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
wg_log(.error, message: "Error starting ShadowSocks: \(String(describing: errorCode))") wg_log(.error, message: "Error starting ShadowSocks: \(String(describing: errorCode))")
return return
} }
// self.setupAndHandleOpenVPNOverSSConnection(withConfig: ovpnConfig) // self.setupAndHandleOpenVPNOverSSConnection(withConfig: ovpnConfig)
self.startAndHandleTunnelOverSS(completionHandler: completion) self.startAndHandleTunnelOverSS(completionHandler: completion)
} }
@ -688,47 +687,47 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
} }
} }
*/ */
// private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data, withShadowSocks viaSS: Bool = false, completionHandler: @escaping (Error?) -> Void) { private func setupAndlaunchOpenVPN(withConfig ovpnConfiguration: Data, withShadowSocks viaSS: Bool = false, completionHandler: @escaping (Error?) -> Void) {
// wg_log(.info, message: "Inside setupAndlaunchOpenVPN()") wg_log(.info, message: "Inside setupAndlaunchOpenVPN()")
// let str = String(decoding: ovpnConfiguration, as: UTF8.self) let str = String(decoding: ovpnConfiguration, as: UTF8.self)
// wg_log(.info, message: "OPENVPN config: \(str)") wg_log(.info, message: "OPENVPN config: \(str)")
//
// let configuration = OpenVPNConfiguration() let configuration = OpenVPNConfiguration()
// configuration.fileContent = ovpnConfiguration configuration.fileContent = ovpnConfiguration
// if viaSS { if viaSS {
//// configuration.settings = [ // configuration.settings = [
//// "remote": "137.74.6.148 1194", // "remote": "137.74.6.148 1194",
//// "proto": "tcp", // "proto": "tcp",
//// "link-mtu": "1480", // "link-mtu": "1480",
//// "tun-mtu": "1460", // "tun-mtu": "1460",
//// ] // ]
// } }
// let evaluation: OpenVPNConfigurationEvaluation let evaluation: OpenVPNConfigurationEvaluation
// do { do {
// evaluation = try ovpnAdapter.apply(configuration: configuration) evaluation = try ovpnAdapter.apply(configuration: configuration)
// } catch { } catch {
// completionHandler(error) completionHandler(error)
// return return
// } }
//
// if !evaluation.autologin { if !evaluation.autologin {
// wg_log(.info, message: "Implement login with user credentials") wg_log(.info, message: "Implement login with user credentials")
// } }
//
// vpnReachability.startTracking { [weak self] status in vpnReachability.startTracking { [weak self] status in
// guard status == .reachableViaWiFi else { return } guard status == .reachableViaWiFi else { return }
// self?.ovpnAdapter.reconnect(afterTimeInterval: 5) self?.ovpnAdapter.reconnect(afterTimeInterval: 5)
// } }
//
// startHandler = completionHandler startHandler = completionHandler
// ovpnAdapter.connect(using: packetFlow) ovpnAdapter.connect(using: packetFlow)
//
// let ifaces = Interface.allInterfaces() // let ifaces = Interface.allInterfaces()
// .filter { $0.family == .ipv4 } // .filter { $0.family == .ipv4 }
// .map { iface in iface.name } // .map { iface in iface.name }
//
// wg_log(.error, message: "Available TUN Interfaces: \(ifaces)") // wg_log(.error, message: "Available TUN Interfaces: \(ifaces)")
// } }
// MARK: -- Network observing methods // MARK: -- Network observing methods
@ -798,87 +797,87 @@ extension WireGuardLogLevel {
} }
} }
//extension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {} extension NEPacketTunnelFlow: OpenVPNAdapterPacketFlow {}
/* extension NEPacketTunnelFlow: ShadowSocksAdapterPacketFlow {} */ /* extension NEPacketTunnelFlow: ShadowSocksAdapterPacketFlow {} */
//extension PacketTunnelProvider: OpenVPNAdapterDelegate { extension PacketTunnelProvider: OpenVPNAdapterDelegate {
//
// // OpenVPNAdapter calls this delegate method to configure a VPN tunnel. // OpenVPNAdapter calls this delegate method to configure a VPN tunnel.
// // `completionHandler` callback requires an object conforming to `OpenVPNAdapterPacketFlow` // `completionHandler` callback requires an object conforming to `OpenVPNAdapterPacketFlow`
// // protocol if the tunnel is configured without errors. Otherwise send nil. // protocol if the tunnel is configured without errors. Otherwise send nil.
// // `OpenVPNAdapterPacketFlow` method signatures are similar to `NEPacketTunnelFlow` so // `OpenVPNAdapterPacketFlow` method signatures are similar to `NEPacketTunnelFlow` so
// // you can just extend that class to adopt `OpenVPNAdapterPacketFlow` protocol and // you can just extend that class to adopt `OpenVPNAdapterPacketFlow` protocol and
// // send `self.packetFlow` to `completionHandler` callback. // send `self.packetFlow` to `completionHandler` callback.
// func openVPNAdapter( func openVPNAdapter(
// _ openVPNAdapter: OpenVPNAdapter, _ openVPNAdapter: OpenVPNAdapter,
// configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?, configureTunnelWithNetworkSettings networkSettings: NEPacketTunnelNetworkSettings?,
// completionHandler: @escaping (Error?) -> Void completionHandler: @escaping (Error?) -> Void
// ) { ) {
// // In order to direct all DNS queries first to the VPN DNS servers before the primary DNS servers // In order to direct all DNS queries first to the VPN DNS servers before the primary DNS servers
// // send empty string to NEDNSSettings.matchDomains // send empty string to NEDNSSettings.matchDomains
// networkSettings?.dnsSettings?.matchDomains = [""] networkSettings?.dnsSettings?.matchDomains = [""]
//
// // Set the network settings for the current tunneling session. // Set the network settings for the current tunneling session.
// setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler) setTunnelNetworkSettings(networkSettings, completionHandler: completionHandler)
// } }
//
// // Process events returned by the OpenVPN library // Process events returned by the OpenVPN library
// func openVPNAdapter( func openVPNAdapter(
// _ openVPNAdapter: OpenVPNAdapter, _ openVPNAdapter: OpenVPNAdapter,
// handleEvent event: handleEvent event:
// OpenVPNAdapterEvent, message: String? OpenVPNAdapterEvent, message: String?
// ) { ) {
// switch event { switch event {
// case .connected: case .connected:
// if reasserting { if reasserting {
// reasserting = false reasserting = false
// } }
//
// guard let startHandler = startHandler else { return } guard let startHandler = startHandler else { return }
//
// startHandler(nil) startHandler(nil)
// self.startHandler = nil self.startHandler = nil
// case .disconnected: case .disconnected:
// guard let stopHandler = stopHandler else { return } guard let stopHandler = stopHandler else { return }
//
// if vpnReachability.isTracking { if vpnReachability.isTracking {
// vpnReachability.stopTracking() vpnReachability.stopTracking()
// } }
//
// stopHandler() stopHandler()
// self.stopHandler = nil self.stopHandler = nil
// case .reconnecting: case .reconnecting:
// reasserting = true reasserting = true
// default: default:
// break break
// } }
// } }
//
// // Handle errors thrown by the OpenVPN library // Handle errors thrown by the OpenVPN library
// func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) { func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleError error: Error) {
// // Handle only fatal errors // Handle only fatal errors
// guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool, guard let fatal = (error as NSError).userInfo[OpenVPNAdapterErrorFatalKey] as? Bool,
// fatal == true else { return } fatal == true else { return }
//
// if vpnReachability.isTracking { if vpnReachability.isTracking {
// vpnReachability.stopTracking() vpnReachability.stopTracking()
// } }
//
// if let startHandler = startHandler { if let startHandler = startHandler {
// startHandler(error) startHandler(error)
// self.startHandler = nil self.startHandler = nil
// } else { } else {
// cancelTunnelWithError(error) cancelTunnelWithError(error)
// } }
// } }
//
// // Use this method to process any log message returned by OpenVPN library. // Use this method to process any log message returned by OpenVPN library.
// func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) { func openVPNAdapter(_ openVPNAdapter: OpenVPNAdapter, handleLogMessage logMessage: String) {
// // Handle log messages // Handle log messages
// wg_log(.info, message: logMessage) wg_log(.info, message: logMessage)
// } }
//} }
/* /*
extension PacketTunnelProvider: Tun2socksTunWriterProtocol { extension PacketTunnelProvider: Tun2socksTunWriterProtocol {
func write(_ p0: Data?, n: UnsafeMutablePointer<Int>?) throws { func write(_ p0: Data?, n: UnsafeMutablePointer<Int>?) throws {

21
client/scripts/openvpn.sh Normal file
View file

@ -0,0 +1,21 @@
XCODEBUILD="/usr/bin/xcodebuild"
WORKINGDIR=`pwd`
PATCH="/usr/bin/patch"
cat $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/Project.xcconfig > $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
cat << EOF >> $WORKINGDIR/3rd/OpenVPNAdapter/Configuration/amnezia.xcconfig
PROJECT_TEMP_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/OpenVPNAdapter.build
CONFIGURATION_BUILD_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos
BUILT_PRODUCTS_DIR = $WORKINGDIR/3rd/OpenVPNAdapter/build/Release-iphoneos
EOF
cd 3rd/OpenVPNAdapter
if $XCODEBUILD -scheme OpenVPNAdapter -configuration Release -xcconfig Configuration/amnezia.xcconfig -sdk iphoneos -destination 'generic/platform=iOS' -project OpenVPNAdapter.xcodeproj ; then
print Y "OpenVPNAdapter built successfully"
else
killProcess "OpenVPNAdapter build failed"
fi
cd ../../