fix(tradein): praktika brand only under praktika account — drop kopylov mapping (brand leak) #1758

Merged
lekss361 merged 1 commit from fix/praktika-brand-only-praktika-user into main 2026-06-18 13:36:20 +00:00
Owner

Проблема (client-facing бренд-утечка)

Trade-in PDF брендируется по владельцу оценки (created_by_USERNAME_BRAND, анти-spoofing #7). Маппинг содержал ДВА аккаунта на бренд Практики: praktika И kopylov. → оценки, созданные под kopylov (52 шт), рендерили PDF с лого/брендом ГК Практика. Инцидент: отчёт, ушедший Бруснике, нёс лого Практики (конкурента).

Требование: «Практика показывается только юзеру praktika, остальным — generic».

Решение

_USERNAME_BRAND → только {"praktika": "praktika"} (убран kopylov). Все прочие (kopylov, user2, admin, …) → None → generic дефолт (name «Trade-In Estimator», без лого). Бренд резолвится при генерации PDF (не хранится) → существующие kopylov-оценки сразу станут generic после деплоя, без миграции данных.

roles.yaml не тронут — там kopylov/praktika это РОЛЬ pilot (не бренд). get_brand_for_user, services/brand.py, PDF-рендер — без изменений.

Изменения

  • app/core/auth.py_USERNAME_BRAND = {"praktika": "praktika"} + переписан комментарий (причина утечки, #657/#7 ref).
  • tests/test_me_brand.pykopylov → None (был → praktika); regression-guard test_user_scope_brand_none_for_kopylov; сохранены praktika → praktika, generic-user → None.

Тесты

Full suite: 1987 passed, 1 skipped, 0 failed. test_rbac/idor/quota/history (юзают kopylov для ролей/quota/owner-scope, НЕ бренд) — зелёные. Ruff clean.

Прод-проверка после деплоя

PDF оценки под kopylovtrade-in-generic-<id>.pdf, без лого Практики; под praktikatrade-in-praktika-<id>.pdf (бренд жив).

## Проблема (client-facing бренд-утечка) Trade-in PDF брендируется по владельцу оценки (`created_by` → `_USERNAME_BRAND`, анти-spoofing #7). Маппинг содержал **ДВА** аккаунта на бренд Практики: `praktika` И `kopylov`. → оценки, созданные под `kopylov` (52 шт), рендерили PDF с лого/брендом ГК Практика. **Инцидент:** отчёт, ушедший Бруснике, нёс лого Практики (конкурента). Требование: «Практика показывается только юзеру praktika, остальным — generic». ## Решение `_USERNAME_BRAND` → только `{"praktika": "praktika"}` (убран `kopylov`). Все прочие (`kopylov`, `user2`, `admin`, …) → `None` → generic дефолт (name «Trade-In Estimator», **без лого**). Бренд резолвится при генерации PDF (не хранится) → **существующие kopylov-оценки сразу станут generic** после деплоя, без миграции данных. `roles.yaml` не тронут — там `kopylov`/`praktika` это РОЛЬ `pilot` (не бренд). `get_brand_for_user`, `services/brand.py`, PDF-рендер — без изменений. ## Изменения - `app/core/auth.py` — `_USERNAME_BRAND = {"praktika": "praktika"}` + переписан комментарий (причина утечки, #657/#7 ref). - `tests/test_me_brand.py` — `kopylov → None` (был `→ praktika`); regression-guard `test_user_scope_brand_none_for_kopylov`; сохранены `praktika → praktika`, generic-user → None. ## Тесты Full suite: **1987 passed, 1 skipped, 0 failed**. test_rbac/idor/quota/history (юзают kopylov для ролей/quota/owner-scope, НЕ бренд) — зелёные. Ruff clean. ## Прод-проверка после деплоя PDF оценки под `kopylov` → `trade-in-generic-<id>.pdf`, без лого Практики; под `praktika` → `trade-in-praktika-<id>.pdf` (бренд жив).
lekss361 added 1 commit 2026-06-18 13:31:10 +00:00
fix(tradein): praktika brand only under praktika account — drop kopylov mapping (brand leak)
All checks were successful
CI / changes (pull_request) Successful in 7s
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
5c37fcbfad
lekss361 added the
bug
priority/p1
scope/backend
status/review
tradein
labels 2026-06-18 13:31:19 +00:00
lekss361 merged commit c8f6fd1535 into main 2026-06-18 13:36:20 +00:00
lekss361 deleted branch fix/praktika-brand-only-praktika-user 2026-06-18 13:36:20 +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#1758
No description provided.