diff --git a/objets.py b/objets.py index 3e0615c..2867c0f 100644 --- a/objets.py +++ b/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)