fix webhooks
This commit is contained in:
81
app/utils/ip.py
Normal file
81
app/utils/ip.py
Normal file
@ -0,0 +1,81 @@
|
||||
import ipaddress
|
||||
import socket
|
||||
from urllib.parse import urlparse
|
||||
|
||||
|
||||
class IpUtils:
|
||||
|
||||
@staticmethod
|
||||
def is_ipv4(ip):
|
||||
"""
|
||||
判断是不是ipv4
|
||||
"""
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET, ip)
|
||||
except AttributeError: # no inet_pton here,sorry
|
||||
try:
|
||||
socket.inet_aton(ip)
|
||||
except socket.error:
|
||||
return False
|
||||
return ip.count('.') == 3
|
||||
except socket.error: # not a valid ip
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def is_ipv6(ip):
|
||||
"""
|
||||
判断是不是ipv6
|
||||
"""
|
||||
try:
|
||||
socket.inet_pton(socket.AF_INET6, ip)
|
||||
except socket.error: # not a valid ip
|
||||
return False
|
||||
return True
|
||||
|
||||
@staticmethod
|
||||
def is_internal(hostname):
|
||||
"""
|
||||
判断一个host是内网还是外网
|
||||
"""
|
||||
hostname = urlparse(hostname).hostname
|
||||
if IpUtils.is_ip(hostname):
|
||||
return IpUtils.is_private_ip(hostname)
|
||||
else:
|
||||
return IpUtils.is_internal_domain(hostname)
|
||||
|
||||
@staticmethod
|
||||
def is_ip(addr):
|
||||
"""
|
||||
判断是不是ip
|
||||
"""
|
||||
try:
|
||||
socket.inet_aton(addr)
|
||||
return True
|
||||
except socket.error:
|
||||
return False
|
||||
|
||||
@staticmethod
|
||||
def is_internal_domain(domain):
|
||||
"""
|
||||
判断域名是否为内部域名
|
||||
"""
|
||||
# 获取域名对应的 IP 地址
|
||||
try:
|
||||
ip = socket.gethostbyname(domain)
|
||||
except socket.error:
|
||||
return False
|
||||
|
||||
# 判断 IP 地址是否属于内网 IP 地址范围
|
||||
return IpUtils.is_private_ip(ip)
|
||||
|
||||
@staticmethod
|
||||
def is_private_ip(ip_str):
|
||||
"""
|
||||
判断是不是内网ip
|
||||
"""
|
||||
try:
|
||||
return ipaddress.ip_address(ip_str.strip()).is_private
|
||||
except Exception as e:
|
||||
print(e)
|
||||
return False
|
Reference in New Issue
Block a user