Files
betreuungs-cockpit/package.json
T
Florian Wilde 232543e2aa fix: Leere Schluesselvariable legte die Verschluesselung lahm
docker-compose.yml reicht ENC_KEY_V2 immer an den Behaelter durch - mit
leerem Wert, wenn in der .env keiner steht. src/lib/env.ts erkannte
Schluessel aber am Variablennamen statt am Inhalt, fand also ein leeres
ENC_KEY_V2 und brach ab mit "Umgebungsvariable ENC_KEY_V2 fehlt".

Die Meldung war doppelt irrefuehrend: Sie nannte einen Schluessel, den
niemand wollte, und sie erschien an einer Stelle, die damit nichts zu tun
hat - beim Einrichten des zweiten Faktors, als Serverfehler ohne Text.

Betroffen war jede Stelle, die verschluesselte Felder schreibt oder
liest, also praktisch alles ausser der Anmeldung selbst. Die kam durch,
weil sie ohne Verschluesselung auskommt - der Fehler trat deshalb erst
auf der naechsten Seite auf, und der Zusammenhang war nicht zu sehen.

Leere Schluesselvariablen werden jetzt uebersprungen. Sieben Tests decken
die Auswertung ab, darunter genau diese Konstellation.

Die Meldung beim Schluesselwechsel nennt jetzt ausserdem, welche
Versionen vorhanden sind, und die richtige Reihenfolge: erst den neuen
Schluessel eintragen, dann ENC_KEY_AKTIV umstellen.

Dazu scripts/anmeldung-pruefen.mjs. Das Anmeldeformular sagt bewusst
nicht, woran eine Anmeldung scheiterte - sonst liesse sich daran ablesen,
welche Adressen es gibt. Auf dem Server darf man es wissen: Jeder Versuch
wird mit Grund protokolliert, und das Skript liest ihn vor, zusammen mit
dem Zustand des Zugangs, dem Stand der Sperre und der AUTH_URL.

Etappe: 8
Phase: Haertung
2026-08-22 14:00:25 +02:00

95 lines
2.9 KiB
JSON

{
"name": "betreuungs-cockpit",
"version": "1.0.2",
"private": true,
"description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung",
"engines": {
"node": ">=20.11"
},
"scripts": {
"dev": "next dev",
"build": "next build",
"start": "next start",
"lint": "next lint",
"typecheck": "tsc --noEmit",
"test": "vitest run",
"test:watch": "vitest",
"db:generate": "prisma generate",
"db:migrate": "prisma migrate dev",
"db:deploy": "prisma migrate deploy",
"db:volltext": "prisma db execute --schema prisma/schema.prisma --file prisma/sql/volltextsuche.sql",
"db:seed": "prisma db seed",
"db:studio": "prisma studio",
"setup": "prisma migrate deploy && npm run db:sql && npm run db:seed",
"schluessel": "node scripts/schluessel-erzeugen.mjs",
"postinstall": "prisma generate",
"db:audit-schutz": "prisma db execute --schema prisma/schema.prisma --file prisma/sql/audit-schutz.sql",
"db:sql": "npm run db:volltext && npm run db:audit-schutz",
"protokoll": "node scripts/bauprotokoll.mjs",
"test:e2e": "playwright test",
"protokoll:md": "node scripts/bauprotokoll.mjs --md",
"wartungsschluessel": "node --env-file=.env scripts/wartungsschluessel.mjs",
"version": "node scripts/version.mjs"
},
"prisma": {
"seed": "tsx prisma/seed.ts"
},
"dependencies": {
"@aws-sdk/client-s3": "3.735.0",
"@aws-sdk/s3-request-presigner": "3.735.0",
"@node-rs/argon2": "2.0.2",
"@prisma/client": "6.3.1",
"@radix-ui/react-dialog": "1.1.4",
"@radix-ui/react-dropdown-menu": "2.1.4",
"@radix-ui/react-label": "2.1.1",
"@radix-ui/react-slot": "1.1.1",
"@react-pdf/renderer": "4.1.6",
"archiver": "7.0.1",
"class-variance-authority": "0.7.1",
"clsx": "2.1.1",
"date-fns": "4.1.0",
"docx": "9.1.1",
"lucide-react": "0.474.0",
"next": "15.1.6",
"next-auth": "5.0.0-beta.25",
"nodemailer": "6.10.0",
"otpauth": "9.3.6",
"pdf-lib": "1.17.1",
"qrcode": "1.5.4",
"react": "19.0.0",
"react-dom": "19.0.0",
"rrule": "2.8.1",
"server-only": "^0.0.1",
"tailwind-merge": "2.6.0",
"tailwindcss-animate": "1.0.7",
"zod": "3.24.1"
},
"devDependencies": {
"@playwright/test": "1.50.1",
"@types/archiver": "6.0.3",
"@types/node": "22.13.1",
"@types/nodemailer": "6.4.17",
"@types/qrcode": "1.5.5",
"@types/react": "19.0.8",
"@types/react-dom": "19.0.3",
"autoprefixer": "10.4.20",
"eslint": "9.19.0",
"eslint-config-next": "15.1.6",
"postcss": "8.5.1",
"prisma": "6.3.1",
"tailwindcss": "3.4.17",
"tsx": "4.19.2",
"typescript": "5.7.3",
"vitest": "3.0.5"
},
"allowScripts": {
"@prisma/client@6.3.1": true,
"@prisma/engines@6.3.1": true,
"esbuild@0.23.1": true,
"esbuild@0.25.12": true,
"prisma@6.3.1": true,
"sharp@0.33.5": true,
"unrs-resolver@1.12.2": true
}
}