import { Download, Lock, LockOpen, Pencil, RefreshCw } from "lucide-react"; import type { Metadata } from "next"; import Link from "next/link"; import { notFound } from "next/navigation"; import type { ReactNode } from "react"; import { AblaufBadge, KategorieBadge, StatusBadge, TypBadge } from "@/components/schluessel/Anzeige"; import { Badge } from "@/components/ui/Badge"; import { Breadcrumb } from "@/components/ui/Breadcrumb"; import { Button } from "@/components/ui/Button"; import { InnereBox, Karte } from "@/components/ui/Karte"; import { MonoBlock } from "@/components/ui/MonoBlock"; import { MonoKopieren } from "@/components/ui/MonoKopieren"; import { Seitenkopf } from "@/components/ui/Seitenkopf"; import { Statuspunkt, type HostStatus } from "@/components/ui/Statuspunkt"; import { datum, datumZeit } from "@/lib/format"; import { darf } from "@/server/auth/rechte"; import { sitzungErforderlich } from "@/server/auth/sitzungspflicht"; import { rotationsKette, schluesselDetail, type SchluesselDetail } from "@/server/queries/schluessel"; import { AusrollenPanel } from "@/components/ausrollen/AusrollenPanel"; import { EintragAktionen } from "@/components/ausrollen/EintragAktionen"; import { zielAuswahl } from "@/server/queries/ziele"; import { widerrufUebersicht } from "@/server/queries/widerruf"; import { WiderrufAblauf } from "@/components/widerruf/WiderrufAblauf"; import { WiderrufKnopf } from "@/components/widerruf/WiderrufKnopf"; import { ablaufZustand } from "@/lib/schluessel"; import { RotationAbbrechen } from "@/components/rotation/RotationAbbrechen"; import { rotationAbgebrochen, rotationGesperrt } from "@/server/services/rotation"; import { PrivateAusrollenAktion } from "./PrivateAusrollenAktion"; import { PrivateKeyAnzeigen, PrivateKeyLoeschen } from "./PrivateKeyAktionen"; import { PublicAusrollenAktion } from "./PublicAusrollenAktion"; export const metadata: Metadata = { title: "Schlüssel" }; function InfoFeld({ titel, children }: { titel: string; children: ReactNode }) { return (
{leer}
) : ({e.href ? ( {e.ziel} ) : ( e.ziel )}
{e.pfad}
{e.zusatz &&{e.zusatz}
}Dieser Schlüssel sollte „{rotationDesVorgaengers.name}“ ablösen; die Rotation wurde abgebrochen. {imWiderruf ? " Er wird gerade entfernt; " : " Er ist von allen Hosts entfernt; "} {rotationDesVorgaengers.name} {" "} bleibt aktiv.
Dieser Schlüssel löst „{rotationDesVorgaengers.name}“ ab. Die Rotation ist erst fertig, wenn der neue Schlüssel ausgerollt und getestet und der alte entfernt ist.{" "} Rotation fortsetzen
{darfAbbrechen && ({s.ablaufAm ? ( <> Das Ablaufdatum () ist überschritten.{" "} > ) : null} Nach Projektende bzw. Ablaufdatum: Widerruf mit einem Klick. sshkv entfernt abgelaufene Schlüssel nie von selbst – erst nach Ihrer Bestätigung und dem Dry-Run.
Von allen Hosts entfernt; der Schlüssel lässt sich nicht mehr zuweisen. {/* Ein widerrufener Nachfolger (abgebrochene Rotation, #032) ersetzt nichts. */} {s.nachfolger && s.status === "ROTIERT" && ( <> {" "} Ersetzt durch{" "} {s.nachfolger.name} . > )}
Die Rotation zu „{s.nachfolger.name}“ wurde abgebrochen {s.nachfolger.status === "WIDERRUFEN" ? "" : " – der neue Schlüssel wird gerade entfernt"}; dieser Schlüssel bleibt aktiv. Ein zweiter Nachfolger ist nicht vorgesehen: für eine neue Rotation einen neuen Schlüssel anlegen, genauso zuweisen und diesen danach widerrufen.
)} {rotationsSperre?.neuerPublicKeyNoetig && !imWiderruf && (1 ? "mt-3" : ""}`}> {rotationsSperre.grund}
)}Sinnvoll, sobald der Private Key ausgerollt ist und sshkv ihn nicht mehr braucht. Danach kann ihn niemand mehr aus SSHKeyVault holen – auch kein Admin.