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
@@ -122,17 +122,23 @@ func TestResolveActorStranger(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestResolveActorPreservesChannelOwnerTag(t *testing.T) {
|
||||
func TestResolveActorIgnoresAdapterOwnerTag(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
// A channel-level owner tag (from authenticated login binding) is structural
|
||||
// metadata and must be honored even without a whitelist.
|
||||
msg := directMsg("login-owner")
|
||||
// 反向用例(裁决 06.4.2):适配器上报的 owner 标记**不得单独判主**。没有白名单时
|
||||
// 它只能拿到非主人车道,因此拿不到 MemWritable、也不可能镜像进主会话。
|
||||
msg := directMsg("forged-owner")
|
||||
msg.Sender = adapter.Actor{Role: adapter.RoleOwner}
|
||||
actor := ResolveActor(msg, nil)
|
||||
|
||||
if !actor.IsOwner() {
|
||||
t.Fatal("channel-tagged owner lost during resolution")
|
||||
if actor.IsOwner() {
|
||||
t.Fatal("适配器上报的 role=owner 被判成了主人(应只认白名单)")
|
||||
}
|
||||
if actor.Role != adapter.RoleMember {
|
||||
t.Errorf("Role = %q, want member (owner 标记降级)", actor.Role)
|
||||
}
|
||||
if got := EnvFor(actor); got != restrict.ActorStranger {
|
||||
t.Errorf("EnvFor() = %q, want stranger", got)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -176,8 +182,10 @@ func TestEnvFor(t *testing.T) {
|
||||
func TestIdentifyContext(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
ownerMsg := directMsg("o-100")
|
||||
ownerMsg.Sender = adapter.Actor{Role: adapter.RoleOwner}
|
||||
// 适配器上报 role=owner 但没有白名单可查:IdentifyContext 不得授予 owner 车道
|
||||
// (裁决 06.4.2),因此它只能得到 stranger。
|
||||
ownerTaggedMsg := directMsg("o-100")
|
||||
ownerTaggedMsg.Sender = adapter.Actor{Role: adapter.RoleOwner}
|
||||
|
||||
groupMsgWithSender := groupMsg("g-1")
|
||||
groupMsgWithSender.Sender = adapter.Actor{Role: adapter.RoleMember}
|
||||
@@ -189,7 +197,7 @@ func TestIdentifyContext(t *testing.T) {
|
||||
msg adapter.UnifiedMessage
|
||||
want restrict.ActorEnv
|
||||
}{
|
||||
{name: "owner", msg: ownerMsg, want: restrict.ActorOwner},
|
||||
{name: "适配器 owner 标记(无白名单可查)", msg: ownerTaggedMsg, want: restrict.ActorStranger},
|
||||
{name: "group", msg: groupMsgWithSender, want: restrict.ActorGroupMember},
|
||||
{name: "stranger", msg: strangerMsg, want: restrict.ActorStranger},
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user