"""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.')