This commit is contained in:
commit
59bb5a38a3
132 files changed
+19435
No files matched your search
@@ -0,0 +1,54 @@
|
||||
/**
|
||||
* 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();
|
||||
}
|
||||
Reference in new issue
Block a user