Der Befehl ldap_compare() vergleicht einen vorgegebenen Wert mit dem Wert eines LDAP-Attributs.
Dieser Befehl baut eine Verbindung zu einem LDAP-Server auf und prüft den Wert eines Attributs.
Wird keiner der angegebenen LDAP-Server erreicht, so wird die E-Mail mit einem temporären Fehler abgewiesen (420, could not bind to LDAP server).
Aufbau des Befehls
ldap_compare('ldap','attr','value');
Rückgabewert
Der Rückgabewert ist abhängig von der verwendeten Variable im LDAP-Suchstring
Parameter
Variablen verfügbar!
Die Inhalte der Variablen im Parameter „Filter“ weichen von den Standard-Variablen ab!
|
ldap
Der Parameter ist wie folgt aufgebaut:
'URI;BindDN;Password;SearchBase;Filter'
Die Bedeutung der einzelnen Teil Strings ist der folgenden Tabelle beschrieben:
Parameter |
Beschreibung |
||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
URI |
Angabe des LDAP-Servers, der abgefragt werden soll. Als Eingabe wird der Hostname oder die IP-Adresse akzeptiert. Mehrere Werte können kommagetrennt angegeben werden: In diesem Fall wird automatisch auf den jeweils nächsten Server zugegriffen, wenn der vorherige nicht erreicht werden kann.
|
||||||||||||||||||||||||||||
BindDN |
Eingabe des vollständigen Distinguished Name (DN) des (read-only) Accounts, welcher zur Suche des unter „SearchBase“ angegebenen Pfades der LDAP Verzeichnisstruktur berechtigt ist. |
||||||||||||||||||||||||||||
Password |
Das Passwort des unter BindDN angegebenen Benutzers
|
||||||||||||||||||||||||||||
SearchBase |
Suchpfad: Gibt den Zweig des LDAP Verzeichnisses an, in welchem mittels Suchfilter (siehe nächste Zeile) rekursiv nach dem Objekt gesucht werden soll, in welchem auf Vorhandensein des Attributs 'attr' mit dem angegebenen Wert 'value' geprüft werden soll. |
||||||||||||||||||||||||||||
Filter |
Angabe des Such-Attributes /-Wertes, mittels welchem im Zweig der „SearchBase“ nach dem Objekt suchen ist. Das Such-Attribut ist in der Regel „(mail=...)“. Für das Auswerten der E-Mail Adresse(n) stehen die im Folgenden genannten Variablen zur Verfügung.
Variablen
$sender Diese Variable gibt den Envelope Absender der E-Mail aus. Rückgabewert bei Verwenden dieser Variable
$from Diese Variable gibt die E-Mail Adresse des Absenders aus dem FROM-Header der E-Mail aus. Dies ist insbesondere bei Abwesenheitsmeldungen notwendig, da in diesen kein Envelope-Sender gesetzt ist. Ist der Sender des FROM-Headers nicht intern - also keiner Managed domain zuzuordnen - so wird auf das Vorhandensein des SENDER-Headers geprüft. Ist dieser vorhanden und der darin enthaltene Sender intern, so wird dieser anstatt des Senders aus dem FROM-Header ausgegeben. Dadurch werden Probleme beim Weiterleiten von Kalendereinladungen vermieden. Rückgabewert bei Verwenden dieser Variable
$rcptdomain Diese Variable gibt die Empfängerdomäne einer E-Mail aus. Dabei wird die E-Mail in zwei Gruppen gesplittet. Eine Gruppe mit den Empfängern der Domäne(n), für welche der Wert 'value' für das angegebene Attribut 'attr', im mittels LDAP Suchstring (ldap/Filter) gefundenen Objekt vorhanden ist und eine weitere Gruppe für die Empfänger, welche nicht darüber verfügen. Rückgabewert bei Verwenden dieser Variable
$rcptaddress oder $recipient Diese Variable gibt die Empfänger einer E-Mail aus. Dabei wird die E-Mail in zwei Gruppen gesplittet. Eine Gruppe mit den Empfängern, für welche der Wert 'value' für das angegebene Attribut 'attr', im mittels LDAP Suchstring (ldap/Filter) gefundenen Objekt vorhanden ist und eine weitere Gruppe für die Empfänger, welche nicht darüber verfügen. Rückgabewert bei Verwenden dieser Variable
$one_recipient Enthält eine E-Mail mehrere Empfänger, so wird für alle Empfänger der Wert 'value' für das angegebene Attribut 'attr', in den jeweils mittels LDAP Suchstring (ldap/Filter) gefundenen Objekten, geprüft. Rückgabewert bei Verwenden dieser Variable
$all_recipients Enthält eine E-Mail mehrere Empfänger, so wird für alle Empfänger der Wert 'value' für das angegebene Attribut 'attr', in den jeweils mittels LDAP Suchstring (ldap/Filter) gefundenen Objekten, geprüft. Rückgabewert bei Verwenden dieser Variable
|
attr
Attribut nach welchem im LDAP-Verzeichnis gesucht werden soll.
Sollten mehrere Attribute 'attr' mit dem gesuchten Namen gefunden werden, so werden alle Attribute ausgewertet (multi value). |
value
Wert, welcher im abgefragten Attribut 'attr' vorkommen soll.
Enthält 'value' mehrere Einträge, so wird die Suche nach der ersten Übereinstimmung beendet. Der Vergleich findet case-sensitive statt. |
Beispiel 1
Die Zugehörigkeit des internen Absenders einer E-Mail „(mail=$from)“ zur Gruppe „MailCrypt“ soll im LDAP anhand des im envelope der E-Mail eingetragenen Absenders geprüft werden, zum Beispiel um festzustellen, ob dieser berechtigt ist, kryptographisch behandelte E-Mails zu senden.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
if (ldap_compare('192.168.10.10;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;(mail=$from)','memberOF','MailCrypt')) { |
02 |
log(1,'Mitglied der AD-Gruppe MailCrypt, markiere E-Mail für Signatur'); |
03 |
tagsubject('[sign]'); |
04 |
} else { |
05 |
log(1,'nicht Mitglied der AD-Gruppe Exchange, liefere unbehandelt aus'); |
06 |
deliver(); |
07 |
} |
Erklärung
In (Zeile 01) wird
•der LDAP-Server mit der IP-Adresse 192.168.10.10 (und dem Standardport 389) wird abgefragt.
•der DistinguishedName (DN) des Benutzers unter welchem die Abfrage ausgeführt wird (dieser muss die entsprechenden Berechtigungen besitzen) lautet
CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local
•das folgende Passwort für diesen Benutzers verwendet
mypassword
•der LDAP Pfad, in welchem der Suchfilter (mail=$sender) angewendet werden soll lautet
OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local
•der Benutzer, dessen Gruppenzugehörigkeit festgestellt werden soll, anhand der Absender E-Mail Adresse aus dem FROM-Header der E-Mail (mail=$from) festgestellt.
Mindestens ein Wert des Attributes „memberOF“ muss den Wert „MailCrypt“ haben, damit der Rückgabewert positiv ist, und somit der Anwendugsblock aus (Zeile 02, 03) ausgeführt wird. Ist der Wert „MailCrypt“ nicht im Attribut, beziehungsweise das Attribut „memberOF“ nicht vorhanden, so ist der Rückgabewert negativ, wodurch der Anwendungsblock (Zeile 05, 06) ausgeführt wird.
Beispiel 1a
Die Parameter 'ldap' und 'attr' (Zeile 02) werden aus einer zuvor definierten Variable $ldap_attr (Zeile 01) ausgelesen.
Zeile |
Code |
---|---|
01 |
if (compare('from','match','@customer1\.tld') { |
02 |
setvar('ldap_attr','ldaps://directory.domain.tld;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=firma,DC=local;(mail=$header_from)'); |
03 |
} |
04 |
if (ldap_compare('$ldap_attr','memberOf','MailCrypt')) { |
05 |
... |
06 |
} |
Erklärung
Dies ist insbesondere in mandantenfähigen Systemen hilfreich. So kann zunächst anhand der Absenderadresse der Zugang zu dem zum Mandanten gehörigen LDAP definiert werden. Die eigentliche LDAP-Verzweigung bleibt dann für alle Mandanten identisch.
Bei diesem Beispiel ist zu beachten, dass für ldap_compare() der FROM-Header (mail=$from) verwendet werden soll. Da setvar() jedoch die Standard-Variablen verwendet und bereits mit dem Schreiben der Variable auflöst, muss im Befehl setvar() die Variable $header_from verwendet werden. |
Beispiel 2
Die Zugehörigkeit des internen Absenders einer E-Mail „(mail=$sender)“ zur Gruppe „MailCrypt“ soll im LDAP anhand des im FROM-Header der E-Mail eingetragenen Absenders geprüft werden, zum Beispiel um festzustellen, ob dieser berechtigt ist, kryptographisch behandelte E-Mails zu senden.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
ldap_compare('ldaps://192.168.10.10;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;(mail=$sender)','memberOF','MailCrypt'); |
Erklärung
Prinzipiell macht der Ausdruck in diesem Beispiel das gleiche wie der in Beispiel 1 (Zeile 01), mit dem Unterschied, dass statt im FROM-Header im Envelope der E-Mail nach dem Absender gesucht wird.
Beispiel 3
Ausgangspunkt sind zwei unterschiedliche Groupware- (interne E-Mail ) Server (zum Beispiel Exchange und Domino), welche parallel eingesetzt werden.
Abgefragt soll werden, ob das Postfach wenigstens eines internen Empfängers einer eingehenden E-Mail - mit gegebenenfalls mehreren Empfängern - ein Exchange Postfach ist.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
if (ldap_compare('ldap://192.168.10.10,ldap://192.168.10.11;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;(mail=$rcptaddress)','MailServerGruppe','Exchange')){ |
02 |
log(1,'Mitglied der AD-Gruppe Exchange'); |
03 |
} else { |
04 |
log(1,'nicht Mitglied der AD-Gruppe Exchange'); |
05 |
} |
Erklärung
Im LDAP Suchpfad (SearchBase) wird der Suchfilter (Filter) „(mail=$recipients)“ angewendet (Zeile 01).
Für die Empfänger der E-Mail, welche im LDAP--Verzeichnis gefunden wurden, im Besitz des genannten Attributs sind und der Wert dieses Attributs der Vorgabe entspricht, wird der Log-Eintrag „Mitglied der AD-Gruppe Exchange“ generiert (Zeile 02). Für alle anderen Empfänger wird der Log-Eintrag „nicht Mitglied der AD-Gruppe Exchange“ generiert (Zeile 04).
Beispiel 4
Ausgangspunkt sind wieder zwei unterschiedliche Groupware-Server, welche parallel eingesetzt werden.
Es soll abgefragt werden, ob das Postfach wenigstens eines internen Empfängers einer eingehenden E-Mail - mit gegebenenfalls mehreren Empfängern - ein Exchange Postfach ist.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
ldap_compare('ldaps://myldap.local;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;(mail=$one_recipient)','MailServer','Exchange'); |
Erklärung
Im LDAP Suchpfad (SearchBase) wird der Suchfilter (Filter) „(mail=$one_recipient)“ angewendet.
Hat wenigstens ein Empfänger der E-Mail „(mail=$one_recipient)“ den Wert „Exchange“ im Attribut „MailServer“ so ist der Rückgabewert positiv.
Beispiel 5
Es soll abgefragt werden, ob das Postfach aller internen Empfänger einer eingehenden E-Mail - mit gegebenenfalls mehreren Empfängern - Domino Postfächer sind.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
ldap_compare('ldaps://myldap.local;CN=Peter Mueller,OU=SBSUsers,OU=Users,OU=MyBusiness,DC=firma,DC=local;mypassword;OU=SBSUsers,OU=Users,OU=MyBusiness,DC=Firma,DC=local;(mail=$all_recipients)','MailServer','Domino'); |
Erklärung
Im LDAP Suchpfad (SearchBase) wird der Suchfilter (Filter) „(mail=$all_recipients)“ angewendet.
Nur wenn alle internen Empfänger der E-Mail „(mail=$all_recipients)“ den Wert „Domino“ im Attribut „MailServer“ haben, so ist der Rückgabewert positiv.
Beispiel 6
Geprüft werden soll, ob der interne Absender einer E-Mail „(proxyadresses=smtp:$sender)“ ein User der Domäne firma.local ist.
Die Anweisung sieht wie folgt aus:
Zeile |
Code |
---|---|
01 |
ldap_compare('ldaps://192.168.10.10;Administrator@myldap.local;mypassword;DC=firma,DC=local;(proxyaddresses=smtp:$sender)';'objectclass','user'); |
Erklärung
Im LDAP Suchpfad (SearchBase) wird der Suchfilter (Filter) „(proxadresses=smtp:$sender)“ angewendet.
Wird die Absenderadresse des Envelope der E-Mail (smtp:$sender) in einem User-Object (objectclass=user) gefunden, so ist der Rückgabewert positiv.
Da in einem AD-User-Object im Attribut proxadresses auch E-Mail-Aliases aufgeführt werden, funktioniert diese Abfrage mit allen E-Mail Adressen des Users und nicht nur mit der Haupt-Adresse (Attribut mail).