Schema: Zeitschritt fuer TOTP und Sperre fuer die Ersteinrichtung
Zwei Felder fuer zwei Luecken, in einer Migration: benutzer.totpLetzterSchritt haelt das zuletzt akzeptierte TOTP-Fenster fest. Ohne das gilt ein Code bis zu 90 Sekunden lang beliebig oft. Die Tabelle ersteinrichtung hat genau eine Zeile mit fester Id. Das ist kein Protokoll, sondern eine Sperre: Bisher entschied "gibt es schon einen Benutzer?" und danach wurde angelegt - zwei Anfragen gleichzeitig kamen beide durch. Jetzt entscheidet der Primaerschluessel. Enthalten ist eine Datenmigration: Wo schon ein Zugang besteht, wird die Sperrzeile gesetzt. Ohne sie stuende die Einrichtungsseite auf jedem bestehenden System nach dem Update wieder offen. Die DROP-INDEX-Zeilen zu den Trigramm-Indizes hat das Skript aus #36 wieder entfernt; "npm run db:pruefen" bestaetigt, dass beide stehen. Refs #38
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
-- sicherheitsaudit
|
||||
--
|
||||
-- Erzeugt mit "npm run db:migration". Entfernt wurden die
|
||||
-- DROP-INDEX-Anweisungen zu diesen Indizes:
|
||||
-- dokument_absender_trgm
|
||||
-- vorgang_titel_trgm
|
||||
--
|
||||
-- Sie stammen aus prisma/sql/volltextsuche.sql und sind Prisma unbekannt;
|
||||
-- ohne sie waere die Volltextsuche still langsam geworden.
|
||||
|
||||
-- AlterTable
|
||||
ALTER TABLE "benutzer" ADD COLUMN "totpLetzterSchritt" INTEGER;
|
||||
|
||||
-- CreateTable
|
||||
CREATE TABLE "ersteinrichtung" (
|
||||
"id" TEXT NOT NULL,
|
||||
"abgeschlossenAm" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
"userId" TEXT,
|
||||
|
||||
CONSTRAINT "ersteinrichtung_pkey" PRIMARY KEY ("id")
|
||||
);
|
||||
|
||||
-- Bestehende Installationen nachziehen.
|
||||
--
|
||||
-- Die Tabelle oben ist die Sperre fuer die Ersteinrichtung. Auf einem
|
||||
-- System, das schon laeuft, ist die Einrichtung laengst erledigt - ohne
|
||||
-- diese Zeile stuende die Sperre nach dem Update offen, und der Weg zum
|
||||
-- Anlegen eines Administrators waere wieder frei.
|
||||
INSERT INTO "ersteinrichtung" ("id", "userId")
|
||||
SELECT 'einmalig', (SELECT "id" FROM "benutzer" ORDER BY "erstelltAm" ASC LIMIT 1)
|
||||
WHERE EXISTS (SELECT 1 FROM "benutzer");
|
||||
Reference in New Issue
Block a user