Skip to content

Apply per-file authorization to dag-source endpoint#67662

Open
potiuk wants to merge 2 commits into
apache:mainfrom
potiuk:tighten-dag-sources-per-file-authz
Open

Apply per-file authorization to dag-source endpoint#67662
potiuk wants to merge 2 commits into
apache:mainfrom
potiuk:tighten-dag-sources-per-file-authz

Conversation

@potiuk
Copy link
Copy Markdown
Member

@potiuk potiuk commented May 28, 2026

This PR applies per-file authorization to the /api/v2/dagSources/{dag_id} endpoint, matching the pattern already in place for the import-errors endpoint in #65329.

The dag-source endpoint currently returns the full source code of the file containing the requested Dag, even when the file co-locates multiple Dags and the caller has read access to only some of them. After this change, the endpoint:

  • enumerates every Dag in the same (relative_fileloc, bundle_name) as the requested dag_id,
  • intersects that set with the caller's readable Dag set,
  • redacts the response content if any co-located Dag is not readable by the caller (using the same "REDACTED - you do not have read permission on all Dags in the file" placeholder as import_error.py),
  • returns the source unchanged when the caller can read every Dag in the file.

The endpoint's existing DagAccessEntity.CODE dependency check on the requested dag_id is preserved — this change adds a per-file overlay on top.

Test plan

  • New unit test: caller with CODE access to dag_a but no GET access to co-located dag_b receives the redacted placeholder in response.
  • New unit test: caller with GET access to every Dag in the file receives the source unchanged.
  • Existing tests pass (single-Dag-file case unchanged).
  • prek run on touched files green.
  • mypy clean on the touched file.
Was generative AI tooling used to co-author this PR?
  • Yes — Claude Opus 4.7 (1M context)

Generated-by: Claude Opus 4.7 (1M context) following the guidelines at https://github.com/apache/airflow/blob/main/contributing-docs/05_pull_requests.rst#gen-ai-assisted-contributions

A single source file can define multiple Dags. The /dagSources/{dag_id}
endpoint previously returned the file's full source code as soon as the
caller had CODE access to dag_id, even when the caller was not
authorized to read every other Dag defined in the same file.

Apply the same per-file authorization overlay already used by the
import-errors endpoint (apache#65329): enumerate the Dags
sharing the (relative_fileloc, bundle_name) of the requested Dag,
intersect with the caller's readable Dag set, and redact the source
when any co-located Dag is not readable.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@boring-cyborg boring-cyborg Bot added the area:API Airflow's REST/HTTP API label May 28, 2026
@potiuk potiuk added the backport-to-v3-2-test Mark PR with this label to backport to v3-2-test branch label May 28, 2026
@potiuk potiuk added this to the Airflow 3.2.3 milestone May 28, 2026
Add a Security Model subsection that describes the per-Dag read scope
the dag-source retrieval endpoint enforces, and the known limitation
around historical-version retrieval: the per-Dag scope is evaluated
against the current file membership, which may differ from the file's
contents at the time the requested version was stored. Deployments
that rely on per-Dag read scoping for source isolation should keep one
Dag per source file, or restrict DagAccessEntity.CODE accordingly.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
@potiuk potiuk force-pushed the tighten-dag-sources-per-file-authz branch from 8b0243a to bce61c5 Compare May 29, 2026 19:20
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area:API Airflow's REST/HTTP API backport-to-v3-2-test Mark PR with this label to backport to v3-2-test branch

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant