Files
webui4frpc/packaging/windows/webui4frpc.nsi
JianFeeeee ee46b758fa feat(packaging): 单元与安装包改为配置文件启动,口令不再写入 ExecStart
所有交付形态统一成「只传 -config」,凭据留在配置文件 / secrets 文件里。

- systemd 单元:ExecStart 改为 `-config /etc/webui4frpc/config.json`,
  EnvironmentFile 加 `-` 前缀变成可选;新增 ReadOnlyPaths=-/etc/webui4frpc/secret。
- 新增 packaging/common/config.json 示例:口令默认用
  file:/etc/webui4frpc/secret/password 引用,内嵌以 "_" 开头的说明键。
- webui4frpc.env 瘦身为可选环境变量(${VAR} 取值来源),不再承载明文口令。
- deb/rpm:安装 config.json 与 0750 的 secret 目录,config.json 进 conffiles,
  安装后提示改成「设置 password 文件」。
- release.sh 的分发单元模板同步改 -config;tar.gz 附 config.json.example。
- macOS pkg:写 config.json + secret/password,launch 包装脚本只传 -config。
- Windows NSIS:安装时把口令写进 secret-password.txt(icacls 限制为
  SYSTEM/Administrators),生成 data/config.json 用 file: 引用,启动脚本只传
  -config;顺带按 JSON 规则转义 addr/user。makensis 实测可编译通过。
2026-10-23 09:12:30 +08:00

197 lines
6.4 KiB
NSIS
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

; webui4frpc Windows 安装程序 (NSIS)
;
; 由 scripts/build_installers.sh 调用,需在命令行传入:
; -DVERSION=0.1.0 -DARCH=amd64 -DBINSRC=<webui4frpc.exe 路径> -DOUTFILE=<输出 exe>
!include "MUI2.nsh"
!include "LogicLib.nsh"
!include "StrFunc.nsh"
; Used to JSON-escape the free-text fields written into config.json below.
${Using:StrFunc} StrRep
!ifndef VERSION
!define VERSION "0.0.0"
!endif
!ifndef ARCH
!define ARCH "amd64"
!endif
Name "webui4frpc ${VERSION}"
OutFile "${OUTFILE}"
Unicode true
RequestExecutionLevel admin
InstallDir "$PROGRAMFILES64\webui4frpc"
InstallDirRegKey HKLM "Software\webui4frpc" "InstallDir"
VIProductVersion "${VERSION}.0"
VIAddVersionKey "ProductName" "webui4frpc"
VIAddVersionKey "FileDescription" "Visual frpc controller with token-ring cluster"
VIAddVersionKey "FileVersion" "${VERSION}"
VIAddVersionKey "ProductVersion" "${VERSION}"
VIAddVersionKey "LegalCopyright" "JianFeeeee"
!define MUI_ABORTWARNING
!insertmacro MUI_PAGE_LICENSE "LICENSE.txt"
!insertmacro MUI_PAGE_DIRECTORY
Page custom ConfigPage ConfigPageLeave
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "English"
Var Dialog
Var LblAddr
Var TxtAddr
Var LblUser
Var TxtUser
Var LblPass
Var TxtPass
Var CfgAddr
Var CfgUser
Var CfgPass
Var EscAddr
Var EscUser
Var EscDir
Function .onInit
StrCpy $CfgAddr "0.0.0.0:7500"
StrCpy $CfgUser "admin"
StrCpy $CfgPass "admin"
FunctionEnd
Function ConfigPage
!insertmacro MUI_HEADER_TEXT "服务配置" "设置监听地址与登录凭据"
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 0 100% 12u "监听地址 (host:port):"
Pop $LblAddr
${NSD_CreateText} 0 14u 100% 12u "$CfgAddr"
Pop $TxtAddr
${NSD_CreateLabel} 0 34u 100% 12u "管理员用户名:"
Pop $LblUser
${NSD_CreateText} 0 48u 100% 12u "$CfgUser"
Pop $TxtUser
${NSD_CreateLabel} 0 68u 100% 12u "管理员密码(请勿沿用默认值):"
Pop $LblPass
${NSD_CreatePassword} 0 82u 100% 12u "$CfgPass"
Pop $TxtPass
nsDialogs::Show
FunctionEnd
Function ConfigPageLeave
${NSD_GetText} $TxtAddr $CfgAddr
${NSD_GetText} $TxtUser $CfgUser
${NSD_GetText} $TxtPass $CfgPass
FunctionEnd
Section "webui4frpc" SecMain
SetOutPath "$INSTDIR"
File "/oname=webui4frpc.exe" "${BINSRC}"
File "README.md"
File "LICENSE.txt"
CreateDirectory "$INSTDIR\data"
; ---- 启动配置 ----
; 口令写进独立文件、由 config.json 用 "file:" 引用:既不出现在启动脚本的
; 命令行上(任务管理器 / wmic 可见),也不需要做 JSON 转义。
${StrRep} $EscDir $INSTDIR "\" "\\"
${StrRep} $EscAddr $CfgAddr "\" "\\"
${StrRep} $EscAddr $EscAddr '$\"' '\"'
${StrRep} $EscUser $CfgUser "\" "\\"
${StrRep} $EscUser $EscUser '$\"' '\"'
FileOpen $1 "$INSTDIR\secret-password.txt" w
FileWrite $1 "$CfgPass$\r$\n"
FileClose $1
; 口令文件仅 SYSTEM / Administrators 可读(Program Files 默认 Users 可读)
nsExec::ExecToLog 'icacls "$INSTDIR\secret-password.txt" /inheritance:r /grant:r *S-1-5-18:F *S-1-5-32-544:F'
FileOpen $2 "$INSTDIR\data\config.json" w
FileWrite $2 "{$\r$\n"
FileWrite $2 ' "addr": "$EscAddr",$\r$\n'
FileWrite $2 ' "user": "$EscUser",$\r$\n'
FileWrite $2 ' "password": "file:$EscDir\\secret-password.txt",$\r$\n'
FileWrite $2 ' "workdir": "data"$\r$\n'
FileWrite $2 "}$\r$\n"
FileClose $2
; 启动脚本:只传 -config,不传任何凭据
FileOpen $0 "$INSTDIR\start-webui4frpc.cmd" w
FileWrite $0 "@echo off$\r$\n"
FileWrite $0 "rem webui4frpc 启动脚本(由安装程序生成)$\r$\n"
FileWrite $0 "rem 凭据在 data\config.json(口令来自 secret-password.txt),不经过命令行。$\r$\n"
FileWrite $0 "cd /d %~dp0$\r$\n"
FileWrite $0 'webui4frpc.exe -config "%~dp0data\config.json"$\r$\n'
FileClose $0
WriteRegStr HKLM "Software\webui4frpc" "InstallDir" "$INSTDIR"
WriteRegStr HKLM "Software\webui4frpc" "Version" "${VERSION}"
; 添加/删除程序
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"DisplayName" "webui4frpc ${VERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"UninstallString" "$\"$INSTDIR\uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"DisplayVersion" "${VERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"Publisher" "JianFeeeee"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"URLInfoAbout" "https://gitcode.com/JianFeeeee/webui4frpc"
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc" \
"NoRepair" 1
WriteUninstaller "$INSTDIR\uninstall.exe"
; 开始菜单
CreateDirectory "$SMPROGRAMS\webui4frpc"
CreateShortcut "$SMPROGRAMS\webui4frpc\webui4frpc.lnk" \
"$INSTDIR\start-webui4frpc.cmd" "" "$INSTDIR\webui4frpc.exe" 0
CreateShortcut "$SMPROGRAMS\webui4frpc\打开管理界面.lnk" \
"http://127.0.0.1:7500"
CreateShortcut "$SMPROGRAMS\webui4frpc\卸载 webui4frpc.lnk" "$INSTDIR\uninstall.exe"
; 防火墙放行(失败不阻断安装)
nsExec::ExecToLog 'netsh advfirewall firewall add rule name="webui4frpc" \
dir=in action=allow program="$INSTDIR\webui4frpc.exe" enable=yes profile=any'
SectionEnd
Section "Uninstall"
nsExec::ExecToLog 'netsh advfirewall firewall delete rule name="webui4frpc"'
Delete "$INSTDIR\webui4frpc.exe"
Delete "$INSTDIR\start-webui4frpc.cmd"
Delete "$INSTDIR\secret-password.txt"
Delete "$INSTDIR\data\config.json"
Delete "$INSTDIR\README.md"
Delete "$INSTDIR\LICENSE.txt"
Delete "$INSTDIR\uninstall.exe"
; data 目录保留(含数据库与日志),由用户手动删除
MessageBox MB_YESNO|MB_ICONQUESTION \
"是否同时删除数据目录 $INSTDIR\data(数据库、转发配置、日志)?" \
IDNO KeepData
RMDir /r "$INSTDIR\data"
KeepData:
RMDir "$INSTDIR"
Delete "$SMPROGRAMS\webui4frpc\*.lnk"
RMDir "$SMPROGRAMS\webui4frpc"
DeleteRegKey HKLM "Software\webui4frpc"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\webui4frpc"
SectionEnd