Les attributs autres que droits ne doivent pas être non-modifiables par "soi" par défaut.

* En gros, si on met "soi" dans can_modify, l'adh doit pouvoir changer
   seul ledit attribut. droits est la seule exception parce que le test
   qest différent.
This commit is contained in:
Pierre-Elliott Bécue 2015-03-08 01:16:30 +01:00
parent f910c550ed
commit e1079463fc
2 changed files with 24 additions and 63 deletions

View file

@ -116,7 +116,6 @@ class OptionalError(EnvironmentError):
"""Erreur levée si on essaye de créer un objet sans fournir un attribut obligatoire.""" """Erreur levée si on essaye de créer un objet sans fournir un attribut obligatoire."""
pass pass
def attrify(val, attr, conn, Parent=None): def attrify(val, attr, conn, Parent=None):
"""Transforme un n'importe quoi en :py:class:`Attr`. """Transforme un n'importe quoi en :py:class:`Attr`.
@ -353,7 +352,6 @@ class Attr(object):
""" """
return not set(liste_droits).isdisjoint(self.can_modify) return not set(liste_droits).isdisjoint(self.can_modify)
class AttributeFactory(object): class AttributeFactory(object):
"""Utilisée pour enregistrer toutes les classes servant à instancier un attribut LDAP. """Utilisée pour enregistrer toutes les classes servant à instancier un attribut LDAP.
Elle sert à les récupérer à partir de leur nom LDAP. Elle sert à les récupérer à partir de leur nom LDAP.
@ -385,6 +383,25 @@ def crans_attribute(classe):
AttributeFactory.register(classe.ldap_name, classe) AttributeFactory.register(classe.ldap_name, classe)
return classe return classe
class rightProtectedAttr(Attr):
__slots__ = ()
def is_modifiable(self, liste_droits):
"""
On permet la modification à un utilisateur
"""
if not soi in liste_droits:
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 and droit in TOUS_DROITS:
return False
return super(rightProtectedAttr, self).is_modifiable(liste_droits)
@crans_attribute @crans_attribute
class objectClass(Attr): class objectClass(Attr):
__slots__ = () __slots__ = ()
@ -408,7 +425,6 @@ class objectClass(Attr):
else: else:
self.value = unicode(val) self.value = unicode(val)
class intAttr(Attr): class intAttr(Attr):
__slots__ = () __slots__ = ()
python_type = int python_type = int
@ -681,7 +697,6 @@ class debutAdhesion(generalizedTimeFormat):
can_modify = [cableur, nounou] can_modify = [cableur, nounou]
ldap_name = 'debutAdhesion' ldap_name = 'debutAdhesion'
@crans_attribute @crans_attribute
class finAdhesion(generalizedTimeFormat): class finAdhesion(generalizedTimeFormat):
__slots__ = () __slots__ = ()
@ -707,7 +722,7 @@ class finConnexion(generalizedTimeFormat):
ldap_name = 'finConnexion' ldap_name = 'finConnexion'
@crans_attribute @crans_attribute
class mail(Attr): class mail(rightProtectedAttr):
__slots__ = () __slots__ = ()
singlevalue = False singlevalue = False
optional = False optional = False
@ -717,23 +732,6 @@ 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 and droit in TOUS_DROITS:
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:
@ -761,7 +759,6 @@ class mail(Attr):
raise ValueError("%s invalide %r" % (self.legend, mail)) raise ValueError("%s invalide %r" % (self.legend, mail))
self.value = mail self.value = mail
@crans_attribute @crans_attribute
class canonicalAlias(mail): class canonicalAlias(mail):
__slots__ = () __slots__ = ()
@ -886,7 +883,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 and super(droits, self).is_modifiable(liste_droits) return (nounou in liste_droits or self.value in modifiables) and super(droits, self).is_modifiable(liste_droits)
@crans_attribute @crans_attribute
class solde(floatAttr): class solde(floatAttr):
@ -971,7 +968,6 @@ class macAddress(Attr):
else: else:
self.value = format_mac(mac) self.value = format_mac(mac)
def __unicode__(self): def __unicode__(self):
return unicode(self.value).lower() return unicode(self.value).lower()
@ -1204,7 +1200,6 @@ class exempt(Attr):
def __unicode__(self): def __unicode__(self):
return unicode(self.value) return unicode(self.value)
@crans_attribute @crans_attribute
class nombrePrises(intAttr): class nombrePrises(intAttr):
__slots__ = () __slots__ = ()
@ -1435,7 +1430,7 @@ class charteMA(boolAttr):
ldap_name = "charteMA" ldap_name = "charteMA"
@crans_attribute @crans_attribute
class homeDirectory(Attr): class homeDirectory(rightProtectedAttr):
__slots__ = () __slots__ = ()
singlevalue=True singlevalue=True
optional = True optional = True
@ -1444,22 +1439,6 @@ class homeDirectory(Attr):
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 and droit in TOUS_DROITS:
return False
return super(homeDirectory, self).is_modifiable(liste_droits)
@crans_attribute @crans_attribute
class loginShell(Attr): class loginShell(Attr):
__slots__ = () __slots__ = ()
@ -1506,32 +1485,16 @@ class gecos(Attr):
ldap_name = "gecos" ldap_name = "gecos"
@crans_attribute @crans_attribute
class userPassword(Attr): class userPassword(rightProtectedAttr):
__slots__ = () __slots__ = ()
singlevalue = False singlevalue = False
optional = True optional = True
legend = "Le mot de passe" legend = "Le mot de passe"
category = '' category = ''
ldap_name = "userPassword" ldap_name = "userPassword"
can_modify = [nounou, bureau, cableur] can_modify = [nounou, bureau, cableur, soi]
historique = "info" historique = "info"
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 and droit in TOUS_DROITS:
return False
return super(userPassword, self).is_modifiable(liste_droits)
@crans_attribute @crans_attribute
class sshFingerprint(Attr): class sshFingerprint(Attr):
__slots__ = () __slots__ = ()
@ -1930,7 +1893,6 @@ class xid(intAttr):
can_modify = [] can_modify = []
legend = "Identifiant du certificat" legend = "Identifiant du certificat"
@crans_attribute @crans_attribute
class hostCert(dnsAttr): class hostCert(dnsAttr):
__slots__ = () __slots__ = ()

View file

@ -673,7 +673,6 @@ class CransLdapObject(object):
if not mixed_attrs[0].is_modifiable(self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)): 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 modifier l'attribut %r de l'objet %r." % (attr, self)) raise EnvironmentError("Vous ne pouvez pas modifier l'attribut %r de l'objet %r." % (attr, self))
# On ajoute des locks sur les nouvelles valeurs # On ajoute des locks sur les nouvelles valeurs
locked = [] locked = []
try: try: