fix(network): защитить ключи WireGuard и режим просмотра операций
This commit is contained in:
1 parent
c8f9c83f45
commit
a404da768d
23 files changed
+1648
-36
No files matched your search
@@ -48,6 +48,7 @@ export interface WgIfaceWithServer extends WireGuardInterface {
|
||||
interface WireguardDataGridProps {
|
||||
interfaces: WgIfaceWithServer[]
|
||||
compactServer?: boolean
|
||||
canWrite?: boolean
|
||||
emptyAction?: ReactNode
|
||||
onExport: (iface: WgIfaceWithServer) => void
|
||||
onAddPeer?: (iface: WgIfaceWithServer) => void
|
||||
@@ -58,14 +59,14 @@ interface WireguardDataGridProps {
|
||||
onExportPeer?: (iface: WgIfaceWithServer, peerId: string) => void
|
||||
}
|
||||
|
||||
type WireguardActions = Pick<WireguardDataGridProps, "onExport" | "onAddPeer" | "onToggle" | "toggleBusy" | "onDelete">
|
||||
type WireguardActions = Pick<WireguardDataGridProps, "onExport" | "onAddPeer" | "onToggle" | "toggleBusy" | "onDelete" | "canWrite">
|
||||
const WireguardActionsContext = createContext<WireguardActions | null>(null)
|
||||
|
||||
// Preserve menu state while callbacks and the current row data update.
|
||||
function WireguardActionsCell({ row }: { row: { original: WgIfaceWithServer } }) {
|
||||
const actions = useContext(WireguardActionsContext)
|
||||
if (!actions) throw new Error("WireGuard actions context is missing")
|
||||
const { onExport, onAddPeer, onToggle, toggleBusy, onDelete } = actions
|
||||
const { onExport, onAddPeer, onToggle, toggleBusy, onDelete, canWrite = true } = actions
|
||||
const iface = row.original
|
||||
return (
|
||||
<div
|
||||
@@ -94,12 +95,12 @@ function WireguardActionsCell({ row }: { row: { original: WgIfaceWithServer } })
|
||||
}
|
||||
/>
|
||||
<DropdownMenuContent side="bottom" align="end">
|
||||
<DropdownMenuItem onClick={() => onExport(iface)}>
|
||||
<DropdownMenuItem disabled={!canWrite} onClick={() => onExport(iface)}>
|
||||
<CodeXmlIcon className="size-4" />
|
||||
Экспорт
|
||||
</DropdownMenuItem>
|
||||
{onAddPeer && (
|
||||
<DropdownMenuItem onClick={() => onAddPeer(iface)}>
|
||||
<DropdownMenuItem disabled={!canWrite} onClick={() => onAddPeer(iface)}>
|
||||
<PlusIcon className="size-4" />
|
||||
Добавить пира
|
||||
</DropdownMenuItem>
|
||||
@@ -107,7 +108,7 @@ function WireguardActionsCell({ row }: { row: { original: WgIfaceWithServer } })
|
||||
{onToggle && (
|
||||
<>
|
||||
<DropdownMenuSeparator />
|
||||
<DropdownMenuItem disabled={toggleBusy} onClick={() => onToggle(iface)}>
|
||||
<DropdownMenuItem disabled={!canWrite || toggleBusy} onClick={() => onToggle(iface)}>
|
||||
<PowerIcon className="size-4" />
|
||||
{iface.enabled ? "Отключить" : "Включить"}
|
||||
</DropdownMenuItem>
|
||||
@@ -116,7 +117,7 @@ function WireguardActionsCell({ row }: { row: { original: WgIfaceWithServer } })
|
||||
{onDelete && (
|
||||
<>
|
||||
<DropdownMenuSeparator />
|
||||
<DropdownMenuItem variant="destructive" onClick={() => onDelete(iface)}>
|
||||
<DropdownMenuItem disabled={!canWrite} variant="destructive" onClick={() => onDelete(iface)}>
|
||||
<Trash2Icon className="size-4" />
|
||||
Удалить
|
||||
</DropdownMenuItem>
|
||||
@@ -131,6 +132,7 @@ function WireguardActionsCell({ row }: { row: { original: WgIfaceWithServer } })
|
||||
function WireguardDataGrid({
|
||||
interfaces,
|
||||
compactServer = false,
|
||||
canWrite = true,
|
||||
emptyAction,
|
||||
onExport,
|
||||
onAddPeer,
|
||||
@@ -311,7 +313,7 @@ function WireguardDataGrid({
|
||||
}
|
||||
|
||||
return (
|
||||
<WireguardActionsContext.Provider value={{ onExport, onAddPeer, onToggle, toggleBusy, onDelete }}>
|
||||
<WireguardActionsContext.Provider value={{ onExport, onAddPeer, onToggle, toggleBusy, onDelete, canWrite }}>
|
||||
<DataGridShell
|
||||
table={table}
|
||||
recordCount={interfaces.length}
|
||||
|
||||
Reference in new issue
Block a user