"use client"; import { ShieldAlert, ShieldCheck, ShieldQuestion } from "lucide-react"; import { useState, useTransition } from "react"; import { Button } from "@/components/ui/Button"; import { uhrzeit } from "@/lib/format"; import { kettePruefenAktion, type KettenAntwort } from "@/server/actions/protokoll"; /** * Integritaet der Hash-Kette (#027). Geprueft wird nur auf Knopfdruck – die Pruefung liest * jede Zeile; ein Ergebnis der letzten 5 Minuten bringt die Seite schon mit. */ export function KettenPruefung({ anfang }: { anfang: KettenAntwort | null }) { const [ergebnis, setErgebnis] = useState(anfang); const [laeuft, starten] = useTransition(); const pruefen = () => starten(async () => { setErgebnis(await kettePruefenAktion()); }); return (
); } function Status({ ergebnis }: { ergebnis: KettenAntwort | null }) { if (!ergebnis) { return (

Hash-Kette noch nicht geprüft

); } if (ergebnis.fehler) { return

{ergebnis.fehler}

; } const wann = ergebnis.geprueftAm ? ` um ${uhrzeit(ergebnis.geprueftAm)} Uhr` : ""; if (!ergebnis.fehlerhafteId) { return (

Hash-Kette unversehrt {" "} · {ergebnis.eintraege?.toLocaleString("de-DE")} Einträge geprüft{wann}

); } const id = ergebnis.fehlerhafteId; // Die Seite beginnt beim fehlerhaften Eintrag, der Anker hebt ihn hervor. const ziel = `/protokoll?vor=${(BigInt(id) + 1n).toString()}#eintrag-${id}`; return (

Hash-Kette beschädigt. Der Eintrag{" "} #{id} {" "} stimmt nicht mit seinem Hash oder Vorgänger überein – ab hier ist das Protokoll nicht mehr belegbar. Vergleichen Sie mit der Syslog-Kopie und sichern Sie die Datenbank.{wann && ` Geprüft${wann}.`}

); }