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

@@ -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)
}
}