Verified Commit 1a571c59 authored by Pier Angelo Vendrame's avatar Pier Angelo Vendrame 🎃
Browse files

Bug 41065: Cleanup the NSIS script

Improve the formatting of the installer, and update the language list
to match the one in rbm.conf (even though it would be good to keep the
lists synchronized automatically).

Also, include the channel name in the displayed name and in the default
install directory (except for release).

Since we are changing many lines, I took the ocasion to switch to LF
line endings (NSIS accepts them).
parent 83a1a381
Loading
Loading
Loading
Loading
+0 −10
Original line number Diff line number Diff line
@@ -305,11 +305,6 @@ done
  cat > $distdir/windows-installer/browser-portable.nsi << 'BROWSER_NSI'
[% INCLUDE 'windows-installer.nsi' %]
BROWSER_NSI
  [% IF c('var/mullvad-browser') -%]
    cat > $distdir/windows-installer/browser-system.nsi << 'BROWSER_NSI'
[% INCLUDE 'windows-installer.nsi' system_install_mode = 1 %]
BROWSER_NSI
  [% END -%]
  mv ${TB_STAGE_DIR} $distdir/windows-installer/"[% c('var/Project_Name') %]"
  mv $distdir/windows-installer ${TB_STAGE_DIR}
[% END %]
@@ -389,11 +384,6 @@ cd $distdir
  # Working around NSIS braindamage
  python3 $rootdir/pe_checksum_fix.py browser-install.exe
  mv browser-install.exe $OUTDIR/[% c("var/project-name") %]-[% c("var/osname") %]-portable-[% c("var/torbrowser_version") %].exe
  [% IF c('var/mullvad-browser') -%]
    makensis browser-system.nsi
    python3 $rootdir/pe_checksum_fix.py browser-install.exe
    mv browser-install.exe $OUTDIR/[% c("var/project-name") %]-[% c("var/osname") %]-install-[% c("var/torbrowser_version") %].exe
  [% END -%]
  popd
[% END %]
rm -rf $distdir/${PKG_DIR}
+169 −248
Original line number Diff line number Diff line
; NSIS Installer for Tor/Base/Mullvad Browser
;Written by Moritz Bartl
;released under Public Domain
; Based on NSIS examples by Joost Verburg.
; Originally adapted to Tor Browser by Moritz Bartl
; https://github.com/moba/tbb-windows-installer
; Released under the zlib/libpng license.

;--------------------------------
;Modern UI

  !include "FileFunc.nsh"
  !include "MUI2.nsh"
  !include "LogicLib.nsh"
  !include "MUI2.nsh"
  !include "WinVer.nsh"

;--------------------------------
; General

  ; Location of Tor/Base/Mullvad Browser to put into installer
  !define PROGRAM_SOURCE ".\[% c('var/Project_Name') %]\"

  Name "[% c('var/Project_Name') %]"
[% IF c("var/channel") == "release";
      SET display_name = c('var/Project_Name');
   ELSIF c("var/testbuild");
      SET display_name = c('var/Project_Name') _ " Testbuild";
   ELSE;
      SET display_name = c('var/Project_Name_Channel');
   END
-%]
  Name "[% display_name %]"
  OutFile "browser-install.exe"

  ; Default installation folder
[% IF system_install_mode -%]
  InstallDir "$PROGRAMFILES\[% c('var/Project_Name') %]"
[% ELSE -%]
  InstallDir "$DESKTOP\[% c('var/Project_Name') %]"
[% END -%]
  InstallDir "$DESKTOP\[% display_name %]"

  ; Best (but slowest) compression
  SetCompressor /SOLID lzma
  SetCompressorDictSize 32

  ;Request application privileges for Windows Vista
[% IF system_install_mode -%]
  RequestExecutionLevel admin
[% ELSE -%]
  ; Do not require elevated privileges
  RequestExecutionLevel user
[% END -%]

  ; Support HiDPI displays
  ManifestDPIAware true

[% IF system_install_mode -%]
  ;Registry keys to uninstall system-wide installs
  !define UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\[% c('var/ProjectName') %]"
[% END -%]

;--------------------------------
; Metadata

  VIProductVersion "[% pc("firefox", "var/browser_series") %].0.0"
  VIAddVersionKey "ProductName" "[% c('var/Project_Name') %]"
  VIProductVersion "[% pc('firefox', 'var/browser_series') %].0.0"
  VIAddVersionKey "ProductName" "[% display_name %]"
  VIAddVersionKey "ProductVersion" "[% c('var/torbrowser_version') %]"
  VIAddVersionKey "FileDescription" "[% c('var/Project_Name') %][% IF system_install_mode -%] System[% END -%] Installer"
  VIAddVersionKey "LegalCopyright" "© [% pc("firefox", "var/copyright_year") %] [% IF c('var/mullvad-browser') -%]Mullvad, Tor Browser and Mozilla Developers[% ELSE -%]The Tor Project[% END -%]"
  VIAddVersionKey "FileDescription" "[% display_name %] Portable Installer"
  VIAddVersionKey "LegalCopyright" "© [% pc('firefox', 'var/copyright_year') %] [% IF c('var/mullvad-browser') %]Mullvad, Tor Browser and Mozilla Developers[% ELSE %]The Tor Project[% END %]"

;--------------------------------
; Interface Configuration

  !define MUI_ICON   "[% c('var/projectname') %][% IF !c('var/base-browser') -%]-[% c('var/channel') %][% END -%].ico"
  !define MUI_ICON "[% c('var/projectname') %][% IF !c('var/base-browser') %]-[% c('var/channel') %][% END %].ico"
  !define MUI_ABORTWARNING

;--------------------------------
; Modern UI settings
  !define MUI_FINISHPAGE_NOREBOOTSUPPORT     ; we don't require a reboot
  !define MUI_FINISHPAGE_NOREBOOTSUPPORT ; Reboot not required
  !define MUI_FINISHPAGE_RUN
  !define MUI_FINISHPAGE_RUN_FUNCTION "StartBrowser"
  !define MUI_FINISHPAGE_SHOWREADME ; misuse for option to create shortcut; less ugly than MUI_PAGE_COMPONENTS

  ; Misuse the option to show the readme to create the shortcuts.
  ; Less ugly than MUI_PAGE_COMPONENTS.
  !define MUI_FINISHPAGE_SHOWREADME
  !define MUI_FINISHPAGE_SHOWREADME_TEXT "&Add Start Menu && Desktop shortcuts"
  !define MUI_FINISHPAGE_SHOWREADME_FUNCTION "CreateShortCuts"

;--------------------------------
; Pages

  !define MUI_PAGE_CUSTOMFUNCTION_LEAVE CheckIfTargetDirectoryExists
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
@@ -78,68 +73,44 @@

;--------------------------------
; Languages

  !insertmacro MUI_LANGUAGE "English" ;first language is the default language
  !insertmacro MUI_LANGUAGE "French"
  !insertmacro MUI_LANGUAGE "German"
  !insertmacro MUI_LANGUAGE "Spanish"
  !insertmacro MUI_LANGUAGE "SpanishInternational"
  !insertmacro MUI_LANGUAGE "SimpChinese"
  !insertmacro MUI_LANGUAGE "TradChinese"
  !insertmacro MUI_LANGUAGE "Japanese"
  !insertmacro MUI_LANGUAGE "Korean"
  !insertmacro MUI_LANGUAGE "Italian"
  !insertmacro MUI_LANGUAGE "Dutch"
  !insertmacro MUI_LANGUAGE "Danish"
  !insertmacro MUI_LANGUAGE "Swedish"
  !insertmacro MUI_LANGUAGE "Norwegian"
  !insertmacro MUI_LANGUAGE "NorwegianNynorsk"
  !insertmacro MUI_LANGUAGE "Finnish"
  !insertmacro MUI_LANGUAGE "Greek"
  !insertmacro MUI_LANGUAGE "Russian"
  !insertmacro MUI_LANGUAGE "Portuguese"
  !insertmacro MUI_LANGUAGE "PortugueseBR"
  !insertmacro MUI_LANGUAGE "Polish"
  !insertmacro MUI_LANGUAGE "Ukrainian"
  !insertmacro MUI_LANGUAGE "Czech"
  !insertmacro MUI_LANGUAGE "Slovak"
  !insertmacro MUI_LANGUAGE "Croatian"
  !insertmacro MUI_LANGUAGE "Bulgarian"
  !insertmacro MUI_LANGUAGE "Hungarian"
  !insertmacro MUI_LANGUAGE "Thai"
  !insertmacro MUI_LANGUAGE "Romanian"
  !insertmacro MUI_LANGUAGE "Latvian"
  !insertmacro MUI_LANGUAGE "Macedonian"
  !insertmacro MUI_LANGUAGE "Estonian"
  !insertmacro MUI_LANGUAGE "Turkish"
  !insertmacro MUI_LANGUAGE "Lithuanian"
  !insertmacro MUI_LANGUAGE "Slovenian"
  !insertmacro MUI_LANGUAGE "Serbian"
  !insertmacro MUI_LANGUAGE "SerbianLatin"
  !insertmacro MUI_LANGUAGE "Arabic"
  !insertmacro MUI_LANGUAGE "Farsi"
  !insertmacro MUI_LANGUAGE "Hebrew"
  !insertmacro MUI_LANGUAGE "Indonesian"
  !insertmacro MUI_LANGUAGE "Mongolian"
  !insertmacro MUI_LANGUAGE "Luxembourgish"
  !insertmacro MUI_LANGUAGE "Albanian"
  !insertmacro MUI_LANGUAGE "Breton"
  !insertmacro MUI_LANGUAGE "Belarusian"
  !insertmacro MUI_LANGUAGE "Icelandic"
  !insertmacro MUI_LANGUAGE "Malay"
  !insertmacro MUI_LANGUAGE "Bosnian"
  !insertmacro MUI_LANGUAGE "Kurdish"
  !insertmacro MUI_LANGUAGE "Irish"
  !insertmacro MUI_LANGUAGE "Uzbek"
  !insertmacro MUI_LANGUAGE "Galician"
  !insertmacro MUI_LANGUAGE "Afrikaans"
  !insertmacro MUI_LANGUAGE "Catalan"
  !insertmacro MUI_LANGUAGE "Esperanto"

;--------------------------------
;Multi Language support: Read strings from separate file

; !include [% c('var/projectname') %]-langstrings.nsi
  !insertmacro MUI_LANGUAGE "English" ; First language is the default language
  !insertmacro MUI_LANGUAGE "Arabic" ; ar
  !insertmacro MUI_LANGUAGE "Catalan" ; ca
  !insertmacro MUI_LANGUAGE "Czech" ; cs
  !insertmacro MUI_LANGUAGE "Danish" ; da
  !insertmacro MUI_LANGUAGE "German" ; de
  !insertmacro MUI_LANGUAGE "Greek" ; el
  !insertmacro MUI_LANGUAGE "Spanish" ; es-ES
  !insertmacro MUI_LANGUAGE "Farsi" ; fa
  !insertmacro MUI_LANGUAGE "Finnish" ; fi
  !insertmacro MUI_LANGUAGE "French" ; fr
  !insertmacro MUI_LANGUAGE "ScotsGaelic" ; ga-IE
  !insertmacro MUI_LANGUAGE "Hebrew" ; he
  !insertmacro MUI_LANGUAGE "Hungarian" ; hu
  !insertmacro MUI_LANGUAGE "Indonesian"; id
  !insertmacro MUI_LANGUAGE "Icelandic" ; is
  !insertmacro MUI_LANGUAGE "Italian" ; it
  !insertmacro MUI_LANGUAGE "Japanese" ; ja
  !insertmacro MUI_LANGUAGE "Georgian" ; ka
  !insertmacro MUI_LANGUAGE "Korean" ; ko
  !insertmacro MUI_LANGUAGE "Lithuanian" ; lt
  !insertmacro MUI_LANGUAGE "Macedonian" ; mk
  !insertmacro MUI_LANGUAGE "Malay" ; ms
  ; Burmese - my: not available on NSIS
  !insertmacro MUI_LANGUAGE "Norwegian" ; nb-NO
  !insertmacro MUI_LANGUAGE "Dutch" ; nl
  !insertmacro MUI_LANGUAGE "Polish" ; pl
  !insertmacro MUI_LANGUAGE "PortugueseBR" ; pt-BR
  !insertmacro MUI_LANGUAGE "Romanian" ; ro
  !insertmacro MUI_LANGUAGE "Russian" ; ru
  !insertmacro MUI_LANGUAGE "Albanian" ; sq
  !insertmacro MUI_LANGUAGE "Swedish" ; sv-SE
  !insertmacro MUI_LANGUAGE "Thai" ; th
  !insertmacro MUI_LANGUAGE "Turkish" ; tr
  !insertmacro MUI_LANGUAGE "Ukrainian" ; uk
  !insertmacro MUI_LANGUAGE "Vietnamese" ; vi
  !insertmacro MUI_LANGUAGE "SimpChinese" ; zh-hans, zh-cn
  !insertmacro MUI_LANGUAGE "TradChinese" ; zh-hant, zh-tw

;--------------------------------
; Reserve Files
@@ -153,61 +124,16 @@
;--------------------------------
; Installer Sections

Section "[% c('var/Project_Name') %]" SecBrowser

Section "Browser" SecBrowser
  SetOutPath "$INSTDIR"
[% IF !system_install_mode -%]
  File /r "${PROGRAM_SOURCE}\*.*"
  CreateShortCut "$INSTDIR\Start [% c('var/Project_Name') %].lnk" "$INSTDIR\Browser\[% c('var/exe_name') %].exe"
[% ELSE -%]
  File /r "${PROGRAM_SOURCE}\Browser\*.*"

  ;Enable system-wide install in the browser
  FileOpen $0 "$INSTDIR\system-install" w
  FileClose $0

  ;Write the uninstaller
  WriteUninstaller $INSTDIR\uninstall.exe

  ;Add the uninstaller to the control panel
  WriteRegStr HKLM "${UNINST_KEY}" "DisplayName" "[% c('var/Project_Name') %]"
  WriteRegStr HKLM "${UNINST_KEY}" "UninstallString" "$\"$INSTDIR\uninstall.exe$\""
  WriteRegStr HKLM "${UNINST_KEY}" "QuietUninstallString" "$\"$INSTDIR\uninstall.exe$\" /S"
  WriteRegStr HKLM "${UNINST_KEY}" "Publisher" "[% IF c('var/mullvad-browser') -%]Mullvad VPN[% ELSE -%]The Tor Project[% END -%]"
  WriteRegStr HKLM "${UNINST_KEY}" "DisplayIcon" "$\"$INSTDIR\[% c('var/exe_name') %].exe$\""
  WriteRegStr HKLM "${UNINST_KEY}" "DisplayVersion" "[% c('var/torbrowser_version') %]"
  WriteRegDWORD HKLM "${UNINST_KEY}" "NoModify" "1"
  WriteRegDWORD HKLM "${UNINST_KEY}" "NoRepair" "1"
  ${GetSize} "$INSTDIR" "/S=0K" $0 $1 $2
  IntFmt $0 "0x%08X" $0
  WriteRegDWORD HKLM "${UNINST_KEY}" "EstimatedSize" "$0"
[% END -%]

SectionEnd

[% IF system_install_mode -%]
Section "Uninstall"
  RMDir /r "$INSTDIR"
  DeleteRegKey HKLM "${UNINST_KEY}"
  SetShellVarContext all
  Delete "$SMPROGRAMS\[% c('var/Project_Name') %].lnk"
  Delete "$DESKTOP\[% c('var/Project_Name') %].lnk"
  CreateShortCut "$INSTDIR\[% display_name %].lnk" "$INSTDIR\Browser\[% c('var/exe_name') %].exe"
SectionEnd
[% END -%]

Function CreateShortcuts
[% IF system_install_mode -%]
  SetShellVarContext all
[% END -%]
  CreateShortCut "$SMPROGRAMS\[% c('var/Project_Name') %].lnk" "$INSTDIR\[% IF !system_install_mode -%]Browser\[% END -%][% c('var/exe_name') %].exe"
  CreateShortCut "$DESKTOP\[% c('var/Project_Name') %].lnk" "$INSTDIR\[% IF !system_install_mode -%]Browser\[% END -%][% c('var/exe_name') %].exe"

FunctionEnd
;--------------------------------
; Installer Functions

Function .onInit

  ${IfNot} ${AtLeastWin7}
    MessageBox MB_USERICON|MB_OK "[% c('var/Project_Name') %] requires at least Windows 7"
    SetErrorLevel 1
@@ -218,31 +144,26 @@ Function .onInit
  ; 10 is for PF_XMMI64_INSTRUCTIONS_AVAILABLE which will check whether the
  ; SSE2 instruction set is available.
  System::Call "kernel32::IsProcessorFeaturePresent(i 10)i .R7"

  ${If} "$R7" == "0"
    MessageBox MB_OK|MB_ICONSTOP "Sorry, [% c('var/Project_Name') %] can't be installed. This version of [% c('var/Project_Name') %] requires a processor with SSE2 support."
    Abort
  ${EndIf}

  !insertmacro MUI_LANGDLL_DISPLAY

FunctionEnd

;--------------------------------
;Helper Functions

Function CheckIfTargetDirectoryExists
  ${If} ${FileExists} "$INSTDIR\*.*"
 MessageBox MB_YESNO "The destination directory already exists. You can try to upgrade the [% c('var/Project_Name') %], but if you run into any problems, use a new directory instead. Continue?" IDYES NoAbort
    MessageBox MB_YESNO "The destination directory already exists. Do you want to continue anyway?" IDYES +2
    Abort
 NoAbort:
  ${EndIf}
FunctionEnd

Function CreateShortcuts
  CreateShortCut "$SMPROGRAMS\[% display_name %].lnk" "$INSTDIR\[% IF !system_install_mode -%]Browser\[% END -%][% c('var/exe_name') %].exe"
  CreateShortCut "$DESKTOP\[% display_name %].lnk" "$INSTDIR\[% IF !system_install_mode -%]Browser\[% END -%][% c('var/exe_name') %].exe"
FunctionEnd

Function StartBrowser
[% IF !system_install_mode -%]
  ExecShell "open" "$INSTDIR/Start [% c('var/Project_Name') %].lnk"
[% ELSE -%]
  ExecShell "open" "$INSTDIR/[% c('var/exe_name') %].exe"
[% END -%]
  ExecShell "open" "$INSTDIR/[% display_name %].lnk"
FunctionEnd