[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:
parent
8a6e93a38a
commit
ed3b43073c
1 changed files with 24 additions and 9 deletions
33
objets.py
33
objets.py
|
@ -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
|
||||
où 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)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue