Bug #51453
ldap: user_attributes fails on multivalued attributes
0%
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
Updated by Loïc Dachary almost 4 years ago
- File 0001-ldap-allow-multivalued-attributes-in-user_attributes.patch 0001-ldap-allow-multivalued-attributes-in-user_attributes.patch added
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é"?
Updated by Benjamin Dauvergne almost 4 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.
Updated by Loïc Dachary almost 4 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 ?
Updated by Benjamin Renard almost 4 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).
Updated by Loïc Dachary almost 4 years ago
- File 0001-ldap-test-the-multivalued-attribute-behavior-51453.patch 0001-ldap-test-the-multivalued-attribute-behavior-51453.patch added
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.
Updated by Valentin Deniaud over 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.