From 8572d8e2e7f29896e689cacf025bd50a70c0bce5 Mon Sep 17 00:00:00 2001 From: Vincent Le Gallic Date: Sun, 3 Mar 2013 23:49:41 +0100 Subject: [PATCH] =?UTF-8?q?Surcharges=20diverses=20de=20la=20classe=20lc?= =?UTF-8?q?=5Fldap=20plut=C3=B4t=20que=20des=20fonctions.=20+=20R=C3=A9par?= =?UTF-8?q?ation=20de=20la=20connexion=20=C3=A0=20la=20base=20de=20test.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lc_ldap.py | 79 +++++++++++++++++++++++++++--------------------------- 1 file changed, 40 insertions(+), 39 deletions(-) diff --git a/lc_ldap.py b/lc_ldap.py index b2c26a8..1b3a26f 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -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