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)} /> )}
); }