import {
Checkbox,
FormControlLabel,
Paper,
Table,
TableBody,
TableCell,
TableHead,
TableRow,
Tooltip,
Typography,
} from "@mui/material";
import React from "react";
import { NWFilter } from "../../api/NWFilterApi";
import { NetworkInfo } from "../../api/NetworksApi";
import { ServerApi } from "../../api/ServerApi";
import { APIToken, TokenRight } from "../../api/TokensApi";
import { VMInfo } from "../../api/VMApi";
export function TokenRightsEditor(p: {
token: APIToken;
editable: boolean;
onChange?: () => void;
vms: VMInfo[];
networks: NetworkInfo[];
nwFilters: NWFilter[];
tokens: APIToken[];
}): React.ReactElement {
return (
<>
{/* Virtual machines */}
VM name
Get definition
Update
Delete
Get XML definition
Get autostart
Set autostart
{/* All VM operations */}
All
{/* Per VM operations */}
{p.vms.map((v, n) => (
{v.name}
))}
VM name
Get state
Start
Shutdown
Kill
Reset
Suspend
Resume
Screenshot
VNC token
{/* All VM operations */}
All
{/* Per VM operations */}
{p.vms.map((v, n) => (
{v.name}
))}
{/* Networks */}
{/* Networks management */}
Network name
Get definition
Update
Delete
Get XML definition
Get autostart
Set autostart
Get status
Start
Stop
{/* All networks operations */}
All
{/* Per network operations */}
{p.networks.map((v, n) => (
{v.name}
))}
{/* Network filters */}
{/* Networks filters management */}
Network filter name
Get definition
Update
Delete
Get XML definition
{/* All networks filters operations */}
All
{/* Per network filter operations */}
{p.nwFilters.map((v, n) => (
{v.name}
{ServerApi.Config.builtin_nwfilter_rules.includes(v.name!) ? (
) : (
)}
{ServerApi.Config.builtin_nwfilter_rules.includes(v.name!) ? (
) : (
)}
))}
{/* API tokens */}
{/* API tokens management */}
API token name
Get
Update
Delete
{/* All API tokens operations */}
All
{/* Per API token operations */}
{p.tokens.map((v, n) => (
{v.name}
))}
{/* ISO files */}
{/* Server general information */}
>
);
}
function RightsSection(
p: React.PropsWithChildren<{ label: string }>
): React.ReactElement {
return (
{p.label}
{p.children}
);
}
interface RightOpts {
right: TokenRight;
label?: string;
editable: boolean;
token: APIToken;
onChange?: () => void;
parent?: TokenRight;
}
function CellRight(p: RightOpts): React.ReactElement {
return (
);
}
function RouteRight(p: RightOpts): React.ReactElement {
const rightIndex = p.token.rights.findIndex(
(r) => r.verb === p.right.verb && r.path === p.right.path
);
const activated = rightIndex !== -1;
const parentActivated =
!!p.parent &&
p.token.rights.findIndex(
(r) => r.verb === p.parent?.verb && r.path === p.parent?.path
) !== -1;
const toggle = (a: boolean) => {
if (a) {
p.token.rights.push(p.right);
} else {
p.token.rights.splice(rightIndex, 1);
}
p.onChange?.();
};
return (
{p.label ? (
toggle(a)}
/>
}
label={p.label}
/>
) : (
toggle(a)}
/>
)}
);
}