[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."""
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):
"""
Transforme un dictionnaire ldif en un dictionnaire
@ -270,7 +272,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object):
# Tout doit disparaître !!
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()
else:
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
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
"""
if obj.dn.endswith(self.dn) and obj.dn != self.dn:
if objdn.endswith(self.dn) and objdn != self.dn:
return [attributs.parent]
else:
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
"""
if obj.dn == self.dn:
if objdn == self.dn:
return [attributs.soi]
else:
return []
@ -450,16 +452,15 @@ class CransLdapObject(object):
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
# 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
if not isinstance(conn, lc_ldap):
raise TypeError("conn doit être une instance de lc_ldap")
self.conn = conn
self.dn = dn
orig = {}
@ -485,6 +486,12 @@ class CransLdapObject(object):
orig = res[0][1]
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
# pas utile. -- PEB 27/01/2013
@ -528,7 +535,6 @@ class CransLdapObject(object):
# Requête LDAP de création de l'objet
self.conn.add_s(self.dn, modlist)
def save(self):
"""Sauvegarde dans la base les modifications apportées à l'objet.
Interne: Vérifie que ``self._modifs`` contient des valeurs correctes et