Commit 45c3f686 authored by Valentin Samir's avatar Valentin Samir

[objets] Correction du retour en arrière du commmit 629310d3 sur ressucite

On vérifier que l'objet de la base ldap n'avait pas été modifier entre le moment
où on l'a récupéré etle moment où on acquière le lock. Bien sûr si l'objet n'existe pas
dans la base ldap, il n'y a pas de problème.

Dans le cas où on ressucieterai un objet qui existe déjà dans la base ldap,
ça planterait sans doute. M'enfin, ce cas doit être extrèmement rare compte tenu
du fait que les aid et mid sont croissant (mais hélas, pas strictement).
parent 629310d3
......@@ -602,9 +602,13 @@ class CransLdapObject(object):
cranslib.deprecated.usage("Des locks ne devrait être ajoutés que dans un context manager", level=2)
self.conn.lockholder.addlock("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId)
locked.append(("dn", "%s_%s" % (self.dn.replace('=', '-').replace(',','_'), attr), self.lockId))
# une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps
if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []):
raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr)
try:
# une fois le lock acquit, on vérifie que l'attribut n'a pas été édité entre temps
if self.conn.search(dn=self.dn, scope=0)[0].get(attr, []) != self.attrs.get(attr, []):
raise ldap_locks.LockError("L'attribut %s a été modifié dans la base ldap avant l'acquisition du lock" % attr)
# L'objet n'existe pas dans la base ldap (resurection par exemple), donc pas de problème
except ldap.NO_SUCH_OBJECT:
pass
except ldap_locks.LockError:
# Si on ne parvient pas à prendre le lock pour l'une des valeurs
# on libère les locks pris jusque là et on propage l'erreur
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment