From 9ab19f7493f371abbf5b58b1a42813472f802870 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 3 Nov 2026 09:20:21 +0800 Subject: [PATCH] test(security): cover per-tool sensitive word append semantics --- internal/security/content_test.go | 54 +++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 internal/security/content_test.go diff --git a/internal/security/content_test.go b/internal/security/content_test.go new file mode 100644 index 00000000..1f3d7a99 --- /dev/null +++ b/internal/security/content_test.go @@ -0,0 +1,54 @@ +package security + +import "testing" + +// ── 工具级敏感词(用户裁定 2026-11-03) ── + +// TestToolSensitiveWordsAppendOnlyForThatTool 钉住两件事: +// +// ① 档位为某工具追加的词,只在该工具的结果上生效 +// ② 语义是**追加**:整轮 SensitiveWords 仍然生效(不覆盖) +// +// 用户裁定原话: +// +// 「敏感词策略也应该是插件声明啊,每个插件声明自己轮次以及自己工具的 +// 敏感词策略」 +func TestToolSensitiveWordsAppendOnlyForThatTool(t *testing.T) { + rt := NewRuntime(nil) + if err := rt.DeclareProfile(Profile{ + Name: "qq.guest", Owner: "qq", + SensitiveWords: []string{"整轮词"}, + ToolSensitiveWords: map[string][]string{ + "web_fetch": {"网页专用词"}, + "qq_get_*": {"聊天专用词"}, + }, + }); err != nil { + t.Fatalf("声明档位: %v", err) + } + + // ① web_fetch 命中自己的词 + f, _, _ := rt.ScanContentForTool(Inspection{Stage: "tool_result"}, "这里有网页专用词", "qq.guest", "web_fetch") + if len(f) == 0 { + t.Fatal("web_fetch 没命中自己声明的工具级敏感词") + } + + // ② 换一个工具就不该命中(词表是工具属性,不能全局泄漏) + f, _, _ = rt.ScanContentForTool(Inspection{Stage: "tool_result"}, "这里有网页专用词", "qq.guest", "cmd_run") + if len(f) != 0 { + t.Fatalf("cmd_run 命中了 web_fetch 的词 —— 工具级词表泄漏到别的工具:%v", f) + } + + // ③ 通配符模式生效(qq_get_* 命中 qq_get_message) + f, _, _ = rt.ScanContentForTool(Inspection{Stage: "tool_result"}, "聊天专用词", "qq.guest", "qq_get_message") + if len(f) == 0 { + t.Fatal("通配符模式 qq_get_* 没有匹配 qq_get_message") + } + + // ④ 追加语义:整轮词在任何工具上都生效 + for _, tool := range []string{"web_fetch", "cmd_run", ""} { + f, _, _ = rt.ScanContentForTool(Inspection{Stage: "tool_result"}, "这里有整轮词", "qq.guest", tool) + if len(f) == 0 { + t.Fatalf("整轮敏感词在 tool=%q 上没生效 —— 工具级词表不该覆盖整轮词表", tool) + } + } +}