middleware.py 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  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 django.utils import timezone
  6. from misago.users.bans import get_request_ip_ban, get_user_ban
  7. from misago.users.models import AnonymousUser, Online
  8. from misago.users.views import avatarserver
  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._misago_real_ip = x_forwarded_for.split(',')[0]
  14. else:
  15. request._misago_real_ip = request.META.get('REMOTE_ADDR')
  16. class AvatarServerMiddleware(object):
  17. def process_request(self, request):
  18. if request.path.startswith(settings.MISAGO_AVATAR_SERVER_PATH):
  19. request.user = DjAnonymousUser()
  20. resolved_path = resolve(request.path)
  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_superuser:
  27. if get_request_ip_ban(request) or get_user_ban(request.user):
  28. logout(request)
  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. online_tracker = Online.objects.create(
  36. user=request.user, current_ip=request._misago_real_ip)
  37. request.user.online_tracker = online_tracker
  38. request._misago_online_tracker = online_tracker
  39. else:
  40. request._misago_online_tracker = None
  41. def process_response(self, request, response):
  42. if hasattr(request, '_misago_online_tracker'):
  43. tracker = request._misago_online_tracker
  44. if tracker:
  45. if request.user.is_anonymous():
  46. # User logged off, update his last visit and blam tracker
  47. user = tracker.user
  48. user.last_login = tracker.last_click
  49. user.last_ip = tracker.current_ip
  50. user.save(update_fields=['last_login', 'last_ip'])
  51. tracker.delete()
  52. else:
  53. # Bump user's tracker time
  54. tracker.current_ip = request._misago_real_ip
  55. tracker.last_click = timezone.now()
  56. tracker.save(update_fields=['last_click', 'current_ip'])
  57. return response