Enhance set-admin-password script to handle decryption errors by prompting for recreation of users.json file. Implement backup creation before overwriting and update README with usage instructions for the new functionality.

This commit is contained in:
Torsten Schulz (local)
2025-12-18 12:45:53 +01:00
parent 4b017453b2
commit 10499e0249
2 changed files with 115 additions and 5 deletions

View File

@@ -18,6 +18,16 @@ node scripts/set-admin-password.js
Das Script fragt dann nach dem neuen Passwort. 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 ## Funktionen
- **Findet oder erstellt den Admin-User**: Falls der Admin-User nicht existiert, wird er automatisch erstellt - **Findet oder erstellt den Admin-User**: Falls der Admin-User nicht existiert, wird er automatisch erstellt

View File

@@ -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 // Hauptfunktion
async function main() { async function main() {
console.log('🔐 Admin-Passwort setzen\n') 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 // 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) { if (!newPassword) {
newPassword = await askPassword() newPassword = await askPassword()
@@ -140,7 +197,52 @@ async function main() {
try { try {
// Benutzer laden // Benutzer laden
console.log('📖 Lade Benutzerdaten...') 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 // Admin-User finden oder erstellen
let adminUser = users.find(u => u.email.toLowerCase() === ADMIN_EMAIL.toLowerCase()) let adminUser = users.find(u => u.email.toLowerCase() === ADMIN_EMAIL.toLowerCase())
@@ -185,9 +287,7 @@ async function main() {
} catch (error) { } catch (error) {
console.error('\n❌ FEHLER:', error.message) console.error('\n❌ FEHLER:', error.message)
if (error.message.includes('entschlüsseln')) { console.error(error.stack)
console.error('\n💡 Tipp: Stelle sicher, dass ENCRYPTION_KEY in der .env Datei korrekt gesetzt ist.')
}
process.exit(1) process.exit(1)
} }
} }