[lc_ldap] Maintenant on peut se connecter à la base de test *et* à la vraie base.

This commit is contained in:
Vincent Le Gallic 2012-10-21 03:40:00 +02:00
parent 129c4593b5
commit 42ebecd9ca

View file

@ -43,10 +43,17 @@ import config, crans_utils
from attributs import attrify, blacklist from attributs import attrify, blacklist
from ldap_locks import CransLock 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' base_dn = 'ou=data,dc=crans,dc=org'
log_dn = "cn=log" 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 # Champs à ignorer dans l'historique
HIST_IGNORE_FIELDS = ["modifiersName", "entryCSN", "modifyTimestamp", "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') return lc_ldap(uri='ldap://vo.adm.crans.org',dn='cn=admin,dc=crans,dc=org', cred='75bdb64f32')
def lc_ldap_admin(): 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""" Possible seulement si on peut lire secrets.py"""
secrets = import_secrets() secrets = import_secrets()
return lc_ldap(uri='ldap://ldap.adm.crans.org/', dn=secrets.ldap_auth_dn, cred=secrets.ldap_password) 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): class lc_ldap(ldap.ldapobject.LDAPObject):
"""Connexion à la base ldap crans, chaque instance représente une connexion """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, """Initialise la connexion ldap,
- En authentifiant avec dn et cred s'ils sont précisés - 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 - 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 le dn associé à l'uid user, et effectue l'authentification
avec ce dn et cred avec ce dn et cred
- Sinon effectue une authentification anonyme - 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) ldap.ldapobject.LDAPObject.__init__(self, uri)
if user and not re.match('[a-z_][a-z0-9_-]*', user): if user and not re.match('[a-z_][a-z0-9_-]*', user):
raise ValueError('Invalid user name: %s' % 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: if user and not dn:
if test:
# …en anonyme si on se connecte à la base de test
self.simple_bind_s(base_dn) 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) res = self.search_s(base_dn, 1, 'uid=%s' % user)
if len(res) < 1: if len(res) < 1:
raise ldap.INVALID_CREDENTIALS({'desc': 'No such user: %s' % user }) raise ldap.INVALID_CREDENTIALS({'desc': 'No such user: %s' % user })