jira/apps/api
Manish Gupta 3478d4fac4
[WEB-8352] fix(security): scope SubIssuesEndpoint to the URL project (#9466)
* [WEB-8352] fix(security): scope SubIssuesEndpoint to the URL project (GHSA-gxhv-fw9x-2pg3)

SubIssuesEndpoint is guarded only by ProjectEntityPermission, which verifies
the caller belongs to the URL project_id but not that the path issue_id lives
in that project. Both handlers then resolved issues without a project scope:

- GET filtered sub-issues by parent_id + workspace__slug only, leaking the
  names/priorities/assignees/dates of another project's sub-issues (read IDOR).
- POST loaded the parent by bare pk (no workspace/project scope) and filtered
  the moved sub-issues by workspace__slug only, letting any project member
  re-parent issues from other projects/workspaces (write IDOR).

Scope the parent lookup and both sub-issue querysets to the URL project_id
(and bind the parent to the workspace), returning 404 when the parent is not
in the caller's project. Adds 5 contract tests (3 security, 2 positive
controls); fail-before verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* [WEB-8352] fix: dispatch sub-issue activity only for project-scoped issues (CodeRabbit/Copilot #9466)

The DB update + response were scoped to the URL project, but the activity loop
still iterated the raw caller-supplied sub_issue_ids. A cross-project id
(excluded from the re-parent) would still fire issue_activity.delay, whose task
does an unscoped Issue.objects.get and bumps updated_at — touching a foreign
issue and creating a bogus activity row.

Dispatch from the project-scoped sub_issues (scoped_sub_issue_ids) instead.
Strengthened the test to assert the foreign issue is absent from the response
body (sub_issues / state_distribution) and that no activity is dispatched for it
(mock). Fail-before verified.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

* chore(security): drop advisory identifiers from code comments

Explanations kept unchanged; only the IDs are removed.

Co-authored-by: Plane AI <noreply@plane.so>

---------

Co-authored-by: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Co-authored-by: Plane AI <noreply@plane.so>
2026-08-28 01:52:19 +05:30
..
bin [WEB-5592] chore: add static files update settings for static files support (#8251) 2025-12-09 21:05:26 +05:30
docs chore: upgrade Django 4.2 → 5.2 (#9325) 2026-07-29 19:58:33 +05:30
plane [WEB-8352] fix(security): scope SubIssuesEndpoint to the URL project (#9466) 2026-08-28 01:52:19 +05:30
requirements chore: remove posthog integration and analytics scaffold (#9634) 2026-08-24 21:07:34 +05:30
templates fix: update Twitter icon and links to X (#8785) (#8790) 2026-04-07 15:34:54 +05:30
tests fix: Add docker pytest runner and fix bugs the suite surfaced (#9138) 2026-05-26 01:21:37 +05:30
.coveragerc chore: rename server to api (#7342) 2025-07-04 15:32:21 +05:30
.env.example - Add SIGNED_URL_EXPIRATION environment variable (#8136) 2025-12-03 10:52:19 +05:30
.prettierignore fix: eslint (#8185) 2025-12-05 16:03:51 +05:30
Dockerfile.api chore: updated node version to 22 and python version to 3.12.10 (#7343) 2025-07-04 16:28:30 +05:30
Dockerfile.dev chore: rename server to api (#7342) 2025-07-04 15:32:21 +05:30
manage.py chore: add copyright (#8584) 2026-01-27 13:54:22 +05:30
package.json chore: dump version 2026-08-16 23:36:30 +05:30
pyproject.toml [WEB-5044] fix: ruff lint and format errors (#7868) 2025-09-29 19:15:32 +05:30
pytest.ini chore: rename server to api (#7342) 2025-07-04 15:32:21 +05:30
requirements.txt chore: rename server to api (#7342) 2025-07-04 15:32:21 +05:30
run_tests.py chore: add copyright (#8584) 2026-01-27 13:54:22 +05:30
run_tests.sh chore: rename server to api (#7342) 2025-07-04 15:32:21 +05:30