changepassword.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from django.contrib.auth import update_session_auth_hash
  2. from django.core.exceptions import ValidationError
  3. from django.utils.translation import ugettext as _
  4. from rest_framework import status
  5. from rest_framework.response import Response
  6. from misago.conf import settings
  7. from misago.core.mail import mail_user
  8. from misago.users.forms.options import ChangePasswordForm
  9. from misago.users.credentialchange import (store_new_credential,
  10. read_new_credential)
  11. def change_password_endpoint(request, pk=None):
  12. if 'token' in request.data:
  13. return use_token(request, request.data['token'])
  14. else:
  15. return handle_form_submission(request)
  16. def handle_form_submission(request):
  17. form = ChangePasswordForm(request.data, user=request.user)
  18. if form.is_valid():
  19. token = store_new_credential(
  20. request, 'password', form.cleaned_data['new_password'])
  21. mail_subject = _("Confirm password change on %(forum_title)s forums")
  22. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  23. mail_user(request, request.user, mail_subject,
  24. 'misago/emails/change_password',
  25. {'token': token})
  26. return Response({'detail': _("Password change confirmation link "
  27. "was sent to your address.")})
  28. else:
  29. return Response(form.errors, status=status.HTTP_400_BAD_REQUEST)
  30. def token_error_handler(f):
  31. def decorator(request, token):
  32. try:
  33. return f(request, token)
  34. except ValueError:
  35. message = _("Password change link has expired. Please try again.")
  36. return Response({'detail': message},
  37. status=status.HTTP_400_BAD_REQUEST)
  38. return decorator
  39. @token_error_handler
  40. def use_token(request, token):
  41. new_password = read_new_credential(request, 'password', token)
  42. if new_password:
  43. request.user.set_password(new_password)
  44. request.user.save()
  45. update_session_auth_hash(request, request.user)
  46. return Response({'detail': _("Your password has been changed.")})
  47. else:
  48. raise ValueError()