[attributs] Plus nazi sur qui peut modifier les attributs userPassword, mail, homeDirectory

This commit is contained in:
Valentin Samir 2014-03-15 22:33:59 +01:00
parent 1d361ac0e5
commit ad83a5aaa3
2 changed files with 54 additions and 5 deletions

View file

@ -554,6 +554,23 @@ class mail(Attr):
category = 'mail' category = 'mail'
ldap_name = "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): def check_uniqueness(self, liste_exclue):
attr = self.__class__.__name__ attr = self.__class__.__name__
if str(self) in liste_exclue: if str(self) in liste_exclue:
@ -681,7 +698,7 @@ class droits(Attr):
singlevalue = False singlevalue = False
optional = True optional = True
legend = u"Droits sur les serveurs" 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' category = 'perso'
ldap_name = "droits" ldap_name = "droits"
@ -693,6 +710,7 @@ class droits(Attr):
def is_modifiable(self, liste_droits): def is_modifiable(self, liste_droits):
""" """
Le droit est-il modifiable par un des droits dans 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() modifiables = set()
for i in liste_droits: for i in liste_droits:
@ -700,7 +718,7 @@ class droits(Attr):
modifiables = modifiables.union(DROITS_SUPERVISEUR[i]) modifiables = modifiables.union(DROITS_SUPERVISEUR[i])
modifiables = list(modifiables) modifiables = list(modifiables)
return self.value in modifiables return self.value in modifiables and super(droits, self).is_modifiable(liste_droits)
@crans_attribute @crans_attribute
class solde(Attr): class solde(Attr):
@ -1195,9 +1213,26 @@ class homeDirectory(Attr):
singlevalue=True singlevalue=True
optional = True optional = True
unique = True unique = True
can_modify = [nounou, bureau, cableur]
legend="Le chemin du home de l'adhérent" legend="Le chemin du home de l'adhérent"
ldap_name = "homeDirectory" 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): def parse_value(self, home):
uid = unicode(self.parent['uid'][0]) uid = unicode(self.parent['uid'][0])
if uid.startswith(u'club-'): if uid.startswith(u'club-'):
@ -1276,6 +1311,23 @@ class userPassword(Attr):
legend = "Le mot de passe" legend = "Le mot de passe"
category = '' category = ''
ldap_name = "userPassword" 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 @crans_attribute
class sshFingerprint(Attr): class sshFingerprint(Attr):

View file

@ -384,9 +384,6 @@ def services_to_restart(conn, old_attrs={}, new_attrs={}, created_object=[], del
service_to_restart(conn, service, [], 0) service_to_restart(conn, service, [], 0)
# Identique à la classe dans ldap_crans.py # Identique à la classe dans ldap_crans.py
class Service: class Service:
""" Définit un service à redémarrer """ """ Définit un service à redémarrer """