Project

General

Profile

Support #52642

Erreur 500 lors d'un reset de mot de passe avec un mail inconnu

Added by Benjamin Renard 4 months ago. Updated 4 months ago.

Status:
Résolu (à déployer)
Priority:
Normal
Category:
-
Target version:
-
Start date:
01 Apr 2021
Due date:
% Done:

0%

Estimated time:
Patch proposed:
No
Planning:
No

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.

History

#1

Updated by Benjamin Dauvergne 4 months ago

  • Assignee set to Valentin Deniaud
  • Status changed from Nouveau to Résolu (à déployer)

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....

#2

Updated by Benjamin Renard 4 months ago

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.

Also available in: Atom PDF