# This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. !macro PostUpdate ; PostUpdate is called from both session 0 and from the user session ; for service updates, make sure that we only register with the user session ; Otherwise ApplicationID::Set can fail intermittently with a file in use error. System::Call "kernel32::GetCurrentProcessId() i.r0" System::Call "kernel32::ProcessIdToSessionId(i $0, *i ${NSIS_MAX_STRLEN} r9)" ${CreateShortcutsLog} ; Remove registry entries for non-existent apps and for apps that point to our ; install location in the Software\Mozilla key and uninstall registry entries ; that point to our install location for both HKCU and HKLM. SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${RegCleanMain} "Software\Mozilla" ${RegCleanUninstall} ${UpdateProtocolHandlers} ; setup the application model id registration value ${InitHashAppModelId} "$INSTDIR" "Software\Mozilla\${AppName}\TaskBarIDs" ; Upgrade the copies of the MAPI DLL's ${UpgradeMapiDLLs} ClearErrors WriteRegStr HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} StrCpy $TmpVal "HKCU" ${Else} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "Software\Mozilla" "${BrandShortName}InstallerTest" StrCpy $TmpVal "HKLM" ${RegCleanMain} "Software\Mozilla" ${RegCleanUninstall} ${UpdateProtocolHandlers} ${SetAppLSPCategories} ${LSP_CATEGORIES} ; Only update the Clients\Mail registry key values if they don't exist or ; this installation is the same as the one set in those keys. ReadRegStr $0 HKLM "Software\Clients\Mail\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${EndIf} ${If} "$0" == "$INSTDIR" ${SetClientsMail} "HKLM" ${EndIf} ; Only update the Clients\News registry key values if they don't exist or ; this installation is the same as the one set in those keys. ReadRegStr $0 HKLM "Software\Clients\News\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${EndIf} ${If} "$0" == "$INSTDIR" ${SetClientsNews} "HKLM" ${EndIf} ; Only update the Clients\Calendar registry key values if they don't exist or ; this installation is the same as the one set in those keys. ReadRegStr $0 HKLM "Software\Clients\Calendar\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${EndIf} ${If} "$0" == "$INSTDIR" ${SetClientsCalendar} "HKLM" ${EndIf} ${EndIf} ; Adds a pinned Task Bar shortcut (see MigrateTaskBarShortcut for details). ; When we enabled this feature for Windows 10 & 11 we decided _not_ to pin ; during an update (even once) because we already offered to do when the ; the user originally installed, and we don't want to go against their ; explicit wishes. ; For Windows 7 and 8, we've been doing this ~forever, and those users may ; not have experienced the onboarding offer to pin to taskbar, so we're ; leaving it enabled there. ${If} ${AtMostWin2012R2} ${MigrateTaskBarShortcut} "$AddTaskbarSC" ${EndIf} ; Update the name/icon/AppModelID of our shortcuts as needed, then update the ; lastwritetime of the Start Menu shortcut to clear the tile icon cache. ; Do this for both shell contexts in case the user has shortcuts in multiple ; locations, then restore the previous context at the end. SetShellVarContext all ${UpdateShortcutsBranding} ${If} ${AtLeastWin8} ${TouchStartMenuShortcut} ${EndIf} Call FixShortcutAppModelIDs SetShellVarContext current ${UpdateShortcutsBranding} ${If} ${AtLeastWin8} ${TouchStartMenuShortcut} ${EndIf} Call FixShortcutAppModelIDs ${If} $TmpVal == "HKLM" SetShellVarContext all ${ElseIf} $TmpVal == "HKCU" SetShellVarContext current ${EndIf} ${RemoveDeprecatedKeys} ${Set32to64DidMigrateReg} ${SetAppKeys} ${SetUninstallKeys} ; Remove files that may be left behind by the application in the ; VirtualStore directory. ${CleanVirtualStore} RmDir /r /REBOOTOK "$INSTDIR\${TO_BE_DELETED}" ; Register AccessibleMarshal.dll with COM (this requires write access to HKLM) ${RegisterAccessibleMarshal} ; Record the Windows Error Reporting module WriteRegDWORD HKLM "SOFTWARE\Microsoft\Windows\Windows Error Reporting\RuntimeExceptionHelperModules" "$INSTDIR\mozwer.dll" 0 !ifdef MOZ_MAINTENANCE_SERVICE Call IsUserAdmin Pop $R0 ${If} $R0 == "true" ; Only proceed if we have HKLM write access ${AndIf} $TmpVal == "HKLM" ; We check to see if the maintenance service install was already attempted. ; Since the Maintenance service can be installed either x86 or x64, ; always use the 64-bit registry for checking if an attempt was made. ${If} ${RunningX64} ${OrIf} ${IsNativeARM64} SetRegView 64 ${EndIf} ReadRegDWORD $5 HKLM "Software\Mozilla\MaintenanceService" "Attempted" ClearErrors ${If} ${RunningX64} ${OrIf} ${IsNativeARM64} SetRegView lastused ${EndIf} ; Add the registry keys for allowed certificates. ${AddMaintCertKeys} ; If the maintenance service is already installed, do nothing. ; The maintenance service will launch: ; maintenanceservice_installer.exe /Upgrade to upgrade the maintenance ; service if necessary. If the update was done from updater.exe without ; the service (i.e. service is failing), updater.exe will do the update of ; the service. The reasons we do not do it here is because we don't want ; to have to prompt for limited user accounts when the service isn't used ; and we currently call the PostUpdate twice, once for the user and once ; for the SYSTEM account. Also, this would stop the maintenance service ; and we need a return result back to the service when run that way. ${If} $5 == "" ; An install of maintenance service was never attempted. ; We know we are an Admin and that we have write access into HKLM ; based on the above checks, so attempt to just run the EXE. ; In the worst case, in case there is some edge case with the ; IsAdmin check and the permissions check, the maintenance service ; will just fail to be attempted to be installed. nsExec::Exec "$\"$INSTDIR\maintenanceservice_installer.exe$\"" ${EndIf} ${EndIf} !endif !macroend !define PostUpdate "!insertmacro PostUpdate" ; Update the last modified time on the Start Menu shortcut, so that its icon ; gets refreshed. Should be called on Win8+ after UpdateShortcutBranding. !macro TouchStartMenuShortcut ${If} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" FileOpen $0 "$SMPROGRAMS\${BrandShortName}.lnk" a ${IfNot} ${Errors} System::Call '*(i, i) p .r1' System::Call 'kernel32::GetSystemTimeAsFileTime(p r1)' System::Call 'kernel32::SetFileTime(p r0, i 0, i 0, p r1) i .r2' System::Free $1 FileClose $0 ${EndIf} ${EndIf} !macroend !define TouchStartMenuShortcut "!insertmacro TouchStartMenuShortcut" !macro SetAsDefaultAppGlobal ${RemoveDeprecatedKeys} ; Does not use SHCTX SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${SetHandlersMail} ; Uses SHCTX ${SetHandlersNews} ; Uses SHCTX ${SetClientsMail} "HKLM" ${SetClientsNews} "HKLM" ${SetClientsCalendar} "HKLM" ${SetMailClientForMapi} "HKLM" ${ShowShortcuts} !macroend !define SetAsDefaultAppGlobal "!insertmacro SetAsDefaultAppGlobal" !macro SetMailClientForMapi RegKey WriteRegStr ${RegKey} "Software\Clients\Mail" "" "${ClientsRegName}" !macroend !define SetMailClientForMapi "!insertmacro SetMailClientForMapi" !macro HideShortcuts StrCpy $R1 "Software\Clients\Mail\${ClientsRegName}\InstallInfo" WriteRegDWORD HKLM "$R1" "IconsVisible" 0 ${If} ${AtLeastWin8} WriteRegDWORD HKCU "$R1" "IconsVisible" 0 ${EndIf} SetShellVarContext all ; Set $DESKTOP to All Users ${Unless} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" SetShellVarContext current ; Set $DESKTOP to the current user's desktop ${EndUnless} ${If} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" ShellLink::GetShortCutArgs "$DESKTOP\${BrandShortName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$DESKTOP\${BrandShortName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$DESKTOP\${BrandShortName}.lnk" ${EndIf} ${EndIf} ${EndIf} SetShellVarContext all ; Set $SMPROGRAMS to All Users ${Unless} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" SetShellVarContext current ; Set $SMPROGRAMS to the current user's Start ; Menu Programs directory ${EndUnless} ${If} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" ShellLink::GetShortCutArgs "$SMPROGRAMS\${BrandShortName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$SMPROGRAMS\${BrandShortName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$SMPROGRAMS\${BrandShortName}.lnk" ${EndIf} ${EndIf} ${EndIf} ${If} ${FileExists} "$QUICKLAUNCH\${BrandShortName}.lnk" ShellLink::GetShortCutArgs "$QUICKLAUNCH\${BrandShortName}.lnk" Pop $0 ${If} "$0" == "" ShellLink::GetShortCutTarget "$QUICKLAUNCH\${BrandShortName}.lnk" Pop $0 ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR\${FileMainEXE}" Delete "$QUICKLAUNCH\${BrandShortName}.lnk" ${EndIf} ${EndIf} ${EndIf} !macroend !define HideShortcuts "!insertmacro HideShortcuts" ; Adds shortcuts for this installation. This should also add the application ; to Open With for the file types the application handles (bug 370480). !macro ShowShortcuts StrCpy $R1 "Software\Clients\Mail\${ClientsRegName}\InstallInfo" WriteRegDWORD HKLM "$R1" "IconsVisible" 1 ${If} ${AtLeastWin8} WriteRegDWORD HKCU "$R1" "IconsVisible" 1 ${EndIf} SetShellVarContext all ; Set $DESKTOP to All Users ${Unless} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" CreateShortCut "$DESKTOP\${BrandShortName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" ShellLink::SetShortCutWorkingDirectory "$DESKTOP\${BrandShortName}.lnk" "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$DESKTOP\${BrandShortName}.lnk" "$AppUserModelID" "true" ${EndIf} ${Else} SetShellVarContext current ; Set $DESKTOP to the current user's desktop ${Unless} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" CreateShortCut "$DESKTOP\${BrandShortName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$DESKTOP\${BrandShortName}.lnk" ShellLink::SetShortCutWorkingDirectory "$DESKTOP\${BrandShortName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$DESKTOP\${BrandShortName}.lnk" "$AppUserModelID" "true" ${EndIf} ${EndIf} ${EndUnless} ${EndIf} ${EndUnless} SetShellVarContext all ; Set $SMPROGRAMS to All Users ${Unless} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" CreateShortCut "$SMPROGRAMS\${BrandShortName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandShortName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandShortName}.lnk" "$AppUserModelID" "true" ${EndIf} ${Else} SetShellVarContext current ; Set $SMPROGRAMS to the current user's Start ; Menu Programs directory ${Unless} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" CreateShortCut "$SMPROGRAMS\${BrandShortName}.lnk" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\${BrandShortName}.lnk" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\${BrandShortName}.lnk" \ "$INSTDIR" ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\${BrandShortName}.lnk" "$AppUserModelID" "true" ${EndIf} ${EndIf} ${EndUnless} ${EndIf} ${EndUnless} ; Windows 7 doesn't use the QuickLaunch directory ${Unless} ${AtLeastWin7} ${AndUnless} ${FileExists} "$QUICKLAUNCH\${BrandShortName}.lnk" CreateShortCut "$QUICKLAUNCH\${BrandShortName}.lnk" \ "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$QUICKLAUNCH\${BrandShortName}.lnk" ShellLink::SetShortCutWorkingDirectory "$QUICKLAUNCH\${BrandShortName}.lnk" \ "$INSTDIR" ${EndIf} ${EndUnless} !macroend !define ShowShortcuts "!insertmacro ShowShortcuts" ; Update the branding name on all shortcuts our installer created ; to convert from BrandFullName (which is what we used to name shortcuts) ; to BrandShortName (which is what we now name shortcuts). We only rename ; desktop and start menu shortcuts, because touching taskbar pins often ; (but inconsistently) triggers various broken behaviors in the shell. ; This assumes SHCTX is set correctly. !macro UpdateShortcutsBranding ${UpdateOneShortcutBranding} "STARTMENU" "$SMPROGRAMS" ${UpdateOneShortcutBranding} "DESKTOP" "$DESKTOP" !macroend !define UpdateShortcutsBranding "!insertmacro UpdateShortcutsBranding" !macro UpdateOneShortcutBranding LOG_SECTION SHORTCUT_DIR ; Only try to rename the shortcuts found in the shortcuts log, to avoid ; blowing away a name that the user created. ${GetLongPath} "$INSTDIR\uninstall\${SHORTCUTS_LOG}" $R9 ${If} ${FileExists} "$R9" ClearErrors ; The shortcuts log contains a numbered list of entries for each section, ; but we never actually create more than one. ReadINIStr $R8 "$R9" "${LOG_SECTION}" "Shortcut0" ${IfNot} ${Errors} ${If} ${FileExists} "${SHORTCUT_DIR}\$R8" ShellLink::GetShortCutTarget "${SHORTCUT_DIR}\$R8" Pop $R7 ${GetLongPath} "$R7" $R7 ${If} $R7 == "$INSTDIR\${FileMainEXE}" ${AndIf} $R8 != "${BrandShortName}.lnk" ${AndIfNot} ${FileExists} "${SHORTCUT_DIR}\${BrandShortName}.lnk" ClearErrors Rename "${SHORTCUT_DIR}\$R8" "${SHORTCUT_DIR}\${BrandShortName}.lnk" ${IfNot} ${Errors} ; Update the shortcut log manually instead of calling LogShortcut ; because it would add a Shortcut1 entry, and we really do want to ; overwrite the existing entry 0, since we just renamed the file. WriteINIStr "$R9" "${LOG_SECTION}" "Shortcut0" \ "${BrandShortName}.lnk" ${EndIf} ${EndIf} ${EndIf} ${EndIf} ${EndIf} !macroend !define UpdateOneShortcutBranding "!insertmacro UpdateOneShortcutBranding" !macro SetHandlersMail ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $0 "SOFTWARE\Classes" StrCpy $1 "$\"$8$\" $\"%1$\"" StrCpy $2 "$\"$8$\" -osint -compose $\"%1$\"" ; An empty string is used for the 5th param because ThunderbirdEML is not a ; protocol handler ${AddHandlerValues} "$0\ThunderbirdEML" "$1" "$8,0" \ "${AppRegNameMail} Document" "" "" ${AddHandlerValues} "$0\Thunderbird.Url.mailto" "$2" "$8,0" "${AppRegNameMail} URL" "delete" "" ${AddHandlerValues} "$0\mailto" "$2" "$8,0" "${AppRegNameMail} URL" "true" "" ${AddHandlerValues} "$0\Thunderbird.Url.mid" "$1" "$8,0" "${AppRegNameMail} URL" "delete" "" ${AddHandlerValues} "$0\mid" "$1" "$8,0" "${AppRegNameMail} URL" "true" "" ; Associate the file handlers with ThunderbirdEML ReadRegStr $6 SHCTX ".eml" "" ${If} "$6" != "ThunderbirdEML" WriteRegStr SHCTX "$0\.eml" "" "ThunderbirdEML" ${EndIf} !macroend !define SetHandlersMail "!insertmacro SetHandlersMail" !macro SetHandlersNews ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $0 "SOFTWARE\Classes" StrCpy $1 "$\"$8$\" -osint -mail $\"%1$\"" ${AddHandlerValues} "$0\Thunderbird.Url.news" "$1" "$8,0" \ "${AppRegNameNews} URL" "delete" "" ${AddHandlerValues} "$0\news" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" ${AddHandlerValues} "$0\nntp" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" ${AddHandlerValues} "$0\snews" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" !macroend !define SetHandlersNews "!insertmacro SetHandlersNews" !macro SetHandlersCalendar ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $0 "SOFTWARE\Classes" StrCpy $1 "$\"$8$\" $\"%1$\"" ${AddHandlerValues} "$0\Thunderbird.Url.webcal" "$1" "$8,0" "${AppRegNameCalendar} URL" "delete" "" ${AddHandlerValues} "$0\webcal" "$1" "$8,0" "${AppRegNameCalendar} URL" "true" "" ${AddHandlerValues} "$0\webcals" "$1" "$8,0" "${AppRegNameCalendar} URL" "true" "" ; An empty string is used for the 5th param because ThunderbirdICS is not a ; protocol handler ${AddHandlerValues} "$0\ThunderbirdICS" "$1" "$8,0" \ "${AppRegNameCalendar} Document" "" "" ;; Associate the file handlers with ThunderbirdICS ReadRegStr $6 SHCTX ".ics" "" ${If} "$6" != "ThunderbirdICS" WriteRegStr SHCTX "$0\.ics" "" "ThunderbirdICS" ${EndIf} !macroend !define SetHandlersCalendar "!insertmacro SetHandlersCalendar" ; XXXrstrong - there are several values that will be overwritten by and ; overwrite other installs of the same application. !macro SetClientsMail RegKey ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 ${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7 ${GetLongPath} "$INSTDIR\mozMapi32_InUse.dll" $6 StrCpy $0 "Software\Clients\Mail\${ClientsRegName}" WriteRegStr ${RegKey} "$0" "" "${ClientsRegName}" WriteRegStr ${RegKey} "$0\DefaultIcon" "" "$8,0" WriteRegStr ${RegKey} "$0" "DLLPath" "$6" ; The MapiProxy dll can exist in multiple installs of the application. ; Registration occurs as follows with the last action to occur being the one ; that wins: ; On install and software update when helper.exe runs with the /PostUpdate ; argument. On setting the application as the system's default application ; using Window's "Set program access and defaults". !ifndef NO_LOG ${LogHeader} "DLL Registration" !endif ClearErrors ${RegisterDLL} "$INSTDIR\MapiProxy_InUse.dll" !ifndef NO_LOG ${If} ${Errors} ${LogMsg} "** ERROR Registering: $INSTDIR\MapiProxy_InUse.dll **" ${Else} ${LogUninstall} "DLLReg: \MapiProxy_InUse.dll" ${LogMsg} "Registered: $INSTDIR\MapiProxy_InUse.dll" ${EndIf} !endif StrCpy $1 "Software\Classes\CLSID\{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" WriteRegStr ${RegKey} "$1\LocalServer32" "" "$\"$8$\" /MAPIStartup" WriteRegStr ${RegKey} "$1\ProgID" "" "MozillaMapi.1" WriteRegStr ${RegKey} "$1\VersionIndependentProgID" "" "MozillaMAPI" StrCpy $1 "SOFTWARE\Classes" WriteRegStr ${RegKey} "$1\MozillaMapi" "" "Mozilla MAPI" WriteRegStr ${RegKey} "$1\MozillaMapi\CLSID" "" "{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" WriteRegStr ${RegKey} "$1\MozillaMapi\CurVer" "" "MozillaMapi.1" WriteRegStr ${RegKey} "$1\MozillaMapi.1" "" "Mozilla MAPI" WriteRegStr ${RegKey} "$1\MozillaMapi.1\CLSID" "" "{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" ; The Reinstall Command is defined at ; http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/programmersguide/shell_adv/registeringapps.asp WriteRegStr ${RegKey} "$0\InstallInfo" "HideIconsCommand" "$\"$7$\" /HideShortcuts" WriteRegStr ${RegKey} "$0\InstallInfo" "ShowIconsCommand" "$\"$7$\" /ShowShortcuts" WriteRegStr ${RegKey} "$0\InstallInfo" "ReinstallCommand" "$\"$7$\" /SetAsDefaultAppGlobal" ClearErrors ReadRegDWORD $1 ${RegKey} "$0\InstallInfo" "IconsVisible" ; If the IconsVisible name value pair doesn't exist add it otherwise the ; application won't be displayed in Set Program Access and Defaults. ${If} ${Errors} ${If} ${FileExists} "$QUICKLAUNCH\${BrandShortName}.lnk" WriteRegDWORD ${RegKey} "$0\InstallInfo" "IconsVisible" 1 ${Else} WriteRegDWORD ${RegKey} "$0\InstallInfo" "IconsVisible" 0 ${EndIf} ${EndIf} WriteRegStr ${RegKey} "$0\shell\open\command" "" "$\"$8$\" -mail" WriteRegStr ${RegKey} "$0\shell\properties" "" "$(CONTEXT_OPTIONS)" WriteRegStr ${RegKey} "$0\shell\properties\command" "" "$\"$8$\" -options" WriteRegStr ${RegKey} "$0\shell\safemode" "" "$(CONTEXT_SAFE_MODE)" WriteRegStr ${RegKey} "$0\shell\safemode\command" "" "$\"$8$\" -safe-mode" ; Protocols StrCpy $1 "$\"$8$\" -osint -compose $\"%1$\"" StrCpy $2 "$\"$8$\" $\"%1$\"" ${AddHandlerValues} "$0\Protocols\mailto" "$1" "$8,0" "${AppRegNameMail} URL" "true" "" ${AddHandlerValues} "$0\Protocols\mid" "$2" "$8,0" "${AppRegNameMail} URL" "true" "" ; Capabilities registry keys WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationDescription" "$(REG_APP_DESC)" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationIcon" "$8,0" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationName" "${AppRegNameMail}" WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".eml" "ThunderbirdEML" WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".wdseml" "ThunderbirdEML" WriteRegStr ${RegKey} "$0\Capabilities\StartMenu" "Mail" "${ClientsRegName}" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "mailto" "Thunderbird.Url.mailto" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "mid" "Thunderbird.Url.mid" ; Registered Application WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegNameMail}" "$0\Capabilities" !macroend !define SetClientsMail "!insertmacro SetClientsMail" ; Add registry keys to support the Thunderbird 32 bit to 64 bit migration. ; These registry entries are not removed on uninstall at this time. After the ; Thunderbird 32 bit to 64 bit migration effort is completed these registry ; entries can be removed during install, post update, and uninstall. !macro Set32to64DidMigrateReg ${GetLongPath} "$INSTDIR" $1 ; These registry keys are always in the 32 bit hive since they are never ; needed by a Thunderbird 64 bit install unless it has been updated from ; Thunderbird 32 bit. SetRegView 32 !ifdef HAVE_64BIT_BUILD ; Running Thunderbird 64 bit on Windows 64 bit ClearErrors ReadRegDWORD $2 HKLM "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" ; If there were no errors then the system was updated from Thunderbird 32 bit ; to Thunderbird 64 bit and if the value is already 1 then the registry value ; has already been updated in the HKLM registry. ${IfNot} ${Errors} ${AndIf} $2 != 1 ClearErrors WriteRegDWORD HKLM "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" 1 ${If} ${Errors} ; There was an error writing to HKLM so just write it to HKCU WriteRegDWORD HKCU "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" 1 ${Else} ; This will delete the value from HKCU if it exists DeleteRegValue HKCU "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" ${EndIf} ${EndIf} ClearErrors ReadRegDWORD $2 HKCU "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" ; If there were no errors then the system was updated from Thunderbird 32 bit ; to Thunderbird 64 bit and if the value is already 1 then the registry value ; has already been updated in the HKCU registry. ${IfNot} ${Errors} ${AndIf} $2 != 1 WriteRegDWORD HKCU "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" 1 ${EndIf} !else ; Running Thunderbird 32 bit ${If} ${RunningX64} ${OrIf} ${IsNativeARM64} ; Running Thunderbird 32 bit on a Windows 64 bit system ClearErrors ReadRegDWORD $2 HKLM "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" ; If there were errors the value doesn't exist yet. ${If} ${Errors} ClearErrors WriteRegDWORD HKLM "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" 0 ; If there were errors write the value in HKCU. ${If} ${Errors} WriteRegDWORD HKCU "Software\Mozilla\${AppName}\32to64DidMigrate" "$1" 0 ${EndIf} ${EndIf} ${EndIf} !endif ClearErrors SetRegView lastused !macroend !define Set32to64DidMigrateReg "!insertmacro Set32to64DidMigrateReg" ; XXXrstrong - there are several values that will be overwritten by and ; overwrite other installs of the same application. !macro SetClientsNews RegKey ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 ${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7 ${GetLongPath} "$INSTDIR\mozMapi32_InUse.dll" $6 StrCpy $0 "Software\Clients\News\${ClientsRegName}" WriteRegStr ${RegKey} "$0" "" "${ClientsRegName}" WriteRegStr ${RegKey} "$0\DefaultIcon" "" "$8,0" WriteRegStr ${RegKey} "$0" "DLLPath" "$6" ; The MapiProxy dll can exist in multiple installs of the application. ; Registration occurs as follows with the last action to occur being the one ; that wins: ; On install and software update when helper.exe runs with the /PostUpdate ; argument. On setting the application as the system's default application ; using Window's "Set program access and defaults". !ifndef NO_LOG ${LogHeader} "DLL Registration" !endif ClearErrors ${RegisterDLL} "$INSTDIR\MapiProxy_InUse.dll" !ifndef NO_LOG ${If} ${Errors} ${LogMsg} "** ERROR Registering: $INSTDIR\MapiProxy_InUse.dll **" ${Else} ${LogUninstall} "DLLReg: \MapiProxy_InUse.dll" ${LogMsg} "Registered: $INSTDIR\MapiProxy_InUse.dll" ${EndIf} !endif StrCpy $1 "Software\Classes\CLSID\{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" WriteRegStr ${RegKey} "$1\LocalServer32" "" "$\"$8$\" /MAPIStartup" WriteRegStr ${RegKey} "$1\ProgID" "" "MozillaMapi.1" WriteRegStr ${RegKey} "$1\VersionIndependentProgID" "" "MozillaMAPI" StrCpy $1 "SOFTWARE\Classes" WriteRegStr ${RegKey} "$1\MozillaMapi" "" "Mozilla MAPI" WriteRegStr ${RegKey} "$1\MozillaMapi\CLSID" "" "{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" WriteRegStr ${RegKey} "$1\MozillaMapi\CurVer" "" "MozillaMapi.1" WriteRegStr ${RegKey} "$1\MozillaMapi.1" "" "Mozilla MAPI" WriteRegStr ${RegKey} "$1\MozillaMapi.1\CLSID" "" "{29F458BE-8866-11D5-A3DD-00B0D0F3BAA7}" ; Mail shell/open/command WriteRegStr ${RegKey} "$0\shell\open\command" "" "$\"$8$\" -mail" ; Capabilities registry keys WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationDescription" "$(REG_APP_DESC)" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationIcon" "$8,0" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationName" "${AppRegNameNews}" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "nntp" "Thunderbird.Url.news" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "news" "Thunderbird.Url.news" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "snews" "Thunderbird.Url.news" ; Protocols StrCpy $1 "$\"$8$\" -osint -mail $\"%1$\"" ${AddHandlerValues} "$0\Protocols\nntp" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" ${AddHandlerValues} "$0\Protocols\news" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" ${AddHandlerValues} "$0\Protocols\snews" "$1" "$8,0" "${AppRegNameNews} URL" "true" "" ; Registered Application WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegNameNews}" "$0\Capabilities" !macroend !define SetClientsNews "!insertmacro SetClientsNews" !macro SetClientsCalendar RegKey ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 ${GetLongPath} "$INSTDIR\uninstall\helper.exe" $7 ${GetLongPath} "$INSTDIR\mozMapi32_InUse.dll" $6 StrCpy $0 "Software\Clients\Calendar\${ClientsRegName}" WriteRegStr ${RegKey} "$0" "" "${ClientsRegName}" WriteRegStr ${RegKey} "$0\DefaultIcon" "" "$8,0" WriteRegStr ${RegKey} "$0" "DLLPath" "$6" WriteRegStr ${RegKey} "$0\shell\open\command" "" "$\"$8$\"" WriteRegStr ${RegKey} "$0\shell\properties" "" "$(CONTEXT_OPTIONS)" WriteRegStr ${RegKey} "$0\shell\properties\command" "" "$\"$8$\" -options" WriteRegStr ${RegKey} "$0\shell\safemode" "" "$(CONTEXT_SAFE_MODE)" WriteRegStr ${RegKey} "$0\shell\safemode\command" "" "$\"$8$\" -safe-mode" ; Protocols StrCpy $1 "$\"$8$\" $\"%1$\"" ${AddHandlerValues} "$0\Protocols\webcal" "$1" "$8,0" "${AppRegNameCalendar} URL" "true" "" ${AddHandlerValues} "$0\Protocols\webcals" "$1" "$8,0" "${AppRegNameCalendar} URL" "true" "" ; Capabilities registry keys WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationDescription" "$(REG_APP_DESC)" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationIcon" "$8,0" WriteRegStr ${RegKey} "$0\Capabilities" "ApplicationName" "${AppRegNameCalendar}" WriteRegStr ${RegKey} "$0\Capabilities\FileAssociations" ".ics" "ThunderbirdICS" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "webcal" "Thunderbird.Url.webcal" WriteRegStr ${RegKey} "$0\Capabilities\URLAssociations" "webcals" "Thunderbird.Url.webcal" ; Registered Application WriteRegStr ${RegKey} "Software\RegisteredApplications" "${AppRegNameCalendar}" "$0\Capabilities" !macroend !define SetClientsCalendar "!insertmacro SetClientsCalendar" ; Add Software\Mozilla\ registry entries (uses SHCTX). !macro SetAppKeys ${GetLongPath} "$INSTDIR" $8 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Main" ${WriteRegStr2} $TmpVal "$0" "Install Directory" "$8" 0 ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal}\${AppVersion} (${AB_CD})\Uninstall" ${WriteRegStr2} $TmpVal "$0" "Description" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal}\${AppVersion} (${AB_CD})" ${WriteRegStr2} $TmpVal "$0" "" "${AppVersion} (${AB_CD})" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal} ${AppVersion}\bin" ${WriteRegStr2} $TmpVal "$0" "PathToExe" "$8\${FileMainEXE}" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal} ${AppVersion}\extensions" ${WriteRegStr2} $TmpVal "$0" "Components" "$8\components" 0 ${WriteRegStr2} $TmpVal "$0" "Plugins" "$8\plugins" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal} ${AppVersion}" ${WriteRegStr2} $TmpVal "$0" "GeckoVer" "${GREVersion}" 0 StrCpy $0 "Software\Mozilla\${BrandFullNameInternal}" ${WriteRegStr2} $TmpVal "$0" "" "${AppVersion}" 0 ${WriteRegStr2} $TmpVal "$0" "CurrentVersion" "${AppVersion} (${AB_CD})" 0 ${WriteRegStr2} $TmpVal "$0" "GeckoVersion" "${GREVersion}" 0 !macroend !define SetAppKeys "!insertmacro SetAppKeys" ; Add uninstall registry entries. This macro tests for write access to determine ; if the uninstall keys should be added to HKLM or HKCU. !macro SetUninstallKeys StrCpy $0 "Software\Microsoft\Windows\CurrentVersion\Uninstall\${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" StrCpy $2 "" ClearErrors WriteRegStr HKLM "$0" "${BrandShortName}InstallerTest" "Write Test" ${If} ${Errors} ; If the uninstall keys already exist in HKLM don't create them in HKCU ClearErrors ReadRegStr $2 "HKLM" $0 "DisplayName" ${If} $2 == "" ; Otherwise we don't have any keys for this product in HKLM so proceed ; to create them in HKCU. Better handling for this will be done in: ; Bug 711044 - Better handling for 2 uninstall icons StrCpy $1 "HKCU" SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${EndIf} ClearErrors ${Else} StrCpy $1 "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) DeleteRegValue HKLM "$0" "${BrandShortName}InstallerTest" ${EndIf} ${If} $2 == "" ${GetLongPath} "$INSTDIR" $8 ; Write the uninstall registry keys ${WriteRegStr2} $1 "$0" "Comments" "${BrandFullNameInternal} ${AppVersion} (${ARCH} ${AB_CD})" 0 ${WriteRegStr2} $1 "$0" "DisplayIcon" "$8\${FileMainEXE},0" 0 ${WriteRegStr2} $1 "$0" "DisplayName" "${BrandFullNameInternal} (${ARCH} ${AB_CD})" 0 ${WriteRegStr2} $1 "$0" "DisplayVersion" "${AppVersion}" 0 ${WriteRegStr2} $1 "$0" "InstallLocation" "$8" 0 ${WriteRegStr2} $1 "$0" "Publisher" "Mozilla" 0 ${WriteRegStr2} $1 "$0" "UninstallString" "$\"$8\uninstall\helper.exe$\"" 0 ${WriteRegStr2} $1 "$0" "URLInfoAbout" "${URLInfoAbout}" 0 ${WriteRegStr2} $1 "$0" "URLUpdateInfo" "${URLUpdateInfo}" 0 ${WriteRegDWORD2} $1 "$0" "NoModify" 1 0 ${WriteRegDWORD2} $1 "$0" "NoRepair" 1 0 ${GetSize} "$8" "/S=0K" $R2 $R3 $R4 ${WriteRegDWORD2} $1 "$0" "EstimatedSize" $R2 0 ${If} "$TmpVal" == "HKLM" SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${Else} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${EndIf} ${EndIf} !macroend !define SetUninstallKeys "!insertmacro SetUninstallKeys" ; Updates protocol handlers if their registry open command value is for this ; install location (uses SHCTX). !macro UpdateProtocolHandlers ; Store the command to open the app with an url in a register for easy access. ${GetLongPath} "$INSTDIR\${FileMainEXE}" $8 StrCpy $0 "SOFTWARE\Classes" StrCpy $1 "$\"$8$\" -osint -compose $\"%1$\"" StrCpy $2 "$\"$8$\" -osint -mail $\"%1$\"" StrCpy $3 "$\"$8$\" $\"%1$\"" ; Only set the file and protocol handlers if the existing one under HKCR is ; for this install location. ${IsHandlerForInstallDir} "ThunderbirdEML" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\ThunderbirdEML" "$3" "$8,0" \ "${AppRegNameMail} Document" "" "" ${EndIf} ${IsHandlerForInstallDir} "Thunderbird.Url.mailto" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\Thunderbird.Url.mailto" "$1" "$8,0" \ "${AppRegNameMail} URL" "delete" "" ${EndIf} ${IsHandlerForInstallDir} "mailto" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\mailto" "$1" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "Thunderbird.Url.mid" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\Thunderbird.Url.mid" "$3" "$8,0" \ "${AppRegNameMail} URL" "delete" "" ${EndIf} ${IsHandlerForInstallDir} "mid" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\mid" "$3" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "Thunderbird.Url.news" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\Thunderbird.Url.news" "$2" "$8,0" \ "${AppRegNameNews} URL" "delete" "" ${EndIf} ${IsHandlerForInstallDir} "news" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\news" "$2" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "snews" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\snews" "$2" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "nntp" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\nntp" "$2" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "Thunderbird.Url.webcal" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\Thunderbird.Url.webcal" "$3" "$8,0" \ "${AppRegNameCalendar} URL" "delete" "" ${EndIf} ${IsHandlerForInstallDir} "webcal" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\webcal" "$3" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "webcals" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\webcals" "$3" "$8,0" "" "" "" ${EndIf} ${IsHandlerForInstallDir} "ThunderbirdICS" $R9 ${If} "$R9" == "true" ${AddHandlerValues} "SOFTWARE\Classes\ThunderbirdICS" "$3" "$8,0" \ "${AppRegNameCalendar} Document" "" "" ${EndIf} !macroend !define UpdateProtocolHandlers "!insertmacro UpdateProtocolHandlers" !ifdef MOZ_MAINTENANCE_SERVICE ; Adds maintenance service certificate keys for the install dir. ; For the cert to work, it must also be signed by a trusted cert for the user. !macro AddMaintCertKeys Push $R0 ; Allow main Mozilla cert information for updates ; This call will push the needed key on the stack ServicesHelper::PathToUniqueRegistryPath "$INSTDIR" Pop $R0 ${If} $R0 != "" ; More than one certificate can be specified in a different subfolder ; for example: $R0\1, but each individual binary can be signed ; with at most one certificate. A fallback certificate can only be used ; if the binary is replaced with a different certificate. ; We always use the 64bit registry for certs. ${If} ${RunningX64} ${OrIf} ${IsNativeARM64} SetRegView 64 ${EndIf} DeleteRegKey HKLM "$R0" ; Setting the Attempted value will ensure that a new Maintenance Service ; install will never be attempted again after this from updates. The value ; is used only to see if updates should attempt new service installs. WriteRegDWORD HKLM "Software\Mozilla\MaintenanceService" "Attempted" 1 ; These values associate the allowed certificates for the current ; installation. WriteRegStr HKLM "$R0\0" "name" "${CERTIFICATE_NAME}" WriteRegStr HKLM "$R0\0" "issuer" "${CERTIFICATE_ISSUER}" ; These values associate the allowed certificates for the previous ; installation, so that we can update from it cleanly using the ; old updater.exe (which will still have this signature). WriteRegStr HKLM "$R0\1" "name" "${CERTIFICATE_NAME_PREVIOUS}" WriteRegStr HKLM "$R0\1" "issuer" "${CERTIFICATE_ISSUER_PREVIOUS}" ${If} ${RunningX64} ${OrIf} ${IsNativeARM64} SetRegView lastused ${EndIf} ClearErrors ${EndIf} ; Restore the previously used value back Pop $R0 !macroend !define AddMaintCertKeys "!insertmacro AddMaintCertKeys" !endif !macro RegisterAccessibleMarshal ${RegisterDLL} "$INSTDIR\AccessibleMarshal.dll" !macroend !define RegisterAccessibleMarshal "!insertmacro RegisterAccessibleMarshal" ; Removes various registry entries for reasons noted below (does not use SHCTX). !macro RemoveDeprecatedKeys StrCpy $0 "SOFTWARE\Classes" ; remove DI and SOC from the .eml class if it exists and contains ; thunderbird.exe ClearErrors ReadRegStr $1 HKLM "$0\.eml\shell\open\command" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKLM "$0\.eml\shell\open\command" ${EndUnless} ClearErrors ReadRegStr $1 HKCU "$0\.eml\shell\open\command" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKCU "$0\.eml\shell\open\command" ${EndUnless} ClearErrors ReadRegStr $1 HKLM "$0\.eml\DefaultIcon" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKLM "$0\.eml\DefaultIcon" ${EndUnless} ClearErrors ReadRegStr $1 HKCU "$0\.eml\DefaultIcon" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKCU "$0\.eml\DefaultIcon" ${EndUnless} ; Remove the Shredder clients key if its default icon contains thunderbird.exe ClearErrors ReadRegStr $1 HKLM "SOFTWARE\clients\mail\Shredder\DefaultIcon" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKLM "SOFTWARE\clients\mail\Shredder" ${EndUnless} ClearErrors ReadRegStr $1 HKLM "SOFTWARE\clients\news\Shredder\DefaultIcon" "" ${WordFind} "$1" "${FileMainEXE}" "E+1{" $R1 ${Unless} ${Errors} DeleteRegKey HKLM "SOFTWARE\clients\news\Shredder" ${EndUnless} ; The shim for 1.5.0.10 writes out a set of bogus keys which we need to ; cleanup. Intentionally hard coding Mozilla Thunderbird here ; as this is the string used by the shim. DeleteRegKey HKLM "$0\Mozilla Thunderbird.Url.mailto" DeleteRegValue HKLM "Software\RegisteredApplications" "Mozilla Thunderbird" ; Remove the app compatibility registry key StrCpy $0 "Software\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" DeleteRegValue HKLM "$0" "$INSTDIR\${FileMainEXE}" DeleteRegValue HKCU "$0" "$INSTDIR\${FileMainEXE}" ; Remove the SupportUTF8 registry value as it causes MAPI issues on some locales ; with non-ASCII characters in file names. StrCpy $0 "Software\Clients\Mail\${ClientsRegName}" DeleteRegValue HKLM $0 "SupportUTF8" ; Unregister deprecated AccessibleHandler.dll. ${If} ${FileExists} "$INSTDIR\AccessibleHandler.dll" ${UnregisterDLL} "$INSTDIR\AccessibleHandler.dll" ${EndIf} !macroend !define RemoveDeprecatedKeys "!insertmacro RemoveDeprecatedKeys" ; For updates, adds a pinned shortcut to Task Bar on update for Windows 7 ; and 8 if this macro has never been called before and the application ; is default (see PinToTaskBar for more details). This doesn't get called ; for Windows 10 and 11 on updates, so we will never pin on update there. ; ; For installs, adds a taskbar pin if SHOULD_PIN is 1. (Defaults to 1, ; but is controllable through the UI, ini file, and command line flags.) !macro MigrateTaskBarShortcut SHOULD_PIN ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ClearErrors ReadINIStr $1 "$0" "TASKBAR" "Migrated" ${If} ${Errors} ClearErrors WriteIniStr "$0" "TASKBAR" "Migrated" "true" WriteRegDWORD HKCU \ "Software\Mozilla\${AppName}\Installer\$AppUserModelID" \ "WasPinnedToTaskbar" 1 ${If} ${AtLeastWin7} ${If} "${SHOULD_PIN}" == "1" ${PinToTaskBar} ${EndIf} ${EndIf} ${EndIf} ${EndIf} !macroend !define MigrateTaskBarShortcut "!insertmacro MigrateTaskBarShortcut" !define GetPinningSupportedByWindowsVersionWithoutSystemPopup "!insertmacro GetPinningSupportedByWindowsVersionWithoutSystemPopup " ; Starting with a version of Windows 11 (10.0.22621), the OS will show a system popup ; when trying to pin to the taskbar. ; ; Pass in the variable to put the output into. A '1' means pinning is supported on this ; OS without generating a popup, a '0' means pinning will generate a system popup. ; ; ; More info: a version of Windows was released that introduced a system popup when ; an exe (such as setup.exe) attempts to pin an app to the taskbar. ; We already handle pinning in the onboarding process once Firefox ; launches so we don't want to also attempt to pin it in the installer ; and have the OS ask the user for confirmation without the full context. ; ; The number for that version of windows is still unclear (it might be 22H2 or 23H2) ; and it's not supported by the version of WinVer.nsh we have anyways, ; so instead we are confirming that it's a build of Windows that is less ; than 10.0 BuildNumber: 22621 to do pinning in the installer. !macro GetPinningSupportedByWindowsVersionWithoutSystemPopup outvar !define pin_lbl lbl_GPSBWVWSP_${__COUNTER__} Push $0 Push $1 Push $2 Push $3 ${WinVerGetMajor} $0 ${WinVerGetMinor} $1 ${WinVerGetBuild} $2 ; Get the UBR; only documented way I could figure out how to get this reliably ClearErrors ReadRegDWORD $3 HKLM \ "Software\Microsoft\Windows NT\CurrentVersion" \ "UBR" ; It's not obvious how to use LogicLib itself within a LogicLib custom ; operator, so we do everything by hand with `IntCmp`. The below lines ; translate to: ; StrCpy ${outvar} '0' ; default to false ; ${If} $0 <= 10 ; ${If} $1 <= 0 ; ${If} $2 < 22621 ; StrCpy ${outvar} '1' ; ${ElseIf} $2 == 22621 ; ${If} $3 < 2361 ; StrCpy ${outvar} '1' ; ${Endif} ; ${EndIf} ; ${Endif} ; ${EndIf} StrCpy ${outvar} '0' ; default to false on pinning ; If the major version is greater than 10, no pinning in setup IntCmp $0 10 "" "" ${pin_lbl}_bad ; If the minor version is greater than 0, no pinning in setup IntCmp $1 0 "" "" ${pin_lbl}_bad ; If the build number is less than 22621, jump to pinning; if greater than, no pinning IntCmp $2 22621 "" ${pin_lbl}_good ${pin_lbl}_bad ; Only if the version is 10.0.22621 do we fall through to here ; If the UBR is greater than or equal to 2361, jump to no pinning IntCmp $3 2361 ${pin_lbl}_bad "" ${pin_lbl}_bad ${pin_lbl}_good: StrCpy ${outvar} '1' ${pin_lbl}_bad: !undef pin_lbl Pop $3 Pop $2 Pop $1 Pop $0 !macroend !macro _PinningSupportedByWindowsVersionWithoutSystemPopup _ignore _ignore2 _t _f !insertmacro _LOGICLIB_TEMP ${GetPinningSupportedByWindowsVersionWithoutSystemPopup} $_LOGICLIB_TEMP !insertmacro _= $_LOGICLIB_TEMP "1" `${_t}` `${_f}` !macroend ; The following is to make if statements for the functionality easier. When using an if statement, ; Use IsPinningSupportedByWindowsVersionWithoutSystemPopup like so, instead of GetPinningSupportedByWindowsVersionWithoutSystemPopup: ; ; ${If} ${IsPinningSupportedByWindowsVersionWithoutSystemPopup} ; ; do something ; ${EndIf} ; !define IsPinningSupportedByWindowsVersionWithoutSystemPopup `"" PinningSupportedByWindowsVersionWithoutSystemPopup "" ` ; Adds a pinned Task Bar shortcut on Windows 7 if there isn't one for the main ; application executable already. Existing pinned shortcuts for the same ; application model ID must be removed first to prevent breaking the pinned ; item's lists but multiple installations with the same application model ID is ; an edgecase. If removing existing pinned shortcuts with the same application ; model ID removes a pinned pinned Start Menu shortcut this will also add a ; pinned Start Menu shortcut. !macro PinToTaskBar ${If} ${AtLeastWin7} StrCpy $8 "false" ; Whether a shortcut had to be created ${IsPinnedToTaskBar} "$INSTDIR\${FileMainEXE}" $R9 ${If} "$R9" == "false" ; Find an existing Start Menu shortcut or create one to use for pinning ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ClearErrors ReadINIStr $1 "$0" "STARTMENU" "Shortcut0" ${Unless} ${Errors} SetShellVarContext all ; Set SHCTX to all users ${Unless} ${FileExists} "$SMPROGRAMS\$1" SetShellVarContext current ; Set SHCTX to the current user ${Unless} ${FileExists} "$SMPROGRAMS\$1" StrCpy $8 "true" CreateShortCut "$SMPROGRAMS\$1" "$INSTDIR\${FileMainEXE}" ${If} ${FileExists} "$SMPROGRAMS\$1" ShellLink::SetShortCutWorkingDirectory "$SMPROGRAMS\$1" \ "$INSTDIR" ${If} "$AppUserModelID" != "" ApplicationID::Set "$SMPROGRAMS\$1" "$AppUserModelID" "true" ${EndIf} ${EndIf} ${EndUnless} ${EndUnless} ${If} ${FileExists} "$SMPROGRAMS\$1" ; Count of Start Menu pinned shortcuts before unpinning. ${PinnedToStartMenuLnkCount} $R9 ; Having multiple shortcuts pointing to different installations with ; the same AppUserModelID (e.g. side by side installations of the ; same version) will make the TaskBar shortcut's lists into an bad ; state where the lists are not shown. To prevent this first ; uninstall the pinned item. ApplicationID::UninstallPinnedItem "$SMPROGRAMS\$1" ; Count of Start Menu pinned shortcuts after unpinning. ${PinnedToStartMenuLnkCount} $R8 ; If there is a change in the number of Start Menu pinned shortcuts ; assume that unpinning unpinned a side by side installation from ; the Start Menu and pin this installation to the Start Menu. ${Unless} $R8 == $R9 ; Pin the shortcut to the Start Menu. 5381 is the shell32.dll ; resource id for the "Pin to Start Menu" string. InvokeShellVerb::DoIt "$SMPROGRAMS" "$1" "5381" ${EndUnless} ${If} ${AtMostWin2012R2} ; Pin the shortcut to the TaskBar. 5386 is the shell32.dll ; resource id for the "Pin to Taskbar" string. InvokeShellVerb::DoIt "$SMPROGRAMS" "$1" "5386" ${ElseIf} ${AtMostWaaS} 1809 ; In Windows 10 the "Pin to Taskbar" resource was removed, so we ; can't access the verb that way anymore. We have a create a ; command key using the GUID that's assigned to this action and ; then invoke that as a verb. This works up until build 1809. ReadRegStr $R9 HKLM \ "Software\Microsoft\Windows\CurrentVersion\Explorer\CommandStore\shell\Windows.taskbarpin" \ "ExplorerCommandHandler" WriteRegStr HKCU "Software\Classes\*\shell\${AppRegNameMail}-$AppUserModelID" "ExplorerCommandHandler" $R9 InvokeShellVerb::DoIt "$SMPROGRAMS" "$1" "${AppRegNameMail}-$AppUserModelID" DeleteRegKey HKCU "Software\Classes\*\shell\${AppRegNameMail}-$AppUserModelID" ${Else} ; In Windows 10 1903 and up, and Windows 11 prior to 22H2, the above no ; longer works. We have yet another method for these versions ; which is detailed in the PinToTaskbar plugin code. ${If} ${IsPinningSupportedByWindowsVersionWithoutSystemPopup} PinToTaskbar::Pin "$SMPROGRAMS\$1" ${EndIf} ${EndIf} ; Delete the shortcut if it was created ${If} "$8" == "true" Delete "$SMPROGRAMS\$1" ${EndIf} ${EndIf} ${If} $TmpVal == "HKCU" SetShellVarContext current ; Set SHCTX to the current user ${Else} SetShellVarContext all ; Set SHCTX to all users ${EndIf} ${EndUnless} ${EndIf} ${EndIf} ${EndIf} !macroend !define PinToTaskBar "!insertmacro PinToTaskBar" ; Removes the application's start menu directory along with its shortcuts if ; they exist and if they exist creates a start menu shortcut in the root of the ; start menu directory (bug 598779). If the application's start menu directory ; is not empty after removing the shortucts the directory will not be removed ; since these additional items were not created by the installer (uses SHCTX). !macro RemoveStartMenuDir ${GetShortcutsLogPath} $0 ${If} ${FileExists} "$0" ; Delete Start Menu Programs shortcuts, directory if it is empty, and ; parent directories if they are empty up to but not including the start ; menu directory. ${GetLongPath} "$SMPROGRAMS" $1 ClearErrors ReadINIStr $2 "$0" "SMPROGRAMS" "RelativePathToDir" ${Unless} ${Errors} ${GetLongPath} "$1\$2" $2 ${If} "$2" != "" ; Delete shortucts in the Start Menu Programs directory. StrCpy $3 0 ${Do} ClearErrors ReadINIStr $4 "$0" "SMPROGRAMS" "Shortcut$3" ; Stop if there are no more entries ${If} ${Errors} ${ExitDo} ${EndIf} ${If} ${FileExists} "$2\$4" ShellLink::GetShortCutTarget "$2\$4" Pop $5 ${If} "$INSTDIR\${FileMainEXE}" == "$5" Delete "$2\$4" ${EndIf} ${EndIf} IntOp $3 $3 + 1 ; Increment the counter ${Loop} ; Delete Start Menu Programs directory and parent directories ${Do} ; Stop if the current directory is the start menu directory ${If} "$1" == "$2" ${ExitDo} ${EndIf} ClearErrors RmDir "$2" ; Stop if removing the directory failed ${If} ${Errors} ${ExitDo} ${EndIf} ${GetParent} "$2" $2 ${Loop} ${EndIf} DeleteINISec "$0" "SMPROGRAMS" ${EndUnless} ${EndIf} !macroend !define RemoveStartMenuDir "!insertmacro RemoveStartMenuDir" ; Creates the shortcuts log ini file with the appropriate entries if it doesn't ; already exist. !macro CreateShortcutsLog ${GetShortcutsLogPath} $0 ${Unless} ${FileExists} "$0" ${LogStartMenuShortcut} "${BrandShortName}.lnk" ${LogQuickLaunchShortcut} "${BrandShortName}.lnk" ${LogDesktopShortcut} "${BrandShortName}.lnk" ${EndUnless} !macroend !define CreateShortcutsLog "!insertmacro CreateShortcutsLog" ; The MAPI DLL's are copied and the copies are used for the MAPI registration ; to lessen file in use errors on application update. !macro UpgradeMapiDLLs ClearErrors ${DeleteFile} "$INSTDIR\MapiProxy_InUse.dll" ${If} ${Errors} ${DeleteFile} "$INSTDIR\MapiProxy_InUse.dll.moz-delete" ; shouldn't exist Rename "$INSTDIR\MapiProxy_InUse.dll" "$INSTDIR\MapiProxy_InUse.dll.moz-delete" Delete /REBOOTOK "$INSTDIR\MapiProxy_InUse.dll.moz-delete" ${EndIf} CopyFiles /SILENT "$INSTDIR\MapiProxy.dll" "$INSTDIR\MapiProxy_InUse.dll" ClearErrors ${DeleteFile} "$INSTDIR\mozMapi32_InUse.dll" ${If} ${Errors} ${DeleteFile} "$INSTDIR\mozMapi32_InUse.dll.moz-delete" ; shouldn't exist Rename "$INSTDIR\mozMapi32_InUse.dll" "$INSTDIR\mozMapi32_InUse.dll.moz-delete" Delete /REBOOTOK "$INSTDIR\mozMapi32_InUse.dll.moz-delete" ${EndIf} CopyFiles /SILENT "$INSTDIR\mozMapi32.dll" "$INSTDIR\mozMapi32_InUse.dll" !macroend !define UpgradeMapiDLLs "!insertmacro UpgradeMapiDLLs" ; The files to check if they are in use during (un)install so the restart is ; required message is displayed. All files must be located in the $INSTDIR ; directory. !macro PushFilesToCheck ; The first string to be pushed onto the stack MUST be "end" to indicate ; that there are no more files to check in $INSTDIR and the last string ; should be ${FileMainEXE} so if it is in use the CheckForFilesInUse macro ; returns after the first check. Push "end" Push "AccessibleMarshal.dll" Push "freebl3.dll" Push "nssckbi.dll" Push "nspr4.dll" Push "nssdbm3.dll" Push "sqlite3.dll" Push "mozsqlite3.dll" Push "xpcom.dll" Push "crashreporter.exe" Push "minidump-analyzer.exe" Push "pingsender.exe" Push "updater.exe" Push "mozwer.dll" Push "xpicleanup.exe" Push "MapiProxy.dll" Push "MapiProxy_InUse.dll" Push "mozMapi32.dll" Push "mozMapi32_InUse.dll" Push "${FileMainEXE}" !macroend !define PushFilesToCheck "!insertmacro PushFilesToCheck" ; Helper for updating the shortcut application model IDs. Function FixShortcutAppModelIDs ${If} ${AtLeastWin7} ${AndIf} "$AppUserModelID" != "" ${UpdateShortcutAppModelIDs} "$INSTDIR\${FileMainEXE}" "$AppUserModelID" $0 ${EndIf} FunctionEnd ; The !ifdef NO_LOG prevents warnings when compiling the installer.nsi due to ; this function only being used by the uninstaller.nsi. !ifdef NO_LOG Function SetAsDefaultAppUser ; AddTaskbarSC is needed by MigrateTaskBarShortcut, which is called by ; SetAsDefaultAppUserHKCU. If this is called via ExecCodeSegment, ; MigrateTaskBarShortcut will not see the value of AddTaskbarSC, so we ; send it via a register instead. StrCpy $R0 $AddTaskbarSC ; It is only possible to set this installation of the application as the ; Mail handler if it was added to the HKLM Mail ; registry keys. ; http://support.microsoft.com/kb/297878 ${GetParameters} $R0 ClearErrors ${GetOptions} "$R0" "Mail" $R1 ${Unless} ${Errors} ; Check if this install location registered as the Mail client ClearErrors ReadRegStr $0 HKLM "Software\Clients\Mail\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" ; Check if this is running in an elevated process ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} ; Not elevated Call SetAsDefaultMailAppUserHKCU ${Else} ; Elevated - execute the function in the unelevated process GetFunctionAddress $0 SetAsDefaultMailAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} ; Do we also set TB as default News client? If not we can return ClearErrors ${GetOptions} "$R0" "News" $R1 ${If} ${Errors} Return ${EndIf} ${EndIf} ${EndIf} ${EndUnless} ClearErrors ${GetOptions} "$R0" "News" $R1 ${Unless} ${Errors} ; Check if this install location registered as the News client ClearErrors ReadRegStr $0 HKLM "Software\Clients\News\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" ; Check if this is running in an elevated process ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} ; Not elevated Call SetAsDefaultNewsAppUserHKCU ${Else} ; Elevated - execute the function in the unelevated process GetFunctionAddress $0 SetAsDefaultNewsAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} Return ; Nothing more needs to be done ${EndIf} ${EndIf} ${EndUnless} ClearErrors ${GetOptions} "$R0" "Calendar" $R1 ${Unless} ${Errors} ; Check if this install location registered as the Calendar client ClearErrors ReadRegStr $0 HKLM "Software\Clients\Calendar\${ClientsRegName}\DefaultIcon" "" ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" ; Check if this is running in an elevated process ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} ; Not elevated Call SetAsDefaultCalendarAppUserHKCU ${Else} ; Elevated - execute the function in the unelevated process GetFunctionAddress $0 SetAsDefaultCalendarAppUserHKCU UAC::ExecCodeSegment $0 ${EndIf} Return ; Nothing more needs to be done ${EndIf} ${EndIf} ${EndUnless} ; The code after ElevateUAC won't be executed when the user: ; a) is a member of the administrators group (e.g. elevation is required) ; b) is not a member of the administrators group and chooses to elevate ${ElevateUAC} SetShellVarContext all ; Set SHCTX to all users (e.g. HKLM) ${SetClientsMail} "HKLM" ${SetClientsNews} "HKLM" ${SetClientsCalendar} "HKLM" ${RemoveDeprecatedKeys} ${MigrateTaskBarShortcut} "$R0" ClearErrors ${GetParameters} $0 ${GetOptions} "$0" "/UAC:" $0 ${If} ${Errors} ClearErrors ${GetOptions} "$R0" "Mail" $R1 ${Unless} ${Errors} Call SetAsDefaultMailAppUserHKCU ${EndUnless} ClearErrors ${GetOptions} "$R0" "News" $R1 ${Unless} ${Errors} Call SetAsDefaultNewsAppUserHKCU ${EndUnless} ${Else} ${GetOptions} "$R0" "Mail" $R1 ${Unless} ${Errors} GetFunctionAddress $0 SetAsDefaultMailAppUserHKCU UAC::ExecCodeSegment $0 ${EndUnless} ClearErrors ${GetOptions} "$R0" "News" $R1 ${Unless} ${Errors} GetFunctionAddress $0 SetAsDefaultNewsAppUserHKCU UAC::ExecCodeSegment $0 ${EndUnless} ${EndIf} FunctionEnd !define SetAsDefaultAppUser "Call SetAsDefaultAppUser" !endif ; Sets this installation as the default mailer by setting the registry keys ; under HKEY_CURRENT_USER via registry calls and using the AppAssocReg NSIS ; plugin. This is a function instead of a macro so it is ; easily called from an elevated instance of the binary. Since this can be ; called by an elevated instance logging is not performed in this function. Function SetAsDefaultMailAppUserHKCU ; Only set as the user's Mail client if the StartMenuInternet ; registry keys are for this install. ClearErrors ReadRegStr $0 HKLM "Software\Clients\Mail\${ClientsRegName}\DefaultIcon" "" ${Unless} ${Errors} ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" WriteRegStr HKCU "Software\Clients\Mail" "" "${ClientsRegName}" ${EndIf} ${EndIf} ${EndUnless} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${If} ${AtLeastWin8} ${SetHandlersMail} ${EndIf} ClearErrors ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegNameMail}" ; Only register as the handler if the app registry name exists ; under the RegisteredApplications registry key. ${Unless} ${Errors} AppAssocReg::SetAppAsDefaultAll "${AppRegNameMail}" ${EndUnless} FunctionEnd ; The !ifdef NO_LOG prevents warnings when compiling the installer.nsi due to ; this function only being used by SetAsDefaultAppUser. !ifdef NO_LOG ; Sets this installation as the default news client by setting the registry keys ; under HKEY_CURRENT_USER via registry calls and using the AppAssocReg NSIS ; plugin. This is a function instead of a macro so it is ; easily called from an elevated instance of the binary. Since this can be ; called by an elevated instance logging is not performed in this function. Function SetAsDefaultNewsAppUserHKCU ; Only set as the user's News client if the StartMenuInternet ; registry keys are for this install. ClearErrors ReadRegStr $0 HKLM "Software\Clients\News\${ClientsRegName}\DefaultIcon" "" ${Unless} ${Errors} ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" WriteRegStr HKCU "Software\Clients\News" "" "${ClientsRegName}" ${EndIf} ${EndIf} ${EndUnless} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${If} ${AtLeastWin8} ${SetHandlersNews} ${EndIf} ClearErrors ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegNameNews}" ; Only register as the handler if the app registry name exists ; under the RegisteredApplications registry key. ${Unless} ${Errors} AppAssocReg::SetAppAsDefaultAll "${AppRegNameNews}" ${EndUnless} FunctionEnd ; Sets this installation as the default calendar client by setting the registry keys ; under HKEY_CURRENT_USER via registry calls and using the AppAssocReg NSIS ; plugin. This is a function instead of a macro so it is ; easily called from an elevated instance of the binary. Since this can be ; called by an elevated instance logging is not performed in this function. Function SetAsDefaultCalendarAppUserHKCU ; Only set as the user's Calendar client if the StartMenuInternet ; registry keys are for this install. ClearErrors ReadRegStr $0 HKLM "Software\Clients\Calendar\${ClientsRegName}\DefaultIcon" "" ${Unless} ${Errors} ${GetPathFromString} "$0" $0 ${GetParent} "$0" $0 ${If} ${FileExists} "$0" ${GetLongPath} "$0" $0 ${If} "$0" == "$INSTDIR" WriteRegStr HKCU "Software\Clients\Calendar" "" "${ClientsRegName}" ${EndIf} ${EndIf} ${EndUnless} SetShellVarContext current ; Set SHCTX to the current user (e.g. HKCU) ${If} ${AtLeastWin8} ${SetHandlersCalendar} ${EndIf} ClearErrors ReadRegStr $0 HKLM "Software\RegisteredApplications" "${AppRegNameCalendar}" ; Only register as the handler if the app registry name exists ; under the RegisteredApplications registry key. ${Unless} ${Errors} AppAssocReg::SetAppAsDefaultAll "${AppRegNameCalendar}" ${EndUnless} FunctionEnd !endif