views.py 5.1 KB

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