(low) UserMenu.tsx/UserMenu: роль вне TS-union даёт пустой role-badge (нет рантайм-валидации /me) #1440

Closed
opened 2026-06-15 05:55:37 +00:00 by bot-backend · 0 comments
Collaborator

Severity: low · Категория: frontend · Файл: frontend/src/components/auth/UserMenu.tsx:34-38, 103, 176

UserMenu.tsx:34-38 (ROLE_LABELS: Record<Role,string> = admin/pilot/analyst), :103 (roleLabel = ROLE_LABELS[data.role]), :176 (рендер {roleLabel} внутри badge-блока 163-177). Подтверждено: data.role типизирован как Role из useMe.ts (union 'admin'|'pilot'|'analyst'), но рантайм-значение от GET /api/v1/me не валидируется против union. roles.yaml и useMe.ts/ROLE_LABELS синхронизируются вручную (явно отмечено комментариями в обоих файлах: «при добавлении новой роли расширить тут и ROLE_LABELS»). Если backend добавит новую роль в roles.yaml и /me вернёт её до обновления фронта, ROLE_LABELS[data.role] === undefined → badge (цветной прямоугольник со стилями inline на стр. 163-177) отрендерится пустым, без подписи роли. Комментарий на стр. 29-33 обещает, что Record<Role,string> «сломает build, если backend добавит новую роль» — это верно только для рассинхрона внутри фронта (compile-time), сетевой дрейф фронт↔backend он не ловит. Импакт: косметический — пустой бейдж в личном кабинете, функциональность меню (logout, username) не страдает; безопасности не касается. Чинить: фолбэк const roleLabel = ROLE_LABELS[data.role] ?? data.role; (показать сырое имя роли вместо пустоты), либо не рендерить badge-блок если roleLabel undefined.

Почему баг: Сетевые данные типизированы статически (UserScope.role: Role), но рантайм-значение от backend не валидируется против union. roles.yaml и useMe.ts синхронизируются руками (явно отмечено в комментариях обоих файлов), т.е. дрейф реален. Результат — клиенту показывается пустой цветной бейдж без подписи роли.

Как чинить: Фолбэк: const roleLabel = ROLE_LABELS[data.role] ?? data.role; (или не рендерить бейдж, если метки нет).


deep-audit «армия ботов 2» · verify+harden, confidence 0.75 · unit U89

**Severity:** low · **Категория:** frontend · **Файл:** `frontend/src/components/auth/UserMenu.tsx:34-38, 103, 176` UserMenu.tsx:34-38 (ROLE_LABELS: Record<Role,string> = admin/pilot/analyst), :103 (roleLabel = ROLE_LABELS[data.role]), :176 (рендер {roleLabel} внутри badge-блока 163-177). Подтверждено: data.role типизирован как Role из useMe.ts (union 'admin'|'pilot'|'analyst'), но рантайм-значение от GET /api/v1/me не валидируется против union. roles.yaml и useMe.ts/ROLE_LABELS синхронизируются вручную (явно отмечено комментариями в обоих файлах: «при добавлении новой роли расширить тут и ROLE_LABELS»). Если backend добавит новую роль в roles.yaml и /me вернёт её до обновления фронта, ROLE_LABELS[data.role] === undefined → badge (цветной прямоугольник со стилями inline на стр. 163-177) отрендерится пустым, без подписи роли. Комментарий на стр. 29-33 обещает, что Record<Role,string> «сломает build, если backend добавит новую роль» — это верно только для рассинхрона внутри фронта (compile-time), сетевой дрейф фронт↔backend он не ловит. Импакт: косметический — пустой бейдж в личном кабинете, функциональность меню (logout, username) не страдает; безопасности не касается. Чинить: фолбэк `const roleLabel = ROLE_LABELS[data.role] ?? data.role;` (показать сырое имя роли вместо пустоты), либо не рендерить badge-блок если roleLabel undefined. **Почему баг:** Сетевые данные типизированы статически (UserScope.role: Role), но рантайм-значение от backend не валидируется против union. roles.yaml и useMe.ts синхронизируются руками (явно отмечено в комментариях обоих файлов), т.е. дрейф реален. Результат — клиенту показывается пустой цветной бейдж без подписи роли. **Как чинить:** Фолбэк: const roleLabel = ROLE_LABELS[data.role] ?? data.role; (или не рендерить бейдж, если метки нет). --- <sub>deep-audit «армия ботов 2» · verify+harden, confidence 0.75 · unit U89</sub>
bot-backend added the
week ревью 1
label 2026-06-15 05:55:37 +00:00
bot-backend added the
scope/frontend
label 2026-06-15 11:02:05 +00:00
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#1440
No description provided.