Surcharges diverses de la classe lc_ldap plutôt que des fonctions. + Réparation de la connexion à la base de test.

This commit is contained in:
Vincent Le Gallic 2013-03-03 23:49:41 +01:00
parent 8814ddd1e7
commit 8572d8e2e7

View file

@ -64,6 +64,7 @@ from ldap_locks import CransLock
uri = 'ldap://ldap.adm.crans.org/'
base_dn = 'ou=data,dc=crans,dc=org'
log_dn = "cn=log"
admin_dn = "cn=admin,dc=crans,dc=org"
# Protection contre les typos
created = 'created'
@ -121,35 +122,7 @@ def cldif_to_ldif(cldif):
ldif[attr] = [ str(val) for val in vals ]
return ldif
def lc_ldap_test():
"""Binding LDAP à la base de tests"""
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 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)
def lc_ldap_self():
"""Binding LDAP en lecture seule sur la base locale.
L'idée est que les machines avec un réplica bossent
avec elles-mêmes pour la lecture, pas avec vert."""
if os.path.exists('/var/run//slapd/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fslapd%2fldapi/'
auth_dn = auth_pw = ""
elif os.path.exists('/var/run/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
auth_dn = auth_pw = ""
else:
secrets = import_secrets()
ro_uri = 'ldap://127.0.0.1'
auth_dn = secrets.ldap_readonly_auth_dn
auth_pw = secrets.ldap_readonly_password
return lc_ldap(uri=ro_uri, dn=auth_dn, cred=auth_pw)
class lc_ldap(ldap.ldapobject.LDAPObject):
class lc_ldap(ldap.ldapobject.LDAPObject, object):
"""Connexion à la base ldap crans, chaque instance représente une connexion
"""
def __init__(self, dn=None, user=None, cred=None, uri=uri, test=False):
@ -170,13 +143,8 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
# Si un username, on récupère le dn associé…
if user and not 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)
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 })
@ -188,11 +156,11 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
# Si on a un dn, on se connecte avec à la base ldap sinon on s'y
# connecte en anonyme
if dn:
secrets = import_secrets()
self.conn = self.bind_s(secrets.ldap_auth_dn, secrets.ldap_password)
#secrets = import_secrets()
self.conn = self.bind_s(dn, cred)
self.dn = dn
self.droits = self.search_s(dn, ldap.SCOPE_BASE, attrlist=['droits'])[0][1].get('droits', [])
if dn == secrets.ldap_auth_dn:
if dn == admin_dn:
self.droits += [nounou]
else:
self.conn = self.simple_bind_s()
@ -381,6 +349,39 @@ class lc_ldap(ldap.ldapobject.LDAPObject):
return []
class lc_ldap_test(lc_ldap):
"""Connexion LDAP à la base de tests"""
def __init__(self, *args, **kwargs):
"""Oui, je droppe les paramètres"""
super(lc_ldap_test, self).__init__(uri='ldap://vo.adm.crans.org', dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32')
class lc_ldap_admin(lc_ldap):
"""Connexion LDAP à la vraie base, en admin.
Possible seulement si on peut lire secrets.py"""
def __init__(self):
secrets = import_secrets()
super(lc_ldap_admin, self).__init__(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn, cred=secrets.ldap_password)
class lc_ldap_local(lc_ldap):
"""Connexion LDAP en lecture seule sur la base locale.
L'idée est que les machines avec un réplica bossent
avec elles-mêmes pour la lecture, pas avec vert."""
def __init__(self):
if os.path.exists('/var/run/slapd/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fslapd%2fldapi/'
auth_dn = auth_pw = ""
elif os.path.exists('/var/run/ldapi'):
ro_uri = 'ldapi://%2fvar%2frun%2fldapi/'
auth_dn = auth_pw = ""
else:
secrets = import_secrets()
ro_uri = 'ldap://127.0.0.1'
auth_dn = secrets.ldap_readonly_auth_dn
auth_pw = secrets.ldap_readonly_password
super(lc_ldap_local, self).__init__(uri=ro_uri, dn=auth_dn, cred=auth_pw)
def new_cransldapobject(conn, dn, mode='ro', ldif = None):
"""Crée un objet CransLdap en utilisant la classe correspondant à
l'objectClass du ldif