Enforce datasource publication write scope

This commit is contained in:
2026-07-28 15:04:07 +02:00
parent 8ae7dace99
commit 6294362025
2 changed files with 18 additions and 9 deletions

View File

@@ -1220,13 +1220,7 @@ def _publication_context(
session: object, session: object,
principal: object, principal: object,
) -> tuple[Session, ApiPrincipal]: ) -> tuple[Session, ApiPrincipal]:
if not isinstance(session, Session): return _context(session, principal, SOURCE_WRITE_SCOPE)
raise TypeError("Datasource providers require a SQLAlchemy session.")
if not isinstance(principal, ApiPrincipal):
raise DatasourceAccessError("A tenant API principal is required.")
if not principal.tenant_id:
raise DatasourceAccessError("A tenant API principal is required.")
return session, principal
def _validate_columns( def _validate_columns(

View File

@@ -352,7 +352,7 @@ class DatasourceLifecycleTests(unittest.TestCase):
) )
def test_producer_publication_is_atomic_idempotent_and_addressable(self) -> None: def test_producer_publication_is_atomic_idempotent_and_addressable(self) -> None:
producer = principal(scopes=()) producer = principal(scopes=(SOURCE_WRITE_SCOPE,))
request = DatasourcePublicationRequest( request = DatasourcePublicationRequest(
producer_module="dataflow", producer_module="dataflow",
producer_run_ref="dataflow-run:run-1", producer_run_ref="dataflow-run:run-1",
@@ -405,7 +405,7 @@ class DatasourceLifecycleTests(unittest.TestCase):
) )
def test_publication_idempotency_key_rejects_different_output(self) -> None: def test_publication_idempotency_key_rejects_different_output(self) -> None:
producer = principal(scopes=()) producer = principal(scopes=(SOURCE_WRITE_SCOPE,))
base = DatasourcePublicationRequest( base = DatasourcePublicationRequest(
producer_module="dataflow", producer_module="dataflow",
producer_run_ref="dataflow-run:run-1", producer_run_ref="dataflow-run:run-1",
@@ -430,6 +430,21 @@ class DatasourceLifecycleTests(unittest.TestCase):
), ),
) )
def test_publication_requires_source_write_scope(self) -> None:
with self.assertRaises(DatasourceAccessError):
self.provider.publish_rows(
self.session,
principal(scopes=()),
request=DatasourcePublicationRequest(
producer_module="dataflow",
producer_run_ref="dataflow-run:run-1",
idempotency_key="denied",
name="Result",
source_name="result",
rows=({"id": 1},),
),
)
if __name__ == "__main__": if __name__ == "__main__":
unittest.main() unittest.main()