编号:B-10 严重级:high 工作线:broker(internal/broker) + 身份、群、在线与认证基础(internal/app/identity、group、presence、internal/auth) 来源:审查 I-08 依赖:B-09 (#16)(同改 handleHello) 被依赖:无
采用审查 I-08 的方案:
UPDATE ... WHERE id=? AND enabled=1 AND login_hash=?
login_hash
enabled
WHERE id=? AND session_hash=?
handleHello
session_hash
internal/broker/authn.go、session.go、broker.go;internal/app/identity/self.go。
internal/broker/authn.go
session.go
broker.go
internal/app/identity/self.go
self.go
以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。
UPDATE … WHERE id=?
self.login_password
ClearSession
broker/authn.go:112-145
195-238
authn.go:240-260
identity/self.go:134-188
admin/endpoints_db.go:381-395
broker/session.go:316-336
writeErr := l.DB.Queue.Do(ctx, func(tx *sql.Tx) error { _, e := tx.Exec(` UPDATE endpoints SET session_hash = ?, session_issued_at = ?, session_used_at = ? WHERE id = ?`, hashHex, nowMs, nowMs, endpointID) return e })
WHERE id=? AND enabled=1 AND login_hash=?
broker/authn.go
broker/session.go
broker/broker.go
identity/self.go
复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。
4059a15
已合入 origin/main 0c9b459。落地提交 91e887b fix: 完成 broker 复审 B-03 至 B-12 (#17)。
0c9b459
91e887b
No dependencies set.
The note is not visible to the blocked user.
编号:B-10 严重级:high 工作线:broker(internal/broker) + 身份、群、在线与认证基础(internal/app/identity、group、presence、internal/auth) 来源:审查 I-08
依赖:B-09 (#16)(同改 handleHello) 被依赖:无
结论与统一方案
采用审查 I-08 的方案:
UPDATE ... WHERE id=? AND enabled=1 AND login_hash=?,影响 0 行按认证失败处理(不计锁定)。login_hash、enabled条件,影响 0 行返回 unauthorized。WHERE id=? AND session_hash=?,不误清同时登录的新设备的令牌。handleHello在标在线前复读enabled与session_hash,不匹配就断开。后台操作是"先提交再踢当前连接",之后才成为当前连接的会话,其 hello 一定晚于提交,能被这一步拦住。改动文件
internal/broker/authn.go、session.go、broker.go;internal/app/identity/self.go。与其他问题的交互 / 冲突说明
handleHello,B-09 先合。self.go只改改密函数,身份线其他 issue 不动它。验收与测试
session_hash仍为空。login_hash是管理员设的值。问题明细(各区审查原文,证据含文件与行号)
[I-08] 密码校验和写库不是原子操作:重置、停用、删除期间的登录、改密、退出会越过管理员操作
login_hash和enabled→ argon2 校验(可能排队)→ 无条件执行UPDATE … WHERE id=?,也不看影响行数。self.login_password同样是先读再无条件 UPDATE,可能覆盖同时发生的管理员重置。ClearSession按编号无条件清空,会误清同时用密码登录的新设备的令牌。broker/authn.go:112-145、195-238(见下方代码)。authn.go:240-260。identity/self.go:134-188。admin/endpoints_db.go:381-395之后才踢线;踢线只踢当时的当前连接:broker/session.go:316-336。WHERE id=? AND enabled=1 AND login_hash=?,影响 0 行时返回认证失败,不计锁定。login_hash和enabled条件,影响 0 行时返回 unauthorized。WHERE id=? AND session_hash=?。handleHello在标在线前复读enabled和session_hash,不匹配就断开。后台操作是「先提交再踢当前连接」,踢线之后才成为当前连接的会话,其 hello 一定晚于提交,能被这一步拦住。broker/authn.go、broker/session.go、broker/broker.go、identity/self.go。handleHello,需要合并改。session_hash仍为空。login_hash是管理员设的值。复审基线:main
4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。已合入 origin/main
0c9b459。落地提交91e887bfix: 完成 broker 复审 B-03 至 B-12 (#17)。