middleware.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. __package__ = 'archivebox.core'
  2. import ipaddress
  3. from django.utils import timezone
  4. from django.contrib.auth.middleware import RemoteUserMiddleware
  5. from django.core.exceptions import ImproperlyConfigured
  6. from ..config import PUBLIC_SNAPSHOTS, REVERSE_PROXY_USER_HEADER, REVERSE_PROXY_WHITELIST
  7. def detect_timezone(request, activate: bool=True):
  8. gmt_offset = (request.COOKIES.get('GMT_OFFSET') or '').strip()
  9. tz = None
  10. if gmt_offset.replace('-', '').isdigit():
  11. tz = timezone.get_fixed_timezone(int(gmt_offset))
  12. if activate:
  13. timezone.activate(tz)
  14. # print('GMT_OFFSET', gmt_offset, tz)
  15. return tz
  16. def TimezoneMiddleware(get_response):
  17. def middleware(request):
  18. detect_timezone(request, activate=True)
  19. return get_response(request)
  20. return middleware
  21. def CacheControlMiddleware(get_response):
  22. def middleware(request):
  23. response = get_response(request)
  24. if '/archive/' in request.path or '/static/' in request.path:
  25. policy = 'public' if PUBLIC_SNAPSHOTS else 'private'
  26. response['Cache-Control'] = f'{policy}, max-age=60, stale-while-revalidate=300'
  27. # print('Set Cache-Control header to', response['Cache-Control'])
  28. return response
  29. return middleware
  30. class ReverseProxyAuthMiddleware(RemoteUserMiddleware):
  31. header = 'HTTP_{normalized}'.format(normalized=REVERSE_PROXY_USER_HEADER.replace('-', '_').upper())
  32. def process_request(self, request):
  33. if REVERSE_PROXY_WHITELIST == '':
  34. return
  35. ip = request.META.get('REMOTE_ADDR')
  36. for cidr in REVERSE_PROXY_WHITELIST.split(','):
  37. try:
  38. network = ipaddress.ip_network(cidr)
  39. except ValueError:
  40. raise ImproperlyConfigured(
  41. "The REVERSE_PROXY_WHITELIST config paramater is in invalid format, or "
  42. "contains invalid CIDR. Correct format is a coma-separated list of IPv4/IPv6 CIDRs.")
  43. if ipaddress.ip_address(ip) in network:
  44. return super().process_request(request)