gooderp18绿色标准版
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

62 lines
2.2KB

  1. ##########################################################################
  2. #
  3. # pgAdmin 4 - PostgreSQL Tools
  4. #
  5. # Copyright (C) 2013 - 2020, The pgAdmin Development Team
  6. # This software is released under the PostgreSQL Licence
  7. #
  8. #########################################################################
  9. """This File Provides ipv4 and ipv6 address check."""
  10. import re
  11. IPV4SEG = r'(?:25[0-5]|(?:2[0-4]|1{0,1}[0-9]){0,1}[0-9])'
  12. IPV4ADDR = r'(?:(?:' + IPV4SEG + r'\.){3,3}' + IPV4SEG + r')'
  13. IPV6SEG = r'(?:(?:[0-9a-fA-F]){1,4})'
  14. IPV6GROUPS = (
  15. # 1:2:3:4:5:6:7:8
  16. r'(?:' + IPV6SEG + r':){7,7}' + IPV6SEG,
  17. # 1:: 1:2:3:4:5:6:7::
  18. r'(?:' + IPV6SEG + r':){1,7}:',
  19. # 1::8 1:2:3:4:5:6::8 1:2:3:4:5:6::8
  20. r'(?:' + IPV6SEG + r':){1,6}:' + IPV6SEG,
  21. # 1::7:8 1:2:3:4:5::7:8 1:2:3:4:5::8
  22. r'(?:' + IPV6SEG + r':){1,5}(?::' + IPV6SEG + r'){1,2}',
  23. # 1::6:7:8 1:2:3:4::6:7:8 1:2:3:4::8
  24. r'(?:' + IPV6SEG + r':){1,4}(?::' + IPV6SEG + r'){1,3}',
  25. # 1::5:6:7:8 1:2:3::5:6:7:8 1:2:3::8
  26. r'(?:' + IPV6SEG + r':){1,3}(?::' + IPV6SEG + r'){1,4}',
  27. # 1::4:5:6:7:8 1:2::4:5:6:7:8 1:2::8
  28. r'(?:' + IPV6SEG + r':){1,2}(?::' + IPV6SEG + r'){1,5}',
  29. # 1::3:4:5:6:7:8 1::3:4:5:6:7:8 1::8
  30. IPV6SEG + r':(?:(?::' + IPV6SEG + r'){1,6})',
  31. # ::2:3:4:5:6:7:8 ::2:3:4:5:6:7:8 ::8 ::
  32. r':(?:(?::' + IPV6SEG + r'){1,7}|:)',
  33. # fe80::7:8%eth0 fe80::7:8%1 (link-local IPv6 addresses with zone index)
  34. r'fe80:(?::' + IPV6SEG + r'){0,4}%[0-9a-zA-Z]{1,}',
  35. # ::255.255.255.255 ::ffff:255.255.255.255 ::ffff:0:255.255.255.255
  36. # (IPv4-mapped IPv6 addresses and IPv4-translated addresses)
  37. r'::(?:ffff(?::0{1,4}){0,1}:){0,1}[^\s:]' + IPV4ADDR,
  38. # 2001:db8:3:4::192.0.2.33 64:ff9b::192.0.2.33
  39. # (IPv4-Embedded IPv6 Address)
  40. r'(?:' + IPV6SEG + r':){1,4}:[^\s:]' + IPV4ADDR,
  41. )
  42. # Reverse rows for greedy match
  43. IPV6ADDR = '|'.join(['(?:{})'.format(g) for g in IPV6GROUPS[::-1]])
  44. ip6re = re.compile(IPV6ADDR)
  45. ip4re = re.compile(IPV4ADDR)
  46. def is_valid_ip4address(addr):
  47. return ip4re.match(addr)
  48. def is_valid_ip6address(addr):
  49. return ip6re.match(addr)
  50. def is_valid_ipaddress(addr):
  51. return ip4re.match(addr) or is_valid_ip6address(addr)
上海开阖软件有限公司 沪ICP备12045867号-1