Enforce datasource publication write scope
This commit is contained in:
@@ -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(
|
||||||
|
|||||||
@@ -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()
|
||||||
|
|||||||
Reference in New Issue
Block a user