74 lines
2.4 KiB
JavaScript
74 lines
2.4 KiB
JavaScript
#!/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)
|
||
})
|