views.py 4.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889
  1. from django.template import RequestContext
  2. from django.utils.translation import ugettext as _
  3. from misago.apps.errors import error404, error_banned
  4. from misago.decorators import block_authenticated, block_banned, block_crawlers, block_jammed
  5. from misago.forms import FormLayout
  6. from misago.messages import Message
  7. from misago.models import Ban, User
  8. from misago.utils.strings import random_string
  9. from misago.utils.views import redirect_message
  10. from misago.apps.resetpswd.forms import UserResetPasswordForm
  11. @block_crawlers
  12. @block_banned
  13. @block_authenticated
  14. @block_jammed
  15. def form(request):
  16. message = None
  17. if request.method == 'POST':
  18. form = UserResetPasswordForm(request.POST, request=request)
  19. if form.is_valid():
  20. user = form.found_user
  21. user_ban = Ban.objects.check_ban(username=user.username, email=user.email)
  22. if user_ban:
  23. return error_banned(request, user, user_ban)
  24. elif user.activation != User.ACTIVATION_NONE:
  25. return redirect_message(request, Message(_("%(username)s, your account has to be activated in order for you to be able to request new password.") % {'username': user.username}), 'info')
  26. user.token = random_string(12)
  27. user.save(force_update=True)
  28. user.email_user(
  29. request,
  30. 'users/password/confirm',
  31. _("Confirm New Password Request")
  32. )
  33. return redirect_message(request, Message(_("%(username)s, new password request confirmation has been sent to %(email)s.") % {'username': user.username, 'email': user.email}), 'info')
  34. else:
  35. message = Message(form.non_field_errors()[0], 'error')
  36. else:
  37. form = UserResetPasswordForm(request=request)
  38. return request.theme.render_to_response('reset_password.html',
  39. {
  40. 'message': message,
  41. 'form': FormLayout(form),
  42. },
  43. context_instance=RequestContext(request));
  44. @block_banned
  45. @block_authenticated
  46. @block_jammed
  47. def reset(request, username="", user="0", token=""):
  48. user = int(user)
  49. try:
  50. user = User.objects.get(pk=user)
  51. user_ban = Ban.objects.check_ban(username=user.username, email=user.email)
  52. if user_ban:
  53. return error_banned(request, user, user_ban)
  54. if user.activation != User.ACTIVATION_NONE:
  55. return redirect_message(request, Message(_("%(username)s, your account has to be activated in order for you to be able to request new password.") % {'username': user.username}), 'info')
  56. if not token or not user.token or user.token != token:
  57. return redirect_message(request, Message(_("%(username)s, request confirmation link is invalid. Please request new confirmation link.") % {'username': user.username}), 'error')
  58. new_password = random_string(6)
  59. user.token = None
  60. user.set_password(new_password)
  61. user.save(force_update=True)
  62. # Logout signed in and kill remember me tokens
  63. Session.objects.filter(user=user).update(user=None)
  64. Token.objects.filter(user=user).delete()
  65. # Set flash and mail new password
  66. user.email_user(
  67. request,
  68. 'users/password/new',
  69. _("Your New Password"),
  70. {'password': new_password}
  71. )
  72. return redirect_message(request, Message(_("%(username)s, your password has been changed with new one that was sent to %(email)s.") % {'username': user.username, 'email': user.email}), 'success')
  73. except User.DoesNotExist:
  74. return error404(request)