forgottenpassword.py 1.8 KB

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