mirror of
https://github.com/Wei-Shaw/sub2api.git
synced 2026-10-07 07:03:24 +08:00
fix(risk-control): block prompts when risk control backend fails
- Change loadRuntimeSnapshot failure from fail-open to fail-closed - Return block decision with 500 status when config cannot be loaded - Add regression test for snapshot failure scenario - Fixes #5388
This commit is contained in:
@@ -831,7 +831,14 @@ func (s *ContentModerationService) Check(ctx context.Context, input ContentModer
|
||||
"endpoint", input.Endpoint,
|
||||
"protocol", input.Protocol,
|
||||
"error", err)
|
||||
return allow, nil
|
||||
return &ContentModerationDecision{
|
||||
Allowed: false,
|
||||
Blocked: true,
|
||||
Flagged: false,
|
||||
Message: "风控系统暂时不可用,请稍后重试",
|
||||
StatusCode: http.StatusInternalServerError,
|
||||
Action: ContentModerationActionError,
|
||||
}, nil
|
||||
}
|
||||
if !runtimeSnapshot.riskControlEnabled {
|
||||
slog.Info("content_moderation.skip_feature_disabled",
|
||||
|
||||
@@ -19,6 +19,7 @@ import (
|
||||
|
||||
type contentModerationTestSettingRepo struct {
|
||||
values map[string]string
|
||||
err error
|
||||
}
|
||||
|
||||
func (r *contentModerationTestSettingRepo) Get(ctx context.Context, key string) (*Setting, error) {
|
||||
@@ -44,6 +45,9 @@ func (r *contentModerationTestSettingRepo) Set(ctx context.Context, key, value s
|
||||
}
|
||||
|
||||
func (r *contentModerationTestSettingRepo) GetMultiple(ctx context.Context, keys []string) (map[string]string, error) {
|
||||
if r.err != nil {
|
||||
return nil, r.err
|
||||
}
|
||||
out := map[string]string{}
|
||||
for _, key := range keys {
|
||||
if value, ok := r.values[key]; ok {
|
||||
@@ -53,6 +57,23 @@ func (r *contentModerationTestSettingRepo) GetMultiple(ctx context.Context, keys
|
||||
return out, nil
|
||||
}
|
||||
|
||||
func TestContentModerationCheck_LoadRuntimeSnapshotFailureBlocks(t *testing.T) {
|
||||
svc := &ContentModerationService{
|
||||
settingRepo: &contentModerationTestSettingRepo{err: fmt.Errorf("settings unavailable")},
|
||||
repo: &contentModerationTestRepo{},
|
||||
}
|
||||
|
||||
decision, err := svc.Check(context.Background(), ContentModerationCheckInput{UserID: 1})
|
||||
|
||||
require.NoError(t, err)
|
||||
require.False(t, decision.Allowed)
|
||||
require.True(t, decision.Blocked)
|
||||
require.False(t, decision.Flagged)
|
||||
require.Equal(t, ContentModerationActionError, decision.Action)
|
||||
require.Equal(t, "风控系统暂时不可用,请稍后重试", decision.Message)
|
||||
require.Equal(t, http.StatusInternalServerError, decision.StatusCode)
|
||||
}
|
||||
|
||||
func (r *contentModerationTestSettingRepo) SetMultiple(ctx context.Context, settings map[string]string) error {
|
||||
if r.values == nil {
|
||||
r.values = map[string]string{}
|
||||
|
||||
Reference in New Issue
Block a user