Files
Laufzettel/tests/fixtures/ldap/schema/ad-fixture.ldif
T
Florian WildeandClaude Opus 5 16059e7846
Prüfung / pruefung (push) Canceled after 0s
Prüfung / pruefung (pull_request) Canceled after 0s
Prüfung / e2e (push) Canceled after 0s
Prüfung / e2e (pull_request) Canceled after 0s
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>
2026-09-26 02:21:08 +02:00

53 lines
2.6 KiB
Plaintext

# 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 ) )