Files
overlord/Overlord-Server/src/rbac.ts
T

106 lines
2.8 KiB
TypeScript
Raw Normal View History

2026-03-05 00:04:26 -06:00
import { type AuthenticatedUser } from "./auth";
import { hasPermission, type UserRole } from "./users";
export type Permission =
| "users:manage"
| "clients:control"
| "clients:view"
| "audit:view";
export function checkPermission(
user: AuthenticatedUser | null,
permission: Permission,
): boolean {
if (!user) return false;
return hasPermission(user.role, permission);
}
export function checkAnyPermission(
user: AuthenticatedUser | null,
permissions: Permission[],
): boolean {
if (!user) return false;
return permissions.some((p) => hasPermission(user.role, p));
}
export function checkAllPermissions(
user: AuthenticatedUser | null,
permissions: Permission[],
): boolean {
if (!user) return false;
return permissions.every((p) => hasPermission(user.role, p));
}
export function requireAuth(user: AuthenticatedUser | null): AuthenticatedUser {
if (!user) {
throw new Response("Unauthorized", { status: 401 });
}
return user;
}
export function requirePermission(
user: AuthenticatedUser | null,
permission: Permission,
): AuthenticatedUser {
const authedUser = requireAuth(user);
if (!checkPermission(authedUser, permission)) {
throw new Response("Forbidden: Insufficient permissions", { status: 403 });
}
return authedUser;
}
export function requireAnyPermission(
user: AuthenticatedUser | null,
permissions: Permission[],
): AuthenticatedUser {
const authedUser = requireAuth(user);
if (!checkAnyPermission(authedUser, permissions)) {
throw new Response("Forbidden: Insufficient permissions", { status: 403 });
}
return authedUser;
}
export function getPermissionDescription(permission: Permission): string {
switch (permission) {
case "users:manage":
return "Manage users and roles";
case "clients:control":
return "Control clients (execute commands, desktop, console, files)";
case "clients:view":
return "View connected clients";
case "audit:view":
return "View audit logs";
default:
return "Unknown permission";
}
}
export function getRoleDescription(role: UserRole): string {
switch (role) {
case "admin":
return "Full access - can manage users and control all clients";
case "operator":
return "Can control clients but cannot manage users";
case "viewer":
return "Read-only access to view clients";
default:
return "Unknown role";
}
}
export function getRolePermissions(role: UserRole): Permission[] {
const permissions: Permission[] = [];
if (hasPermission(role, "users:manage")) permissions.push("users:manage");
if (hasPermission(role, "clients:control"))
permissions.push("clients:control");
if (hasPermission(role, "clients:view")) permissions.push("clients:view");
if (hasPermission(role, "audit:view")) permissions.push("audit:view");
return permissions;
}