[objets] Méthode pour donner les droits de l'utilisateur courrant un cransLdapObject

On en profite pour simplifier les appels à may_be
This commit is contained in:
Valentin Samir 2014-03-21 09:12:31 +01:00
parent 8a6e93a38a
commit ed3b43073c

View file

@ -115,6 +115,17 @@ class CransLdapObject(object):
"""
pass
def rights(self):
"""
Retourne les droits courant de l'utilisateur sur l'objet.
Ces droits sont égaux aux droits de l'utilisateur plus :
* soi si le dn de l'utilisateur est égale au dn de l'objet
* parent si le dn de l'utilisateur est préfixe du dn de l'objet
la méthode est en anglais pour ne pas interférer avec les attributs droits et jinja2
les méthodes de l'objet et ses attributs sont appelé de la même manière
"""
return self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)
def __init__(self, conn, dn, mode='ro', uldif=None, lockId=None):
'''
Créée une instance d'un objet Crans (machine, adhérent,
@ -160,7 +171,7 @@ class CransLdapObject(object):
mode = 'ro'
if mode in ['w', 'rw']:
if not self.may_be(variables.modified, self.conn.droits + self.conn._check_parent(dn) + self.conn._check_self(dn)):
if not self.may_be(variables.modified):
raise EnvironmentError("Vous n'avez pas le droit de modifier cet objet.")
self.mode = mode
@ -360,8 +371,8 @@ class CransLdapObject(object):
self.save()
# On produit un ldif
ldif = u"dn: %s\n" % self.dn
for key in self.attrs.keys():
for value in self.attrs[key]:
for key in self.keys():
for value in self[key]:
ldif += u"%s: %s\n" % (key, value)
file = "%s %s" % (datetime.datetime.now(), self.dn)
@ -379,7 +390,7 @@ class CransLdapObject(object):
login = self.conn.current_login
if self.mode not in ['w', 'rw']:
raise EnvironmentError("Objet en lecture seule, réessayer en lecture/écriture")
if not self.may_be(variables.deleted, self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)):
if not self.may_be(variables.deleted):
raise EnvironmentError("Vous n'avez pas le droit de supprimer %s." % self.dn)
if not self.in_context:
# forcer l'utilisation d'un context manager permet d'être certain que les locks seront libéré quoi qu'il arrive
@ -438,13 +449,15 @@ class CransLdapObject(object):
if differences:
raise EnvironmentError("Les modifications apportées à l'objet %s n'ont pas été correctement sauvegardées\n%s" % (self.dn, differences))
def may_be(self, what, liste):
def may_be(self, what, liste=None):
"""Teste si liste peut faire ce qui est dans what, pour
what élément de {create, delete, modify}.
On passe une liste de droits plutôt que l'objet car il faut ajouter
les droits soi et parent.
Retourne un booléen
"""
if liste is None:
liste = self.rights()
if set(liste).intersection(self.can_be_by[what]) != set([]):
return True
else:
@ -702,7 +715,7 @@ class proprio(CransLdapObject):
def delete_compte(self, mail):
# Je pense qu'en pratique cette vérification ne sert à rien puisqu'on se fera jetter à la tentative de modification
# de userPassword, mail, homeDirectory, canonicalAlias, etc…
if not self.may_be(variables.deleted, self.conn.droits + self.conn._check_parent(self.dn) + self.conn._check_self(self.dn)):
if not self.may_be(variables.deleted):
raise EnvironmentError("Vous n'avez pas le droit de supprimer %s et donc vous ne pouvez supprimer son compte." % self.dn)
if not u'cransAccount' in self['objectClass']:
raise EnvironmentError("L'adhérent n'a pas de compte crans")
@ -781,13 +794,15 @@ class proprio(CransLdapObject):
else:
raise EnvironmentError("L'adhérent n'a pas de compte crans")
def may_be(self, what, liste):
def may_be(self, what, liste=None):
"""Teste si liste peut faire ce qui est dans what, pour
what élément de {create, delete, modify}.
On passe une liste de droits plutôt que l'objet car il faut ajouter
les droits soi et parent.
Retourne un booléen
"""
if liste is None:
liste = self.rights()
# On ne peut supprimer un objet que si on a au moins autant de droit que lui
if what == variables.deleted:
modifiables = set()
@ -883,7 +898,7 @@ class proprio(CransLdapObject):
login = self.conn.current_login
if self.mode not in ['w', 'rw']:
raise EnvironmentError("Objet en lecture seule, réessayer en lecture/écriture")
if not self.may_be(variables.deleted, self.conn.droits):
if not self.may_be(variables.deleted):
raise EnvironmentError("Vous n'avez pas le droit de supprimer %s." % self.dn)
for machine in self.machines():
machine.delete(comm, login)
@ -1057,7 +1072,7 @@ class machine(CransLdapObject):
login = self.conn.current_login
if self.mode not in ['w', 'rw']:
raise EnvironmentError("Objet en lecture seule, réessayer en lecture/écriture")
if not self.may_be(variables.deleted, self.conn.droits + self.conn._check_parent(self.dn)):
if not self.may_be(variables.deleted):
raise EnvironmentError("Vous n'avez pas le droit de supprimer %s." % self.dn)
for certificat in self.certificats():
certificat.delete(comm, login)