views.py 4.9 KB

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