From b565cc51e5f4ecebd7f5fdedf2e1eeae2e43562a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pierre-Elliott=20B=C3=A9cue?= Date: Tue, 2 Apr 2013 03:22:45 +0200 Subject: [PATCH] =?UTF-8?q?[lc=5Fldap]=20On=20interdit=20la=20modification?= =?UTF-8?q?=20d'objets=20comme=20les=20machines=20Crans=20aux=20c=C3=A2ble?= =?UTF-8?q?urs=20par=20exemple.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lc_ldap.py | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/lc_ldap.py b/lc_ldap.py index 99efc9a..49f1151 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -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