Bug #62868
/manage/ : en se reconnectant avec un utilisateur provenant d’un annuaire, crash lorsque l’annuaire ne reconnaît pas celui-ci
0%
Description
Sur une nouvelle installation, lorsque je tente de me connecter en tant qu'un autre utilisateur, je tombe sur une erreur 500 :
mars 16 16:45:15 srv-idp-test-02 authentic2[1048]: 86.210.112.193 - r:7F4D11FEB7F0 ERROR Internal Server Error: /su/BMnOcMYHQ3-1gHai3eHHUw/ Traceback (most recent call last): File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/lib/python3/dist-packages/django/views/decorators/clickjacking.py", line 15, in wrapped_view resp = view_func(*args, **kwargs) File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 71, in view return self.dispatch(request, *args, **kwargs) File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 97, in dispatch return handler(request, *args, **kwargs) File "/usr/lib/python3/dist-packages/authentic2/views.py", line 1519, in get return utils_misc.simulate_authentication(request, user, 'su') File "/usr/lib/python3/dist-packages/authentic2/utils/misc.py", line 1163, in simulate_authentication user.backend = backend AttributeError: 'NoneType' object has no attribute 'backend'
À priori, cela semble venir du fait que, dans la vue SuView la méthode authentic2.utils.misc.authenticate(request, user=user) retourne None. Cette méthode est un wrapper sur django.contrib.auth.authenticate à priori et à en croire la doc Django, cette méthode retourne None lorsque l'authentification échoue.
Infos sur l'installation :
root@srv-idp-test-02:/etc/authentic2 # dpkg -l|grep -E '(authentic2|django)' ii authentic2 3.79-1~eob100+1 all Versatile identity server Python module ii python3-authentic2 3.79-1~eob100+1 all Versatile identity server ii python3-django 2:2.2.24-1~bpo10+1 all High-level Python web development framework ii python3-django-appconf 1.0.2-3 all helper class handling configuration defaults of apps - Python 3.x ii python3-django-filters 2.1.0-1~bpo10+1 all filter Django QuerySets based on user selections ii python3-django-guardian 1.4.9-2 all per object permissions of django for Python3 ii python3-django-import-export 1.2.0.post2+gbd7e81a-1~eob100+1 all Django application and library for importing and exporting data ii python3-django-mellon 1.32-1~eob100+1 all SAML authentication for Django ii python3-django-model-utils 3.1.1-1 all Django model mixins and utilities — Python 3 ii python3-django-ratelimit 2.0.0-1~eob100+1 all Cache-based rate-limiting for Django ii python3-django-select2 5.10.0-1~eob100+2 all Select2 option fields for Django (Python 3) ii python3-django-tables2 1.21.2-1 all Table/data-grid framework for Django (Python 3) ii python3-djangorestframework 3.9.0-1 all Web APIs for Django, made easy for Python3
Files
History
Updated by Benjamin Renard over 2 years ago
Je reproduis aujourd'hui cette erreur sur la version 4.29-1~eob100+1 pour Buster :
90.51.84.67 - r:7F069CF42470 ERROR Internal Server Error: /su/Jf7xx2RZQCWLpituD1-g4A/ Traceback (most recent call last): File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 34, in inner response = get_response(request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 115, in _get_response response = self.process_exception_by_middleware(e, request) File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 113, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "/usr/lib/python3/dist-packages/django/views/decorators/clickjacking.py", line 15, in wrapped_view resp = view_func(*args, **kwargs) File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 71, in view return self.dispatch(request, *args, **kwargs) File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 97, in dispatch return handler(request, *args, **kwargs) File "/usr/lib/python3/dist-packages/authentic2/views.py", line 1607, in get return utils_misc.simulate_authentication(request, user, 'su') File "/usr/lib/python3/dist-packages/authentic2/utils/misc.py", line 1188, in simulate_authentication user.backend = backend AttributeError: 'NoneType' object has no attribute 'backend'
Infos sur l'installation :
# dpkg -l|grep -E '(authentic2|django)' ii authentic2 4.29-1~eob100+1 all Versatile identity server Python module ii authentic2-supann 1.0-0 all adaptations and basic configuration for using authentic2 on a SUPANN directory ii python3-authentic2 4.29-1~eob100+1 all Versatile identity server ii python3-django 2:2.2.24-1~bpo10+1 all High-level Python web development framework ii python3-django-appconf 1.0.2-3 all helper class handling configuration defaults of apps - Python 3.x ii python3-django-filters 2.1.0-1~bpo10+1 all filter Django QuerySets based on user selections ii python3-django-guardian 1.4.9-2 all per object permissions of django for Python3 ii python3-django-import-export 1.2.0.post2+gbd7e81a-1~eob100+1 all Django application and library for importing and exporting data ii python3-django-mellon 1.38-1~eob100+1 all SAML authentication for Django ii python3-django-model-utils 3.1.1-1 all Django model mixins and utilities — Python 3 ii python3-django-ratelimit 2.0.0-1~eob100+1 all Cache-based rate-limiting for Django ii python3-django-select2 5.10.0-1~eob100+2 all Select2 option fields for Django (Python 3) ii python3-django-tables2 1.21.2-1 all Table/data-grid framework for Django (Python 3) ii python3-djangorestframework 3.9.0-1+deb10u1 all Web APIs for Django, made easy for Python3
Updated by Benjamin Renard over 2 years ago
Je précise que sur une autre machine en Bullseye avec la même version, mais python3-django 2.2.26, ça fonctionne correctement. Ce serait une incompatibilité avec python3-django 2.2.24 ?
Updated by Paul Marillonnet over 2 years ago
- Tracker changed from Développement to Bug
- Subject changed from Erreur 500 lors de la connexion en tant qu'une autre personne to /manage/ : en se reconnectant avec un utilisateur provenant d’un annuaire, crash lorsque l’annuaire ne reconnaît pas celui-ci
Dans SuView, on vérifie une première fois que l’usager existe à la résolution du token.
Mais lorsqu’il provient du LDAP on cherche à l’authentifier. On vérifie pas à nouveau qu’il existe, il faudrait.
Updated by Paul Marillonnet over 2 years ago
- Status changed from Nouveau to En cours
- Assignee set to Paul Marillonnet
Joli bug, je regarde.
Updated by Paul Marillonnet over 2 years ago
- File 0001-manage-do-not-crash-while-trying-to-impersonate-stal.patch 0001-manage-do-not-crash-while-trying-to-impersonate-stal.patch added
- Status changed from En cours to Solution proposée
- Patch proposed changed from No to Yes
Updated by Paul Marillonnet over 2 years ago
Ça devrait éviter le crash. Je ne sais pas si ça a un lien avec la différence de version debian buster/bullseye, mais lors d’un des essais consistant à se reconnecter avec l’usager provenant du LDAP, ce dernier ne reconnaissait pas l’usager (peut-être l’annuaire indisponible à ce moment là ?). Il faut échouer proprement au lieu de crasher, c’est l’objet de ce patche.
Updated by Benjamin Dauvergne over 2 years ago
- Status changed from Solution proposée to En cours
Tu ferais un test aussi au niveau de la vue qui initialise le lien pour ne pas arriver jusqu'à la 404 ? (authentic2.manager.user_views.UserSuView), je pense que vérifier que utils_misc.authenticate(request, user=user) != None
suffit à s'assurer que ça marchera plus tard.
Updated by Paul Marillonnet over 2 years ago
- File 0001-manage-do-not-crash-while-trying-to-impersonate-stal.patch 0001-manage-do-not-crash-while-trying-to-impersonate-stal.patch added
- Status changed from En cours to Solution proposée
Benjamin Dauvergne a écrit :
Tu ferais un test aussi au niveau de la vue qui initialise le lien pour ne pas arriver jusqu'à la 404 ? (authentic2.manager.user_views.UserSuView)
C’est déjà fait dans les deux tests au dessus (test_su_superuser_post
et test_su_permission_ldap_user_authn_failed
), je loupe un truc ?
, je pense que vérifier que
utils_misc.authenticate(request, user=user) != None
suffit à s'assurer que ça marchera plus tard.
Ok, patch corrigé ici.
Updated by Paul Marillonnet over 2 years ago
Et donc j’avais loupé que le user = utils_misc.authenticate(request, user=user)
est bien là pour quelque chose, sans quoi :
def test_switch_user_ldap_user(slapd, settings, app, db, caplog): caplog.set_level(logging.DEBUG) # force pytest to reset log level after test settings.LDAP_AUTH_SETTINGS = [ { 'url': [slapd.ldap_url], 'binddn': force_text(slapd.root_bind_dn), 'bindpw': force_text(slapd.root_bind_password), 'basedn': 'o=ôrga', 'use_tls': False, 'attributes': ['carLicense'], } ] # get all users management.call_command('sync-ldap-users', verbosity=2) user = User.objects.get(username=USERNAME + '@ldap') url = switch_user.build_url(user) response = app.get(url).follow() > assert app.session['_auth_user_backend'] == 'authentic2.backends.ldap_backend.LDAPBackendPasswordLost' E AssertionError: assert 'authentic2.b....ModelBackend' == 'authentic2.b...dPasswordLost' E - authentic2.backends.ldap_backend.LDAPBackendPasswordLost E + authentic2.backends.models_backend.ModelBackend
C’est la première version du patch (#62868-5) qui revient donc pour relecture.
Updated by Benjamin Dauvergne over 2 years ago
- Status changed from Solution proposée to En cours
Paul Marillonnet a écrit :
Benjamin Dauvergne a écrit :
Tu ferais un test aussi au niveau de la vue qui initialise le lien pour ne pas arriver jusqu'à la 404 ? (authentic2.manager.user_views.UserSuView)
C’est déjà fait dans les deux tests au dessus (
test_su_superuser_post
ettest_su_permission_ldap_user_authn_failed
), je loupe un truc ?
Ok je t'ai perdu avec le mot "test", je veux dire ajouter une condition dans la vue "UserSuView" pour ne pas créer "su_url" si utils_misc.authenticate(request, user=user) == None
et afficher directement que ce ne sera pas possible; ça ne sert à rien de filer un lien qui ne marche pas aux gens, on ne doit pas arriver jusqu'à la 404 dans le test authn_failed.
Updated by Robot Gitea 6 months ago
Paul Marillonnet (pmarillonnet) a ouvert une pull request sur Gitea concernant cette demande :
- URL : https://git.entrouvert.org/entrouvert/authentic/pulls/433
- Titre : WIP: manage: do not crash while trying to impersonate stale ldap user (#62868)
- Modifications : https://git.entrouvert.org/entrouvert/authentic/pulls/433/files
Updated by Paul Marillonnet 6 months ago
Bon, à relire plus en détail la trace il me semble que c’est du côté de utils.switch_user.resolve_token
que ça se jouait, avec impossibilité de retrouver l’usager auquel correspondait le jeton émis (ce qui me conforte dans le constat que je ne parviens pas à reproduire sur la base des hypothèses précédemment émises).
D’ailleurs plus haut ici, je n’avais pas lu :
Je précise que sur une autre machine en Bullseye avec la même version, mais python3-django 2.2.26, ça fonctionne correctement.
Je pense qu’on peut fermer ce ticket.
Updated by Robot Gitea 6 months ago
Paul Marillonnet (pmarillonnet) a fermé une pull request sur Gitea concernant cette demande.