KFZ-Bozo Handbuch

Zugänge & Schranken

ZugangWerMechanismusSchütztStatusQuelle
Finanz-PIN (Zugriffsschranke Geldbereiche)Chef, Büro, SystemZweite PIN-Abfrage vor den fünf Geldbereichen; Freischaltung gilt pro Benutzername, verfällt nach 30 Minuten ohne Nutzung und verlängert sich bei jedem Zugriff. Wer ein Benutzerkonto mit aktiver Zwei-Faktor-Absicherung hat, gibt statt der PIN den Code der Authenticator-App ein. Drei Schalter davor - global an/aus, Ausnahmen pro Bereich, Ausnahmen pro Benutzer - sind in den Einstellungen konfigurierbar.Rechnungen & ZahlungenBewusst auslib/finance-pin.ts
Master-PIN Wiederherstellung (Vault-Support-Weg)Chef, SystemMaster-PIN aus der Server-Einrichtung, zeitgleich verglichen; fünf Fehlversuche schalten den PIN-Weg auf einen einmaligen Bestätigungslink per E-Mail um (24 Stunden gültig, nur einmal verwendbar). Eine erfolgreiche Freischaltung gilt 15 Minuten und verlängert sich bei jedem Zugriff. Nur die Rolle Inhaber kommt überhaupt bis zu dieser Abfrage.–Livelib/vault.ts
Admin-Login & SitzungenBüro, Chef, SystemZwei Wege nebeneinander. Der neue führt eine Sitzung in der Datenbank (widerrufbar, an ein Benutzerkonto und seine Rolle gebunden, mit letztem Zugriff und optionaler Zwei-Faktor-Bestätigung). Der alte prüft ein signiertes Cookie aus den Zugangsdaten der Server-Einrichtung und gilt immer als Inhaber. Beide liegen im selben Sitzungsausweis im Browser; das System erkennt am Präfix, welcher gilt.Büro-CRM (Admin), Aufträge & Werkstatt-Ablauf (API)Livelib/admin-auth.ts
Content-Security-Policy (Browser-Härtung)System, Kundemiddleware.ts setzt Header serverseitig; next.config.ts-Kommentar warnt explizit, die Policy dort NICHT zu duplizierenÖffentliche Website, Büro-CRM (Admin)Livemiddleware.ts
Herkunfts-Prüfung (CSRF-Schutz)SystemrequireSameOrigin() prueft Origin/Referer gegen PUBLIC_ALLOWED_HOSTS bei nicht-GET/HEAD/OPTIONS; faellt bei leerem PUBLIC_ALLOWED_HOSTS offen (nur geloggt, nicht blockiert) — als Konfigurationsluecke im Code selbst dokumentiertAufträge & Werkstatt-Ablauf (API)Livelib/api-guard.ts
IP-SperrlisteChef, BüroZaehler je Identifier (normalisierte IP oder 'tel:'-Nummer) in bot_ip_blocks; 7 Preisabfragen in 24 h ⇒ Sperre fuer 7 Tage; Entsperren nur ueber die Admin-Route mit dem Recht 'Benutzerverwaltung'–Liveapp/api/admin/ip-blocks
Kunden-Link-Token (Angebot/Termin/Bericht)KundeZwei Bauarten - (1) zustandsbehaftete Einmal-Token in customer_tokens: 256 Bit Zufall, in der Datenbank nur als SHA-256-Hash, gebunden an Zweck (kind) und Ressource (refId), Standard 30 Tage, widerrufbar; (2) zustandsloses HMAC-SHA256-Token fuer Termin-Selbstbedienung (lib/booking-token.ts), zeitkonstant geprueft, ohne DatenbankeintragKundenportal, Kundenlinks: Angebot, Termin, Bericht (API)Livelib/db/customer-tokens.ts
Mechaniker-PIN & Geräte-BindungWerkstatt, BüroGeraetebindung per persoenlichem QR-Token (mechanics.qrToken, unbefristet, per rotateMechanicQr neu ausstellbar) oder per Auftrags-QR (jobSessions.token, 24 h); resolveBoundMechanic() prueft Token und aktiv; authorizeTablet() bindet jede Tablet-Anfrage an den Auftrag bzw. den eigenen Buehnen-Teil und sperrt gevaultete Auftraege; rlHit() begrenzt je IP und je TokenMechaniker-Tablet, Mechaniker-Tablet & Anwesenheit (API)Teilweiselib/db/tablet-session.ts
Rate-Limiting (Missbrauchsbremse)SystemclientIpFrom() ermittelt die Client-Adresse spoof-sicher, danach rateLimit() (gleitendes Fenster, Arbeitsspeicher) bzw. rateLimitDb() (fixes Fenster, SQLite) je nach RATE_LIMIT_STORE; rlHit() ist der fertige 429-Wrapper fuer die Tablet- und Mechaniker-WegeÖffentliche System-Endpunkte (unauthentifiziert)Livelib/rate-limit.ts
Rollen & Rechte (Berechtigungskatalog)Chef, BürorequirePermission(session, recht) prueft die in verifyAuth berechneten effektiven Rechte (Rollen-Standard aus ROLE_PERMISSIONS plus per-User-Override aus users.permissions) und antwortet sonst mit 403; owner erhaelt immer ALL_PERMISSIONS, ein Override wird dort ignoriert; Alt-Sitzungen aus dem gemeinsamen Login gelten als owner–Livelib/admin-auth.ts
Verschlüsselter Secret-StoreChef, SystemWerte werden mit AES-256-GCM verschluesselt in einer eigenen Tabelle abgelegt; der 32-Byte-Schluessel wird per HKDF-SHA256 aus einem Grundgeheimnis abgeleitet und liegt nie in der Datenbank; die Oberflaeche bekommt nur ein configured-Kennzeichen oder einen maskierten Hinweis zurueck, nie den KlartextSMS-GatewayLiveMEM:sms-gateway-feature.md
Datei-Upload-AbsicherungSystem, BüroMagic-Byte-Pruefung der ersten 4-16 Bytes gegen eine kurze Allowlist (JPEG, PNG, GIF, WEBP, HEIC, PDF); Dateiname wird serverseitig neu vergeben als Zufallsname mit erkannter Endung; alle Schreibwege loesen ueber resolveDataPath() unterhalb von DATA_DIR auf und lehnen Traversal, absolute Pfade, Laufwerksbuchstaben, Nullbytes und prozentkodierte Segmente ab; der ZIP-Export pinnt zusaetzlich auf den Ordner genau dieses AuftragsDokumente, Prüfungen & FotosTeilweiselib/path-safe.ts