restrict v6
This commit is contained in:
@@ -225,3 +225,52 @@ qid=90:发提问成功(L3 允许收信 ✔);`POST /answer` **没有重
|
||||
已把 3 处(PublishAnswer L3 / SetPublic L2 / AnswerFollowUp L2)改成 `ctx.SetError(...)`,
|
||||
并顺手修了 `follow_up.go` 里同类的 moderation 失败分支(既有缺陷)。编译 EXIT=0。
|
||||
**该修复需再部署一次**;部署后当前仍是 L3,可直接验提示是否出现。
|
||||
|
||||
### 重新部署后 L3 提示验证:通过
|
||||
|
||||
qid=90 再答一次:`ALERT: 当前处于平台处置期,已暂停发布回答` 已渲染;仍无重定向、回答表单仍在
|
||||
(未写入)。L3 全链路闭环。待办:用户要求后续做「`SetErrorFlash + Success` 全量清理」专项。
|
||||
|
||||
剩余未验:L2 的「已保存为私密」提示(需把 admin6 切到 L2 后自测),以及举报采集链(未开始)。
|
||||
|
||||
### L2 提示验证:通过(qid=90)
|
||||
|
||||
```
|
||||
post url: /_/admin6/90 (正常 302 回题目页)
|
||||
ALERT: 已保存为私密:当前处于平台处置期,回答不会公开
|
||||
匿名访问 90 -> 首页;公开页 ids: [73]
|
||||
```
|
||||
L1/L2/L3/L4 至此全部有真实环境实测证据:
|
||||
- L1:页面 200 + 分享卡 302(qid=73)
|
||||
- L2:回答成功 + 转私密 + 匿名不可见 + 专用提示
|
||||
- L3:回答被拒(无重定向、表单仍在、未写入)+ 拒绝提示
|
||||
- L4:整页 302 → /restricted 200 + 四语言文案
|
||||
|
||||
测试数据:88(用户手测)、89(L2 自检)、90(L3/L2 自检,现已答且私密),均需在测试站清理。
|
||||
admin6 当前处于 L2(到期次日),必要时 `unrestrict` 解除。
|
||||
|
||||
## 举报采集链(已落地,编译 + 单测 + 模板检查通过,未部署验证)
|
||||
|
||||
新增/改动:
|
||||
- `internal/db/report.go`(新):`ReportsStore` —— `Create`(唯一索引冲突静默为幂等成功)、
|
||||
`QuestionIDsByUser`(箱主列表标标,排除已删除提问)、`CountByUserSince`(告警阈值)。
|
||||
理由枚举 `harassment/doxxing/divisive/other` + `IsValidReportReason`。
|
||||
- `internal/form/question.go`:`ReportQuestion{Reason}`(`valid:"required;maxlen:32"`)。
|
||||
- `route/question/report.go`(新):`Report` handler。**不要求登录**(目击者是匿名访客);
|
||||
理由白名单;同 IP 同题幂等且提示与首次一致(避免变成内容存在性探测接口);只写库不改可见性。
|
||||
- `route/question/abuse_notify.go`(新):阈值告警 24h≥8 或 7d≥20,24h 冷却(进程内 map + mutex),
|
||||
复用 `conf.Security.SecurityAlertEmail`,`shared.SafeGo` 异步发送。**只提醒不自动处置**。
|
||||
- `internal/mail/mail.go` + `templates/mail/abuse-alert.html`:`SendAbuseAlertMail`。
|
||||
邮件只给计数与下一步命令,**不贴举报内容原文**(邮件会被转发归档,等于又复制一份挂人内容)。
|
||||
- `internal/route/route.go`:`POST /_/{domain}/{questionID}/report`,`rateLimitMiddleware(10, 1*time.Minute)`。
|
||||
- `templates/question/item.html`:回答下方 `⚑ 举报这条内容`,`<details>` 折叠 + 固定理由下拉,
|
||||
仅 `{{ if not .CanDelete }}`(非箱主)可见。
|
||||
- `templates/user/question-list.html` + `route/user/question.go`:箱主列表加「被举报 N 次」红色 badge,
|
||||
**只给数量不给举报人 IP**。
|
||||
- i18n 4 语言共 11 个新键(report.* / qlist.reported*)。
|
||||
|
||||
验证:`go build ./...` EXIT=0;`TestReports` PASS(首次写入 / 同 IP 幂等 / 异 IP 计数 /
|
||||
时间窗口 / 驳回后不计入);`TestDictionaryComplete` PASS;`go run ./dev/checktpl` → all templates syntax OK
|
||||
(项目自带模板语法检查工具,改模板后必跑)。
|
||||
|
||||
未做:箱主列表的「只看被举报」筛选(目前只有 badge);举报驳回/成立的处置动作(目前 status 只有 pending)。
|
||||
|
||||
@@ -98,6 +98,8 @@
|
||||
2026-10-18 实测:L3 拒绝发布时箱主完全看不到提示,改 `SetError` 后正常显示。
|
||||
- 项目里仍有若干 `SetErrorFlash + Success("question/item")` 的既有组合(`follow_up.go` 的 errNotFound、
|
||||
`question.go` 的上传图片过大等),同属该缺陷,遇到时顺手改成 `SetError`。
|
||||
- **TODO(用户 2026-10-18 明确要求后续处理)**:全量排查 `SetErrorFlash + Success(...)` 组合并统一改为
|
||||
`SetError`,做一轮专项清理。
|
||||
|
||||
## 表单校验
|
||||
|
||||
|
||||
Reference in New Issue
Block a user