fix(frontend): restrict management controls to admins

This commit is contained in:
Codex
2026-08-26 20:40:15 +02:00
parent 9189450fa9
commit 705af3aeb2
2 changed files with 31 additions and 24 deletions
@@ -22,9 +22,9 @@ beforeEach(() => {
setAuthState({ setAuthState({
issuer: "test", issuer: "test",
subject: "test", subject: "test",
roles: ["user"], roles: ["admin"],
permissions: ["session.use", "workspace.manage"], permissions: ["session.use", "workspace.manage", "workspace.secrets.manage", "pi.manage"],
isAdmin: false, isAdmin: true,
csrfToken: null, csrfToken: null,
session: null, session: null,
}); });
@@ -37,7 +37,7 @@ beforeEach(() => {
issuer: "test", issuer: "test",
subject: "test", subject: "test",
displayName: "Test", displayName: "Test",
isAdmin: false, isAdmin: true,
})), })),
http.get("/api/sessions", () => HttpResponse.json([])), http.get("/api/sessions", () => HttpResponse.json([])),
http.get("/api/settings", () => HttpResponse.json({ http.get("/api/settings", () => HttpResponse.json({
@@ -122,7 +122,7 @@ test("keeps a live core session connected and returns when that session is opene
expect(FakeEventSource.instances).toHaveLength(1); expect(FakeEventSource.instances).toHaveLength(1);
}); });
test("shows database management entry to authenticated users without workspace management permission", () => { test("hides all management entries from non-admin users", () => {
clearAuthState(); clearAuthState();
setAuthState({ setAuthState({
issuer: "test", issuer: "test",
@@ -136,5 +136,7 @@ test("shows database management entry to authenticated users without workspace m
renderShell(); renderShell();
expect(screen.getByRole("button", { name: "Database management" })).toBeInTheDocument(); expect(screen.queryByRole("button", { name: "Workspace management" })).not.toBeInTheDocument();
expect(screen.queryByRole("button", { name: "Database management" })).not.toBeInTheDocument();
expect(screen.queryByRole("button", { name: "Pi management" })).not.toBeInTheDocument();
}); });
+6 -1
View File
@@ -105,6 +105,7 @@ export function AppShell({ canLogout }: AppShellProps) {
const canManageWorkspace = permissions.includes("workspace.manage"); const canManageWorkspace = permissions.includes("workspace.manage");
const canManageWorkspaceSecrets = permissions.includes("workspace.secrets.manage"); const canManageWorkspaceSecrets = permissions.includes("workspace.secrets.manage");
const canManagePi = permissions.includes("pi.manage"); const canManagePi = permissions.includes("pi.manage");
const isAdmin = authenticatedUser?.isAdmin === true;
const authGeneration = useAuthGeneration(); const authGeneration = useAuthGeneration();
const { data: sessions = [] } = useQuery<SessionSummary[]>({ const { data: sessions = [] } = useQuery<SessionSummary[]>({
queryKey: ["sessions", sessionScope], queryKey: ["sessions", sessionScope],
@@ -737,6 +738,8 @@ export function AppShell({ canLogout }: AppShellProps) {
> >
New session New session
</Button> </Button>
{isAdmin && (
<>
<Button <Button
variant="outline" variant="outline"
size="sm" size="sm"
@@ -754,7 +757,9 @@ export function AppShell({ canLogout }: AppShellProps) {
> >
Database management Database management
</Button> </Button>
{canManagePi && ( </>
)}
{isAdmin && canManagePi && (
<Button <Button
variant="outline" variant="outline"
size="sm" size="sm"