middleware.py 2.1 KB

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