middleware.py 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. from django.conf import settings
  2. from django.contrib.auth import logout
  3. from django.core.urlresolvers import resolve
  4. from django.utils import timezone
  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.views import avatarserver
  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. resolved_path = resolve(request.path)
  19. return resolved_path.func(request, **resolved_path.kwargs)
  20. class UserMiddleware(object):
  21. def process_request(self, request):
  22. if request.user.is_anonymous():
  23. request.user = AnonymousUser()
  24. elif not request.user.is_superuser:
  25. if get_request_ip_ban(request) or get_user_ban(request.user):
  26. logout(request)
  27. class OnlineTrackerMiddleware(object):
  28. def process_request(self, request):
  29. if request.user.is_authenticated():
  30. try:
  31. request._misago_online_tracker = request.user.online_tracker
  32. except Online.DoesNotExist:
  33. online_tracker = Online.objects.create(
  34. user=request.user, current_ip=request._misago_real_ip)
  35. request.user.online_tracker = online_tracker
  36. request._misago_online_tracker = online_tracker
  37. else:
  38. request._misago_online_tracker = None
  39. def process_response(self, request, response):
  40. if hasattr(request, '_misago_online_tracker'):
  41. tracker = request._misago_online_tracker
  42. if tracker:
  43. if request.user.is_anonymous():
  44. # User logged off, update his last visit and blam tracker
  45. user = tracker.user
  46. user.last_login = tracker.last_click
  47. user.last_ip = tracker.current_ip
  48. user.save(update_fields=['last_login', 'last_ip'])
  49. tracker.delete()
  50. else:
  51. # Bump user's tracker time
  52. tracker.current_ip = request._misago_real_ip
  53. tracker.last_click = timezone.now()
  54. tracker.save(update_fields=['last_click', 'current_ip'])
  55. return response