From a957e0488eeaabd062755e3e9b6e40ec9a7af872 Mon Sep 17 00:00:00 2001 From: Sergey Abramchuk Date: Sat, 11 Feb 2017 15:25:28 +0300 Subject: [PATCH] Pass basic configuration vpn to the adapter --- OpenVPN Tunnel Provider/OpenVPNClient.h | 69 +++++++++++ OpenVPN Tunnel Provider/OpenVPNClient.mm | 142 +++++++++++++++++++++++ 2 files changed, 211 insertions(+) create mode 100644 OpenVPN Tunnel Provider/OpenVPNClient.h create mode 100644 OpenVPN Tunnel Provider/OpenVPNClient.mm diff --git a/OpenVPN Tunnel Provider/OpenVPNClient.h b/OpenVPN Tunnel Provider/OpenVPNClient.h new file mode 100644 index 0000000..68940ad --- /dev/null +++ b/OpenVPN Tunnel Provider/OpenVPNClient.h @@ -0,0 +1,69 @@ +// +// OpenVPNClient+Internal.h +// OpenVPN iOS Client +// +// Created by Sergey Abramchuk on 11.02.17. +// +// + +#import + + +using namespace openvpn; + +class OpenVPNClient : public ClientAPI::OpenVPNClient +{ +public: + OpenVPNClient(void * adapter); + + virtual bool tun_builder_new() override; + + virtual bool tun_builder_set_remote_address(const std::string& address, bool ipv6) override; + virtual bool tun_builder_add_address(const std::string& address, + int prefix_length, + const std::string& gateway, + bool ipv6, + bool net30) override; + virtual bool tun_builder_reroute_gw(bool ipv4, + bool ipv6, + unsigned int flags) override; + virtual bool tun_builder_add_route(const std::string& address, + int prefix_length, + int metric, + bool ipv6) override; + virtual bool tun_builder_exclude_route(const std::string& address, + int prefix_length, + int metric, + bool ipv6) override; + virtual bool tun_builder_add_dns_server(const std::string& address, bool ipv6) override; + virtual bool tun_builder_add_search_domain(const std::string& domain) override; + virtual bool tun_builder_set_mtu(int mtu) override; + virtual bool tun_builder_set_session_name(const std::string& name) override; + virtual bool tun_builder_add_proxy_bypass(const std::string& bypass_host) override; + virtual bool tun_builder_set_proxy_auto_config_url(const std::string& url) override; + virtual bool tun_builder_set_proxy_http(const std::string& host, int port) override; + virtual bool tun_builder_set_proxy_https(const std::string& host, int port) override; + virtual bool tun_builder_add_wins_server(const std::string& address) override; + + virtual int tun_builder_establish() override; + + virtual bool tun_builder_persist() override; + virtual void tun_builder_establish_lite() override; + + virtual void tun_builder_teardown(bool disconnect) override; + + virtual bool socket_protect(int socket) override; + + virtual bool pause_on_connection_timeout() override; + + virtual void external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) override; + virtual void external_pki_sign_request(ClientAPI::ExternalPKISignRequest& signreq) override; + + virtual void event(const ClientAPI::Event& ev) override; + virtual void log(const ClientAPI::LogInfo& log) override; + +private: + std::string get_subnet(int prefix_length); + + void *adapter; +}; diff --git a/OpenVPN Tunnel Provider/OpenVPNClient.mm b/OpenVPN Tunnel Provider/OpenVPNClient.mm new file mode 100644 index 0000000..bce62d0 --- /dev/null +++ b/OpenVPN Tunnel Provider/OpenVPNClient.mm @@ -0,0 +1,142 @@ +// +// OpenVPNClient.m +// OpenVPN iOS Client +// +// Created by Sergey Abramchuk on 11.02.17. +// +// + +#import + +#import +#import + +#import "OpenVPNAdapter+Client.h" + +#import "OpenVPNClient.h" + + +OpenVPNClient::OpenVPNClient(void *adapter) : ClientAPI::OpenVPNClient() { + this->adapter = adapter; +} + +bool OpenVPNClient::tun_builder_new() { + return [(__bridge OpenVPNAdapter *)adapter configureSockets]; +} + +bool OpenVPNClient::tun_builder_set_remote_address(const std::string &address, bool ipv6) { + NSString *remoteAddress = [NSString stringWithUTF8String:address.c_str()]; + return [(__bridge OpenVPNAdapter *)adapter setRemoteAddress:remoteAddress]; +} + +bool OpenVPNClient::tun_builder_add_address(const std::string &address, int prefix_length, const std::string &gateway, bool ipv6, bool net30) { + NSString *localAddress = [NSString stringWithUTF8String:address.c_str()]; + NSString *subnet = [NSString stringWithUTF8String:get_subnet(prefix_length).c_str()]; + NSString *gatewayAddress = [NSString stringWithUTF8String:gateway.c_str()]; + + return [(__bridge OpenVPNAdapter *)adapter addLocalAddress:localAddress subnet:subnet gateway:gatewayAddress]; +} + +bool OpenVPNClient::tun_builder_reroute_gw(bool ipv4, bool ipv6, unsigned int flags) { + return true; +} + +bool OpenVPNClient::tun_builder_add_route(const std::string& address, int prefix_length, int metric, bool ipv6) { + NSString *route = [NSString stringWithUTF8String:address.c_str()]; + NSString *subnet = [NSString stringWithUTF8String:get_subnet(prefix_length).c_str()]; + + return [(__bridge OpenVPNAdapter *)adapter addRoute:route subnet:subnet]; +} + +bool OpenVPNClient::tun_builder_exclude_route(const std::string& address, int prefix_length, int metric, bool ipv6) { + NSString *route = [NSString stringWithUTF8String:address.c_str()]; + NSString *subnet = [NSString stringWithUTF8String:get_subnet(prefix_length).c_str()]; + + return [(__bridge OpenVPNAdapter *)adapter excludeRoute:route subnet:subnet]; +} + +bool OpenVPNClient::tun_builder_add_dns_server(const std::string& address, bool ipv6) { + return [(__bridge OpenVPNAdapter *)adapter addDNSAddress:[NSString stringWithUTF8String:address.c_str()]]; +} + +bool OpenVPNClient::tun_builder_add_search_domain(const std::string& domain) { + return [(__bridge OpenVPNAdapter *)adapter addSearchDomain:[NSString stringWithUTF8String:domain.c_str()]]; +} + +bool OpenVPNClient::tun_builder_set_mtu(int mtu) { + [(__bridge OpenVPNAdapter *)adapter setMTU:mtu]; + return true; +} + +bool OpenVPNClient::tun_builder_set_session_name(const std::string& name) { + return true; +} + +bool OpenVPNClient::tun_builder_add_proxy_bypass(const std::string& bypass_host) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_auto_config_url(const std::string& url) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_http(const std::string& host, int port) { + return true; +} + +bool OpenVPNClient::tun_builder_set_proxy_https(const std::string& host, int port) { + return true; +} + +bool OpenVPNClient::tun_builder_add_wins_server(const std::string& address) { + return true; +} + +int OpenVPNClient::tun_builder_establish() { + return (int)[(__bridge OpenVPNAdapter *)adapter establishTunnel]; +} + +bool OpenVPNClient::tun_builder_persist() { + return true; +} + +void OpenVPNClient::tun_builder_establish_lite() { + +} + +void OpenVPNClient::tun_builder_teardown(bool disconnect) { + +} + +bool OpenVPNClient::socket_protect(int socket) { + return true; +} + +void OpenVPNClient::external_pki_cert_request(ClientAPI::ExternalPKICertRequest& certreq) { } +void OpenVPNClient::external_pki_sign_request(ClientAPI::ExternalPKISignRequest& signreq) { } + +bool OpenVPNClient::pause_on_connection_timeout() { + return false; +} + +void OpenVPNClient::event(const ClientAPI::Event& ev) { + [(__bridge OpenVPNAdapter *)adapter handleEvent:&ev]; +} + +void OpenVPNClient::log(const ClientAPI::LogInfo& log) { + [(__bridge OpenVPNAdapter *)adapter handleLog:&log]; +} + +std::string OpenVPNClient::get_subnet(int prefix_length) { + uint32_t bitmask = UINT_MAX << (sizeof(uint32_t) * 8 - prefix_length); + + uint8_t first = (bitmask >> 24) & 0xFF; + uint8_t second = (bitmask >> 16) & 0xFF; + uint8_t third = (bitmask >> 8) & 0xFF; + uint8_t fourth = bitmask & 0xFF; + + std::stringstream stream; + stream << std::to_string(first) << "." << std::to_string(second) << "." << std::to_string(third) << "." << std::to_string(fourth); + + return stream.str(); +}