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:
@@ -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
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user