fix: Resolve IP/domain validation
This commit is contained in:
@ -1,24 +1,32 @@
|
||||
from pydantic import BaseModel, field_validator, ValidationInfo
|
||||
from ipaddress import IPv4Address, IPv6Address, ip_address
|
||||
import socket
|
||||
import re
|
||||
|
||||
def validate_ip_or_domain(v: str) -> str | None:
|
||||
if v is None or v.strip() in ['', 'None']:
|
||||
return None
|
||||
|
||||
v_stripped = v.strip()
|
||||
|
||||
try:
|
||||
ip_address(v_stripped)
|
||||
return v_stripped
|
||||
except ValueError:
|
||||
domain_regex = re.compile(
|
||||
r'^(?:[a-z0-9](?:[a-z0-9-]{0,61}[a-z0-9])?\.)+[a-z0-9][a-z0-9-]{0,61}[a-z0-9]$',
|
||||
re.IGNORECASE
|
||||
)
|
||||
if domain_regex.match(v_stripped):
|
||||
return v_stripped
|
||||
raise ValueError(f"'{v_stripped}' is not a valid IP address or domain name.")
|
||||
|
||||
class StatusResponse(BaseModel):
|
||||
ipv4: str | None = None
|
||||
ipv6: str | None = None
|
||||
|
||||
@field_validator('ipv4', 'ipv6', mode='before')
|
||||
def check_ip_or_domain(cls, v: str, info: ValidationInfo):
|
||||
if v is None:
|
||||
return v
|
||||
try:
|
||||
ip_address(v)
|
||||
return v
|
||||
except ValueError:
|
||||
try:
|
||||
socket.getaddrinfo(v, None)
|
||||
return v
|
||||
except socket.gaierror:
|
||||
raise ValueError(f"'{v}' is not a valid IPv4 or IPv6 address or domain name")
|
||||
def check_local_server_ip(cls, v: str | None):
|
||||
return validate_ip_or_domain(v)
|
||||
|
||||
class EditInputBody(StatusResponse):
|
||||
pass
|
||||
@ -28,14 +36,10 @@ class Node(BaseModel):
|
||||
ip: str
|
||||
|
||||
@field_validator('ip', mode='before')
|
||||
def check_ip(cls, v: str, info: ValidationInfo):
|
||||
if v is None:
|
||||
raise ValueError("IP cannot be None")
|
||||
try:
|
||||
ip_address(v)
|
||||
return v
|
||||
except ValueError:
|
||||
raise ValueError(f"'{v}' is not a valid IPv4 or IPv6 address")
|
||||
def check_node_ip(cls, v: str | None):
|
||||
if not v or not v.strip():
|
||||
raise ValueError("IP or Domain field cannot be empty.")
|
||||
return validate_ip_or_domain(v)
|
||||
|
||||
class AddNodeBody(Node):
|
||||
pass
|
||||
|
||||
Reference in New Issue
Block a user