Project

General

Profile

Bug #51453

ldap: user_attributes fails on multivalued attributes

Added by Loïc Dachary over 3 years ago. Updated about 3 years ago.

Status:
Nouveau
Priority:
Normal
Assignee:
Category:
LDAP
Target version:
-
Start date:
25 February 2021
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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

Files

History

#1

Updated by Loïc Dachary over 3 years ago

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

Updated by Benjamin Dauvergne over 3 years ago

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

Updated by Loïc Dachary over 3 years ago

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

Updated by Benjamin Renard over 3 years ago

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

Updated by Loïc Dachary about 3 years ago

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

Updated by Loïc Dachary about 3 years ago

Ping ?

#7

Updated by Valentin Deniaud (congés, retour 17/07) about 3 years ago

  • Assignee changed from Benjamin Dauvergne to Loïc Dachary

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

Also available in: Atom PDF