Skip to content

fix: enforce project team management authorization - #763

Merged
TThanos3000 merged 1 commit into
devfrom
fix/dev-team-security-errors
Sep 29, 2026
Merged

TThanos3000 merged 1 commit into
devfrom
fix/dev-team-security-errors

Conversation

@TThanos3000

@TThanos3000 TThanos3000 commented Sep 29, 2026 •

Copy link
Copy Markdown
Collaborator

Что изменено

Посторонний авторизованный пользователь больше не может сменить лидера чужого проекта или удалить участника публичного проекта. Team mutation проверяет object permission и повторно проверяет текущего лидера внутри atomic service.

Зачем

PR A утверждённого hardening legacy-команд. Спецификация и AC: docs/team-security-api.md.

Реализация

  • Base SHA: 0976fdf9ff08e85922a38508509fc31347ef1fd3 (dev).
  • Head SHA: c44bcf089c41c6e8c657a70390e98c46bc2510e7.
  • Changed files: projects/views.py, projects/permissions.py, projects/team_service.py, projects/tests/test_team_security.py, docs/team-security-api.md.
  • Согласованный порядок блокировок Project → Collaborator; read permission не становится manage permission.

API

Успешные пути/ответы сохранены. Новые controlled ошибки {code, detail}: not_project_team_manager (403), leader_cannot_leave, collaborator_not_found, invalid_collaborator_id, already_project_leader (422), direct_member_add_unsupported (405). Сломанный direct add закрыт явным ответом; рабочее добавление через Invite сохраняется.

UI

Не менялся. Angular согласован отдельным PR D #392; React не исследовался и не менялся по ТЗ.

Permissions

Team management — только текущий Project.leader; staff/read involvement не получают новых прав. Проверка есть в HTTP и внутри service после lock.

Проверки

  • Checked by tests: PostgreSQL 18.1, Python 3.11, CI settings с отдельным именем test DB и Unicode locale: 16 targeted tests, полный suite 943 tests OK.
  • python manage.py check, makemigrations --check --dry-run: без ошибок/изменений.
  • Black / Flake8 изменённых Python-файлов, git diff --check.
  • Checked by source: requirement audit A1–A7, негативные public/private/direct-service проверки.
  • Review: обход object permission и повторный service actor check проверены; business rules не добавлены.
  • GitHub PostgreSQL 15 CI PASS на этом head; PR Lint / Tests также PASS.

Первый full run на локальной БД с locale C провалил 4 существующие проверки кириллицы. После исправления только тестового окружения full suite прошёл; код поиска не менялся.

Acceptance criteria

  • A1/A2: outsider switch/remove public/private → 403, данные сохранены.
  • A3: collaborator read не даёт manage.
  • A4: лидер по-прежнему может remove/switch.
  • A5: self-remove/not-found/malformed/direct-add → controlled 4xx.
  • A6/A7: service actor recheck и отказ бывшему лидеру после switch.

Не проверено

Browser не применим к backend-only diff. Live DEV/PROD mutations, merge и deploy не выполнялись.

Риски / migration

Migrations: нет. DB constraints: не менялись. Freeze/min/max/exclusivity относятся к PR C, Invite lifecycle — к PR B. Совместимость новых business error codes с Angular реализована в PR D. Следующие backend PR временно stacked по согласованию пользователя; merge выполняется вручную в порядке A → B → C.

@TThanos3000
TThanos3000 marked this pull request as ready for review September 29, 2026 13:33
@TThanos3000
TThanos3000 merged commit 64a97a8 into dev Sep 29, 2026
3 checks passed
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.

2 participants