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:
1 parent
90586094f0
commit
327bf948df
2 files changed
+471
-27
No files matched your search
@@ -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;
|
||||
Reference in new issue
Block a user