backend/core: verify_admin_token / AdminTokenAuth — проверка без единого вызывающего #2775

Closed
opened 2026-08-07 08:52:39 +00:00 by bot-backend · 0 comments
Collaborator

Найдено в ходе разбора накопленных «код есть, эффекта нет» (07.08).

backend/app/core/deps.py (весь файл — 23 строки) объявляет verify_admin_token и алиас AdminTokenAuth. Ни один эндпоинт их не несёт, ни один модуль их не импортирует.

Проверено НЕ текстовым поиском, а разбором AST по всему репозиторию — ловятся 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 тоже нет.

Почему так вышло

  • PR #437 (2026-05-23) снял заголовок X-Admin-Token со всех admin_*.py;
  • PR #442 убрал UI ввода токена;
  • поле и dep оставили «для быстрого rollback» — и они пролежали полтора месяца.

Экономии от «сохранённого на всякий случай» поля нет: dep нигде не проставлен, поэтому реинстейт всё равно означает правку всех admin_*.py — ровно то же, что и написать хелпер заново.

Что реально закрывает /api/v1/admin/*

Два живых слоя, оба проверены:

  1. middleware rbac_guard в backend/app/main.py: _ADMIN_API_RE = ^/api/v1/admin/ → 403 admin only при role != admin. Покрыт backend/tests/test_rbac.py — 24 теста.
  2. Caddy basic_auth на весь gendsgn.ru (PR #426).

Хвосты, которые тянутся за этим

  • scrape_admin_token в Settings — его единственный читатель находится в удаляемом хелпере;
  • SCRAPE_ADMIN_TOKEN в backend/.env.example и отдельный §3 в docs/Secrets_Rotation_Policy.md («ротация токена») — ротировать нечего;
  • в трёх тест-файлах 10 декораторов @patch("app.core.config.settings.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». Ни в одном из файлов такого теста нет и не было. Это единственный след, по которому проверку можно было счесть живой.

Диагноз

Мёртвый код — не оборванная проводка: задуманное (гейт на admin-эндпоинтах) считается рядом и по-настоящему, в rbac_guard.

Найдено в ходе разбора накопленных «код есть, эффекта нет» (07.08). `backend/app/core/deps.py` (весь файл — 23 строки) объявляет `verify_admin_token` и алиас `AdminTokenAuth`. **Ни один эндпоинт их не несёт, ни один модуль их не импортирует.** Проверено НЕ текстовым поиском, а разбором AST по всему репозиторию — ловятся `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` тоже нет. ## Почему так вышло - PR #437 (2026-05-23) снял заголовок `X-Admin-Token` со всех `admin_*.py`; - PR #442 убрал UI ввода токена; - поле и dep оставили «для быстрого rollback» — и они пролежали полтора месяца. Экономии от «сохранённого на всякий случай» поля нет: dep нигде не проставлен, поэтому реинстейт всё равно означает правку всех `admin_*.py` — ровно то же, что и написать хелпер заново. ## Что реально закрывает `/api/v1/admin/*` Два живых слоя, оба проверены: 1. middleware `rbac_guard` в `backend/app/main.py`: `_ADMIN_API_RE = ^/api/v1/admin/` → 403 `admin only` при `role != admin`. Покрыт `backend/tests/test_rbac.py` — 24 теста. 2. Caddy basic_auth на весь `gendsgn.ru` (PR #426). ## Хвосты, которые тянутся за этим - `scrape_admin_token` в `Settings` — его единственный читатель находится в удаляемом хелпере; - `SCRAPE_ADMIN_TOKEN` в `backend/.env.example` и отдельный §3 в `docs/Secrets_Rotation_Policy.md` («ротация токена») — ротировать нечего; - в трёх тест-файлах 10 декораторов `@patch("app.core.config.settings.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». Ни в одном из файлов такого теста нет и не было. Это единственный след, по которому проверку можно было счесть живой. ## Диагноз **Мёртвый код** — не оборванная проводка: задуманное (гейт на admin-эндпоинтах) считается рядом и по-настоящему, в `rbac_guard`.
Sign in to join this conversation.
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#2775
No description provided.