From e3547ec9148642659c3708db8a54fb008b1d9995 Mon Sep 17 00:00:00 2001 From: Simo Sorce Date: Fri, 4 Apr 2014 13:08:02 -0400 Subject: [PATCH] Admin functions to add new Service Providers Signed-off-by: Simo Sorce --- ipsilon/providers/saml2/admin.py | 78 +++++++++++++++++++++ templates/admin/providers/saml2.html | 5 ++ templates/admin/providers/saml2_sp_new.html | 28 ++++++++ 3 files changed, 111 insertions(+) create mode 100644 templates/admin/providers/saml2_sp_new.html diff --git a/ipsilon/providers/saml2/admin.py b/ipsilon/providers/saml2/admin.py index c8d26b8..7db19fc 100755 --- a/ipsilon/providers/saml2/admin.py +++ b/ipsilon/providers/saml2/admin.py @@ -20,6 +20,83 @@ import cherrypy from ipsilon.util.page import Page from ipsilon.providers.saml2.provider import ServiceProvider +from ipsilon.providers.saml2.provider import ServiceProviderCreator +from ipsilon.providers.saml2.provider import InvalidProviderId + + +class NewSPAdminPage(Page): + + def __init__(self, site, parent): + super(NewSPAdminPage, self).__init__(site) + self.parent = parent + self.title = 'New Service Provider' + self.backurl = parent.url + self.url = '%s/new' % (parent.url,) + + def form_new(self, message=None, message_type=None): + return self._template('admin/providers/saml2_sp_new.html', + title=self.title, + message=message, + message_type=message_type, + name='saml2_sp_new_form', + backurl=self.backurl, action=self.url) + + def GET(self, *args, **kwargs): + return self.form_new() + + def POST(self, *args, **kwargs): + + if self.user.is_admin: + #TODO: allow authenticated user to create SPs on their own + # set the owner in that case + name = None + meta = None + if 'content-type' not in cherrypy.request.headers: + self._debug("Invalid request, missing content-type") + message = "Malformed request" + message_type = "error" + return self.form_new(message, message_type) + ctype = cherrypy.request.headers['content-type'].split(';')[0] + if ctype != 'multipart/form-data': + self._debug("Invalid form type (%s), trying to cope" % ( + cherrypy.request.content_type,)) + for key, value in kwargs.iteritems(): + if key == 'name': + name = value + elif key == 'meta': + if hasattr(value, 'content_type'): + meta = value.fullvalue() + else: + self._debug("Invalid format for 'meta'") + + if name and meta: + try: + spc = ServiceProviderCreator(self.parent.cfg) + sp = spc.create_from_buffer(name, meta) + sp_page = self.parent.add_sp(name, sp) + message = "SP Successfully added" + message_type = "success" + return sp_page.form_standard(message, message_type) + except InvalidProviderId, e: + message = str(e) + message_type = "error" + except Exception, e: # pylint: disable=broad-except + self._debug(repr(e)) + message = "Failed to create Service Provider!" + message_type = "error" + else: + message = "A name and a metadata file must be provided" + message_type = "error" + else: + message = "Unauthorized" + message_type = "error" + + return self.form_new(message, message_type) + + def root(self, *args, **kwargs): + op = getattr(self, cherrypy.request.method, self.GET) + if callable(op): + return op(*args, **kwargs) class SPAdminPage(Page): @@ -141,6 +218,7 @@ class AdminPage(Page): self.add_sp(sp.name, sp) except Exception, e: # pylint: disable=broad-except self._debug("Failed to find provider %s: %s" % (p, str(e))) + self.add_subtree('new', NewSPAdminPage(self._site, self)) page.add_subtree(self.name, self) def root(self, *args, **kwargs): diff --git a/templates/admin/providers/saml2.html b/templates/admin/providers/saml2.html index 5185a6f..2e4aff3 100644 --- a/templates/admin/providers/saml2.html +++ b/templates/admin/providers/saml2.html @@ -2,6 +2,11 @@ {% block main %}

Service Providers

+
+
+ Add New +
+

{% for p in providers %}
diff --git a/templates/admin/providers/saml2_sp_new.html b/templates/admin/providers/saml2_sp_new.html new file mode 100644 index 0000000..bf83fb2 --- /dev/null +++ b/templates/admin/providers/saml2_sp_new.html @@ -0,0 +1,28 @@ +{% extends "master-admin.html" %} +{% block main %} +

{{ title }}

+ {% if message %} +
+

{{ message }}

+
+ {% endif %} +
+
+ +
+ + +
+ +
+ + +
+ + + Back +
+
+{% endblock %} -- 2.20.1