From d4fc4b0847487507146ae7b0186f218e584dac06 Mon Sep 17 00:00:00 2001 From: David Woodhouse Date: Thu, 11 May 2023 16:08:53 +0100 Subject: [PATCH] Attempt to spawn browser on Windows Fixes: #553 Signed-off-by: David Woodhouse --- configure.ac | 8 +++++--- hpke.c | 23 ++++++++++++++++++++++- www/changelog.xml | 1 + 3 files changed, 28 insertions(+), 4 deletions(-) diff --git a/configure.ac b/configure.ac index 62a64d47..b8f985a4 100644 --- a/configure.ac +++ b/configure.ac @@ -73,7 +73,7 @@ case $host_os in system_pcsc_cflags= AC_CHECK_TOOL([WINDRES], [windres], []) AC_CHECK_TOOL([MAKENSIS], [makensis], []) - default_browser= + default_browser=open case $host_cpu in x86_64|amd64) @@ -135,7 +135,9 @@ AC_ARG_WITH([external-browser], [command to use for spawning external web browser])]) if test "$with_external_browser" = "yes" || test "$with_external_browser" = ""; then - if test "$default_browser" != ""; then + if test "$have_win" != ""; then + with_external_browser=${default_browser} + elif test "$default_browser" != ""; then AC_MSG_CHECKING([for ${default_browser}]) AC_PATH_PROG(with_external_browser, ${default_browser}, no) else @@ -143,7 +145,7 @@ if test "$with_external_browser" = "yes" || test "$with_external_browser" = ""; fi fi if test "$with_external_browser" != "no"; then - if test -x "${with_external_browser}"; then + if test -x "${with_external_browser}" -o -n "$have_win"; then AC_DEFINE_UNQUOTED(DEFAULT_EXTERNAL_BROWSER, "${with_external_browser}", [External browser executable]) else AC_MSG_ERROR([${with_external_browser} does not seem to be executable.]) diff --git a/hpke.c b/hpke.c index e95523e4..551ae4c6 100644 --- a/hpke.c +++ b/hpke.c @@ -77,6 +77,27 @@ static int spawn_browser(struct openconnect_info *vpninfo) return ret; } +#elif defined(_WIN32) +static int spawn_browser(struct openconnect_info *vpninfo) +{ + HINSTANCE rv; + char *errstr; + + vpn_progress(vpninfo, PRG_TRACE, _("Spawning external browser '%s'\n"), + vpninfo->external_browser); + + rv = ShellExecute(NULL, vpninfo->external_browser, vpninfo->sso_login, + NULL, NULL, SW_SHOWNORMAL); + + if ((intptr_t)rv > 32) + return 0; + + errstr = openconnect__win32_strerror(GetLastError()); + vpn_progress(vpninfo, PRG_ERR, "Failed to spawn browser: %s\n", + errstr); + free(errstr); + return -EIO; +} #endif /* @@ -136,7 +157,7 @@ int handle_external_browser(struct openconnect_info *vpninfo) /* Now that we are listening on the socket, we can spawn the browser */ if (vpninfo->open_ext_browser) { ret = vpninfo->open_ext_browser(vpninfo, vpninfo->sso_login, vpninfo->cbdata); -#ifdef HAVE_POSIX_SPAWN +#if defined(HAVE_POSIX_SPAWN) || defined(_WIN32) } else if (vpninfo->external_browser) { ret = spawn_browser(vpninfo); #endif diff --git a/www/changelog.xml b/www/changelog.xml index b52085a4..3ed0f6c7 100644 --- a/www/changelog.xml +++ b/www/changelog.xml @@ -15,6 +15,7 @@