middleware.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import pytz
  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.conf import settings
  7. from misago.users.bans import get_request_ip_ban, get_user_ban
  8. from misago.users.models import AnonymousUser, Online
  9. from misago.users.online import tracker
  10. class RealIPMiddleware(object):
  11. def process_request(self, request):
  12. x_forwarded_for = request.META.get('HTTP_X_FORWARDED_FOR')
  13. if x_forwarded_for:
  14. request._misago_real_ip = x_forwarded_for.split(',')[0]
  15. else:
  16. request._misago_real_ip = request.META.get('REMOTE_ADDR')
  17. class AvatarServerMiddleware(object):
  18. def process_request(self, request):
  19. if request.path_info.startswith(settings.MISAGO_AVATAR_SERVER_PATH):
  20. request.user = DjAnonymousUser()
  21. resolved_path = resolve(request.path_info)
  22. return resolved_path.func(request, **resolved_path.kwargs)
  23. class UserMiddleware(object):
  24. def process_request(self, request):
  25. if request.user.is_anonymous():
  26. request.user = AnonymousUser()
  27. elif not request.user.is_superuser:
  28. if get_request_ip_ban(request) or get_user_ban(request.user):
  29. logout(request)
  30. request.user.ip = request._misago_real_ip
  31. class TimezoneMiddleware(object):
  32. def process_request(self, request):
  33. if request.user.is_authenticated():
  34. timezone.activate(pytz.timezone(request.user.timezone))
  35. else:
  36. timezone.activate(pytz.timezone(settings.default_timezone))
  37. current_tz = timezone.get_current_timezone()
  38. utc_offset = current_tz.normalize(timezone.now()).utcoffset()
  39. utc_offset_seconds = int(utc_offset.total_seconds())
  40. request.preloaded_ember_data['utcOffset'] = utc_offset_seconds
  41. class PreloadUserMiddleware(object):
  42. def process_request(self, request):
  43. request.preloaded_ember_data.update({
  44. 'isAuthenticated': request.user.is_authenticated(),
  45. })
  46. if request.user.is_authenticated():
  47. request.preloaded_ember_data.update({
  48. 'user': {
  49. 'username': request.user.username,
  50. 'isAuthenticated': True,
  51. 'isAnonymous': False
  52. }
  53. })
  54. else:
  55. request.preloaded_ember_data.update({
  56. 'user': {
  57. 'isAuthenticated': False,
  58. 'isAnonymous': True,
  59. }
  60. })
  61. class OnlineTrackerMiddleware(object):
  62. def process_request(self, request):
  63. if request.user.is_authenticated():
  64. try:
  65. request._misago_online_tracker = request.user.online_tracker
  66. except Online.DoesNotExist:
  67. tracker.start_tracking(request, request.user)
  68. else:
  69. request._misago_online_tracker = None
  70. def process_response(self, request, response):
  71. if hasattr(request, '_misago_online_tracker'):
  72. online_tracker = request._misago_online_tracker
  73. if online_tracker:
  74. if request.user.is_anonymous():
  75. tracker.stop_tracking(request, online_tracker)
  76. else:
  77. tracker.update_tracker(request, online_tracker)
  78. return response