views.py 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. from django.core.urlresolvers import reverse
  2. from django.shortcuts import redirect
  3. from django.template import RequestContext
  4. from django.utils import timezone
  5. from django.utils.translation import ugettext as _
  6. from misago.admin import site
  7. from misago.csrf.decorators import check_csrf
  8. from misago.banning.decorators import block_banned
  9. from misago.forms.layouts import FormLayout
  10. from misago.messages import Message
  11. from misago.authn.methods import auth
  12. from misago.authn.decorators import block_authenticated, block_guest
  13. from misago.authn.forms import SignInForm
  14. from misago.authn.methods import AuthException, auth_admin, auth_forum, sign_user_in
  15. from misago.bruteforce.decorators import block_jammed
  16. from misago.bruteforce.models import SignInAttempt
  17. from misago.sessions.models import Token
  18. from misago.utils import get_random_string
  19. @block_banned
  20. @block_authenticated
  21. @block_jammed
  22. def signin(request):
  23. message = request.messages.get_message('security')
  24. bad_password = False
  25. not_active = False
  26. banned_account = False
  27. if request.method == 'POST':
  28. form = SignInForm(
  29. request.POST,
  30. show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
  31. request=request
  32. )
  33. if form.is_valid():
  34. try:
  35. # Configure correct auth and redirect links
  36. if request.firewall.admin:
  37. auth_method = auth_admin
  38. success_redirect = reverse(site.get_admin_index())
  39. else:
  40. auth_method = auth_forum
  41. success_redirect = reverse('index')
  42. # Authenticate user
  43. user = auth_method(
  44. request,
  45. form.cleaned_data['user_email'],
  46. form.cleaned_data['user_password'],
  47. )
  48. sign_user_in(request, user)
  49. remember_me_token = False
  50. if not request.firewall.admin and request.settings['remember_me_allow'] and form.cleaned_data['user_remember_me']:
  51. remember_me_token = get_random_string(42)
  52. remember_me = Token(
  53. id=remember_me_token,
  54. user=user,
  55. created=timezone.now(),
  56. accessed=timezone.now(),
  57. )
  58. remember_me.save()
  59. if remember_me_token:
  60. request.cookie_jar.set('TOKEN', remember_me_token, True)
  61. request.messages.set_flash(Message(_("Welcome back, %(username)s!") % {'username': user.username}), 'success', 'security')
  62. return redirect(success_redirect)
  63. except AuthException as e:
  64. message = Message(e.error, 'error')
  65. bad_password = e.password
  66. banned_account = e.ban
  67. not_active = e.activation
  68. # If not in Admin, register failed attempt
  69. if not request.firewall.admin and e.type == auth.CREDENTIALS:
  70. SignInAttempt.objects.register_attempt(request.session.get_ip(request))
  71. # Have we jammed our account?
  72. if SignInAttempt.objects.is_jammed(request.settings, request.session.get_ip(request)):
  73. request.jam.expires = timezone.now()
  74. return redirect(reverse('sign_in'))
  75. else:
  76. message = Message(form.non_field_errors()[0], 'error')
  77. else:
  78. form = SignInForm(
  79. show_remember_me=not request.firewall.admin and request.settings['remember_me_allow'],
  80. request=request
  81. )
  82. return request.theme.render_to_response('signin.html',
  83. {
  84. 'message': message,
  85. 'bad_password': bad_password,
  86. 'banned_account': banned_account,
  87. 'not_active': not_active,
  88. 'form': FormLayout(form),
  89. 'hide_signin': True,
  90. },
  91. context_instance=RequestContext(request));
  92. @block_guest
  93. @check_csrf
  94. def signout(request):
  95. user = request.user
  96. request.session.sign_out(request)
  97. request.messages.set_flash(Message(_("You have been signed out.")), 'info', 'security')
  98. if request.firewall.admin:
  99. return redirect(reverse(site.get_admin_index()))
  100. return redirect(reverse('index'))