From 45520e7f6d1074f4878f1d72dbcee8278329a698 Mon Sep 17 00:00:00 2001 From: Lev Stipakov Date: Thu, 26 Dec 2019 16:14:23 +0200 Subject: [PATCH 1/2] Support for openvpn3 This adds optional support for using OpenVPN3 client as an alternative to openvpn2. Just replacing one client with another will not work: - OpenVPN3 doesn't use interactive service, it uses "agent" service with completely different protocol. OpenVPN GUI needs to talk to agent using HTTP and JSON. - OpenVPN3 management interface realtime notifications must be explicitly turned on in order for GUI to work. To enable using openvpn3, one needs to build openvpn-gui with ./configure --enable-ovpn3 option. This also requires json-c library. To switch betweet openvpn2 and openvpn3, see "OpenVPN Engine" radiobutton group in Settings -> Advanced dialog. Management interface - enabled OpenVPN3 client will be added soon to openvpn3 repo (along with existing "cli" test client). Also agent service will be opensourced in near future. Signed-off-by: Lev Stipakov --- Makefile.am | 6 +- configure.ac | 9 +++ manage.c | 7 ++ openvpn-gui-res.h | 3 + openvpn-gui.sln | 6 ++ openvpn-gui.vcxproj | 64 ++++++++++++++++++ openvpn.c | 118 +++++++++++++++++++++++++++------ options.c | 11 +++ options.h | 4 ++ registry.c | 3 +- res/openvpn-gui-res-cs.rc | 4 ++ res/openvpn-gui-res-de.rc | 4 ++ res/openvpn-gui-res-dk.rc | 4 ++ res/openvpn-gui-res-en-msvc.rc | 4 ++ res/openvpn-gui-res-en.rc | 4 ++ res/openvpn-gui-res-es.rc | 4 ++ res/openvpn-gui-res-fi.rc | 4 ++ res/openvpn-gui-res-fr.rc | 4 ++ res/openvpn-gui-res-it.rc | 4 ++ res/openvpn-gui-res-jp.rc | 4 ++ res/openvpn-gui-res-kr.rc | 4 ++ res/openvpn-gui-res-nl.rc | 4 ++ res/openvpn-gui-res-no.rc | 4 ++ res/openvpn-gui-res-pl.rc | 4 ++ res/openvpn-gui-res-pt.rc | 4 ++ res/openvpn-gui-res-ru.rc | 4 ++ res/openvpn-gui-res-se.rc | 4 ++ res/openvpn-gui-res-tr.rc | 4 ++ res/openvpn-gui-res-ua.rc | 4 ++ res/openvpn-gui-res-zh-hans.rc | 4 ++ res/openvpn-gui-res-zh-hant.rc | 4 ++ service.c | 8 ++- 32 files changed, 297 insertions(+), 26 deletions(-) diff --git a/Makefile.am b/Makefile.am index 8301087..dfd548e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -38,7 +38,7 @@ dist_doc_DATA = \ COPYRIGHT.GPL \ COPYING -AM_CPPFLAGS = $(OPENSSL_CRYPTO_CFLAGS) -D_UNICODE +AM_CPPFLAGS = $(OPENSSL_CRYPTO_CFLAGS) -D_UNICODE $(JSON_CFLAGS) AM_CFLAGS = -municode openvpn_gui_RESOURCES = \ @@ -106,7 +106,9 @@ openvpn_gui_LDADD = \ -lnetapi32 \ -lole32 \ -lshlwapi \ - -lsecur32 + -lsecur32 \ + $(JSON_LIBS) openvpn-gui-res.o: $(openvpn_gui_RESOURCES) $(srcdir)/openvpn-gui-res.h $(RCCOMPILE) -i $< -o $@ + diff --git a/configure.ac b/configure.ac index f3387aa..1949155 100644 --- a/configure.ac +++ b/configure.ac @@ -49,6 +49,15 @@ AC_ARG_ENABLE( [enable_password_change="yes"] ) +AC_ARG_ENABLE( + [ovpn3], + [AS_HELP_STRING([--enable-ovpn3], [enable openvpn3 agent and client @<:@default=no@:>@])], + [ + AC_DEFINE([ENABLE_OVPN3], 1, [Use openvpn3 agent instead of interactive service]) + PKG_CHECK_MODULES([JSON], [json-c]) + ] +) + case "$host" in *-mingw*) CPPFLAGS="${CPPFLAGS} -DWIN32_LEAN_AND_MEAN" diff --git a/manage.c b/manage.c index 5489258..fe569c0 100644 --- a/manage.c +++ b/manage.c @@ -271,6 +271,13 @@ OnManagement(SOCKET sk, LPARAM lParam) { ManagementCommand(c, c->manage.password, NULL, regular); *c->manage.password = '\0'; + + if (o.ovpn_engine == OPENVPN_ENGINE_OVPN3) + { + ManagementCommand(c, "log on all", NULL, regular); + ManagementCommand(c, "state on all", NULL, regular); + } + continue; } diff --git a/openvpn-gui-res.h b/openvpn-gui-res.h index 5d33453..9a0b669 100644 --- a/openvpn-gui-res.h +++ b/openvpn-gui-res.h @@ -118,6 +118,9 @@ #define ID_EDT_PRECONNECT_TIMEOUT 282 #define ID_EDT_CONNECT_TIMEOUT 283 #define ID_EDT_DISCONNECT_TIMEOUT 284 +#define ID_RB_ENGINE_SELECTION 285 +#define ID_RB_ENGINE_OVPN2 286 +#define ID_RB_ENGINE_OVPN3 287 /* Connections dialog */ #define ID_DLG_CONNECTIONS 290 diff --git a/openvpn-gui.sln b/openvpn-gui.sln index d1bad55..0718d96 100644 --- a/openvpn-gui.sln +++ b/openvpn-gui.sln @@ -9,12 +9,18 @@ Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|x64 = Debug|x64 Debug|x86 = Debug|x86 + DebugOvpn3|x64 = DebugOvpn3|x64 + DebugOvpn3|x86 = DebugOvpn3|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.ActiveCfg = Debug|x64 {028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x64.Build.0 = Debug|x64 {028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.ActiveCfg = Debug|x64 {028B1211-5625-48F7-B2D7-98C2F1994A70}.Debug|x86.Build.0 = Debug|x64 + {028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x64.ActiveCfg = DebugOvpn3|x64 + {028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x64.Build.0 = DebugOvpn3|x64 + {028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x86.ActiveCfg = DebugOvpn3|Win32 + {028B1211-5625-48F7-B2D7-98C2F1994A70}.DebugOvpn3|x86.Build.0 = DebugOvpn3|Win32 EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/openvpn-gui.vcxproj b/openvpn-gui.vcxproj index d11534f..dd0eb7c 100644 --- a/openvpn-gui.vcxproj +++ b/openvpn-gui.vcxproj @@ -1,6 +1,14 @@ + + DebugOvpn3 + Win32 + + + DebugOvpn3 + x64 + Debug Win32 @@ -29,6 +37,11 @@ true v142 + + Application + true + v142 + Application false @@ -39,6 +52,11 @@ true v142 + + Application + true + v142 + Application false @@ -52,12 +70,18 @@ + + + + + + @@ -65,12 +89,18 @@ true + + true + true false + + false + false @@ -88,6 +118,20 @@ Windows + + + WIN32;_DEBUG;_WINDOWS;%(PreprocessorDefinitions) + MultiThreadedDebugDLL + Level3 + ProgramDatabase + Disabled + + + MachineX86 + true + Windows + + WIN32;NDEBUG;_WINDOWS;%(PreprocessorDefinitions) @@ -123,6 +167,26 @@ copy config-msvc.h config.h + + + WIN32_LEAN_AND_MEAN;UNICODE;_UNICODE;_INC_MATH;_CRT_NON_CONFORMING_WCSTOK;HAVE_CONFIG_H;ENABLE_OVPN3 + + + $(SolutionDir);%(AdditionalIncludeDirectories) + + + $(SolutionDir);%(AdditionalIncludeDirectories) + false + openvpn-gui-res.rc + HAVE_CONFIG_H;_MSC_VER + + + Netapi32.lib;Wtsapi32.lib;Comctl32.lib;Secur32.lib;Ws2_32.lib;Crypt32.lib;Shlwapi.lib;Winhttp.lib;%(AdditionalDependencies) + + + copy config-msvc.h config.h + + copy config-msvc.h config.h diff --git a/openvpn.c b/openvpn.c index f0c4c8b..d8b7272 100644 --- a/openvpn.c +++ b/openvpn.c @@ -35,6 +35,10 @@ #include #include +#ifdef ENABLE_OVPN3 +#include +#endif + #include "tray.h" #include "main.h" #include "openvpn.h" @@ -51,6 +55,9 @@ #include "save_pass.h" #include "env_set.h" +#define OPENVPN_SERVICE_PIPE_NAME_OVPN2 L"\\\\.\\pipe\\openvpn\\service" +#define OPENVPN_SERVICE_PIPE_NAME_OVPN3 L"\\\\.\\pipe\\ovpnagent" + extern options_t o; static BOOL @@ -1316,7 +1323,8 @@ CloseServiceIO (service_io_t *s) static BOOL InitServiceIO (service_io_t *s) { - DWORD dwMode = PIPE_READMODE_MESSAGE; + DWORD dwMode = o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? PIPE_READMODE_BYTE : PIPE_READMODE_MESSAGE; + CLEAR(*s); /* auto-reset event used for signalling i/o completion*/ @@ -1326,8 +1334,9 @@ InitServiceIO (service_io_t *s) return FALSE; } - s->pipe = CreateFile(_T("\\\\.\\pipe\\openvpn\\service"), - GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); + s->pipe = CreateFile (o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? + OPENVPN_SERVICE_PIPE_NAME_OVPN3 : OPENVPN_SERVICE_PIPE_NAME_OVPN2, + GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if ( !s->pipe || s->pipe == INVALID_HANDLE_VALUE || @@ -1861,6 +1870,57 @@ SetProcessPriority(DWORD *priority) return TRUE; } +#ifdef ENABLE_OVPN3 +inline static +struct json_object* json_object_new_utf16_string(wchar_t *utf16) +{ + DWORD input_size = WideCharToMultiByte(CP_UTF8, 0, utf16, -1, NULL, 0, NULL, NULL); + struct json_object* jobj = NULL; + char *utf8 = malloc(input_size); + if (!utf8) + { + goto out; + } + + WideCharToMultiByte(CP_UTF8, 0, utf16, -1, utf8, input_size, NULL, NULL); + + jobj = json_object_new_string(utf8); + free(utf8); + +out: + return jobj; +} + +static char* PrepareStartJsonRequest(connection_t *c, wchar_t *exit_event_name) +{ + const char *request_header = "POST /start HTTP/1.1\r\nContent-Type: application/json\r\nContent-Length: %zd\r\n\r\n"; + json_object *jobj = json_object_new_object(); + + json_object_object_add(jobj, "config_file", json_object_new_utf16_string(c->config_file)); + json_object_object_add(jobj, "config_dir", json_object_new_utf16_string(c->config_dir)); + json_object_object_add(jobj, "exit_event_name", json_object_new_utf16_string(exit_event_name)); + json_object_object_add(jobj, "management_password", json_object_new_string(c->manage.password)); + json_object_object_add(jobj, "management_host", json_object_new_string(inet_ntoa(c->manage.skaddr.sin_addr))); + json_object_object_add(jobj, "management_port", json_object_new_int(ntohs(c->manage.skaddr.sin_port))); + json_object_object_add(jobj, "log", json_object_new_utf16_string(c->log_path)); + json_object_object_add(jobj, "log-append", json_object_new_int(o.log_append)); + + const char *body = json_object_to_json_string(jobj); + + char *request = calloc(1, strlen(request_header) + strlen(body) + 1); + if (request == NULL) + { + goto out; + } + sprintf(request, request_header, strlen(body)); + strcat(request, body); + +out: + json_object_put(jobj); + return request; +} +#endif + /* * Launch an OpenVPN process and the accompanying thread to monitor it */ @@ -1928,28 +1988,44 @@ StartOpenVPN(connection_t *c) /* Try to open the service pipe */ if (!IsUserAdmin() && InitServiceIO (&c->iserv)) { - DWORD size = _tcslen(c->config_dir) + _tcslen(options) + sizeof(c->manage.password) + 3; - TCHAR startup_info[1024]; + BOOL res = FALSE; - if ( !AuthorizeConfig(c)) + if (o.ovpn_engine == OPENVPN_ENGINE_OVPN3) { - CloseHandle(c->exit_event); - CloseServiceIO(&c->iserv); - goto out; +#ifdef ENABLE_OVPN3 + char *request = PrepareStartJsonRequest(c, exit_event_name); + + res = (request != NULL) && WritePipe(c->iserv.pipe, request, strlen(request)); + free(request); +#endif + } + else + { + DWORD size = _tcslen(c->config_dir) + _tcslen(options) + sizeof(c->manage.password) + 3; + TCHAR startup_info[1024]; + + if (!AuthorizeConfig(c)) + { + CloseHandle(c->exit_event); + CloseServiceIO(&c->iserv); + goto out; + } + + c->hProcess = NULL; + c->manage.password[sizeof(c->manage.password) - 1] = '\n'; + + /* Ignore pushed route-method when service is in use */ + const wchar_t* extra_options = L" --pull-filter ignore route-method"; + size += wcslen(extra_options); + + _sntprintf_0(startup_info, L"%s%c%s%s%c%.*S", c->config_dir, L'\0', + options, extra_options, L'\0', sizeof(c->manage.password), c->manage.password); + c->manage.password[sizeof(c->manage.password) - 1] = '\0'; + + res = WritePipe(c->iserv.pipe, startup_info, size * sizeof(TCHAR)); } - c->hProcess = NULL; - c->manage.password[sizeof(c->manage.password) - 1] = '\n'; - - /* Ignore pushed route-method when service is in use */ - const wchar_t *extra_options = L" --pull-filter ignore route-method"; - size += wcslen(extra_options); - - _sntprintf_0(startup_info, L"%s%c%s%s%c%.*S", c->config_dir, L'\0', - options, extra_options, L'\0', sizeof(c->manage.password), c->manage.password); - c->manage.password[sizeof(c->manage.password) - 1] = '\0'; - - if (!WritePipe(c->iserv.pipe, startup_info, size * sizeof (TCHAR))) + if (!res) { ShowLocalizedMsg (IDS_ERR_WRITE_SERVICE_PIPE); CloseHandle(c->exit_event); diff --git a/options.c b/options.c index fbbcd87..21bcaf3 100644 --- a/options.c +++ b/options.c @@ -540,6 +540,9 @@ SaveAdvancedDlgParams (HWND hdlg) tmp = GetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, &status, FALSE); if (status && tmp > 0) o.disconnectscript_timeout = tmp; + o.ovpn_engine = IsDlgButtonChecked(hdlg, ID_RB_ENGINE_OVPN3) ? + OPENVPN_ENGINE_OVPN3 : OPENVPN_ENGINE_OVPN2; + SaveRegistryKeys (); ExpandOptions (); @@ -555,6 +558,14 @@ LoadAdvancedDlgParams (HWND hdlg) SetDlgItemInt (hdlg, ID_EDT_PRECONNECT_TIMEOUT, o.preconnectscript_timeout, FALSE); SetDlgItemInt (hdlg, ID_EDT_CONNECT_TIMEOUT, o.connectscript_timeout, FALSE); SetDlgItemInt (hdlg, ID_EDT_DISCONNECT_TIMEOUT, o.disconnectscript_timeout, FALSE); +#ifdef ENABLE_OVPN3 + CheckRadioButton(hdlg, ID_RB_ENGINE_OVPN2, ID_RB_ENGINE_OVPN3, + o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? ID_RB_ENGINE_OVPN3 : ID_RB_ENGINE_OVPN2); +#else + ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_SELECTION), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_OVPN2), SW_HIDE); + ShowWindow(GetDlgItem(hdlg, ID_RB_ENGINE_OVPN3), SW_HIDE); +#endif } INT_PTR CALLBACK diff --git a/options.h b/options.h index c523f6f..f767b38 100644 --- a/options.h +++ b/options.h @@ -92,6 +92,9 @@ typedef struct { #define CONFIG_VIEW_FLAT (1) #define CONFIG_VIEW_NESTED (2) +#define OPENVPN_ENGINE_OVPN2 (0) +#define OPENVPN_ENGINE_OVPN3 (1) + typedef struct { unsigned short major, minor, build, revision; } version_t; @@ -203,6 +206,7 @@ typedef struct { DWORD disconnectscript_timeout; /* Disconnect Script execution timeout (sec) */ DWORD preconnectscript_timeout; /* Preconnect Script execution timeout (sec) */ DWORD config_menu_view; /* 0 for auto, 1 for original flat menu, 2 for hierarchical */ + DWORD ovpn_engine; /* 0 - openvpn2, 1 - openvpn3 */ #ifdef DEBUG FILE *debug_fp; diff --git a/registry.c b/registry.c index e65ed61..b0a0a51 100644 --- a/registry.c +++ b/registry.c @@ -61,7 +61,8 @@ struct regkey_int { {L"disconnectscript_timeout", &o.disconnectscript_timeout, 10}, {L"show_script_window", &o.show_script_window, 0}, {L"service_only", &o.service_only, 0}, - {L"config_menu_view", &o.config_menu_view, CONFIG_VIEW_AUTO} + {L"config_menu_view", &o.config_menu_view, CONFIG_VIEW_AUTO}, + {L"ovpn_engine", &o.ovpn_engine, OPENVPN_ENGINE_OVPN2} }; static int diff --git a/res/openvpn-gui-res-cs.rc b/res/openvpn-gui-res-cs.rc index 0c16b17..f9a7c72 100644 --- a/res/openvpn-gui-res-cs.rc +++ b/res/openvpn-gui-res-cs.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-de.rc b/res/openvpn-gui-res-de.rc index adf5152..3e53072 100644 --- a/res/openvpn-gui-res-de.rc +++ b/res/openvpn-gui-res-de.rc @@ -192,6 +192,10 @@ BEGIN EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER LTEXT "&Disconnect-Skript Timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10 EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-dk.rc b/res/openvpn-gui-res-dk.rc index 2558e06..9e4e40a 100644 --- a/res/openvpn-gui-res-dk.rc +++ b/res/openvpn-gui-res-dk.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-en-msvc.rc b/res/openvpn-gui-res-en-msvc.rc index 8794ca7..e31a35a 100644 --- a/res/openvpn-gui-res-en-msvc.rc +++ b/res/openvpn-gui-res-en-msvc.rc @@ -191,6 +191,10 @@ BEGIN EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10 EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-en.rc b/res/openvpn-gui-res-en.rc index ffc583f..96726a7 100644 --- a/res/openvpn-gui-res-en.rc +++ b/res/openvpn-gui-res-en.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER LTEXT "&Disconnect script timeout:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10 EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-es.rc b/res/openvpn-gui-res-es.rc index 23286f2..364c0f0 100644 --- a/res/openvpn-gui-res-es.rc +++ b/res/openvpn-gui-res-es.rc @@ -191,6 +191,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-fi.rc b/res/openvpn-gui-res-fi.rc index 50729bd..64f389e 100644 --- a/res/openvpn-gui-res-fi.rc +++ b/res/openvpn-gui-res-fi.rc @@ -192,6 +192,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-fr.rc b/res/openvpn-gui-res-fr.rc index 3b8032a..a3ae115 100644 --- a/res/openvpn-gui-res-fr.rc +++ b/res/openvpn-gui-res-fr.rc @@ -192,6 +192,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-it.rc b/res/openvpn-gui-res-it.rc index 02697fe..22430a9 100644 --- a/res/openvpn-gui-res-it.rc +++ b/res/openvpn-gui-res-it.rc @@ -164,6 +164,10 @@ BEGIN AUTORADIOBUTTON "Alla &connessione", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP AUTORADIOBUTTON "Alla connessione/&riconnessione", ID_RB_BALLOON2, 86, 155, 90, 10 AUTORADIOBUTTON "&Mai", ID_RB_BALLOON0, 181, 155, 40, 10 + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* Advanced Dialog */ diff --git a/res/openvpn-gui-res-jp.rc b/res/openvpn-gui-res-jp.rc index 44c8443..80e042c 100644 --- a/res/openvpn-gui-res-jp.rc +++ b/res/openvpn-gui-res-jp.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 143, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 143, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 143, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-kr.rc b/res/openvpn-gui-res-kr.rc index 5eec89e..3439a49 100644 --- a/res/openvpn-gui-res-kr.rc +++ b/res/openvpn-gui-res-kr.rc @@ -194,6 +194,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-nl.rc b/res/openvpn-gui-res-nl.rc index ccdc1eb..b77d727 100644 --- a/res/openvpn-gui-res-nl.rc +++ b/res/openvpn-gui-res-nl.rc @@ -163,6 +163,10 @@ BEGIN AUTORADIOBUTTON "Bij verbinden", ID_RB_BALLOON1, 28, 155, 50, 10, WS_GROUP | WS_TABSTOP AUTORADIOBUTTON "Bij opnieuw verbinden", ID_RB_BALLOON2, 86, 155, 90, 10 AUTORADIOBUTTON "Nooit", ID_RB_BALLOON0, 181, 155, 40, 10 + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* Advanced Dialog */ diff --git a/res/openvpn-gui-res-no.rc b/res/openvpn-gui-res-no.rc index eac2348..68676fe 100644 --- a/res/openvpn-gui-res-no.rc +++ b/res/openvpn-gui-res-no.rc @@ -192,6 +192,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-pl.rc b/res/openvpn-gui-res-pl.rc index 97ccf00..71df4af 100644 --- a/res/openvpn-gui-res-pl.rc +++ b/res/openvpn-gui-res-pl.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-pt.rc b/res/openvpn-gui-res-pt.rc index 3db1e74..73f6d0a 100644 --- a/res/openvpn-gui-res-pt.rc +++ b/res/openvpn-gui-res-pt.rc @@ -191,6 +191,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-ru.rc b/res/openvpn-gui-res-ru.rc index d4e4f98..543e7c6 100644 --- a/res/openvpn-gui-res-ru.rc +++ b/res/openvpn-gui-res-ru.rc @@ -194,6 +194,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-se.rc b/res/openvpn-gui-res-se.rc index 7657e85..f26a12c 100644 --- a/res/openvpn-gui-res-se.rc +++ b/res/openvpn-gui-res-se.rc @@ -191,6 +191,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-tr.rc b/res/openvpn-gui-res-tr.rc index e1595be..fdb4539 100644 --- a/res/openvpn-gui-res-tr.rc +++ b/res/openvpn-gui-res-tr.rc @@ -193,6 +193,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-ua.rc b/res/openvpn-gui-res-ua.rc index 599efdc..5e19250 100644 --- a/res/openvpn-gui-res-ua.rc +++ b/res/openvpn-gui-res-ua.rc @@ -192,6 +192,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 123, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 123, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 123, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-zh-hans.rc b/res/openvpn-gui-res-zh-hans.rc index d7df8ae..bfcc33f 100644 --- a/res/openvpn-gui-res-zh-hans.rc +++ b/res/openvpn-gui-res-zh-hans.rc @@ -195,6 +195,10 @@ BEGIN EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER LTEXT "断开连接时脚本超时时间:", ID_TXT_DISCONNECT_TIMEOUT, 17, 140, 90, 10 EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/res/openvpn-gui-res-zh-hant.rc b/res/openvpn-gui-res-zh-hant.rc index bd7ef53..c520ca2 100644 --- a/res/openvpn-gui-res-zh-hant.rc +++ b/res/openvpn-gui-res-zh-hant.rc @@ -195,6 +195,10 @@ BEGIN EDITTEXT ID_EDT_PRECONNECT_TIMEOUT, 103, 108, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_CONNECT_TIMEOUT, 103, 123, 20, 12, ES_AUTOHSCROLL|ES_NUMBER EDITTEXT ID_EDT_DISCONNECT_TIMEOUT, 103, 138, 20, 12, ES_AUTOHSCROLL|ES_NUMBER + + GROUPBOX "OpenVPN Engine", ID_RB_ENGINE_SELECTION, 6, 162, 235, 30 + AUTORADIOBUTTON "openvpn2", ID_RB_ENGINE_OVPN2, 18, 175, 50, 10, WS_GROUP | WS_TABSTOP + AUTORADIOBUTTON "openvpn3 (experimental)", ID_RB_ENGINE_OVPN3, 76, 175, 90, 10 END /* About Dialog */ diff --git a/service.c b/service.c index 5843cd9..b30fc3b 100644 --- a/service.c +++ b/service.c @@ -35,6 +35,9 @@ #include "openvpn-gui-res.h" #include "localization.h" +#define OPENVPN_SERVICE_NAME_OVPN3 L"ovpnagent" +#define OPENVPN_SERVICE_NAME_OVPN2 L"OpenVPNServiceInteractive" + extern options_t o; int MyStartService() @@ -265,8 +268,9 @@ CheckIServiceStatus(BOOL warn) if (NULL == schSCManager) return(false); - schService = OpenService(schSCManager, _T("OpenVPNServiceInteractive"), - SERVICE_QUERY_STATUS); + schService = OpenService(schSCManager, o.ovpn_engine == OPENVPN_ENGINE_OVPN3 ? + OPENVPN_SERVICE_NAME_OVPN3 : OPENVPN_SERVICE_NAME_OVPN2, SERVICE_QUERY_STATUS); + if (schService == NULL && GetLastError() == ERROR_SERVICE_DOES_NOT_EXIST) { From e0dc6d85b47a392af795f214a1ebfc4a2605167d Mon Sep 17 00:00:00 2001 From: Lev Stipakov Date: Tue, 7 Jan 2020 09:48:16 +0200 Subject: [PATCH 2/2] travis: add build with ovpn3 enabled Signed-off-by: Lev Stipakov --- .travis-build-jsonc.sh | 22 ++++++++++++++++++++++ .travis.yml | 7 ++++++- 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100755 .travis-build-jsonc.sh diff --git a/.travis-build-jsonc.sh b/.travis-build-jsonc.sh new file mode 100755 index 0000000..0749f05 --- /dev/null +++ b/.travis-build-jsonc.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +set -e + +git clone https://github.com/json-c/json-c.git +cd json-c + +mkdir build && cd build +cmake -DBUILD_SHARED_LIBS=False -DDISABLE_WERROR=True -DCMAKE_INSTALL_PREFIX=/usr/local/i686-w64-mingw32 -DCMAKE_C_COMPILER=i686-w64-mingw32-gcc -DCMAKE_SYSTEM_NAME="Windows" .. +make V=1 +sudo make install + +cd .. && rm -rf build + +mkdir build && cd build +cmake -DBUILD_SHARED_LIBS=False -DDISABLE_WERROR=True -DCMAKE_INSTALL_PREFIX=/usr/local/x86_64-w64-mingw32 -DCMAKE_C_COMPILER=x86_64-w64-mingw32-gcc -DCMAKE_SYSTEM_NAME="Windows" .. +make V=1 +sudo make install + +cd .. && rm -rf build + +cd .. diff --git a/.travis.yml b/.travis.yml index 93b9e12..3b33c8f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -16,6 +16,10 @@ matrix: env: CHOST=i686-w64-mingw32 CONFIG="" - compiler: gcc env: CHOST=x86_64-w64-mingw32 CONFIG="" + - compiler: gcc + env: CHOST=i686-w64-mingw32 CONFIG="--enable-ovpn3" + - compiler: gcc + env: CHOST=x86_64-w64-mingw32 CONFIG="--enable-ovpn3" - compiler: gcc env: CHOST=i686-w64-mingw32 CONFIG="--disable-password-change" - compiler: gcc @@ -25,13 +29,14 @@ matrix: addons: apt: - packages: [ gcc-mingw-w64 ] + packages: [ gcc-mingw-w64, mingw-w64-tools, doxygen ] before_script: - unset CC; unset CXX script: - if [[ $CONFIG != *"--disable-password-change"* ]]; then . .travis-build-openssl.sh; fi + - if [[ $CONFIG == *"--enable-ovpn3"* ]]; then . .travis-build-jsonc.sh; fi - autoreconf -i -v - ./configure --prefix=/ --libdir=/lib --host=$CHOST --build=x86_64-pc-linux-gnu --program-prefix='' $CONFIG && make # build from tarball