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:
parent
f910c550ed
commit
e1079463fc
2 changed files with 24 additions and 63 deletions
86
attributs.py
86
attributs.py
|
@ -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__ = ()
|
||||
|
|
|
@ -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:
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue