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."""
pass
def attrify(val, attr, conn, Parent=None):
"""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)
class AttributeFactory(object):
"""Utilisée pour enregistrer toutes les classes servant à instancier un attribut 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)
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
class objectClass(Attr):
__slots__ = ()
@ -408,7 +425,6 @@ class objectClass(Attr):
else:
self.value = unicode(val)
class intAttr(Attr):
__slots__ = ()
python_type = int
@ -681,7 +697,6 @@ class debutAdhesion(generalizedTimeFormat):
can_modify = [cableur, nounou]
ldap_name = 'debutAdhesion'
@crans_attribute
class finAdhesion(generalizedTimeFormat):
__slots__ = ()
@ -707,7 +722,7 @@ class finConnexion(generalizedTimeFormat):
ldap_name = 'finConnexion'
@crans_attribute
class mail(Attr):
class mail(rightProtectedAttr):
__slots__ = ()
singlevalue = False
optional = False
@ -717,23 +732,6 @@ 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 and droit in TOUS_DROITS:
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:
@ -761,7 +759,6 @@ class mail(Attr):
raise ValueError("%s invalide %r" % (self.legend, mail))
self.value = mail
@crans_attribute
class canonicalAlias(mail):
__slots__ = ()
@ -886,7 +883,7 @@ class droits(Attr):
modifiables = modifiables.union(DROITS_SUPERVISEUR[i])
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
class solde(floatAttr):
@ -971,7 +968,6 @@ class macAddress(Attr):
else:
self.value = format_mac(mac)
def __unicode__(self):
return unicode(self.value).lower()
@ -1204,7 +1200,6 @@ class exempt(Attr):
def __unicode__(self):
return unicode(self.value)
@crans_attribute
class nombrePrises(intAttr):
__slots__ = ()
@ -1435,7 +1430,7 @@ class charteMA(boolAttr):
ldap_name = "charteMA"
@crans_attribute
class homeDirectory(Attr):
class homeDirectory(rightProtectedAttr):
__slots__ = ()
singlevalue=True
optional = True
@ -1444,22 +1439,6 @@ class homeDirectory(Attr):
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 and droit in TOUS_DROITS:
return False
return super(homeDirectory, self).is_modifiable(liste_droits)
@crans_attribute
class loginShell(Attr):
__slots__ = ()
@ -1506,32 +1485,16 @@ class gecos(Attr):
ldap_name = "gecos"
@crans_attribute
class userPassword(Attr):
class userPassword(rightProtectedAttr):
__slots__ = ()
singlevalue = False
optional = True
legend = "Le mot de passe"
category = ''
ldap_name = "userPassword"
can_modify = [nounou, bureau, cableur]
can_modify = [nounou, bureau, cableur, soi]
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
class sshFingerprint(Attr):
__slots__ = ()
@ -1930,7 +1893,6 @@ class xid(intAttr):
can_modify = []
legend = "Identifiant du certificat"
@crans_attribute
class hostCert(dnsAttr):
__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)):
raise EnvironmentError("Vous ne pouvez pas modifier l'attribut %r de l'objet %r." % (attr, self))
# On ajoute des locks sur les nouvelles valeurs
locked = []
try: