medium
协议 / 接线遗漏
fatal
Disconnect
Kick
identity.App
Downlink
publishRevokes
revoked
cmd/nixmsg/serve.go
identity.New
KickEndpoint
sess.Kick
internal/app/identity/lifecycle.go
DisconnectFatal
a.down == nil
internal/broker/session.go
Disable
Deleted
ResetPassword
internal/admin/endpoints.go
kickEndpoint
Session.fatalKick 和 I5 的 publishRevokes 都已实现。这是 serve 接线遗漏,不是「不发 fatal、不发 revoked」的产品选择。令牌作废后 0x86 只能兜底鉴权失败,不能替代先通知再断开,也不能替代已推送给接收方的作废通知。
Session.fatalKick
停用/删除/重置走 Session.Disable / Deleted / ResetPassword(或等价:先 PublishDown fatal 再 DisconnectFatal)。identity.New 把 broker 注入为 Downlink。Kick 仅用于 PRD「踢下线、令牌不变、SDK 重连」。
Session.Disable
PublishDown
已合入并推送 main 4059a1576bc97879b840ec5200defd80bc9eb3f0。 停用、删除、重置密码会发 fatal 再断开;identity 注入 Downlink,已推送作废投递发 revoked。踢下线仍只断开,不改令牌。
4059a1576bc97879b840ec5200defd80bc9eb3f0
No dependencies set.
The note is not visible to the blocked user.
严重级
medium
分类
协议 / 接线遗漏
现象
fatal帧(reason 为 disabled / deleted / password_reset)。连接被Disconnect或Kick。SDK 无法按协议用 fatal 停止重连,只能事后用已作废令牌重连收到 0x86。identity.App未注入Downlink,停用/删除在库内作废已推送的 pending 投递后,publishRevokes为空操作,接收方收不到revoked,可能仍把消息交给应用再 ack。路径
cmd/nixmsg/serve.go第 140–148 行:identity.New未设Downlink;第 176–184 行KickEndpoint只调用sess.Kickinternal/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)文档条款
为何不是故意设计
Session.fatalKick和 I5 的publishRevokes都已实现。这是 serve 接线遗漏,不是「不发 fatal、不发 revoked」的产品选择。令牌作废后 0x86 只能兜底鉴权失败,不能替代先通知再断开,也不能替代已推送给接收方的作废通知。建议方向(不实现)
停用/删除/重置走
Session.Disable/Deleted/ResetPassword(或等价:先PublishDownfatal 再DisconnectFatal)。identity.New把 broker 注入为Downlink。Kick仅用于 PRD「踢下线、令牌不变、SDK 重连」。已合入并推送 main
4059a1576bc97879b840ec5200defd80bc9eb3f0。停用、删除、重置密码会发 fatal 再断开;identity 注入 Downlink,已推送作废投递发 revoked。踢下线仍只断开,不改令牌。