forgottenpassword.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  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 ..bans import get_user_ban
  7. from ..decorators import deny_banned_ips
  8. from ..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. request.frontend_context.update({
  17. 'SEND_PASSWORD_RESET_API': reverse('misago:api:send-password-form'),
  18. })
  19. return render(request, 'misago/forgottenpassword/request.html')
  20. class ResetError(Exception):
  21. pass
  22. @reset_view
  23. def reset_password_form(request, pk, token):
  24. User = get_user_model()
  25. requesting_user = get_object_or_404(User.objects, pk=pk)
  26. try:
  27. if (request.user.is_authenticated() and
  28. request.user.id != requesting_user.id):
  29. message = _("%(user)s, your link has expired. "
  30. "Please request new link and try again.")
  31. message = message % {'user': requesting_user.username}
  32. raise ResetError(message)
  33. if not is_password_change_token_valid(requesting_user, token):
  34. message = _("%(user)s, your link is invalid. "
  35. "Please try again or request new link.")
  36. message = message % {'user': requesting_user.username}
  37. raise ResetError(message)
  38. ban = get_user_ban(requesting_user)
  39. if ban:
  40. raise Banned(ban)
  41. except ResetError as e:
  42. return render(request, 'misago/forgottenpassword/error.html', {
  43. 'message': e.args[0],
  44. }, status=400)
  45. api_url = reverse('misago:api:change-forgotten-password', kwargs={
  46. 'pk': pk,
  47. 'token': token,
  48. })
  49. request.frontend_context['CHANGE_PASSWORD_API'] = api_url
  50. return render(request, 'misago/forgottenpassword/form.html')