aboutsummaryrefslogtreecommitdiff
path: root/portal-gui/rpkigui
diff options
context:
space:
mode:
Diffstat (limited to 'portal-gui/rpkigui')
-rw-r--r--portal-gui/rpkigui/myrpki/admin.py20
-rw-r--r--portal-gui/rpkigui/myrpki/models.py35
-rw-r--r--portal-gui/rpkigui/myrpki/urls.py3
-rw-r--r--portal-gui/rpkigui/myrpki/views.py95
-rw-r--r--portal-gui/rpkigui/settings.py2
-rw-r--r--portal-gui/rpkigui/templates/myrpki/child_view.html27
-rw-r--r--portal-gui/rpkigui/templates/myrpki/dashboard.html17
-rw-r--r--portal-gui/rpkigui/templates/myrpki/parent_view.html16
-rw-r--r--portal-gui/rpkigui/templates/myrpki/resource_view.html8
9 files changed, 149 insertions, 74 deletions
diff --git a/portal-gui/rpkigui/myrpki/admin.py b/portal-gui/rpkigui/myrpki/admin.py
index 72d330a2..3d843bb0 100644
--- a/portal-gui/rpkigui/myrpki/admin.py
+++ b/portal-gui/rpkigui/myrpki/admin.py
@@ -2,9 +2,6 @@ from django import forms
from django.contrib import admin
from rpkigui.myrpki import models
-#class CertAdmin( admin.ModelAdmin ):
-# pass
-
class ConfAdmin( admin.ModelAdmin ):
pass
@@ -23,10 +20,13 @@ class ParentAdmin( admin.ModelAdmin ):
class RoaAdmin( admin.ModelAdmin ):
pass
-#admin.site.register( models.Cert, CertAdmin )
-admin.site.register( models.Conf, ConfAdmin )
-admin.site.register( models.Child, ChildAdmin )
-admin.site.register( models.AddressRange, AddressRangeAdmin )
-admin.site.register( models.Asn, AsnAdmin )
-admin.site.register( models.Parent, ParentAdmin )
-admin.site.register( models.Roa, RoaAdmin )
+class ResourceCertAdmin(admin.ModelAdmin):
+ pass
+
+admin.site.register(models.Conf, ConfAdmin)
+admin.site.register(models.Child, ChildAdmin)
+admin.site.register(models.AddressRange, AddressRangeAdmin)
+admin.site.register(models.Asn, AsnAdmin)
+admin.site.register(models.Parent, ParentAdmin)
+admin.site.register(models.Roa, RoaAdmin)
+admin.site.register(models.ResourceCert, ResourceCertAdmin)
diff --git a/portal-gui/rpkigui/myrpki/models.py b/portal-gui/rpkigui/myrpki/models.py
index d062698e..9abc80ed 100644
--- a/portal-gui/rpkigui/myrpki/models.py
+++ b/portal-gui/rpkigui/myrpki/models.py
@@ -79,10 +79,9 @@ class Parent(models.Model):
# service_uri = models.URLField( verify_exists=False )
# sia_base = models.URLField( verify_exists=False )
- # resources granted from my parent
- address_range = models.ManyToManyField(AddressRange, blank=True,
- related_name='from_parent')
- asn = models.ManyToManyField(Asn, related_name='from_parent', blank=True)
+ #address_range = models.ManyToManyField(AddressRange, blank=True,
+ # related_name='from_parent')
+ #asn = models.ManyToManyField(Asn, related_name='from_parent', blank=True)
def __unicode__(self):
return u"%s's parent %s" % (self.conf, self.handle)
@@ -94,15 +93,43 @@ class Parent(models.Model):
# parents of a specific configuration should be unique
unique_together = ('conf', 'handle')
+class ResourceCert(models.Model):
+ parent = models.ForeignKey(Parent, related_name='resources')
+
+ # resources granted from my parent
+ asn = models.ManyToManyField(Asn, related_name='from_cert', blank=True,
+ null=True)
+ address_range = models.ManyToManyField(AddressRange, related_name='from_cert',
+ blank=True, null=True)
+
+ # unique id for this resource certificate
+ # FIXME: URLField(verify_exists=False) doesn't seem to work - the admin
+ # editor won't accept a rsync:// scheme as valid
+ uri = models.CharField(max_length=200)
+
+ # certificate validity period
+ not_before = models.DateTimeField()
+ not_after = models.DateTimeField()
+
+ def get_absolute_url(self):
+ return u"/myrpki/resource/%d" % (self.pk,)
+
+ def __unicode__(self):
+ return u"%s's resource cert from parent %s" % (self.parent.conf.handle,
+ self.parent.handle)
+
class Roa(models.Model):
conf = models.ForeignKey(Conf, related_name='roas')
prefix = models.ManyToManyField(AddressRange)
max_len = models.IntegerField()
asn = models.IntegerField()
comments = models.TextField()
+ active = models.BooleanField()
def __unicode__(self):
return u"%s's ROA for %d" % (self.conf, self.asn)
def get_absolute_url(self):
return u'/myrpki/roa/%d' % (self.pk, )
+
+# vim:sw=4 ts=8 expandtab
diff --git a/portal-gui/rpkigui/myrpki/urls.py b/portal-gui/rpkigui/myrpki/urls.py
index 2a8e2a96..b8230bff 100644
--- a/portal-gui/rpkigui/myrpki/urls.py
+++ b/portal-gui/rpkigui/myrpki/urls.py
@@ -16,6 +16,7 @@ urlpatterns = patterns('',
(r'^import/parent$', views.parent_import),
(r'^import/child$', views.child_import),
(r'^parent/(?P<parent_handle>[^/]+)$', views.parent_view),
+ (r'^child/(?P<child_handle>[^/]+)$', views.child_view),
# (r'^parent/(?P<parent_handle>[^/]+)/address$', views.parent_address),
# (r'^parent/(?P<parent_handle>[^/]+)/asn$', views.parent_asn),
(r'^address/(?P<pk>\d+)$', views.address_view),
@@ -23,3 +24,5 @@ urlpatterns = patterns('',
(r'^roa/$', views.roa_edit ),
(r'^roa/(?P<pk>\d+)$', views.roa_edit ),
)
+
+# vim:sw=4 ts=8 expandtab
diff --git a/portal-gui/rpkigui/myrpki/views.py b/portal-gui/rpkigui/myrpki/views.py
index 1789fd91..c7d93779 100644
--- a/portal-gui/rpkigui/myrpki/views.py
+++ b/portal-gui/rpkigui/myrpki/views.py
@@ -91,14 +91,16 @@ def dashboard(request):
roa_asns = [r.asn for r in handle.roas.all()]
# get list of unallocated asns
asns = [o for p in handle.parents.all()
- for o in p.asn.filter(parent__isnull=True, allocated__isnull=True).exclude(lo__in=roa_asns)
+ for c in p.resources.all()
+ for o in c.asn.filter(parent__isnull=True, allocated__isnull=True).exclude(lo__in=roa_asns)
if (o.hi == o.lo)]
# get list of address ranges included in ROAs
roa_addrs = [p for r in handle.roas.all() for p in r.prefix.all()]
# get list of unallocated address ranges
ars = [o for p in handle.parents.all()
- for o in p.address_range.filter(parent__isnull=True, allocated__isnull=True)
+ for c in p.resources.all()
+ for o in c.address_range.filter(parent__isnull=True, allocated__isnull=True)
if (not o in roa_addrs)]
return render('myrpki/dashboard.html', { 'conf': handle, 'asns': asns,
@@ -138,36 +140,36 @@ def dashboard(request):
# return delete_object( request, model=models.Cert, object_id=id,
# post_delete_redirect='/dashboard/' )
-@login_required
-def conf_add(request):
- '''Allow the user to create a new configuration.'''
- errors = []
- if request.method == 'POST':
- form = forms.AddConfForm(request.POST)
- if form.is_valid():
- try:
- handle = form.cleaned_data['handle']
- # ensure this user is in the group for this handle
- grps = request.user.groups.filter(name=handle)
- if len(grps) == 0:
- errors.append(
- 'You are not in the proper group for that handle.')
- else:
- conf = models.Conf.objects.create(
- handle=form.cleaned_data['handle'], owner=grps[0])
- conf.save()
- glue.form_to_conf(form.cleaned_data)
- return http.HttpResponseRedirect('/myrpki/')
- # data model will ensure the handle is unique
- except IntegrityError, e:
- print e
- errors.append('That handle already exists.')
- else:
- errors.append("The form wasn't valid.")
- else:
- form = forms.AddConfForm()
- return render_to_response('myrpki/add_conf.html',
- { 'form': form, 'errors': errors })
+#@login_required
+#def conf_add(request):
+# '''Allow the user to create a new configuration.'''
+# errors = []
+# if request.method == 'POST':
+# form = forms.AddConfForm(request.POST)
+# if form.is_valid():
+# try:
+# handle = form.cleaned_data['handle']
+# # ensure this user is in the group for this handle
+# grps = request.user.groups.filter(name=handle)
+# if len(grps) == 0:
+# errors.append(
+# 'You are not in the proper group for that handle.')
+# else:
+# conf = models.Conf.objects.create(
+# handle=form.cleaned_data['handle'], owner=grps[0])
+# conf.save()
+# glue.form_to_conf(form.cleaned_data)
+# return http.HttpResponseRedirect('/myrpki/')
+# # data model will ensure the handle is unique
+# except IntegrityError, e:
+# print e
+# errors.append('That handle already exists.')
+# else:
+# errors.append("The form wasn't valid.")
+# else:
+# form = forms.AddConfForm()
+# return render_to_response('myrpki/add_conf.html',
+# { 'form': form, 'errors': errors })
@login_required
def conf_list(request):
@@ -314,26 +316,23 @@ def child_import(request):
{ 'form': form, 'kind': 'child',
'post_url': '/myrpki/import/child'}, request)
-def get_parent_or_404(handle, obj):
- '''Return the Parent object that the given address range derives
+def get_parents_or_404(handle, obj):
+ '''Return the Parent object(s) that the given address range derives
from, or raise a 404 error.'''
while obj.parent: obj = obj.parent
- if isinstance(obj, models.AddressRange):
- fn = lambda x: x.address_range.all()
- else:
- fn = lambda x: x.asn.all()
+ cert_set = obj.from_cert.filter(parent__in=handle.parents.all())
+ if cert_set.count() == 0:
+ raise http.Http404
- for p in handle.parents.all():
- if obj in fn(p): return p
- raise http.Http404
+ return handle.parents.filter(pk__in=[c.parent.pk for c in cert_set])
def resource_view(request, object_type, form_type, pk):
'''view/subdivide an address range.'''
handle = request.session['handle']
obj = get_object_or_404(object_type, pk=pk)
# ensure this resource range belongs to a parent of the current conf
- parent = get_parent_or_404(handle, obj)
+ parent_set = get_parents_or_404(handle, obj)
if request.method == 'POST':
form = form_type(handle, obj, request.POST)
@@ -357,7 +356,7 @@ def resource_view(request, object_type, form_type, pk):
else:
form = form_type(handle, obj)
return render('myrpki/resource_view.html', { 'addr': obj, 'form': form,
- 'parent': parent }, request)
+ 'parent': parent_set }, request)
@handle_required
def address_view(request, pk):
@@ -405,3 +404,13 @@ def roa_edit(request, pk=None):
prefix = [o.pk for o in obj.prefix.all()] if obj else []
form = forms.RoaForm(handle, asn, comments, prefix)
return render('myrpki/roaform.html', { 'form': form }, request)
+
+@handle_required
+def child_view(request, child_handle):
+ '''Detail view of child for the currently selected handle.'''
+ handle = request.session['handle']
+ child = get_object_or_404(handle.children.all(), handle__exact=child_handle)
+
+ return render('myrpki/child_view.html', { 'child': child }, request)
+
+# vim:sw=4 ts=8 expandtab
diff --git a/portal-gui/rpkigui/settings.py b/portal-gui/rpkigui/settings.py
index 529b0235..bc7a6a99 100644
--- a/portal-gui/rpkigui/settings.py
+++ b/portal-gui/rpkigui/settings.py
@@ -62,7 +62,7 @@ MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
# for django 1.2
-# 'django.middleware.csrf.CsrfMiddleware'
+ 'django.middleware.csrf.CsrfMiddleware'
)
ROOT_URLCONF = 'rpkigui.urls'
diff --git a/portal-gui/rpkigui/templates/myrpki/child_view.html b/portal-gui/rpkigui/templates/myrpki/child_view.html
new file mode 100644
index 00000000..77e2cf51
--- /dev/null
+++ b/portal-gui/rpkigui/templates/myrpki/child_view.html
@@ -0,0 +1,27 @@
+{% extends "base.html" %}
+
+{% block content %}
+<p>Handle: <a href="/myrpki/">{{ request.session.handle.handle }}</a>
+<h1>Child View</h1>
+<p>Child: {{ child.handle }}
+
+<h2>Delegated Addresses</h2>
+<table>
+ <tr><td>Low</td><td>High</td><td></td></tr>
+{% for a in child.address_range.all %}
+<tr>
+ <td>{{ a.lo }}</td>
+ <td>{{ a.hi }}</td>
+ <td><a href="{{ a.get_absolute_url }}">view</a></td>
+</tr>
+{% endfor %}
+</table>
+
+<h2>Delegated ASNs</h2>
+<ul>
+{% for a in child.asn.all %}
+<li><a href="{{ a.get_absolute_url }}">{{ a }}</a>
+{% endfor %}
+</ul>
+
+{% endblock %}
diff --git a/portal-gui/rpkigui/templates/myrpki/dashboard.html b/portal-gui/rpkigui/templates/myrpki/dashboard.html
index 12fee303..692e204d 100644
--- a/portal-gui/rpkigui/templates/myrpki/dashboard.html
+++ b/portal-gui/rpkigui/templates/myrpki/dashboard.html
@@ -7,22 +7,31 @@
<div style="border: inset">
<h1 style="text-align: center">Parents</h1>
+
<ul>
{% for parent in request.session.handle.parents.all %}
<li><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a>
-{% if parent.asn.count or parent.address_range.count %}
+
+{% if parent.resources.count %}
<p>Accepted resources:
<ul>
-{% for asn in parent.asn.all %}
+{% for cert in parent.resources.all %}
+
+{% for asn in cert.asn.all %}
<li><a href="{{ asn.get_absolute_url }}">{{ asn }}</a>
{% endfor %}
-{% for address in parent.address_range.all %}
+
+{% for address in cert.address_range.all %}
<li><a href="{{ address.get_absolute_url }}">{{ address }}</a>
{% endfor %}
+
+{% endfor %} <!--certs-->
</ul>
{% endif %}
+
{% endfor %}
</ul>
+
<a href="/myrpki/import/parent">[add]</a>
</div>
@@ -32,7 +41,7 @@
<p>
<ul>
{% for child in request.session.handle.children.all %}
-<li><a href="/myrpki/child/{{ child.handle }}/">{{ child.handle }}</a>
+<li><a href="/myrpki/child/{{ child.handle }}">{{ child.handle }}</a>
{% if child.address_range.count or child.asn.count %}
<p>Delegated resources:
<ul>
diff --git a/portal-gui/rpkigui/templates/myrpki/parent_view.html b/portal-gui/rpkigui/templates/myrpki/parent_view.html
index 1f1c2465..9756c83a 100644
--- a/portal-gui/rpkigui/templates/myrpki/parent_view.html
+++ b/portal-gui/rpkigui/templates/myrpki/parent_view.html
@@ -5,30 +5,26 @@
<h1>Parent View</h1>
<p>Parent: {{ parent.handle }}
<h2>Delegated Addresses</h2>
-{% if parent.address_range.count %}
<table>
<tr><td>Low</td><td>High</td><td></td></tr>
-{% for a in parent.address_range.all %}
+{% for c in parent.resources.all %}
+{% for a in c.address_range.all %}
<tr>
<td>{{ a.lo }}</td>
<td>{{ a.hi }}</td>
<td><a href="{{ a.get_absolute_url }}">view</a></td>
</tr>
{% endfor %}
+{% endfor %}
</table>
-{% else %}
-<p>--none--
-{% endif %}
<h2>Delegated ASNs</h2>
-{% if parent.asn.count %}
<ul>
-{% for a in parent.asn.all %}
+{% for c in parent.resources.all %}
+{% for a in c.asn.all %}
<li><a href="{{ a.get_absolute_url }}">{{ a }}</a>
{% endfor %}
+{% endfor %}
</ul>
-{% else %}
-<p>--none--
-{% endif %}
{% endblock %}
diff --git a/portal-gui/rpkigui/templates/myrpki/resource_view.html b/portal-gui/rpkigui/templates/myrpki/resource_view.html
index e2992f4e..d230e66f 100644
--- a/portal-gui/rpkigui/templates/myrpki/resource_view.html
+++ b/portal-gui/rpkigui/templates/myrpki/resource_view.html
@@ -8,8 +8,12 @@
<td>Range:</td><td>{{ addr }}</td>
</tr>
<tr>
- <td>Parent:</td>
- <td><a href="{{ parent.get_absolute_url }}">{{ parent.handle }}</a></td>
+ <td>Received from:</td>
+ <td>
+ {% for p in parent %}
+ <a href="{{ p.get_absolute_url }}">{{ p.handle }}</a>
+ {% endfor %}
+ </td>
</tr>
{% if addr.parent %}
<tr>