fix(swarm): address #45 review — payload redaction, user-scoped events, no fake stop
回应 Fasthei 复审(PR #53 CHANGES_REQUESTED): 1. 事件 payload 脱敏:swarmEventView 经 sanitizeSwarmPayload —— 递归剔除 secret_ref/credentials/token/api_key/private_key/access_key/password 及 plan/payload/ permission_manifest/env 大字段,再跑 RedactText 兜底。绝不下发 azkv:// secret_ref 或 sk-/Bearer(approval.requested 等 envelope 携带的凭据引用)。加 TestSanitizeSwarmPayload_*。 2. user 作用域:model.ListSwarmCallbackEventsAfter 增加 userID 参数 + WHERE user_id, controller 传入当前用户;防 runtime_swarm_id/deployment_id 碰撞或误写导致跨用户事件泄漏。 测试补 user 隔离用例。 3. stop 不伪造成功:移除「开关打开返回 accepted:true」路径;未启用→POLICY_REJECTED, 启用也→NOT_IMPLEMENTED(未转发运行时),直到 agent_swarm#2 冻结接上真实 stop。 文档 §5.2 同步(脱敏 / user 作用域 / stop 语义)。go build/vet 干净,controller+model 全回归通过。 Affects: Manager only(只读查询脱敏 + 写端点安全语义)。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,46 @@
|
||||
package controller
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
// #45 复审 #1:事件 payload 必须脱敏 —— 递归剔除 secret_ref / credentials / 大字段,
|
||||
// 并对结果再跑 RedactText 兜底,绝不把 azkv:// secret_ref 或 sk-/Bearer 下发给客户端。
|
||||
func TestSanitizeSwarmPayload_StripsSecrets(t *testing.T) {
|
||||
raw := `{
|
||||
"task_id":"t1",
|
||||
"approval":{"secret_ref":"azkv://heicode-kv.vault.azure.net/secrets/git-pat","note":"deploy"},
|
||||
"credentials":{"access_key":"AKIA123","secret_access_key":"xxx"},
|
||||
"headers":{"authorization":"Bearer aZ09tokenVALUE"},
|
||||
"api_key":"sk-abcDEF1234567890",
|
||||
"stack":["plain frame","key=sk-leak0987654321ABCD"],
|
||||
"ok":true
|
||||
}`
|
||||
out := sanitizeSwarmPayload(raw)
|
||||
b, err := json.Marshal(out)
|
||||
require.NoError(t, err)
|
||||
s := string(b)
|
||||
|
||||
// 敏感键被递归剔除
|
||||
require.NotContains(t, s, "secret_ref")
|
||||
require.NotContains(t, s, "azkv://")
|
||||
require.NotContains(t, s, "git-pat")
|
||||
require.NotContains(t, s, "credentials")
|
||||
require.NotContains(t, s, "AKIA123")
|
||||
require.NotContains(t, s, "api_key")
|
||||
// RedactText 兜底:残留在普通字段里的 sk-/Bearer 也被打码
|
||||
require.NotContains(t, s, "sk-leak0987654321ABCD")
|
||||
require.NotContains(t, s, "aZ09tokenVALUE")
|
||||
// 非敏感内容保留
|
||||
require.Contains(t, s, "t1")
|
||||
require.Contains(t, s, "ok")
|
||||
}
|
||||
|
||||
func TestSanitizeSwarmPayload_EmptyAndPlain(t *testing.T) {
|
||||
require.Empty(t, sanitizeSwarmPayload(""))
|
||||
out := sanitizeSwarmPayload(`{"route":"chat","n":3}`)
|
||||
require.Equal(t, "chat", out["route"])
|
||||
}
|
||||
Reference in New Issue
Block a user