source: TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/wsgi/authn/test_authn.py @ 5779

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/wsgi/authn/test_authn.py@5779
Revision 5779, 5.4 KB checked in by pjkersha, 11 years ago (diff)

Integrated automated start-up and shutdown of Paste http servers for unit tests.

Line 
1#!/usr/bin/env python
2"""Unit tests for WSGI Authentication redirect handler
3
4NERC DataGrid Project
5"""
6__author__ = "P J Kershaw"
7__date__ = "23/02/06"
8__copyright__ = "(C) 2009 Science and Technology Facilities Council"
9__license__ = "BSD - see LICENSE file in top-level directory"
10__contact__ = "Philip.Kershaw@stfc.ac.uk"
11__revision__ = '$Id$'
12import logging
13
14
15import unittest
16import os
17import sys
18import getpass
19import re
20import base64
21import urllib2
22
23from os.path import expandvars as xpdVars
24from os.path import join as jnPath
25mkPath = lambda file: jnPath(os.environ['NDGSEC_COMBINED_SRVS_UNITTEST_DIR'], 
26                             file)
27
28import paste.fixture
29from paste.deploy import loadapp
30from ndg.security.test.unit import BaseTestCase
31from ndg.security.common.X509 import X509Cert
32from ndg.security.server.wsgi.ssl import AuthKitSSLAuthnMiddleware
33
34
35class TestAuthnApp(object):
36    '''Test Application for the Authentication handler to protect'''
37    response = "Test Authentication redirect application"
38   
39    loggedIn = lambda self, environ: 'username' in environ.get(
40                                                self.beakerSessionKeyName, {})
41   
42    def __init__(self, app_conf, **local_conf):
43        self.beakerSessionKeyName = app_conf.get('beakerSessionKeyName')
44   
45    def __call__(self, environ, start_response):
46       
47        if environ['PATH_INFO'] == '/test_401WithNotLoggedIn':
48            status = "401 Unauthorized"
49           
50        elif environ['PATH_INFO'] == '/test_401WithLoggedIn':
51            status = "401 Unauthorized"
52           
53        elif environ['PATH_INFO'] == '/test_200WithNotLoggedIn':
54            status = "200 OK"
55           
56        elif environ['PATH_INFO'] == '/test_200WithLoggedIn':
57            environ['REMOTE_USER'] = 'testuser'
58            status = "200 OK"
59       
60        elif environ['PATH_INFO'] == '/test_sslClientAuthn':
61            if self.loggedIn(environ):
62                status = "200 OK"
63            else:
64                status = "401 Unauthorized"
65        else:
66            status = "404 Not found"
67               
68        start_response(status,
69                       [('Content-length', 
70                         str(len(TestAuthnApp.response))),
71                        ('Content-type', 'text/plain')])
72        return [TestAuthnApp.response]
73
74
75class WSGIAuthNTestController(unittest.TestCase):
76
77    def __init__(self, *args, **kwargs):
78        here_dir = os.path.dirname(os.path.abspath(__file__))
79        wsgiapp = loadapp('config:test.ini', relative_to=here_dir)
80        self.app = paste.fixture.TestApp(wsgiapp)
81         
82        unittest.TestCase.__init__(self, *args, **kwargs)
83       
84    def test01Catch401WithNotLoggedIn(self):
85        response = self.app.get('/test_401WithNotLoggedIn', status=302)
86        redirectResponse = response.follow(status=404)
87       
88    def test02Skip200WithLoggedIn(self):
89        response = self.app.get('/test_200WithLoggedIn',
90                                extra_environ={'REMOTE_USER': 'testuser'},
91                                status=200)
92        print(response.body)
93
94    def test03Catch401WithLoggedIn(self):
95        response = self.app.get('/test_401WithLoggedIn', 
96                                extra_environ={'REMOTE_USER': 'testuser'},
97                                status=401)
98        print(response.body)
99       
100    def test04Catch200WithNotLoggedIn(self):
101        response = self.app.get('/test_200WithNotLoggedIn', status=200)
102
103
104class WsgiSSLClientAuthnTestController(BaseTestCase):
105    """Extend Authentication middleware test to use SSL Client Authentication
106    middleware"""
107   
108    def __init__(self, *arg, **kw):
109        here_dir = os.path.dirname(os.path.abspath(__file__))
110        wsgiapp = loadapp('config:ssl-test.ini', relative_to=here_dir)
111        self.app = paste.fixture.TestApp(wsgiapp)
112         
113        BaseTestCase.__init__(self, *arg, **kw)
114       
115    def test01(self):
116        thisDir = os.path.dirname(__file__)
117        sslClientCertFilePath = os.path.join(
118                                os.environ[BaseTestCase.configDirEnvVarName],
119                                'pki',
120                                'test.crt')
121        sslClientCert = X509Cert.Read(sslClientCertFilePath).toString()
122       
123        # Add APache SSL environment variables and sdummy AuthKit set user
124        # session cookie method
125        extra_environ = {
126            'HTTPS':'1', 
127            'SSL_CLIENT_CERT': sslClientCert,
128            AuthKitSSLAuthnMiddleware.SET_USER_ENVIRON_KEYNAME: lambda id: None
129            }
130
131        print("request secured URI '/test_sslClientAuthn' ...")
132        response = self.app.get('/test_sslClientAuthn',
133                                extra_environ=extra_environ,
134                                status=302)
135       
136        print("Redirect to SSL Client Authentication endpoint %r ..." %
137              response.header_dict['location'])
138       
139        # Redirect to SSL Client Authentication endpoint
140        redirectResponse = response.follow(extra_environ=extra_environ,
141                                           status=302)
142
143        print("Redirect back to secured URI with authenticated session %r ..."%
144              redirectResponse.header_dict['location'])
145       
146        finalResponse = redirectResponse.follow(extra_environ=extra_environ,
147                                                status=200)
148        print finalResponse
149       
150   
151if __name__ == "__main__":
152    unittest.main()       
Note: See TracBrowser for help on using the repository browser.