source: TI12-security/trunk/python/MyProxyClient/test/test_myproxyclient.py @ 4624

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/python/MyProxyClient/test/test_myproxyclient.py@4624
Revision 4624, 7.4 KB checked in by pjkersha, 12 years ago (diff)

#941: refactored to use ini file instead of XML for config.

  • Property svn:executable set to *
  • Property svn:keywords set to Id
Line 
1#!/usr/bin/env python
2"""NDG MyProxy client unit tests
3
4NERC Data Grid Project
5"""
6__author__ = "P J Kershaw"
7__date__ = "02/07/07"
8__copyright__ = "(C) 2007 STFC & NERC"
9__license__ = \
10"""This software may be distributed under the terms of the Q Public
11License, version 1.0 or later."""
12__contact__ = "Philip.Kershaw@stfc.ac.uk"
13__revision__ = '$Id$'
14
15import unittest
16import os
17import sys
18import getpass
19import traceback
20
21from myproxy import CaseSensitiveConfigParser, MyProxyClient
22
23xpdVars = os.path.expandvars
24jnPath = os.path.join
25mkPath = lambda file: jnPath(os.environ['MYPROXYCLIENT_UNITTEST_DIR'], file)
26
27class MyProxyClientTestCase(unittest.TestCase):
28   
29    def setUp(self):
30       
31        if 'NDGSEC_INT_DEBUG' in os.environ:
32            import pdb
33            pdb.set_trace()
34       
35        if 'MYPROXYCLIENT_UNITTEST_DIR' not in os.environ:
36            os.environ['MYPROXYCLIENT_UNITTEST_DIR'] = \
37                os.path.abspath(os.path.dirname(__file__))
38               
39        configParser = CaseSensitiveConfigParser()
40        configFilePath = jnPath(os.environ['MYPROXYCLIENT_UNITTEST_DIR'],
41                                "myProxyClientTest.cfg")
42        configParser.read(configFilePath)
43       
44        self.cfg = {}
45        for section in configParser.sections():
46            self.cfg[section] = dict(configParser.items(section))
47           
48        self.clnt = MyProxyClient(
49                        cfgFilePath=xpdVars(self.cfg['setUp']['cfgFilePath']))
50       
51
52    def test1Store(self):
53        '''test1Store: upload X509 cert and private key to repository'''
54        thisSection = self.cfg['test1Store']
55       
56        passphrase = thisSection.get('passphrase')
57        if passphrase is None:
58            passphrase = getpass.getpass(prompt="\ntest1Store credential "
59                                                "pass-phrase: ")
60           
61        ownerPassphrase = thisSection.get('ownerPassphrase')
62        if ownerPassphrase is None:
63            ownerPassphrase = getpass.getpass(prompt="\ntest1Store credential "
64                                                     " owner pass-phrase: ")
65
66        certFile = xpdVars(thisSection['signingCertFilePath'])
67        keyFile = xpdVars(thisSection['signingPriKeyFilePath'])
68        ownerCertFile = xpdVars(thisSection['ownerCertFile'])
69        ownerKeyFile = xpdVars(thisSection['ownerKeyFile'])
70           
71        self.clnt.store(thisSection['username'],
72                        passphrase,
73                        certFile,
74                        keyFile,
75                        ownerCertFile=ownerCertFile,
76                        ownerKeyFile=ownerKeyFile,
77                        ownerPassphrase=ownerPassphrase,
78                        force=False)
79        print "Store creds for user %s" % thisSection['username']
80   
81   
82    def test2GetDelegation(self):
83        '''test2GetDelegation: retrieve proxy cert./private key'''
84        thisSection = self.cfg['test2GetDelegation']
85       
86        passphrase = thisSection.get('passphrase')
87        if passphrase is None:
88            passphrase = getpass.getpass(prompt="\ntest2GetDelegation "
89                                                "pass-phrase: ")
90         
91        proxyCertFile = xpdVars(thisSection['proxyCertFileOut'])
92        proxyKeyFile = xpdVars(thisSection['proxykeyfileout'])
93
94        creds = self.clnt.getDelegation(thisSection['username'], 
95                                        passphrase)
96        print "proxy credentials:" 
97        print ''.join(creds)
98        open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:]))           
99        open(proxyKeyFile, 'w').write(creds[1])
100
101
102    def test3Info(self):
103        '''test3Info: Retrieve information about a given credential'''
104        thisSection = thisSection
105       
106        # ownerPassphrase can be omitted from the congif file in which case
107        # the get call below would return None
108        ownerPassphrase = thisSection.get('ownerPassphrase')
109        if ownerPassphrase is None:
110            ownerPassphrase = getpass.getpass(prompt="\ntest3Info owner "
111                                              "credentials pass-phrase: ")
112
113        credExists, errorTxt, fields = self.clnt.info(
114                                     thisSection['username'],
115                                     xpdVars(thisSection['ownerCertFile']),
116                                     xpdVars(thisSection['ownerKeyFile']),
117                                     ownerPassphrase=ownerPassphrase)
118        print "test3Info... "
119        print "credExists: %s" % credExists
120        print "errorTxt: " + errorTxt
121        print "fields: %s" % fields
122
123
124    def test4ChangePassphrase(self):       
125        """test4ChangePassphrase: change pass-phrase protecting a given
126        credential"""
127        thisSection = self.cfg['test4ChangePassphrase']
128       
129        passphrase = thisSection.get('passphrase')
130        if passphrase is None:
131            passphrase = getpass.getpass(prompt="test4ChangePassphrase - "
132                                                "pass-phrase: ")
133       
134        newPassphrase = thisSection.get('newpassphrase')
135        if newPassphrase is None:
136            newPassphrase = getpass.getpass(prompt="test4ChangePassphrase "
137                                                   "- new pass-phrase: ")
138
139            confirmNewPassphrase = getpass.getpass(prompt=\
140                                                   "test4ChangePassphrase "
141                                                   "- confirm new "
142                                                   "pass-phrase: ")
143
144            if newPassphrase != confirmNewPassphrase:
145                self.fail("New and confirmed new password don't match")
146               
147        ownerPassphrase = thisSection.get('ownerPassphrase') or passphrase
148
149        self.clnt.changePassphrase(thisSection['username'],
150                                   passphrase,
151                                   newPassphrase, 
152                                   xpdVars(thisSection['ownerCertFile']),
153                                   xpdVars(thisSection['ownerKeyFile']),
154                                   ownerPassphrase=ownerPassphrase)
155        print "Change pass-phrase"
156
157
158    def test5Destroy(self):
159        '''test5Destroy: destroy credentials for a given user'''
160
161        ownerPassphrase = self.cfg['test5Destroy'].get('ownerPassphrase')
162        if ownerPassphrase is None:
163            ownerPassphrase = getpass.getpass(prompt="\ntest5Destroy "
164                                              "credential owner pass-phrase: ")
165
166        try:
167            self.clnt.destroy(self.cfg['test5Destroy']['username'], 
168            ownerCertFile=xpdVars(self.cfg['test5Destroy']['ownerCertFile']),
169            ownerKeyFile=xpdVars(self.cfg['test5Destroy']['ownerKeyFile']),
170            ownerPassphrase=ownerPassphrase)
171            print "Destroy creds for user %s" % \
172                                        self.cfg['test5Destroy']['username']
173        except:
174            self.fail(traceback.print_exc())
175       
176 
177class MyProxyClientTestSuite(unittest.TestSuite):
178    def __init__(self):
179        map = map(MyProxyClientTestCase,
180                  (
181                    "test1Store",
182                    "test2GetDelegation",
183                    "test3Info",
184                    "test4ChangePassphrase",
185                    "test5Destroy",
186                  ))
187        unittest.TestSuite.__init__(self, map)
188                                       
189if __name__ == "__main__":
190    unittest.main()
Note: See TracBrowser for help on using the repository browser.