Drop usage of self._debug and use self.debug instead
[cascardo/ipsilon.git] / ipsilon / providers / saml2 / rest.py
1 # Copyright (C) 2015  Ipsilon project Contributors, for licensee see COPYING
2
3 import cherrypy
4 from ipsilon.providers.common import RestProviderBase
5 from ipsilon.providers.common import FACILITY
6 from ipsilon.rest.common import rest_error, jsonout
7 from ipsilon.providers.saml2.provider import ServiceProviderCreator
8 from ipsilon.providers.saml2.provider import InvalidProviderId
9 from ipsilon.util.page import admin_protect
10 from lasso import ServerAddProviderFailedError
11
12
13 class Saml2RestBase(RestProviderBase):
14     """
15     The root for REST pages.
16
17     Add new REST classes to this via add_subtree().
18     """
19
20     def __init__(self, site, config):
21         super(Saml2RestBase, self).__init__(site, config)
22         self.name = 'saml2'
23         self.cfg = config
24         self.url = None
25
26     def mount(self, page):
27         self.url = page.url
28         self.add_subtree('SPS', SPS(self._site, self))
29         page.add_subtree(self.name, self)
30
31
32 class SPS(RestProviderBase):
33     """
34     REST interface for Service Providers
35     """
36
37     def __init__(self, site, parent):
38         super(SPS, self).__init__(site, parent)
39
40         self.parent = parent
41         self.backurl = parent.url
42         self.url = '%s/SPS' % (parent.url,)
43
44     def __get_idp(self):
45         """
46         Return the identity provider object
47         """
48         return self._site[FACILITY].available[self.parent.plugin_name]
49
50     def _get_sp(self, *args, **kwargs):
51         """
52         If PATH_INFO contains a value then get that value as the name of
53         the SP, otherwise return a list of all available SPs.
54         """
55         if len(args) > 0:
56             instance = args[0]
57         else:
58             instance = None
59
60         idp = self.__get_idp()
61
62         results = list()
63
64         if instance is not None:
65             data = idp.get_data(name='name', value=instance)
66             if len(data) == 0:
67                 return rest_error(404, 'Provider %s not found' % instance)
68             idval = data.keys()[0]
69             data = idp.get_data(idval=idval)
70         else:
71             data = idp.get_data()
72
73         for idval in data.keys():
74             result = dict(provider=data[idval].get('name'),
75                           metadata=data[idval].get('metadata'),)
76             results.append(result)
77
78         return dict(result=results)
79
80     @jsonout
81     @admin_protect
82     def GET(self, *args, **kwargs):
83         return self._get_sp(*args, **kwargs)
84
85     @jsonout
86     @admin_protect
87     def POST(self, *args, **kwargs):
88         cherrypy.response.status = 201
89
90         if len(args) != 1:
91             return rest_error(400, 'Invalid arguments. Found %d'
92                                    ' there should be one.')
93         name = args[0]
94         metadata = kwargs.get('metadata')
95
96         obj = self._site[FACILITY].available[self.parent.plugin_name]
97         try:
98             spc = ServiceProviderCreator(obj)
99             sp = spc.create_from_buffer(name, metadata)
100         except (InvalidProviderId, ServerAddProviderFailedError) as e:
101             self.debug(repr(e))
102             return rest_error(400, str(e))
103         except Exception, e:  # pylint: disable=broad-except
104             self.debug(repr(e))
105             return rest_error(500, "Failed to create Service Provider")
106
107         obj.admin.add_sp(name, sp)
108
109         # Added. Now fetch and return the SP data
110         return self._get_sp(name)