diff --git a/lc_ldap.py b/lc_ldap.py index d87d67d..579c13e 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -43,10 +43,17 @@ import config, crans_utils from attributs import attrify, blacklist from ldap_locks import CransLock -uri = 'ldapi:///' #'ldap://ldap.adm.crans.org/' +uri = 'ldap://ldap.adm.crans.org/' base_dn = 'ou=data,dc=crans,dc=org' log_dn = "cn=log" +# Quand on a besoin du fichier de secrets +def import_secrets(): + if not "/etc/crans/secrets/" in sys.path: + sys.path.append("/etc/crans/secrets/") + import secrets + return secrets + # Champs à ignorer dans l'historique HIST_IGNORE_FIELDS = ["modifiersName", "entryCSN", "modifyTimestamp", "historique"] @@ -79,7 +86,7 @@ def lc_ldap_test(): return lc_ldap(uri='ldap://vo.adm.crans.org',dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32') def lc_ldap_admin(): - """Binding LDAP à la vraie vase, en admin. + """Binding LDAP à la vraie base, en admin. Possible seulement si on peut lire secrets.py""" secrets = import_secrets() return lc_ldap(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn, cred=secrets.ldap_password) @@ -87,23 +94,31 @@ def lc_ldap_admin(): class lc_ldap(ldap.ldapobject.LDAPObject): """Connexion à la base ldap crans, chaque instance représente une connexion """ - def __init__(self, dn=None, user=None, cred=None, uri=uri): + def __init__(self, dn=None, user=None, cred=None, uri=uri, test=False): """Initialise la connexion ldap, - En authentifiant avec dn et cred s'ils sont précisés - Si dn n'est pas précisé, mais que user est précisé, récupère le dn associé à l'uid user, et effectue l'authentification avec ce dn et cred - Sinon effectue une authentification anonyme + Si test est à True, on se connecte à la base de test sur vo. """ - + if test: + uri = "ldapi:///" ldap.ldapobject.LDAPObject.__init__(self, uri) if user and not re.match('[a-z_][a-z0-9_-]*', user): raise ValueError('Invalid user name: %s' % user) - # Si un username, on récupère le dn associé + # Si un username, on récupère le dn associé… if user and not dn: - self.simple_bind_s(base_dn) + if test: + # …en anonyme si on se connecte à la base de test + self.simple_bind_s(base_dn) + else: + # …sinon, en se connectant en readonly (on récupère les identifiants dans secrets.py) + secrets = import_secrets() + self.simple_bind_s(who=secrets.ldap_readonly_auth_dn, cred=secrets.ldap_readonly_password) res = self.search_s(base_dn, 1, 'uid=%s' % user) if len(res) < 1: raise ldap.INVALID_CREDENTIALS({'desc': 'No such user: %s' % user })