mirror of
https://github.com/cisagov/manage.get.gov.git
synced 2025-07-24 19:48:36 +02:00
fixed bugs in ip list handling, reformatted clean function in forms, removed custom field type for ip address in nameserverform
This commit is contained in:
parent
46f03cd4e4
commit
517390cc55
5 changed files with 56 additions and 58 deletions
|
@ -37,64 +37,58 @@ class DomainNameserverForm(forms.Form):
|
||||||
|
|
||||||
server = forms.CharField(label="Name server", strip=True)
|
server = forms.CharField(label="Name server", strip=True)
|
||||||
|
|
||||||
ip = IPAddressField(
|
ip = forms.CharField(label="IP Address (IPv4 or IPv6)", strip=True, required=False)
|
||||||
label="IP Address (IPv4 or IPv6)",
|
|
||||||
strip=True,
|
|
||||||
required=False,
|
|
||||||
# validators=[
|
|
||||||
# django.core.validators.validate_ipv46_address
|
|
||||||
# ],
|
|
||||||
)
|
|
||||||
|
|
||||||
def clean(self):
|
def clean(self):
|
||||||
|
# clean is called from clean_forms, which is called from is_valid
|
||||||
|
# after clean_fields. it is used to determine form level errors.
|
||||||
|
# is_valid is typically called from view during a post
|
||||||
cleaned_data = super().clean()
|
cleaned_data = super().clean()
|
||||||
|
self.clean_empty_strings(cleaned_data)
|
||||||
server = cleaned_data.get("server", "")
|
server = cleaned_data.get("server", "")
|
||||||
ip = cleaned_data.get("ip", "")
|
ip = cleaned_data.get("ip", None)
|
||||||
domain = cleaned_data.get("domain", "")
|
domain = cleaned_data.get("domain", "")
|
||||||
print(f"clean is called on {domain} {server}")
|
|
||||||
|
|
||||||
# make sure there's a nameserver if an ip is passed
|
ip_list = self.extract_ip_list(ip)
|
||||||
if ip:
|
|
||||||
ip_list = [ip.strip() for ip in ip.split(",")]
|
|
||||||
if not server and len(ip_list) > 0:
|
|
||||||
# If 'server' is empty, disallow 'ip' input
|
|
||||||
self.add_error(
|
|
||||||
"server", NameserverError(code=nsErrorCodes.MISSING_HOST)
|
|
||||||
)
|
|
||||||
|
|
||||||
# if there's a nameserver and an ip, validate nameserver/ip combo
|
if ip and not server and ip_list:
|
||||||
|
self.add_error("server", NameserverError(code=nsErrorCodes.MISSING_HOST))
|
||||||
if server:
|
elif server:
|
||||||
if ip:
|
self.validate_nameserver_ip_combo(domain, server, ip_list)
|
||||||
ip_list = [ip.strip() for ip in ip.split(",")]
|
|
||||||
else:
|
|
||||||
ip_list = [""]
|
|
||||||
try:
|
|
||||||
Domain.checkHostIPCombo(domain, server, ip_list)
|
|
||||||
except NameserverError as e:
|
|
||||||
if e.code == nsErrorCodes.GLUE_RECORD_NOT_ALLOWED:
|
|
||||||
self.add_error(
|
|
||||||
"server",
|
|
||||||
NameserverError(
|
|
||||||
code=nsErrorCodes.GLUE_RECORD_NOT_ALLOWED,
|
|
||||||
nameserver=domain,
|
|
||||||
ip=ip_list,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
elif e.code == nsErrorCodes.MISSING_IP:
|
|
||||||
self.add_error(
|
|
||||||
"ip",
|
|
||||||
NameserverError(
|
|
||||||
code=nsErrorCodes.MISSING_IP,
|
|
||||||
nameserver=domain,
|
|
||||||
ip=ip_list,
|
|
||||||
),
|
|
||||||
)
|
|
||||||
else:
|
|
||||||
self.add_error("ip", str(e))
|
|
||||||
|
|
||||||
return cleaned_data
|
return cleaned_data
|
||||||
|
|
||||||
|
def clean_empty_strings(self, cleaned_data):
|
||||||
|
ip = cleaned_data.get("ip", "")
|
||||||
|
if ip and len(ip.strip()) == 0:
|
||||||
|
cleaned_data["ip"] = None
|
||||||
|
|
||||||
|
def extract_ip_list(self, ip):
|
||||||
|
return [ip.strip() for ip in ip.split(",")] if ip else []
|
||||||
|
|
||||||
|
def validate_nameserver_ip_combo(self, domain, server, ip_list):
|
||||||
|
try:
|
||||||
|
Domain.checkHostIPCombo(domain, server, ip_list)
|
||||||
|
except NameserverError as e:
|
||||||
|
if e.code == nsErrorCodes.GLUE_RECORD_NOT_ALLOWED:
|
||||||
|
self.add_error(
|
||||||
|
"server",
|
||||||
|
NameserverError(
|
||||||
|
code=nsErrorCodes.GLUE_RECORD_NOT_ALLOWED,
|
||||||
|
nameserver=domain,
|
||||||
|
ip=ip_list,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
elif e.code == nsErrorCodes.MISSING_IP:
|
||||||
|
self.add_error(
|
||||||
|
"ip",
|
||||||
|
NameserverError(
|
||||||
|
code=nsErrorCodes.MISSING_IP, nameserver=domain, ip=ip_list
|
||||||
|
),
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
self.add_error("ip", str(e))
|
||||||
|
|
||||||
|
|
||||||
NameserverFormset = formset_factory(
|
NameserverFormset = formset_factory(
|
||||||
DomainNameserverForm,
|
DomainNameserverForm,
|
||||||
|
|
|
@ -260,7 +260,7 @@ class Domain(TimeStampedModel, DomainHelper):
|
||||||
"""Creates the host object in the registry
|
"""Creates the host object in the registry
|
||||||
doesn't add the created host to the domain
|
doesn't add the created host to the domain
|
||||||
returns ErrorCode (int)"""
|
returns ErrorCode (int)"""
|
||||||
if addrs is not None:
|
if addrs is not None and addrs != []:
|
||||||
addresses = [epp.Ip(addr=addr) for addr in addrs]
|
addresses = [epp.Ip(addr=addr) for addr in addrs]
|
||||||
request = commands.CreateHost(name=host, addrs=addresses)
|
request = commands.CreateHost(name=host, addrs=addresses)
|
||||||
else:
|
else:
|
||||||
|
@ -314,16 +314,14 @@ 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 == [] or ip == [""]):
|
if 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 (
|
elif not cls.isSubdomain(name, nameserver) and (ip is not None and ip != []):
|
||||||
ip is not None and ip != [] and ip != [""]
|
|
||||||
):
|
|
||||||
raise NameserverError(
|
raise NameserverError(
|
||||||
code=nsErrorCodes.GLUE_RECORD_NOT_ALLOWED, nameserver=nameserver, ip=ip
|
code=nsErrorCodes.GLUE_RECORD_NOT_ALLOWED, nameserver=nameserver, ip=ip
|
||||||
)
|
)
|
||||||
elif ip is not None and ip != [] and ip != [""]:
|
elif ip is not None and ip != []:
|
||||||
for addr in ip:
|
for addr in ip:
|
||||||
if not cls._valid_ip_addr(addr):
|
if not cls._valid_ip_addr(addr):
|
||||||
raise NameserverError(
|
raise NameserverError(
|
||||||
|
|
|
@ -35,7 +35,7 @@ class TestNameserverError(TestCase):
|
||||||
ip = "ip val"
|
ip = "ip val"
|
||||||
nameserver = "nameserver val"
|
nameserver = "nameserver val"
|
||||||
|
|
||||||
expected = f"Nameserver {nameserver} has an invalid IP address: {ip}"
|
expected = f"{nameserver}: Enter an IP address in the required format."
|
||||||
nsException = NameserverError(
|
nsException = NameserverError(
|
||||||
code=nsErrorCodes.INVALID_IP, nameserver=nameserver, ip=ip
|
code=nsErrorCodes.INVALID_IP, nameserver=nameserver, ip=ip
|
||||||
)
|
)
|
||||||
|
|
|
@ -87,7 +87,9 @@ class NameserverError(Exception):
|
||||||
NameserverErrorCodes.GLUE_RECORD_NOT_ALLOWED: (
|
NameserverErrorCodes.GLUE_RECORD_NOT_ALLOWED: (
|
||||||
"Name server address does not match domain name"
|
"Name server address does not match domain name"
|
||||||
),
|
),
|
||||||
NameserverErrorCodes.INVALID_IP: "{}: Enter an IP address in the required format.",
|
NameserverErrorCodes.INVALID_IP: (
|
||||||
|
"{}: Enter an IP address in the required format."
|
||||||
|
),
|
||||||
NameserverErrorCodes.TOO_MANY_HOSTS: (
|
NameserverErrorCodes.TOO_MANY_HOSTS: (
|
||||||
"Too many hosts provided, you may not have more than 13 nameservers."
|
"Too many hosts provided, you may not have more than 13 nameservers."
|
||||||
),
|
),
|
||||||
|
|
|
@ -295,8 +295,12 @@ class DomainNameserversView(DomainFormBaseView):
|
||||||
for form in formset:
|
for form in formset:
|
||||||
try:
|
try:
|
||||||
ip_string = form.cleaned_data["ip"]
|
ip_string = form.cleaned_data["ip"]
|
||||||
# Split the string into a list using a comma as the delimiter
|
# ip_string will be None or a string of IP addresses
|
||||||
ip_list = ip_string.split(",")
|
# comma-separated
|
||||||
|
ip_list = []
|
||||||
|
if ip_string:
|
||||||
|
# Split the string into a list using a comma as the delimiter
|
||||||
|
ip_list = ip_string.split(",")
|
||||||
# Remove any leading or trailing whitespace from each IP in the list
|
# Remove any leading or trailing whitespace from each IP in the list
|
||||||
# this will return [''] if no ips have been entered, which is taken
|
# this will return [''] if no ips have been entered, which is taken
|
||||||
# into account in the model in checkHostIPCombo
|
# into account in the model in checkHostIPCombo
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue