aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2012-02-07 06:13:22 +0000
committerMichael Elkins <melkins@tislabs.com>2012-02-07 06:13:22 +0000
commit5c94397dc16e76d5b753741380fd19a895063cb8 (patch)
tree3f1bfa3b691a93fe01d77f548a9eefc0ae0ab664
parent24381f9684cd4eb8f7faba5213b9dd4b79bec4ed (diff)
add basic user management support
svn path=/branches/tk161/; revision=4304
-rw-r--r--rpkid/rpki/gui/app/forms.py5
-rw-r--r--rpkid/rpki/gui/app/models.py4
-rw-r--r--rpkid/rpki/gui/app/templates/app/dashboard.html3
-rw-r--r--rpkid/rpki/gui/app/templates/app/user_confirm_delete.html20
-rw-r--r--rpkid/rpki/gui/app/templates/app/user_list.html27
-rw-r--r--rpkid/rpki/gui/app/urls.py4
-rw-r--r--rpkid/rpki/gui/app/views.py42
7 files changed, 104 insertions, 1 deletions
diff --git a/rpkid/rpki/gui/app/forms.py b/rpkid/rpki/gui/app/forms.py
index 2fcceda2..2c20ee0f 100644
--- a/rpkid/rpki/gui/app/forms.py
+++ b/rpkid/rpki/gui/app/forms.py
@@ -294,3 +294,8 @@ def ChildForm(instance):
help_text='deselect to remove delegation')
return _wrapped
+
+
+class UserDeleteForm(forms.Form):
+ """Stub form for deleting users."""
+ pass
diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py
index 62e3a141..e551ee4b 100644
--- a/rpkid/rpki/gui/app/models.py
+++ b/rpkid/rpki/gui/app/models.py
@@ -99,6 +99,10 @@ class Conf(rpki.irdb.models.ResourceHolderCA):
"""
return Child.objects.filter(issuer=self)
+ @models.permalink
+ def get_absolute_url(self):
+ return ('rpki.gui.app.views.user_detail', [str(self.pk)])
+
class Meta:
proxy = True
diff --git a/rpkid/rpki/gui/app/templates/app/dashboard.html b/rpkid/rpki/gui/app/templates/app/dashboard.html
index 7d60ac74..172e981b 100644
--- a/rpkid/rpki/gui/app/templates/app/dashboard.html
+++ b/rpkid/rpki/gui/app/templates/app/dashboard.html
@@ -8,9 +8,10 @@
<li><a href="{% url rpki.gui.app.views.conf_list %}" title="select a different resource handle to manage">select identity</a></li>
</ul>
-{% if user.is_staff %}
+{% if user.is_superuser %}
<ul class='unstyled'>
<li><a href="{% url rpki.gui.app.views.child_wizard %}" title="create a new locally hosted resource handle">create child wizard</a></li>
+ <li><a href="{% url rpki.gui.app.views.user_list %}" title="manage users">users</a></li>
</ul>
{% endif %}
diff --git a/rpkid/rpki/gui/app/templates/app/user_confirm_delete.html b/rpkid/rpki/gui/app/templates/app/user_confirm_delete.html
new file mode 100644
index 00000000..76c66775
--- /dev/null
+++ b/rpkid/rpki/gui/app/templates/app/user_confirm_delete.html
@@ -0,0 +1,20 @@
+{% extends "app/app_base.html" %}
+
+{% block content %}
+<div class='page-title'>
+ <h1>Delete User</h1>
+</div>
+
+<div class='alert-message block-message warning'>
+ <p><strong>Please confirm</strong> that you would like to delete the following user account.
+ <h2>{{ object.handle }}</h2>
+ <div class='alert-actions'>
+ <form method='POST' action='{{ request.get_full_path }}'>
+ {% csrf_token %}
+ {{ form }}
+ <input class='btn danger' value='Delete' type='submit'>
+ <a class='btn' href='{% url rpki.gui.app.views.user_list %}'>Cancel</a>
+ </form>
+ </div>
+</div>
+{% endblock content %}
diff --git a/rpkid/rpki/gui/app/templates/app/user_list.html b/rpkid/rpki/gui/app/templates/app/user_list.html
new file mode 100644
index 00000000..8c90d3ac
--- /dev/null
+++ b/rpkid/rpki/gui/app/templates/app/user_list.html
@@ -0,0 +1,27 @@
+{% extends "app/app_base.html" %}
+
+{% block content %}
+<div class='page-title'>
+ <h1>Users</h1>
+</div>
+
+<table class='zebra-striped'>
+ <tr>
+ <th>Username</th>
+ <th>Email</th>
+ <th>Superuser</th>
+ <th>Action</th>
+ </tr>
+ {% for u in users %}
+ <tr>
+ <td>{{ u.0.handle }}</td>
+ <td>{{ u.1.email }}</td>
+ <td>{{ u.1.is_superuser }}</td>
+ <td>
+ <a class='btn small' href='{{ u.0.get_absolute_url }}/edit'>Edit</a>
+ <a class='btn small danger' href='{{ u.0.get_absolute_url }}/delete'>Delete</a>
+ </td>
+ </tr>
+ {% endfor %}
+</table>
+{% endblock content %}
diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py
index cfe82777..c334f36f 100644
--- a/rpkid/rpki/gui/app/urls.py
+++ b/rpkid/rpki/gui/app/urls.py
@@ -60,4 +60,8 @@ urlpatterns = patterns('',
(r'^routes/$', views.route_view),
(r'^child_wizard$', views.child_wizard),
(r'^update_bpki', views.update_bpki),
+ (r'^user/$', views.user_list),
+ (r'^user/(?P<pk>\d+)$', views.user_detail),
+ (r'^user/(?P<pk>\d+)/delete$', views.user_delete),
+ (r'^user/(?P<pk>\d+)/edit$', views.user_edit),
)
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index e317a629..083d5305 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -950,3 +950,45 @@ def client_export(request, pk):
z = Zookeeper()
xml = z.generate_repository_response(client)
return serve_xml(str(xml), '%s.repo' % z.handle)
+
+
+@superuser_required
+def user_list(request):
+ """Display a list of all the RPKI handles managed by this server."""
+ # create a list of tuples of (Conf, User)
+ users = []
+ for conf in models.Conf.objects.all():
+ try:
+ u = User.objects.get(username=conf.handle)
+ except User.DoesNotExist:
+ u = None
+ users.append((conf, u))
+ return render(request, 'app/user_list.html', {'users': users})
+
+
+@superuser_required
+def user_detail(request):
+ """Placeholder for Conf.get_absolute_url()."""
+ pass
+
+
+@superuser_required
+def user_delete(request, pk):
+ conf = models.Conf.objects.get(pk=pk)
+ if request.method == 'POST':
+ form = forms.UserDeleteForm(request.POST)
+ if form.is_valid():
+ User.objects.filter(username=conf.handle).delete()
+ z = Zookeeper(handle=conf.handle)
+ z.delete_self()
+ z.synchronize()
+ return http.HttpResponseRedirect(reverse(user_list))
+ else:
+ form = forms.UserDeleteForm()
+ return render(request, 'app/user_confirm_delete.html',
+ {'object': conf, 'form': form})
+
+
+@superuser_required
+def user_edit(request, pk):
+ pass