aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/gui/app/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid/rpki/gui/app/views.py')
-rw-r--r--rpkid/rpki/gui/app/views.py113
1 files changed, 68 insertions, 45 deletions
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index 57439aa6..d238be55 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -40,6 +40,7 @@ from rpki.gui.app import models, forms, glue, range_list
from rpki.resource_set import (resource_range_as, resource_range_ipv4,
resource_range_ipv6, roa_prefix_ipv4)
from rpki.exceptions import BadIPResource
+from rpki import sundial
import rpki.gui.cacheview.models
import rpki.gui.routeview.models
@@ -138,9 +139,15 @@ def generic_import(request, queryset, configure, form_class=None,
tmpf.write(form.cleaned_data['xml'].read())
tmpf.close()
z = Zookeeper(handle=conf.handle)
+ handle = form.cleaned_data.get('handle')
+ # CharField uses an empty string for the empty value, rather than
+ # None. Convert to none in this case, since configure_child/parent
+ # expects it.
+ if handle == '':
+ handle = None
# configure_repository returns None, so can't use tuple expansion
# here. Unpack the tuple below if post_import_redirect is None.
- r = configure(z, tmpf.name, form.cleaned_data.get('handle'))
+ r = configure(z, tmpf.name, handle)
os.remove(tmpf.name)
if post_import_redirect:
url = post_import_redirect
@@ -157,7 +164,6 @@ def generic_import(request, queryset, configure, form_class=None,
@handle_required
def dashboard(request):
-
conf = request.session['handle']
used_asns = range_list.RangeList()
@@ -244,6 +250,14 @@ def conf_select(request):
def serve_xml(content, basename):
+ """
+ Generate a HttpResponse object with the content type set to XML.
+
+ `content` is a string.
+
+ `basename` is the prefix to specify for the XML filename.
+
+ """
resp = http.HttpResponse(content, mimetype='application/xml')
resp['Content-Disposition'] = 'attachment; filename=%s.xml' % (basename, )
return resp
@@ -251,18 +265,18 @@ def serve_xml(content, basename):
@handle_required
def conf_export(request):
- """Return the identity.xml for the current handle.
+ """Return the identity.xml for the current handle."""
- """
- handle = request.session['handle']
- return serve_xml(glue.read_identity(handle.handle), 'identity')
+ conf = request.session['handle']
+ z = Zookeeper(handle=conf.handle)
+ xml = z.generate_identity()
+ return serve_xml(str(xml), '%s.identity' % conf.handle)
@handle_required
def parent_import(request):
conf = request.session['handle']
- return generic_import(request, conf.parents,
- Zookeeper.configure_parent)
+ return generic_import(request, conf.parents, Zookeeper.configure_parent)
@handle_required
@@ -270,17 +284,15 @@ def parent_list(request):
"""List view for parent objects."""
conf = request.session['handle']
return object_list(request, queryset=conf.parents.all(),
- extra_context={
- 'create_url': reverse(parent_import),
- 'create_label': 'Import'})
+ extra_context={'create_url': reverse(parent_import),
+ 'create_label': 'Import'})
@handle_required
-def parent_view(request, pk):
+def parent_detail(request, pk):
"""Detail view for a particular parent."""
- handle = request.session['handle']
- qs = handle.parents.all()
- return object_detail(request, qs, object_id=pk)
+ conf = request.session['handle']
+ return object_detail(request, conf.parents.all(), object_id=pk)
@handle_required
@@ -288,21 +300,30 @@ def parent_delete(request, pk):
conf = request.session['handle']
get_object_or_404(conf.parents, pk=pk) # confirm permission
return delete_object(request, model=models.Parent, object_id=pk,
- post_delete_redirect=reverse(parent_list),
- template_name='app/parent_detail.html',
- extra_context={'confirm_delete': True})
+ post_delete_redirect=reverse(parent_list),
+ template_name='app/parent_detail.html',
+ extra_context={'confirm_delete': True})
+
+
+@handle_required
+def parent_export(request, pk):
+ """Export XML repository request for a given parent."""
+ conf = request.session['handle']
+ parent = get_object_or_404(conf.parents, pk=pk)
+ z = Zookeeper(handle=conf.handle)
+ xml = z.generate_repository_request(parent)
+ return serve_xml(str(xml), '%s.repository' % parent.handle)
@handle_required
def child_import(request):
conf = request.session['handle']
- return generic_import(request, conf.children, Zookeeper.configure_child,
- post_import_redirect=reverse(child_list))
+ return generic_import(request, conf.children, Zookeeper.configure_child)
@handle_required
def child_list(request):
- """List view for child objects."""
+ """List of children for current user."""
conf = request.session['handle']
return object_list(request, queryset=conf.children.all(),
template_name='app/child_list.html',
@@ -383,7 +404,7 @@ def child_edit(request, pk):
if request.method == 'POST':
form = form_class(request.POST, request.FILES)
if form.is_valid():
- child.valid_until = form.cleaned_data.get('valid_until')
+ child.valid_until = sundial.datetime.fromdatetime(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()
@@ -488,8 +509,8 @@ def roa_delete(request, pk):
"""
conf = request.session['handle']
- obj = get_object_or_404(models.ROARequestPrefix.objects, roa_request__issuer=conf,
- pk=pk)
+ obj = get_object_or_404(models.ROARequestPrefix.objects,
+ roa_request__issuer=conf, pk=pk)
if request.method == 'POST':
roa = obj.roa_request
@@ -656,29 +677,18 @@ def child_wizard(request):
@handle_required
-def export_child_response(request, child_handle):
- """
- Export the XML file containing the output of the configure_child
- to send back to the client.
-
- """
- conf = request.session['handle']
- log = request.META['wsgi.errors']
- return serve_xml(glue.read_child_response(log, conf, child_handle),
- child_handle)
-
-
-@handle_required
-def export_child_repo_response(request, child_handle):
+def child_response(request, pk):
"""
Export the XML file containing the output of the configure_child
to send back to the client.
"""
conf = request.session['handle']
- log = request.META['wsgi.errors']
- return serve_xml(glue.read_child_repo_response(log, conf, child_handle),
- child_handle)
+ child = get_object_or_404(models.Child, issuer=conf, pk=pk)
+ z = Zookeeper(handle=conf.handle)
+ xml = z.generate_parental_response(child)
+ resp = serve_xml(str(xml), child.handle)
+ return resp
@handle_required
@@ -816,7 +826,7 @@ def route_view(request):
ts = dict((attr['name'], attr['ts']) for attr in models.Timestamp.objects.values())
return render(request, 'app/routes_view.html',
{'routes': routes, 'timestamp': ts})
-
+
@handle_required
def repository_list(request):
@@ -848,14 +858,15 @@ def repository_delete(request, pk):
extra_context={'confirm_delete': True})
-@superuser_required
+@handle_required
def repository_import(request):
+ """Import XML response file from repository operator."""
return generic_import(request,
models.Repository.objects,
Zookeeper.configure_repository,
- form_class=forms.ImportClientForm,
+ form_class=forms.ImportRepositoryForm,
post_import_redirect=reverse(repository_list))
-
+
@superuser_required
def client_list(request):
@@ -884,3 +895,15 @@ def client_import(request):
Zookeeper.configure_publication_client,
form_class=forms.ImportClientForm,
post_import_redirect=reverse(client_list))
+
+
+@superuser_required
+def client_export(request, pk):
+ """Return the XML file resulting from a configure_publication_client
+ request.
+
+ """
+ client = get_object_or_404(models.Client, pk=pk)
+ z = Zookeeper()
+ xml = z.generate_repository_response(client)
+ return serve_xml(str(xml), '%s.repo' % z.handle)