auth.py 1.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. from hashlib import md5
  2. from time import time
  3. from django.conf import settings
  4. from django.contrib import auth as dj_auth
  5. KEY_TOKEN = 'misago_admin_session_token'
  6. KEY_UPDATED = 'misago_admin_session_updated'
  7. def make_user_admin_token(user):
  8. formula = '%s:%s:%s' % (user.pk, user.email, user.password)
  9. return md5(formula).hexdigest()
  10. # Admin session state controls
  11. def is_admin_session(request):
  12. if request.user.is_anonymous():
  13. return False
  14. if not (request.user.is_staff and request.user.is_superuser):
  15. return False
  16. admin_token = request.session.get(KEY_TOKEN)
  17. if not admin_token == make_user_admin_token(request.user):
  18. return False
  19. updated = request.session.get(KEY_UPDATED, 0)
  20. if updated < time() - (settings.MISAGO_ADMIN_SESSION_EXPIRATION * 60):
  21. return False
  22. return True
  23. def start_admin_session(request, user):
  24. request.session[KEY_TOKEN] = make_user_admin_token(user)
  25. request.session[KEY_UPDATED] = int(time())
  26. def update_admin_session(request):
  27. request.session[KEY_UPDATED] = int(time())
  28. def close_admin_session(request):
  29. request.session.pop(KEY_TOKEN, None)
  30. request.session.pop(KEY_UPDATED, None)
  31. # Login/logout wrappers for django auth used in sign in/out views
  32. def login(request, user):
  33. start_admin_session(request, user)
  34. dj_auth.login(request, user)
  35. def logout(request):
  36. close_admin_session(request)
  37. dj_auth.logout(request)
  38. # Register signal for logout to make sure eventual admin session is closed
  39. def django_logout_handler(sender, **kwargs):
  40. close_admin_session(kwargs['request'])
  41. dj_auth.signals.user_logged_out.connect(django_logout_handler)