[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).
This commit is contained in:
Valentin Samir 2014-11-09 15:53:10 +01:00
parent 629310d356
commit 45c3f68635

View file

@ -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))
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