source: TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/renderinginterface/buffet.py @ 4549

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/openid/provider/renderinginterface/buffet.py@4550
Revision 4549, 7.2 KB checked in by pjkersha, 12 years ago (diff)

OpenID Provider Authentication interface:

  • started work on porting Buffet based RenderingInterface? from Pylons project into openid.provider.renderinginterface sub-package.
Line 
1"""NDG Security Pylons Buffet based Rendering Interface for
2OpenIDProviderMiddleware
3
4NERC Data Grid Project
5
6This software may be distributed under the terms of the Q Public License,
7version 1.0 or later.
8"""
9__author__ = "P J Kershaw"
10__date__ = "14/08/08"
11__copyright__ = "(C) 2008 STFC & NERC"
12__contact__ = "Philip.Kershaw@stfc.ac.uk"
13__revision__ = "$Id$"
14import pylons
15from pylons.templating import Buffet
16from pylons import config
17import logging
18log = logging.getLogger(__name__)
19
20from ndg.security.server.wsgi.openid.provider import RenderingInterface, \
21    AuthNInterfaceConfigError
22
23# Boiler plate to create renderer
24class OpenIDProviderRenderingBuffet(Buffet):
25    def _update_names(self, ns):
26        return ns
27
28try:
29    def_eng = config['buffet.template_engines'][0]
30    buffet = OpenIDProviderRenderingBuffet(
31        def_eng['engine'],
32        template_root=def_eng['template_root'],
33        **def_eng['template_options']
34    )
35   
36    for e in config['buffet.template_engines'][1:]:
37        buffet.prepare(
38            e['engine'],
39            template_root=e['template_root'],
40            alias=e['alias'],
41            **e['template_options']
42        )
43except:
44    templateRoot = 'ndg.security.server.pylons.container.templates'
45    buffet = OpenIDProviderRenderingBuffet('kid', template_root=templateRoot)
46#{'mako.directories': ['/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/container/templates'],
47#'myghty.component_root': [{'templates': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/container/templates'}],
48#'myghty.data_dir': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/data/templates',
49#'kid.encoding': 'utf-8',
50#'kid.assume_encoding': 'utf-8',
51#'mako.module_directory': '/home/pjkersha/workspace/security/python/ndg.security.server/ndg/security/server/pylons/data/templates',
52#'myghty.allow_globals': ['c', 'g', 'h', 'render', 'request', 'session', 'translator', 'ungettext', '_', 'N_'],
53#'myghty.output_encoding': 'utf-8',
54#'myghty.raise_error': True,
55#'mako.output_encoding': 'utf-8',
56#'mako.filesystem_checks': True}
57
58
59class State:
60    '''Convenience class for passing parameters from rendering interface to
61    individual template files'''
62    def __init__(self, urls={}, session={}):
63        self.title = ''
64        self.xml = ''
65        self.headExtras = ''
66        self.session = session
67        self.loginStatus = True
68        self.urls = urls
69
70import httplib
71
72# Rendering classes for OpenID Provider must derive from generic render
73# interface
74from ndg.security.server.wsgi.openid.provider import RenderingInterface
75
76class BuffetRendering(RenderingInterface):
77    """Provide Templating for OpenID Provider Middleware via Buffet
78    class"""
79
80    propNames = ('templateType', 'templateRoot')
81    def __init__(self, **prop):
82        try:
83            for p in prop:
84                setattr(self, p, prop[p])
85        except KeyError, e:
86            raise AuthNInterfaceConfigError("Missing property: %s" % e)   
87         
88        self._buffet = OpenIDProviderRenderingBuffet(self.templateType, 
89                                                template_root=templateRoot)
90       
91    def _render(self, templateName, **kw):
92        '''Wrapper for Buffet.render'''
93        rendering = self._buffet.render(template_name=templateName, 
94                                        namespace=kw)
95        return rendering
96   
97    def login(self, environ, start_response, success_to=None, fail_to=None, 
98              msg=''):
99        """Set-up template for OpenID Provider Login"""
100        c = State(urls=self.urls, session=self.session)
101        c.title = "OpenID Login"
102        c.success_to = success_to or self.urls['url_mainpage']
103        c.fail_to = fail_to or self.urls['url_mainpage'] 
104        c.xml = msg
105       
106        response = BuffetRendering._render('ndg.security.login', 
107                                           c=c, g=config, h=h)
108        start_response('200 OK', 
109                       [('Content-type', 'text/html'+self.charset),
110                        ('Content-length', str(len(response)))])
111        return response
112       
113       
114    def mainPage(self, environ, start_response):
115        """Set-up template for OpenID Provider Login"""
116        c = State(urls=self.urls, session=self.session)
117        c.title = "OpenID Provider"
118        c.headExtras = '<meta http-equiv="x-xrds-location" content="%s"/>' % \
119                        self.urls['url_serveryadis']
120   
121        response = BuffetRendering._render('ndg.security.mainPage', 
122                                           c=c, g=config, h=h)
123        start_response('200 OK', 
124                       [('Content-type', 'text/html'+self.charset),
125                        ('Content-length', str(len(response)))])
126        return response
127
128    def identityPage(self, environ, start_response):
129        """Render the user's Identity page"""
130        path = environ['PATH_INFO'].rstrip('/')
131        idPath = self.urls['url_id'].replace(self.base_url, '')
132        userIdentifier = path[len(idPath)+1:]
133        if not userIdentifier:
134            h.redirect_to(self.urls['url_mainpage'])
135           
136        c = State(urls=self.urls, session=self.session)
137        c.title = "OpenID Identity Page"
138                       
139        link_tag = '<link rel="openid.server" href="%s"/>' % \
140              self.urls['url_openidserver']
141             
142        yadis_loc_tag = '<meta http-equiv="x-xrds-location" content="%s"/>' % \
143            (self.urls['url_yadis']+'/'+userIdentifier)
144           
145        c.headExtras = link_tag + yadis_loc_tag
146        identityURL = self.base_url + path
147        c.xml = "<b><pre>%s</pre></b>" % identityURL
148       
149        response = BuffetRendering._render('ndg.security.identityPage', 
150                                           c=c, g=config, h=h)   
151        start_response("200 OK", 
152                       [('Content-type', 'text/html'+self.charset),
153                        ('Content-length', str(len(response)))])
154        return response
155
156   
157    def decidePage(self, environ, start_response, oidRequest):
158        """Handle user interaction required before final submit back to Relying
159        Party"""
160        c = State(urls=self.urls, session=self.session)
161        c.title = 'Approve OpenID Request?'
162        c.trust_root = oidRequest.trust_root
163        c.oidRequest = oidRequest
164       
165        response=BuffetRendering._render('ndg.security.decidePage', 
166                                         c=c, g=config, h=h)
167        start_response("200 OK", 
168                       [('Content-type', 'text/html'+self.charset),
169                        ('Content-length', str(len(response)))])
170        return response
171
172       
173    def errorPage(self, environ, start_response, msg, code=500):
174        c = State(urls=self.urls, session=self.session)
175        c.title = 'Error with OpenID Provider'
176        c.xml = msg
177        start_response('%d %s' % (code, httplib.responses[code]), 
178                       [('Content-type', 'text/html'+self.charset),
179                        ('Content-length', str(len(response)))])
180        response = BuffetRendering._render('ndg.security.error', 
181                                           c=c, g=config, h=h)
182        return response
Note: See TracBrowser for help on using the repository browser.