import type { Metadata } from "next"; import { redirect } from "next/navigation"; import { LoginForm, SetupForm } from "@/components/auth-forms"; import { Icon } from "@/components/icons"; import { Notice } from "@/components/ui"; import { getActor, isAuthEnabled, isSetupOpen } from "@/lib/auth/actor"; import { getOidcConfig, isOidcEnabled } from "@/lib/auth/oidc"; import { MIN_PASSWORD_LENGTH } from "@/lib/auth/password"; export const metadata: Metadata = { title: "Anmelden" }; export const dynamic = "force-dynamic"; type PageProps = { searchParams: Promise<{ fehler?: string }> }; export default async function SignInPage({ searchParams }: PageProps) { // Ohne Anmeldung gibt es hier nichts zu tun. if (!isAuthEnabled()) redirect("/"); const actor = await getActor(); if (actor.kind === "user") redirect("/"); const setup = await isSetupOpen(); const { fehler } = await searchParams; // Eine unvollständige OIDC-Konfiguration soll die Anmeldeseite nicht // unbenutzbar machen — dann bleibt wenigstens das Passwortfeld. let oidc: { label: string; nurOidc: boolean } | null = null; let oidcFehler: string | null = null; if (isOidcEnabled()) { try { const config = getOidcConfig(); oidc = { label: config.buttonLabel, nurOidc: !config.allowLocalLogin }; } catch (error) { oidcFehler = error instanceof Error ? error.message : "Die Anmeldung über den externen Anbieter ist nicht eingerichtet."; } } // Bei reiner Anbieter-Anmeldung gibt es keine Ersteinrichtung mit Passwort: // Der erste, der sich über den Anbieter anmeldet, wird Administrator. const zeigeFormular = !oidc?.nurOidc; return (
{setup && zeigeFormular ? "Es gibt noch keinen Benutzer. Lege jetzt den ersten Administrator an — danach ist diese Seite geschlossen." : "Bitte melde dich an, um QR-Codes zu erstellen und zu verwalten."}
Wer sich zuerst anmeldet, wird Administrator dieser Installation.
) : null ) : (Passwort vergessen? Ein Administrator kann es unter Verwaltung → Benutzer zurücksetzen.
)}