Files
Laufzettel/docs/issues/012-platzhalter-namensregeln.md
T
Florian WildeandClaude Opus 5 49ce06f206
Prüfung / pruefung (push) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
feat: Projektgerüst, gehärteten Betriebsstand und Prozess aufsetzen
Legt die Grundlage, auf der alle weiteren Meilensteine nur noch Fachlichkeit
ergänzen: Next 16 mit App Router und TypeScript strict, Tailwind 4, Prisma 7,
Vitest 5, Playwright, ESLint, Prettier und die Hooks für Lint und Commits.

Zwei Dinge sind bewusst so gebaut und durch Tests festgehalten:

Die Datenbank ist im Betriebsstand von außen nicht erreichbar. Sie hat kein
ports:-Mapping und hängt allein im Netz "intern", das ohne Gateway läuft; nur
"web" kommt zusätzlich nach draußen. tests/betriebsstand.test.ts schlägt an,
falls ein Port-Mapping zurückkehrt. Geprüft, nicht behauptet: docker compose up
startet den Stack, 5432 ist vom Host aus zu, aus "web" offen.

pnpm pruefe:doku hält Dokumentation und Code zusammen — Version im Changelog,
Issue-Dateien gegen ihre Übersicht, keine Verweise auf fehlende Dateien, keine
fehlenden Bilder. Das Skript wurde gegen vier eingebaute Fehler gegengeprüft.

Drei Versions-Obergrenzen sind nötig und in CLAUDE.md begründet: eslint bleibt
auf 9.x, weil eslint-plugin-react keinen Nachfolger für eslint 10 hat und das
Regelwerk sonst beim Laden abbricht; typescript bleibt auf 6.0.x, weil
typescript-eslint TypeScript 7 noch nicht unterstützt; prisma ist exakt auf
7.10.0 gepinnt, weil sein latest-Tag auf einen 8.0-RC zeigt, der von
@prisma/client aber nicht.

Auth.js entfällt entgegen der ursprünglichen Vorgabe: v5 steht dauerhaft auf
Beta, das Projekt ist im Wartungsmodus und sein Prisma-Adapter deckt Prisma 7
nicht ab. Stattdessen openid-client und jose, wie in ProxLedger.

Dieser erste Commit geht direkt auf main, weil es noch keinen Branch gibt, von
dem abzuzweigen wäre. Ab #006 läuft jedes Issue über einen eigenen Branch.

Closes #5

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-24 23:33:49 +02:00

3.2 KiB
Raw Blame History

#012 M7 – Platzhalter, Namensregeln, Escaping

Status: offen Meilenstein: v0.1.0 Labels: phase-1, backend, security Geschätzt: 8 h Tatsächlich: –

Ziel

Reine, framework-freie Service-Schicht mit dichter Testabdeckung. Hier entstehen die fertigen PowerShell-Befehle, die der Techniker kopiert — und hier darf nichts schiefgehen, weder beim Escaping noch beim generierten Passwort.

Aufgaben

  • Platzhalter-Auflösung {{key}} in Schritt-Titel, Hilfetext und Befehlstext
  • Eingebaut aus Gerät und Lauf: {{hostname}}, {{seriennummer}}, {{inventarnummer}}, {{ticket}}, {{datum}}, {{techniker}}; im Modus DIENSTLEISTUNG zusätzlich {{kunde}} und {{kundenkuerzel}}, im Modus INTERN leer
  • Eingebaut aus dem Mitarbeiter: {{mitarbeiter}} (Alias {{benutzer}}), {{vorname}}, {{nachname}}, {{upn}}, {{sam}}, {{mail}}, {{abteilung}}, {{titel}}, {{vorgesetzter}}, {{vorgesetzter_sam}}, {{dn}}, {{ou}}
  • Aus der gewählten Abteilung: {{ou}} falls nicht vom Mitarbeiter, {{gruppen}} kommagetrennt
  • {{ou}} eines synchronisierten Mitarbeiters ist der Eltern-Container seines dn (alles nach dem ersten Komma)
  • Dazu die in der Vorlage definierten Variablen; unbekannte Platzhalter bleiben sichtbar stehen
  • {{generiertes_passwort}}: 20 Zeichen aus Groß, Klein, Ziffern und Sonderzeichen ohne verwechselbare Zeichen, je Anzeige neu erzeugt, nie gespeichert; Hinweis „Passwort sofort in den Passwortmanager übernehmen"; in der Druckansicht [Passwort – nicht gespeichert]
  • Namensregeln (Einstellung.namensregeln global, im Modus DIENSTLEISTUNG zusätzlich Kunde.namensregeln mit Fallback): upn, sam (höchstens 20 Zeichen), mail, hostname
  • Transliteration (ä→ae, ö→oe, ü→ue, ß→ss, Akzente entfernt), Kleinschreibung, Leerzeichen entfernt, {nnn}-Zähler, {v} für den ersten Buchstaben des Vornamens, {kundenkuerzel}
  • Shell-Escaping je Shell: PowerShell (doppelte Anführungszeichen verdoppeln, Backtick maskieren), Bash, Cmd
  • HTML-Escaping ersetzter Werte; Markdown im Hilfetext sicher gerendert, kein rohes HTML
  • „Alle Befehle als Skript kopieren" je Abschnitt: alle BEFEHL-Schritte in Reihenfolge, getrennt durch Leerzeilen, je mit # Schritt: <Titel> davor, Zeilenumbruch passend zur Shell

Akzeptanzkriterien

  • Test: „Jörg Müller-Lüdenscheid" ergibt joerg.mueller-luedenscheid@firma.de und jmuellerluedensch (auf 20 Zeichen gekürzt)
  • Test: {{generiertes_passwort}} erscheint im angezeigten Befehl, steht aber nicht in Schrittergebnis, Kommentar, Protokoll oder der Druckansicht; zwei Aufrufe liefern verschiedene Passwörter
  • Test: ein Wert mit " und ` wird für PowerShell korrekt maskiert und bricht den Befehl nicht
  • Test: unbekannte Platzhalter bleiben als {{key}} stehen
  • Test: {{ou}} wird aus CN=Maria Huber,OU=Buchhaltung,OU=Benutzer,DC=firma,DC=local zu OU=Buchhaltung,OU=Benutzer,DC=firma,DC=local
  • Test: Skript-Kopie liefert die Befehle in Abschnittsreihenfolge mit Kommentarzeilen
  • Test: im Modus INTERN sind {{kunde}} und {{kundenkuerzel}} leer
  • Test: ein Wert mit <script> landet HTML-escaped in der Anzeige