Commit Graph
3 Commits
Author SHA1 Message Date
laoyang 5b57e6a81e 安装完成后自动删除 install.php(不再让用户手动删)
用户要求:装完由程序自己删,不该让用户记着。

三级降级(删不掉也必须安全、且如实告知):
① 目录可写 → unlink 删除
② 删不掉 → 覆写成**纯静态 HTML** 404 页(不含 <?php)
③ 都失败 → 成功页明确提示需手动删 + 原因,不谎报成功

关键实现要点:
- 自删除放在安装 try/catch **之外**(if ($done))。它是清理动作,
  不属于安装事务;若留在 try 里抛异常会被 catch 误报成「安装失败」。
- 降级**不能写成 PHP 空壳**:实测 opcache / php -S 会缓存已编译脚本,
  写成 `<?php exit;` 后请求仍返回旧的「已安装」页(2289 字节),
  等于文件还是暴露安装页的入口。纯静态 HTML 才彻底。
- 补 opcache_invalidate,让残留文件立刻按新内容生效。

测试:
- _sn_selfdelete_e2e.py 19 项:删成功 / 目录不可写降级 / 删除失败不影响安装
- _sn_selfdelete_falsify.py 6 变体全精确命中
  (含「不自删但谎报」「降级写成 PHP」「删除失败就回滚」)
- install e2e 41 项、跳转 e2e 19 项回归全绿(适配自删除后的语义变化)

顺手修 e2e 自身缺陷:install.php 会被自删除吃掉,
快照改为存放在仓库内 .install.php.e2e_snapshot 并**无条件还原**。
2026-11-03 22:32:04 +08:00
laoyang ae75058de1 未安装时自动跳转安装向导(修「打开首页不跳转」)
现象:全新部署后打开域名,看到的是一个空导航站(没有任何提示),
必须自己猜 /install.php 这个网址才能安装。

原因:index.php 一进来就 db() 建库并渲染前台,全站没有任何
「还没装」的引导逻辑;install.php 只能靠手输网址触达。

改动:
- functions.php 新增 app_installed():全站唯一的「已安装」判断源
  (有管理员账号 = 已安装),内部 try/catch 兜住建库失败
- index.php 开头:未安装且 install.php 存在 → 302 到安装页
  · 只在 install.php 真存在时跳,用户装完删掉后自动失效,不会 404
- install.php 复用 app_installed(),删掉自己那套 is_file(DB_PATH) 推断,
  避免「首页说没装、install 说装了」的口径分裂

测试(都在 _tooling/):
- _sn_install_redirect_e2e.py 19 项:未安装跳转 / 已安装不跳 /
  install.php 删了不跳 / 已装拒重装,四态全覆盖
- _sn_install_redirect_falsify.py 6 变体全精确命中(含「无条件跳转→死循环」)
- _sn_install_e2e.py 41 项回归全绿(顺手修 6 条因新逻辑过时的断言)
2026-11-03 22:07:22 +08:00
laoyang 286a01beb8 安装向导 install.php + data/ 防护文件入库
install.php(新增):
- 环境自检(PHP 版本 / PDO SQLite / mbstring / GD / 网络抓取 / fileinfo
  / data 与 uploads 可写性),缺 GD 只警告不阻断
- 输入校验:用户名格式、密码 ≥6 位、两次一致
- 建库 + 建管理员 + 写 data/install.lock
- 已存在管理员时拒绝安装(防删锁重装夺权);锁文件删掉也不认
- 装完展示数据库信息(类型/路径/大小/表内条目数)

data/ 防护文件入库(关键安全修复):
- 原 .gitignore 整目录排除 /data/,导致 data/.htaccess 永远进不了仓库,
  部署后 data/ 没有禁止 Web 访问的规则 —— nav.db 可被公网直接下载,
  里面是管理员密码哈希和全部站点数据
- 改为 /data/* + 白名单放行 .htaccess、index.html
2026-11-03 21:14:40 +08:00