Skip to content

[CI verify — закрыть] full-stack PR1+PR2+PR3 - #4

Closed
jazz-max wants to merge 3 commits into
mainfrom
feat/pluggable-servlet-authorizer
Closed

jazz-max wants to merge 3 commits into
mainfrom
feat/pluggable-servlet-authorizer

Conversation

@jazz-max

@jazz-max jazz-max commented Jul 6, 2026

Copy link
Copy Markdown
Owner

Временный PR только для прогона CI на полном стеке (PR #1+#2+#3). Будет закрыт после проверки. Реальные PR: #1←main, #2#1, #3#2.

jazz-max and others added 3 commits July 6, 2026 11:44
… лог-каналы

- удалить публичный роут /public/files/* (FileController::publicDownload):
  отдавал файлы пользователей без авторизации; во фронте не используется.
- download(): защита от path traversal (safePath с realpath-containment),
  т.к. роут ловит {file} через where('.*').
- лог-события (ServletStarted/Log/Finished) → PrivateChannel; в routes/channels.php
  авторизация servlet.{userId}.{name} по владельцу — раньше каналы были
  публичными и изолировались лишь userId в имени.
- фронт: Echo.channel() → Echo.private(); добавлен <meta csrf-token> для
  авторизации приватных каналов (POST /broadcasting/auth).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Реестр servlets.json читался напрямую в 4 местах (ServletController,
FileController, RunServletCommand, HandleInertiaRequests) с захардкоженным
путём и в двух форматах (assoc/stdClass). Сведено к одному сервису:

- app/Servlets/ServletRegistry: all()/native()/sidebar()/find()/classname(),
  singleton, кэш в памяти; путь через config('workbench.servlets_path').
- ServletController/FileController — инъекция реестра, удалены приватные
  loadServlets()/findServlet().
- RunServletCommand::resolveClassName() и HandleInertiaRequests::share()
  используют реестр.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Добавлена точка расширения авторизации сервлетов; поведение по умолчанию не
меняется (любой залогиненный запускает всё — обратная совместимость).

- App\Contracts\ServletAuthorizer + дефолт App\Servlets\Authorizers\AllowAllAuthorizer;
  биндинг через config('workbench.authorizer') — хост подставляет свою RBAC.
- Gate 'runServlet' делегирует авторизатору — единый источник для контроллеров
  и фильтра списка/сайдбара в ServletRegistry.
- ServletController: Gate::authorize('runServlet') на show/run/stop/action;
  index фильтруется через native($user); сайдбар (HandleInertiaRequests) — sidebar($user).
- FileController: Gate::authorize('runServlet') на всех файловых операциях
  (upload/download/result-files/download-zip/clear-in/clear-out/input-files/save-params),
  чтобы доступ к файлам был согласован с правом запуска сервлета.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@jazz-max
jazz-max force-pushed the feat/pluggable-servlet-authorizer branch from 629ad16 to fd2944d Compare July 6, 2026 09:01
@jazz-max

jazz-max commented Jul 6, 2026

Copy link
Copy Markdown
Owner Author

CI на полном стеке (PR #1+#2+#3) зелёный на PHP 8.4 (Pint + 40 тестов + npm build). Временный PR закрыт — мержить через реальные стек-PR #1#2#3.

@jazz-max jazz-max closed this Jul 6, 2026
@jazz-max
jazz-max deleted the feat/pluggable-servlet-authorizer branch July 6, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant