Detects simsial projects.
[gpg4win.git] / src / installer.nsi
1 # installer.nsi - Installer for GnuPG 4 Windows.    -*- coding: latin-1; -*-
2 # Copyright (C) 2005 g10 Code GmbH
3
4 # This file is part of GPG4Win.
5
6 # GPG4Win is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
10
11 # GPG4Win is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14 # GNU General Public License for more details.
15
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
19
20 # No servicable parts beyond this line.  Stay clear :)
21
22 !ifdef REQUIRE_W32_NSIS
23 !ifdef PACKAGE_LIBRARY
24 !include "Library.nsh"
25 !endif
26 !else
27 !macro InstallLib libtype shared install localfile destfile tempbasedir
28   File "${localfile}"
29 !macroend
30 !endif
31
32
33 # We use the modern UI.
34 !include "MUI.nsh"
35
36 # Set the package name.  Note that this name should not be sufficed
37 #  with the version because this would get displayed in the start menu.
38 Name "${PRETTY_PACKAGE}"
39
40
41 # Set the output filename.
42 OutFile "${PACKAGE}-${VERSION}.exe"
43
44 Icon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
45 UninstallIcon "${TOP_SRCDIR}/doc/logo/gpg4win-logo-icon.ico"
46
47 # Set the installation directory.
48 !ifndef INSTALL_DIR
49 !define INSTALL_DIR "${PACKAGE}"
50 !endif
51 InstallDir "$PROGRAMFILES\GNU\${INSTALL_DIR}" 
52
53
54 InstallDirRegKey HKLM "Software\GNU\${PRETTY_PACKAGE_SHORT}" \
55         "Install Directory"
56
57
58 # Add version information to the file properties.
59 VIProductVersion "${PROD_VERSION}"
60 VIAddVersionKey "ProductName" "${PRETTY_PACKAGE_SHORT} (${VERSION})"
61 !ifdef LICENSE_GPL
62 VIAddVersionKey "Comments" \
63    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
64     and/or modify it under the terms of the GNU General Public License.  \
65     You should have received a copy of the GNU General Public License  \
66     along with this software; if not, write to the Free Software  \
67     Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
68     MA 02110-1301, USA"
69 !else
70 VIAddVersionKey "Comments" \
71    "${PRETTY_PACKAGE_SHORT} is Free Software; you can redistribute it  \
72     and/or modify it under the terms of the GNU Lesser General Public  \
73     License. You should have received a copy of the GNU Lesser General  \
74     Public License along with this software; if not, write to the Free  \
75     Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,  \
76     MA 02110-1301, USA"
77 !endif
78 VIAddVersionKey "CompanyName" "${COMPANY}"
79 VIAddVersionKey "LegalTrademarks" ""
80 VIAddVersionKey "LegalCopyright" "${COPYRIGHT}"
81 VIAddVersionKey "FileDescription" "${DESCRIPTION}"
82 VIAddVersionKey "FileVersion" "${PROD_VERSION}"
83
84 # Set to the name of another GnupG installation if one has been detected
85 Var OtherGnuPGDetected
86
87 # Interface Settings
88
89 # !define MUI_ABORTWARNING
90 !define MUI_FINISHPAGE_NOAUTOCLOSE
91 !define MUI_UNFINISHPAGE_NOAUTOCLOSE
92
93 # Remember the installer language
94
95 #!define MUI_LANGDLL_REGISTRY_ROOT "HKCU" 
96 #!define MUI_LANGDLL_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}" 
97 #!define MUI_LANGDLL_REGISTRY_VALUENAME "Installer Language"
98
99 # The list of wizard pages.
100
101 !define MUI_WELCOMEPAGE_TITLE "$(T_WelcomeTitle)"
102 !define MUI_WELCOMEPAGE_TEXT  "$(T_About)"
103 !insertmacro MUI_PAGE_WELCOME
104
105 !define MUI_LICENSEPAGE_BUTTON "$(^NextBtn)"
106 !define MUI_PAGE_HEADER_SUBTEXT "$(T_GPLHeader)"
107 !define MUI_LICENSEPAGE_TEXT_BOTTOM "$(T_GPLShort)"
108 !insertmacro MUI_PAGE_LICENSE "${TOP_SRCDIR}/COPYING"
109
110 !define MUI_PAGE_CUSTOMFUNCTION_SHOW PrintNonAdminWarning
111 !insertmacro MUI_PAGE_COMPONENTS
112
113 !insertmacro MUI_PAGE_DIRECTORY
114
115 !ifdef HAVE_STARTMENU
116 Var STARTMENU_FOLDER
117
118 !define MUI_STARTMENUPAGE_REGISTRY_ROOT "HKCU"
119 !define MUI_STARTMENUPAGE_REGISTRY_KEY "Software\GNU\${PRETTY_PACKAGE_SHORT}"
120 !define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "Start Menu Folder"
121
122 !insertmacro MUI_PAGE_STARTMENU Application $STARTMENU_FOLDER
123 !endif
124
125 !define MUI_PAGE_CUSTOMFUNCTION_PRE PrintCloseOtherApps
126 !insertmacro MUI_PAGE_INSTFILES
127
128 !define MUI_PAGE_CUSTOMFUNCTION_PRE ShowFinalWarnings
129 !define MUI_FINISHPAGE_SHOWREADME "README.$(T_LangCode).txt"
130 !define MUI_FINISHPAGE_SHOWREADME_TEXT "$(T_ShowReadme)"
131 #!define MUI_FINISHPAGE_RUN
132 #!define MUI_FINISHPAGE_RUN_FUNCTION RunOnFinish
133 #!define MUI_FINISHPAGE_RUN_TEXT "$(T_RunKeyManager)"
134 #!define MUI_FINISHPAGE_RUN_NOTCHECKED
135 !define MUI_FINISHPAGE_LINK "$(T_MoreInfo)"
136 !define MUI_FINISHPAGE_LINK_LOCATION http://www.gpg4win.org
137 !insertmacro MUI_PAGE_FINISH
138
139
140 # Uninstaller pages.
141
142 !insertmacro MUI_UNPAGE_CONFIRM
143 !insertmacro MUI_UNPAGE_INSTFILES
144
145
146 #Page license
147 #Page components
148 #Page directory
149 #Page instfiles
150 #UninstPage uninstConfirm
151 #UninstPage instfiles
152
153
154 # Language support.  This has to be done after defining the pages, but
155 # before defining the translation strings.  Confusing.
156
157 !insertmacro MUI_LANGUAGE "English"
158 !insertmacro MUI_LANGUAGE "German"
159
160 #!insertmacro MUI_RESERVEFILE_LANGDLL
161 #!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
162 ReserveFile "${BUILD_DIR}\g4wihelp.dll"
163 ReserveFile "${TOP_SRCDIR}\doc\logo\gpg4win-logo-400px.bmp"
164 !ifdef SOURCES
165 ReserveFile "${TOP_SRCDIR}\src\gpg4win-splash.wav"
166 !endif
167 ReserveFile "${TOP_SRCDIR}\COPYING"
168
169 # Language support
170
171 LangString T_LangCode ${LANG_ENGLISH} "en"
172 LangString T_LangCode ${LANG_GERMAN}  "de"
173
174
175 # The WelcomeTitle is displayed on the first page.
176 LangString T_WelcomeTitle ${LANG_ENGLISH} "${WELCOME_TITLE_ENGLISH}"
177 LangString T_WelcomeTitle ${LANG_GERMAN} "${WELCOME_TITLE_GERMAN}"
178
179 # The About string as displayed on the first page.
180 LangString T_About ${LANG_ENGLISH} "${ABOUT_ENGLISH}"
181 LangString T_About ${LANG_GERMAN} "${ABOUT_GERMAN}"
182
183 # Startup page
184 LangString T_GPLHeader ${LANG_ENGLISH} \
185   "This software is licensed under the terms of the GNU General Public \
186    License (GPL) which guarantees your freedom to share and change Free \
187    Software."
188 LangString T_GPLHeader ${LANG_GERMAN}} \
189   "Diese Software ist unter der GNU General Public License \
190    (GPL) lizensiert; dies gibt Ihnen die Freiheit, sie \
191    zu ändern und weiterzugeben."
192
193 LangString T_GPLShort ${LANG_ENGLISH} \
194   "In short: You are allowed to run this software for any purpose. \
195    You may distribute it as long as you give the recipients the same \
196    rights you have received."
197 LangString T_GPLShort ${LANG_GERMAN} \
198   "In aller Kürze: Sie haben das Recht, die Software zu jedem Zweck \
199    einzusetzen.  Sie können die Software weitergeben, sofern Sie dem \
200    Empfänger dieselben Rechte einräumen, die auch Sie erhalten haben."
201
202 LangString T_RunKeyManager ${LANG_ENGLISH} \
203    "Run the key manager"
204 LangString T_RunKeyManager ${LANG_GERMAN} \
205    "Die Schlüsselverwaltung aufrufen"
206
207 LangString T_MoreInfo ${LANG_ENGLISH} \
208    "Click here for the project's homepage"
209 LangString T_MoreInfo ${LANG_GERMAN} \
210    "Hier klicken um zur Homepage des Projekts zu gelangen"
211
212 LangString T_ShowReadme ${LANG_ENGLISH} \
213    "Show the README file"
214 LangString T_ShowReadme ${LANG_GERMAN} \
215    "Die README Datei anzeigen"
216
217 LangString T_NoKeyManager ${LANG_ENGLISH} \
218    "No key manager has been installed, thus we can't run one now."
219 LangString T_NoKeyManager ${LANG_GERMAN} \
220    "Es wurde keine Schlüsselverwaltung installiert. \
221     Deswegen kann sie jetzt auch nicht ausgeführt werden."
222
223
224 # Functions
225
226 # Custom functions and macros for gpg4win. 
227 !include "g4wihelp.nsi"
228
229
230 # Display a warning if GnuPP has been detected and allow the user to abort
231 # the installation.
232 Function PrintGnuPPWarning
233    MessageBox MB_YESNO "$(T_FoundOldGnuPP)" IDYES cont
234      Abort
235  cont:
236    StrCpy $OtherGnuPGDetected "GnuPP"
237 FunctionEnd
238
239 # Display a warning if GnuPT has been detected and allow the user to abort
240 # the installation.
241 Function PrintGnuPTWarning
242    MessageBox MB_YESNO "$(T_FoundOldGnuPT)" IDYES cont
243      Abort
244  cont:
245    StrCpy $OtherGnuPGDetected "GnuPT"
246 FunctionEnd
247
248 # Display a warning if GnuPG Pack has been detected and abort the
249 # the installation.  This one clobbers our own Registry space.
250 Function PrintGnuPackWarning
251    MessageBox MB_OK "$(T_FoundOldGnuPack)"
252    Abort
253 FunctionEnd
254
255
256 # Check whether one of the other GnuPG systems has already been
257 # installed.  We do this by looking at the registry.
258 Function CheckOtherGnuPGApps
259   StrCpy $OtherGnuPGDetected ""
260   ClearErrors
261   ReadRegStr $0 HKLM "Software\GNU\GnuPP\Settings" "Path"
262   IfErrors +2 0
263     Call PrintGnuPPWarning
264
265   EnumRegKey $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Explorer\MenuOrder\Start Menu\Programs\GnuPT" 0
266   StrCmp $0 "" +2
267     Call PrintGnuPTWarning
268
269   ReadRegStr $0 HKLM "Software\GNU\GnuPG" "Install Directory"
270   Push $0
271   Push "GnuPG-Pack"
272   Call StrStr
273   Pop $0
274   StrCmp $0 "" +2
275     Call PrintGnuPackWarning
276
277 FunctionEnd
278
279
280 # PrintNonAdminWarning
281
282 # Check whether the current user is in the Administrator group or an
283 # OS version without the need for an Administrator is in use.  Print a
284 # warning if this is not the case.
285 Function PrintNonAdminWarning
286   ClearErrors
287   UserInfo::GetName
288   IfErrors leave
289   Pop $0
290   UserInfo::GetAccountType
291   Pop $1
292   StrCmp $1 "Admin" leave +1
293   MessageBox MB_OK "$(T_AdminNeeded)"
294
295  leave:
296 FunctionEnd
297
298
299 # Check whether this is a reinstall and popup a message box to explain
300 # that it is better to close other apps before continuing
301 Function PrintCloseOtherApps
302     IfFileExists $INSTDIR\gnupg.exe print_warning
303     IfFileExists $INSTDIR\winpt.exe print_warning
304     IfFileExists $INSTDIR\gpa.exe   print_warning
305     IfFileExists $INSTDIR\gpgol.dll print_warning
306     IfFileExists $INSTDIR\gpgee.dll print_warning
307     Return
308    print_warning:
309     MessageBox MB_OK|MB_ICONEXCLAMATION "$(T_CloseOtherApps)"
310     IfFileExists $INSTDIR\winpt.exe 0 +2
311       ExecWait '"$INSTDIR\winpt.exe" --stop'
312    leave:
313 FunctionEnd
314
315 # Called right before the final page to show more warnings.
316 Function ShowFinalWarnings
317    StrCmp $OtherGnupgDetected "" +2
318      MessageBox MB_OK "$(T_FoundOldSeeManual)"
319    leave:
320 FunctionEnd
321
322 #---------------------------------------------
323 # From the old installation checking functions
324 #---------------------------------------------
325 LangString T_FoundOldSeeManual ${LANG_ENGLISH} \
326      "Please see the Gpg4win manual to learn how to migrate existing \
327       keys from other GnuPG based installations to Gpg4win."
328 LangString T_FoundOldSeeManual ${LANG_GERMAN} \
329      "Bitte sehen Sie im Gpg4win für Durchblicker Handbuch nach, wie Sie \
330       Schlüssel aus anderen - GnuPG basierten - Installationen in Gpg4win \
331       überführen."
332
333 #---------
334 LangString T_FoundOldGnuPP ${LANG_ENGLISH} \
335      "An old installation of GnuPP (GNU Privacy Project) has been been \
336       detected.  That software is not maintained anymore and thus should \
337       be removed. \
338           \
339       Do you want to continue installing Gpg4win and take care of the old \
340       installation later?"
341 LangString T_FoundOldGnuPP ${LANG_GERMAN} \
342      "Eine alte Installation von GnuPP (GNU Privacy Project) wurde gefunden. \
343       Diese Software wird nicht mehr gepflegt und sollte deshalb vom \
344       System entfernt werden. \
345         \
346       Möchten Sie die Installation von Gpg4win weiter durchführen und sich \
347       dann später um die Entfernung von GnuPP kümmern?"
348
349 #---------
350 LangString T_FoundOldGnuPT ${LANG_ENGLISH} \
351      "An installation of GnuPT has been been detected.  This may cause \
352       problems when used along with Gpg4win. \
353           \
354       Do you want to continue installing Gpg4win?"
355 LangString T_FoundOldGnuPT ${LANG_GERMAN} \
356      "Eine Installation von GnuPT wurde gefunden.  Dies kann zu Problemen \
357       führen, falls GnuPT zusammem mit Gpg4win benutzt wird. \r\n\r\n \
358       Möchten Sie die Installation von Gpg4win fortführen?"
359
360 #--------
361 LangString T_FoundOldGnuPack ${LANG_ENGLISH} \
362      "An installation of GnuPG-Pack has been been detected. You need to \
363       uninstall it before you can continue with Gpg4win installation. \
364         \
365       The installation will be aborted now!"
366 LangString T_FoundOldGnuPack ${LANG_GERMAN} \
367      "Eine Installation con GnuPG-Pack wurde gefunden.  Sie müssen diese \
368       zuerst deinstallieren bevor Sie mit der Installation von Gpg4win \
369       fortfahren können. \
370         \
371       Die Installation von Gpg4win wird nun abgebrochen!"
372
373
374
375 # From Function PrintNonAdminWarning
376 LangString T_AdminNeeded ${LANG_ENGLISH} \
377    "Warning: Administrator permissions required for a successful installation"
378 LangString T_AdminNeeded ${LANG_GERMAN} \
379    "Achtung: Für eine erfolgreiche Installation werden \
380     Administratorrechte benötigt."
381
382 # From Function PrintCloseOtherApps
383 LangString T_CloseOtherApps ${LANG_ENGLISH} \
384    "Please make sure that other applications are not running. \
385     In particular you should close Outlook and all Explorer \
386     windows.  Gpg4Win will try to install anyway but a reboot \
387     will be required then."
388 LangString T_CloseOtherApps ${LANG_GERMAN} \
389    "Bitte stellen Sie sicher, daß alle anderen Anwendugen geschlossen \
390     sind.  Insbesondere sollten Sie Outlook und alle Explorer Fenster \
391     schliessen bevor Sie die Installation fortsetzen.  Gpg4Win wird auf \
392     jeden Fall versuchen, eine Installation durchzuführen; es ist dann aber \
393     u.U. notwendig, das System neu zu starten."
394
395 # FIXME: The GetAfterChar function comes from the NSIS wiki.
396 Function un.GetAfterChar
397   Exch $0 ; chop char
398   Exch
399   Exch $1 ; input string
400   Push $2
401   Push $3
402   StrCpy $2 0
403   loop:
404     IntOp $2 $2 - 1
405     StrCpy $3 $1 1 $2
406     StrCmp $3 "" 0 +3
407       StrCpy $0 ""
408       Goto exit2
409     StrCmp $3 $0 exit1
410     Goto loop
411   exit1:
412     IntOp $2 $2 + 1
413     StrCpy $0 $1 "" $2
414   exit2:
415     Pop $3
416     Pop $2
417     Pop $1
418     Exch $0 ; output
419 FunctionEnd
420
421
422 Function un.SourceDelete
423   Push "/"
424   Call un.GetAfterChar
425   Pop $R0
426   Delete "$INSTDIR\$R0"
427 FunctionEnd
428
429
430 # StrStr  - taken from the NSIS reference
431 # input, top of stack = string to search for
432 #        top of stack-1 = string to search in
433 # output, top of stack (replaces with the portion of the string remaining)
434 # modifies no other variables.
435 #
436 # Usage:
437 #   Push "this is a long ass string"
438 #   Push "ass"
439 #   Call StrStr
440 #   Pop $R0
441 #  ($R0 at this point is "ass string")
442 #
443 Function StrStr
444    Exch $R1 # st=haystack,old$R1, $R1=needle
445    Exch     # st=old$R1,haystack
446    Exch $R2 # st=old$R1,old$R2, $R2=haystack
447    Push $R3
448    Push $R4
449    Push $R5
450    StrLen $R3 $R1
451    StrCpy $R4 0
452    # $R1=needle
453    # $R2=haystack
454    # $R3=len(needle)
455    # $R4=cnt
456    # $R5=tmp
457    loop:
458      StrCpy $R5 $R2 $R3 $R4
459      StrCmp $R5 $R1 done
460      StrCmp $R5 "" done
461      IntOp $R4 $R4 + 1
462      Goto loop
463  done:
464    StrCpy $R1 $R2 "" $R4
465    Pop $R5
466    Pop $R4
467    Pop $R3
468    Pop $R2
469    Exch $R1
470 FunctionEnd