From 677e164f2902040106285555cb6e6292f50a91ef Mon Sep 17 00:00:00 2001
From: G30 <50341825+silentoplayz@users.noreply.github.com>
Date: Mon, 29 Jun 2026 02:36:27 -0400
Subject: [PATCH] feat(permissions): add workspace.skills_import and
workspace.skills_export permissions (#25921)
---
backend/open_webui/config.py | 10 ++++++++++
backend/open_webui/routers/skills.py | 11 ++++++++---
backend/open_webui/routers/users.py | 2 ++
.../admin/Users/Groups/Permissions.svelte | 17 ++++++++++++++++-
src/lib/components/workspace/Skills.svelte | 4 ++--
.../workspace/Skills/SkillMenu.svelte | 2 +-
src/lib/constants/permissions.ts | 4 +++-
7 files changed, 42 insertions(+), 8 deletions(-)
diff --git a/backend/open_webui/config.py b/backend/open_webui/config.py
index 940e7053b1..8765ccd617 100644
--- a/backend/open_webui/config.py
+++ b/backend/open_webui/config.py
@@ -1650,6 +1650,14 @@ USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT = (
os.getenv('USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT', 'False').lower() == 'true'
)
+USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT = (
+ os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT', 'False').lower() == 'true'
+)
+
+USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT = (
+ os.getenv('USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT', 'False').lower() == 'true'
+)
+
USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING = (
os.getenv('USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING', 'False').lower() == 'true'
@@ -1813,6 +1821,8 @@ DEFAULT_USER_PERMISSIONS = {
'prompts_export': USER_PERMISSIONS_WORKSPACE_PROMPTS_EXPORT,
'tools_import': USER_PERMISSIONS_WORKSPACE_TOOLS_IMPORT,
'tools_export': USER_PERMISSIONS_WORKSPACE_TOOLS_EXPORT,
+ 'skills_import': USER_PERMISSIONS_WORKSPACE_SKILLS_IMPORT,
+ 'skills_export': USER_PERMISSIONS_WORKSPACE_SKILLS_EXPORT,
},
'sharing': {
'models': USER_PERMISSIONS_WORKSPACE_MODELS_ALLOW_SHARING,
diff --git a/backend/open_webui/routers/skills.py b/backend/open_webui/routers/skills.py
index 064529abae..e92143aee1 100644
--- a/backend/open_webui/routers/skills.py
+++ b/backend/open_webui/routers/skills.py
@@ -131,7 +131,7 @@ async def export_skills(
):
if user.role != 'admin' and not await has_permission(
user.id,
- 'workspace.skills',
+ 'workspace.skills_export',
await Config.get('user.permissions'),
db=db,
):
@@ -158,8 +158,13 @@ async def create_new_skill(
user=Depends(get_verified_user),
db: AsyncSession = Depends(get_async_session),
):
- if user.role != 'admin' and not await has_permission(
- user.id, 'workspace.skills', await Config.get('user.permissions'), db=db
+ if user.role != 'admin' and not (
+ await has_permission(
+ user.id, 'workspace.skills', await Config.get('user.permissions'), db=db
+ )
+ or await has_permission(
+ user.id, 'workspace.skills_import', await Config.get('user.permissions'), db=db
+ )
):
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py
index 2d5de22cb5..83eb25312a 100644
--- a/backend/open_webui/routers/users.py
+++ b/backend/open_webui/routers/users.py
@@ -179,6 +179,8 @@ class WorkspacePermissions(BaseModel):
prompts_export: bool = False
tools_import: bool = False
tools_export: bool = False
+ skills_import: bool = False
+ skills_export: bool = False
class SharingPermissions(BaseModel):
diff --git a/src/lib/components/admin/Users/Groups/Permissions.svelte b/src/lib/components/admin/Users/Groups/Permissions.svelte
index 5180b1a240..f1d2bc5305 100644
--- a/src/lib/components/admin/Users/Groups/Permissions.svelte
+++ b/src/lib/components/admin/Users/Groups/Permissions.svelte
@@ -174,7 +174,22 @@