forked from p15670423/monkey
Common: Improve network range validation (less regex)
This commit is contained in:
parent
a1d9118433
commit
ce33a7b2f4
|
@ -1,24 +1,64 @@
|
||||||
import re
|
import re
|
||||||
|
from ipaddress import AddressValueError, IPv4Address, IPv4Network, NetmaskValueError
|
||||||
|
|
||||||
from marshmallow import ValidationError
|
from marshmallow import ValidationError
|
||||||
|
|
||||||
ip_regex = r"((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
|
hostname_pattern = r"([A-Za-z0-9]*[A-Za-z]+[A-Za-z0-9]*.?)*([A-Za-z0-9]*[A-Za-z]+[A-Za-z0-9]*)"
|
||||||
cird_notation_regex = r"([0-9]|1[0-9]|2[0-9]|3[0-2])"
|
hostname_regex = re.compile(hostname_pattern)
|
||||||
hostname_regex = r"([A-Za-z0-9]*[A-Za-z]+[A-Za-z0-9]*.?)*([A-Za-z0-9]*[A-Za-z]+[A-Za-z0-9]*)"
|
|
||||||
|
|
||||||
|
|
||||||
def validate_subnet_range(subnet_range: str):
|
def validate_subnet_range(subnet_range: str):
|
||||||
range_regexes = [
|
try:
|
||||||
"^" + ip_regex + "$|",
|
return validate_ip(subnet_range)
|
||||||
"^" + ip_regex + r"\s*-\s*" + ip_regex + "$|",
|
except ValidationError:
|
||||||
"^" + ip_regex + "/" + cird_notation_regex + "$|",
|
pass
|
||||||
"^" + hostname_regex + "$",
|
|
||||||
]
|
try:
|
||||||
range_regexes = re.compile("".join(range_regexes))
|
return validate_ip_range(subnet_range)
|
||||||
if not re.match(range_regexes, subnet_range):
|
except ValidationError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
return validate_ip_network(subnet_range)
|
||||||
|
except ValidationError:
|
||||||
|
pass
|
||||||
|
|
||||||
|
try:
|
||||||
|
return validate_hostname(subnet_range)
|
||||||
|
except ValidationError:
|
||||||
raise ValidationError(f"Invalid subnet range {subnet_range}")
|
raise ValidationError(f"Invalid subnet range {subnet_range}")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_hostname(hostname: str):
|
||||||
|
match = re.match(hostname_regex, hostname)
|
||||||
|
if match and match.group() == hostname:
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
raise ValidationError(f"Invalid hostname {hostname}")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_ip_network(ip_network: str):
|
||||||
|
try:
|
||||||
|
IPv4Network(ip_network, strict=False)
|
||||||
|
return
|
||||||
|
except (NetmaskValueError, AddressValueError):
|
||||||
|
raise ValidationError(f"Invalid IPv4 network {ip_network}")
|
||||||
|
|
||||||
|
|
||||||
|
def validate_ip_range(ip_range: str):
|
||||||
|
try:
|
||||||
|
ip_range = ip_range.replace(" ", "")
|
||||||
|
ips = ip_range.split("-")
|
||||||
|
validate_ip(ips[0])
|
||||||
|
validate_ip(ips[1])
|
||||||
|
if len(ips) != 2:
|
||||||
|
raise ValidationError(f"Invalid IP range {ip_range}")
|
||||||
|
except (AddressValueError, IndexError):
|
||||||
|
raise ValidationError(f"Invalid IP range {ip_range}")
|
||||||
|
|
||||||
|
|
||||||
def validate_ip(ip: str):
|
def validate_ip(ip: str):
|
||||||
if not re.match(re.compile("".join(["^", ip_regex, "$"])), ip):
|
try:
|
||||||
raise ValidationError(f"Invalid ip address {ip}")
|
IPv4Address(ip)
|
||||||
|
except AddressValueError:
|
||||||
|
raise ValidationError(f"Invalid IP address {ip}")
|
||||||
|
|
Loading…
Reference in New Issue