Files
florian.wildeandClaude Opus 5.5 48e2a5cb8f feat(server): Proxmox-Server verwalten mit Fingerprint-Pinning
Server lassen sich anlegen, prüfen, bearbeiten und löschen. Proxmox
liefert ab Werk ein selbst signiertes Zertifikat; der Admin sieht es
vor dem Speichern und bestätigt den SHA-256-Fingerprint.

Der Pin wird in einem eigenen undici-Connector geprüft, sodass eine
fremde Gegenstelle das Token nie zu sehen bekommt. Weder Prüfung noch
Pin ist im Schema, im Client und per CHECK ausgeschlossen.

Fehler von Proxmox werden zu Ursache und Hinweis; bei 403 nennt der
Hinweis das fehlende Recht samt Pfad. Getestet gegen einen HTTPS-Mock
und im gebauten Stand auf Desktop und 390 px.

Closes #002

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 09:35:10 +02:00

27 lines
1.1 KiB
TypeScript

import type { Rolle } from "@/generated/prisma/enums";
import { SITZUNG_COOKIE, sitzungErzeugen } from "@/lib/sitzung";
import { testPrisma } from "./db";
/** Legt einen Benutzer an und liefert ein passendes Sitzungscookie. */
export async function angemeldet(rolle: Rolle, benutzername = rolle.toLowerCase()) {
const benutzer = await testPrisma.benutzer.create({
data: { benutzername, anzeigename: benutzername, rolle },
});
const cookie = `${SITZUNG_COOKIE}=${await sitzungErzeugen({ benutzerId: benutzer.id, herkunft: "passwort" })}`;
return { benutzer, cookie };
}
/** Baut eine Anfrage an die API mit Cookie und optional JSON-Rumpf. */
export function anfrage(methode: string, pfad: string, cookie: string | null, rumpf?: unknown): Request {
return new Request(`http://localhost${pfad}`, {
method: methode,
headers: {
...(cookie ? { cookie } : {}),
...(rumpf !== undefined ? { "content-type": "application/json" } : {}),
},
body: rumpf !== undefined ? JSON.stringify(rumpf) : undefined,
});
}
export const kontext = <T extends Record<string, string>>(params: T) => ({ params: Promise.resolve(params) });