Merge branch 'master' of /usr/scripts/lc_ldap

This commit is contained in:
Daniel STAN 2013-03-04 03:49:20 +01:00
commit 50f5aabb45

View file

@ -143,15 +143,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
# 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: if user and not dn:
secrets = import_secrets() dn = self.user_to_dn(user)
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 })
elif len(res) > 1:
raise ldap.INVALID_CREDENTIALS({'desc': 'Too many matches: uid=%s' % user })
else:
dn = res[0][0]
# Si on a un dn, on se connecte avec à la base ldap sinon on s'y # Si on a un dn, on se connecte avec à la base ldap sinon on s'y
# connecte en anonyme # connecte en anonyme
@ -167,6 +159,23 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
self.dn = None self.dn = None
self.droits = [] self.droits = []
def user_to_dn(self, user):
"""Cherche le dn à partir de l'username."""
self._first_bind()
res = self.search_s(base_dn, 1, 'uid=%s' % user)
if len(res) < 1:
raise ldap.INVALID_CREDENTIALS({'desc': 'No such user: %s' % user })
elif len(res) > 1:
raise ldap.INVALID_CREDENTIALS({'desc': 'Too many matches: uid=%s' % user })
else:
dn = res[0][0]
return dn
def _first_bind(self):
"""Premier bind, avant de connaître le vrai dn."""
secrets = import_secrets()
self.simple_bind_s(who=secrets.ldap_readonly_auth_dn, cred=secrets.ldap_readonly_password)
def search(self, filterstr='(objectClass=*)', mode='ro', dn= base_dn, scope=ldap.SCOPE_SUBTREE, sizelimit=1000): def search(self, filterstr='(objectClass=*)', mode='ro', dn= base_dn, scope=ldap.SCOPE_SUBTREE, sizelimit=1000):
"""La fonction de recherche dans la base ldap qui renvoie un liste de """La fonction de recherche dans la base ldap qui renvoie un liste de
CransLdapObjects. On utilise la feature de sizelimit de python ldap""" CransLdapObjects. On utilise la feature de sizelimit de python ldap"""
@ -352,8 +361,19 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
class lc_ldap_test(lc_ldap): class lc_ldap_test(lc_ldap):
"""Connexion LDAP à la base de tests""" """Connexion LDAP à la base de tests"""
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
"""Oui, je droppe les paramètres""" # On impose le serveur
super(lc_ldap_test, self).__init__(uri='ldap://vo.adm.crans.org', dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32') kwargs["uri"] = 'ldap://vo.adm.crans.org'
# On pense à laisser la possibilité de se connecter par username ou dn…
if not kwargs.has_key("user"):
# … mais si rien n'est spécifié, on fournit le dn par défaut
kwargs.setdefault("dn", 'cn=admin,dc=crans,dc=org')
# Le mot de passe de la base de test
kwargs.setdefault("cred", '75bdb64f32')
super(lc_ldap_test, self).__init__(*args, **kwargs)
def _first_bind(self):
"""Sur la base de test, on peut lookup en anonyme"""
self.simple_bind_s()
class lc_ldap_admin(lc_ldap): class lc_ldap_admin(lc_ldap):
"""Connexion LDAP à la vraie base, en admin. """Connexion LDAP à la vraie base, en admin.