[lc_ldap] On vérifie désormais que $dude peut modifier les attributs.

Les principales modifs touchent __setitem__, il faut voir s'il n'y a pas mieux
pour les histoires de cardinalité, quitte à réécrire des choses. Par ailleurs,
j'ai l'impression que le test sur les attributs nécessaires/optionnels
ne sert à rien, il faut voir comment on veut gérer ça.
This commit is contained in:
Pierre-Elliott Bécue 2013-04-03 02:51:46 +02:00
parent b565cc51e5
commit 93d5a11d66
2 changed files with 34 additions and 7 deletions

View file

@ -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