views.py 4.9 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.forms import FormLayout
  8. from misago.messages import Message
  9. import misago.auth as auth
  10. from misago.auth.decorators import
  11. from misago.shared.signin.forms import SignInForm
  12. from misago.auth import AuthException, auth_admin, auth_forum, sign_user_in
  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.utils import random_string
  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.cookie_jar.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. return redirect(reverse('index'))