Files

74 lines
2.4 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env node
/**
* Mitarbeiter-2FA (E-Mail-Code) anzeigen, einschalten, abschalten.
*
* Usage (im Container, mit dem Server-Key):
* docker exec -it -w /app webklar-kundenbereich-server node scripts/mitarbeiter-2fa.mjs --status
* ... --enable <userId>|alle [--yes]
* ... --disable <userId> (Notfall: bei einer Person kommt keine Mail an)
*/
import 'dotenv/config'
import { createInterface } from 'node:readline/promises'
import { disableStaffMfa, enableStaffMfa, listStaffMfaStatus } from '../server/services/staffMfaAdmin.js'
const args = process.argv.slice(2)
const flag = (name) => {
const i = args.indexOf(name)
return i === -1 ? null : args[i + 1] || ''
}
function printTable(rows) {
for (const r of rows) {
console.log(
`${r.userId.padEnd(22)} ${r.name.padEnd(20)} ${r.email.padEnd(32)} E-Mail bestätigt: ${r.emailVerification ? 'ja ' : 'nein'} 2FA: ${r.mfa ? 'an' : 'aus'}`
)
}
}
async function confirm(question) {
if (args.includes('--yes')) return true
const rl = createInterface({ input: process.stdin, output: process.stdout })
const answer = await rl.question(`${question} (Ja/Nein) `)
rl.close()
return /^j(a)?$/i.test(answer.trim())
}
async function main() {
const rows = await listStaffMfaStatus()
if (args.includes('--status')) {
printTable(rows)
return
}
const enable = flag('--enable')
if (enable !== null) {
const targets = enable === 'alle' ? rows.filter((r) => !r.mfa) : rows.filter((r) => r.userId === enable)
if (!targets.length) throw new Error(enable === 'alle' ? 'Alle Mitarbeiter haben 2FA schon an.' : `Kein Mitarbeiter mit userId ${enable}`)
console.log('Der Code geht an diese Adressen – sie müssen Post empfangen:')
printTable(targets)
if (!(await confirm('2FA für diese Konten einschalten?'))) return console.log('Abgebrochen.')
for (const r of targets) {
await enableStaffMfa(r.userId)
console.log(`2FA an: ${r.name} <${r.email}>`)
}
return
}
const disable = flag('--disable')
if (disable) {
const target = rows.find((r) => r.userId === disable)
if (!target) throw new Error(`Kein Mitarbeiter mit userId ${disable}`)
await disableStaffMfa(disable)
console.log(`2FA aus: ${target.name} <${target.email}>`)
return
}
console.log('Usage: --status | --enable <userId>|alle [--yes] | --disable <userId>')
}
main().catch((err) => {
console.error(err.message)
process.exit(1)
})