修复维护模式失败路径临时文件清理

在首次创建临时文件前注册 set -u 安全的统一 EXIT 清理。

补充 marker 与公告页符号链接失败后的临时文件残留回归断言。

更新生产运维文档中的维护页临时文件安全边界。
This commit is contained in:
2026-08-05 10:27:42 +08:00
parent 4e70f3623b
commit e7bf003e29
3 changed files with 30 additions and 4 deletions
@@ -1,6 +1,6 @@
# 本地开发验证与生产运维
更新时间:`2026-08-03`
更新时间:`2026-08-05`
## 标准开发流程
@@ -899,6 +899,6 @@ node scripts/rebind-orphan-work-owners.mjs --in <exported-migration.json> --out
- `--dry-run`:只统计回填行数,不写文件。
- `--placeholder-user-id`:需要时可覆盖默认占位账号 ID。
## 维护页目标文件安全边界(2026-08-04)
## 维护页目标文件安全边界(2026-08-05)
`scripts/deploy/maintenance-on.sh` 只允许把同目录临时普通文件原子替换到普通文件或尚不存在的 `page.html` / `enabled` 目标。目标只要是符号链接(包括指向目录的链接)或目录,脚本必须在替换前失败,不能跟随链接把临时文件移入链接目标,也不能打印“已进入维护模式”。跨平台实现继续使用 POSIX `mv -f`,安全语义由替换函数的目标类型门禁保证;修改后运行 `bash -n scripts/deploy/maintenance-on.sh` 与 `npm run check:maintenance-page`。
`scripts/deploy/maintenance-on.sh` 只允许把同目录临时普通文件原子替换到普通文件或尚不存在的 `page.html` / `enabled` 目标。目标只要是符号链接(包括指向目录的链接)或目录,脚本必须在替换前失败,不能跟随链接把临时文件移入链接目标,也不能打印“已进入维护模式”。`page_temp` 与 `marker_temp` 必须在 `set -u` 下安全初始化,清理 trap 必须在首次 `mktemp` 前生效;任一失败退出都不得在目标同级遗留 `page.html.tmp.*` 或 `enabled.tmp.*`,成功替换后则清空临时路径并解除 trap,不能误删已安装目标。跨平台实现继续使用 POSIX `mv -f`,安全语义由替换函数的目标类型门禁保证;修改后运行 `bash -n scripts/deploy/maintenance-on.sh` 与 `npm run check:maintenance-page`。