diff --git a/.workbuddy/memory/2026-10-18.md b/.workbuddy/memory/2026-10-18.md index 8409d79..2c486ad 100644 --- a/.workbuddy/memory/2026-10-18.md +++ b/.workbuddy/memory/2026-10-18.md @@ -157,3 +157,17 @@ L4 整页停用、举报按钮与箱主面板筛选、邮件告警。分享卡 同时核实:`Dockerfile` 的构建命令是 `go build ... ./cmd/`(不是根目录),所以两个入口必须同步 —— 已写进 MEMORY.md。部署前必须先确认 `./NekoBox --help` 里有 `restrict`,否则是旧产物。 手册里另注明两项只能人工手测:L2(回答应保存为私密)、L3(回答应被拒绝)。 + +### 首次实跑反馈(用户 dry-run) + +用户给 `DOMAIN=admin56` 跑 dry-run,结果 2 项 FAIL。日志证据:`SELECT * FROM "users" WHERE domain='admin56'` +→ **record not found**,说明该 domain 不存在(很可能把账号名当成了 domain)。所有 `/_/admin56` 的 302 +都来自 `GetByDomain` 失败后的 `Redirect("/")`,与处置无关 → **L4 那项 PASS 是假阳性**。 +同时 dry-run 不施加处置,前后状态没变,状态断言本来就无意义 —— 是脚本设计缺陷。 + +已修 `dev/devcheck-restrict.sh`: +1. 基线不是 200 直接中止并打印排查建议(302 常见原因 + 查真实 domain 的命令); +2. dry-run 在基线后短路,不再做状态断言(只验命令存在、基线、停用页); +3. 新增 1b「停用页是否部署」+ 文案断言,dry-run 也能验 i18n/模板。 + +教训(已与既有坑同类):**302 / 200 都不能单独证明处置生效**,必须先确立「基线 200」这个前提。 diff --git a/dev/devcheck-restrict.sh b/dev/devcheck-restrict.sh index da91ce6..1e24ed5 100644 --- a/dev/devcheck-restrict.sh +++ b/dev/devcheck-restrict.sh @@ -74,28 +74,48 @@ else fi say "" -say "== 1. 基线:处置前箱主页应可访问 ==" +say "== 1. 基线:处置前箱主页必须可访问 ==" base=$(code "$BASE_URL/_/$DOMAIN") -check "box page before restrict" 200 "$base" +if [ "$base" != 200 ]; then + say " FAIL 基线不是 200(got $base),后续断言全部无意义,已中止。" + say "" + say " 302 的常见原因(按概率排序):" + say " 1) 域名不存在或账号已停用 —— 先确认 DOMAIN 拼写。查一个真实域名:" + say " curl -s $BASE_URL/explore | grep -o 'href=\"/_/[^\"]*\"' | head -5" + say " 或在库上执行:select domain from users where deleted_at is null order by id desc limit 5;" + say " 2) 该箱主设置了页面密码 —— 此时首页是 200(渲染密码页),不是 302。" + say "" + say " 注意:302 不能证明任何处置生效。上次自检就出现过「箱主不存在 → 302」被误判成 L4 生效。" + exit 1 +fi +say " PASS box page = 200" + +say "" +say "== 1b. 停用页是否部署(与处置无关,dry-run 也验)==" +check "restricted page reachable" 200 "$(code "$BASE_URL/restricted")" +body=$(curl -sL --max-time 10 "$BASE_URL/restricted") +if printf '%s' "$body" | grep -qE '一時的に利用できません|temporarily unavailable|暫時無法存取|暂时不可访问'; then + say " PASS restricted page copy rendered" + pass=$((pass + 1)) +else + say " FAIL restricted page copy not found(i18n 或模板没部署上)" + fail=$((fail + 1)) +fi + +if [ "$RUN" != 1 ]; then + say "" + say "== dry-run:不做状态断言 ==" + say " 状态没有被改动,断言 L4/L1 只会得到误导性结果。" + say " 基线已确认可访问,用 RUN=1 重跑以执行真实验证:" + say " RUN=1 BASE_URL=$BASE_URL DOMAIN=$DOMAIN TAMABOX=$TAMABOX bash $0" + exit 0 +fi say "" say "== 2. L4 整页停用 ==" do_restrict L4 sleep 1 check "box page under L4" 302 "$(code "$BASE_URL/_/$DOMAIN")" -check "restricted page" 200 "$(code "$BASE_URL/restricted")" -if [ "$RUN" = 1 ]; then - body=$(curl -sL --max-time 10 "$BASE_URL/_/$DOMAIN") - if printf '%s' "$body" | grep -qE '一時的に利用できません|temporarily unavailable|暫時無法存取|暂时不可访问'; then - say " PASS restricted page copy rendered" - pass=$((pass + 1)) - else - say " FAIL restricted page copy not found (检查 i18n 与模板是否部署)" - fail=$((fail + 1)) - fi -else - say " [dry-run] 跳过文案断言" -fi say "" say "== 3. L1 停止分发:页面恢复、分享卡被拦 =="