views.py 5.0 KB

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