middleware.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. import pytz
  2. from django.contrib.auth import logout
  3. from django.contrib.auth.models import AnonymousUser as DjAnonymousUser
  4. from django.urls import resolve
  5. from misago.conf import settings
  6. from .bans import get_request_ip_ban, get_user_ban
  7. from .models import AnonymousUser, Online
  8. from .online import tracker
  9. class RealIPMiddleware(object):
  10. def process_request(self, request):
  11. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
  12. if x_forwarded_for:
  13. request.user_ip = x_forwarded_for.split(',')[0]
  14. else:
  15. request.user_ip = request.META.get('REMOTE_ADDR')
  16. class AvatarServerMiddleware(object):
  17. def process_request(self, request):
  18. if request.path_info.startswith(settings.MISAGO_AVATAR_SERVER_PATH):
  19. request.user = DjAnonymousUser()
  20. resolved_path = resolve(request.path_info)
  21. return resolved_path.func(request, **resolved_path.kwargs)
  22. class UserMiddleware(object):
  23. def process_request(self, request):
  24. if request.user.is_anonymous():
  25. request.user = AnonymousUser()
  26. elif not request.user.is_staff:
  27. if get_request_ip_ban(request) or get_user_ban(request.user):
  28. logout(request)
  29. request.user = AnonymousUser()
  30. class OnlineTrackerMiddleware(object):
  31. def process_request(self, request):
  32. if request.user.is_authenticated():
  33. try:
  34. request._misago_online_tracker = request.user.online_tracker
  35. except Online.DoesNotExist:
  36. tracker.start_tracking(request, request.user)
  37. else:
  38. request._misago_online_tracker = None
  39. def process_response(self, request, response):
  40. if hasattr(request, '_misago_online_tracker'):
  41. online_tracker = request._misago_online_tracker
  42. if online_tracker:
  43. if request.user.is_anonymous():
  44. tracker.stop_tracking(request, online_tracker)
  45. else:
  46. tracker.update_tracker(request, online_tracker)
  47. return response