source: TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/wsgi/myproxy/test_myproxy.py @ 6107

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/ndg_security_test/ndg/security/test/unit/wsgi/myproxy/test_myproxy.py@6107
Revision 6107, 7.7 KB checked in by pjkersha, 11 years ago (diff)
Line 
1#!/usr/bin/env python
2"""Unit tests for MyProxy Client WSGI and MyProxy logon web service interface
3
4NERC DataGrid Project
5"""
6__author__ = "P J Kershaw"
7__date__ = "14/10/09"
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
13logging.basicConfig(level=logging.DEBUG)
14
15import os
16import urllib2
17import base64
18import paste.fixture
19from paste.deploy import loadapp
20from ndg.security.test.unit import BaseTestCase
21from ndg.security.common.utils.configfileparsers import \
22    CaseSensitiveConfigParser
23from ndg.security.server.wsgi.myproxy import MyProxyClientMiddleware
24
25
26class TestAuthnApp(object):
27    '''Test Application for the Authentication handler to protect'''
28    response = "Test MyProxy Client WSGI"
29    URI_CLIENT_IS_IN_ENVIRON = '/test_clientIsInEnviron'
30    URI_LOGON_IS_IN_ENVIRON = '/test_logonIsInEnviron'
31    URI_200_OK = '/test_200'
32   
33    def __init__(self, app_conf, **local_conf):
34        pass
35       
36    def __call__(self, environ, start_response):
37        response = TestAuthnApp.response
38       
39        if environ['PATH_INFO'] == TestAuthnApp.URI_CLIENT_IS_IN_ENVIRON:
40            assert(environ[MyProxyClientMiddlewareTestCase.CLIENT_ENV_KEYNAME])
41           
42            response = ('Found MyProxyClient instance %r=%r' % 
43                (MyProxyClientMiddlewareTestCase.CLIENT_ENV_KEYNAME,
44                 environ[MyProxyClientMiddlewareTestCase.CLIENT_ENV_KEYNAME]))
45           
46            status = "200 OK"
47           
48        elif environ['PATH_INFO'] == TestAuthnApp.URI_LOGON_IS_IN_ENVIRON:
49            assert(environ[
50                    MyProxyClientMiddlewareTestCase.LOGON_FUNC_ENV_KEYNAME])
51           
52            response = ('Found MyProxyClient logon function %r=%r' % 
53                (MyProxyClientMiddlewareTestCase.LOGON_FUNC_ENV_KEYNAME,
54                 environ[
55                    MyProxyClientMiddlewareTestCase.LOGON_FUNC_ENV_KEYNAME]))
56           
57            status = "200 OK"
58           
59        elif environ['PATH_INFO'] == TestAuthnApp.URI_200_OK:
60            status = "200 OK"
61        else:
62            status = "404 Not found"
63               
64        start_response(status,
65                       [('Content-length', 
66                         str(len(response))),
67                        ('Content-type', 'text/plain')])
68        return [response]
69   
70   
71class MyProxyClientMiddlewareTestCase(BaseTestCase):
72    """Test MyProxy Client WSGI"""
73    CLIENT_ENV_KEYNAME = 'myProxyClient'
74    LOGON_FUNC_ENV_KEYNAME = 'logon'
75    SERVICE_PORTNUM = 20443
76    WGET_CMD = 'wget'
77    WGET_USER_OPTNAME = '--http-user'
78    WGET_PASSWD_OPTNAME = '--http-password'
79    WGET_OUTPUT_OPTNAME = '--output-document'
80    WGET_STDOUT = '-'
81   
82    def __init__(self, *args, **kwargs):
83        app = TestAuthnApp({})
84        self.wsgiapp = MyProxyClientMiddleware(app, {}, 
85    prefix='',
86    myProxyClientPrefix='client_',
87    clientEnvKeyName=MyProxyClientMiddlewareTestCase.CLIENT_ENV_KEYNAME,
88    logonFuncEnvKeyName=MyProxyClientMiddlewareTestCase.LOGON_FUNC_ENV_KEYNAME,
89    client_hostname='localhost')
90       
91        self.app = paste.fixture.TestApp(self.wsgiapp)
92         
93        BaseTestCase.__init__(self, *args, **kwargs)
94
95    def test01CheckForClientEnvKey(self):
96        response = self.app.get(TestAuthnApp.URI_CLIENT_IS_IN_ENVIRON)
97        print response
98
99    def test02CheckForLogonFuncEnvKey(self):
100        response = self.app.get(TestAuthnApp.URI_LOGON_IS_IN_ENVIRON)
101        print response
102   
103   
104class MyProxyLogonMiddlewareTestCase(BaseTestCase):
105    """Test MyProxy logon web service interface"""
106    SERVICE_PORTNUM = 20443
107    WGET_CMD = 'wget'
108    WGET_USER_OPTNAME = '--http-user'
109    WGET_PASSWD_OPTNAME = '--http-password'
110    WGET_OUTPUT_OPTNAME = '--output-document'
111    WGET_STDOUT = '-'
112    INI_FILENAME = 'test.ini'
113   
114    def __init__(self, *args, **kwargs):
115        here_dir = os.path.dirname(os.path.abspath(__file__))
116        iniFilePath = os.path.join(here_dir, 
117                                   MyProxyLogonMiddlewareTestCase.INI_FILENAME)
118        self.wsgiapp = loadapp('config:%s' % iniFilePath)
119        self.app = paste.fixture.TestApp(self.wsgiapp)
120       
121        cfg = CaseSensitiveConfigParser()
122        cfg.read(iniFilePath)
123        self.username = cfg.get('DEFAULT', 'username')
124        if cfg.has_option('DEFAULT', 'password'):
125            self.password = cfg.get('DEFAULT', 'password')
126        else:
127            self.password = None
128       
129        BaseTestCase.__init__(self, *args, **kwargs)
130
131    def test01PasteFixtureInvalidCredentials(self):
132        username = '_test'
133        password = 'test'
134       
135        base64String = base64.encodestring('%s:%s' % (username, password))[:-1]
136        authHeader =  "Basic %s" % base64String
137        headers = {'Authorization': authHeader}
138
139        url = TestAuthnApp.URI_200_OK
140       
141        response = self.app.get(url, headers=headers, status=401)
142        print response
143
144    def test02PasteFixture(self):
145        username = self.username
146        if self.password is None:
147            from getpass import getpass
148            password = getpass('test02PasteFixture: MyProxy pass-phrase for '
149                               '%r: ' % username)
150        else:
151            password = self.password
152       
153        base64String = base64.encodestring('%s:%s' % (username, password))[:-1]
154        authHeader =  "Basic %s" % base64String
155        headers = {'Authorization': authHeader}
156
157        url = TestAuthnApp.URI_200_OK
158       
159        response = self.app.get(url, headers=headers)
160        print response
161       
162    def test03Urllib2Client(self):
163        # Thread separate Paster based service
164        self.addService(app=self.wsgiapp, 
165                        port=MyProxyLogonMiddlewareTestCase.SERVICE_PORTNUM)
166       
167        username = self.username
168        if self.password is None:
169            from getpass import getpass
170            password = getpass('test03Urllib2Client: MyProxy pass-phrase for '
171                               '%r: ' % username)
172        else:
173            password = self.password
174
175        url = 'http://localhost:%d/test_200' % \
176            MyProxyLogonMiddlewareTestCase.SERVICE_PORTNUM
177           
178        req = urllib2.Request(url)
179        base64String = base64.encodestring('%s:%s' % (username, password))[:-1]
180        authHeader =  "Basic %s" % base64String
181        req.add_header("Authorization", authHeader)
182       
183        handle = urllib2.urlopen(req)
184       
185        response = handle.read()
186        print (response)
187       
188    def test04WGetClient(self):
189        uri = ('http://localhost:%d/test_200' % 
190                  MyProxyLogonMiddlewareTestCase.SERVICE_PORTNUM)
191                 
192        username = self.username
193        if self.password is None:
194            from getpass import getpass
195            password = getpass('test04WGetClient: MyProxy pass-phrase for '
196                               '%r: ' % username)
197        else:
198            password = self.password
199
200        import os
201        import subprocess
202        cmd = "%s %s %s=%s %s=%s %s=%s" % (
203            MyProxyLogonMiddlewareTestCase.WGET_CMD, 
204            uri,
205            MyProxyLogonMiddlewareTestCase.WGET_USER_OPTNAME,
206            username,
207            MyProxyLogonMiddlewareTestCase.WGET_PASSWD_OPTNAME,
208            password,
209            MyProxyLogonMiddlewareTestCase.WGET_OUTPUT_OPTNAME,
210            MyProxyLogonMiddlewareTestCase.WGET_STDOUT)
211       
212        p = subprocess.Popen(cmd, shell=True)
213        status = os.waitpid(p.pid, 0)
214        self.failIf(status[-1] != 0, "Expecting 0 exit status for %r" % cmd)
215
216
217if __name__ == "__main__":
218    #import sys;sys.argv = ['', 'Test.testName']
219    import unittest
220    unittest.main()
Note: See TracBrowser for help on using the repository browser.