diff options
Diffstat (limited to 'rpkid/rpki/gui/app/views.py')
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 138 |
1 files changed, 78 insertions, 60 deletions
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index b1fdec33..57439aa6 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -33,6 +33,7 @@ from django import http from django.views.generic.list_detail import object_list, object_detail from django.views.generic.create_update import delete_object from django.core.urlresolvers import reverse +from django.contrib.auth.models import User from rpki.irdb import Zookeeper, ChildASN, ChildNet from rpki.gui.app import models, forms, glue, range_list @@ -314,7 +315,7 @@ def child_list(request): def child_add_resource(request, pk, form_class, unused_list, callback, template_name='app/child_add_resource_form.html'): conf = request.session['handle'] - child = models.Child.objects.filter(issuer=conf, pk=pk) + child = models.Child.objects.get(issuer=conf, pk=pk) if request.method == 'POST': form = form_class(request.POST, request.FILES) if form.is_valid(): @@ -328,55 +329,73 @@ def child_add_resource(request, pk, form_class, unused_list, callback, def add_asn_callback(child, form): - r = resource_range_as.parse_str(form.as_range) - child.asns.create(min=r.min, max=r.max) + asns = form.cleaned_data.get('asns') + r = resource_range_as.parse_str(asns) + child.asns.create(start_as=r.min, end_as=r.max) def child_add_asn(request, pk): - return child_add_resource(request, pk, form_class=forms.AddASNForm, - callback=add_asn_callback) + conf = request.session['handle'] + get_object_or_404(models.Child, issuer=conf, pk=pk) + qs = models.ResourceRangeAS.objects.filter(cert__parent__issuer=conf) + return child_add_resource(request, pk, forms.AddASNForm(qs), [], + add_asn_callback) def add_address_callback(child, form): + address_range = form.cleaned_data.get('address_range') try: - r = resource_range_ipv4.parse_str(form.prefix) - family = 4 + r = resource_range_ipv4.parse_str(address_range) + version = 'IPv4' except BadIPResource: - r = resource_range_ipv6.parse_str(form.prefix) - family = 6 - child.address_ranges.create(min=str(r.min), max=str(r.max), family=family) + r = resource_range_ipv6.parse_str(address_range) + version = 'IPv6' + child.address_ranges.create(start_ip=str(r.min), end_ip=str(r.max), + version=version) def child_add_address(request, pk): - return child_add_resource(request, pk, form_class=forms.AddAddressForm, - callback=add_address_callback) + conf = request.session['handle'] + get_object_or_404(models.Child, issuer=conf, pk=pk) + qsv4 = models.ResourceRangeAddressV4.objects.filter(cert__parent__issuer=conf) + qsv6 = models.ResourceRangeAddressV6.objects.filter(cert__parent__issuer=conf) + return child_add_resource(request, pk, + forms.AddNetForm(qsv4, qsv6), + [], + callback=add_address_callback) @handle_required def child_view(request, pk): - '''Detail view of child for the currently selected handle.''' - handle = request.session['handle'] - child = get_object_or_404(handle.children.all(), pk=pk) - return render(request, 'app/child_view.html', {'child': child}) + """Detail view of child for the currently selected handle.""" + conf = request.session['handle'] + child = get_object_or_404(conf.children.all(), pk=pk) + return render(request, 'app/child_detail.html', + {'object': child, 'can_edit': True}) @handle_required def child_edit(request, pk): """Edit the end validity date for a resource handle's child.""" - handle = request.session['handle'] - child = get_object_or_404(handle.children.all(), pk=pk) - + conf = request.session['handle'] + child = get_object_or_404(conf.children.all(), pk=pk) + form_class = forms.ChildForm(child) if request.method == 'POST': - form = forms.ChildForm(request.POST, request.FILES, instance=child) + form = form_class(request.POST, request.FILES) if form.is_valid(): - form.save() - glue.configure_resources(request.META['wsgi.errors'], handle) + child.valid_until = form.cleaned_data.get('valid_until') + child.save() + # remove AS & prefixes that are not selected in the form + models.ChildASN.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('as_ranges')).delete() + models.ChildNet.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('address_ranges')).delete() return http.HttpResponseRedirect(child.get_absolute_url()) else: - form = forms.ChildForm(instance=child) + form = form_class(initial={ + 'as_ranges': child.asns.all(), + 'address_ranges': child.address_ranges.all()}) return render(request, 'app/child_form.html', - {'child': child, 'form': form}) + {'object': child, 'form': form}) @handle_required @@ -593,42 +612,45 @@ def refresh(request): return http.HttpResponseRedirect(reverse(dashboard)) -@login_required -def initialize(request): - """ - Initialize a new user account. - - """ - if request.method == 'POST': - form = forms.GenericConfirmationForm(request.POST) - if form.is_valid(): - glue.initialize_handle(request.META['wsgi.errors'], - handle=request.user.username, owner=request.user) - return http.HttpResponseRedirect(reverse(dashboard)) - else: - form = forms.GenericConfirmationForm() - - return render(request, 'app/initialize_form.html', {'form': form}) - - @handle_required def child_wizard(request): """ Wizard mode to create a new locally hosted child. """ - conf = request.session['handle'] - log = request.META['wsgi.errors'] if not request.user.is_superuser: return http.HttpResponseForbidden() if request.method == 'POST': - form = forms.ChildWizardForm(conf, request.POST) + form = forms.ChildWizardForm(request.POST, request.FILES) if form.is_valid(): - glue.create_child(log, conf, form.cleaned_data['handle']) + handle = form.cleaned_data.get('handle') + pw = form.cleaned_data.get('password') + email = form.cleaned_data.get('email') + + User.objects.create_user(handle, email, pw) + + # FIXME etree_wrapper should allow us to deal with file objects + t = NamedTemporaryFile(delete=False) + t.close() + + zk_child = Zookeeper(handle=handle) + identity_xml = zk_child.initialize() + identity_xml.save(t.name) + parent = form.cleaned_data.get('parent') + zk_parent = Zookeeper(handle=parent.handle) + parent_response, _ = zk_parent.configure_child(t.name) + parent_response.save(t.name) + repo_req, _ = zk_child.configure_parent(t.name) + repo_req.save(t.name) + repo_resp, _ = zk_parent.configure_publication_client(t.name) + repo_resp.save(t.name) + zk_child.configure_repository(t.name) + os.remove(t.name) + return http.HttpResponseRedirect(reverse(dashboard)) else: - form = forms.ChildWizardForm(conf) + form = forms.ChildWizardForm() return render(request, 'app/child_wizard_form.html', {'form': form}) @@ -677,18 +699,12 @@ def update_bpki(request): @handle_required def child_delete(request, pk): conf = request.session['handle'] - child = get_object_or_404(conf.children, pk=pk) - - if request.method == 'POST': - form = forms.GenericConfirmationForm(request.POST, request.FILES) - if form.is_valid(): - child.delete() - return http.HttpResponseRedirect(reverse(child_list)) - else: - form = forms.GenericConfirmationForm() - - return render(request, 'app/child_delete_form.html', - {'form': form, 'object': child}) + # verify this child belongs to the current user + get_object_or_404(conf.children, pk=pk) + return delete_object(request, model=models.Child, object_id=pk, + post_delete_redirect=reverse(child_list), + template_name='app/child_detail.html', + extra_context={'confirm_delete': True}) @login_required @@ -857,7 +873,9 @@ def client_detail(request, pk): @superuser_required def client_delete(request, pk): return delete_object(request, model=models.Client, object_id=pk, - template_name='app/client_detail.html') + post_delete_redirect=reverse(client_list), + template_name='app/client_detail.html', + extra_context={'confirm_delete': True}) @superuser_required |