views.py 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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.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.conf import settings
  12. from misago.decorators import (block_authenticated, block_banned, block_crawlers,
  13. block_guest, block_jammed, check_csrf)
  14. from misago.models import SignInAttempt, Token
  15. from misago.shortcuts import render_to_response
  16. from misago.utils.strings import random_string
  17. from misago.apps.signin.forms import SignInForm
  18. @block_crawlers
  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 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 settings.remember_me_allow and form.cleaned_data['user_remember_me']:
  51. remember_me_token = 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.cookiejar.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.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 settings.remember_me_allow,
  80. request=request
  81. )
  82. return 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': form,
  89. 'hide_signin': True,
  90. },
  91. context_instance=RequestContext(request));
  92. @block_crawlers
  93. @block_guest
  94. @check_csrf
  95. def signout(request):
  96. user = request.user
  97. request.session.sign_out(request)
  98. request.messages.set_flash(Message(_("You have been signed out.")), 'info', 'security')
  99. if request.firewall.admin:
  100. return redirect(reverse(site.get_admin_index()))
  101. else:
  102. ranks_online = cache.get('ranks_online', 'nada')
  103. if ranks_online != 'nada':
  104. for rank in ranks_online:
  105. if rank['id'] == user.rank_id:
  106. cache.delete('ranks_online')
  107. break
  108. return redirect(reverse('index'))