fix v12
This commit is contained in:
@@ -102,7 +102,7 @@ func PublishFollowUp(ctx context.Context, pageUser *db.User, question *db.Questi
|
||||
|
||||
// 内容安全检测:统一守卫,按箱主「审核严格度」裁决是否放行
|
||||
// (提问 / 投票 / 私聊共用同一份判定,见 internal/security/moderation)。
|
||||
if _, err := moderation.Check(ctx.Request().Context(), moderation.StrictnessFor(pageUser.ModerationStrictness), ctx.Lang(), f.Content); err != nil {
|
||||
if _, err := moderation.Check(ctx.Request().Context(), moderation.EffectiveStrictness(ctx.Request().Context(), pageUser.ID, pageUser.ModerationStrictness), ctx.Lang(), f.Content); err != nil {
|
||||
ctx.SetErrorFlash(err.Error())
|
||||
ctx.Redirect(fmt.Sprintf("/_/%s/%d?t=%s", pageUser.Domain, question.ID, question.Token))
|
||||
return
|
||||
@@ -176,7 +176,7 @@ func AnswerFollowUp(ctx context.Context, pageUser *db.User, question *db.Questio
|
||||
followUpID := uint(ctx.ParamInt("followUpID"))
|
||||
|
||||
// 内容安全检测:统一守卫,箱主本人回复同样按自己的审核严格度裁决。
|
||||
if _, err := moderation.Check(ctx.Request().Context(), moderation.StrictnessFor(pageUser.ModerationStrictness), ctx.Lang(), f.Answer); err != nil {
|
||||
if _, err := moderation.Check(ctx.Request().Context(), moderation.EffectiveStrictness(ctx.Request().Context(), pageUser.ID, pageUser.ModerationStrictness), ctx.Lang(), f.Answer); err != nil {
|
||||
// 同请求渲染,用 SetError;原先的 SetErrorFlash 在这里不会显示出来(既有缺陷)。
|
||||
ctx.SetError(err, f)
|
||||
ctx.Success("question/item")
|
||||
|
||||
@@ -356,7 +356,7 @@ func New(ctx context.Context, f form.NewQuestion, pageUser *db.User, recaptcha r
|
||||
// 内容审核严格度:提问 / 私聊 / 投票三条链路共用同一份档位(users.moderation_strictness),
|
||||
// 取值解释与裁决逻辑见 internal/security/censor/policy.go。
|
||||
// 在此解析一次,供下方私聊分支与普通提问分支复用,保证同一请求的判定口径一致。
|
||||
strictness := moderation.StrictnessFor(pageUser.ModerationStrictness)
|
||||
strictness := moderation.EffectiveStrictness(ctx.Request().Context(), pageUser.ID, pageUser.ModerationStrictness)
|
||||
|
||||
// ---------- 私聊处理 ----------
|
||||
if f.StartChat == "true" && ctx.IsLogged {
|
||||
|
||||
@@ -185,7 +185,7 @@ func PublishAnswer(ctx context.Context, pageUser *db.User, question *db.Question
|
||||
// 🚨 Content security check.
|
||||
// 统一守卫:按箱主「审核严格度」裁决是否放行(审核源不可用仍为 fail-closed,
|
||||
// 拒绝发布而非免审放行)。返回的 censorResponse 用于下方落审计字段。
|
||||
censorResponse, err := moderation.Check(ctx.Request().Context(), moderation.StrictnessFor(pageUser.ModerationStrictness), ctx.Lang(), answer)
|
||||
censorResponse, err := moderation.Check(ctx.Request().Context(), moderation.EffectiveStrictness(ctx.Request().Context(), pageUser.ID, pageUser.ModerationStrictness), ctx.Lang(), answer)
|
||||
if err != nil {
|
||||
ctx.SetError(err, f)
|
||||
ctx.Success("question/item")
|
||||
|
||||
@@ -25,6 +25,14 @@ func UpdateModerationStrictness(ctx context.Context, f form.UpdateModerationStri
|
||||
return
|
||||
}
|
||||
|
||||
// 处置期内禁止修改档位:EffectiveStrictness 会强制 strict,允许保存只会让箱主
|
||||
// 以为「我调成宽松了」,实际审核仍按严格执行,是更糟的误导。
|
||||
if level, _, err := db.Restrictions.ActiveLevel(ctx.Request().Context(), ctx.User.ID); err == nil && level != "" {
|
||||
ctx.SetErrorFlash(i18n.T(ctx.Lang(), "admin.flash.strictnessLocked"))
|
||||
ctx.Redirect(returnTab(ctx))
|
||||
return
|
||||
}
|
||||
|
||||
// 非法取值一律拒绝保存:宁可保留原档位,也不要写入一个解释不了的中间状态。
|
||||
if !censor.IsValidStrictness(f.Strictness) {
|
||||
ctx.SetErrorFlash(i18n.T(ctx.Lang(), "admin.flash.moderationStrictnessInvalid"))
|
||||
|
||||
@@ -33,6 +33,11 @@ func Profile(ctx context.Context) {
|
||||
ctx.Data["HasPagePassword"] = ctx.User.PagePassword != ""
|
||||
ctx.Data["HasAskPassword"] = ctx.User.AskPassword != ""
|
||||
ctx.Data["ActiveProfileTab"] = ProfileTab(ctx.Query("tab"))
|
||||
// 处置期内审核严格度被强制为最高档且不可修改(见 moderation.EffectiveStrictness),
|
||||
// 设置页需要把下拉和保存按钮禁用,否则箱主会以为自己的修改生效了。
|
||||
if level, _, err := db.Restrictions.ActiveLevel(ctx.Request().Context(), ctx.User.ID); err == nil && level != "" {
|
||||
ctx.Data["StrictnessLocked"] = true
|
||||
}
|
||||
ctx.Data["TagLimits"] = tagLimits()
|
||||
ctx.Data["ChatLimits"] = chatLimits()
|
||||
InjectFeatureViews(ctx)
|
||||
|
||||
+3
-3
@@ -59,7 +59,7 @@ type voteForm struct {
|
||||
// censorCheck 对单段文本做内容审核。与提问 / 私聊共用 moderation.Check 守卫,
|
||||
// 是否拦截由发起人的「审核严格度」档位决定;fail-closed,服务异常时拒绝发布。
|
||||
func censorCheck(ctx context.Context, text string) error {
|
||||
_, err := moderation.Check(ctx.Request().Context(), moderation.StrictnessFor(ctx.User.ModerationStrictness), ctx.Lang(), text)
|
||||
_, err := moderation.Check(ctx.Request().Context(), moderation.EffectiveStrictness(ctx.Request().Context(), ctx.User.ID, ctx.User.ModerationStrictness), ctx.Lang(), text)
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -146,7 +146,7 @@ func parseVoteMeta(ctx context.Context, draft bool) (*voteForm, error) {
|
||||
// 内容审核(fail-closed):非草稿执行;草稿跳过(见上说明)
|
||||
var censorMeta datatypes.JSON
|
||||
if !draft {
|
||||
titleCensor, err := moderation.Check(ctx.Request().Context(), moderation.StrictnessFor(ctx.User.ModerationStrictness), ctx.Lang(), title)
|
||||
titleCensor, err := moderation.Check(ctx.Request().Context(), moderation.EffectiveStrictness(ctx.Request().Context(), ctx.User.ID, ctx.User.ModerationStrictness), ctx.Lang(), title)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -974,7 +974,7 @@ func voteOwnerStrictness(ctx context.Context, ownerID uint) censor.Strictness {
|
||||
Error("Failed to get vote owner for moderation strictness")
|
||||
return censor.StrictnessStrict
|
||||
}
|
||||
return moderation.StrictnessFor(owner.ModerationStrictness)
|
||||
return moderation.EffectiveStrictness(ctx.Request().Context(), ownerID, owner.ModerationStrictness)
|
||||
}
|
||||
|
||||
// censorVoteForPublish 发布前对投票全部可见文本做内容审核(fail-closed)。
|
||||
|
||||
+1
-1
@@ -67,7 +67,7 @@ func InvalidateResultsCache(voteID uint) {
|
||||
func censorCheck(ctx context.Context, owner *db.User, lang, text string) error {
|
||||
strictness := censor.StrictnessStrict
|
||||
if owner != nil {
|
||||
strictness = moderation.StrictnessFor(owner.ModerationStrictness)
|
||||
strictness = moderation.EffectiveStrictness(ctx.Request().Context(), owner.ID, owner.ModerationStrictness)
|
||||
}
|
||||
_, err := moderation.Check(ctx.Request().Context(), strictness, lang, text)
|
||||
return err
|
||||
|
||||
Reference in New Issue
Block a user