fix(weixin_ilink): drop user file name from media failure log; fix TestLogin_LogRedaction data race

This commit is contained in:
AskaEth committed 2026-10-26 22:00:09 +08:00
1 parent d47185feb8
commit e39cc5d096
3 files changed
+85 -14

No files matched your search

@@ -6,6 +6,9 @@ package weixin_ilink
// 真机现场是她的中文文本本身完好,却因为一个媒体项构建失败而整条没发出去;
// B3 getuploadurl 的请求必须带上官方字段、响应必须认官方键名,且「键缺失」
// 与「会话被拒」必须分开报(后者已有 markRejected 路径)。
//
// M56 又追加了一条**日志内容**边界:失败告警里绝不出现 md.Name(它是用户侧自由
// 文本),可诊断性改由 kind/size/index/err 承担。
import (
"bytes"
@@ -117,8 +120,51 @@ func TestSendMessage_MediaFailureStillSendsText(t *testing.T) {
if !strings.Contains(logs, "source="+source) {
t.Fatalf("告警没有标注来源:\n%s", logs)
}
if !strings.Contains(logs, "kind=file") || !strings.Contains(logs, "name=1.txt") {
t.Fatalf("告警缺少 kind/name:\n%s", logs)
if !strings.Contains(logs, "kind=file") || !strings.Contains(logs, "index=0") {
t.Fatalf("告警缺少 kind/序号(媒体名的位置由它们承担):\n%s", logs)
}
}
// TestSendMessage_MediaFailureLogOmitsUserFileName 钉住失败告警的**内容边界**(M56):
// md.Name 是用户侧自由文本(入站侧就是用户自己起的文件名),所以失败日志里一个字都
// 不留 —— 连截断后的前缀也不行,断言因此拿「文件名的开头」当哨兵,把「截断到 N 个
// 字符」这类半吊子修法一起打红。可诊断性由 kind/size/index/err 承担,这里也逐个断言:
// 否则「把整行日志删掉」同样能让泄露消失。
func TestSendMessage_MediaFailureLogOmitsUserFileName(t *testing.T) {
t.Parallel()
rec := &reqRecorder{}
srv := mediaSendServer(t, rec, handlerResult{body: jsonBody(map[string]any{})})
var buf bytes.Buffer
ad := newLoggingSendAdapter(t, srv, &buf)
ad.recordInbound("tok-1", adapter.UnifiedMessage{SenderID: "u-1", Timestamp: ad.clock()})
// 用户侧自由文本的典型形态:中文姓名 + 证件号。两者都不该进日志。
const userFileName = "身份证正面-张三-110101199003071234.jpg"
payload := []byte("user-bytes")
if err := ad.SendMessage(context.Background(), adapter.UnifiedResponse{
Messages: []adapter.UnifiedMessage{{
SenderID: "u-1",
Content: "文本照发",
Media: []adapter.Media{{
Kind: adapter.MediaFile, Data: payload, Name: userFileName, Size: int64(len(payload)),
}},
}},
}); err != nil {
t.Fatalf("媒体失败连累了整条回复:%v", err)
}
logs := buf.String()
// 先确认告警本身还在:否则「没泄露」只是因为什么都没记。
for _, want := range []string{"outbound media item skipped", "kind=file", "size=10", "index=0", "err="} {
if !strings.Contains(logs, want) {
t.Fatalf("失败告警缺少 %q(诊断力不能被一起删掉):\n%s", want, logs)
}
}
// 泄露面:整名、名字开头、证件号 —— 任一段出现即红。
for _, leak := range []string{userFileName, "身份证", "110101199003071234"} {
if strings.Contains(logs, leak) {
t.Fatalf("用户文件名泄露 %q:\n%s", leak, logs)
}
}
}