install-win32/openvpn.nsi
6fbf66fa
 ; ****************************************************************************
564a2109
 ; * Copyright (C) 2002-2010 OpenVPN Technologies, Inc.                            *
6fbf66fa
 ; *  This program is free software; you can redistribute it and/or modify    *
 ; *  it under the terms of the GNU General Public License version 2          *
 ; *  as published by the Free Software Foundation.                           *
 ; ****************************************************************************
 
 ; OpenVPN install script for Windows, using NSIS
 
bb8f4780
 SetCompressor lzma
 
6fbf66fa
 !include "MUI.nsh"
63903a82
 
 !include "defs.nsi"
 !include "guidefs.nsi"
 !include "xguidefs.nsi"
6fbf66fa
 !include "setpath.nsi"
ee313a97
 !include "GetWindowsVersion.nsi"
63c5d785
 
 !ifdef EXTRACT_FILES
 !include "MultiFileExtract.nsi"
 !endif
6fbf66fa
 
63903a82
 !define GEN ".."
 !define BIN "${GEN}\bin"
 !define LIB "${GEN}\lib"
 
cefe973e
 ; Which GUI to use (XGUI has priority).
 ; We will define either USE_XGUI (XML-based version) or
 ; USE_GUI (Mathias Sundman version) but not both.
 !ifdef OPENVPN_XGUI_DEFINED
 !define USE_XGUI
 !else
 !ifdef OPENVPN_GUI_DEFINED
 !define USE_GUI
 !endif
 !endif
 
657ecf14
 !define PRODUCT_ICON "icon.ico"
 
cefe973e
 !ifdef USE_XGUI
 !define XGUI_POSTFIX "X"
 !else
 !define XGUI_POSTFIX ""
 !endif
 
657ecf14
 !ifdef PRODUCT_TAP_DEBUG
cefe973e
 !define DBG_POSTFIX "-DBG"
657ecf14
 !else
cefe973e
 !define DBG_POSTFIX ""
657ecf14
 !endif
6fbf66fa
 
cefe973e
 !define VERSION "${PRODUCT_VERSION}${XGUI_POSTFIX}${DBG_POSTFIX}"
 
657ecf14
 !define TAP "${PRODUCT_TAP_ID}"
6fbf66fa
 !define TAPDRV "${TAP}.sys"
 
 ; Default service settings
 !define SERV_CONFIG_DIR   "$INSTDIR\config"
657ecf14
 !define SERV_CONFIG_EXT   "${PRODUCT_FILE_EXT}"
 !define SERV_EXE_PATH     "$INSTDIR\bin\${PRODUCT_UNIX_NAME}.exe"
6fbf66fa
 !define SERV_LOG_DIR      "$INSTDIR\log"
 !define SERV_PRIORITY     "NORMAL_PRIORITY_CLASS"
 !define SERV_LOG_APPEND   "0"
 
cefe973e
 ; XGUI variables
 !define XGUI_EXE      ovpn-xgui-en.exe
 !define XGUI_TRAY     ovpn-tray.exe
 !define XGUI_XMLSERV  ovpn-xmlserv.exe
 !define XGUI_HTDOCS   htdocs
 
9ca8f3cf
 !define XGUI_AJAX_GUI_NAME       "${PRODUCT_NAME} Ajax GUI"
 !define XGUI_TRANSITION_GUI_NAME "${PRODUCT_NAME} Transitional GUI"
cefe973e
 
6fbf66fa
 ;--------------------------------
 ;Configuration
 
   ;General
 
63903a82
   OutFile "${GEN}\${PRODUCT_UNIX_NAME}-${VERSION}${OUTFILE_LABEL}-install.exe"
6fbf66fa
 
   ShowInstDetails show
   ShowUninstDetails show
 
   ;Folder selection page
   InstallDir "$PROGRAMFILES\${PRODUCT_NAME}"
   
   ;Remember install folder
   InstallDirRegKey HKCU "Software\${PRODUCT_NAME}" ""
 
 ;--------------------------------
 ;Modern UI Configuration
 
   Name "${PRODUCT_NAME} ${VERSION} ${TITLE_LABEL}"
 
657ecf14
   !define MUI_WELCOMEPAGE_TEXT "This wizard will guide you through the installation of ${PRODUCT_NAME}, an Open Source VPN package by James Yonan.\r\n\r\nNote that the Windows version of ${PRODUCT_NAME} will only run on Win 2000, XP, or higher.\r\n\r\n\r\n"
6fbf66fa
 
657ecf14
   !define MUI_COMPONENTSPAGE_TEXT_TOP "Select the components to install/upgrade.  Stop any ${PRODUCT_NAME} processes or the ${PRODUCT_NAME} service if it is running.  All DLLs are installed locally."
6fbf66fa
 
   !define MUI_COMPONENTSPAGE_SMALLDESC
9ca8f3cf
   !ifdef USE_XGUI
     !define MUI_FINISHPAGE_SHOWREADME "http://openvpn.net/"
     !define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
   !else
     !define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\INSTALL-win32.txt"
   !endif
6fbf66fa
   !define MUI_FINISHPAGE_NOAUTOCLOSE
   !define MUI_ABORTWARNING
63903a82
   !define MUI_ICON "${GEN}\images\${PRODUCT_ICON}"
   !define MUI_UNICON "${GEN}\images\${PRODUCT_ICON}"
6fbf66fa
   !define MUI_HEADERIMAGE
63903a82
   !define MUI_HEADERIMAGE_BITMAP "${GEN}\images\install-whirl.bmp"
6fbf66fa
   !define MUI_UNFINISHPAGE_NOAUTOCLOSE
 
   !insertmacro MUI_PAGE_WELCOME
63082c8a
   !insertmacro MUI_PAGE_LICENSE "${GEN}\text\license.txt"
6fbf66fa
   !insertmacro MUI_PAGE_COMPONENTS
   !insertmacro MUI_PAGE_DIRECTORY
   !insertmacro MUI_PAGE_INSTFILES
   !insertmacro MUI_PAGE_FINISH
   
   !insertmacro MUI_UNPAGE_CONFIRM
   !insertmacro MUI_UNPAGE_INSTFILES  
   !insertmacro MUI_UNPAGE_FINISH
 
 
 ;--------------------------------
 ;Languages
  
   !insertmacro MUI_LANGUAGE "English"
   
 ;--------------------------------
 ;Language Strings
 
657ecf14
   LangString DESC_SecOpenVPNUserSpace ${LANG_ENGLISH} "Install ${PRODUCT_NAME} user-space components, including ${PRODUCT_UNIX_NAME}.exe."
6fbf66fa
 
cefe973e
 !ifdef USE_GUI
657ecf14
   LangString DESC_SecOpenVPNGUI ${LANG_ENGLISH} "Install ${PRODUCT_NAME} GUI by Mathias Sundman"
72394778
 !endif
 
cefe973e
 !ifdef USE_XGUI
   LangString DESC_SecOpenVPNXGUI ${LANG_ENGLISH} "Install ${PRODUCT_NAME} XML-based GUI"
 !endif
 
657ecf14
   LangString DESC_SecOpenVPNEasyRSA ${LANG_ENGLISH} "Install ${PRODUCT_NAME} RSA scripts for X509 certificate management."
6fbf66fa
 
   LangString DESC_SecOpenSSLDLLs ${LANG_ENGLISH} "Install OpenSSL DLLs locally (may be omitted if DLLs are already installed globally)."
 
44b3dcc8
   LangString DESC_SecPKCS11DLLs ${LANG_ENGLISH} "Install PKCS#11 helper DLLs locally (may be omitted if DLLs are already installed globally)."
718526e0
 
cefe973e
   LangString DESC_SecTAP ${LANG_ENGLISH} "Install/Upgrade the TAP virtual device driver.  Will not interfere with CIPE."
6fbf66fa
 
657ecf14
   LangString DESC_SecService ${LANG_ENGLISH} "Install the ${PRODUCT_NAME} service wrapper (${PRODUCT_UNIX_NAME}serv.exe)"
6fbf66fa
 
   LangString DESC_SecOpenSSLUtilities ${LANG_ENGLISH} "Install the OpenSSL Utilities (used for generating public/private key pairs)."
 
657ecf14
   LangString DESC_SecAddPath ${LANG_ENGLISH} "Add ${PRODUCT_NAME} executable directory to the current user's PATH."
6fbf66fa
 
657ecf14
   LangString DESC_SecAddShortcuts ${LANG_ENGLISH} "Add ${PRODUCT_NAME} shortcuts to the current user's Start Menu."
6fbf66fa
 
657ecf14
   LangString DESC_SecFileAssociation ${LANG_ENGLISH} "Register ${PRODUCT_NAME} config file association (*.${SERV_CONFIG_EXT})"
6fbf66fa
 
 ;--------------------------------
 ;Reserve Files
   
   ;Things that need to be extracted on first (keep these lines before any File command!)
   ;Only useful for BZIP2 compression
   
63903a82
   ReserveFile "${GEN}\images\install-whirl.bmp"
6fbf66fa
 
 ;--------------------------------
 ;Macros
 
 !macro WriteRegStringIfUndef ROOT SUBKEY KEY VALUE
 Push $R0
 ReadRegStr $R0 "${ROOT}" "${SUBKEY}" "${KEY}"
 StrCmp $R0 "" +1 +2
 WriteRegStr "${ROOT}" "${SUBKEY}" "${KEY}" '${VALUE}'
 Pop $R0
 !macroend
 
 !macro DelRegStringIfUnchanged ROOT SUBKEY KEY VALUE
 Push $R0
 ReadRegStr $R0 "${ROOT}" "${SUBKEY}" "${KEY}"
 StrCmp $R0 '${VALUE}' +1 +2
 DeleteRegValue "${ROOT}" "${SUBKEY}" "${KEY}"
 Pop $R0
 !macroend
 
 !macro DelRegKeyIfUnchanged ROOT SUBKEY VALUE
 Push $R0
 ReadRegStr $R0 "${ROOT}" "${SUBKEY}" ""
 StrCmp $R0 '${VALUE}' +1 +2
 DeleteRegKey "${ROOT}" "${SUBKEY}"
 Pop $R0
 !macroend
 
 !macro DelRegKeyIfEmpty ROOT SUBKEY
 Push $R0
 EnumRegValue $R0 "${ROOT}" "${SUBKEY}" 1
 StrCmp $R0 "" +1 +2
 DeleteRegKey /ifempty "${ROOT}" "${SUBKEY}"
 Pop $R0
 !macroend
 
 ;------------------------------------------
 ;Set reboot flag based on tapinstall return
 
 Function CheckReboot
   IntCmp $R0 1 "" noreboot noreboot
   IntOp $R0 0 & 0
   SetRebootFlag true
   DetailPrint "REBOOT flag set"
  noreboot:
 FunctionEnd
 
 ;--------------------------------
 ;Installer Sections
 
 Function .onInit
   ClearErrors
ee313a97
 
 # Verify that user has admin privs
6fbf66fa
   UserInfo::GetName
   IfErrors ok
   Pop $R0
   UserInfo::GetAccountType
   Pop $R1
   StrCmp $R1 "Admin" ok
657ecf14
     Messagebox MB_OK "Administrator privileges required to install ${PRODUCT_NAME} [$R0/$R1]"
6fbf66fa
     Abort
   ok:
ee313a97
 
ca637afb
 # Delete previous start menu
   RMDir /r $SMPROGRAMS\${PRODUCT_NAME}
 
63c9b497
 !ifdef CHECK_WINDOWS_VERSION
ca637afb
 # Check windows version
ee313a97
   Call GetWindowsVersion
   Pop $1
   StrCmp $1 "2000" goodwinver
   StrCmp $1 "XP" goodwinver
   StrCmp $1 "2003" goodwinver
   StrCmp $1 "VISTA" goodwinver
 
657ecf14
   Messagebox MB_OK "Sorry, ${PRODUCT_NAME} does not currently support Windows $1"
ee313a97
   Abort
 
 goodwinver:
   System::Call "kernel32::GetCurrentProcess() i .s"
   System::Call "kernel32::IsWow64Process(i s, *i .r0)"
   IntCmp $0 0 init32bits
 
   ; we are running on 64-bit windows
   StrCmp $1 "VISTA" vista64bummer
 
657ecf14
 #  Messagebox MB_OK "Sorry, ${PRODUCT_NAME} doesn't currently support 64-bit Windows."
c833aa11
 #  Abort
ee313a97
 
 vista64bummer:
 
657ecf14
 #  Messagebox MB_OK "Sorry, ${PRODUCT_NAME} doesn't currently support 64-bit Vista because Microsoft doesn't allow the installation of 64 bit unsigned drivers."
c833aa11
 #  Abort
ee313a97
 
 init32bits:
 
63c9b497
 !endif
 
6fbf66fa
 FunctionEnd
 
63c9b497
 !ifndef SF_SELECTED
6fbf66fa
 !define SF_SELECTED 1
63c9b497
 !endif
6fbf66fa
 
cefe973e
 ;--------------------
 ;Pre-install section
 
 Section -pre
 
   ; Stop OpenVPN if currently running
   DetailPrint "Previous Service REMOVE (if exists)"
   nsExec::ExecToLog '"$INSTDIR\bin\${PRODUCT_UNIX_NAME}serv.exe" -remove'
   Pop $R0 # return value/error/timeout
 
 !ifdef USE_XGUI
   DetailPrint "Previous XML Service REMOVE (if exists)"
   nsExec::ExecToLog '"$INSTDIR\bin\${XGUI_XMLSERV}" -remove'
   Pop $R0 # return value/error/timeout
 !endif
 
   Sleep 3000
 
 SectionEnd
 
657ecf14
 Section "${PRODUCT_NAME} User-Space Components" SecOpenVPNUserSpace
6fbf66fa
 
   SetOverwrite on
   SetOutPath "$INSTDIR\bin"
 
657ecf14
   File "${BIN}\${PRODUCT_UNIX_NAME}.exe"
6fbf66fa
 
 SectionEnd
 
cefe973e
 !ifdef USE_GUI
657ecf14
 Section "${PRODUCT_NAME} GUI" SecOpenVPNGUI
72394778
 
   SetOverwrite on
   SetOutPath "$INSTDIR\bin"
 
657ecf14
   File "${BIN}\${OPENVPN_GUI}"
72394778
 
 SectionEnd
 !endif
 
cefe973e
 !ifdef USE_XGUI
 Section "${PRODUCT_NAME} XML-based GUI" SecOpenVPNXGUI
 
   SetOverwrite on
 
   SetOutPath "$INSTDIR\bin"
   File "${BIN}\${XGUI_EXE}"
   File "${BIN}\${XGUI_TRAY}"
   File "${BIN}\${XGUI_XMLSERV}"
 
   SetOutPath "$INSTDIR\${XGUI_HTDOCS}"
   File "${GEN}\${XGUI_HTDOCS}\*.*"
 
 SectionEnd
 !endif
 
657ecf14
 Section "${PRODUCT_NAME} RSA Certificate Management Scripts" SecOpenVPNEasyRSA
6fbf66fa
 
   SetOverwrite on
   SetOutPath "$INSTDIR\easy-rsa"
 
63903a82
   File "${GEN}\easy-rsa\openssl.cnf.sample"
   File "${GEN}\easy-rsa\vars.bat.sample"
6fbf66fa
 
63903a82
   File "${GEN}\easy-rsa\init-config.bat"
6fbf66fa
 
63903a82
   File "${GEN}\easy-rsa\README.txt"
   File "${GEN}\easy-rsa\build-ca.bat"
   File "${GEN}\easy-rsa\build-dh.bat"
   File "${GEN}\easy-rsa\build-key-server.bat"
   File "${GEN}\easy-rsa\build-key.bat"
   File "${GEN}\easy-rsa\build-key-pkcs12.bat"
   File "${GEN}\easy-rsa\clean-all.bat"
   File "${GEN}\easy-rsa\index.txt.start"
   File "${GEN}\easy-rsa\revoke-full.bat"
   File "${GEN}\easy-rsa\serial.start"
6fbf66fa
 
 SectionEnd
 
657ecf14
 Section "${PRODUCT_NAME} Service" SecService
6fbf66fa
 
   SetOverwrite on
 
   SetOutPath "$INSTDIR\bin"
657ecf14
   File "${BIN}\${PRODUCT_UNIX_NAME}serv.exe"
6fbf66fa
 
   SetOutPath "$INSTDIR\config"
 
   FileOpen $R0 "$INSTDIR\config\README.txt" w
657ecf14
   FileWrite $R0 "This directory should contain ${PRODUCT_NAME} configuration files$\r$\n"
6fbf66fa
   FileWrite $R0 "each having an extension of .${SERV_CONFIG_EXT}$\r$\n"
   FileWrite $R0 "$\r$\n"
657ecf14
   FileWrite $R0 "When ${PRODUCT_NAME} is started as a service, a separate ${PRODUCT_NAME}$\r$\n"
6fbf66fa
   FileWrite $R0 "process will be instantiated for each configuration file.$\r$\n"
   FileClose $R0
 
   SetOutPath "$INSTDIR\sample-config"
63082c8a
   File "${GEN}\samples\sample.${SERV_CONFIG_EXT}"
   File "${GEN}\samples\client.${SERV_CONFIG_EXT}"
   File "${GEN}\samples\server.${SERV_CONFIG_EXT}"
6fbf66fa
 
   CreateDirectory "$INSTDIR\log"
   FileOpen $R0 "$INSTDIR\log\README.txt" w
657ecf14
   FileWrite $R0 "This directory will contain the log files for ${PRODUCT_NAME}$\r$\n"
6fbf66fa
   FileWrite $R0 "sessions which are being run as a service.$\r$\n"
   FileClose $R0
 
 SectionEnd
 
657ecf14
 Section "${PRODUCT_NAME} File Associations" SecFileAssociation
6fbf66fa
 SectionEnd
 
 Section "OpenSSL DLLs" SecOpenSSLDLLs
 
   SetOverwrite on
   SetOutPath "$INSTDIR\bin"
63082c8a
   File "${LIB}\libeay32.dll"
   File "${LIB}\libssl32.dll"
6fbf66fa
 
 SectionEnd
 
 Section "OpenSSL Utilities" SecOpenSSLUtilities
 
   SetOverwrite on
   SetOutPath "$INSTDIR\bin"
   File "${BIN}\openssl.exe"
 
 SectionEnd
 
718526e0
 Section "PKCS#11 DLLs" SecPKCS11DLLs
 
   SetOverwrite on
   SetOutPath "$INSTDIR\bin"
63082c8a
   File "${LIB}\libpkcs11-helper-1.dll"
718526e0
 
 SectionEnd
 
cefe973e
 Section "TAP Virtual Ethernet Adapter" SecTAP
6fbf66fa
 
   SetOverwrite on
 
   FileOpen $R0 "$INSTDIR\bin\addtap.bat" w
cefe973e
   FileWrite $R0 "rem Add a new TAP virtual ethernet adapter$\r$\n"
6fbf66fa
   FileWrite $R0 '"$INSTDIR\bin\tapinstall.exe" install "$INSTDIR\driver\OemWin2k.inf" ${TAP}$\r$\n'
   FileWrite $R0 "pause$\r$\n"
   FileClose $R0
 
   FileOpen $R0 "$INSTDIR\bin\deltapall.bat" w
cefe973e
   FileWrite $R0 "echo WARNING: this script will delete ALL TAP virtual adapters (use the device manager to delete adapters one at a time)$\r$\n"
6fbf66fa
   FileWrite $R0 "pause$\r$\n"
   FileWrite $R0 '"$INSTDIR\bin\tapinstall.exe" remove ${TAP}$\r$\n'
   FileWrite $R0 "pause$\r$\n"
   FileClose $R0
 
d1270d07
   ; Check if we are running on a 64 bit system.
   System::Call "kernel32::GetCurrentProcess() i .s"
   System::Call "kernel32::IsWow64Process(i s, *i .r0)"
   IntCmp $0 0 tap-32bit
 
 ; tap-64bit:
 
   DetailPrint "We are running on a 64-bit system."
 
464d33ae
   SetOutPath "$INSTDIR\bin"
 
63082c8a
   File "${GEN}\tapinstall\amd64\tapinstall.exe"
464d33ae
 
d1270d07
   SetOutPath "$INSTDIR\driver"
464d33ae
 
63082c8a
   File "${GEN}\driver\amd64\OemWin2k.inf"
   File "${GEN}\driver\amd64\${PRODUCT_TAP_ID}.cat"
   File "${GEN}\driver\amd64\${TAPDRV}"
ee313a97
 
 goto tapend
d1270d07
 
 tap-32bit:
 
   DetailPrint "We are running on a 32-bit system."
 
464d33ae
   SetOutPath "$INSTDIR\bin"
63082c8a
   File "${GEN}\tapinstall\i386\tapinstall.exe"
464d33ae
 
6fbf66fa
   SetOutPath "$INSTDIR\driver"
63082c8a
   File "${GEN}\driver\i386\OemWin2k.inf"
   File "${GEN}\driver\i386\${PRODUCT_TAP_ID}.cat"
   File "${GEN}\driver\i386\${TAPDRV}"
6fbf66fa
 
464d33ae
   tapend:
d1270d07
 
6fbf66fa
 SectionEnd
 
657ecf14
 Section "Add ${PRODUCT_NAME} to PATH" SecAddPath
6fbf66fa
 
   ; remove previously set path (if any)
   Push "$INSTDIR\bin"
   Call RemoveFromPath
 
   ; append our bin directory to end of current user path
   Push "$INSTDIR\bin"
   Call AddToPath
 
 SectionEnd
 
 Section "Add Shortcuts to Start Menu" SecAddShortcuts
 
   SetOverwrite on
657ecf14
   CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
ca637afb
   CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\Documentation"
   WriteINIStr "$SMPROGRAMS\${PRODUCT_NAME}\Documentation\${PRODUCT_NAME} Windows Notes.url" "InternetShortcut" "URL" "http://openvpn.net/INSTALL-win32.html"
   WriteINIStr "$SMPROGRAMS\${PRODUCT_NAME}\Documentation\${PRODUCT_NAME} Manual Page.url" "InternetShortcut" "URL" "http://openvpn.net/man.html"
   WriteINIStr "$SMPROGRAMS\${PRODUCT_NAME}\Documentation\${PRODUCT_NAME} HOWTO.url" "InternetShortcut" "URL" "http://openvpn.net/howto.html"
   WriteINIStr "$SMPROGRAMS\${PRODUCT_NAME}\Documentation\${PRODUCT_NAME} Web Site.url" "InternetShortcut" "URL" "http://openvpn.net/"
657ecf14
   CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe"
6fbf66fa
 
 SectionEnd
 
 ;--------------------
 ;Post-install section
 
 Section -post
 
cefe973e
   SetOverwrite on
 
6fbf66fa
   ; delete old devcon.exe
   Delete "$INSTDIR\bin\devcon.exe"
 
cefe973e
   ; Store README, license, icon
   SetOverwrite on
   SetOutPath $INSTDIR
9ca8f3cf
   !ifndef USE_XGUI
     File "${GEN}\text\INSTALL-win32.txt"
   !endif
cefe973e
   File "${GEN}\text\license.txt"
63903a82
   File "${GEN}\images\${PRODUCT_ICON}"
cefe973e
 
   ; store sample config files
   !ifdef SAMPCONF_DIR
     SetOverwrite on
     SetOutPath "$INSTDIR\config"
   !ifdef SAMPCONF_CONF
63903a82
     File "${GEN}\conf\${SAMPCONF_CONF}"
cefe973e
   !endif
9bf6e9ac
   !ifdef SAMPCONF_CONF2
     File "${GEN}\conf\${SAMPCONF_CONF2}"
   !endif
cefe973e
   !ifdef SAMPCONF_P12
63903a82
     File "${GEN}\conf\${SAMPCONF_P12}"
cefe973e
   !endif
   !ifdef SAMPCONF_TA
63903a82
     File "${GEN}\conf\${SAMPCONF_TA}"
   !endif
   !ifdef SAMPCONF_CA
     File "${GEN}\conf\${SAMPCONF_CA}"
   !endif
   !ifdef SAMPCONF_CRT
     File "${GEN}\conf\${SAMPCONF_CRT}"
   !endif
   !ifdef SAMPCONF_KEY
     File "${GEN}\conf\${SAMPCONF_KEY}"
cefe973e
   !endif
9bf6e9ac
   !ifdef SAMPCONF_DH
     File "${GEN}\conf\${SAMPCONF_DH}"
   !endif
cefe973e
   !endif
 
63c5d785
   ; Try to extract files if present
   !ifdef EXTRACT_FILES
     Push "$INSTDIR"
     Call MultiFileExtract
bb8f4780
     Pop $R0
     IntCmp $R0 0 +3 +1 +1
63c5d785
     DetailPrint "MultiFileExtract Failed status=$R0"
bb8f4780
     goto +2
63c5d785
     DetailPrint "MultiFileExtract Succeeded"
bb8f4780
   !endif
 
6fbf66fa
   ;
cefe973e
   ; install/upgrade TAP driver if selected, using tapinstall.exe
6fbf66fa
   ;
   SectionGetFlags ${SecTAP} $R0
   IntOp $R0 $R0 & ${SF_SELECTED}
   IntCmp $R0 ${SF_SELECTED} "" notap notap
     ; TAP install/update was selected.
     ; Should we install or update?
     ; If tapinstall error occurred, $5 will
     ; be nonzero.
     IntOp $5 0 & 0
     nsExec::ExecToStack '"$INSTDIR\bin\tapinstall.exe" hwids ${TAP}'
     Pop $R0 # return value/error/timeout
     IntOp $5 $5 | $R0
     DetailPrint "tapinstall hwids returned: $R0"
 
     ; If tapinstall output string contains "${TAP}" we assume
     ; that TAP device has been previously installed,
     ; therefore we will update, not install.
     Push "${TAP}"
     Call StrStr
     Pop $R0
 
     IntCmp $5 0 "" tapinstall_check_error tapinstall_check_error
     IntCmp $R0 -1 tapinstall
 
  ;tapupdate:
cefe973e
     DetailPrint "TAP UPDATE"
6fbf66fa
     nsExec::ExecToLog '"$INSTDIR\bin\tapinstall.exe" update "$INSTDIR\driver\OemWin2k.inf" ${TAP}'
     Pop $R0 # return value/error/timeout
     Call CheckReboot
     IntOp $5 $5 | $R0
     DetailPrint "tapinstall update returned: $R0"
     Goto tapinstall_check_error
 
  tapinstall:
cefe973e
     DetailPrint "TAP REMOVE OLD TAP"
ee313a97
 
     nsExec::ExecToLog '"$INSTDIR\bin\tapinstall.exe" remove TAP0801'
6fbf66fa
     Pop $R0 # return value/error/timeout
ee313a97
     DetailPrint "tapinstall remove TAP0801 returned: $R0"
6fbf66fa
 
cefe973e
     DetailPrint "TAP INSTALL (${TAP})"
6fbf66fa
     nsExec::ExecToLog '"$INSTDIR\bin\tapinstall.exe" install "$INSTDIR\driver\OemWin2k.inf" ${TAP}'
     Pop $R0 # return value/error/timeout
     Call CheckReboot
     IntOp $5 $5 | $R0
     DetailPrint "tapinstall install returned: $R0"
 
  tapinstall_check_error:
     DetailPrint "tapinstall cumulative status: $5"
     IntCmp $5 0 notap
cefe973e
     MessageBox MB_OK "An error occurred installing the TAP device driver."
6fbf66fa
 
  notap:
 
   ; Store install folder in registry
657ecf14
   WriteRegStr HKLM SOFTWARE\${PRODUCT_NAME} "" $INSTDIR
6fbf66fa
 
   ; install as a service if requested
   SectionGetFlags ${SecService} $R0
   IntOp $R0 $R0 & ${SF_SELECTED}
   IntCmp $R0 ${SF_SELECTED} "" noserv noserv
 
     ; set registry parameters for openvpnserv	
657ecf14
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "config_dir"  "${SERV_CONFIG_DIR}"
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "config_ext"  "${SERV_CONFIG_EXT}"
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "exe_path"    "${SERV_EXE_PATH}"
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "log_dir"     "${SERV_LOG_DIR}"
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "priority"    "${SERV_PRIORITY}"
     !insertmacro WriteRegStringIfUndef HKLM "SOFTWARE\${PRODUCT_NAME}" "log_append"  "${SERV_LOG_APPEND}"
6fbf66fa
 
cefe973e
     ; install openvpnserv as a service (to be started manually from service control manager)
6fbf66fa
     DetailPrint "Service INSTALL"
657ecf14
     nsExec::ExecToLog '"$INSTDIR\bin\${PRODUCT_UNIX_NAME}serv.exe" -install'
6fbf66fa
     Pop $R0 # return value/error/timeout
 
  noserv:
cefe973e
   !ifdef USE_XGUI
     IfFileExists "$INSTDIR\bin\${XGUI_XMLSERV}" "" fileass
       ; install and automatically start XML service
       DetailPrint "XML Service INSTALL"
       nsExec::ExecToLog '"$INSTDIR\bin\${XGUI_XMLSERV}" -install'
       Pop $R0 # return value/error/timeout
 
       Sleep 2000
 
       DetailPrint "XML Service START"
       nsExec::ExecToLog '"$INSTDIR\bin\${XGUI_XMLSERV}" -start'
       Pop $R0 # return value/error/timeout
6fbf66fa
 
ca637afb
   !endif
2f775b1a
 
6fbf66fa
   ; Create file association if requested
cefe973e
  fileass:
6fbf66fa
   SectionGetFlags ${SecFileAssociation} $R0
   IntOp $R0 $R0 & ${SF_SELECTED}
   IntCmp $R0 ${SF_SELECTED} "" noass noass
657ecf14
     WriteRegStr HKCR ".${SERV_CONFIG_EXT}" "" "${PRODUCT_NAME}File"
     WriteRegStr HKCR "${PRODUCT_NAME}File" "" "${PRODUCT_NAME} Config File"
     WriteRegStr HKCR "${PRODUCT_NAME}File\shell" "" "open"
     WriteRegStr HKCR "${PRODUCT_NAME}File\DefaultIcon" "" "$INSTDIR\${PRODUCT_ICON},0"
     WriteRegStr HKCR "${PRODUCT_NAME}File\shell\open\command" "" 'notepad.exe "%1"'
     WriteRegStr HKCR "${PRODUCT_NAME}File\shell\run" "" "Start ${PRODUCT_NAME} on this config file"
     WriteRegStr HKCR "${PRODUCT_NAME}File\shell\run\command" "" '"$INSTDIR\bin\${PRODUCT_UNIX_NAME}.exe" --pause-exit --config "%1"'
6fbf66fa
 
ca637afb
   ; Create start menu folders
6fbf66fa
  noass:
ca637afb
   CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\Utilities"
   CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}\Shortcuts"
 
cefe973e
   ; Create start menu and desktop shortcuts to OpenVPN GUI
   !ifdef USE_GUI
     IfFileExists "$INSTDIR\bin\${OPENVPN_GUI}" "" tryaddxgui
657ecf14
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME} GUI.lnk" "$INSTDIR\bin\${OPENVPN_GUI}" ""
       CreateShortcut "$DESKTOP\${PRODUCT_NAME} GUI.lnk" "$INSTDIR\bin\${OPENVPN_GUI}"
72394778
   !endif
 
cefe973e
   ; Create start menu and desktop shortcuts to OpenVPN XGUI
  tryaddxgui:
   !ifdef USE_XGUI
     IfFileExists "$INSTDIR\bin\${XGUI_EXE}" "" tryaddtray
9ca8f3cf
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${XGUI_TRANSITION_GUI_NAME}.lnk" "$INSTDIR\bin\${XGUI_EXE}" ""
 #      CreateShortcut "$DESKTOP\${XGUI_TRANSITION_GUI_NAME}.lnk" "$INSTDIR\bin\${XGUI_EXE}"
cefe973e
  tryaddtray:
     IfFileExists "$INSTDIR\bin\${XGUI_TRAY}" "" tryaddtap
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${XGUI_AJAX_GUI_NAME}.lnk" "$INSTDIR\bin\${XGUI_EXE}" ""
       CreateShortcut "$DESKTOP\${XGUI_AJAX_GUI_NAME}.lnk" "$INSTDIR\bin\${XGUI_TRAY}"
   !endif
 
72394778
     ; Create start menu shortcuts to addtap.bat and deltapall.bat
  tryaddtap:
6fbf66fa
     IfFileExists "$INSTDIR\bin\addtap.bat" "" trydeltap
cefe973e
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Utilities\Add a new TAP virtual ethernet adapter.lnk" "$INSTDIR\bin\addtap.bat" ""
6fbf66fa
 
  trydeltap:
     IfFileExists "$INSTDIR\bin\deltapall.bat" "" config_shortcut
cefe973e
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Utilities\Delete ALL TAP virtual ethernet adapters.lnk" "$INSTDIR\bin\deltapall.bat" ""
6fbf66fa
 
     ; Create start menu shortcuts for config and log directories
  config_shortcut:
     IfFileExists "$INSTDIR\config" "" log_shortcut
ca637afb
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Shortcuts\${PRODUCT_NAME} configuration file directory.lnk" "$INSTDIR\config" ""
6fbf66fa
 
  log_shortcut:
     IfFileExists "$INSTDIR\log" "" samp_shortcut
ca637afb
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Shortcuts\${PRODUCT_NAME} log file directory.lnk" "$INSTDIR\log" ""
6fbf66fa
 
  samp_shortcut:
     IfFileExists "$INSTDIR\sample-config" "" genkey_shortcut
ca637afb
       CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Shortcuts\${PRODUCT_NAME} Sample Configuration Files.lnk" "$INSTDIR\sample-config" ""
6fbf66fa
 
  genkey_shortcut:
657ecf14
     IfFileExists "$INSTDIR\bin\${PRODUCT_UNIX_NAME}.exe" "" noshortcuts
6fbf66fa
       IfFileExists "$INSTDIR\config" "" noshortcuts
ca637afb
         CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Utilities\Generate a static ${PRODUCT_NAME} key.lnk" "$INSTDIR\bin\${PRODUCT_UNIX_NAME}.exe" '--pause-exit --verb 3 --genkey --secret "$INSTDIR\config\key.txt"' "$INSTDIR\${PRODUCT_ICON}" 0
6fbf66fa
 
  noshortcuts:
   ; Create uninstaller
   WriteUninstaller "$INSTDIR\Uninstall.exe"
 
   ; Show up in Add/Remove programs
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayName" "${PRODUCT_NAME} ${VERSION}"
   WriteRegExpandStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "UninstallString" "$INSTDIR\Uninstall.exe"
657ecf14
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayIcon" "$INSTDIR\${PRODUCT_ICON}"
6fbf66fa
   WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" "DisplayVersion" "${VERSION}"
 
   ; Advise a reboot
cefe973e
   ;Messagebox MB_OK "IMPORTANT: Rebooting the system is advised in order to finalize TAP driver installation/upgrade (this is an informational message only, pressing OK will not reboot)."
6fbf66fa
 
 SectionEnd
 
 ;--------------------------------
 ;Descriptions
 
 !insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
   !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenVPNUserSpace} $(DESC_SecOpenVPNUserSpace)
cefe973e
   !ifdef USE_GUI
72394778
     !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenVPNGUI} $(DESC_SecOpenVPNGUI)
   !endif
cefe973e
   !ifdef USE_XGUI
     !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenVPNXGUI} $(DESC_SecOpenVPNXGUI)
   !endif
6fbf66fa
   !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenVPNEasyRSA} $(DESC_SecOpenVPNEasyRSA)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecTAP} $(DESC_SecTAP)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenSSLUtilities} $(DESC_SecOpenSSLUtilities)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecOpenSSLDLLs} $(DESC_SecOpenSSLDLLs)
718526e0
   !insertmacro MUI_DESCRIPTION_TEXT ${SecPKCS11DLLs} $(DESC_SecPKCS11DLLs)
6fbf66fa
   !insertmacro MUI_DESCRIPTION_TEXT ${SecAddPath} $(DESC_SecAddPath)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecAddShortcuts} $(DESC_SecAddShortcuts)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecService} $(DESC_SecService)
   !insertmacro MUI_DESCRIPTION_TEXT ${SecFileAssociation} $(DESC_SecFileAssociation)
 !insertmacro MUI_FUNCTION_DESCRIPTION_END
 
 ;--------------------------------
 ;Uninstaller Section
 
 Function un.onInit
   ClearErrors
   UserInfo::GetName
   IfErrors ok
   Pop $R0
   UserInfo::GetAccountType
   Pop $R1
   StrCmp $R1 "Admin" ok
657ecf14
     Messagebox MB_OK "Administrator privileges required to uninstall ${PRODUCT_NAME} [$R0/$R1]"
6fbf66fa
     Abort
   ok:
 FunctionEnd
 
 Section "Uninstall"
 
cefe973e
 !ifdef USE_XGUI
   DetailPrint "XML Service REMOVE"
   nsExec::ExecToLog '"$INSTDIR\bin\${XGUI_XMLSERV}" -remove'
   Pop $R0 # return value/error/timeout
 !endif
 
9ca8f3cf
   ; Stop OpenVPN if currently running
   DetailPrint "Service REMOVE"
   nsExec::ExecToLog '"$INSTDIR\bin\${PRODUCT_UNIX_NAME}serv.exe" -remove'
   Pop $R0 # return value/error/timeout
 
   Sleep 3000
6fbf66fa
 
cefe973e
   DetailPrint "TAP REMOVE"
6fbf66fa
   nsExec::ExecToLog '"$INSTDIR\bin\tapinstall.exe" remove ${TAP}'
   Pop $R0 # return value/error/timeout
   DetailPrint "tapinstall remove returned: $R0"
 
   Push "$INSTDIR\bin"
   Call un.RemoveFromPath
 
657ecf14
   RMDir /r $SMPROGRAMS\${PRODUCT_NAME}
6fbf66fa
 
ca637afb
   ; delete sample config files
   !ifdef SAMPCONF_DIR
   !ifdef SAMPCONF_CONF
     Delete "$INSTDIR\config\${SAMPCONF_CONF}"
   !endif
9bf6e9ac
   !ifdef SAMPCONF_CONF2
     Delete "$INSTDIR\config\${SAMPCONF_CONF2}"
   !endif
ca637afb
   !ifdef SAMPCONF_P12
     Delete "$INSTDIR\config\${SAMPCONF_P12}"
   !endif
   !ifdef SAMPCONF_TA
     Delete "$INSTDIR\config\${SAMPCONF_TA}"
   !endif
63903a82
   !ifdef SAMPCONF_CA
     Delete "$INSTDIR\config\${SAMPCONF_CA}"
   !endif
   !ifdef SAMPCONF_CRT
     Delete "$INSTDIR\config\${SAMPCONF_CRT}"
   !endif
   !ifdef SAMPCONF_KEY
     Delete "$INSTDIR\config\${SAMPCONF_KEY}"
   !endif
9bf6e9ac
   !ifdef SAMPCONF_DH
     Delete "$INSTDIR\config\${SAMPCONF_DH}"
   !endif
ca637afb
   !endif
 
cefe973e
   !ifdef USE_GUI
72394778
     Delete "$INSTDIR\bin\${OPENVPN_GUI}"
52d84f6e
     Delete "$DESKTOP\${PRODUCT_NAME} GUI.lnk"
72394778
   !endif
52d84f6e
 
cefe973e
   !ifdef USE_XGUI
     Delete "$INSTDIR\bin\${XGUI_EXE}"
     Delete "$INSTDIR\bin\${XGUI_TRAY}"
     Delete "$INSTDIR\bin\${XGUI_XMLSERV}"
     RMDir /r "$INSTDIR\${XGUI_HTDOCS}"
     Delete "$DESKTOP\${XGUI_AJAX_GUI_NAME}.lnk"
9ca8f3cf
     Delete "$DESKTOP\${XGUI_TRANSITION_GUI_NAME}.lnk"
cefe973e
   !endif
 
52d84f6e
   Delete "$INSTDIR\bin\${PRODUCT_UNIX_NAME}.exe"
657ecf14
   Delete "$INSTDIR\bin\${PRODUCT_UNIX_NAME}serv.exe"
6fbf66fa
   Delete "$INSTDIR\bin\libeay32.dll"
   Delete "$INSTDIR\bin\libssl32.dll"
718526e0
   Delete "$INSTDIR\bin\libpkcs11-helper-1.dll"
6fbf66fa
   Delete "$INSTDIR\bin\tapinstall.exe"
   Delete "$INSTDIR\bin\addtap.bat"
   Delete "$INSTDIR\bin\deltapall.bat"
 
   Delete "$INSTDIR\config\README.txt"
   Delete "$INSTDIR\config\sample.${SERV_CONFIG_EXT}.txt"
 
   Delete "$INSTDIR\log\README.txt"
 
   Delete "$INSTDIR\driver\OemWin2k.inf"
657ecf14
   Delete "$INSTDIR\driver\${PRODUCT_TAP_ID}.cat"
6fbf66fa
   Delete "$INSTDIR\driver\${TAPDRV}"
 
   Delete "$INSTDIR\bin\openssl.exe"
 
   Delete "$INSTDIR\INSTALL-win32.txt"
657ecf14
   Delete "$INSTDIR\${PRODUCT_ICON}"
6fbf66fa
   Delete "$INSTDIR\license.txt"
   Delete "$INSTDIR\Uninstall.exe"
 
   Delete "$INSTDIR\easy-rsa\openssl.cnf.sample"
   Delete "$INSTDIR\easy-rsa\vars.bat.sample"
   Delete "$INSTDIR\easy-rsa\init-config.bat"
   Delete "$INSTDIR\easy-rsa\README.txt"
   Delete "$INSTDIR\easy-rsa\build-ca.bat"
   Delete "$INSTDIR\easy-rsa\build-dh.bat"
   Delete "$INSTDIR\easy-rsa\build-key-server.bat"
   Delete "$INSTDIR\easy-rsa\build-key.bat"
   Delete "$INSTDIR\easy-rsa\build-key-pkcs12.bat"
   Delete "$INSTDIR\easy-rsa\clean-all.bat"
   Delete "$INSTDIR\easy-rsa\index.txt.start"
   Delete "$INSTDIR\easy-rsa\revoke-key.bat"
   Delete "$INSTDIR\easy-rsa\revoke-full.bat"
   Delete "$INSTDIR\easy-rsa\serial.start"
 
657ecf14
   Delete "$INSTDIR\sample-config\*.${PRODUCT_FILE_EXT}"
6fbf66fa
 
   RMDir "$INSTDIR\bin"
ca637afb
   RMDir "$INSTDIR\config"
6fbf66fa
   RMDir "$INSTDIR\driver"
   RMDir "$INSTDIR\easy-rsa"
   RMDir "$INSTDIR\sample-config"
ca637afb
   RMDir /r "$INSTDIR\log"
6fbf66fa
   RMDir "$INSTDIR"
 
657ecf14
   !insertmacro DelRegKeyIfUnchanged HKCR ".${SERV_CONFIG_EXT}" "${PRODUCT_NAME}File"
   DeleteRegKey HKCR "${PRODUCT_NAME}File"
   DeleteRegKey HKLM SOFTWARE\${PRODUCT_NAME}
6fbf66fa
   DeleteRegKey HKCU "Software\${PRODUCT_NAME}"
657ecf14
   DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
6fbf66fa
 
657ecf14
   ;Messagebox MB_OK "IMPORTANT: If you intend on reinstalling ${PRODUCT_NAME} after this uninstall, and you are running Win2K, you are strongly urged to reboot before reinstalling (this is an informational message only, pressing OK will not reboot)."
6fbf66fa
 
 SectionEnd