From 3df26ef189e97201bd0ccf955cce7b5bfb97f592 Mon Sep 17 00:00:00 2001 From: Daniel Molkentin Date: Fri, 5 Jun 2015 08:43:16 +0200 Subject: [PATCH] NSIS: Fix NSIS error handling --- admin/win/nsi/l10n/English.nsh | 1 + admin/win/nsi/l10n/declarations.nsh | 1 + admin/win/nsi/l10n/pofiles/messages.pot | 4 ++ cmake/modules/NSIS.template.in | 78 +++++++++++++------------ 4 files changed, 46 insertions(+), 38 deletions(-) diff --git a/admin/win/nsi/l10n/English.nsh b/admin/win/nsi/l10n/English.nsh index b6237a62a6..81900bbc6f 100644 --- a/admin/win/nsi/l10n/English.nsh +++ b/admin/win/nsi/l10n/English.nsh @@ -42,5 +42,6 @@ StrCpy $UAC_ERROR_ELEVATE "Unable to elevate, error:" StrCpy $UAC_INSTALLER_REQUIRE_ADMIN "This installer requires admin access, try again" StrCpy $INIT_INSTALLER_RUNNING "The installer is already running." StrCpy $UAC_UNINSTALLER_REQUIRE_ADMIN "This uninstaller requires admin access, try again" +StrCpy $UAC_ERROR_LOGON_SERVICE "Logon service is not running, aborting!" StrCpy $INIT_UNINSTALLER_RUNNING "The uninstaller is already running." StrCpy $SectionGroup_Shortcuts "Shortcuts" diff --git a/admin/win/nsi/l10n/declarations.nsh b/admin/win/nsi/l10n/declarations.nsh index b5eb598721..b43a17da67 100644 --- a/admin/win/nsi/l10n/declarations.nsh +++ b/admin/win/nsi/l10n/declarations.nsh @@ -42,5 +42,6 @@ Var UAC_ERROR_ELEVATE Var UAC_INSTALLER_REQUIRE_ADMIN Var INIT_INSTALLER_RUNNING Var UAC_UNINSTALLER_REQUIRE_ADMIN +Var UAC_ERROR_LOGON_SERVICE Var INIT_UNINSTALLER_RUNNING Var SectionGroup_Shortcuts diff --git a/admin/win/nsi/l10n/pofiles/messages.pot b/admin/win/nsi/l10n/pofiles/messages.pot index 330723e032..8cd8b18607 100644 --- a/admin/win/nsi/l10n/pofiles/messages.pot +++ b/admin/win/nsi/l10n/pofiles/messages.pot @@ -198,6 +198,10 @@ msgstr "The installer is already running." msgid "This uninstaller requires admin access, try again" msgstr "This uninstaller requires admin access, try again" +#. UAC_ERROR_LOGON_SERVICE +msgid "Logon service is not running, aborting!" +msgstr "Logon service is not running, aborting!" + #. INIT_UNINSTALLER_RUNNING msgid "The uninstaller is already running." msgstr "The uninstaller is already running." diff --git a/cmake/modules/NSIS.template.in b/cmake/modules/NSIS.template.in index ec8fa1d2af..ae86cdb927 100644 --- a/cmake/modules/NSIS.template.in +++ b/cmake/modules/NSIS.template.in @@ -756,25 +756,26 @@ Function .onInit ${MementoSectionRestore} - UAC_Elevate: - !insertmacro UAC_RunElevated - StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user? - StrCmp 0 $0 0 UAC_Err ; Error? - StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper? - Quit - - UAC_Err: - MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" - Abort - - UAC_ElevationAborted: - Abort - - UAC_Success: - StrCmp 1 $3 +4 ;Admin? - StrCmp 3 $1 0 UAC_ElevationAborted ;Try again? - MessageBox MB_ICONSTOP $UAC_INSTALLER_REQUIRE_ADMIN - goto UAC_Elevate + UAC_TryAgain: + ${Switch} $0 + ${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done + ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on + ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user + MessageBox mb_YesNo|mb_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND $UAC_INSTALLER_REQUIRE_ADMIN /SD IDNO IDYES UAC_TryAgain IDNO 0 + ${EndIf} + ;fall-through and die + ${Case} 1223 + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_INSTALLER_REQUIRE_ADMIN + Quit + ${Case} 1062 + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_ERROR_LOGON_SERVICE + Quit + ${Default} + MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" + Abort + Quit + ${EndSwitch} ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${APPLICATION_SHORTNAME}Installer") i .r1 ?e' @@ -819,25 +820,26 @@ FunctionEnd Function un.onInit Call un.SetLang - UAC_Elevate: - !insertmacro UAC_RunElevated - StrCmp 1223 $0 UAC_ElevationAborted ; UAC dialog aborted by user? - StrCmp 0 $0 0 UAC_Err ; Error? - StrCmp 1 $1 0 UAC_Success ;Are we the real deal or just the wrapper? - Quit - - UAC_Err: - MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" - Abort - - UAC_ElevationAborted: - Abort - - UAC_Success: - StrCmp 1 $3 +4 ;Admin? - StrCmp 3 $1 0 UAC_ElevationAborted ;Try again? - MessageBox MB_ICONSTOP $UAC_UNINSTALLER_REQUIRE_ADMIN - goto UAC_Elevate + UAC_TryAgain: + ${Switch} $0 + ${Case} 0 + ${IfThen} $1 = 1 ${|} Quit ${|} ;we are the outer process, the inner process has done its work, we are done + ${IfThen} $3 <> 0 ${|} ${Break} ${|} ;we are admin, let the show go on + ${If} $1 = 3 ;RunAs completed successfully, but with a non-admin user + MessageBox mb_YesNo|mb_ICONEXCLAMATION|MB_TOPMOST|MB_SETFOREGROUND $UAC_UNINSTALLER_REQUIRE_ADMIN /SD IDNO IDYES UAC_TryAgain IDNO 0 + ${EndIf} + ;fall-through and die + ${Case} 1223 + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_UNINSTALLER_REQUIRE_ADMIN + Quit + ${Case} 1062 + MessageBox MB_ICONSTOP|MB_TOPMOST|MB_SETFOREGROUND $UAC_ERROR_LOGON_SERVICE + Quit + ${Default} + MessageBox MB_ICONSTOP "$UAC_ERROR_ELEVATE $0" + Abort + Quit + ${EndSwitch} ;Prevent multiple instances. System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${APPLICATION_SHORTNAME}Uninstaller") i .r1 ?e'