Pass basic configuration vpn to the adapter

This commit is contained in:
Sergey Abramchuk
2017-02-11 15:25:28 +03:00
parent 471f365b45
commit a957e0488e
2 changed files with 211 additions and 0 deletions
+69
View File
@@ -0,0 +1,69 @@
//
// OpenVPNClient+Internal.h
// OpenVPN iOS Client
//
// Created by Sergey Abramchuk on 11.02.17.
//
//
#import <openvpn/client/ovpncli.hpp>
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;
};
+142
View File
@@ -0,0 +1,142 @@
//
// OpenVPNClient.m
// OpenVPN iOS Client
//
// Created by Sergey Abramchuk on 11.02.17.
//
//
#import <sstream>
#import <Foundation/Foundation.h>
#import <NetworkExtension/NetworkExtension.h>
#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();
}