Files
Nick Szaunig 59bb5a38a3
Docker-Images bauen und veroeffentlichen / build-and-push (push) Failing after 1m32s
first commit
2026-09-27 06:06:56 +02:00

55 lines
2.1 KiB
TypeScript

/**
* Legt ein Konto fuer den Adminbereich an. Es gibt keine Selbstregistrierung
* und kein Standardpasswort.
*
* pnpm admin:create --email [email protected] --name "Vorname Nachname"
*
* Passwort: aus ADMIN_PASSWORD (mind. 12 Zeichen) oder zufaellig erzeugt und
* EINMAL ausgegeben. Nach der ersten Anmeldung erzwingt der Adminbereich die
* Einrichtung der Zwei-Faktor-Anmeldung.
*/
import { randomBytes } from "node:crypto";
import { parseArgs } from "node:util";
import { createProvisioningAuth } from "@/lib/auth";
import { getDb } from "@/lib/db";
try {
process.loadEnvFile();
} catch {
// Umgebung kommt aus dem Container.
}
const { values } = parseArgs({ options: { email: { type: "string" }, name: { type: "string" } } });
const email = values.email?.trim().toLowerCase();
const name = values.name?.trim();
if (!email || !/^\S+@\S+\.\S+$/.test(email) || !name) {
console.error('Aufruf: pnpm admin:create --email <adresse> --name "<Name>"');
process.exit(1);
}
const provided = process.env.ADMIN_PASSWORD;
if (provided !== undefined && provided.length < 12) {
console.error("ADMIN_PASSWORD muss mindestens 12 Zeichen haben.");
process.exit(1);
}
const password = provided ?? randomBytes(18).toString("base64url");
const db = getDb();
try {
if (await db.user.findUnique({ where: { email } })) {
console.error("Für diese E-Mail-Adresse existiert bereits ein Konto.");
process.exitCode = 1;
} else {
// Offizieller Weg ueber Better Auth: Passwortregeln und Leak-Pruefung
// greifen dabei automatisch.
const result = await createProvisioningAuth().api.signUpEmail({ body: { email, name, password } });
await db.user.update({ where: { id: result.user.id }, data: { emailVerified: true } });
await db.auditLog.create({ data: { actorType: "SYSTEM", action: "admin.created", entityType: "User", entityId: result.user.id } });
console.log(`Konto angelegt: ${email}`);
if (!provided) console.log(`Einmaliges Passwort (jetzt sicher ablegen, wird nicht erneut angezeigt): ${password}`);
console.log("Bei der ersten Anmeldung wird die Zwei-Faktor-Anmeldung eingerichtet.");
}
} finally {
await db.$disconnect();
}