fix(network): защитить ключи WireGuard и режим просмотра операций

This commit is contained in:
Denozordec committed 2026-10-13 20:12:33 +07:00
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}