diff options
-rw-r--r-- | portal-gui/rpkigui/myrpki/forms.py | 40 | ||||
-rw-r--r-- | portal-gui/rpkigui/myrpki/misc.py | 21 |
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 |