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
@@ -43,8 +43,11 @@ func TestToUnifiedPrivateTextAndFace(t *testing.T) {
|
||||
if !msg.Timestamp.Equal(time.Unix(1700000000, 0)) {
|
||||
t.Errorf("Timestamp = %v, want %v", msg.Timestamp, time.Unix(1700000000, 0))
|
||||
}
|
||||
if msg.Sender.Role != adapter.RoleOwner || !msg.Sender.IsOwner() {
|
||||
t.Errorf("Sender.Role = %q, want owner", msg.Sender.Role)
|
||||
// 私聊帧里的 role=owner 是**伪造**的主人标记:适配器只把它当群内/平台身份,判主
|
||||
// 由白名单决定(裁决 06.4.2),所以这里必须是 RoleMember、IsOwner()=false。
|
||||
if msg.Sender.Role != adapter.RoleMember || msg.Sender.IsOwner() {
|
||||
t.Errorf("Sender.Role = %q (IsOwner=%v), want member (伪造的 role=owner 不得判主)",
|
||||
msg.Sender.Role, msg.Sender.IsOwner())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -227,11 +230,13 @@ func TestResolveTargetGroupAndPrivate(t *testing.T) {
|
||||
func TestRoleFromOneBot(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
// 群主(owner)与群管理员(admin)都必须是 RoleMember(裁决 06.4.2):平台角色字段
|
||||
// 不是主人车道凭据,主人只认白名单;未知角色值保守归入 RoleUnknown。
|
||||
tests := []struct {
|
||||
raw string
|
||||
want adapter.Role
|
||||
}{
|
||||
{"owner", adapter.RoleOwner},
|
||||
{"owner", adapter.RoleMember},
|
||||
{"admin", adapter.RoleMember},
|
||||
{"member", adapter.RoleMember},
|
||||
{"", adapter.RoleUnknown},
|
||||
|
||||
Reference in new issue
Block a user