diff --git a/backend/open_webui/routers/users.py b/backend/open_webui/routers/users.py index 0b8da713df..158d6e8e15 100644 --- a/backend/open_webui/routers/users.py +++ b/backend/open_webui/routers/users.py @@ -269,6 +269,20 @@ async def update_default_user_permissions(request: Request, form_data: UserPermi return request.app.state.config.USER_PERMISSIONS +@router.get('/default/permissions/defaults', response_model=UserPermissions) +async def get_default_user_permissions_defaults(user=Depends(get_admin_user)): + from open_webui.config import DEFAULT_USER_PERMISSIONS + + return { + 'workspace': WorkspacePermissions(**DEFAULT_USER_PERMISSIONS.get('workspace', {})), + 'sharing': SharingPermissions(**DEFAULT_USER_PERMISSIONS.get('sharing', {})), + 'access_grants': AccessGrantsPermissions(**DEFAULT_USER_PERMISSIONS.get('access_grants', {})), + 'chat': ChatPermissions(**DEFAULT_USER_PERMISSIONS.get('chat', {})), + 'features': FeaturesPermissions(**DEFAULT_USER_PERMISSIONS.get('features', {})), + 'settings': SettingsPermissions(**DEFAULT_USER_PERMISSIONS.get('settings', {})), + } + + ############################ # GetUserSettingsBySessionUser ############################ diff --git a/src/lib/apis/users/index.ts b/src/lib/apis/users/index.ts index 267aa69d22..fb68ab8f61 100644 --- a/src/lib/apis/users/index.ts +++ b/src/lib/apis/users/index.ts @@ -85,6 +85,33 @@ export const updateUserDefaultPermissions = async (token: string, permissions: o return res; }; +export const getUserDefaultPermissionsDefaults = async (token: string) => { + let error = null; + + const res = await fetch(`${WEBUI_API_BASE_URL}/users/default/permissions/defaults`, { + method: 'GET', + headers: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${token}` + } + }) + .then(async (res) => { + if (!res.ok) throw await res.json(); + return res.json(); + }) + .catch((err) => { + console.error(err); + error = err.detail; + return null; + }); + + if (error) { + throw error; + } + + return res; +}; + export const updateUserRole = async (token: string, id: string, role: string) => { let error = null; diff --git a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte index d446f9f62a..622409a3da 100644 --- a/src/lib/components/admin/Users/Groups/EditGroupModal.svelte +++ b/src/lib/components/admin/Users/Groups/EditGroupModal.svelte @@ -10,9 +10,11 @@ import Users from './Users.svelte'; import GroupPreviewPanel from './GroupPreviewPanel.svelte'; import { DEFAULT_PERMISSIONS } from '$lib/constants/permissions'; + import { getUserDefaultPermissions, getUserDefaultPermissionsDefaults } from '$lib/apis/users'; import UserPlusSolid from '$lib/components/icons/UserPlusSolid.svelte'; import WrenchSolid from '$lib/components/icons/WrenchSolid.svelte'; import ConfirmDialog from '$lib/components/common/ConfirmDialog.svelte'; + import Tooltip from '$lib/components/common/Tooltip.svelte'; import XMark from '$lib/components/icons/XMark.svelte'; export let onSubmit: Function = () => {}; @@ -31,6 +33,7 @@ let selectedTab = 'general'; let loading = false; let showDeleteConfirmDialog = false; + let showResetConfirmDialog = false; let userCount = 0; @@ -56,6 +59,29 @@ show = false; }; + const resetToDefaultsHandler = async () => { + try { + // For user groups: reset to current global default permissions + // For default permissions modal: reset to stock/env-var configuration + const defaults = custom + ? await getUserDefaultPermissions(localStorage.token) + : await getUserDefaultPermissionsDefaults(localStorage.token); + if (defaults) { + permissions = { + workspace: { ...DEFAULT_PERMISSIONS.workspace, ...defaults.workspace }, + sharing: { ...DEFAULT_PERMISSIONS.sharing, ...defaults.sharing }, + access_grants: { ...DEFAULT_PERMISSIONS.access_grants, ...defaults.access_grants }, + chat: { ...DEFAULT_PERMISSIONS.chat, ...defaults.chat }, + features: { ...DEFAULT_PERMISSIONS.features, ...defaults.features }, + settings: { ...DEFAULT_PERMISSIONS.settings, ...defaults.settings } + }; + toast.success($i18n.t('Permissions reset to defaults')); + } + } catch (error) { + toast.error(`${error}`); + } + }; + const init = () => { if (group) { name = group.name; @@ -94,6 +120,17 @@ }} /> + { + resetToDefaultsHandler(); + }} +/> +
@@ -250,7 +287,29 @@
{#if ['general', 'permissions'].includes(selectedTab)} -
+
+
+ {#if selectedTab === 'permissions'} + + + + {/if} +
+