diff --git a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py index a28b44d0346..95f19e11fd8 100644 --- a/api/controllers/console/datasets/rag_pipeline/datasource_auth.py +++ b/api/controllers/console/datasets/rag_pipeline/datasource_auth.py @@ -336,6 +336,8 @@ class DatasourceAuth(Resource): @setup_required @login_required @account_initialization_required + @edit_permission_required + @rbac_permission_required(RBACResourceScope.DATASET, RBACPermission.CREDENTIAL_MANAGE, resource_required=False) @with_current_user @with_current_tenant_id def get(self, current_tenant_id: str, user: Account, provider_id: str): diff --git a/api/tests/unit_tests/controllers/console/test_workspace_credential_mutation_permissions.py b/api/tests/unit_tests/controllers/console/test_workspace_credential_mutation_permissions.py index 2f66ace3177..a46ce6b106d 100644 --- a/api/tests/unit_tests/controllers/console/test_workspace_credential_mutation_permissions.py +++ b/api/tests/unit_tests/controllers/console/test_workspace_credential_mutation_permissions.py @@ -5,6 +5,7 @@ import pytest from controllers.common.wraps import RBACPermission, RBACResourceScope from controllers.console.datasets.data_source import DataSourceApi +from controllers.console.datasets.rag_pipeline.datasource_auth import DatasourceAuth from controllers.console.workspace.model_providers import ModelProviderCredentialApi from controllers.console.workspace.models import ModelProviderModelCredentialApi from controllers.console.workspace.tool_providers import ToolBuiltinProviderAddApi, ToolOAuthCustomClient @@ -65,3 +66,18 @@ def test_tool_oauth_custom_client_get_requires_admin_and_rbac() -> None: assert rbac_config["resource_type"] == RBACResourceScope.WORKSPACE assert rbac_config["scene"] == RBACPermission.CREDENTIAL_MANAGE assert rbac_config["resource_required"] is False + + +def test_datasource_auth_get_requires_edit_and_rbac() -> None: + """GET endpoint that lists datasource credentials must enforce + the same edit + RBAC gates as its sibling POST method.""" + method = DatasourceAuth.get + + edit_wrapper = unwrap(method, stop=lambda wrapper: "edit_permission_required" in wrapper.__code__.co_qualname) + assert "edit_permission_required" in edit_wrapper.__code__.co_qualname + + rbac_wrapper = unwrap(method, stop=lambda wrapper: "rbac_permission_required" in wrapper.__code__.co_qualname) + rbac_config = getclosurevars(rbac_wrapper).nonlocals + assert rbac_config["resource_type"] == RBACResourceScope.DATASET + assert rbac_config["scene"] == RBACPermission.CREDENTIAL_MANAGE + assert rbac_config["resource_required"] is False