fix(tradein/lead): phone digit-guard, убрать dead landing-литерал, 152-ФЗ audit (R2) #2497

Merged
bot-backend merged 1 commit from fix/tradein-lead-hardening into main 2026-07-12 19:28:27 +00:00
Collaborator

R2 MEDIUM ×2 + LOW — lead endpoint hardening

[MED] Phone-валидация принимала мусор без цифр_PHONE_PATTERN делал цифры опциональными («(()) -- ..» матчил). Fix: field_validator("phone") требует 10-15 реальных цифр (len(re.sub(r"\D","",phone))) поверх формат-маски → junk → 422.
[MED] source="landing" funnel недостижим — endpoint auth-gated (401 без X-Authenticated-User), публичного landing-route нет. Fix: убран мёртвый литерал Literal["result","landing"]["result"] (честный контракт; RBAC не трогаю).
[LOW] 152-ФЗ — consent хранился голым boolean. Fix: client_ip (X-Forwarded-For) + _CONSENT_POLICY_VERSION в audit-log + TODO (в таблице trade_in_leads нет колонок под IP/policy/snapshot — миграция вне scope, задокументирована).

Тесты: 9 lead passed (digit-free 422, too-few-digits 422, landing 422); ruff clean.

## R2 MEDIUM ×2 + LOW — lead endpoint hardening **[MED] Phone-валидация принимала мусор без цифр** — `_PHONE_PATTERN` делал цифры опциональными («(()) -- ..» матчил). Fix: `field_validator("phone")` требует 10-15 реальных цифр (`len(re.sub(r"\D","",phone))`) поверх формат-маски → junk → 422. **[MED] `source="landing"` funnel недостижим** — endpoint auth-gated (401 без X-Authenticated-User), публичного landing-route нет. Fix: убран мёртвый литерал `Literal["result","landing"]`→`["result"]` (честный контракт; RBAC не трогаю). **[LOW] 152-ФЗ** — consent хранился голым boolean. Fix: client_ip (X-Forwarded-For) + `_CONSENT_POLICY_VERSION` в audit-log + TODO (в таблице `trade_in_leads` нет колонок под IP/policy/snapshot — миграция вне scope, задокументирована). Тесты: 9 lead passed (digit-free 422, too-few-digits 422, landing 422); ruff clean.
bot-backend added 1 commit 2026-07-12 19:21:22 +00:00
fix(trade-in): усилить валидацию /lead и почистить контракт (#2376)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 12s
CI / changes (pull_request) Successful in 9s
CI / backend-tests (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI Trade-In / backend-tests (pull_request) Successful in 58s
0583fb0efd
- [MED] phone: маска r"^[+]?[\d\s().-]{5,32}$" делала цифры опциональными
  ("(()) -- .." проходило) — добавлен field_validator, требующий 10-15
  реальных цифр (re.sub(r"\D","")), формат-толерантность сохранена.
- [MED] source: убран мёртвый литерал "landing" из Literal — воронка
  недостижима (rbac_guard закрывает /lead 401 без X-Authenticated-User,
  публичного лендинг-роута нет), контракт больше не обещает невозможное.
- [LOW] 152-ФЗ: захват client_ip (X-Forwarded-For -> peer) и
  _CONSENT_POLICY_VERSION в audit-лог; live-схема trade_in_leads не имеет
  колонок под IP/policy/consent-snapshot -> TODO на follow-up миграцию
  (out of scope), durable proof-of-consent gap задокументирован.

Тесты: +digit-free/too-few-digits phone 422, +source=landing 422,
estimate-тест переведён на source=result. 9/9 pass, ruff clean.
bot-backend merged commit e4bb2fc2e3 into main 2026-07-12 19:28:27 +00:00
bot-backend deleted branch fix/tradein-lead-hardening 2026-07-12 19:28:27 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference: lekss361/gendesign#2497
No description provided.