[lc_ldap] On interdit la modification d'objets comme les machines

Crans aux câbleurs par exemple.
This commit is contained in:
Pierre-Elliott Bécue 2013-04-02 03:22:45 +02:00
parent 90a0b565cc
commit b565cc51e5

View file

@ -92,6 +92,8 @@ def escape(chaine):
dans une requête ldap.""" dans une requête ldap."""
return ldap.filter.escape_filter_chars(chaine) return ldap.filter.escape_filter_chars(chaine)
# A priori, ldif_to_uldif et ldif_to_cldif sont obsolètes,
# du fait de l'apparition de AttrsDict dans attributs.py
def ldif_to_uldif(ldif): def ldif_to_uldif(ldif):
""" """
Transforme un dictionnaire ldif en un dictionnaire Transforme un dictionnaire ldif en un dictionnaire
@ -270,7 +272,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
# Tout doit disparaître !! # Tout doit disparaître !!
machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif) machine = self._create_entity('mid=%s,%s' % (uldif['mid'][0], parent), uldif)
if machine.may_be(created, self.droits + self._is_parent(machine)): if machine.may_be(created, self.droits + self._is_parent(machine.dn)):
machine.create() machine.create()
else: else:
raise EnvironmentError("Vous n'avez pas le droit de créer cette machine.") raise EnvironmentError("Vous n'avez pas le droit de créer cette machine.")
@ -335,26 +337,26 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
i = nonfree[-1]+1 i = nonfree[-1]+1
return i return i
def _is_parent(self, obj): def _is_parent(self, objdn):
""" """
Teste le lien de parenté de l'objet 1 sur l'objet 2. Teste le rapport entre le dn fourni et self
Retourne une liste qui s'ajoutera à la liste des droits Retourne une liste qui s'ajoutera à la liste des droits
""" """
if obj.dn.endswith(self.dn) and obj.dn != self.dn: if objdn.endswith(self.dn) and objdn != self.dn:
return [attributs.parent] return [attributs.parent]
else: else:
return [] return []
def _is_self(self, obj): def _is_self(self, objdn):
""" """
Teste si l'objet qui se binde est celui qui est en cours de modif. Teste si le dn fourni est celui de self.
Retourne une liste qui s'ajoutera à la liste des droits Retourne une liste qui s'ajoutera à la liste des droits
""" """
if obj.dn == self.dn: if objdn == self.dn:
return [attributs.soi] return [attributs.soi]
else: else:
return [] return []
@ -450,16 +452,15 @@ class CransLdapObject(object):
recherche dans la base ldap. recherche dans la base ldap.
''' '''
self.mode = mode if not isinstance(conn, lc_ldap):
raise TypeError("conn doit être une instance de lc_ldap")
self.conn = conn
self.attrs = attributs.AttrsDict(conn) # Contient un dico uldif qui doit représenter ce qui self.attrs = attributs.AttrsDict(conn) # Contient un dico uldif qui doit représenter ce qui
# est dans la base. On attrify paresseusement au moment où on utilise un attribut # est dans la base. On attrify paresseusement au moment où on utilise un attribut
self._modifs = None # C'est là qu'on met les modifications self._modifs = None # C'est là qu'on met les modifications
if not isinstance(conn, lc_ldap):
raise TypeError("conn doit être une instance de lc_ldap")
self.conn = conn
self.dn = dn self.dn = dn
orig = {} orig = {}
@ -486,6 +487,12 @@ class CransLdapObject(object):
self._modifs = attributs.AttrsDict(self.conn, res[0][1], check_ctxt = False) self._modifs = attributs.AttrsDict(self.conn, res[0][1], check_ctxt = False)
if mode in ['w', 'rw']:
if not self.may_be(modified, self.conn.droits + self.conn._is_parent(dn) + self.conn._is_self(dn)):
raise EnvironmentError("Vous n'avez pas le droit de modifier cet objet.")
self.mode = mode
# Je m'interroge sur la pertinence de cette partie, je pense qu'elle n'est # Je m'interroge sur la pertinence de cette partie, je pense qu'elle n'est
# pas utile. -- PEB 27/01/2013 # pas utile. -- PEB 27/01/2013
if mode in ['w', 'rw']: if mode in ['w', 'rw']:
@ -528,7 +535,6 @@ class CransLdapObject(object):
# Requête LDAP de création de l'objet # Requête LDAP de création de l'objet
self.conn.add_s(self.dn, modlist) self.conn.add_s(self.dn, modlist)
def save(self): def save(self):
"""Sauvegarde dans la base les modifications apportées à l'objet. """Sauvegarde dans la base les modifications apportées à l'objet.
Interne: Vérifie que ``self._modifs`` contient des valeurs correctes et Interne: Vérifie que ``self._modifs`` contient des valeurs correctes et