编号:U-03 严重级:medium 工作线:身份、群、在线与认证基础(internal/app/identity、group、presence、internal/auth) 来源:审查 I-13、M-17、I-14、A-11 依赖:无 被依赖:U-04 (#42)(同改 auth/locks.go)
合并审查 I-13、I-14、M-17、A-11:
{LockTalkPair, 发送方, 对方}
talk_password_required
identity.SelfSetTalkPassword
LockTalkTarget
internal/app/identity/talk.go、lifecycle.go(删除路径加清锁一处);internal/app/message/submit.go(dmAuthNeeded、talkClear 等对话密码函数);internal/app/group/app.go(checkAddMember);internal/admin/endpoints.go(handleEndpointTalkPassword);internal/auth/locks.go。
internal/app/identity/talk.go
lifecycle.go
internal/app/message/submit.go
dmAuthNeeded
talkClear
internal/app/group/app.go
checkAddMember
internal/admin/endpoints.go
handleEndpointTalkPassword
internal/auth/locks.go
这些文件都有其他 issue 在改,本条只动对话密码相关函数:submit.go 的限速归 C-05、校验归 C-07;lifecycle.go 的作废归 C-04、断开 goroutine 归 B-04;endpoints.go 其余函数由管理后端线修改;locks.go 与 U-04 同文件,身份线内顺序合入。
以下是本次复审各区审查报告的原文段落。A、M、I、P、S 开头的是原始发现编号(A 管理后台与网页、M 消息核心、I 身份认证群在线、P 传输平台部署、S SDK)。解决方案以本 issue 上方的"结论与统一方案"为准;原文里的方案与之不一致时,按上方执行。
DefaultRemoteIP
identity/talk.go:35
52
56
119
136
140
message/submit.go:560
573
581
group/app.go:633
cmd/nixmsg/serve.go:164-170
identity/talk.go
message/submit.go
group/app.go
rate_limited
submit.go:117-123
submit.go:577-582
internal/auth/locks.go:55-57
admin/endpoints.go:547-589
admin/endpoints_db.go:398-413
identity/self.go:114-116
identity/lifecycle.go:72-140
auth/locks.go:115-133
admin/endpoints.go
identity/lifecycle.go
auth/locks.go
endpoints.go:547-589
talk_hash
internal/app/identity/self.go:114-115
a.locks.Clear(auth.LockKey{Kind: auth.LockTalkTarget, ...})
identity.Service.SelfSetTalkPassword
service.go:48
h.identity.SelfSetTalkPassword(ctx, id, pw)
h.locks.Clear(LockTalkTarget, id)
Check
复审基线:main 4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。
4059a15
已合入 origin/main 0c9b459。落地提交 e294b5d fix: 统一对话密码锁键为发送方加对方不含 IP (#41)。
0c9b459
e294b5d
No dependencies set.
The note is not visible to the blocked user.
编号:U-03 严重级:medium 工作线:身份、群、在线与认证基础(internal/app/identity、group、presence、internal/auth) 来源:审查 I-13、M-17、I-14、A-11
依赖:无 被依赖:U-04 (#42)(同改 auth/locks.go)
结论与统一方案
合并审查 I-13、I-14、M-17、A-11:
{LockTalkPair, 发送方, 对方},不带 IP;unlock、单聊发送、拉人进群三处与成功后清零都用同一个键。(审查 I-13、M-17 第 2 点)talk_password_required,只有带密码时才检查锁定。DEVELOPMENT 第 5 节原文是"期间 unlock、带密码的发送和拉人进群都返回 rate_limited"。(审查 M-17 第 1 点)identity.SelfSetTalkPassword(或成功后清除LockTalkTarget),not_found 映射 404。(审查 A-11、I-14)改动文件
internal/app/identity/talk.go、lifecycle.go(删除路径加清锁一处);internal/app/message/submit.go(dmAuthNeeded、talkClear等对话密码函数);internal/app/group/app.go(checkAddMember);internal/admin/endpoints.go(handleEndpointTalkPassword);internal/auth/locks.go。与其他问题的交互 / 冲突说明
这些文件都有其他 issue 在改,本条只动对话密码相关函数:submit.go 的限速归 C-05、校验归 C-07;lifecycle.go 的作废归 C-04、断开 goroutine 归 B-04;endpoints.go 其余函数由管理后端线修改;locks.go 与 U-04 同文件,身份线内顺序合入。
验收与测试
talk_password_required。问题明细(各区审查原文,证据含文件与行号)
[I-13] 对话密码「按对锁定」的计数键和文档不一致,三处用法也各不相同
DefaultRemoteIP),是第三套独立计数。identity/talk.go:35、52、56、119、136、140;message/submit.go:560、573、581;group/app.go:633;cmd/nixmsg/serve.go:164-170。{LockTalkPair, 发送方, 对方},不带 IP。identity/talk.go、message/submit.go(消息线)、group/app.go。[M-17] 对话密码锁定的细节:锁定期内不带密码也返回 rate_limited,成功后计数没清零
rate_limited,而 SDK 对发送收到rate_limited会自动退避重交,最长静默重试 1 小时,而不是立即得到talk_password_required。talkClear构造的锁定键没带 IP,而计数键带了,所以密码输对后「发送方+对方」的失败计数不会清零。submit.go:117-123、submit.go:577-582;internal/auth/locks.go:55-57。talk_password_required,只有带密码时才检查锁定;talkClear带上 IP,与 identity 一致。internal/app/message/submit.go。talk_password_required;9 次输错后输对一次,再错一次不锁定。[I-14] 后台改对话密码不清零按对方的计数;删除端后同编号重开会继承锁定
admin/endpoints.go:547-589、admin/endpoints_db.go:398-413;对照identity/self.go:114-116;identity/lifecycle.go:72-140;auth/locks.go:115-133。LockTalkTarget;删除端后清除该编号的全部锁定。admin/endpoints.go(后台线)、identity/lifecycle.go、auth/locks.go。[A-11] 后台设置对话密码不清零"按被猜端"的锁定计数
rate_limited。endpoints.go:547-589只更新了talk_hash和版本号。internal/app/identity/self.go:114-115调用a.locks.Clear(auth.LockKey{Kind: auth.LockTalkTarget, ...})。identity.Service.SelfSetTalkPassword(service.go:48)已经对外提供。h.identity.SelfSetTalkPassword(ctx, id, pw),其中 not_found 映射为 404;否则在成功后执行h.locks.Clear(LockTalkTarget, id)。internal/admin/endpoints.go。Check为 false。复审基线:main
4059a15(2026-09-30)。编号说明、各工作线的合并顺序、共享文件归属见总览 #7。已合入 origin/main
0c9b459。落地提交e294b5dfix: 统一对话密码锁键为发送方加对方不含 IP (#41)。