fix(frontend): restrict management controls to admins
This commit is contained in:
@@ -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();
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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,24 +738,28 @@ export function AppShell({ canLogout }: AppShellProps) {
|
|||||||
>
|
>
|
||||||
New session
|
New session
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
{isAdmin && (
|
||||||
variant="outline"
|
<>
|
||||||
size="sm"
|
<Button
|
||||||
className="w-full"
|
variant="outline"
|
||||||
onClick={() => setWorkspaceManagerOpen(true)}
|
size="sm"
|
||||||
>
|
className="w-full"
|
||||||
Workspace management
|
onClick={() => setWorkspaceManagerOpen(true)}
|
||||||
</Button>
|
>
|
||||||
<Button
|
Workspace management
|
||||||
variant="outline"
|
</Button>
|
||||||
size="sm"
|
<Button
|
||||||
className="w-full"
|
variant="outline"
|
||||||
aria-current={activeSurface === "database-management" ? "page" : undefined}
|
size="sm"
|
||||||
onClick={() => setActiveSurface("database-management")}
|
className="w-full"
|
||||||
>
|
aria-current={activeSurface === "database-management" ? "page" : undefined}
|
||||||
Database management
|
onClick={() => setActiveSurface("database-management")}
|
||||||
</Button>
|
>
|
||||||
{canManagePi && (
|
Database management
|
||||||
|
</Button>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
{isAdmin && canManagePi && (
|
||||||
<Button
|
<Button
|
||||||
variant="outline"
|
variant="outline"
|
||||||
size="sm"
|
size="sm"
|
||||||
|
|||||||
Reference in New Issue
Block a user