Projet

Général

Profil

Bug #51453

ldap: user_attributes fails on multivalued attributes

Ajouté par Loïc Dachary il y a environ 3 ans. Mis à jour il y a presque 3 ans.

Statut:
Nouveau
Priorité:
Normal
Assigné à:
Catégorie:
LDAP
Version cible:
-
Début:
25 février 2021
Echéance:
% réalisé:

0%

Temps estimé:
Patch proposed:
Non
Planning:
Non

Description

Pour reproduire le problème, appliquer le patch ci-joint et lancer:

$ pg_virtualenv tox -e authentic-py3-dj22-drf39 -- -k 'test_user_attributes' -s tests/test_ldap.py
--------------------------------------------------- Captured log call ----------------------------------------------------
ERROR    django.request:log.py:222 Internal Server Error: /login/
Traceback (most recent call last):
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/core/handlers/exception.py", line 34, in inner
    response = get_response(request)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/core/handlers/base.py", line 115, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/core/handlers/base.py", line 113, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/views/decorators/clickjacking.py", line 15, in wrapped_view
    resp = view_func(*args, **kwargs)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
    return view_func(*args, **kwargs)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/utils/decorators.py", line 142, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/views/decorators/cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "/home/loic/software/ee/authentic/src/authentic2/views.py", line 344, in login
    auth_blocks.append(utils.get_authenticator_method(authenticator, 'login', parameters))
  File "/home/loic/software/ee/authentic/src/authentic2/utils/__init__.py", line 213, in get_authenticator_method
    content = response = getattr(authenticator, method)(**parameters)
  File "/home/loic/software/ee/authentic/src/authentic2/authenticators.py", line 122, in login
    csrf_token_check(request, form)
  File "/home/loic/software/ee/authentic/src/authentic2/utils/views.py", line 44, in csrf_token_check
    if form.is_valid() and not getattr(request, 'csrf_processing_done', False):
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/forms/forms.py", line 185, in is_valid
    return self.is_bound and not self.errors
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/forms/forms.py", line 180, in errors
    self.full_clean()
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/forms/forms.py", line 382, in full_clean
    self._clean_form()
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/forms/forms.py", line 409, in _clean_form
    cleaned_data = self.clean()
  File "/home/loic/software/ee/authentic/src/authentic2/forms/authentication.py", line 99, in clean
    self.clean_authenticate()
  File "/home/loic/software/ee/authentic/src/authentic2/forms/authentication.py", line 116, in clean_authenticate
    self.user_cache = utils.authenticate(self.request, username=username, password=password, ou=ou)
  File "/home/loic/software/ee/authentic/src/authentic2/utils/__init__.py", line 1181, in authenticate
    return dj_authenticate(request=request, **kwargs)
  File "/tmp/tox-loic/authentic/authentic-py3-dj22-drf39/lib/python3.8/site-packages/django/contrib/auth/__init__.py", line 73, in authenticate
    user = backend.authenticate(request, **credentials)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 621, in authenticate
    user = self.authenticate_block(request, block, uid, password)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 712, in authenticate_block
    return self._return_user(authz_id, password, conn, block)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 1254, in _return_user
    return self._return_django_user(dn, username, password, conn, block, attributes)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 1265, in _return_django_user
    self.populate_user(user, dn, username, conn, block, attributes)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 984, in populate_user
    self.populate_user_attributes(user, block, attributes)
  File "/home/loic/software/ee/authentic/src/authentic2/backends/ldap_backend.py", line 792, in populate_user_attributes
    setattr(user.attributes, name, user_attributes[name])
  File "/home/loic/software/ee/authentic/src/authentic2/custom_user/models.py", line 87, in __setattr__
    attribute.set_value(self.owner, value, verified=bool(self.verified))
  File "/home/loic/software/ee/authentic/src/authentic2/models.py", line 244, in set_value
    assert isinstance(value, (list, set, tuple))
AssertionError

Fichiers

Historique

#1

Mis à jour par Loïc Dachary il y a environ 3 ans

Voila une première tentative de correction qui passe le test qui échoue sans lui avec un attribut multivalué.

Je suis pas super fan de l'idée d'aller chercher get_attributes_map dans custom_user.models parce que ça me fait l'impression de piocher dans les entrailles de authentic au lieu d'utiliser l'interface qui va bien. Est-ce qu'il y aurait un autre moyen d'obtenir l'information "est-ce que cet attribut est multivalué"?

#2

Mis à jour par Benjamin Dauvergne il y a environ 3 ans

Alors en vrai les attributs multivalués sont une fonctionnalité qui ne marche juste pas dans authentic même si ça semble implémenté, à l'usage même si le stockage semble marcher ça peut casser un peu partout car ça n'a jamais été utilisé (genre avec SAML ou OIDC je ne sais pas ce que ça va donner). Il y a donc du boulot au delà de ce ticket.

#3

Mis à jour par Loïc Dachary il y a environ 3 ans

Ah... merci pour l'information ça m'évite de me casser les dents. Est-ce que la bonne chose à faire serait de créér un ticket global pour regrouper les efforts qui vont dans la direction d'un support pour les attributs multivalués lié à celui ci ? A ce stade je n'ai aucune idée si j'aurais l'énergie et la compétence pour résoudre cela, mais au moins ça rendra le sujet visible.

Qu'en dis-tu ?

#4

Mis à jour par Benjamin Renard il y a environ 3 ans

Benjamin Dauvergne a écrit :

Alors en vrai les attributs multivalués sont une fonctionnalité qui ne marche juste pas dans authentic même si ça semble implémenté, à l'usage même si le stockage semble marcher ça peut casser un peu partout car ça n'a jamais été utilisé (genre avec SAML ou OIDC je ne sais pas ce que ça va donner). Il y a donc du boulot au delà de ce ticket.

Je précise que nous utilisons en prod de multiples installations avec des attributs multi-valués issus directement de l'annuaire LDAP et nous n'avons jamais rencontrez de problème avec cela. Aucun problème avec ces attributs en SAML ou en CAS. En OIDC, nous n'avions pas de retour d'expérience d'utilisation d'attributs multi-valués, donc j'ai tenté un rapide test et à priori, je n'arrive pas du tout à remonter un attribut LDAP via OIDC (la valeur récupéré par le client est systématiquement nulle).

#5

Mis à jour par Loïc Dachary il y a presque 3 ans

Voici un test qui vérifie à minima que la fonction get_attributes() retourne toutes les valeurs d'un attribut multivalué. Certains applicatifs dépendent de ce comportement et cela permet d'éviter une régression à l'avenir.

#6

Mis à jour par Loïc Dachary il y a presque 3 ans

Ping ?

#7

Mis à jour par Valentin Deniaud il y a presque 3 ans

  • Assigné à changé de Benjamin Dauvergne à Loïc Dachary

Ça me paraît bon, il y aurait juste à mettre les commentaires sur une seule ligne au lieu de 3.

Formats disponibles : Atom PDF