fix(channel,user): owner 车道只认白名单,堵住群主/伪造 role 冒充主人(裁决 06.4.2/06.4.3/06.4.4)
- 适配器只描述平台身份:qq_obv11 的 owner/admin 一律上报 RoleMember,不再上报 RoleOwner - session 层唯一判主点只认白名单(owner.yaml Accounts ∪ 每渠道 adminIds),nil 档案 fail-closed 拒绝 - 新增「每渠道管理员层」:channels.json ChannelAccount.adminIds[] → runtimeconfig.AdminIDs → OwnerProfile.SetPlatformAdmins(整体替换语义,热重载后移除的 id 立即失效) - 组合根接线:启动即播种、面板保存先灌白名单再重载适配器(cmd/cyrene/wire_channels.go + 4 条端到端单测) - 06.4.3 节流与参与度状态按会话独立计数(ConversationKey 三处统一,空会话 GC);06.4.4 未知平台主动发言保守默认 1 条/分钟
This commit is contained in:
1 parent
7e7f53bb41
commit
af8591b78a
30 files changed
+1289
-144
No files matched your search
@@ -115,6 +115,32 @@ func TestProactivePolicyForPlatform(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
// TestProactivePolicyForUnknownPlatformIsConservative 是裁决 06.4.4 的断言:未知平台
|
||||
// (能力未声明、不在平台清单里)**不得**拿到「无限制」——默认给最严格的限频。
|
||||
func TestProactivePolicyForUnknownPlatformIsConservative(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ctx := context.Background()
|
||||
now := time.Now()
|
||||
for _, platform := range []string{"mystery-im", "discord", ""} {
|
||||
p := ProactivePolicyForPlatform(platform)
|
||||
if p == nil {
|
||||
t.Fatalf("ProactivePolicyForPlatform(%q) = nil", platform)
|
||||
}
|
||||
if p.limiter == nil {
|
||||
t.Fatalf("未知平台 %q 拿到了无限制策略,违反裁决 06.4.4", platform)
|
||||
}
|
||||
for i := 0; i < unknownBurstLimit; i++ {
|
||||
if !p.Allow(ctx, capsProactive(), now) {
|
||||
t.Fatalf("未知平台 %q 第 %d 条被拒,want allowed(限频内)", platform, i+1)
|
||||
}
|
||||
}
|
||||
if p.Allow(ctx, capsProactive(), now) {
|
||||
t.Errorf("未知平台 %q 超出保守限频仍被放行", platform)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestProactivePolicyNilPolicyAndCanceledCtx(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
|
||||
Reference in new issue
Block a user