Reverse v6 validation, reverse domain name generation

This commit is contained in:
Sebastian Lohff 2017-04-06 11:56:55 +02:00
parent 2fc672690f
commit c09ba916e0
2 changed files with 30 additions and 0 deletions

View File

@ -175,6 +175,15 @@ class ReverseZoneForm(forms.ModelForm):
self.fields['nameservers'].queryset = self.fields['nameservers'].queryset.distinct() self.fields['nameservers'].queryset = self.fields['nameservers'].queryset.distinct()
def clean_prefix(self):
prefix = self.cleaned_data['prefix']
net = ipaddress.ip_network(prefix)
if net.version == 6 and net.prefixlen % 4 != 0:
raise forms.ValidationError("IPv6 reverse zone prefix length has to be a multiple of 4")
return prefix
def clean(self): def clean(self):
cleaned_data = super(ReverseZoneForm, self).clean() cleaned_data = super(ReverseZoneForm, self).clean()

View File

@ -49,6 +49,9 @@ class Domain(MntdObject):
def getPK(self): def getPK(self):
return self.name return self.name
def getZone(self):
return self.name
def get_absolute_url(self): def get_absolute_url(self):
return reverse("domains:domain-show", args=(self.name,)) return reverse("domains:domain-show", args=(self.name,))
@ -94,6 +97,24 @@ class ReverseZone(WhoisObject):
def getNetwork(self): def getNetwork(self):
return ipaddress.ip_network(self.prefix()) return ipaddress.ip_network(self.prefix())
def getZone(self):
net = self.parentNet.getNetwork()
if net.version == 4:
# for these we delegate the full domain
if 0 < net.prefixlen < 32 and net.prefixlen % 8 == 0:
zoneParts = net.reverse_pointer.split(".")
return ".".join(zoneParts[1:])
else:
# return RFC2317 compliant zone
return net.reverse_pointer
else:
# ipv6
# thefuck ipaddress lib... _the_ _fuck_
zoneParts = net.reverse_pointer.split(".")[-2 - net.prefixlen // 4:]
return ".".join(zoneParts)
def get_absolute_url(self): def get_absolute_url(self):
return reverse("domains:reversezone-show", args=(self.pk,)) return reverse("domains:reversezone-show", args=(self.pk,))