-
Notifications
You must be signed in to change notification settings - Fork 8
/
ncdns.nsi
698 lines (588 loc) · 26.4 KB
/
ncdns.nsi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
!ifndef NCDNS_PRODVER
#!ifdef POSIX_BUILD
!error "Must define NCDNS_PRODVER"
#!else
## This won't currently work for Go binaries, since they don't have any
## version information embedded in them.
# !system 'powershell -executionpolicy bypass -noninteractive -file getver.ps1 . < nul'
# !include '_ver.nsi'
# !delfile '_ver.nsi'
#!endif
!endif
!include "MUI2.nsh"
# INSTALLER SETTINGS
##############################################################################
OutFile "build\ncdns-install.exe"
# Jeremy Rand thinks people shouldn't change this because it might affect build
# determinism, so any PR which changes this should probably highlight him or
# something.
SetCompressor /SOLID lzma
!define MUI_ICON "media\namecoin.ico"
!define MUI_FINISHPAGE_NOAUTOCLOSE
!define MUI_UNFINISHPAGE_NOAUTOCLOSE
!define MUI_PAGE_CUSTOMFUNCTION_SHOW ShowCallback
!include "components-dialog.nsdinc"
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
Page custom ComponentDialogCreate ComponentDialogLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_UNPAGE_FINISH
!insertmacro MUI_LANGUAGE English
!ifdef NCDNS_64BIT
InstallDir $PROGRAMFILES64\ncdns
!else
InstallDir $PROGRAMFILES\ncdns
!endif
InstallDirRegKey HKLM "Software\Namecoin\ncdns" "InstallPath"
ShowInstDetails show
ShowUninstDetails show
RequestExecutionLevel admin
XPStyle on
CRCCheck on
# Branding.
Name "ncdns for Windows"
BrandingText "Namecoin"
# Installer .exe version tables.
VIAddVersionKey "ProductName" "ncdns"
VIAddVersionKey "ProductVersion" "${NCDNS_PRODVER}"
VIProductVersion "${NCDNS_PRODVER}"
VIAddVersionKey "InternalName" "ncdns"
VIAddVersionKey "FileDescription" "ncdns Installer"
VIAddVersionKey "FileVersion" "${NCDNS_PRODVER}"
!ifndef POSIX_BUILD
VIFileVersion "${NCDNS_PRODVER}"
!endif
VIAddVersionKey "OriginalFilename" "ncdns-install.exe"
VIAddVersionKey "CompanyName" "Namecoin"
VIAddVersionKey "LegalCopyright" "2017 Hugo Landau <hlandau@devever.net>"
VIAddVersionKey "LegalTrademarks" "ncdns, Namecoin"
VIAddVersionKey "Comments" "ncdns Installer"
# VARIABLES
##############################################################################
Var /GLOBAL Reinstalling
Var /GLOBAL UnboundConfPath
Var /GLOBAL UnboundFragmentLocation
Var /GLOBAL DNSSECTriggerUninstallCommand
Var /GLOBAL NamecoinCoreUninstallCommand
Var /GLOBAL NamecoinCoreDataDir
Var /GLOBAL SkipNamecoinCore
Var /GLOBAL SkipUnbound
Var /GLOBAL NamecoinCoreDetected
Var /GLOBAL UnboundDetected
# PRELAUNCH CHECKS
##############################################################################
!Include WinVer.nsh
Function .onInit
${IfNot} ${AtLeastWinVista}
MessageBox "MB_OK|MB_ICONSTOP" "ncdns requires Windows Vista or later."
Abort
${EndIf}
# Make sections mandatory.
Call ConfigSections
# Detect already installed dependencies.
Call DetectVC8 # aborts on failure
Call DetectNamecoinCore
Call DetectUnbound
FunctionEnd
Function DetectVC8
# Check that MSVC8 runtime is installed for dnssec-keygen.
FindFirst $0 $1 $WINDIR\WinSxS\x86_microsoft.vc80.crt_1fc8b3b9a1e18e3b_8.*
StrCmp $1 "" notfound
Goto found
notfound:
FindClose $0
MessageBox "MB_OK|MB_ICONSTOP" "ncdns for Windows requires the Microsoft Visual C 8.0 runtime.$\n$\nYou can download it from:$\nhttps://www.microsoft.com/en-us/download/details.aspx?id=5638"
ExecShell "open" "https://www.microsoft.com/en-us/download/details.aspx?id=5638"
Abort
found:
FindClose $0
FunctionEnd
Function DetectNamecoinCore
ClearErrors
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Namecoin Core (32-bit)" "UninstallString"
IfErrors 0 found
ClearErrors
ReadRegStr $0 HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Namecoin Core (64-bit)" "UninstallString"
IfErrors 0 found
Goto absent
found:
Push 1
Pop $NamecoinCoreDetected
Return
absent:
Push 0
Pop $NamecoinCoreDetected
FunctionEnd
Function DetectUnbound
ClearErrors
ReadRegDWORD $0 HKLM "System\CurrentControlSet\Services\unbound" "Type"
IfErrors absent 0
Push 1
Pop $UnboundDetected
Return
absent:
Push 0
Pop $UnboundDetected
FunctionEnd
# DIALOG HELPERS
##############################################################################
Function ShowCallback
SendMessage $mui.WelcomePage.Text ${WM_SETTEXT} 0 "STR:$(MUI_TEXT_WELCOME_INFO_TEXT)$\n$\nThis software is open source and licenced under the GPLv3 License. It is distributed WITHOUT ANY WARRANTY."
FunctionEnd
Function ComponentDialogCreate
Call fnc_components_dialog_Create
${If} $NamecoinCoreDetected == 1
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_Status "An existing Namecoin Core installation was detected."
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_Yes "Automatically configure Namecoin Core (recommended)"
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_No "I will configure Namecoin Core myself (manual configuration required)"
${Else}
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_Status "An existing Namecoin Core installation was not detected."
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_Yes "Install and configure Namecoin Core (recommended)"
${NSD_SetText} $hCtl_components_dialog_NamecoinCore_No "I will provide my own Namecoin node (manual configuration required)"
${EndIf}
${If} $UnboundDetected == 1
${NSD_SetText} $hCtl_components_dialog_Unbound_Status "An existing Unbound installation was detected."
${NSD_SetText} $hCtl_components_dialog_Unbound_Yes "Automatically configure Unbound (recommended)"
${NSD_SetText} $hCtl_components_dialog_Unbound_No "I will configure Unbound myself (manual configuration required)"
${Else}
${NSD_SetText} $hCtl_components_dialog_Unbound_Status "An existing Unbound installation was not detected."
${NSD_SetText} $hCtl_components_dialog_Unbound_Yes "Install and configure Unbound/DNSSEC Trigger (recommended)"
${NSD_SetText} $hCtl_components_dialog_Unbound_No "I will provide my own DNS resolver (manual configuration required)"
${EndIf}
nsDialogs::Show
FunctionEnd
Function ComponentDialogLeave
${NSD_GetState} $hCtl_components_dialog_NamecoinCore_No $SkipNamecoinCore
${NSD_GetState} $hCtl_components_dialog_Unbound_No $SkipUnbound
FunctionEnd
# INSTALL SECTIONS
##############################################################################
Section "ncdns" Sec_ncdns
SetOutPath $INSTDIR
Call ReinstallCheck
Call Reg
Call DNSSECTrigger
Call NamecoinCoreConfig
Call NamecoinCore
Call Service
Call Files
Call FilesSecurePre
Call KeyConfig
Call TrustConfig
Call FilesSecure
Call ServiceStart
Call UnboundConfig
AddSize 12288 # Disk space estimation.
SectionEnd
# UNINSTALL SECTIONS
##############################################################################
Section "Uninstall"
Call un.UnboundConfig
Call un.TrustConfig
Call un.Service
Call un.Files
Call un.NamecoinCore
Call un.DNSSECTrigger
Call un.Reg
RMDir "$INSTDIR"
SectionEnd
# REGISTRY AND UNINSTALL INFORMATION INSTALLATION/UNINSTALLATION
##############################################################################
Function Reg
WriteRegStr HKLM "Software\Namecoin\ncdns" "InstallPath" "$INSTDIR"
# Uninstall information.
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "DisplayName" "Namecoin ncdns"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "UninstallString" '"$INSTDIR\uninst.exe"'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "QuietUninstallString" '"$INSTDIR\uninst.exe" /S'
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "InstallLocation" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "DisplayIcon" "$INSTDIR\namecoin.ico"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "Publisher" "Namecoin"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "HelpLink" "https://www.namecoin.org/"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "URLInfoAbout" "https://www.namecoin.org/"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "NoRepair" 1
FunctionEnd
Function un.Reg
DeleteRegKey HKLM "Software\Namecoin\ncdns"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns"
FunctionEnd
# DNSSEC TRIGGER CHAIN INSTALLATION
##############################################################################
Function DNSSECTrigger
!ifndef NO_DNSSEC_TRIGGER
${If} $UnboundDetected == 1
# Already have DNSSEC Trigger
Return
${EndIf}
${If} $SkipUnbound == ${BST_CHECKED}
Return
${EndIf}
# Install DNSSEC Trigger
DetailPrint "Installing DNSSEC Trigger..."
File /oname=$TEMP\dnssec_trigger_setup.exe artifacts\dnssec_trigger_setup.exe
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledDNSSECTrigger" 1
ExecWait $TEMP\dnssec_trigger_setup.exe
Delete /REBOOTOK $TEMP\dnssec_trigger_setup.exe
!endif
FunctionEnd
Function un.DNSSECTrigger
!ifndef NO_DNSSEC_TRIGGER
# Determine if we were responsible for installing DNSSEC Trigger; if so, we
# should offer to uninstall it.
ClearErrors
ReadRegDWORD $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledDNSSECTrigger"
IfErrors done
IntCmp $0 0 done
# Detect DNSSEC Trigger uninstall command. If we cannot find it, don't offer
# to uninstall it, as we don't know how.
ClearErrors
ReadRegStr $DNSSECTriggerUninstallCommand HKLM "Software\Wow6432Node\Microsoft\Windows\CurrentVersion\Uninstall\DnssecTrigger" "QuietUninstallString"
IfErrors 0 found
ReadRegStr $DNSSECTriggerUninstallCommand HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\DnssecTrigger" "QuietUninstallString"
IfErrors 0 found
Goto done
found:
# Ask the user if they want to uninstall DNSSEC Trigger.
MessageBox MB_YESNO|MB_ICONQUESTION "When you installed ncdns for Windows, DNSSEC Trigger was installed automatically as a necessary dependency of ncdns for Windows. Would you like to remove it? If you leave it in place, you will not be able to connect to .bit domains, but will still enjoy DNSSEC-secured domain name lookups.$\n$\nSelect Yes to remove DNSSEC Trigger." IDYES 0 IDNO done
# Uninstall DNSSEC Trigger.
DetailPrint "Uninstalling DNSSEC Trigger... $DNSSECTriggerUninstallCommand"
ExecWait $DNSSECTriggerUninstallCommand
DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledDNSSECTrigger"
done:
# Didn't install/not uninstalling DNSSEC Trigger.
!endif
FunctionEnd
# NAMECOIN CORE CONFIG
##############################################################################
Function NamecoinCoreConfig
${If} $SkipNamecoinCore == 1
Return
${EndIf}
# We have to set 'server=1' in namecoin.conf. We can use cookies to get the
# rest, so that's all we need.
#
# The Namecoin Core installer provides the user an option to launch Namecoin
# Core at the end. Therefore, we must do this before we launch the Namecoin Core
# installer.
#
ClearErrors
ReadRegStr $NamecoinCoreDataDir HKCU "Software\Namecoin\Namecoin-Qt" "strDataDir"
IfErrors 0 haveDataDir
# We need to set the data directory pre-emptively so we can put a new namecoin.conf
# there.
StrCpy $NamecoinCoreDataDir "$APPDATA\Namecoin"
WriteRegStr HKCU "Software\Namecoin\Namecoin-Qt" "strDataDir" $NamecoinCoreDataDir
haveDataDir:
CreateDirectory $NamecoinCoreDataDir
# Configure cookie directory.
CreateDirectory C:\ProgramData\NamecoinCookie
nsExec::ExecToLog 'icacls "C:\ProgramData\NamecoinCookie" /inheritance:r /T /grant "SYSTEM:(OI)(CI)F" "Administrators:(OI)(CI)F" "Users:(OI)(CI)F"'
# Now we need to make sure namecoin.conf exists and has 'server=1'.
# We'll do this with a powershell script, much as we do for configuring Unbound.
# Execute confignamecoinconf.ps1.
File /oname=$PLUGINSDIR\confignamecoinconf.ps1 confignamecoinconf.ps1
FileOpen $4 "$PLUGINSDIR\confignamecoinconf.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -file "$PLUGINSDIR\confignamecoinconf.ps1" '
FileWrite $4 '"$NamecoinCoreDataDir" < nul'
FileClose $4
nsExec::ExecToLog '$PLUGINSDIR\confignamecoinconf.cmd'
Delete $PLUGINSDIR\confignamecoinconf.ps1
Delete $PLUGINSDIR\confignamecoinconf.cmd
FunctionEnd
# NAMECOIN CORE CHAIN INSTALLATION
##############################################################################
Function NamecoinCore
!ifndef NO_NAMECOIN_CORE
${If} $NamecoinCoreDetected == 1
# Already have Namecoin Core
Return
${EndIf}
${If} $SkipNamecoinCore == ${BST_CHECKED}
Return
${EndIf}
# Install Namecoin Core
DetailPrint "Installing Namecoin Core..."
!ifdef NCDNS_64BIT
File /oname=$TEMP\namecoin-setup-unsigned.exe artifacts\namecoin-win64-setup-unsigned.exe
!else
File /oname=$TEMP\namecoin-setup-unsigned.exe artifacts\namecoin-win32-setup-unsigned.exe
!endif
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledNamecoinCore" 1
ExecWait $TEMP\namecoin-setup-unsigned.exe
Delete /REBOOTOK $TEMP\namecoin-setup-unsigned.exe
!endif
FunctionEnd
Function un.NamecoinCore
!ifndef NO_NAMECOIN_CORE
# Determine if we were responsible for installing Namecoin Core; if so, we
# should uninstall it.
ClearErrors
ReadRegDWORD $0 HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledNamecoinCore"
IfErrors done
IntCmp $0 0 done
# Detect Namecoin Core uninstall command. If we cannot find it, don't offer
# to uninstall it, as we don't know how.
ClearErrors
!ifdef NCDNS_64BIT
ReadRegStr $NamecoinCoreUninstallCommand HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Namecoin Core (64-bit)" "UninstallString"
!else
ReadRegStr $NamecoinCoreUninstallCommand HKCU "Software\Microsoft\Windows\CurrentVersion\Uninstall\Namecoin Core (32-bit)" "UninstallString"
!endif
IfErrors 0 found
Goto done
found:
# Ask the user if they want to uninstall Namecoin Core
MessageBox MB_YESNO|MB_ICONQUESTION "When you installed ncdns for Windows, Namecoin Core was installed automatically as a necessary dependency of ncdns for Windows. Would you like to remove it? If you leave it in place, you will not be able to connect to .bit domains, but will still be able to use Namecoin Core as a Namecoin node and wallet.$\n$\nSelect Yes to remove Namecoin Core." IDYES 0 IDNO done
# Uninstall Namecoin Core.
DetailPrint "Uninstalling Namecoin Core... $NamecoinCoreUninstallCommand"
ExecWait $NamecoinCoreUninstallCommand
DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\ncdns" "ncdns_InstalledNamecoinCore"
done:
# Didn't install/not uninstalling Namecoin Core.
!endif
FunctionEnd
# FILE INSTALLATION/UNINSTALLATION
##############################################################################
Function Files
WriteUninstaller "uninst.exe"
CreateDirectory $INSTDIR\bin
CreateDirectory $INSTDIR\etc
File /oname=$INSTDIR\namecoin.ico media\namecoin.ico
File /oname=$INSTDIR\bin\ncdns.exe artifacts\ncdns.exe
File /oname=$INSTDIR\etc\ncdns.conf artifacts\ncdns.conf
File /oname=$INSTDIR\bin\dnssec-keygen.exe artifacts\dnssec-keygen.exe
File /oname=$INSTDIR\bin\libisc.dll artifacts\libisc.dll
File /oname=$INSTDIR\bin\libdns.dll artifacts\libdns.dll
File /oname=$INSTDIR\bin\libeay32.dll artifacts\libeay32.dll
File /oname=$INSTDIR\bin\libxml2.dll artifacts\libxml2.dll
#!if /FileExists "artifacts\ncdt.exe"
# This is listed in NSIS.chm but doesn't appear to be supported on the POSIX
# makensis version I'm using. Bleh.
#!endif
File /nonfatal /oname=$INSTDIR\bin\ncdt.exe artifacts\ncdt.exe
File /nonfatal /oname=$INSTDIR\bin\ncdumpzone.exe artifacts\ncdumpzone.exe
File /nonfatal /oname=$INSTDIR\bin\generate_nmc_cert.exe artifacts\generate_nmc_cert.exe
File /nonfatal /oname=$INSTDIR\bin\q.exe artifacts\q.exe
FunctionEnd
Function FilesSecurePre
nsExec::ExecToLog 'icacls "$INSTDIR\etc" /inheritance:r /T /grant "NT SERVICE\ncdns:(OI)(CI)R" "SYSTEM:(OI)(CI)F" "Administrators:(OI)(CI)F"'
FunctionEnd
Function FilesSecure
# Ensure only ncdns service and administrators can read ncdns.conf.
Call FilesSecurePre
nsExec::ExecToLog 'icacls "$INSTDIR\etc\ncdns.conf" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\etc\zsk" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\etc\zsk\bit.private" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\etc\zsk\bit.key" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\etc\ksk" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\etc\ksk\bit.private" /reset'
nsExec::ExecToLog 'icacls "$INSTDIR\bit.key" /reset'
FunctionEnd
Function un.Files
Delete $INSTDIR\bin\ncdns.exe
Delete $INSTDIR\bin\dnssec-keygen.exe
Delete $INSTDIR\bin\libisc.dll
Delete $INSTDIR\bin\libdns.dll
Delete $INSTDIR\bin\libeay32.dll
Delete $INSTDIR\bin\libxml2.dll
Delete $INSTDIR\bin\ncdt.exe
Delete $INSTDIR\bin\ncdumpzone.exe
Delete $INSTDIR\bin\generate_nmc_cert.exe
Delete $INSTDIR\bin\q.exe
Delete $INSTDIR\etc\ncdns.conf
Delete $INSTDIR\etc\ksk\bit.private
Delete $INSTDIR\bit.key
Delete $INSTDIR\etc\zsk\bit.private
Delete $INSTDIR\etc\zsk\bit.key
RMDir $INSTDIR\bin
RMDir $INSTDIR\etc\ksk
RMDir $INSTDIR\etc\zsk
RMDir $INSTDIR\etc
Delete $INSTDIR\namecoin.ico
Delete $INSTDIR\uninst.exe
FunctionEnd
# FILE INSTALLATION/UNINSTALLATION
##############################################################################
Function KeyConfig
DetailPrint "Generating DNSSEC key..."
File /oname=$PLUGINSDIR\keyconfig.ps1 keyconfig.ps1
FileOpen $4 "$PLUGINSDIR\keyconfig.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -file "$PLUGINSDIR\keyconfig.ps1" '
FileWrite $4 '"$INSTDIR" < nul'
FileClose $4
nsExec::ExecToLog '$PLUGINSDIR\keyconfig.cmd'
Delete $PLUGINSDIR\keyconfig.ps1
Delete $PLUGINSDIR\keyconfig.cmd
FunctionEnd
# SERVICE INSTALLATION/UNINSTALLATION
##############################################################################
Function Service
${If} $Reinstalling = 1
nsExec::Exec 'net stop ncdns'
nsExec::ExecToLog 'sc delete ncdns'
${EndIf}
nsExec::ExecToLog 'sc create ncdns binPath= "ncdns.tmp" start= auto error= normal obj= "NT AUTHORITY\LocalService" DisplayName= "ncdns"'
# Use service SID.
nsExec::ExecToLog 'sc sidtype ncdns restricted'
nsExec::ExecToLog 'sc description ncdns "Namecoin ncdns daemon"'
# Restrict privileges. 'sc privs' interprets an empty list as meaning no
# privilege restriction... this one seems low-risk.
nsExec::ExecToLog 'sc privs ncdns "SeChangeNotifyPrivilege"'
# Set the proper image path manually rather than try to escape it properly
# above.
WriteRegStr HKLM "System\CurrentControlSet\Services\ncdns" "ImagePath" '"$INSTDIR\bin\ncdns.exe" "-conf=$INSTDIR\etc\ncdns.conf"'
FunctionEnd
Function ServiceStart
nsExec::Exec 'net start ncdns'
FunctionEnd
Function un.Service
nsExec::Exec 'net stop ncdns'
nsExec::ExecToLog 'sc delete ncdns'
FunctionEnd
# UNBOUND CONFIGURATION
##############################################################################
Function UnboundConfig
${If} $SkipUnbound == 1
Return
${EndIf}
# Detect dnssec-trigger/Unbound installation.
ClearErrors
ReadRegStr $UnboundConfPath HKLM "Software\Wow6432Node\DnssecTrigger" "InstallLocation"
IfErrors 0 found
ReadRegStr $UnboundConfPath HKLM "Software\DnssecTrigger" "InstallLocation"
IfErrors 0 found
ReadRegStr $UnboundConfPath HKLM "Software\Wow6432Node\Unbound" "InstallLocation"
IfErrors 0 found
ReadRegStr $UnboundConfPath HKLM "Software\Unbound" "InstallLocation"
IfErrors 0 found
not_found:
DetailPrint "*** dnssec-trigger installation was NOT found, not configuring Unbound."
StrCpy $UnboundConfPath ""
Return
# dnssec-trigger/Unbound is installed. Adapt the Unbound config to include from a
# directory.
found:
DetailPrint "*** dnssec-trigger installation WAS found, configuring Unbound."
IfFileExists "$UnboundConfPath\unbound.conf" found2
IfFileExists "$UnboundConfPath\service.conf" found2
Goto not_found
found2:
CreateDirectory "$UnboundConfPath\unbound.conf.d"
# Unbound on Windows doesn't appear to support globbing include directives,
# contrary to the documentation. So use this kludge instead.
File /oname=$UnboundConfPath\rebuild-confd-list.cmd rebuild-confd-list.cmd
nsExec::ExecToLog '"$UnboundConfPath\rebuild-confd-list.cmd"'
# The configunbound.ps1 performs two functions:
# 1. It ensures an appropriate include: line is added to unbound.conf.
# 2. It fills in the path in this file and renames it.
File /oname=$UnboundConfPath\unbound.conf.d\ncdns-inst.conf.in ncdns-inst.conf.in
# Execute configunbound.ps1.
File /oname=$PLUGINSDIR\configunbound.ps1 configunbound.ps1
# We execute the script via a dynamically written batch file because Windows
# command line escaping is very strange and has been behaving strangely if
# done directly from NSIS. This behaves consistently.
FileOpen $4 "$PLUGINSDIR\configunbound.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -file "$PLUGINSDIR\configunbound.ps1" '
FileWrite $4 '"$UnboundConfPath" "$INSTDIR" < nul'
FileClose $4
nsExec::ExecToLog '$PLUGINSDIR\configunbound.cmd'
Delete $PLUGINSDIR\configunbound.ps1
Delete $PLUGINSDIR\configunbound.cmd
# Add a config fragment in the newly configured directory.
WriteRegStr HKLM "Software\Namecoin\ncdns" "UnboundFragmentLocation" "$UnboundConfPath\unbound.conf.d"
nsExec::ExecToLog '"$UnboundConfPath\rebuild-confd-list.cmd"'
# Windows, unbelievably, doesn't appear to have any way to restart a service
# from the command line. stop followed by start isn't the same as a restart
# because it doesn't restart dependencies automatically.
nsExec::ExecToLog 'net stop /yes unbound'
nsExec::ExecToLog 'net start unbound'
nsExec::ExecToLog 'net start dnssectrigger'
FunctionEnd
Function un.UnboundConfig
ClearErrors
ReadRegStr $UnboundFragmentLocation HKLM "Software\Namecoin\ncdns" "UnboundFragmentLocation"
IfErrors not_found 0
# Delete the fragment which was installed, but do not deconfigure the
# configuration directory.
Delete $UnboundFragmentLocation\ncdns-inst.conf
nsExec::ExecToLog '"$UnboundFragmentLocation\..\rebuild-confd-list.cmd"'
nsExec::ExecToLog 'net stop /yes unbound'
nsExec::ExecToLog 'net start unbound'
nsExec::ExecToLog 'net start dnssectrigger'
not_found:
FunctionEnd
# REGISTRY PERMISSION CONFIGURATION FOR NCDNS TRUST INJECTION
##############################################################################
Function TrustConfig
IfFileExists "$LOCALAPPDATA\Google\Chrome\User Data" found 0
IfFileExists "$LOCALAPPDATA\Chromium\User Data" found 0
DetailPrint "*** Chromium/Chrome NOT detected, not configuring trust."
Return
found:
MessageBox MB_ICONQUESTION|MB_YESNO "You currently have Chromium or Google Chrome installed. ncdns can enable HTTPS for Namecoin websites in Chromium/Chrome. This will protect your communications with Namecoin-enabled websites from being easily wiretapped or tampered with in transit. Doing this requires giving ncdns permission to modify Windows's root certificate authority list. ncdns will not intentionally add any certificate authorities to Windows, but if an attacker were able to exploit ncdns, they might be able to wiretap or tamper with your Internet traffic (both Namecoin and non-Namecoin websites). If you plan to access Namecoin-enabled websites on this computer from any web browser other than Chromium, Chrome, Firefox, or Tor Browser, you should not enable HTTPS for Namecoin websites in Chromium/Chrome.$\n$\nWould you like to enable HTTPS for Namecoin websites in Chromium/Chrome?" /SD IDNO IDYES chose_yes IDNO chose_no
chose_no:
DetailPrint "*** Chromium/Chrome was detected, but user elected not to configure it."
Return
found_again:
Delete "$PLUGINSDIR\tutorial-confirm"
Goto found
chose_yes:
Delete $PLUGINSDIR\tutorial-confirm
IfFileExists $PLUGINSDIR\tutorial-confirm found 0
File /oname=$PLUGINSDIR\tutorial.ps1 tutorial.ps1
File /oname=$PLUGINSDIR\tutorial.html tutorial.html
FileOpen $4 "$PLUGINSDIR\tutorial.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -sta -file "$PLUGINSDIR\tutorial.ps1" "$PLUGINSDIR\tutorial.html" "$PLUGINSDIR\tutorial-confirm" < nul'
FileClose $4
nsExec::ExecToLog '"$PLUGINSDIR\tutorial.cmd"'
Delete $PLUGINSDIR\tutorial.cmd
Delete $PLUGINSDIR\tutorial.ps1
Delete $PLUGINSDIR\tutorial.html
IfFileExists "$PLUGINSDIR\tutorial-confirm" 0 found_again
Delete $PLUGINSDIR\tutorial-confirm
# Configure permissions
File /oname=$PLUGINSDIR\regpermrun.ps1 regpermrun.ps1
File /oname=$PLUGINSDIR\regperm.ps1 regperm.ps1
FileOpen $4 "$PLUGINSDIR\regpermrun.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -file "$PLUGINSDIR\regpermrun.ps1" install < nul'
FileClose $4
nsExec::ExecToLog '"$PLUGINSDIR\regpermrun.cmd"'
Delete $PLUGINSDIR\regpermrun.cmd
Delete $PLUGINSDIR\regpermrun.ps1
Delete $PLUGINSDIR\regperm.ps1
FileOpen $4 "$INSTDIR\etc\ncdns.conf" a
FileSeek $4 0 END
FileWrite $4 '$\r$\n$\r$\n## ++TRUST++$\r$\n## Added automatically by installer because truststore mode was enabled.$\r$\n[certstore]$\r$\ncryptoapi=true$\r$\n## ++/TRUST++$\r$\n$\r$\n'
FileClose $4
DetailPrint "*** Chromium/Chrome WAS configured after user confirmation."
FunctionEnd
Function un.TrustConfig
# Keep this the same as the above (NSIS forces function duplication for the uninstaller, alas.)
File /oname=$PLUGINSDIR\regpermrun.ps1 regpermrun.ps1
File /oname=$PLUGINSDIR\regperm.ps1 regperm.ps1
FileOpen $4 "$PLUGINSDIR\regpermrun.cmd" w
FileWrite $4 'powershell -executionpolicy bypass -noninteractive -file "$PLUGINSDIR\regpermrun.ps1" uninstall < nul'
FileClose $4
nsExec::ExecToLog '"$PLUGINSDIR\regpermrun.cmd"'
Delete $PLUGINSDIR\regpermrun.cmd
Delete $PLUGINSDIR\regpermrun.ps1
Delete $PLUGINSDIR\regperm.ps1
FunctionEnd
# REINSTALL TESTING
##############################################################################
Function ReinstallCheck
StrCpy $Reinstalling 1
ClearErrors
ReadRegStr $0 HKLM "System\CurrentControlSet\Services\ncdns" "ImagePath"
IfErrors 0 reinstalling
StrCpy $Reinstalling 0 ;; new install
reinstalling:
FunctionEnd
#
##############################################################################
Function ConfigSections
SectionSetFlags ${Sec_ncdns} 25
FunctionEnd