forgottenpassword.py 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  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 ugettext as _
  5. from misago.core.exceptions import Banned
  6. from misago.users.bans import get_user_ban
  7. from misago.users.decorators import deny_banned_ips
  8. from misago.users.tokens import is_password_change_token_valid
  9. def reset_view(f):
  10. @deny_banned_ips
  11. def decorator(*args, **kwargs):
  12. return f(*args, **kwargs)
  13. return decorator
  14. @reset_view
  15. def request_reset(request):
  16. return render(request, 'misago/forgottenpassword/request.html')
  17. class ResetError(Exception):
  18. pass
  19. @reset_view
  20. def reset_password_form(request, pk, token):
  21. requesting_user = get_object_or_404(get_user_model(), pk=pk, is_active=True)
  22. try:
  23. if (request.user.is_authenticated and request.user.id != requesting_user.id):
  24. message = _("%(user)s, your link has expired. Please request new link and try again.")
  25. raise ResetError(message % {'user': requesting_user.username})
  26. if not is_password_change_token_valid(requesting_user, token):
  27. message = _("%(user)s, your link is invalid. Please try again or request new link.")
  28. raise ResetError(message % {'user': requesting_user.username})
  29. ban = get_user_ban(requesting_user)
  30. if ban:
  31. raise Banned(ban)
  32. except ResetError as e:
  33. return render(
  34. request, 'misago/forgottenpassword/error.html', {
  35. 'message': e.args[0],
  36. }, status=400
  37. )
  38. request.frontend_context['store'].update({
  39. 'forgotten_password': {
  40. 'id': pk,
  41. 'token': token,
  42. },
  43. })
  44. return render(request, 'misago/forgottenpassword/form.html')