middleware.py 1.7 KB

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