Decision 2026-05-26: pilot аккаунты пилот-программы получают доступ ТОЛЬКО к разделу Trade-In (оценка вторички). Landing, Analytics, Site Finder, Concept — admin-only. Изменения: - `auth/roles.yaml` — `pilot.paths` сужен с 7 путей до 2: `/trade-in/**` + `/trade-in/api/v1/**`. Deny список оставлен как есть для defense-in-depth. - `backend/tests/test_rbac.py` + tradein mirror — переписан `test_is_path_allowed_pilot_excludes_admin` → `_pilot_only_tradein`: pilot allowed только /trade-in, denied на /, /analytics, /site-finder, /concept, /api/v1/parcels. Тест `test_get_user_scope_pilot` ассертит что /trade-in/** в allowed, / и /analytics/** нет. - `frontend/src/lib/__tests__/isPathAllowed.test.ts` — те же parity обновления (pilot allowed list сужен, denied list расширен landing + non-tradein путями). - `caddy/users.caddy.snippet` — синхронизирован с VPS-актуальной версией: regen'd user1..user10 hashes + admintest/pilottest entries (locally added на VPS 2026-05-26 для QA RBAC). Без этого `deploy.yml` делал бы `git reset --hard` и стирал бы локальные правки. - `auth/roles.yaml` users: блок — также добавлены `admintest: admin` и `pilottest: pilot` (mirror VPS local edit). Эффект для UX: - pilot открывает `/` → frontend RouteGuard → fullscreen «Доступа нет» (т.к. `/` не в allowed_paths). - pilot TopNav на main frontend — только пункт «Trade-In» виден (остальные `/analytics`, `/site-finder`, `/concept`, `/admin` отфильтрованы `isPathAllowed`). - pilot открывает `/trade-in` → работает как раньше. - admin (admintest, kopylov-если бы был admin) — без изменений. Backend middleware path-enforcement не делает — security guarantee по-прежнему на admin-only endpoints (`/api/v1/admin/*` блочится для пилота). Path-filter на UI-уровне через `allowed_paths` / `deny_paths` в /me response. Pilot login flow: после basic_auth → main frontend → useMe → /me → scope (allowed=/trade-in/**). RouteGuard на `/` → NoAccessScreen. Pilot должен bookmark'ить `https://gendsgn.ru/trade-in/` напрямую. Follow-up: можно добавить auto-redirect в RouteGuard — если pilot landing-path → redirect на первый allowed (`/trade-in`). Отдельный PR. Tests: 20/20 pass на обоих backend стэках, ruff clean.
25 lines
2.3 KiB
Text
25 lines
2.3 KiB
Text
# GenDesign Pilot — basic_auth users gate
|
|
# Last updated: 2026-05-23
|
|
# Add/remove via scripts/auth/add_user.sh / remove_user.sh, then PR.
|
|
#
|
|
# Format: username bcrypt_hash_base64 # comment
|
|
# Hash generation: caddy hash-password --plaintext <pass> | tr -d '\n' | base64 -w 0
|
|
# Caddy 2.11+ requires base64-encoded bcrypt hashes in Caddyfile basic_auth.
|
|
# Realm is set as argument to basic_auth, not as subdirective.
|
|
|
|
basic_auth bcrypt "GenDesign Pilot" {
|
|
admin JDJhJDE0JHVXRGpmWFBMMmNZd1duQUFJVWFkRi5RVy4xbHBVL3BPaTF6dFBvbUJ5enZvaXQ3bnZ0eGU2 # internal master (qa-tester + health checks, 2026-05-23)
|
|
user1 JDJhJDE0JFdJR2YxSkc2RU90MTVKbzR5R2JOb3VzQVJPelZ6N1BoOGlrZ083WlRKSnY5QlhGSml2ekJD # pilot slot (regenerated 2026-05-26)
|
|
user2 JDJhJDE0JHA1ckY0Qi9ESVlhZTlIOGRDY09ZVXVuZlVYV2tQMHBOcnl6MlByQXdWbUJJWS53MU8uZ2hL # pilot slot (regenerated 2026-05-26)
|
|
user3 JDJhJDE0JHEuSklxVjlZVk96OXBsWmouV0E1anVzUFp4VVFWTW5aQWEvQllYWjFsVE82UHVPTXlnUndp # pilot slot (regenerated 2026-05-26)
|
|
user4 JDJhJDE0JG5WdFRxOUZDUVdBeURzR1ROZS5jMHVsamlNS0Y5ci95bVJCZnBkUHJoekZZM1hESmltR2su # pilot slot (regenerated 2026-05-26)
|
|
user5 JDJhJDE0JC8wbi5IcmNLOS4yMTdKbHpLa24yNnVCZmhmbUNteGpza0pVbDFYejlJQkhSMS96Y3pXaDl1 # pilot slot (regenerated 2026-05-26)
|
|
user6 JDJhJDE0JFZvSkxhR2RzMnB4cUVHUW9wSlRNUU8uMHAya1hiRDJVQ0RoaTd1ckdicFpxNnh0VHFCSEJH # pilot slot (regenerated 2026-05-26)
|
|
user7 JDJhJDE0JHJxVnFMdG1ZazFlQlRreVJqQjU1M2VVbGtBa0xGMzVXS0YzQWhTb2t6dGdVMGxuckE5WmhX # pilot slot (regenerated 2026-05-26)
|
|
user8 JDJhJDE0JDVxNEE4RVRVWi4yUkY2OG9KR2Z4MU8xYWVDYTdkTDNVckJGZHBZM3c5VjlqS3ZyNEFtcWVl # pilot slot (regenerated 2026-05-26)
|
|
user9 JDJhJDE0JGwuaDl1U2JkT1dOWDguVXhJMFozZk9Ec09NVmxyM2J2VVdxdlFzdktXWVNkZDVBMVBuY3Z5 # pilot slot (regenerated 2026-05-26)
|
|
user10 JDJhJDE0JEN4QlV2Z3Q3c2VqMU92OFV4YUo3cWVUUXJkRGExVU9RL3BYNzUweXhXZDdhdGh1MlFwcnN5 # pilot slot (regenerated 2026-05-26)
|
|
kopylov JDJhJDE0JExUald3alVMbS5RdVV0TTRTcGk0cE9YeHNXS2E1QU5rTFp2TnFFQzdmWWNFV3djRVAzOUdH # Копылов (2026-05-23)
|
|
admintest JDJhJDE0JHB6TDV6ZWZFTmZuTTd0S2I0Uy8vZ3VlL2w5bEpKbjEwTGVYVTd2bkRhNW5qbGlYTlhvVkxT # QA test admin role 2026-05-26
|
|
pilottest JDJhJDE0JFQwTW9UV1I0WHUwek5qeFR5SWxTQy4veFFFUzlvL1VoMHFycnJDTkU5czRoVXdwNXRKM2ph # QA test pilot role 2026-05-26
|
|
}
|