source: TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/authz/securedapp.py @ 5086

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/authz/securedapp.py@5086
Revision 5086, 5.9 KB checked in by pjkersha, 13 years ago (diff)

ndg.security.test.integration.authz: integration test including OpenID provider, relying party and PEP and PDP components. PDP is currently placeholder requiring integration with user credentials callout to Session Manager.

Line 
1class TestAuthNMiddleware(object):
2    '''Test Application for the Authentication handler to protect'''
3    response = "Test Authentication redirect application"
4       
5    def __init__(self, app_conf, **local_conf):
6        pass
7   
8    def __call__(self, environ, start_response):
9       
10        if environ['PATH_INFO'] == '/test_401WithNotLoggedIn':
11            status = "401 Unauthorized"
12           
13        else:
14            status = "404 Not found"
15               
16#        start_response(status,
17#                       [('Content-length',
18#                         str(len(TestAuthNMiddleware.response))),
19#                        ('Content-type', 'text/plain')])
20#        return [TestAuthNMiddleware.response]
21        return self._setResponse(environ, start_response)
22   
23    def _setResponse(self, environ, start_response):
24        if 'REMOTE_USER' in environ:
25            response = """<html>
26    <head/>
27    <body>
28        <p>Authenticated!</p>
29        <p><a href="/logout">logout</a></p>
30    </body>
31</html>"""
32            start_response('200 OK', 
33                           [('Content-type', 'text/html'),
34                            ('Content-length', str(len(response)))])
35        else:
36            response = "Trigger OpenID Relying Party..."
37            start_response('401 Unauthorized', 
38                           [('Content-type', 'text/plain'),
39                            ('Content-length', str(len(response)))])
40        return [response]
41   
42def app_factory(globalConfig, **localConfig):
43    return AuthZTestMiddleware(None, globalConfig, **localConfig)
44
45def filter_app_factory(app, globalConfig, **localConfig):
46    return AuthZTestMiddleware(app, globalConfig, **localConfig)
47
48class AuthZTestMiddleware(object):
49    method = {
50"/": 'default',
51"/test_401": "test_401",
52"/test_403": "test_403",
53"/test_securedURI": "test_securedURI"
54    }
55
56    def __init__(self, app, globalConfig, **localConfig):
57        self.app = app
58           
59    def __call__(self, environ, start_response):
60       
61        methodName = self.method.get(environ['PATH_INFO'], '').rstrip()
62        if methodName:
63            action = getattr(self, methodName)
64            return action(environ, start_response)
65        elif environ['PATH_INFO'] == '/logout':
66            return self.default(environ, start_response)
67       
68        elif self.app is not None:
69            return self.app(environ, start_response)
70        else:
71            start_response('404 Not Found', [('Content-type', 'text/plain')])
72            return "Authorisation integration tests: invalid URI"
73           
74    def default(self, environ, start_response):
75        if 'REMOTE_USER' in environ:
76            response = """<html>
77    <head/>
78    <body>
79        <p>Authenticated!</p>
80        <p><a href="/logout">logout</a></p>
81    </body>
82</html>"""
83            start_response('200 OK', 
84                           [('Content-type', 'text/html'),
85                            ('Content-length', str(len(response)))])
86        else:
87            response = """
88<head/>
89<body>
90    <h1>Authorisation integration tests:</h1>
91    <ul>%s</ul>
92</body>
93""" % '\n'.join(['<li><a href="%s">%s</a></li>' % (link, name) 
94       for link,name in self.method.items() if name != 'default'])
95
96            start_response('200 OK', 
97                           [('Content-type', 'text/html'),
98                            ('Content-length', str(len(response)))])
99        return response
100
101    def test_401(self, environ, start_response):
102        if 'REMOTE_USER' in environ:
103            response = """<html>
104    <head/>
105    <body>
106        <h1>Authenticated!</h1>
107        <p><a href="/logout">logout</a></p>
108    </body>
109</html>"""
110            start_response('200 OK', 
111                           [('Content-type', 'text/html'),
112                            ('Content-length', str(len(response)))])
113        else:
114            response = "Trigger OpenID Relying Party..."
115            start_response('401 Unauthorized', 
116                           [('Content-type', 'text/plain'),
117                            ('Content-length', str(len(response)))])
118        return response
119
120    def test_403(self, environ, start_response):
121        if 'REMOTE_USER' in environ:
122            response = """<html>
123    <head/>
124    <body>
125        <h1>Authorised!</h1>
126        <p><a href="/logout">logout</a></p>
127    </body>
128</html>"""
129            start_response('200 OK', 
130                           [('Content-type', 'text/html'),
131                            ('Content-length', str(len(response)))])
132        else:
133            response = "Trigger AuthZ..."
134            start_response('403 Forbidden', 
135                           [('Content-type', 'text/plain'),
136                            ('Content-length', str(len(response)))])
137        return response
138
139    def test_securedURI(self, environ, start_response):
140        response = """<html>
141    <head/>
142    <body>
143        <h1>Access allowed!</h1>
144        <p><a href="/logout">logout</a></p>
145    </body>
146</html>"""
147        start_response('200 OK', 
148                       [('Content-type', 'text/html'),
149                        ('Content-length', str(len(response)))])
150        return response
151   
152    @classmethod
153    def app_factory(cls, globalConfig, **localConfig):
154        return cls(None, globalConfig, **localConfig)
155   
156    @classmethod
157    def filter_app_factory(cls, app, globalConfig, **localConfig):
158        return cls(app, globalConfig, **localConfig)
159   
160# To start run
161# $ paster serve services.ini or run this file as a script
162# $ ./securedapp.py [port #]
163if __name__ == '__main__':
164    import sys
165    import os
166    from os.path import dirname, abspath
167    import logging
168    logging.basicConfig(level=logging.DEBUG)
169
170    if len(sys.argv) > 1:
171        port = int(sys.argv[1])
172    else:
173        port = 7080
174       
175    cfgFilePath = os.path.join(dirname(abspath(__file__)), 'securedapp.ini')
176       
177    from paste.httpserver import serve
178    from paste.deploy import loadapp
179   
180    app = loadapp('config:%s' % cfgFilePath)
181    serve(app, host='0.0.0.0', port=port)
Note: See TracBrowser for help on using the repository browser.