Files
MailUI4Agents/deploy
JianFeeeee eb5c4aa1b4 修 env-defaults.sh 自己的一个假绿: HOME 可用性判据从 [ -w ](权限位)改成**真写探针** —— 与我自己上封那个错同一形状
★ 缺陷(我在认自己 `[ -w ]` 假绿时顺带查出来的,就在我的 scope 里):
   196 行 `mkdir -p "$_am_home" && [ -w "$_am_home" ]`
   179 行 `... || [ ! -w "$_am_home" ]`
   两处都只看**权限位**。uid=0 时对任何 root 属主目录都返真,而**实际拦截可能在另一层**
   (本会话每次 shell 都带 `landlock-run: partial enforcement`)。本机实测:
       [ -w /root ]          ⇒ true    / touch /root/x          ⇒ Permission denied
       [ -w /opt/agentmail ] ⇒ true    / touch /opt/agentmail/x ⇒ Permission denied
   ⇒ 而且 `mkdir -p` 对**已存在**的目录不写任何东西(rc=0),所以它**接不住**这个假绿
     —— 文件 177 行原本就写了"mkdir -p 会返回成功,所以必须再单独判",但"那个单独判"选错了层。

★ 后果正撞在本文件存在的理由上(**误指对象**):
   HOME 空 + uid=0 ⇒ `_am_home=/root` 被误判可用 ⇒ HOME=/root 放行
   ⇒ ② 段取 `$HOME/.cache/go-build` 当 GOCACHE ⇒ 那里用的是**真写探针**(297 行)⇒ 失败
   ⇒ 报出「**GOCACHE** 不可写」,而根因是 **HOME** 不可写
   ⇒ 实测该路径可复现(`env -u HOME bash -c 'source deploy/lib/env-defaults.sh'`)

★ 修法: 加 `_am_can_write()` —— **真去写一个探针文件**(与 297 行同一办法),
   179/196 两处都用它。**必须两处一起改**: 196 的 else 是 `exit 2`(不是 fallback),
   只改 196 会让 /root 走到 `exit 2` 而不是改判。
   ★ 顺带把 WARN 的括注从"(非 root / passwd 里没有可用目录)"改成
     "(已实测真写探针;uid=%s)" —— 原括注是**按 uid 猜的原因**,而判据已不按 uid 判,
     uid=0 也会走到这里。**不报没验过的原因**。
   ⚠️ 前半句 `按身份推出来的 HOME=%s 不可用` **一个字都没动** —— 它是
     `plugins/pi-mail-bridge/test/env-guard.test.mjs:268` 的 assert.match 锚
     (我第一版把它改成了"写不进去",**实测把 pi 的测试弄红了 16/17**,已改回)。

★ 变异测试: 把 `_am_can_write` 改成恒真 ⇒ **被抓住**,且复现的正是上面那条误指
   (HOME 空时不再改判 ⇒ 直接报「GOCACHE 不可写」)✓
★ 反空真: 探针对 /tmp、/home/program/agentmail 返真,对 /root、/opt/agentmail、
   /nonexistent、空串返假 ⇒ 有区分力(非恒真非恒红)✓
★ 验证: pi 的 env-guard 17/17 绿、criteria-hygiene 7/7 绿、三处 source 者 bash -n 全过、
   install.sh/redeploy-*.sh 未改。**生产未动**。
2026-09-25 06:33:23 +08:00
..