auth.py 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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, messages
  5. from django.utils.translation import ugettext as _
  6. KEY_TOKEN = 'misago_admin_session_token'
  7. KEY_UPDATED = 'misago_admin_session_updated'
  8. def make_user_admin_token(user):
  9. formula = '%s:%s:%s' % (user.pk, user.email, user.password)
  10. return md5(formula).hexdigest()
  11. # Admin session state controls
  12. def is_admin_session(request):
  13. if request.user.is_anonymous():
  14. return False
  15. if not (request.user.is_staff and request.user.is_superuser):
  16. return False
  17. admin_token = request.session.get(KEY_TOKEN)
  18. if not admin_token == make_user_admin_token(request.user):
  19. return False
  20. updated = request.session.get(KEY_UPDATED, 0)
  21. if updated < time() - (settings.MISAGO_ADMIN_SESSION_EXPIRATION * 60):
  22. if updated:
  23. request.session.pop(KEY_UPDATED, None)
  24. messages.info(request, _("Your admin session has expired."))
  25. return False
  26. return True
  27. def start_admin_session(request, user):
  28. request.session[KEY_TOKEN] = make_user_admin_token(user)
  29. request.session[KEY_UPDATED] = int(time())
  30. def update_admin_session(request):
  31. request.session[KEY_UPDATED] = int(time())
  32. def close_admin_session(request):
  33. request.session.pop(KEY_TOKEN, None)
  34. request.session.pop(KEY_UPDATED, None)
  35. # Login/logout exposed
  36. login = dj_auth.login
  37. logout = dj_auth.logout
  38. # Register signal for logout to make sure eventual admin session is closed
  39. def django_login_handler(sender, **kwargs):
  40. request, user = kwargs['request'], kwargs['user']
  41. try:
  42. admin_namespace = request.admin_namespace
  43. except AttributeError:
  44. admin_namespace = False
  45. if admin_namespace and user.is_staff:
  46. start_admin_session(request, user)
  47. dj_auth.signals.user_logged_in.connect(django_login_handler)
  48. def django_logout_handler(sender, **kwargs):
  49. close_admin_session(kwargs['request'])
  50. dj_auth.signals.user_logged_out.connect(django_logout_handler)