fix(tradein): токен DaData не утекает в лог + фикс crash access-log скраббера #3514

Merged
lekss361 merged 1 commit from fix/3471-mask-secrets-in-logs into main 2026-09-13 10:52:03 +00:00

1 commit

Author SHA1 Message Date
bot-backend
d7ab12e8a6 fix(tradein): токен DaData не утекает в лог + фикс crash в access-log скраббере
All checks were successful
CI Trade-In / changes (pull_request) Successful in 9s
CI Trade-In / browser-tests (pull_request) Has been skipped
CI / backend-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / changes (pull_request) Successful in 12s
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 4m49s
DaData на 403 возвращает "Feature CLEAN disabled for token '<действующий токен>'."
открытым текстом — body_preview копировал это в WARNING/ERROR лог как есть,
токен уезжал в docker logs (потенциальный breadcrumb в GlitchTip). Добавлен
scrub_body_secrets() в app/core/log_scrub.py: маскирует token '<value>' и любую
generic hex/base64-подобную последовательность 24+ символов — защита не зависит
от точной формулировки вендора.

Заодно найден и исправлен источник "--- Logging error ---" / ValueError: not
enough values to unpack (expected 5, got 0) из прод-логов tradein-backend:
QuerySecretFilter (#3154) при найденном секрете в query-строке схлопывал
record.args в (), а uvicorn.logging.AccessFormatter.formatMessage() распаковывает
record.args напрямую как 5-tuple в обход record.getMessage() — сама попытка
заскрабить секрет ронла форматирование access-лога. Фильтр переписан на
поэлементный скраб record.args (arity не трогается).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01JY6iWDnGDthdvsMWgK1BMG
2026-09-13 13:34:08 +03:00