forgottenpassword.py 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. from django.contrib.auth import get_user_model
  2. from django.core.exceptions import PermissionDenied
  3. from django.shortcuts import get_object_or_404, render
  4. from django.urls import reverse
  5. from django.utils.translation import gettext as _
  6. from ...core.exceptions import Banned
  7. from ..bans import get_user_ban
  8. from ..decorators import deny_banned_ips
  9. from ..tokens import is_password_change_token_valid
  10. @deny_banned_ips
  11. def request_reset(request):
  12. if request.settings.enable_oauth2_client:
  13. raise PermissionDenied(
  14. _("Please use %(provider)s to reset your password.")
  15. % {"provider": request.settings.oauth2_provider}
  16. )
  17. request.frontend_context.update(
  18. {"SEND_PASSWORD_RESET_API": reverse("misago:api:send-password-form")}
  19. )
  20. return render(request, "misago/forgottenpassword/request.html")
  21. class ResetError(Exception):
  22. pass
  23. @deny_banned_ips
  24. def reset_password_form(request, pk, token):
  25. if request.settings.enable_oauth2_client:
  26. raise PermissionDenied(
  27. _("Please use %(provider)s to reset your password.")
  28. % {"provider": request.settings.oauth2_provider}
  29. )
  30. requesting_user = get_object_or_404(get_user_model(), pk=pk)
  31. try:
  32. if request.user.is_authenticated and request.user.id != requesting_user.id:
  33. message = _(
  34. "%(user)s, your link has expired. "
  35. "Please request new link and try again."
  36. )
  37. raise ResetError(message % {"user": requesting_user.username})
  38. if not is_password_change_token_valid(requesting_user, token):
  39. message = _(
  40. "%(user)s, your link is invalid. Please try again or request new link."
  41. )
  42. raise ResetError(message % {"user": requesting_user.username})
  43. ban = get_user_ban(requesting_user, request.cache_versions)
  44. if ban:
  45. raise Banned(ban)
  46. except ResetError as e:
  47. return render(
  48. request,
  49. "misago/forgottenpassword/error.html",
  50. {"message": e.args[0]},
  51. status=400,
  52. )
  53. api_url = reverse(
  54. "misago:api:change-forgotten-password", kwargs={"pk": pk, "token": token}
  55. )
  56. request.frontend_context["CHANGE_PASSWORD_API"] = api_url
  57. return render(request, "misago/forgottenpassword/form.html")