feat(dsl): add manager-only guard for secret-bearing DSL export

This commit is contained in:
Charles Yao
2026-07-15 06:32:52 -07:00
parent 30258763e5
commit 9ed6598d70
2 changed files with 33 additions and 0 deletions
+8
View File
@@ -14,6 +14,7 @@ from packaging.version import parse as parse_version
from pydantic import BaseModel, Field
from sqlalchemy import select
from sqlalchemy.orm import Session
from werkzeug.exceptions import Forbidden
from configs import dify_config
from constants.dsl_version import CURRENT_APP_DSL_VERSION
@@ -37,6 +38,7 @@ from graphon.nodes.question_classifier.entities import QuestionClassifierNodeDat
from graphon.nodes.tool.entities import ToolNodeData
from libs.datetime_utils import naive_utc_now
from models import Account, App, AppMode
from models.account import TenantAccountRole
from models.model import AppModelConfig, AppModelConfigDict, IconType, load_annotation_reply_config
from models.workflow import Workflow
from services.agent.dsl_service import AgentDslService, AgentPackage
@@ -395,6 +397,12 @@ class AppDslService:
leaked_dependencies=leaked_dependencies,
)
@staticmethod
def assert_secret_export_allowed(*, include_secret: bool, current_role: "TenantAccountRole | None") -> None:
"""Only workspace managers (owner/admin) may export secrets in a DSL."""
if include_secret and not TenantAccountRole.is_privileged_role(current_role):
raise Forbidden("Only workspace managers can export secrets.")
def _create_or_update_app(
self,
*,
@@ -0,0 +1,25 @@
import pytest
from werkzeug.exceptions import Forbidden
from models.account import TenantAccountRole
from services.app_dsl_service import AppDslService
def test_non_secret_export_allowed_for_any_role() -> None:
# Must not raise for a normal member exporting without secrets.
AppDslService.assert_secret_export_allowed(include_secret=False, current_role=TenantAccountRole.NORMAL)
def test_secret_export_allowed_for_privileged_roles() -> None:
AppDslService.assert_secret_export_allowed(include_secret=True, current_role=TenantAccountRole.OWNER)
AppDslService.assert_secret_export_allowed(include_secret=True, current_role=TenantAccountRole.ADMIN)
def test_secret_export_forbidden_for_non_privileged_role() -> None:
with pytest.raises(Forbidden):
AppDslService.assert_secret_export_allowed(include_secret=True, current_role=TenantAccountRole.NORMAL)
def test_secret_export_forbidden_for_none_role() -> None:
with pytest.raises(Forbidden):
AppDslService.assert_secret_export_allowed(include_secret=True, current_role=None)