Projet

Général

Profil

0001-ldap-don-t-crash-on-duplicated-users-27697.patch

Benjamin Dauvergne, 05 novembre 2018 13:43

Télécharger (2,22 ko)

Voir les différences:

Subject: [PATCH] ldap: don't crash on duplicated users (#27697)

And keep roles on the more recently used user, then delete the other
ones.
 src/authentic2/backends/ldap_backend.py | 24 ++++++++++++++++++------
 1 file changed, 18 insertions(+), 6 deletions(-)
src/authentic2/backends/ldap_backend.py
834 834
            external_id = self.build_external_id(eid_tuple, attributes)
835 835
            if not external_id:
836 836
                continue
837
            try:
838
                log.debug('lookup using external_id %r: %r', eid_tuple, external_id)
839
                return LDAPUser.objects.prefetch_related('groups').get(
840
                    userexternalid__external_id=external_id, userexternalid__source=block['realm'])
841
            except User.DoesNotExist:
842
                pass
837
            log.debug('lookup using external_id %r: %r', eid_tuple, external_id)
838
            users = LDAPUser.objects.prefetch_related('groups').filter(
839
                userexternalid__external_id__iexact=external_id,
840
                userexternalid__source=block['realm']).order_by('-last_login')
841
            # ordering of NULLs cannot be done through the ORM
842
            users = sorted(users,
843
                           reverse=True,
844
                           key=lambda u: u is not None, u.last_login)
845
            if users:
846
                user = users[0]
847
                if len(users) > 1:
848
                    log.debug('found %d users, collectings roles into the first one and deleting the other ones.',
849
                              len(user))
850
                    for other in users[1:]:
851
                        user.roles.add(other.roles.all())
852
                        other.delete()
853
                return user
854
        return None
843 855

  
844 856
    def lookup_existing_user(self, username, block, attributes):
845 857
        for lookup_type in block['lookups']:
846
-