停用/删除/重置密码不发 fatal,identity 未注入 Downlink 导致 revoked 丢失 #4

Closed
opened 2026-09-30 10:28:15 +08:00 by nixevol · 1 comment
Owner

严重级

medium

分类

协议 / 接线遗漏

现象

  1. 管理员停用、删除端、重置登录密码时,在线端收不到 fatal 帧(reason 为 disabled / deleted / password_reset)。连接被 Disconnect 或 Kick。SDK 无法按协议用 fatal 停止重连,只能事后用已作废令牌重连收到 0x86。
  2. identity.App 未注入 Downlink,停用/删除在库内作废已推送的 pending 投递后,publishRevokes 为空操作,接收方收不到 revoked,可能仍把消息交给应用再 ack。

路径

  • cmd/nixmsg/serve.go 第 140–148 行:identity.New 未设 Downlink;第 176–184 行 KickEndpoint 只调用 sess.Kick
  • internal/app/identity/lifecycle.go 第 125–129 行:作废后 DisconnectFatal;publishRevokes 因 a.down == nil 直接返回
  • internal/broker/session.go 第 301–335 行:Disable/Deleted/ResetPassword 会先发 fatal 再断开,管理路径未调用
  • internal/admin/endpoints.go 第 515 行:重置密码只 kickEndpoint(管理员踢下线语义,令牌已清但仍走 Kick)

文档条款

  • DEVELOPMENT 6.8:停用/删除/重置密码先发 fatal 再断开,SDK 停止重连
  • DEVELOPMENT 7.6 / PRD F01、D9:停用或删除时 pending 投递改 rejected;已推送的尽力发 revoked
  • DEVIATIONS I5.1:生产须注入 Downlink 与踢线;接线时 Downlink 漏了

为何不是故意设计

Session.fatalKick 和 I5 的 publishRevokes 都已实现。这是 serve 接线遗漏,不是「不发 fatal、不发 revoked」的产品选择。令牌作废后 0x86 只能兜底鉴权失败,不能替代先通知再断开,也不能替代已推送给接收方的作废通知。

建议方向(不实现)

停用/删除/重置走 Session.Disable / Deleted / ResetPassword(或等价:先 PublishDown fatal 再 DisconnectFatal)。identity.New 把 broker 注入为 Downlink。Kick 仅用于 PRD「踢下线、令牌不变、SDK 重连」。

## 严重级 medium ## 分类 协议 / 接线遗漏 ## 现象 1. 管理员停用、删除端、重置登录密码时,在线端收不到 `fatal` 帧(reason 为 disabled / deleted / password_reset)。连接被 `Disconnect` 或 `Kick`。SDK 无法按协议用 fatal 停止重连,只能事后用已作废令牌重连收到 0x86。 2. `identity.App` 未注入 `Downlink`,停用/删除在库内作废已推送的 pending 投递后,`publishRevokes` 为空操作,接收方收不到 `revoked`,可能仍把消息交给应用再 ack。 ## 路径 - `cmd/nixmsg/serve.go` 第 140–148 行:`identity.New` 未设 `Downlink`;第 176–184 行 `KickEndpoint` 只调用 `sess.Kick` - `internal/app/identity/lifecycle.go` 第 125–129 行:作废后 `DisconnectFatal`;`publishRevokes` 因 `a.down == nil` 直接返回 - `internal/broker/session.go` 第 301–335 行:`Disable`/`Deleted`/`ResetPassword` 会先发 fatal 再断开,管理路径未调用 - `internal/admin/endpoints.go` 第 515 行:重置密码只 `kickEndpoint`(管理员踢下线语义,令牌已清但仍走 Kick) ## 文档条款 - DEVELOPMENT 6.8:停用/删除/重置密码先发 fatal 再断开,SDK 停止重连 - DEVELOPMENT 7.6 / PRD F01、D9:停用或删除时 pending 投递改 rejected;已推送的尽力发 revoked - DEVIATIONS I5.1:生产须注入 Downlink 与踢线;接线时 Downlink 漏了 ## 为何不是故意设计 `Session.fatalKick` 和 I5 的 `publishRevokes` 都已实现。这是 serve 接线遗漏,不是「不发 fatal、不发 revoked」的产品选择。令牌作废后 0x86 只能兜底鉴权失败,不能替代先通知再断开,也不能替代已推送给接收方的作废通知。 ## 建议方向(不实现) 停用/删除/重置走 `Session.Disable` / `Deleted` / `ResetPassword`(或等价:先 `PublishDown` fatal 再 `DisconnectFatal`)。`identity.New` 把 broker 注入为 `Downlink`。`Kick` 仅用于 PRD「踢下线、令牌不变、SDK 重连」。
Author
Owner

已合入并推送 main 4059a1576bc97879b840ec5200defd80bc9eb3f0。
停用、删除、重置密码会发 fatal 再断开;identity 注入 Downlink,已推送作废投递发 revoked。踢下线仍只断开,不改令牌。

已合入并推送 main `4059a1576bc97879b840ec5200defd80bc9eb3f0`。 停用、删除、重置密码会发 fatal 再断开;identity 注入 Downlink,已推送作废投递发 revoked。踢下线仍只断开,不改令牌。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: nixevol/NixMsg#4