chore(ci+rbac): auth/** в paths-фильтры + «Поиск домов» только у админа #2592

Merged
lekss361 merged 1 commit from chore/tradein-ci-auth-filter-and-saleshare-admin-only into main 2026-07-31 17:43:31 +00:00
Owner

Две связанные вещи, обе по решению владельца продукта.

1. auth/** в paths-фильтры обоих CI

auth/roles.yaml — общий RBAC-конфиг двух стеков (bind-mount в backend и в tradein-backend), но лежит в корне репы и не попадал ни в один paths-filter. Следствие: правка ролей/пользователей не запускала ни backend-, ни tradein-сьют.

Так 2026-07-30 в main уехал красный test_get_role_known_usersuser2 перевели в expired, а тест ждал pilot. Обнаружен вручную и починен в PR #2587; теперь дыра закрыта симметрично в ci.yml и ci-tradein.yml.

2. «Поиск домов» — тестовый продукт, только админ

Раньше /trade-in/sale-share был закрыт от клиентских ролей (employee/manager/pilot), но оставался открыт внутренней роли analyst — я специально оставлял её вне deny. «Только у админа» включает и внутренние роли → analyst добавлен в deny по sale-share.

Асимметрия с «Кэшем» намеренная и запиннена тестом: Кэш — не продукт, а диагностика состояния кэшей/скраперов, т.е. ровно тот инструмент, ради которого роль analyst и заведена («видит всё, кроме admin-управления»). Ему он оставлен.

Замерено после правки реальным is_path_allowed поверх roles.yaml:

роль Поиск домов Кэш ядро продукта
admin
analyst
pilot

test_yaml_roles_deliberately_outside_client_deny переписан: пиннит обе стороны асимметрии, а не только «analyst видит всё». Набор внутренних путей разрезан на _SALE_SHARE_PATHS / _CACHE_TOOL_PATHS с assert, что разрез покрывает исходный набор целиком — иначе новый путь добавят в общий список, забудут отнести к продукту, и analyst останется на нём непроверенным.

Заодно

Поправлены устаревшие комментарии «Доступ: pilot + admin» — в Caddyfile (у vanity-редиректа gendsgn.ru/sale-share) и в докстринге самой страницы. Оба теперь говорят про admin-only и про то, что это тестовый продукт.

Проверено

  • pytest tradein (rbac + auth_session + auth_api) → 77 passed
  • pytest site-finder (backend/tests/test_rbac.py) → 24 passed
  • YAML обоих workflow распарсен, backend-фильтры содержат auth/**
  • frontend tsc --noEmit + next build — зелёные

NB по деплою

Правка Caddyfile триггерит деплой Site Finder с пересозданием caddy — изменение только в комментарии, поведение конфига не меняется.

Две связанные вещи, обе по решению владельца продукта. ## 1. `auth/**` в paths-фильтры обоих CI `auth/roles.yaml` — общий RBAC-конфиг двух стеков (bind-mount в `backend` и в `tradein-backend`), но лежит в корне репы и не попадал **ни в один** paths-filter. Следствие: правка ролей/пользователей не запускала ни backend-, ни tradein-сьют. Так 2026-07-30 в main уехал красный `test_get_role_known_users` — `user2` перевели в `expired`, а тест ждал `pilot`. Обнаружен вручную и починен в PR #2587; теперь дыра закрыта симметрично в `ci.yml` и `ci-tradein.yml`. ## 2. «Поиск домов» — тестовый продукт, только админ Раньше `/trade-in/sale-share` был закрыт от клиентских ролей (`employee`/`manager`/`pilot`), но оставался открыт внутренней роли `analyst` — я специально оставлял её вне deny. «Только у админа» включает и внутренние роли → `analyst` добавлен в deny по sale-share. **Асимметрия с «Кэшем» намеренная и запиннена тестом:** Кэш — не продукт, а диагностика состояния кэшей/скраперов, т.е. ровно тот инструмент, ради которого роль `analyst` и заведена («видит всё, кроме admin-управления»). Ему он оставлен. Замерено после правки реальным `is_path_allowed` поверх `roles.yaml`: | роль | Поиск домов | Кэш | ядро продукта | |---|---|---|---| | `admin` | ✅ | ✅ | ✅ | | `analyst` | ❌ | ✅ | ✅ | | `pilot` | ❌ | ❌ | ✅ | `test_yaml_roles_deliberately_outside_client_deny` переписан: пиннит **обе** стороны асимметрии, а не только «analyst видит всё». Набор внутренних путей разрезан на `_SALE_SHARE_PATHS` / `_CACHE_TOOL_PATHS` с `assert`, что разрез покрывает исходный набор целиком — иначе новый путь добавят в общий список, забудут отнести к продукту, и `analyst` останется на нём непроверенным. ## Заодно Поправлены устаревшие комментарии «Доступ: pilot + admin» — в `Caddyfile` (у vanity-редиректа `gendsgn.ru/sale-share`) и в докстринге самой страницы. Оба теперь говорят про admin-only и про то, что это тестовый продукт. ## Проверено - `pytest` tradein (rbac + auth_session + auth_api) → **77 passed** - `pytest` site-finder (`backend/tests/test_rbac.py`) → **24 passed** - YAML обоих workflow распарсен, `backend`-фильтры содержат `auth/**` - frontend `tsc --noEmit` + `next build` — зелёные ## NB по деплою Правка `Caddyfile` триггерит деплой Site Finder с пересозданием caddy — изменение только в комментарии, поведение конфига не меняется.
lekss361 added 1 commit 2026-07-31 17:25:08 +00:00
chore(ci+rbac): auth/** в paths-фильтры + «Поиск домов» только у админа
All checks were successful
CI Trade-In / changes (pull_request) Successful in 8s
CI / changes (pull_request) Successful in 9s
CI Trade-In / frontend-checks (pull_request) Successful in 1m56s
CI / frontend-tests (pull_request) Successful in 2m14s
CI Trade-In / backend-tests (pull_request) Successful in 3m1s
CI / openapi-codegen-check (pull_request) Successful in 2m15s
CI / backend-tests (pull_request) Successful in 15m48s
762d1f68c6
Две связанные вещи, обе — по решению владельца продукта.

1. auth/** в paths-фильтры обоих CI (ci.yml, ci-tradein.yml).
   auth/roles.yaml — общий RBAC-конфиг двух стеков, но лежит в корне репы и не
   попадал НИ В ОДИН фильтр: правка ролей/пользователей не запускала ни backend-,
   ни tradein-сьют. Так 2026-07-30 в main уехал красный test_get_role_known_users
   (user2 переведён в expired, тест ждал pilot) — обнаружен только вручную и
   починен в PR #2587. Теперь правка roles.yaml гоняет оба гейта.

2. «Поиск домов» (/trade-in/sale-share) — ТЕСТОВЫЙ продукт, доступ только у
   админа. Раньше он был закрыт от клиентских ролей (employee/manager/pilot), но
   оставался открыт внутренней роли analyst. «Только у админа» включает и
   внутренние роли → analyst добавлен в deny по sale-share.

   Асимметрия с «Кэшем» намеренная и запиннена тестом: Кэш — не продукт, а
   диагностика кэшей/скраперов, т.е. ровно тот инструмент, ради которого роль
   analyst заведена; ему он оставлен.

Замеры после правки (реальный is_path_allowed поверх roles.yaml):
  роль     | Поиск домов | Кэш  | ядро продукта
  admin    | True        | True | True
  analyst  | False       | True | True
  pilot    | False       | False| True

Тест test_yaml_roles_deliberately_outside_client_deny переписан: пиннит ОБЕ
стороны асимметрии, а не только «analyst видит всё». Набор внутренних путей
разрезан на _SALE_SHARE_PATHS / _CACHE_TOOL_PATHS с assert'ом, что разрез
покрывает исходный набор целиком — иначе новый путь добавят и забудут отнести
к продукту, оставив analyst непроверенным.

Заодно поправлены устаревшие комментарии «Доступ: pilot + admin» в Caddyfile
(vanity-редирект gendsgn.ru/sale-share) и в докстринге самой страницы.

Тесты: 77 passed (tradein rbac/auth_session/auth_api) + 24 passed (site-finder).
tsc --noEmit + next build — зелёные. YAML обоих workflow провалидирован.
lekss361 merged commit 57fe26d3f3 into main 2026-07-31 17:43:31 +00:00
lekss361 deleted branch chore/tradein-ci-auth-filter-and-saleshare-admin-only 2026-07-31 17:43:31 +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#2592
No description provided.