[R3-07][medium] 客户端建群未在事务内复核创建者是否仍启用 #71

Closed
opened 2026-09-30 17:18:26 +08:00 by nixevol · 2 comments
Owner

现象

基线 origin/main 0c9b459。后台 createAdmin 会在写事务里对群主做 endpointCheckTx,不存在或已停用会失败。客户端 Create 在 Queue.Do 里直接 insertMemberTx(tx, gid, actorID, now),不检查创建者。group.create 的上行入口也不先查 enabled。

对话密码校验在事务外。这段时间里管理端可以先停用或删除该编号。写队列串行之后,Create 仍会插入 owner_id 为已停用甚至刚删除的编号,并写入 group_members。迁移 0003 只约束 group_id → groups(id),没有 endpoint_id → endpoints。已停用群主发不了消息,但群还在,改名、加人、解散仍认这个群主。编号以后若复用,可能撞上旧成员行。

加人目标已经在事务内复核,创建者这条漏了。

位置

  • internal/app/group/app.go:Create 的 Queue.Do
  • 对照:同文件 createAdmin 的 endpointCheckTx

方案

在 Create 的同一事务里,插入群和群主成员之前,对 actorID 做与 createAdmin 相同的 endpointCheckTx。已停用返回 endpoint_disabled,不存在返回 invalid_target,并且不要插入群。不要改 emit,不要改迁移编号。

补测试:创建者在进入写事务前被停用或删除时,Create 失败且 groups 里没有新行。

约束

只改 internal/app/group/ 与其测试。偏差节 ### 复审修复 R3-07。

## 现象 基线 `origin/main` `0c9b459`。后台 `createAdmin` 会在写事务里对群主做 `endpointCheckTx`,不存在或已停用会失败。客户端 `Create` 在 `Queue.Do` 里直接 `insertMemberTx(tx, gid, actorID, now)`,不检查创建者。`group.create` 的上行入口也不先查 `enabled`。 对话密码校验在事务外。这段时间里管理端可以先停用或删除该编号。写队列串行之后,`Create` 仍会插入 `owner_id` 为已停用甚至刚删除的编号,并写入 `group_members`。迁移 `0003` 只约束 `group_id → groups(id)`,没有 `endpoint_id → endpoints`。已停用群主发不了消息,但群还在,改名、加人、解散仍认这个群主。编号以后若复用,可能撞上旧成员行。 加人目标已经在事务内复核,创建者这条漏了。 ## 位置 - `internal/app/group/app.go`:`Create` 的 `Queue.Do` - 对照:同文件 `createAdmin` 的 `endpointCheckTx` ## 方案 在 `Create` 的同一事务里,插入群和群主成员之前,对 `actorID` 做与 `createAdmin` 相同的 `endpointCheckTx`。已停用返回 `endpoint_disabled`,不存在返回 `invalid_target`,并且不要插入群。不要改 `emit`,不要改迁移编号。 补测试:创建者在进入写事务前被停用或删除时,`Create` 失败且 `groups` 里没有新行。 ## 约束 只改 `internal/app/group/` 与其测试。偏差节 `### 复审修复 R3-07`。
Author
Owner

已在分支 feat/fix-r3-71-group-create 修复(基线 origin/main @ 0c9b459,HEAD b6f3baf)。

改动

  • internal/app/group/app.go:Create 的写事务内、插入群与群主成员前,对 actorID 做与 createAdmin 相同的 endpointCheckTx;已停用 endpoint_disabled,不存在 invalid_target,且不插入群。
  • 测试:对话密码窗口内停用/删除创建者时 Create 失败且 groups 无新行。
  • docs/DEVIATIONS.md 追加 ### 复审修复 R3-07。

验证:go test ./internal/app/group/ -count=1 通过。
推送:已推 feat/fix-r3-71-group-create,未合 main。

已在分支 `feat/fix-r3-71-group-create` 修复(基线 `origin/main` @ `0c9b459`,HEAD `b6f3baf`)。 **改动** - `internal/app/group/app.go`:`Create` 的写事务内、插入群与群主成员前,对 `actorID` 做与 `createAdmin` 相同的 `endpointCheckTx`;已停用 `endpoint_disabled`,不存在 `invalid_target`,且不插入群。 - 测试:对话密码窗口内停用/删除创建者时 `Create` 失败且 `groups` 无新行。 - `docs/DEVIATIONS.md` 追加 `### 复审修复 R3-07`。 **验证**:`go test ./internal/app/group/ -count=1` 通过。 **推送**:已推 `feat/fix-r3-71-group-create`,未合 main。
Author
Owner

已合入 main:f936a6b (#71);当前 origin/main HEAD 2d1dfd7。

已合入 main:`f936a6b` (#71);当前 origin/main HEAD `2d1dfd7`。
Sign in to join this conversation.