added isValidDomain to host validation; added INVALID_HOST to error messages

This commit is contained in:
David Kennedy 2023-10-30 17:57:45 -04:00
parent 228da2aafa
commit 0b22d5e63a
No known key found for this signature in database
GPG key ID: 6528A5386E66B96B
3 changed files with 45 additions and 4 deletions

View file

@ -51,9 +51,8 @@ class DomainNameserverForm(forms.Form):
ip_list = self.extract_ip_list(ip) ip_list = self.extract_ip_list(ip)
if ip and not server and ip_list: # validate if the form has a server or an ip
self.add_error("server", NameserverError(code=nsErrorCodes.MISSING_HOST)) if ip and ip_list or server:
elif server:
self.validate_nameserver_ip_combo(domain, server, ip_list) self.validate_nameserver_ip_combo(domain, server, ip_list)
return cleaned_data return cleaned_data
@ -86,6 +85,20 @@ class DomainNameserverForm(forms.Form):
code=nsErrorCodes.MISSING_IP, nameserver=domain, ip=ip_list code=nsErrorCodes.MISSING_IP, nameserver=domain, ip=ip_list
), ),
) )
elif e.code == nsErrorCodes.MISSING_HOST:
self.add_error(
"server",
NameserverError(
code=nsErrorCodes.MISSING_HOST, nameserver=domain, ip=ip_list
),
)
elif e.code == nsErrorCodes.INVALID_HOST:
self.add_error(
"server",
NameserverError(
code=nsErrorCodes.INVALID_HOST, nameserver=server, ip=ip_list
),
)
else: else:
self.add_error("ip", str(e)) self.add_error("ip", str(e))

View file

@ -304,6 +304,25 @@ class Domain(TimeStampedModel, DomainHelper):
regex = re.compile(full_pattern) regex = re.compile(full_pattern)
return bool(regex.match(nameserver)) return bool(regex.match(nameserver))
@classmethod
def isValidDomain(cls, nameserver: str):
"""Checks for validity of nameserver string based on these rules:
- first character is alpha
- last character is not - or .
- all characters alpha, 0-9, -, or .
- 2 character min, 24 character max
"""
# pattern to test for valid domain
# pattern = r'^[a-zA-Z][a-zA-Z0-9-.]{0,22}[a-zA-Z0-9]$'
pattern = r"^[a-zA-Z][a-zA-Z0-9-.]*(\.[a-zA-Z0-9-]+){2}[a-zA-Z0-9]$"
# attempt to match the pattern
match = re.match(pattern, nameserver)
# return true if nameserver matches, and length less than 25;
# otherwise false
return bool(match) and len(nameserver) < 25
@classmethod @classmethod
def checkHostIPCombo(cls, name: str, nameserver: str, ip: list[str]): def checkHostIPCombo(cls, name: str, nameserver: str, ip: list[str]):
"""Checks the parameters past for a valid combination """Checks the parameters past for a valid combination
@ -311,6 +330,8 @@ class Domain(TimeStampedModel, DomainHelper):
- nameserver is a subdomain but is missing ip - nameserver is a subdomain but is missing ip
- nameserver is not a subdomain but has ip - nameserver is not a subdomain but has ip
- nameserver is a subdomain but an ip passed is invalid - nameserver is a subdomain but an ip passed is invalid
- nameserver is not a valid domain
- ip is provided but is missing domain
Args: Args:
hostname (str)- nameserver or subdomain hostname (str)- nameserver or subdomain
@ -319,7 +340,11 @@ class Domain(TimeStampedModel, DomainHelper):
NameserverError (if exception hit) NameserverError (if exception hit)
Returns: Returns:
None""" None"""
if cls.isSubdomain(name, nameserver) and (ip is None or ip == []): if ip and not nameserver:
raise NameserverError(code=nsErrorCodes.MISSING_HOST)
elif nameserver and not cls.isValidDomain(nameserver):
raise NameserverError(code=nsErrorCodes.INVALID_HOST, nameserver=nameserver)
elif cls.isSubdomain(name, nameserver) and (ip is None or ip == []):
raise NameserverError(code=nsErrorCodes.MISSING_IP, nameserver=nameserver) raise NameserverError(code=nsErrorCodes.MISSING_IP, nameserver=nameserver)
elif not cls.isSubdomain(name, nameserver) and (ip is not None and ip != []): elif not cls.isSubdomain(name, nameserver) and (ip is not None and ip != []):

View file

@ -66,6 +66,7 @@ class NameserverErrorCodes(IntEnum):
- 4 TOO_MANY_HOSTS more than the max allowed host values - 4 TOO_MANY_HOSTS more than the max allowed host values
- 5 UNABLE_TO_UPDATE_DOMAIN unable to update the domain - 5 UNABLE_TO_UPDATE_DOMAIN unable to update the domain
- 6 MISSING_HOST host is missing for a nameserver - 6 MISSING_HOST host is missing for a nameserver
- 7 INVALID_HOST host is invalid for a nameserver
""" """
MISSING_IP = 1 MISSING_IP = 1
@ -74,6 +75,7 @@ class NameserverErrorCodes(IntEnum):
TOO_MANY_HOSTS = 4 TOO_MANY_HOSTS = 4
UNABLE_TO_UPDATE_DOMAIN = 5 UNABLE_TO_UPDATE_DOMAIN = 5
MISSING_HOST = 6 MISSING_HOST = 6
INVALID_HOST = 7
class NameserverError(Exception): class NameserverError(Exception):
@ -102,6 +104,7 @@ class NameserverError(Exception):
NameserverErrorCodes.MISSING_HOST: ( NameserverErrorCodes.MISSING_HOST: (
"Name server must be provided to enter IP address." "Name server must be provided to enter IP address."
), ),
NameserverErrorCodes.INVALID_HOST: ("Name server, {}, is not valid."),
} }
def __init__(self, *args, code=None, nameserver=None, ip=None, **kwargs): def __init__(self, *args, code=None, nameserver=None, ip=None, **kwargs):