Personalisierung Schritt 2: Aktivierungscode, Einreichen, Bestätigen, E-Mail-Domänen (Migration 0065)

Code je Gerät (7 Tage, nur Hash gespeichert), Einreichen mit Domänen- und
Anmeldenamenprüfung (Passwort kommt nur als SHA-512-crypt), Bestätigung
binnen einer Stunde, verfallene Vorgänge verlieren Hash und Adresse. Die
Platzhalterseite /personalisierung entfällt, das Formular liegt in der
Kundenplattform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-15 15:28:18 +02:00
1 parent 90586094f0
commit 327bf948df
2 files changed
+471 -27

No files matched your search

+52
View File
@@ -0,0 +1,52 @@
BEGIN;
-- ADR-0041 (Personalisierung), Schritt 2: Aktivierungscode, Formular,
-- Bestätigung per Mail. Das Formular liegt in der Kundenplattform, die
-- Daten hier, weil der Agent sie beim Check-in braucht (Schritt 3).
-- Erlaubte E-Mail-Domänen der Organisation (Ergänzung 15.10.2026). Leer:
-- jede Adresse ist erlaubt.
ALTER TABLE organizations
ADD COLUMN email_domaenen TEXT[] NOT NULL DEFAULT '{}';
-- Eine Zeile je Aktivierungscode. Ablauf der Stände:
-- code_offen -> eingereicht -> bestaetigt -> angelegt (Schritt 3)
-- Abzweige: zurueckgezogen (Kunden-Admin), verfallen (Code oder
-- Bestätigungsfrist abgelaufen), beendet (Konto entfernt).
CREATE TABLE personalisierungen (
id UUID PRIMARY KEY,
device_id UUID NOT NULL REFERENCES devices(id) ON DELETE CASCADE,
organization_id UUID NOT NULL REFERENCES organizations(id) ON DELETE CASCADE,
status TEXT NOT NULL CHECK (status IN (
'code_offen', 'eingereicht', 'bestaetigt', 'angelegt',
'zurueckgezogen', 'verfallen', 'beendet'
)),
-- Nur der SHA-256 des normalisierten Codes; der Code selbst wird genau
-- einmal angezeigt.
code_hash TEXT NOT NULL UNIQUE,
code_gueltig_bis TIMESTAMPTZ NOT NULL,
-- Kästchen "Bestehenden Zugang behalten" (aus = bisheriges Konto wird
-- nach Bestätigung des neuen entfernt).
bestehenden_behalten BOOLEAN NOT NULL DEFAULT FALSE,
erstellt_von TEXT,
erstellt_am TIMESTAMPTZ NOT NULL DEFAULT CURRENT_TIMESTAMP,
email TEXT,
anmeldename TEXT,
-- SHA-512-crypt; gelöscht, sobald der Agent die Anlage gemeldet hat.
passwort_hash TEXT,
bestaetigung_token_hash TEXT UNIQUE,
bestaetigung_bis TIMESTAMPTZ,
eingereicht_am TIMESTAMPTZ,
bestaetigt_am TIMESTAMPTZ,
angelegt_am TIMESTAMPTZ,
beendet_am TIMESTAMPTZ
);
CREATE INDEX personalisierungen_device_idx ON personalisierungen (device_id, erstellt_am DESC);
-- Höchstens ein laufender Vorgang je Gerät.
CREATE UNIQUE INDEX personalisierungen_ein_offener_je_geraet
ON personalisierungen (device_id)
WHERE status IN ('code_offen', 'eingereicht', 'bestaetigt');
COMMIT;