refactor(security): убрать мёртвую проверку админского токена (#2775) #2776

Merged
bot-backend merged 1 commit from chore/2771-drop-dead-admin-token into main 2026-08-07 09:30:25 +00:00
Collaborator

Closes #2775

Диагноз: мёртвый код

Три вопроса:

  1. Есть ли вызывающий? Нет. Проверено разбором AST, а не grep'ом — искались Name, Attribute (deps.AdminTokenAuth), ImportFrom и строковые константы, то есть формы, которые текстовый поиск не ловит:
./backend/app/core/deps.py	23	Name	AdminTokenAuth
./backend/app/core/deps.py	23	Name	verify_admin_token
TOTAL 2

Оба вхождения — строка 23 собственного объявления. Импортеров модуля app.core.deps тоже нет.

  1. Считает ли кто-то то же самое рядом? Да, и по-настоящему: rbac_guard в backend/app/main.py_ADMIN_API_RE = ^/api/v1/admin/ → 403 admin only при role != admin; сверху Caddy basic_auth на весь gendsgn.ru (PR #426).

  2. Выразимо ли задуманное? Неприменимо — задуманное уже выражено, в другом месте и лучше.

→ Удалять.

Опровергнутые предпосылки задания

  1. Путь неверен. Было указано tradein-mvp/backend/app/core/deps.py. Файла там нет — хелпер живёт в main-бэкенде: backend/app/core/deps.py. Это другой стек, другой деплой, другой сьют.
  2. «Замену покрывают 24 теста в tests/test_rbac.py» — файл с таким именем и ровно 24 тестами есть в обоих стеках (backend/tests/test_rbac.py и tradein-mvp/backend/tests/test_rbac.py). Замену для этого хелпера покрывает первый.
  3. PR не #437, а два. Поведение сняли в #437, UI ввода токена — в #442.

Находка: докстринги обещают покрытие, которого нет

  • backend/tests/test_admin_weight_profiles.py: «401 при отсутствии X-Admin-Token»
  • backend/tests/api/v1/test_admin_ekburg_permits.py: «отсутствие X-Admin-Token → 401/503»

Ни в одном из файлов нет ни одного утверждения про 401/403/503 — ни сейчас, ни до этого PR. Это был единственный след, по которому проверку можно было счесть живой: заголовок отправлялся во все запросы, докстринг это описывал как проверку, читателя это убеждало. Докстринги переписаны и теперь указывают на tests/test_rbac.py.

Что удалено

backend/app/core/deps.py весь файл — в нём не было ничего, кроме хелпера
scrape_admin_token в Settings единственный читатель был в удалённом хелпере
SCRAPE_ADMIN_TOKEN в .env.example ротировать нечего
10 × @patch(...scrape_admin_token), 25 × headers=ADMIN_HEADERS заголовок слался и никем не читался
§3 docs/Secrets_Rotation_Policy.md переписан: «ротация не требуется» → «переменной нет»

Прод-.env править не нужно: Settings.model_configextra="ignore", оставшаяся строка SCRAPE_ADMIN_TOKEN= безвредна.

Верификация

  • Полный сьют backend без tests/smoke (как в ci.yml): 4610 passed, 48 skipped, 0 failed, 12м38с. Все пропуски — довоенные, из skip_allowlist.txt.
  • Затронутые файлы отдельно: 51 passed = 24 test_rbac + 27 admin-тестов.
  • Прод-проверка входа и админских ручек — после мержа и деплоя (в PR-е поменялся только мёртвый код, рантайм-поведение не менялось: гейт как был rbac_guard, так и остался).
Closes #2775 ## Диагноз: мёртвый код Три вопроса: 1. **Есть ли вызывающий?** Нет. Проверено **разбором AST**, а не grep'ом — искались `Name`, `Attribute` (`deps.AdminTokenAuth`), `ImportFrom` и строковые константы, то есть формы, которые текстовый поиск не ловит: ``` ./backend/app/core/deps.py 23 Name AdminTokenAuth ./backend/app/core/deps.py 23 Name verify_admin_token TOTAL 2 ``` Оба вхождения — строка 23 собственного объявления. Импортеров модуля `app.core.deps` тоже нет. 2. **Считает ли кто-то то же самое рядом?** Да, и по-настоящему: `rbac_guard` в `backend/app/main.py` — `_ADMIN_API_RE = ^/api/v1/admin/` → 403 `admin only` при `role != admin`; сверху Caddy basic_auth на весь `gendsgn.ru` (PR #426). 3. **Выразимо ли задуманное?** Неприменимо — задуманное уже выражено, в другом месте и лучше. → Удалять. ## Опровергнутые предпосылки задания 1. **Путь неверен.** Было указано `tradein-mvp/backend/app/core/deps.py`. Файла там нет — хелпер живёт в **main-бэкенде**: `backend/app/core/deps.py`. Это другой стек, другой деплой, другой сьют. 2. **«Замену покрывают 24 теста в tests/test_rbac.py»** — файл с таким именем и ровно 24 тестами есть в **обоих** стеках (`backend/tests/test_rbac.py` и `tradein-mvp/backend/tests/test_rbac.py`). Замену для этого хелпера покрывает первый. 3. **PR не #437, а два.** Поведение сняли в #437, UI ввода токена — в #442. ## Находка: докстринги обещают покрытие, которого нет - `backend/tests/test_admin_weight_profiles.py`: «401 при отсутствии X-Admin-Token» - `backend/tests/api/v1/test_admin_ekburg_permits.py`: «отсутствие X-Admin-Token → 401/503» Ни в одном из файлов нет ни одного утверждения про 401/403/503 — ни сейчас, ни до этого PR. Это был **единственный след**, по которому проверку можно было счесть живой: заголовок отправлялся во все запросы, докстринг это описывал как проверку, читателя это убеждало. Докстринги переписаны и теперь указывают на `tests/test_rbac.py`. ## Что удалено | | | |---|---| | `backend/app/core/deps.py` | весь файл — в нём не было ничего, кроме хелпера | | `scrape_admin_token` в `Settings` | единственный читатель был в удалённом хелпере | | `SCRAPE_ADMIN_TOKEN` в `.env.example` | ротировать нечего | | 10 × `@patch(...scrape_admin_token)`, 25 × `headers=ADMIN_HEADERS` | заголовок слался и никем не читался | | §3 `docs/Secrets_Rotation_Policy.md` | переписан: «ротация не требуется» → «переменной нет» | **Прод-`.env` править не нужно:** `Settings.model_config` — `extra="ignore"`, оставшаяся строка `SCRAPE_ADMIN_TOKEN=` безвредна. ## Верификация - Полный сьют `backend` без `tests/smoke` (как в ci.yml): **4610 passed, 48 skipped, 0 failed**, 12м38с. Все пропуски — довоенные, из `skip_allowlist.txt`. - Затронутые файлы отдельно: **51 passed** = 24 `test_rbac` + 27 admin-тестов. - Прод-проверка входа и админских ручек — после мержа и деплоя (в PR-е поменялся только мёртвый код, рантайм-поведение не менялось: гейт как был `rbac_guard`, так и остался).
bot-backend added 1 commit 2026-08-07 08:53:37 +00:00
refactor(security): убрать мёртвую проверку админского токена (#2775)
All checks were successful
CI Trade-In / changes (pull_request) Successful in 7s
CI / changes (pull_request) Successful in 8s
CI Trade-In / backend-tests (pull_request) Has been skipped
CI Trade-In / browser-tests (pull_request) Has been skipped
CI Trade-In / frontend-checks (pull_request) Has been skipped
CI / frontend-tests (pull_request) Has been skipped
CI / openapi-codegen-check (pull_request) Successful in 2m11s
CI / backend-tests (pull_request) Successful in 15m33s
163bacb7be
`verify_admin_token` / `AdminTokenAuth` в `backend/app/core/deps.py` не имели
НИ ОДНОГО вызывающего. Проверено разбором AST по всему репозиторию (Name /
Attribute / ImportFrom / строковые константы — формы, которые текстовый grep
не ловит): оба имени встречаются ровно в одном месте — в собственном
объявлении, строка 23 самого deps.py. Больше нигде.

Поведение сняли в PR #437 (заголовок X-Admin-Token убран со всех admin_*.py),
UI ввода токена — в PR #442. Поле держали «для быстрого rollback» полтора
месяца. Rollback это всё равно не ускоряло: dep нигде не проставлен, вернуть
его = править все admin_*.py, ровно как и было бы без сохранённого поля.

Что реально закрывает `/api/v1/admin/*` — два живых слоя:
  1. middleware `rbac_guard` (app/main.py): `_ADMIN_API_RE` → 403 `admin only`
     при role != admin. Покрыт tests/test_rbac.py — 24 теста, все зелёные.
  2. Caddy basic_auth на весь gendsgn.ru (PR #426).

Удалено:
  • backend/app/core/deps.py целиком (в файле не было ничего, кроме этого
    хелпера; импортеров модуля тоже нет);
  • `scrape_admin_token` из Settings — его единственным читателем был
    удалённый хелпер;
  • SCRAPE_ADMIN_TOKEN из .env.example. Прод-.env править не обязательно:
    `model_config` = `extra="ignore"`, лишняя переменная безвредна;
  • остатки в тестах: 10 декораторов `@patch(...scrape_admin_token)` и 25
    `headers=ADMIN_HEADERS` — заголовок отправлялся во все admin-запросы и
    никем не читался.

Попутно исправлены ДВА докстринга, обещавшие покрытие, которого нет:
test_admin_weight_profiles.py («401 при отсутствии X-Admin-Token») и
test_admin_ekburg_permits.py («отсутствие X-Admin-Token → 401/503»).
Соответствующего теста нет ни в одном из файлов — ни сейчас, ни до этого
коммита. Теперь докстринги указывают на tests/test_rbac.py, где проверка
действительно есть.

Верификация: полный сьют backend без tests/smoke — 4610 passed, 48 skipped,
0 failed (12м38с). Целевые файлы отдельно: 51 passed (24 rbac + 27 admin).

Closes #2775
bot-backend merged commit 1f036e94d1 into main 2026-08-07 09:30:25 +00:00
bot-backend deleted branch chore/2771-drop-dead-admin-token 2026-08-07 09:30:26 +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#2776
No description provided.