[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:
parent
b565cc51e5
commit
93d5a11d66
2 changed files with 34 additions and 7 deletions
37
lc_ldap.py
37
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
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue