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."""
|
"""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__ = ()
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue