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
@@ -227,7 +227,7 @@ func (a *Adapter) sendMessage(ctx context.Context, conn *wsConn, msg adapter.Uni
|
||||
return err
|
||||
}
|
||||
}
|
||||
if err := a.tryAcquireSend(); err != nil {
|
||||
if err := a.tryAcquireSend(msg); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := conn.WriteMessage(opText, payload); err != nil {
|
||||
@@ -261,10 +261,12 @@ func (a *Adapter) waitSendInterval(ctx context.Context) error {
|
||||
}
|
||||
}
|
||||
|
||||
// tryAcquireSend checks the send rate limiter, returning ErrRateLimited when the
|
||||
// configured window quota is exhausted.
|
||||
func (a *Adapter) tryAcquireSend() error {
|
||||
if !a.limiter.allow(time.Now()) {
|
||||
// tryAcquireSend 检查本条出站消息所属会话(群聊/私聊)的发送滑窗,额度用尽时返回
|
||||
// ErrRateLimited。额度按会话独立计数(裁决 06.4.3):给 A 群发消息不占用 B 群或私聊
|
||||
// 的额度,键口径与入站滑窗一致(adapter.ConversationKey)。适配器仍保留账号级的
|
||||
// SendInterval 发送间隔(更保守,只收紧不放宽)。
|
||||
func (a *Adapter) tryAcquireSend(msg adapter.UnifiedMessage) error {
|
||||
if !a.limiter.allow(adapter.ConversationKey(msg), time.Now()) {
|
||||
return fmt.Errorf("qq-obv11: %w", ErrRateLimited)
|
||||
}
|
||||
return nil
|
||||
|
||||
Reference in new issue
Block a user