aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--portal-gui/rpkigui/myrpki/forms.py40
-rw-r--r--portal-gui/rpkigui/myrpki/misc.py21
2 files changed, 48 insertions, 13 deletions
diff --git a/portal-gui/rpkigui/myrpki/forms.py b/portal-gui/rpkigui/myrpki/forms.py
index f86f40dd..fbd02df9 100644
--- a/portal-gui/rpkigui/myrpki/forms.py
+++ b/portal-gui/rpkigui/myrpki/forms.py
@@ -2,6 +2,7 @@
from django import forms
import models
+from rpkigui.myrpki.misc import str_to_addr
def ConfCertForm(request):
class CertForm(forms.ModelForm):
@@ -177,23 +178,46 @@ def PrefixSplitForm(prefix, *args, **kwargs):
def clean_lo(self):
lo = self.cleaned_data.get('lo')
- if lo > prefix.hi:
+ # convert from string to long representation
+ try:
+ loaddr = str_to_addr(lo)
+ except socket.error:
+ raise forms.ValidationError, 'Invalid IP address string'
+ pfx_loaddr = str_to_addr(prefix.lo)
+ pfx_hiaddr = str_to_addr(prefix.hi)
+ if type(loaddr) != type(pfx_hiaddr):
+ raise forms.ValidationError, 'Not the same IP address type as parent'
+ if loaddr < pfx_loaddr or loaddr > pfx_hiaddr:
raise forms.ValidationError, 'Value out of range of parent prefix'
return lo
def clean_hi(self):
hi = self.cleaned_data.get('hi')
- if hi < prefix.lo:
+ # convert from string to long representation
+ try:
+ hiaddr = str_to_addr(hi)
+ except socket.error:
+ raise forms.ValidationError, 'Invalid IP address string'
+ pfx_loaddr = str_to_addr(prefix.lo)
+ pfx_hiaddr = str_to_addr(prefix.hi)
+ if type(hiaddr) != type(pfx_loaddr):
+ raise forms.ValidationError, 'Not the same IP address type as parent'
+ if hiaddr < pfx_loaddr or hiaddr > pfx_hiaddr:
raise forms.ValidationError, 'Value out of range of parent prefix'
return hi
def clean(self):
- hi = self.cleaned_data['hi']
- lo = self.cleaned_data['lo']
- if hi < lo:
- raise forms.ValidationError, 'Invalid upper range'
- if prefix.allocated:
- raise forms.ValidationError, 'Prefix is assigned to child'
+ hi = self.cleaned_data.get('hi')
+ lo = self.cleaned_data.get('lo')
+ # hi or lo may be None if field validation failed
+ if hi and lo:
+ # convert from string to long representation
+ hiaddr = str_to_addr(hi)
+ loaddr = str_to_addr(lo)
+ if hiaddr < loaddr:
+ raise forms.ValidationError, 'Hi value is smaller than Lo'
+ if prefix.allocated:
+ raise forms.ValidationError, 'Prefix is assigned to child'
return self.cleaned_data
return _wrapper(*args, **kwargs)
diff --git a/portal-gui/rpkigui/myrpki/misc.py b/portal-gui/rpkigui/myrpki/misc.py
index d8881694..4e0970a6 100644
--- a/portal-gui/rpkigui/myrpki/misc.py
+++ b/portal-gui/rpkigui/myrpki/misc.py
@@ -4,12 +4,23 @@ import socket
import rpki.resource_set
import rpki.ipaddrs
-def str_to_range(lo, hi):
- """Convert IP address string to resourcce_range_ip."""
+def str_to_addr(s):
+ '''Convert an IP address string to either a v4addr or v6addr.'''
+ if isinstance(s, unicode):
+ s = s.encode() # v{4,6}addr require plain string
try:
- v = rpki.resource_set.resource_range_ipv4(rpki.ipaddrs.v4addr(str(lo)), rpki.ipaddrs.v4addr(str(hi)))
+ return rpki.ipaddrs.v4addr(s)
except socket.error:
- v = rpki.resource_set.resource_range_ipv6(rpki.ipaddrs.v6addr(str(lo)), rpki.ipaddrs.v6addr(str(hi)))
- return v
+ return rpki.ipaddrs.v6addr(s)
+
+def str_to_range(lo, hi):
+ """Convert IP address strings to resourcce_range_ip."""
+ x = str_to_addr(lo)
+ y = str_to_addr(hi)
+ assert type(x) == type(y)
+ if isinstance(x, rpki.ipaddrs.v4addr):
+ return rpki.resource_set.resource_range_ipv4(x, y)
+ else:
+ return rpki.resource_set.resource_range_ipv6(x, y)
# vim:sw=4 ts=8 expandtab