auth.py 2.1 KB

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