This commit is contained in:
@@ -1,7 +1,14 @@
|
||||
import type { UserRole } from '../../auth.js';
|
||||
|
||||
export type RoutePermission =
|
||||
'public' | 'machine' | 'authenticated' | 'viewer' | 'operator' | 'admin';
|
||||
| 'public'
|
||||
| 'machine'
|
||||
| 'authenticated'
|
||||
| 'viewer'
|
||||
| 'operator-read'
|
||||
| 'admin-read'
|
||||
| 'operator'
|
||||
| 'admin';
|
||||
|
||||
const within = (route: string, base: string): boolean =>
|
||||
route === base || route.startsWith(base + '/');
|
||||
@@ -41,16 +48,19 @@ export function routePermission(routeId: string | null, method: string): RoutePe
|
||||
)
|
||||
return 'authenticated';
|
||||
|
||||
// This POST only calculates a preview; it never saves settings or runs cleanup.
|
||||
if (routeId === '/api/settings/retention/preview' && method === 'POST') return 'admin-read';
|
||||
if (within(routeId, '/api/auth')) return 'admin';
|
||||
|
||||
if (
|
||||
within(routeId, '/api/users') ||
|
||||
within(routeId, '/settings') ||
|
||||
within(routeId, '/api/settings') ||
|
||||
within(routeId, '/api/auth') ||
|
||||
within(routeId, '/api/server-keys') ||
|
||||
within(routeId, '/server-keys') ||
|
||||
within(routeId, '/keys')
|
||||
)
|
||||
return 'admin';
|
||||
return reading ? 'admin-read' : 'admin';
|
||||
|
||||
if (!reading && ['/api/hosts', '/api/game-files'].some((base) => within(routeId, base)))
|
||||
return 'admin';
|
||||
@@ -76,17 +86,20 @@ export function routePermission(routeId: string | null, method: string): RoutePe
|
||||
routeId === '/api/servers/[name]/telemetry-requests' ||
|
||||
routeId === '/api/servers/[name]/rcon-diagnostics'
|
||||
)
|
||||
return 'operator';
|
||||
return reading ? 'operator-read' : 'operator';
|
||||
|
||||
return reading ? 'viewer' : 'operator';
|
||||
}
|
||||
|
||||
/** A browser role never substitutes for a machine credential. */
|
||||
export function roleAllows(role: UserRole, permission: RoutePermission): boolean {
|
||||
if (!['viewer', 'operator', 'admin'].includes(role)) return false;
|
||||
if (!['viewer', 'super_viewer', 'operator', 'admin'].includes(role)) return false;
|
||||
if (permission === 'machine') return false;
|
||||
if (permission === 'public' || permission === 'authenticated' || permission === 'viewer')
|
||||
return true;
|
||||
if (permission === 'operator') return role === 'operator' || role === 'admin';
|
||||
if (permission === 'operator-read')
|
||||
return role === 'super_viewer' || role === 'operator' || role === 'admin';
|
||||
if (permission === 'admin-read') return role === 'super_viewer' || role === 'admin';
|
||||
return permission === 'admin' && role === 'admin';
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user