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}
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
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
Quelle: docs/issues/012-platzhalter-namensregeln.md — dort gepflegt, hierher gespiegelt.
**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
---
Quelle: `docs/issues/012-platzhalter-namensregeln.md` — dort gepflegt, hierher gespiegelt.
florian.wilde
added this to the v0.1.0 milestone 2026-09-24 20:44:42 +00:00
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
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
{{key}}in Schritt-Titel, Hilfetext und Befehlstext{{hostname}},{{seriennummer}},{{inventarnummer}},{{ticket}},{{datum}},{{techniker}}; im ModusDIENSTLEISTUNGzusätzlich{{kunde}}und{{kundenkuerzel}}, im ModusINTERNleer{{mitarbeiter}}(Alias{{benutzer}}),{{vorname}},{{nachname}},{{upn}},{{sam}},{{mail}},{{abteilung}},{{titel}},{{vorgesetzter}},{{vorgesetzter_sam}},{{dn}},{{ou}}{{ou}}falls nicht vom Mitarbeiter,{{gruppen}}kommagetrennt{{ou}}eines synchronisierten Mitarbeiters ist der Eltern-Container seinesdn(alles nach dem ersten Komma){{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]Einstellung.namensregelnglobal, im ModusDIENSTLEISTUNGzusätzlichKunde.namensregelnmit Fallback):upn,sam(höchstens 20 Zeichen),mail,hostname{nnn}-Zähler,{v}für den ersten Buchstaben des Vornamens,{kundenkuerzel}BEFEHL-Schritte in Reihenfolge, getrennt durch Leerzeilen, je mit# Schritt: <Titel>davor, Zeilenumbruch passend zur ShellAkzeptanzkriterien
joerg.mueller-luedenscheid@firma.deundjmuellerluedensch(auf 20 Zeichen gekürzt){{generiertes_passwort}}erscheint im angezeigten Befehl, steht aber nicht inSchrittergebnis,Kommentar,Protokolloder der Druckansicht; zwei Aufrufe liefern verschiedene Passwörter"und`wird für PowerShell korrekt maskiert und bricht den Befehl nicht{{key}}stehen{{ou}}wird ausCN=Maria Huber,OU=Buchhaltung,OU=Benutzer,DC=firma,DC=localzuOU=Buchhaltung,OU=Benutzer,DC=firma,DC=localINTERNsind{{kunde}}und{{kundenkuerzel}}leer<script>landet HTML-escaped in der AnzeigeQuelle:
docs/issues/012-platzhalter-namensregeln.md— dort gepflegt, hierher gespiegelt.