ip2.py 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from . import utils as util
  2. from . import defaults as defs
  3. def get_client_ip(
  4. request,
  5. proxy_order='left-most',
  6. proxy_count=None,
  7. proxy_trusted_ips=None,
  8. request_header_order=None,
  9. ):
  10. client_ip = None
  11. routable = False
  12. if proxy_count is None:
  13. proxy_count = -1
  14. if proxy_trusted_ips is None:
  15. proxy_trusted_ips = []
  16. if request_header_order is None:
  17. request_header_order = defs.IPWARE_META_PRECEDENCE_ORDER
  18. for key in request_header_order:
  19. value = util.get_request_meta(request, key)
  20. if value:
  21. ips, ip_count = util.get_ips_from_string(value)
  22. if ip_count < 1:
  23. # we are expecting at least one IP address to process
  24. continue
  25. if proxy_count == 0 and ip_count > 1:
  26. # we are not expecting requests via any proxies
  27. continue
  28. if proxy_count > 0 and proxy_count != ip_count - 1:
  29. # we are expecting requests via `proxy_count` number of proxies
  30. continue
  31. if proxy_trusted_ips and ip_count < 2:
  32. # we are expecting requests via at least one trusted proxy
  33. continue
  34. if proxy_order == 'right-most' and ip_count > 1:
  35. # we are expecting requests via proxies to be custom as per `<proxy2>, <proxy1>, <client>`
  36. ips.reverse()
  37. if proxy_trusted_ips:
  38. for proxy in proxy_trusted_ips:
  39. if proxy in ips[-1]:
  40. client_ip, routable = util.get_ip_info(ips[0])
  41. if client_ip and routable:
  42. return client_ip, routable
  43. else:
  44. client_ip, routable = util.get_ip_info(util.get_best_ip(client_ip, ips[0]))
  45. if client_ip and routable:
  46. return client_ip, routable
  47. return client_ip, routable