diff --git a/lc_ldap.py b/lc_ldap.py index 4d1c28f..7959f4f 100644 --- a/lc_ldap.py +++ b/lc_ldap.py @@ -391,33 +391,43 @@ class lc_ldap(ldap.ldapobject.LDAPObject, object): def _find_id(self, attr, realm=None): '''Trouve un id libre. Si une plage est fournie, cherche l'id dans celle-ci, sinon, prend le plus élevé possible.''' - # On essaye de récupérer le dernier id si on l'a déjà vu passé - try: - last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip() - except IOError: - last_id = 0 - # On récupère tous les id plus grand que le dernier que l'on connait - res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s>=%s' % (attr, last_id), attrlist = [attr]) - # Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent) - if res == []: + plage = None + # On récupère la plage des ids + if realm != None: + plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]]) + + # Si plage vaut None, on veux un id strictement croissant + if plage is None: + # On essaye de récupérer le dernier id si on l'a déjà vu passer + try: + last_id = open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid())).read().strip() + except IOError: + last_id = 0 + # On récupère tous les id plus grand que le dernier que l'on connait + res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s>=%s' % (attr, last_id), attrlist = [attr]) + # Si jamais id n'a pas de methode ORDERING, on récupère une liste vide et on fallback en récupérant tous les id (c'est lent) + if res == []: + res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr]) + else: + # On récupère tous les id res = self.search_s(variables.base_dn, ldap.SCOPE_SUBTREE, '%s=*' % attr, attrlist = [attr]) + # On extrait seulement les valeurs des id qui nous intêressent nonfree = [ int(r[1].get(attr)[0]) for r in res if r[1].get(attr) ] # On trie pour récupérer le dernier nonfree.sort() + try: last_id = nonfree[-1] except IndexError: last_id = 0 - # On écrit le nouveau dernier id connu - f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600) - os.write(f, str(last_id)) - os.close(f) - plage = None - # On récupère la plage des mids - if realm != None: - plage = itertools.chain(*[xrange(a,b+1) for (a,b) in config.rid_primaires[realm]]) + if plage is None: + # On écrit le nouveau dernier id connu + f=os.open('/tmp/lc_ldap_lastid_%s_%s' % (attr, os.getuid()), os.O_WRONLY | os.O_CREAT, 0600) + os.write(f, str(last_id)) + os.close(f) + if plage != None: for i in plage: