🔒 refactor: Apply interface settings to all Roles (#3967)

This commit is contained in:
Danny Avila 2024-09-09 20:15:08 -04:00 committed by GitHub
parent 748b41eda4
commit 0148b9b097
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
6 changed files with 20 additions and 15 deletions

View file

@ -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) => {

View file

@ -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' });
}

View file

@ -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 = () => {

View file

@ -35,7 +35,10 @@ const AuthContextProvider = ({
const [error, setError] = useState<string | undefined>(undefined);
const [isAuthenticated, setIsAuthenticated] = useState<boolean>(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 <AuthContext.Provider value={memoedValue}>{children}</AuthContext.Provider>;

View file

@ -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;

View file

@ -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';