feat(verzeichnis): LDAP-Abgleich, Zeitplan, CSV-Import und Log
Quelle anlegen, Verbindung testen, nach Zeitplan oder auf Knopfdruck abgleichen. Gelesen wird seitenweise mit searchPaginated, objectGUID kommt als Puffer und wird gemischt-endian zur GUID umsortiert. Wer im Verzeichnis verschwindet, wird hier inaktiv und nie geloescht. Drei Regeln verhindern, dass eine kaputte Eingabe wie "alle sind gegangen" aussieht: laesst sich kein einziger Eintrag zuordnen, wird niemand deaktiviert; uebersprungene Eintraege werden am dn erkannt und ausgenommen; eine von Hand angelegte Person wird uebernommen statt verdoppelt. Der Zeitplan laeuft ueber node-cron im selben Prozess, gestartet aus src/instrumentation.ts, und nimmt keine eigene Sperre - die liegt in der Datenbank, damit zwei Instanzen sich einig sind. Closes #16 Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 5
parent
ab5777a57e
commit
16059e7846
+110
@@ -0,0 +1,110 @@
|
||||
# Fixture-Personen fuer den Verzeichnis-Abgleich (#016).
|
||||
#
|
||||
# Bewusst klein, aber mit jedem Fall, den der Abgleich unterscheiden muss:
|
||||
#
|
||||
# Maria Huber vollstaendig, mit Vorgesetztem und Umlaut im Namen
|
||||
# Klaus Berger ihr Vorgesetzter, damit `manager` aufloesbar ist
|
||||
# Joerg Weiss Nachname mit Eszett, Mail-Adresse mit Umlaut-Ersatz
|
||||
# Alte Kraft userAccountControl 514 (Bit 2 = deaktiviert) -- der
|
||||
# Standardfilter muss sie ausschliessen
|
||||
# Ohne Kennung ein Konto ohne objectGUID; ohne stabile Kennung darf der
|
||||
# Abgleich es nicht anlegen, aber auch nicht abbrechen
|
||||
#
|
||||
# objectGUID steht base64-kodiert (`::`), weil es im AD ein binaeres Attribut
|
||||
# ist. Die erwarteten GUID-Zeichenketten stehen in tests/verzeichnis.test.ts.
|
||||
#
|
||||
# Achtung: osixia laeuft mit `sed -i` ueber jede Datei in diesem Verzeichnis, um
|
||||
# Platzhalter wie {{ LDAP_BASE_DN }} zu ersetzen. Hier stehen deshalb keine
|
||||
# Platzhalter -- dann schreibt sed dieselben Bytes zurueck und der Arbeitsbaum
|
||||
# bleibt sauber.
|
||||
|
||||
dn: ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: organizationalUnit
|
||||
ou: Benutzer
|
||||
|
||||
dn: ou=Buchhaltung,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: organizationalUnit
|
||||
ou: Buchhaltung
|
||||
|
||||
dn: ou=Vertrieb,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: organizationalUnit
|
||||
ou: Vertrieb
|
||||
|
||||
dn: ou=Geschaeftsfuehrung,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: organizationalUnit
|
||||
ou: Geschaeftsfuehrung
|
||||
|
||||
dn: cn=Klaus Berger,ou=Geschaeftsfuehrung,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: inetOrgPerson
|
||||
objectClass: user
|
||||
cn: Klaus Berger
|
||||
sn: Berger
|
||||
givenName: Klaus
|
||||
displayName: Berger, Klaus
|
||||
mail: klaus.berger@firma.test
|
||||
userPrincipalName: klaus.berger@firma.test
|
||||
sAMAccountName: kberger
|
||||
department: Geschaeftsfuehrung
|
||||
title: Geschaeftsfuehrer
|
||||
objectCategory: person
|
||||
userAccountControl: 512
|
||||
objectGUID:: nEA+HXqyyUux5vCiw9Tl9g==
|
||||
|
||||
dn: cn=Maria Huber,ou=Buchhaltung,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: inetOrgPerson
|
||||
objectClass: user
|
||||
cn: Maria Huber
|
||||
sn: Huber
|
||||
givenName: Maria
|
||||
displayName:: SHViZXIsIE1hcmlh
|
||||
mail: maria.huber@firma.test
|
||||
userPrincipalName: maria.huber@firma.test
|
||||
sAMAccountName: mhuber
|
||||
department: Buchhaltung
|
||||
title:: TGVpdGVyaW4gUmVjaG51bmdzcHLDvGZ1bmc=
|
||||
objectCategory: person
|
||||
userAccountControl: 512
|
||||
manager: cn=Klaus Berger,ou=Geschaeftsfuehrung,ou=Benutzer,dc=firma,dc=test
|
||||
objectGUID:: EEMHXzU8HUqDb6UPUV56NQ==
|
||||
|
||||
dn: cn=Joerg Weiss,ou=Vertrieb,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: inetOrgPerson
|
||||
objectClass: user
|
||||
cn: Joerg Weiss
|
||||
sn:: V2Vpw58=
|
||||
givenName:: SsO2cmc=
|
||||
displayName:: V2Vpw58sIErDtnJn
|
||||
mail: joerg.weiss@firma.test
|
||||
userPrincipalName: joerg.weiss@firma.test
|
||||
sAMAccountName: jweiss
|
||||
department: Vertrieb
|
||||
objectCategory: person
|
||||
userAccountControl: 512
|
||||
manager: cn=Klaus Berger,ou=Geschaeftsfuehrung,ou=Benutzer,dc=firma,dc=test
|
||||
objectGUID:: AQIDBAUGBwgJCgsMDQ4PEA==
|
||||
|
||||
dn: cn=Alte Kraft,ou=Vertrieb,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: inetOrgPerson
|
||||
objectClass: user
|
||||
cn: Alte Kraft
|
||||
sn: Kraft
|
||||
givenName: Alte
|
||||
displayName: Kraft, Alte
|
||||
mail: alte.kraft@firma.test
|
||||
userPrincipalName: alte.kraft@firma.test
|
||||
sAMAccountName: akraft
|
||||
department: Vertrieb
|
||||
objectCategory: person
|
||||
userAccountControl: 514
|
||||
objectGUID:: /+7dzLuqmYh3ZlVEMyIRAA==
|
||||
|
||||
dn: cn=Ohne Kennung,ou=Vertrieb,ou=Benutzer,dc=firma,dc=test
|
||||
objectClass: inetOrgPerson
|
||||
objectClass: user
|
||||
cn: Ohne Kennung
|
||||
sn: Kennung
|
||||
givenName: Ohne
|
||||
displayName: Kennung, Ohne
|
||||
sAMAccountName: okennung
|
||||
objectCategory: person
|
||||
userAccountControl: 512
|
||||
Reference in New Issue
Block a user