36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
"""Executed interactively inside a one-shot container. Never prints credentials."""
|
|
import getpass
|
|
import os
|
|
from pathlib import Path
|
|
import secrets
|
|
import sys
|
|
|
|
from auth import CredentialStore
|
|
|
|
store = CredentialStore('/var/lib/deck/auth.json')
|
|
if store.read() is not None:
|
|
raise SystemExit('Zugangsdaten existieren bereits; keine Überschreibung.')
|
|
if not sys.stdin.isatty():
|
|
raise SystemExit('Interaktives Terminal benötigt. Keine Kennwörter als Argumente übergeben.')
|
|
password = getpass.getpass('Neues Oberflächenkennwort (mindestens 16 Zeichen): ')
|
|
repeat = getpass.getpass('Kennwort wiederholen: ')
|
|
if password != repeat:
|
|
raise SystemExit('Kennwörter stimmen nicht überein.')
|
|
token = getpass.getpass('API-Token (mindestens 32 Zeichen; leer = sicher erzeugen): ')
|
|
generated = not token
|
|
if generated:
|
|
token = 'ad_' + secrets.token_hex(32)
|
|
if generated and Path('/bootstrap/api-token.txt').exists():
|
|
raise SystemExit('Bootstrap-Datei existiert bereits; keine Überschreibung.')
|
|
try:
|
|
record = store.setup(password, token)
|
|
except ValueError as exc:
|
|
raise SystemExit(str(exc)) from None
|
|
if generated:
|
|
path = Path('/bootstrap/api-token.txt')
|
|
fd = os.open(path, os.O_WRONLY | os.O_CREAT | os.O_EXCL, 0o600)
|
|
with os.fdopen(fd,'w') as stream:
|
|
stream.write(token+'\n')
|
|
print('API-Token wurde geschützt in der Bootstrap-Datei abgelegt (nicht ausgegeben).')
|
|
print('Zugang eingerichtet. Kennwort und API-Token sind in der Anwendung nur als Prüfwerte gespeichert.')
|