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
+52
@@ -0,0 +1,52 @@
|
||||
# AD-aehnliches Schema fuer den Testcontainer (#016).
|
||||
#
|
||||
# OpenLDAP bringt keines der Attribute mit, an denen der Abgleich haengt:
|
||||
# sAMAccountName, userPrincipalName, objectGUID, userAccountControl,
|
||||
# objectCategory und department fehlen alle. Ohne dieses Schema liefe der
|
||||
# Integrationstest gegen ein Verzeichnis, das mit einem Active Directory nichts
|
||||
# gemeinsam hat -- und bewiese entsprechend wenig.
|
||||
#
|
||||
# `manager`, `displayName`, `givenName`, `sn`, `mail` und `title` kommen aus
|
||||
# core/cosine/inetOrgPerson und stehen deshalb nicht hier.
|
||||
#
|
||||
# Die OIDs sind die echten aus dem Microsoft-Arc 1.2.840.113556, damit das
|
||||
# Fixture nicht bloss gleich heisst, sondern auch gleich bezeichnet ist.
|
||||
#
|
||||
# Zwei bewusste Abweichungen vom echten AD, weil sie sich in OpenLDAP nicht
|
||||
# nachbauen lassen:
|
||||
#
|
||||
# 1. `objectCategory` ist hier eine Zeichenkette mit dem Wert "person". Im AD
|
||||
# ist es ein DN auf das classSchema-Objekt, und der Server nimmt die
|
||||
# Kurzform "person" als Abkuerzung dafuer an. Der Standardfilter trifft
|
||||
# damit hier und dort, aus verschiedenen Gruenden.
|
||||
# 2. `user` ist hier AUXILIARY statt STRUCTURAL. So traegt ein Eintrag
|
||||
# inetOrgPerson **und** user, statt dass die Personenklassen des Fixtures
|
||||
# gegen die des AD ausgetauscht werden muessten. Fuer `(objectClass=user)`
|
||||
# macht das keinen Unterschied.
|
||||
|
||||
dn: cn=ad-fixture,cn=schema,cn=config
|
||||
objectClass: olcSchemaConfig
|
||||
cn: ad-fixture
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.4.221 NAME 'sAMAccountName'
|
||||
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.4.656 NAME 'userPrincipalName'
|
||||
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.4.2 NAME 'objectGUID'
|
||||
EQUALITY octetStringMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 SINGLE-VALUE )
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.4.8 NAME 'userAccountControl'
|
||||
EQUALITY integerMatch ORDERING integerOrderingMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 SINGLE-VALUE )
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.4.782 NAME 'objectCategory'
|
||||
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
||||
olcAttributeTypes: ( 1.2.840.113556.1.2.141 NAME 'department'
|
||||
EQUALITY caseIgnoreMatch SUBSTR caseIgnoreSubstringsMatch
|
||||
SYNTAX 1.3.6.1.4.1.1466.115.121.1.15 SINGLE-VALUE )
|
||||
olcObjectClasses: ( 1.2.840.113556.1.5.9 NAME 'user'
|
||||
DESC 'AD-aehnliche Zusatzklasse, nur fuer Tests'
|
||||
SUP top AUXILIARY
|
||||
MAY ( sAMAccountName $ userPrincipalName $ objectGUID $ userAccountControl $
|
||||
objectCategory $ department ) )
|
||||
Reference in New Issue
Block a user