middleware.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. from django.contrib.auth import logout
  2. from django.utils import timezone
  3. from misago.users.bans import get_request_ip_ban, get_user_ban
  4. from misago.users.models import AnonymousUser, Online
  5. class RealIPMiddleware(object):
  6. def process_request(self, request):
  7. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
  8. if x_forwarded_for:
  9. request._misago_real_ip = x_forwarded_for.split(',')[0]
  10. else:
  11. request._misago_real_ip = request.META.get('REMOTE_ADDR')
  12. class UserMiddleware(object):
  13. def process_request(self, request):
  14. if request.user.is_anonymous():
  15. request.user = AnonymousUser()
  16. elif not request.user.is_superuser:
  17. if get_request_ip_ban(request) or get_user_ban(request.user):
  18. logout(request)
  19. class OnlineTrackerMiddleware(object):
  20. def process_request(self, request):
  21. if request.user.is_authenticated():
  22. try:
  23. request._misago_online_tracker = request.user.online_tracker
  24. except Online.DoesNotExist:
  25. online_tracker = Online.objects.create(
  26. user=request.user, current_ip=request._misago_real_ip)
  27. request.user.online_tracker = online_tracker
  28. request._misago_online_tracker = online_tracker
  29. else:
  30. request._misago_online_tracker = None
  31. def process_response(self, request, response):
  32. if hasattr(request, '_misago_online_tracker'):
  33. tracker = request._misago_online_tracker
  34. if tracker:
  35. if request.user.is_anonymous():
  36. # User logged off, update his last visit and blam tracker
  37. user = tracker.user
  38. user.last_login = tracker.last_click
  39. user.last_ip = tracker.current_ip
  40. user.save(update_fields=['last_login', 'last_ip'])
  41. tracker.delete()
  42. else:
  43. # Bump user's tracker time
  44. tracker.current_ip = request._misago_real_ip
  45. tracker.last_click = timezone.now()
  46. tracker.save(update_fields=['last_click', 'current_ip'])
  47. return response