diff --git a/attributs.py b/attributs.py index 5358be2..eaeea22 100644 --- a/attributs.py +++ b/attributs.py @@ -351,9 +351,7 @@ class Attr(object): raise UniquenessError("%s déjà existant" % attr, [r.dn for r in res]) def is_modifiable(self, liste_droits): - """ - L'attribut est-il modifiable par un des droits dans liste_droits ? - """ + """L'attribut est-il modifiable par un des droits dans liste_droits ?""" return not set(liste_droits).isdisjoint(self.can_modify) class AttributeFactory(object): @@ -394,13 +392,26 @@ class rightProtectedAttr(Attr): """ On permet la modification à un utilisateur """ + # Si on est soi-même, on peut changer son mot de passe sans condition if not soi in liste_droits: + modifiables = set() + + # On regarde la liste des droits qu'a la connexion courante, ce sont a priori + # les droits de l'utilisateur qui modifie le mot de passe, ajoutés de soi/parent + # les cas échéants. for i in liste_droits: + + # Si le droit est un droit "superviseur" (ie ayant le droit de modifier certains + # utilisateurs ayant un des droits "supervisés", on ajoute la liste des droits + # supervisés aux droits modifiables if i in DROITS_SUPERVISEUR: modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) modifiables = list(modifiables) + # On prend les droits de l'utilisateur dont on cherche à modifier le mot de passe + # et on les compare à la liste des droits que l'utilisateur qui modifie a le droit + # de modifier. S'il y en a un qui n'est pas dans la liste des droits modifiables, on jette. for droit in self.parent.get('droits', []): if droit not in modifiables and droit in TOUS_DROITS: return False