Support #52642
Erreur 500 lors d'un reset de mot de passe avec un mail inconnu
0%
Description
Sur une instance d'Authentic (version 2.95-1~eob90+1), lorsque je tente un reset de mot de passe avec un email inconnu/invalide, cela provoque une erreur 500 et l'exception suivante est logguée :
Apr 1 18:05:29 gavotte-pp authentic2[30550]: 176.159.32.89 - r:7F660620C8D0 INFO password reset request for "brenard@easter-eggs.com", no user found Apr 1 18:05:29 gavotte-pp authentic2[30550]: 176.159.32.89 - r:7F660620C8D0 ERROR Internal Server Error: /accounts/password/reset/#012Traceback (most recent call last):#012 File "/usr/lib/python3/dist-packages/django/core/handlers/exception.py", line 41, in inner#012 response = get_response(request)#012 File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 187, in _get_response#012 response = self.process_exception_by_middleware(e, request)#012 File "/usr/lib/python3/dist-packages/django/core/handlers/base.py", line 185, in _get_response#012 response = wrapped_callback(request, *callback_args, **callback_kwargs)#012 File "/usr/lib/python3.5/contextlib.py", line 30, in inner#012 return func(*args, **kwds)#012 File "/usr/lib/python3/dist-packages/django/views/decorators/clickjacking.py", line 19, in wrapped_view#012 resp = view_func(*args, **kwargs)#012 File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 68, in view#012 return self.dispatch(request, *args, **kwargs)#012 File "/usr/lib/python3/dist-packages/django/views/generic/base.py", line 88, in dispatch#012 return handler(request, *args, **kwargs)#012 File "/usr/lib/python3/dist-packages/django/views/generic/edit.py", line 183, in post#012 return self.form_valid(form)#012 File "/usr/lib/python3/dist-packages/authentic2/views.py", line 712, in form_valid#012 form.save()#012 File "/usr/lib/python3/dist-packages/authentic2/forms/passwords.py", line 65, in save#012 ctx = {'registration_url': utils.make_url('registration_register', absolute=True)}#012 File "/usr/lib/python3/dist-packages/authentic2/utils/__init__.py", line 346, in make_url#012 raise TypeError('make_url() absolute cannot be used without request')#012TypeError: make_url() absolute cannot be used without request
J'ai pu reproduire sur deux instances avec cette version d'Authentic. Je précise que ce bug a dû être introduit relativement récemment, car sur une autre instance en 2.79-1~eob100+1, je ne reproduis pas le bug.
Historique
Mis à jour par Benjamin Dauvergne il y a environ 3 ans
- Statut changé de Nouveau à Résolu (à déployer)
- Assigné à mis à Valentin Deniaud
Un commit du 15 décembre a ajouté un dépendance sur la façon de déployer dans Publik :
commit 32de734b5afbe81811aaf38d353f629e8e0163ba Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Dec 15 10:54:42 2020 +0100 csv_import: use absolute URL for password reset (#49479) diff --git a/src/authentic2/utils/__init__.py b/src/authentic2/utils/__init__.py index 22405a49..78b566ef 100644 --- a/src/authentic2/utils/__init__.py +++ b/src/authentic2/utils/__init__.py @@ -339,6 +339,8 @@ def make_url(to, args=(), kwargs={}, keep_params=False, params=None, append=None if absolute: if request: url = request.build_absolute_uri(url) + elif hasattr(settings, 'SITE_BASE_URL'): <-- ici + url = urlparse.urljoin(settings.SITE_BASE_URL, url) else: raise TypeError('make_url() absolute cannot be used without request') # keep using unicode @@ -812,7 +814,7 @@ def build_reset_password_url(user, request=None, next_url=None, set_random_passw next_url=next_url, sign_next_url=sign_next_url, request=request, - absolute=bool(request)) + absolute=True) return reset_url, token
ce qui a rendu possible l'utilisation de absolute=True
dans le formulaire de reset :
commit 1ae7ac6df77266ecbc14cd32b4e3777c311b2201 Author: Valentin Deniaud <vdeniaud@entrouvert.com> Date: Tue Mar 2 18:02:03 2021 +0100 misc: send password reset email even if no account (#47469) @@ -58,8 +57,10 @@ class PasswordResetForm(forms.Form): user, set_random_password=set_random_password, next_url=self.cleaned_data.get('next_url')) - if not active_users: + if not users.exists(): logger.info(u'password reset request for "%s", no user found', email) + ctx = {'registration_url': utils.make_url('registration_register', absolute=True)} + utils.send_templated_mail(email, ['authentic2/password_reset_no_account'], context=ctx) hooks.call_hooks('event', name='password-reset', email=email, users=active_users)
sauf qu'effectivement ça ne marche pas si on a pas SITE_BASE_URL qui est défini....
Mis à jour par Benjamin Renard il y a environ 3 ans
Benjamin Dauvergne a écrit :
Un commit du 15 décembre a ajouté un dépendance sur la façon de déployer dans Publik :
[...]ce qui a rendu possible l'utilisation de
absolute=True
dans le formulaire de reset :[...]
sauf qu'effectivement ça ne marche pas si on a pas SITE_BASE_URL qui est défini....
OK, donc si je comprends bien, l'idéal ici serait de trouver un moyen de passer la requête courante lors de chaque appel de utils.make_url()
lorsque absolute=True
ou plus particulièrement ici et à défaut, ajouter un test pour s'assurer que SITE_BASE_URL
est bien défini dans la conf lorsque la réinitialisation de mot de passe est activée ?
Remarque : À priori, il est pas bien compliqué de passé la requête au travers une FormView
(https://stackoverflow.com/questions/51155248/passing-a-parameter-to-a-form-in-formview-django) et donc on devrait pouvoir assez facilement le faire ici au moins.
Mis à jour par Frédéric Péters il y a plus de 2 ans
- Statut changé de Résolu (à déployer) à Fermé
(je ferme le ticket parce que "résolu (à déployer)" ne dit pas qu'il y a quelque chose à faire, ça peut être réouvert s'il y a quelque chose à faire)