Files
tamabox/.workbuddy/memory/2026-10-19.md
T
2026-10-19 02:25:19 +08:00

5.3 KiB
Raw Blame History

2026-10-19

部署后复测(强制严格档那批)

  • 规则页返回首页已居中:线上 <div class="uk-margin-large-top uk-text-center"> ✔
  • 验证码弹窗按钮已缩短:线上 >送信< ✔(旧的「認証して送信」已消失)
  • 箱主面板 /user/questions:限制期条幅 + 「查看社区规则」链接都在 ✔
  • 严格度锁定(admin6 当前 L2):
    • /user/profile 出现「处置期间审核严格度已锁定为最高档,解除后自动恢复你的原设置」✔
    • select[name=strictness] 与「保存审核严格度」按钮均带 disabled ✔
    • 直接 POST /user/moderation-strictness/update?tab=security + strictness=lax → 302 回 profile, flash 仍是「已锁定」,且选中档仍为 strict(说明未写入)✔
  • 踩坑:表单 action 是 /user/moderation-strictness/update(没有 /profile 段);用错路径返回 302 到 /, 容易误判成「被中间件拦」。另外每次 POST 都要重新取 _csrf,用上一页(已跳首页)的 token 会 400。

记忆维护

MEMORY.md 一度 19KB 被注入截断,已重写压缩到约 4.9k 字符(8.1KB),保留构建/行尾/embed/审核/处置/CLI 等硬约束, 删去已在日志里的过程细节。

CLI 文档 + 全量代码审阅(同日)

新增 docs/cli.md:命令总览、reports 三种用法与口径、restrict 级别语义/副作用、unrestrict、 hide-public、ban/restore、典型处置流程、排错表、明确不做的事。

审阅中发现并修复(全部本地临时库实测):

  1. hide-public 举报闭环静默失效(真 bug):build() 带 is_private=false,在 Update 之后拿它当子查询恒为空集 → 隐藏成功但 content_reports 仍 pending。改为 Update 前 Pluck("id") 快照,再按 ID 更新/标记。 实测:3 条 pending → accepted,未波及其他箱主。
  2. 整箱分享卡未拦截:ShareCard 直接走缓存,L1–L3 仍能生成整箱图。已在缓存查询前加拦截(fail-closed)。
  3. L2 通知邮件误导:强制私密后仍给提问者发「你的提问有回答」,链接点开 302。改为 !forcedPrivate 才发。
  4. L2 写入顺序:SetPrivate + AnswerByID 两条语句有「公开+已作答」窗口,第二条失败还会留下「私密+无回答」。 新增 Questions.AnswerByIDPrivate(单条 UPDATE 同时写 answer/is_read/is_private),并补测试 TestQuestions/AnswerByIDPrivate。
  5. ListAPI 绕过 Pager:L4 停用与页面访问密码只挡 HTML,/api/v1/user/{domain}/questions 仍能整页拉。 已补两道校验(均返回「用户不存在」,不暴露原因)。页面密码可被 API 绕过是升级前就存在的问题。
  6. L1 曝光残留:GetShowInHome 的 Count 未过滤(分页总数虚高、末页空白)、热门标签查询未过滤。已补同一子查询。
  7. 性能:ActiveLevel 由两次查询改一次(取最高 rank);新增 moderation.EffectiveStrictnessFor(level, raw), 发布路径上不再重复查库(原先一次发布最多 4 次处置查询)。
  8. 证据包口径:分母是「累计公开回答」不是窗口产出 → 文案加「累计」;新增 待处理 N / 已处理 标记, 避免把已闭合的举报误读成还挂着;补 q.deleted_at IS NULL;--stats 说明最长回溯 30 天;CLI 对 active 做 nil 守卫。

验证:go build ./... EXIT=0;db/i18n/templates 测试全绿;CLI 全流程(restrict L3 → 证据包 → unrestrict)实测通过; 临时库已 DROP。

遗留(未改,已向用户说明):L4 不覆盖 /vote/{token};restrict 没有 --days 上限;处置不发邮件给箱主(只有登录后条幅); abuseAlertCooldowns 进程内 map 无清理(重启即失效)。

第二轮:处置通知邮件 + 超长确认 + 冷却表清理

  • 新增 templates/mail/restriction-notice.html + mail.SendRestrictionNoticeMail(RestrictionNotice): 文案由调用方按箱主自己的语言(users.language,空则 conf.App.DefaultLang)预翻译后传入, 模板本身单语言。不含 --reason 原文,只有级别名/到期/规则链接/申诉渠道。 i18n 新增 10 个键 ×4 语言:mail.restriction.*(6)+ restriction.level.L1..L4。
  • restrict:新增 --force(--days > 90 必填,否则直接报错)与 --no-notify;交互模式下超长处置 还要再输一次级别名(--force --yes 视为两次确认)。发信失败只 warn + 终端提示,不回滚处置; 发信加了 20s 超时(gomail 无 Timeout 字段,裸 Dial 会等系统 TCP 超时)。
  • abuseAlertCooldowns 加惰性清理(>1024 条时删除已过 24h 的项)。
  • 顺带:/user/questions 限制期条幅改用 restriction.level.* 的名称(「收窄公开」)而不是裸 L2。

验证:真实 SMTP sink 实收两封(ja 与 zh-CN),标题/级别名/到期/规则链接均正确、--reason 未出现、 链接未被 ZgotmplZ 转义;--days 120 无 --force 被拒;黑洞 SMTP 下 23s 内返回(未阻塞两分钟)。 go build ./...、go vet、db/i18n/templates 测试、checktpl 全绿。

遗留:unrestrict 不发通知(只解禁);restrict 对 --days 无上限(设计如此)。