diff --git a/scripts/README-set-admin-password.md b/scripts/README-set-admin-password.md index 192d5df..38a164e 100644 --- a/scripts/README-set-admin-password.md +++ b/scripts/README-set-admin-password.md @@ -18,6 +18,16 @@ node scripts/set-admin-password.js Das Script fragt dann nach dem neuen Passwort. +### Datei neu erstellen (bei Entschlüsselungsfehler) + +Falls die `users.json` Datei nicht entschlüsselt werden kann (z.B. weil der `ENCRYPTION_KEY` nicht übereinstimmt), wird das Script automatisch fragen, ob die Datei neu erstellt werden soll. Sie können auch direkt das `--recreate` Flag verwenden: + +```bash +node scripts/set-admin-password.js "mein-neues-passwort" --recreate +``` + +**Wichtig**: Die alte Datei wird automatisch als Backup gespeichert, bevor eine neue erstellt wird. + ## Funktionen - **Findet oder erstellt den Admin-User**: Falls der Admin-User nicht existiert, wird er automatisch erstellt diff --git a/scripts/set-admin-password.js b/scripts/set-admin-password.js index 64746a2..103e58d 100755 --- a/scripts/set-admin-password.js +++ b/scripts/set-admin-password.js @@ -116,12 +116,69 @@ function askPassword() { }) } +// Fragt nach Bestätigung +function askConfirmation(question) { + return new Promise((resolve) => { + const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout + }) + + rl.question(`${question} (j/n): `, (answer) => { + rl.close() + resolve(answer.toLowerCase() === 'j' || answer.toLowerCase() === 'y' || answer.toLowerCase() === 'ja' || answer.toLowerCase() === 'yes') + }) + }) +} + +// Erstellt ein Backup der users.json +async function createBackup() { + try { + await fs.access(USERS_FILE) + const backupDir = path.join(__dirname, '..', 'backups', `users-${Date.now()}`) + await fs.mkdir(backupDir, { recursive: true }) + const backupPath = path.join(backupDir, 'users.json') + await fs.copyFile(USERS_FILE, backupPath) + console.log(`📦 Backup erstellt: ${backupPath}`) + return backupPath + } catch (error) { + if (error.code === 'ENOENT') { + console.log('ℹ️ users.json existiert nicht, kein Backup nötig') + return null + } + throw error + } +} + +// Erstellt eine neue users.json mit Admin-User +async function createNewUsersFile(password) { + const hashedPassword = await hashPassword(password) + + const adminUser = { + id: Date.now().toString(), + email: ADMIN_EMAIL, + password: hashedPassword, + name: 'Administrator', + role: 'admin', + active: true, + created: new Date().toISOString(), + lastLogin: null + } + + return [adminUser] +} + // Hauptfunktion async function main() { console.log('🔐 Admin-Passwort setzen\n') + // Prüfe ob --recreate Flag gesetzt ist + const recreateFlag = process.argv.includes('--recreate') || process.argv.includes('-r') + // Passwort aus Kommandozeilenargumenten oder interaktiv abfragen - let newPassword = process.argv[2] + // Filtere Flags heraus und nimm das erste verbleibende Argument als Passwort + const args = process.argv.slice(2).filter(arg => !arg.startsWith('--') && !arg.startsWith('-')) + let newPassword = args.length > 0 ? args[0] : null if (!newPassword) { newPassword = await askPassword() @@ -140,7 +197,52 @@ async function main() { try { // Benutzer laden console.log('📖 Lade Benutzerdaten...') - const users = await readUsers() + let users + let shouldRecreate = recreateFlag + + try { + users = await readUsers() + } catch (error) { + if (error.message.includes('entschlüsseln') || error.message.includes('Entschlüsselung')) { + console.error('\n⚠️ WARNUNG: Konnte Benutzerdaten nicht entschlüsseln!') + console.error(' Dies bedeutet, dass der ENCRYPTION_KEY nicht mit dem verwendeten Schlüssel übereinstimmt.\n') + + if (!shouldRecreate) { + const confirmed = await askConfirmation('Möchten Sie die users.json Datei neu erstellen? (Alte Datei wird als Backup gespeichert)') + if (!confirmed) { + console.log('\n❌ Abgebrochen. Bitte setzen Sie ENCRYPTION_KEY in der .env Datei auf den korrekten Wert.') + process.exit(1) + } + shouldRecreate = true + } + + // Backup erstellen + await createBackup() + + // Neue Datei erstellen + console.log('\n🆕 Erstelle neue users.json Datei...') + users = await createNewUsersFile(newPassword) + + // Direkt speichern + console.log('💾 Speichere neue Benutzerdaten...') + const success = await writeUsers(users) + + if (success) { + console.log('\n✅ Neue users.json Datei erfolgreich erstellt!') + console.log(`📧 E-Mail: ${ADMIN_EMAIL}`) + console.log(`👤 Rolle: admin`) + console.log(`✅ Status: Aktiv`) + console.log(`🔐 Passwort: Gesetzt`) + } else { + console.error('\n❌ FEHLER: Konnte Benutzerdaten nicht speichern!') + process.exit(1) + } + + return + } else { + throw error + } + } // Admin-User finden oder erstellen let adminUser = users.find(u => u.email.toLowerCase() === ADMIN_EMAIL.toLowerCase()) @@ -185,9 +287,7 @@ async function main() { } catch (error) { console.error('\n❌ FEHLER:', error.message) - if (error.message.includes('entschlüsseln')) { - console.error('\n💡 Tipp: Stelle sicher, dass ENCRYPTION_KEY in der .env Datei korrekt gesetzt ist.') - } + console.error(error.stack) process.exit(1) } }