X-Git-Url: http://git.cascardo.info/?p=cascardo%2Fipsilon.git;a=blobdiff_plain;f=ipsilon%2Fproviders%2Fsaml2%2Fadmin.py;h=7db19fc4533444f157dd4e78ffebe250cd29b8e2;hp=c8d26b8a5b422cb07248437f122e0bee56b2ede5;hb=e3547ec9148642659c3708db8a54fb008b1d9995;hpb=8cdf10beebc47e1dfa095d052a2f7ed317e905a0 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):