forgottenpassword.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. def reset_view(f):
  11. @deny_banned_ips
  12. def decorator(request, *args, **kwargs):
  13. if request.settings.enable_sso:
  14. raise PermissionDenied(
  15. _("Please use the 3rd party site to change password.")
  16. )
  17. return f(request, *args, **kwargs)
  18. return decorator
  19. @reset_view
  20. def request_reset(request):
  21. request.frontend_context.update(
  22. {"SEND_PASSWORD_RESET_API": reverse("misago:api:send-password-form")}
  23. )
  24. return render(request, "misago/forgottenpassword/request.html")
  25. class ResetError(Exception):
  26. pass
  27. @reset_view
  28. def reset_password_form(request, pk, token):
  29. requesting_user = get_object_or_404(get_user_model(), pk=pk)
  30. try:
  31. if request.user.is_authenticated and request.user.id != requesting_user.id:
  32. message = _(
  33. "%(user)s, your link has expired. "
  34. "Please request new link and try again."
  35. )
  36. raise ResetError(message % {"user": requesting_user.username})
  37. if not is_password_change_token_valid(requesting_user, token):
  38. message = _(
  39. "%(user)s, your link is invalid. Please try again or request new link."
  40. )
  41. raise ResetError(message % {"user": requesting_user.username})
  42. ban = get_user_ban(requesting_user, request.cache_versions)
  43. if ban:
  44. raise Banned(ban)
  45. except ResetError as e:
  46. return render(
  47. request,
  48. "misago/forgottenpassword/error.html",
  49. {"message": e.args[0]},
  50. status=400,
  51. )
  52. api_url = reverse(
  53. "misago:api:change-forgotten-password", kwargs={"pk": pk, "token": token}
  54. )
  55. request.frontend_context["CHANGE_PASSWORD_API"] = api_url
  56. return render(request, "misago/forgottenpassword/form.html")