Compared this code code with corresponding patch to master and ensured that only changes are using swprintf+manually adding null terminator instead of openvpn_swprintf.
Compiled with MinGW. Acked-by: Lev Stipakov <lstipa...@gmail.com> ke 19. helmik. 2020 klo 3.55 selva.n...@gmail.com kirjoitti: > > From: Selva Nair <selva.n...@gmail.com> > > Check the config file location and command line options first > and membership in OpenVPNAdministrators group after that as > the latter could be a slow process for active directory users. > > When connection to domain controllers is poor or unavailable, checking > the group membership is slow and causes timeouts in the GUI (Trac > 1051). However, in cases where the config is in the global directory, > no group membership check should be required. The re-ordering here > avoids the redundant check in such cases. > > In addition to this, its also proposed to improve the timeout handling > in the GUI, but this change is still useful as it should completely > eliminate the timeout issue for many users. > > v3: Do not send error message to the client pipe from ValidateOptions(). > Instead save the error and send it on only if user authorization also > fails. The error buffer size is increased to 512 wide chars as these > messages could get long in some cases and may get truncated otherwise. > > Also see: https://github.com/OpenVPN/openvpn-gui/issues/332 > > Signed-off-by: Selva Nair <selva.n...@gmail.com> > --- > cherry-picked from commit c6cc66a13568dd1078bfbeb763998c1b9e2a2999 > with one change: > - openvpn_swprintf() -> swprintf() as the latter is not readily accessible > here in 2.4 > > src/openvpnserv/interactive.c | 39 ++++++++++++++++++++++----------------- > 1 file changed, 22 insertions(+), 17 deletions(-) > > diff --git a/src/openvpnserv/interactive.c b/src/openvpnserv/interactive.c > index d7c9eea..a2b3b20 100644 > --- a/src/openvpnserv/interactive.c > +++ b/src/openvpnserv/interactive.c > @@ -360,14 +360,13 @@ ReturnOpenvpnOutput(HANDLE pipe, HANDLE ovpn_output, > DWORD count, LPHANDLE event > /* > * Validate options against a white list. Also check the config_file is > * inside the config_dir. The white list is defined in validate.c > - * Returns true on success > + * Returns true on success, false on error with reason set in errmsg. > */ > static BOOL > -ValidateOptions(HANDLE pipe, const WCHAR *workdir, const WCHAR *options) > +ValidateOptions(HANDLE pipe, const WCHAR *workdir, const WCHAR *options, > WCHAR *errmsg, DWORD capacity) > { > WCHAR **argv; > int argc; > - WCHAR buf[256]; > BOOL ret = FALSE; > int i; > const WCHAR *msg1 = L"You have specified a config file location (%s > relative to %s)" > @@ -382,8 +381,10 @@ ValidateOptions(HANDLE pipe, const WCHAR *workdir, const > WCHAR *options) > > if (!argv) > { > - ReturnLastError(pipe, L"CommandLineToArgvW"); > - ReturnError(pipe, ERROR_STARTUP_DATA, L"Cannot validate options", 1, > &exit_event); > + swprintf(errmsg, capacity, > + L"Cannot validate options: CommandLineToArgvW failed with > error = 0x%08x", > + GetLastError()); > + errmsg[capacity-1] = L'\0'; > goto out; > } > > @@ -403,10 +404,9 @@ ValidateOptions(HANDLE pipe, const WCHAR *workdir, const > WCHAR *options) > > if (!CheckOption(workdir, 2, argv_tmp, &settings)) > { > - swprintf(buf, _countof(buf), msg1, argv[0], workdir, > + swprintf(errmsg, capacity, msg1, argv[0], workdir, > settings.ovpn_admin_group); > - buf[_countof(buf) - 1] = L'\0'; > - ReturnError(pipe, ERROR_STARTUP_DATA, buf, 1, &exit_event); > + errmsg[capacity-1] = L'\0'; > } > goto out; > } > @@ -422,18 +422,15 @@ ValidateOptions(HANDLE pipe, const WCHAR *workdir, > const WCHAR *options) > { > if (wcscmp(L"--config", argv[i]) == 0 && argc-i > 1) > { > - swprintf(buf, _countof(buf), msg1, argv[i+1], workdir, > + swprintf(errmsg, capacity, msg1, argv[i+1], workdir, > settings.ovpn_admin_group); > - buf[_countof(buf) - 1] = L'\0'; > - ReturnError(pipe, ERROR_STARTUP_DATA, buf, 1, &exit_event); > } > else > { > - swprintf(buf, _countof(buf), msg2, argv[i], > + swprintf(errmsg, capacity, msg2, argv[i], > settings.ovpn_admin_group); > - buf[_countof(buf) - 1] = L'\0'; > - ReturnError(pipe, ERROR_STARTUP_DATA, buf, 1, &exit_event); > } > + errmsg[capacity-1] = L'\0'; > goto out; > } > } > @@ -1367,6 +1364,7 @@ RunOpenvpn(LPVOID p) > WCHAR *cmdline = NULL; > size_t cmdline_size; > undo_lists_t undo_lists; > + WCHAR errmsg[512] = L""; > > SECURITY_ATTRIBUTES inheritable = { > .nLength = sizeof(inheritable), > @@ -1459,10 +1457,17 @@ RunOpenvpn(LPVOID p) > goto out; > } > > - /* Check user is authorized or options are white-listed */ > - if (!IsAuthorizedUser(ovpn_user->User.Sid, imp_token, > settings.ovpn_admin_group) > - && !ValidateOptions(pipe, sud.directory, sud.options)) > + /* > + * Only authorized users are allowed to use any command line options or > + * have the config file in locations other than the global config > directory. > + * > + * Check options are white-listed and config is in the global directory > + * OR user is authorized to run any config. > + */ > + if (!ValidateOptions(pipe, sud.directory, sud.options, errmsg, > _countof(errmsg)) > + && !IsAuthorizedUser(ovpn_user->User.Sid, imp_token, > settings.ovpn_admin_group)) > { > + ReturnError(pipe, ERROR_STARTUP_DATA, errmsg, 1, &exit_event); > goto out; > } > > -- > 2.1.4 > > > > _______________________________________________ > Openvpn-devel mailing list > Openvpn-devel@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/openvpn-devel -- -Lev _______________________________________________ Openvpn-devel mailing list Openvpn-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/openvpn-devel