diff --git a/attributs.py b/attributs.py index ed5b39d..d4808aa 100644 --- a/attributs.py +++ b/attributs.py @@ -186,6 +186,8 @@ class Attr(object): etc...""" if self.singlevalue and len(values) > 1: raise ValueError('%s doit avoir au maximum une valeur (affecte %s)' % (self.__class__, values)) + # A priori, ça sert à rien, on fait du for val in values, si la liste + # est vide, le type d'attribut généré n'est pas pris en compte. if not self.optional and len(values) == 0: raise ValueError('%s doit avoir au moins une valeur' % self.__class__) @@ -209,7 +211,7 @@ class Attr(object): """ L'attribut est-il modifiable par un des droits dans liste_droits ? """ - return set(liste_droits).isdisjoint(self.can_modify) + return not set(liste_droits).isdisjoint(self.can_modify) class objectClass(Attr): singlevalue = False diff --git a/lc_ldap.py b/lc_ldap.py index 49f1151..eea588c 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -272,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.dn)): + if machine.may_be(created, self.droits + self._check_parent(machine.dn)): machine.create() else: raise EnvironmentError("Vous n'avez pas le droit de créer cette machine.") @@ -337,7 +337,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): i = nonfree[-1]+1 return i - def _is_parent(self, objdn): + def _check_parent(self, objdn): """ Teste le rapport entre le dn fourni et self Retourne une liste qui s'ajoutera à la liste des droits @@ -350,7 +350,7 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): return [] - def _is_self(self, objdn): + def _check_self(self, objdn): """ Teste si le dn fourni est celui de self. Retourne une liste qui s'ajoutera à la liste des droits @@ -488,7 +488,7 @@ class CransLdapObject(object): 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)): + if not self.may_be(modified, self.conn.droits + self.conn._check_parent(dn) + self.conn._check_self(dn)): raise EnvironmentError("Vous n'avez pas le droit de modifier cet objet.") self.mode = mode @@ -531,7 +531,7 @@ class CransLdapObject(object): de le faire.""" # Création de la requête LDAP - modlist = addModlist(cldif_to_ldif(self.attrs)) + modlist = addModlist(cldif_to_ldif(self._modifs)) # Requête LDAP de création de l'objet self.conn.add_s(self.dn, modlist) @@ -602,11 +602,36 @@ class CransLdapObject(object): return attr in [attrib.__name__ for attrib in self.attribs] def __setitem__(self, attr, values): + """Permet d'affecter des valeurs à l'objet comme + s'il était un dictionnaire.""" + # Quand on est pas en mode d'écriture, ça plante. if self.mode not in ['w', 'rw']: raise ValueError("Objet en lecture seule") + # Les valeurs sont nécessairement stockées en liste if not isinstance(values, list): values = [ values ] - self._modifs[attr] = [ attributs.attrify(val, attr, self._modifs, self.conn) for val in values ] + + # On génére une liste des attributs, le dictionnaire ldif + # sert à permettre les vérifications de cardinalité + # (on peut pas utiliser self._modifs, car il ne faut + # faire le changement que si on peut) + + # Sans le dict(), les deux pointent vers le même truc. + ldif = dict(self._modifs) + # On doit encoder, car _modifs est un ensemble de données brutes + # comme tout ldif + ldif[attr] = [ value.encode('utf-8') for value in values ] + attrs_before_verif = [ attributs.attrify(val, attr, ldif, self.conn) for val in values ] + + # On groupe les attributs précédents, et les nouveaux + mixed_attrs = attrs_before_verif + self.attrs[attr] + # Si c'est vide, on fait pas de vérifs, on avait une liste + # vide avant, puis on en a une nouvelle après. + if mixed_attrs: + # Tests de droits. + if not mixed_attrs[0].is_modifiable(self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)): + raise EnvironmentError("Vous ne pouvez pas toucher aux attributs de type %r." % (attr)) + self._modifs[attr] = attrs_before_verif def search_historique(self, ign_fields=HIST_IGNORE_FIELDS): u"""Récupère l'historique