package qq_obv11 // 本文件钉住 ws+client 连接成功那条 INFO 的出镜边界(M41 #15): // remote_url 按 OneBot 惯例可以直接写着 `?access_token=…`,原样 INFO 就是把凭据写进 // 日志。同包 connect_outcome.go 早就有三层脱敏,这里钉的是「连接成功路径也走它」。 import ( "context" "net/http" "net/http/httptest" "strings" "testing" ) // TestConnectClientInfoLogMasksAccessToken 远端 URL 带 access_token 时,成功日志里 // 不得出现 token 明文;把脱敏改回原样传参就变红。 func TestConnectClientInfoLogMasksAccessToken(t *testing.T) { t.Parallel() const secret = "ONEBOT-ACCESS-TOKEN-SECRET" srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { conn, err := upgradeWS(w, r) if err != nil { return } defer conn.Close() for { if _, _, err := conn.ReadMessage(); err != nil { return } } })) defer srv.Close() remote := "ws://" + strings.TrimPrefix(srv.URL, "http://") + "/?access_token=" + secret logs, logger := logCaptureSync() a := NewAdapter(Config{Mode: "client", RemoteURL: remote}, WithLogger(logger)) if err := a.Connect(context.Background()); err != nil { t.Fatalf("Connect: %v", err) } defer func() { _ = a.Disconnect(context.Background()) }() logged := logs.text() if !strings.Contains(logged, "connected to onebot ws") { t.Fatalf("没有连接成功日志,测试没覆盖到目标路径:\n%s", logged) } if strings.Contains(logged, secret) { t.Fatalf("access_token 明文进了 INFO 日志:\n%s", logged) } // 反向断言:确实打了脱敏占位符,而不是「这条日志压根没带 url 字段」。 if !strings.Contains(logged, "access_token="+maskedCredential) { t.Fatalf("日志里既没有明文也没有脱敏占位符,脱敏可能被绕过了:\n%s", logged) } }