diff --git a/api/server/middleware/roles/generateCheckAccess.js b/api/server/middleware/roles/generateCheckAccess.js index 900921ef80..ffc0ddc613 100644 --- a/api/server/middleware/roles/generateCheckAccess.js +++ b/api/server/middleware/roles/generateCheckAccess.js @@ -1,4 +1,3 @@ -const { SystemRoles } = require('librechat-data-provider'); const { getRoleByName } = require('~/models/Role'); /** @@ -17,10 +16,6 @@ const generateCheckAccess = (permissionType, permissions, bodyProps = {}) => { return res.status(401).json({ message: 'Authorization required' }); } - if (user.role === SystemRoles.ADMIN) { - return next(); - } - const role = await getRoleByName(user.role); if (role && role[permissionType]) { const hasAnyPermission = permissions.some((permission) => { diff --git a/api/server/routes/roles.js b/api/server/routes/roles.js index 06005ad40e..36152e2c7e 100644 --- a/api/server/routes/roles.js +++ b/api/server/routes/roles.js @@ -20,7 +20,10 @@ router.get('/:roleName', async (req, res) => { // TODO: TEMP, use a better parsing for roleName const roleName = _r.toUpperCase(); - if (req.user.role !== SystemRoles.ADMIN && !roleDefaults[roleName]) { + if ( + (req.user.role !== SystemRoles.ADMIN && roleName === SystemRoles.ADMIN) || + (req.user.role !== SystemRoles.ADMIN && !roleDefaults[roleName]) + ) { return res.status(403).send({ message: 'Unauthorized' }); } diff --git a/api/server/services/start/interface.js b/api/server/services/start/interface.js index 54e8b38237..bf31eb78b8 100644 --- a/api/server/services/start/interface.js +++ b/api/server/services/start/interface.js @@ -39,6 +39,11 @@ async function loadDefaultInterface(config, configDefaults, roleName = SystemRol [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: loadedInterface.bookmarks }, [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: loadedInterface.multiConvo }, }); + await updateAccessPermissions(SystemRoles.ADMIN, { + [PermissionTypes.PROMPTS]: { [Permissions.USE]: loadedInterface.prompts }, + [PermissionTypes.BOOKMARKS]: { [Permissions.USE]: loadedInterface.bookmarks }, + [PermissionTypes.MULTI_CONVO]: { [Permissions.USE]: loadedInterface.multiConvo }, + }); let i = 0; const logSettings = () => { diff --git a/client/src/hooks/AuthContext.tsx b/client/src/hooks/AuthContext.tsx index 2b2ab21064..36dea258b9 100644 --- a/client/src/hooks/AuthContext.tsx +++ b/client/src/hooks/AuthContext.tsx @@ -35,7 +35,10 @@ const AuthContextProvider = ({ const [error, setError] = useState(undefined); const [isAuthenticated, setIsAuthenticated] = useState(false); const { data: userRole = null } = useGetRole(SystemRoles.USER, { - enabled: !!(isAuthenticated && user?.role), + enabled: !!(isAuthenticated && (user?.role ?? '')), + }); + const { data: adminRole = null } = useGetRole(SystemRoles.ADMIN, { + enabled: !!(isAuthenticated && user?.role === SystemRoles.ADMIN), }); const navigate = useNavigate(); @@ -130,7 +133,7 @@ const AuthContextProvider = ({ if (userQuery.data) { setUser(userQuery.data); } else if (userQuery.isError) { - doSetError((userQuery?.error as Error).message); + doSetError((userQuery.error as Error).message); navigate('/login', { replace: true }); } if (error && isAuthenticated) { @@ -179,11 +182,12 @@ const AuthContextProvider = ({ setError, roles: { [SystemRoles.USER]: userRole, + [SystemRoles.ADMIN]: adminRole, }, isAuthenticated, }), // eslint-disable-next-line react-hooks/exhaustive-deps - [user, error, isAuthenticated, token, userRole], + [user, error, isAuthenticated, token, userRole, adminRole], ); return {children}; diff --git a/client/src/hooks/Roles/useHasAccess.ts b/client/src/hooks/Roles/useHasAccess.ts index 24e6746d5a..ecbffc2185 100644 --- a/client/src/hooks/Roles/useHasAccess.ts +++ b/client/src/hooks/Roles/useHasAccess.ts @@ -1,5 +1,5 @@ import { useMemo, useCallback } from 'react'; -import { SystemRoles, PermissionTypes, Permissions } from 'librechat-data-provider'; +import { PermissionTypes, Permissions } from 'librechat-data-provider'; import { useAuthContext } from '~/hooks/AuthContext'; const useHasAccess = ({ @@ -13,9 +13,7 @@ const useHasAccess = ({ const checkAccess = useCallback( ({ user, permissionType, permission }) => { - if (isAuthenticated && user?.role === SystemRoles.ADMIN) { - return true; - } else if (isAuthenticated && user?.role != null && roles && roles[user.role]) { + if (isAuthenticated && user?.role != null && roles && roles[user.role]) { return roles[user.role]?.[permissionType]?.[permission] === true; } return false; diff --git a/client/src/routes/Layouts/DashBreadcrumb.tsx b/client/src/routes/Layouts/DashBreadcrumb.tsx index a0456c933d..f031689e94 100644 --- a/client/src/routes/Layouts/DashBreadcrumb.tsx +++ b/client/src/routes/Layouts/DashBreadcrumb.tsx @@ -10,10 +10,10 @@ import { BreadcrumbList, BreadcrumbSeparator, // BreadcrumbEllipsis, - DropdownMenu, + // DropdownMenu, // DropdownMenuItem, // DropdownMenuContent, - DropdownMenuTrigger, + // DropdownMenuTrigger, } from '~/components/ui'; import { useLocalize, useCustomLink, useAuthContext } from '~/hooks'; import AdvancedSwitch from '~/components/Prompts/AdvancedSwitch';