From ad83a5aaa3606e1ecb74b72c0495feed7b5db71c Mon Sep 17 00:00:00 2001 From: Valentin Samir Date: Sat, 15 Mar 2014 22:33:59 +0100 Subject: [PATCH] [attributs] Plus nazi sur qui peut modifier les attributs userPassword, mail, homeDirectory --- attributs.py | 56 ++++++++++++++++++++++++++++++++++++++++++++++++++-- services.py | 3 --- 2 files changed, 54 insertions(+), 5 deletions(-) diff --git a/attributs.py b/attributs.py index e645787..13f5ebc 100644 --- a/attributs.py +++ b/attributs.py @@ -554,6 +554,23 @@ class mail(Attr): category = 'mail' ldap_name = "mail" + def is_modifiable(self, liste_droits): + """ + Une adresse mail n'est modifiable que si on a au moins autant de droits + que la personne à qui est l'adresse mail + """ + modifiables = set() + for i in liste_droits: + if i in DROITS_SUPERVISEUR: + modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) + modifiables = list(modifiables) + + for droit in self.parent.get('droits', []): + if droit not in modifiables: + return False + return super(mail, self).is_modifiable(liste_droits) + + def check_uniqueness(self, liste_exclue): attr = self.__class__.__name__ if str(self) in liste_exclue: @@ -681,7 +698,7 @@ class droits(Attr): singlevalue = False optional = True legend = u"Droits sur les serveurs" - can_modify = [nounou, bureau] #ne sert à rien ici, mais c'est tout à fait exceptionnel + can_modify = [nounou, bureau] category = 'perso' ldap_name = "droits" @@ -693,6 +710,7 @@ class droits(Attr): def is_modifiable(self, liste_droits): """ Le droit est-il modifiable par un des droits dans liste_droits ? + L'idée étant que pour modifier un droit, il faut avoir un droit plus fort """ modifiables = set() for i in liste_droits: @@ -700,7 +718,7 @@ class droits(Attr): modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) modifiables = list(modifiables) - return self.value in modifiables + return self.value in modifiables and super(droits, self).is_modifiable(liste_droits) @crans_attribute class solde(Attr): @@ -1195,9 +1213,26 @@ class homeDirectory(Attr): singlevalue=True optional = True unique = True + can_modify = [nounou, bureau, cableur] legend="Le chemin du home de l'adhérent" ldap_name = "homeDirectory" + def is_modifiable(self, liste_droits): + """ + Une adresse mail n'est modifiable que si on a au moins autant de droits + que la personne à qui est l'adresse mail + """ + modifiables = set() + for i in liste_droits: + if i in DROITS_SUPERVISEUR: + modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) + modifiables = list(modifiables) + + for droit in self.parent.get('droits', []): + if droit not in modifiables: + return False + return super(homeDirectory, self).is_modifiable(liste_droits) + def parse_value(self, home): uid = unicode(self.parent['uid'][0]) if uid.startswith(u'club-'): @@ -1276,6 +1311,23 @@ class userPassword(Attr): legend = "Le mot de passe" category = '' ldap_name = "userPassword" + can_modify = [nounou, bureau, cableur] + + def is_modifiable(self, liste_droits): + """ + Le mot de passe n'est modifiable que si on a au moins autant de droits + que la personne à qui est le mot de passe + """ + modifiables = set() + for i in liste_droits: + if i in DROITS_SUPERVISEUR: + modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) + modifiables = list(modifiables) + + for droit in self.parent.get('droits', []): + if droit not in modifiables: + return False + return super(userPassword, self).is_modifiable(liste_droits) @crans_attribute class sshFingerprint(Attr): diff --git a/services.py b/services.py index 4711d2c..e9af93c 100644 --- a/services.py +++ b/services.py @@ -384,9 +384,6 @@ def services_to_restart(conn, old_attrs={}, new_attrs={}, created_object=[], del service_to_restart(conn, service, [], 0) - - - # Identique à la classe dans ldap_crans.py class Service: """ Définit un service à redémarrer """