summaryrefslogtreecommitdiffstats
path: root/ipsilon/providers/openid/meta.py
blob: 6e66120b1752320a794f9f930916e8a43ea7ca94 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
# Copyright (C) 2014  Ipsilon project Contributors, for licensee see COPYING

from ipsilon.providers.common import ProviderPageBase

import cherrypy


class MetaHandler(ProviderPageBase):

    def __init__(self, *args, **kwargs):
        super(MetaHandler, self).__init__(*args, **kwargs)
        self._template_name = None
        self._take_args = False

    def reply(self, **kwargs):
        if self._template_name is None:
            raise ValueError('Template not set')
        return str(self._template(self._template_name, **kwargs))

    def default(self, *args, **kwargs):
        if self._take_args:
            return self.root(*args, **kwargs)
        raise cherrypy.NotFound()


class XRDSHandler(MetaHandler):

    def __init__(self, *args, **kwargs):
        super(XRDSHandler, self).__init__(*args, **kwargs)
        self.default_headers['Content-Type'] = 'application/xrds+xml'
        self._template_name = 'openid/xrds.xml'

    def GET(self, *args, **kwargs):
        types = [
            'http://specs.openid.net/auth/2.0/server',
            'http://openid.net/server/1.0',
        ]
        for _, e in self.cfg.extensions.available().items():
            types.extend(e.get_type_uris())

        return self.reply(types=types,
                          uri=self.cfg.endpoint_url)


class UserXRDSHandler(XRDSHandler):

    def __init__(self, *args, **kwargs):
        super(UserXRDSHandler, self).__init__(*args, **kwargs)
        self._take_args = True

    def GET(self, *args, **kwargs):
        if len(args) != 1:
            raise cherrypy.NotFound()
        if args[0].endswith('.xrds'):
            name = args[0][:-5]
            identity_url = self.cfg.identity_url_template % {'username': name}
            types = [
                'http://specs.openid.net/auth/2.0/signon',
                'http://openid.net/signon/1.0',
            ]
            for _, e in self.cfg.extensions.available().items():
                types.extend(e.get_type_uris())

            return self.reply(types=types,
                              uri=self.cfg.endpoint_url,
                              localid=identity_url)

        raise cherrypy.NotFound()


class IDHandler(MetaHandler):

    def __init__(self, *args, **kwargs):
        super(IDHandler, self).__init__(*args, **kwargs)
        self._template_name = 'openid/userpage.html'
        self._take_args = True

    def GET(self, *args, **kwargs):
        if len(args) != 1:
            raise cherrypy.NotFound()
        name = args[0]
        yadis = '%syadis/%s.xrds' % (self.cfg.endpoint_url, name)
        cherrypy.response.headers['X-XRDS-Location'] = yadis

        endpoint_url = self.cfg.endpoint_url
        identity_url = self.cfg.identity_url_template % {'username': name}

        HEAD_LINK = '<link rel="%s" href="%s">'
        provider_heads = [HEAD_LINK % ('openid2.provider', endpoint_url),
                          HEAD_LINK % ('openid.server', endpoint_url)]
        user_heads = [HEAD_LINK % ('openid2.delegate', identity_url),
                      HEAD_LINK % ('openid.local_id', identity_url)]
        heads = {'provider': provider_heads, 'user': user_heads}

        return self.reply(title='Userpage', username=name, heads=heads)