aboutsummaryrefslogtreecommitdiff
path: root/portal-gui/rpkigui/myrpki/forms.py
blob: 672eff38a08dd7b92e2699aa8fbe359d507bfcbe (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
# $Id$
"""
Copyright (C) 2010  SPARTA, Inc. dba Cobham Analytic Solutions

Permission to use, copy, modify, and distribute this software for any
purpose with or without fee is hereby granted, provided that the above
copyright notice and this permission notice appear in all copies.

THE SOFTWARE IS PROVIDED "AS IS" AND SPARTA DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS.  IN NO EVENT SHALL SPARTA BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
"""

from django import forms

import rpki.ipaddrs

from rpkigui.myrpki import models
from rpkigui.myrpki.asnset import asnset

class AddConfForm(forms.Form):
    handle = forms.CharField(required=True,
            help_text='your handle for your rpki instance')
    run_rpkid = forms.BooleanField(required=False, initial=True,
            label='Run rpkid?',
            help_text='do you want to run your own instance of rpkid?')
    rpkid_server_host = forms.CharField(initial='rpkid.example.org',
            label='rpkid hostname',
            help_text='publicly visible hostname for your rpkid instance')
    rpkid_server_port = forms.IntegerField(initial=4404,
            label='rpkid port')
    run_pubd = forms.BooleanField(required=False, initial=False,
            label='Run pubd?',
            help_text='do you want to run your own instance of pubd?')
    pubd_server_host = forms.CharField(initial='pubd.example.org',
            label='pubd hostname',
            help_text='publicly visible hostname for your pubd instance')
    pubd_server_port = forms.IntegerField(initial=4402, label='pubd port')
    pubd_contact_info = forms.CharField(initial='repo-man@rpki.example.org',
            label='Pubd contact',
            help_text='email address for the operator of your pubd instance')

class ImportForm(forms.Form):
    '''Form used for uploading parent/child identity xml files'''
    handle = forms.CharField()
    xml = forms.FileField()

def PrefixSplitForm(prefix, *args, **kwargs):
    class _wrapper(forms.Form):
        lo = forms.IPAddressField()
        hi = forms.IPAddressField()

        def clean_lo(self):
            lo = self.cleaned_data.get('lo')
            # convert from string to long representation
            try:
                loaddr = rpki.ipaddrs.parse(lo)
            except socket.error:
                raise forms.ValidationError, 'Invalid IP address string'
            pfx_loaddr = rpki.ipaddrs.parse(prefix.lo)
            pfx_hiaddr = rpki.ipaddrs.parse(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')
            # convert from string to long representation
            try:
                hiaddr = rpki.ipaddrs.parse(hi)
            except socket.error:
                raise forms.ValidationError, 'Invalid IP address string'
            pfx_loaddr = rpki.ipaddrs.parse(prefix.lo)
            pfx_hiaddr = rpki.ipaddrs.parse(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.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 = rpki.ipaddrs.parse(hi)
                loaddr = rpki.ipaddrs.parse(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)

def PrefixAllocateForm(iv, child_set, *args, **kwargs):
    class _wrapper(forms.Form):
        child = forms.ModelChoiceField(initial=iv, queryset=child_set,
                required=False)
    return _wrapper(*args, **kwargs)

def PrefixRoaForm(prefix, *args, **kwargs):
    prefix_range = prefix.as_resource_range()

    class _wrapper(forms.Form):
        asns = forms.CharField(max_length=200, required=False,
                help_text='Comma-separated list of ASNs')
        max_length = forms.IntegerField(required=False,
                min_value=prefix_range.prefixlen(),
                max_value=prefix_range.datum_type.bits)

        def clean_max_length(self):
            v = self.cleaned_data.get('max_length')
            if not v:
                v = prefix_range.prefixlen()
            return v

        def clean_asns(self):
            try:
                v = asnset(self.cleaned_data.get('asns'))
                return ','.join(str(x) for x in sorted(v))
            except ValueError:
                raise forms.ValidationError, \
                        'Must be a list of integers separated by commas.'
            return self.cleaned_data['asns']

        def clean(self):
            if not prefix.is_prefix():
                raise forms.ValidationError, \
                        '%s can not be represented as a prefix.' % (prefix,)
            if prefix.allocated:
                raise forms.ValidationError, \
                        'Prefix is allocated to a child.'
            return self.cleaned_data

    return _wrapper(*args, **kwargs)

def PrefixDeleteForm(prefix, *args, **kwargs):
    class _wrapped(forms.Form):
        delete = forms.BooleanField(label='Yes, I want to delete this prefix:')

        def clean(self):
            v = self.cleaned_data.get('delete')
            if v:
                if not prefix.parent:
                    raise forms.ValidationError, \
                            'Can not delete prefix received from parent'
                if prefix.allocated:
                    raise forms.ValidationError, 'Prefix is allocated to child'
                if prefix.roa_requests.all():
                    raise forms.ValidationError, 'Prefix is used in your ROAs'
                if prefix.children.all():
                    raise forms.ValidationError, 'Prefix has been subdivided'
            return self.cleaned_data

    return _wrapped(*args, **kwargs)

# vim:sw=4 ts=8 expandtab