1 # Copyright (C) 2014 Ipsilon project Contributors, for licensee see COPYING
3 from ipsilon.providers.common import ProviderPageBase
8 class MetaHandler(ProviderPageBase):
10 def __init__(self, *args, **kwargs):
11 super(MetaHandler, self).__init__(*args, **kwargs)
12 self._template_name = None
13 self._take_args = False
15 def reply(self, **kwargs):
16 if self._template_name is None:
17 raise ValueError('Template not set')
18 return str(self._template(self._template_name, **kwargs))
20 def default(self, *args, **kwargs):
22 return self.root(*args, **kwargs)
23 raise cherrypy.NotFound()
26 class XRDSHandler(MetaHandler):
28 def __init__(self, *args, **kwargs):
29 super(XRDSHandler, self).__init__(*args, **kwargs)
30 self.default_headers['Content-Type'] = 'application/xrds+xml'
31 self._template_name = 'openid/xrds.xml'
33 def GET(self, *args, **kwargs):
35 'http://specs.openid.net/auth/2.0/server',
36 'http://openid.net/server/1.0',
38 for _, e in self.cfg.extensions.available().items():
39 types.extend(e.get_type_uris())
41 return self.reply(types=types,
42 uri=self.cfg.endpoint_url)
45 class UserXRDSHandler(XRDSHandler):
47 def __init__(self, *args, **kwargs):
48 super(UserXRDSHandler, self).__init__(*args, **kwargs)
49 self._take_args = True
51 def GET(self, *args, **kwargs):
53 raise cherrypy.NotFound()
54 if args[0].endswith('.xrds'):
56 identity_url = self.cfg.identity_url_template % {'username': name}
58 'http://specs.openid.net/auth/2.0/signon',
59 'http://openid.net/signon/1.0',
61 for _, e in self.cfg.extensions.available().items():
62 types.extend(e.get_type_uris())
64 return self.reply(types=types,
65 uri=self.cfg.endpoint_url,
68 raise cherrypy.NotFound()
71 class IDHandler(MetaHandler):
73 def __init__(self, *args, **kwargs):
74 super(IDHandler, self).__init__(*args, **kwargs)
75 self._template_name = 'openid/userpage.html'
76 self._take_args = True
78 def GET(self, *args, **kwargs):
80 raise cherrypy.NotFound()
82 yadis = '%syadis/%s.xrds' % (self.cfg.endpoint_url, name)
83 cherrypy.response.headers['X-XRDS-Location'] = yadis
85 endpoint_url = self.cfg.endpoint_url
86 identity_url = self.cfg.identity_url_template % {'username': name}
88 HEAD_LINK = '<link rel="%s" href="%s">'
89 provider_heads = [HEAD_LINK % ('openid2.provider', endpoint_url),
90 HEAD_LINK % ('openid.server', endpoint_url)]
91 user_heads = [HEAD_LINK % ('openid2.delegate', identity_url),
92 HEAD_LINK % ('openid.local_id', identity_url)]
93 heads = {'provider': provider_heads, 'user': user_heads}
95 return self.reply(title='Userpage', username=name, heads=heads)