diff --git a/api/controllers/openapi/app_dsl.py b/api/controllers/openapi/app_dsl.py index a42a77dc35f..f7890336d81 100644 --- a/api/controllers/openapi/app_dsl.py +++ b/api/controllers/openapi/app_dsl.py @@ -34,12 +34,12 @@ class AppDslImportApi(Resource): Returns 400 when the import failed due to invalid DSL or a business error. """ - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL, resource_required=False) @auth_router.guard_workspace( scope=Scope.WORKSPACE_WRITE, allowed_token_types=frozenset({TokenType.OAUTH_ACCOUNT}), allowed_roles=frozenset({TenantAccountRole.EDITOR, TenantAccountRole.ADMIN, TenantAccountRole.OWNER}), ) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL, resource_required=False) @returns(200, Import, "Import completed") @returns(202, Import, "Import pending confirmation") @returns(400, Import, "Import failed") @@ -123,12 +123,12 @@ class AppDslExportApi(Resource): receive a 403; enable the API in the console first if needed. """ - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL) @auth_router.guard( scope=Scope.APPS_READ, allowed_token_types=frozenset({TokenType.OAUTH_ACCOUNT}), allowed_roles=frozenset({TenantAccountRole.EDITOR, TenantAccountRole.ADMIN, TenantAccountRole.OWNER}), ) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL) @accepts(query=AppDslExportQuery) @returns(200, AppDslExportResponse, "Export successful") def get(self, app_id: str, *, auth_data: AuthData, query: AppDslExportQuery): @@ -154,12 +154,12 @@ class AppDslCheckDependenciesApi(Resource): dependencies are satisfied. """ - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL) @auth_router.guard( scope=Scope.APPS_READ, allowed_token_types=frozenset({TokenType.OAUTH_ACCOUNT}), allowed_roles=frozenset({TenantAccountRole.EDITOR, TenantAccountRole.ADMIN, TenantAccountRole.OWNER}), ) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_IMPORT_EXPORT_DSL) @returns(200, CheckDependenciesResult, "Dependencies checked") def get(self, app_id: str, *, auth_data: AuthData): app = cast(App, auth_data.app) diff --git a/api/controllers/openapi/app_run.py b/api/controllers/openapi/app_run.py index 4f09631fce4..7f214480110 100644 --- a/api/controllers/openapi/app_run.py +++ b/api/controllers/openapi/app_run.py @@ -137,8 +137,8 @@ _DISPATCH: dict[AppMode, Callable[[App, Any, AppRunRequest], Any]] = { @openapi_ns.route("/apps//run") class AppRunApi(Resource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @auth_router.guard(scope=Scope.APPS_RUN) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @openapi_ns.response(200, "Run result (SSE stream)", openapi_ns.models[EventStreamResponse.__name__]) @accepts(body=AppRunRequest) def post(self, app_id: str, *, auth_data: AuthData, body: AppRunRequest): @@ -169,8 +169,8 @@ class AppRunApi(Resource): @openapi_ns.route("/apps//tasks//stop") class AppRunTaskStopApi(Resource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @auth_router.guard(scope=Scope.APPS_RUN) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @returns(200, TaskStopResponse, description="Task stopped") def post(self, app_id: str, task_id: str, *, auth_data: AuthData): app_model, caller, caller_kind = auth_data.require_app_context() diff --git a/api/controllers/openapi/apps.py b/api/controllers/openapi/apps.py index 10b7fb0d5e1..4dfc147d7b6 100644 --- a/api/controllers/openapi/apps.py +++ b/api/controllers/openapi/apps.py @@ -87,8 +87,8 @@ def parameters_payload(app: App) -> dict: @openapi_ns.route("/apps//describe") class AppDescribeApi(AppReadResource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_VIEW_LAYOUT) @auth_router.guard(scope=Scope.APPS_READ, allowed_token_types=frozenset({TokenType.OAUTH_ACCOUNT})) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_VIEW_LAYOUT) @returns(200, AppDescribeResponse, description="App description") @accepts(query=AppDescribeQuery) def get(self, app_id: str, *, auth_data: AuthData, query: AppDescribeQuery): @@ -138,8 +138,8 @@ class AppDescribeApi(AppReadResource): @openapi_ns.route("/apps") class AppListApi(Resource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_VIEW_LAYOUT, resource_required=False) @auth_router.guard_workspace(scope=Scope.APPS_READ, allowed_token_types=frozenset({TokenType.OAUTH_ACCOUNT})) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_VIEW_LAYOUT, resource_required=False) @returns(200, AppListResponse, description="App list") @accepts(query=AppListQuery) def get(self, *, auth_data: AuthData, query: AppListQuery): diff --git a/api/controllers/openapi/human_input_form.py b/api/controllers/openapi/human_input_form.py index 6f04d111c52..51a0b49de20 100644 --- a/api/controllers/openapi/human_input_form.py +++ b/api/controllers/openapi/human_input_form.py @@ -58,9 +58,9 @@ def _ensure_form_is_allowed_for_openapi(form) -> None: @openapi_ns.route("/apps//form/human_input/") class OpenApiWorkflowHumanInputFormApi(Resource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @openapi_ns.response(200, "Form definition", openapi_ns.models[HumanInputFormDefinitionResponse.__name__]) @auth_router.guard(scope=Scope.APPS_RUN) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) def get(self, app_id: str, form_token: str, *, auth_data: AuthData): app_model, caller, caller_kind = auth_data.require_app_context() service = HumanInputService(db.engine) @@ -73,8 +73,8 @@ class OpenApiWorkflowHumanInputFormApi(Resource): service.ensure_form_active(form) return _jsonify_form_definition(form) - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @auth_router.guard(scope=Scope.APPS_RUN) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @returns(200, FormSubmitResponse, description="Form submitted") @accepts(body=HumanInputFormSubmitPayload) def post(self, app_id: str, form_token: str, *, auth_data: AuthData, body: HumanInputFormSubmitPayload): diff --git a/api/controllers/openapi/workflow_events.py b/api/controllers/openapi/workflow_events.py index bbb9889cff4..7a4c657bd61 100644 --- a/api/controllers/openapi/workflow_events.py +++ b/api/controllers/openapi/workflow_events.py @@ -45,10 +45,10 @@ class WorkflowEventsQuery(BaseModel): @openapi_ns.route("/apps//tasks//events") class OpenApiWorkflowEventsApi(Resource): - @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) @openapi_ns.doc(params=query_params_from_model(WorkflowEventsQuery)) @openapi_ns.response(200, "SSE event stream", openapi_ns.models[EventStreamResponse.__name__]) @auth_router.guard(scope=Scope.APPS_RUN) + @rbac_permission_required(RBACResourceScope.APP, RBACPermission.APP_TEST_AND_RUN) def get(self, app_id: str, task_id: str, *, auth_data: AuthData): app_model, caller, caller_kind = auth_data.require_app_context() app_mode = AppMode.value_of(app_model.mode)