(new): bump to rc 16
Golang lint / lint (push) Successful in 1m7s

(fix): token replacer fix
This commit is contained in:
2026-04-23 22:57:16 +03:00
parent e92a0d37f3
commit 7d4b150b0b
7 changed files with 174 additions and 5 deletions
+119
View File
@@ -5,6 +5,7 @@ import (
"errors"
"io"
"net/http"
"os"
"path/filepath"
"reflect"
"strings"
@@ -136,6 +137,124 @@ func TestInitLoggersFallsBackToStdoutLoggerOnFileError(t *testing.T) {
}
}
func TestInitLoggersAppliesTokenReplacerToFileLoggers(t *testing.T) {
tempDir := t.TempDir()
api := tgapi.NewAPI(tgapi.NewAPIOpts("secret-token"))
uploader := tgapi.NewUploader(api)
bot := &Bot[NoData]{token: "secret-token", api: api, uploader: uploader}
t.Cleanup(func() {
if err := uploader.Close(); err != nil {
t.Fatalf("failed to close uploader: %v", err)
}
})
t.Cleanup(func() {
if err := api.Close(); err != nil {
t.Fatalf("failed to close api: %v", err)
}
})
bot.initLoggers(&BotOpts{
Debug: true,
WriteToFile: true,
UseRequestLogger: true,
LoggerBasePath: tempDir,
})
apiPath := filepath.Join(tempDir, "api.log")
apiFile, err := os.OpenFile(apiPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
t.Fatalf("failed to open api log: %v", err)
}
defer func() { _ = apiFile.Close() }()
bot.api.GetLogger().AddWriter(bot.api.GetLogger().CreateTextWriter(apiFile))
uploaderPath := filepath.Join(tempDir, "uploader.log")
uploaderFile, err := os.OpenFile(uploaderPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
t.Fatalf("failed to open uploader log: %v", err)
}
defer func() { _ = uploaderFile.Close() }()
bot.uploader.GetLogger().AddWriter(bot.uploader.GetLogger().CreateTextWriter(uploaderFile))
bot.logger.Infoln("main secret-token")
bot.RequestLogger.Infoln("request secret-token")
bot.api.GetLogger().Infoln("api secret-token")
bot.uploader.GetLogger().Infoln("uploader secret-token")
if err := bot.RequestLogger.Close(); err != nil {
t.Fatalf("failed to close request logger: %v", err)
}
if err := bot.logger.Close(); err != nil {
t.Fatalf("failed to close main logger: %v", err)
}
mainLog, err := os.ReadFile(filepath.Join(tempDir, "main.log"))
if err != nil {
t.Fatalf("failed to read main log: %v", err)
}
requestLog, err := os.ReadFile(filepath.Join(tempDir, "requests.log"))
if err != nil {
t.Fatalf("failed to read request log: %v", err)
}
apiLog, err := os.ReadFile(apiPath)
if err != nil {
t.Fatalf("failed to read api log: %v", err)
}
uploaderLog, err := os.ReadFile(uploaderPath)
if err != nil {
t.Fatalf("failed to read uploader log: %v", err)
}
for _, tt := range []struct {
name string
data string
}{
{name: "main", data: string(mainLog)},
{name: "request", data: string(requestLog)},
{name: "api", data: string(apiLog)},
{name: "uploader", data: string(uploaderLog)},
} {
if strings.Contains(tt.data, "secret-token") {
t.Fatalf("%s log leaked raw token: %q", tt.name, tt.data)
}
if !strings.Contains(tt.data, "<TOKEN>") {
t.Fatalf("%s log did not contain masked token: %q", tt.name, tt.data)
}
}
}
func TestAddPluginsAppliesTokenReplacerToPluginLogger(t *testing.T) {
bot := &Bot[NoData]{
token: "secret-token",
logger: slog.CreateLogger(),
}
defer func() { _ = bot.logger.Close() }()
plugin := NewPlugin[NoData]("demo")
bot.AddPlugins(plugin)
logPath := filepath.Join(t.TempDir(), "plugin.log")
file, err := os.OpenFile(logPath, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644)
if err != nil {
t.Fatalf("failed to open plugin log: %v", err)
}
defer func() { _ = file.Close() }()
bot.plugins[0].logger.AddWriter(bot.plugins[0].logger.CreateTextWriter(file))
bot.plugins[0].logger.Infoln("plugin secret-token")
data, err := os.ReadFile(logPath)
if err != nil {
t.Fatalf("failed to read plugin log: %v", err)
}
if strings.Contains(string(data), "secret-token") {
t.Fatalf("plugin log leaked raw token: %q", string(data))
}
if !strings.Contains(string(data), "<TOKEN>") {
t.Fatalf("plugin log did not contain masked token: %q", string(data))
}
}
func TestNextPollRetryDelay(t *testing.T) {
tests := []struct {
name string