security: Zufallspasswörter beim Erststart, kryptographisch sichere JTI-Generierung

- seedDefaultUsers: generiert kryptographisch zufällige Passwörter (crypto/rand)
  statt hartkodiertes "archivmailrockz" — Passwörter werden einmalig im Terminal
  angezeigt und können danach nicht wiederhergestellt werden
- generateJTI: verwendet crypto/rand (16 Byte, hex) statt time.UnixNano XOR deadbeef

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
sysops
2026-03-17 01:19:24 +01:00
parent 7e165c8eed
commit bb963a796f
25 changed files with 471 additions and 111 deletions
+36
View File
@@ -0,0 +1,36 @@
"use client";
import { Skeleton } from "@/components/ui/skeleton";
/**
* Full-page loading skeleton that matches the Navbar + content layout.
* Prevents layout shift (flicker) while useAuth checks the session.
*/
export function PageSkeleton() {
return (
<div className="min-h-screen">
{/* Fake Navbar */}
<div className="border-b bg-background">
<div className="mx-auto flex h-14 max-w-7xl items-center justify-between px-4">
<div className="flex items-center gap-6">
<Skeleton className="h-5 w-24" />
<Skeleton className="h-4 w-12" />
<Skeleton className="h-4 w-20" />
</div>
<div className="flex items-center gap-3">
<Skeleton className="h-4 w-16" />
<Skeleton className="h-6 w-12 rounded-full" />
<Skeleton className="h-8 w-20 rounded-md" />
</div>
</div>
</div>
{/* Content */}
<main className="mx-auto max-w-7xl px-4 py-6 space-y-4">
<Skeleton className="h-8 w-48" />
<Skeleton className="h-4 w-full" />
<Skeleton className="h-4 w-3/4" />
<Skeleton className="h-32 w-full" />
</main>
</div>
);
}