Skip to content

Commit 5b717a5

Browse files
committed
feat: add shared tool read permission functionality
1 parent b8db6a7 commit 5b717a5

2 files changed

Lines changed: 20 additions & 2 deletions

File tree

‎apps/common/utils/shared_resource_auth.py‎

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from common.exception.app_exception import AppApiException, AppUnauthorizedFailed
1414
from knowledge.models import Knowledge
1515
from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission
16-
from tools.models import Tool
16+
from tools.models import Tool, ToolScope
1717
from users.serializers.user import is_workspace_manage
1818

1919

@@ -33,6 +33,8 @@ def _filter_user_authorized_tool_ids(ids: List[str], workspace_id: str, user_id=
3333
target__in=ids,
3434
)
3535
authorized_ids = {str(permission.target) for permission in permission_list if permission.permission_list}
36+
shared_tool_ids = QuerySet(Tool).filter(id__in=ids, scope=ToolScope.SHARED).values_list('id', flat=True)
37+
authorized_ids.update(str(tool_id) for tool_id in shared_tool_ids)
3638
return [str(i) for i in ids if str(i) in authorized_ids]
3739

3840

@@ -93,4 +95,4 @@ def validate_authorized_tool_ids(tool_ids: List[str], workspace_id: str, user_id
9395
authorized_ids.update(extra_authorized_set)
9496
if any(tool_id not in authorized_ids for tool_id in normalized_tool_ids):
9597
raise AppUnauthorizedFailed(403, "No permission to access")
96-
return normalized_tool_ids
98+
return normalized_tool_ids

‎apps/tools/views/tool.py‎

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
from common.auth import TokenAuth
33
from common.auth.authentication import check_batch_permissions, has_permissions
44
from common.constants.permission_constants import CompareConstants, PermissionConstants, RoleConstants, ViewPermission
5+
from common.database_model_manage.database_model_manage import DatabaseModelManage
56
from common.log.log import log
67
from django.db.models import QuerySet
78
from django.utils.translation import gettext_lazy as _
@@ -29,6 +30,20 @@
2930
from tools.serializers.tool import ToolBatchOperateSerializer, ToolSerializer, ToolTreeSerializer
3031

3132

33+
def get_shared_tool_read_permission(request, kwargs):
34+
get_authorized_tool = DatabaseModelManage.get_model("get_authorized_tool")
35+
if get_authorized_tool is None:
36+
return None
37+
shared_tool_query_set = QuerySet(Tool).filter(id=kwargs.get("tool_id"), scope=ToolScope.SHARED)
38+
if get_authorized_tool(shared_tool_query_set, kwargs.get("workspace_id")).exists():
39+
return ViewPermission(
40+
[RoleConstants.USER.get_workspace_role(), RoleConstants.WORKSPACE_MANAGE.get_workspace_role()],
41+
[PermissionConstants.TOOL_READ.get_workspace_permission()],
42+
CompareConstants.OR,
43+
)
44+
return None
45+
46+
3247
def get_tool_operation_object(tool_id):
3348
tool_model = QuerySet(model=Tool).filter(id=tool_id).first()
3449
if tool_model is not None:
@@ -176,6 +191,7 @@ def put(self, request: Request, workspace_id: str, tool_id: str):
176191
tags=[_("Tool")], # type: ignore
177192
)
178193
@has_permissions(
194+
get_shared_tool_read_permission,
179195
PermissionConstants.TOOL_READ.get_workspace_tool_permission(),
180196
PermissionConstants.TOOL_READ.get_workspace_permission_workspace_manage_role(),
181197
RoleConstants.WORKSPACE_MANAGE.get_workspace_role(),

0 commit comments

Comments
 (0)