Ignore:
Timestamp:
02/06/10 15:01:16 (11 years ago)
Author:
pjkersha
Message:

Incomplete - task 5: MyProxy? Logon HTTPS Interface

  • Updated MyProxyClient with bootstrap capability for get trust roots and logon methods.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/MyProxyClient/myproxy/test/test_myproxyclient.py

    r6847 r6918  
    1616import os 
    1717import sys 
    18 import getpass 
     18from getpass import getpass 
    1919import traceback 
    2020from os import path 
     
    3838 
    3939class MyProxyClientLiveTestCase(_MyProxyClientTestCase): 
    40     '''Tests require a connection to a real MyProxy service running on a host 
     40    '''Tests require a connection to a real MyProxy service running on a host. 
     41     
     42    The server must be set up as a credential repository - i.e. able to receive 
     43    and store credentials 
    4144    ''' 
    4245    CONFIG_FILENAME = "myProxyClientTest.cfg" 
     
    5760        configFilePath = path.expandvars(self.cfg['setUp']['cfgFilePath']) 
    5861        self.clnt = MyProxyClient(cfgFilePath=configFilePath) 
    59          
    60     def test01Store(self): 
    61         # upload X509 cert and private key to repository 
    62         thisSection = self.cfg['test01Store'] 
    63          
    64         passphrase = thisSection.get('passphrase') 
    65         if passphrase is None: 
    66             passphrase = getpass.getpass(prompt="\ntest1Store credential " 
    67                                                 "pass-phrase: ") 
    68              
    69         sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
    70         if sslKeyFilePassphrase is None: 
    71             sslKeyFilePassphrase = getpass.getpass( 
    72                         prompt="\ntest1Store credential owner pass-phrase: ") 
    73  
    74         certFile = path.expandvars(thisSection['ownerCertFile']) 
    75         keyFile = path.expandvars(thisSection['ownerKeyFile']) 
    76         sslCertFile = path.expandvars(thisSection['sslCertFile']) 
    77         sslKeyFile = path.expandvars(thisSection['sslKeyFile']) 
    78              
    79         self.clnt.store(thisSection['username'], 
    80                         passphrase, 
    81                         certFile, 
    82                         keyFile, 
    83                         sslCertFile=sslCertFile, 
    84                         sslKeyFile=sslKeyFile, 
    85                         sslKeyFilePassphrase=sslKeyFilePassphrase, 
    86                         force=False) 
    87         print("Store creds for user %s" % thisSection['username']) 
    88      
    89     def test02GetDelegation(self): 
    90         # retrieve proxy cert./private key 
    91         thisSection = self.cfg['test02GetDelegation'] 
    92          
    93         passphrase = thisSection.get('passphrase') 
    94         if passphrase is None: 
    95             passphrase = getpass.getpass(prompt="\ntest2GetDelegation " 
    96                                                 "passphrase: ") 
    97           
    98         proxyCertFile = path.expandvars(thisSection['proxyCertFileOut']) 
    99         proxyKeyFile = path.expandvars(thisSection['proxyKeyFileOut']) 
    100  
    101         creds = self.clnt.getDelegation(thisSection['username'], passphrase) 
    102         print "proxy credentials:"  
    103         print ''.join(creds) 
    104         open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:])) 
    105         open(proxyKeyFile, 'w').write(creds[1]) 
    106  
    107     def test03Info(self): 
    108         # Retrieve information about a given credential 
    109         thisSection = self.cfg['test03Info'] 
    110          
    111         # sslKeyFilePassphrase can be omitted from the congif file in which case 
    112         # the get call below would return None 
    113         sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
    114         if sslKeyFilePassphrase is None: 
    115             sslKeyFilePassphrase = getpass.getpass(prompt="\ntest3Info owner " 
    116                                               "credentials passphrase: ") 
    117  
    118         credExists, errorTxt, fields = self.clnt.info( 
    119                                  thisSection['username'], 
    120                                  path.expandvars(thisSection['sslCertFile']), 
    121                                  path.expandvars(thisSection['sslKeyFile']), 
    122                                  sslKeyFilePassphrase=sslKeyFilePassphrase) 
    123         print "test3Info... " 
    124         print "credExists: %s" % credExists 
    125         print "errorTxt: " + errorTxt 
    126         print "fields: %s" % fields 
    127  
    128     def test04ChangePassphrase(self):         
    129         # change pass-phrase protecting a given credential 
    130         thisSection = self.cfg['test04ChangePassphrase'] 
    131          
    132         passphrase = thisSection.get('passphrase') 
    133         if passphrase is None: 
    134             passphrase = getpass.getpass(prompt="test4ChangePassphrase - " 
    135                                                 "passphrase: ") 
    136          
    137         newPassphrase = thisSection.get('newPassphrase') 
    138         if newPassphrase is None: 
    139             newPassphrase = getpass.getpass(prompt="test4ChangePassphrase " 
    140                                                    "- new passphrase: ") 
    141  
    142             confirmNewPassphrase = getpass.getpass(prompt=\ 
    143                                                    "test4ChangePassphrase " 
    144                                                    "- confirm new " 
    145                                                    "passphrase: ") 
    146  
    147             if newPassphrase != confirmNewPassphrase: 
    148                 self.fail("New and confirmed new password don't match") 
    149                  
    150         sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') or passphrase 
    151  
    152         self.clnt.changePassphrase(thisSection['username'], 
    153                                passphrase, 
    154                                newPassphrase,  
    155                                path.expandvars(thisSection['sslCertFile']), 
    156                                path.expandvars(thisSection['sslKeyFile']), 
    157                                sslKeyFilePassphrase=sslKeyFilePassphrase) 
    158         print("Changed pass-phrase") 
    159  
    160     def test05Destroy(self): 
    161         # destroy credentials for a given user 
    162         thisSection = self.cfg['test05Destroy'] 
    163          
    164         sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
    165         if sslKeyFilePassphrase is None: 
    166             sslKeyFilePassphrase = getpass.getpass(prompt="\ntest5Destroy " 
    167                                               "credential owner passphrase: ") 
    168  
    169         self.clnt.destroy(thisSection['username'],  
    170                       sslCertFile=path.expandvars(thisSection['sslCertFile']), 
    171                       sslKeyFile=path.expandvars(thisSection['sslKeyFile']), 
    172                       sslKeyFilePassphrase=sslKeyFilePassphrase) 
    173         print("Destroy creds for user %s" % thisSection['username']) 
    174          
    175     def test06GetTrustRoots(self): 
    176         # Test get trust roots command 
    177         trustRoots = self.clnt.getTrustRoots() 
     62 
     63    def __del__(self): 
     64        """Clear up CA certs retrieved in test01GetTrustRoots call ready for 
     65        next run of these unit tests 
     66        """ 
     67        self._deleteTrustRootFiles() 
     68         
     69    def _deleteTrustRootFiles(self): 
     70        """Helper method clears up CA certs in trust roots directory set from 
     71        previous call to test01GetTrustRoots() 
     72        """         
     73        if hasattr(self, 'trustRootFiles'): 
     74            for fileName in self.trustRootFiles: 
     75                os.remove(fileName) 
     76             
     77    def test01GetTrustRoots(self): 
     78        # Test get trust roots command bootstrapping trust 
     79        trustRoots = self.clnt.getTrustRoots(writeToCACertDir=True,  
     80                                             bootstrap=True) 
    17881        self.assert_(trustRoots) 
    17982        self.assert_(isinstance(trustRoots, dict)) 
     
    18891                subj = cert.get_subject() 
    18992                self.assert_(subj) 
    190                 print("Trust root certificate retrieved with DN=%s" % subj) 
     93                print("Trust root certificate retrieved with DN=%s" % subj)  
     94                 
     95        # Keep for __del__ tidy up 
     96        self.trustRootFiles = [] 
     97         
     98        dirContents = os.listdir(self.clnt.caCertDir) 
     99        for fileName in trustRoots:      
     100            self.assert_(fileName in dirContents) 
     101            self.trustRootFiles.append(os.path.join(self.clnt.caCertDir,  
     102                                                    fileName)) 
     103    
     104    def test02Store(self): 
     105        # upload X509 cert and private key to repository 
     106        thisSection = self.cfg['test02Store'] 
     107         
     108        passphrase = thisSection.get('passphrase') 
     109        if passphrase is None: 
     110            passphrase = getpass("\ntest02Store credential pass-phrase: ") 
     111             
     112        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     113        if sslKeyFilePassphrase is None: 
     114            sslKeyFilePassphrase = getpass("\ntest02Store credential owner " 
     115                                           "pass-phrase: ") 
     116 
     117        certFile = path.expandvars(thisSection['ownerCertFile']) 
     118        keyFile = path.expandvars(thisSection['ownerKeyFile']) 
     119        sslCertFile = path.expandvars(thisSection['sslCertFile']) 
     120        sslKeyFile = path.expandvars(thisSection['sslKeyFile']) 
     121             
     122        self.clnt.store(thisSection['username'], 
     123                        passphrase, 
     124                        certFile, 
     125                        keyFile, 
     126                        sslCertFile=sslCertFile, 
     127                        sslKeyFile=sslKeyFile, 
     128                        sslKeyFilePassphrase=sslKeyFilePassphrase, 
     129                        force=False) 
     130        print("Store creds for user %s" % thisSection['username']) 
     131     
     132    def test03GetDelegation(self): 
     133        # retrieve proxy cert./private key 
     134        thisSection = self.cfg['test03GetDelegation'] 
     135         
     136        passphrase = thisSection.get('passphrase') 
     137        if passphrase is None: 
     138            passphrase = getpass("\ntest03GetDelegation passphrase: ") 
     139          
     140        proxyCertFile = path.expandvars(thisSection['proxyCertFileOut']) 
     141        proxyKeyFile = path.expandvars(thisSection['proxyKeyFileOut']) 
     142         
     143        creds = self.clnt.getDelegation(thisSection['username'], passphrase) 
     144        print "proxy credentials:"  
     145        print ''.join(creds) 
     146        open(proxyCertFile, 'w').write(creds[0]+''.join(creds[2:])) 
     147        open(proxyKeyFile, 'w').write(creds[1]) 
     148 
     149    def test04Info(self): 
     150        # Retrieve information about a given credential 
     151        thisSection = self.cfg['test04Info'] 
     152         
     153        # sslKeyFilePassphrase can be omitted from the congif file in which case 
     154        # the get call below would return None 
     155        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     156        if sslKeyFilePassphrase is None: 
     157            sslKeyFilePassphrase = getpass("\ntest04Info owner credentials " 
     158                                           "passphrase: ") 
     159 
     160        credExists, errorTxt, fields = self.clnt.info( 
     161                                 thisSection['username'], 
     162                                 path.expandvars(thisSection['sslCertFile']), 
     163                                 path.expandvars(thisSection['sslKeyFile']), 
     164                                 sslKeyFilePassphrase=sslKeyFilePassphrase) 
     165        print "test04Info... " 
     166        print "credExists: %s" % credExists 
     167        print "errorTxt: " + errorTxt 
     168        print "fields: %s" % fields 
     169 
     170    def test06ChangePassphrase(self):         
     171        # change pass-phrase protecting a given credential 
     172        thisSection = self.cfg['test06ChangePassphrase'] 
     173         
     174        passphrase = thisSection.get('passphrase') 
     175        if passphrase is None: 
     176            passphrase = getpass("test06ChangePassphrase - passphrase: ") 
     177         
     178        newPassphrase = thisSection.get('newPassphrase') 
     179        if newPassphrase is None: 
     180            newPassphrase = getpass("test06ChangePassphrase - new passphrase: ") 
     181 
     182            confirmNewPassphrase = getpass("test06ChangePassphrase - confirm " 
     183                                           "new passphrase: ") 
     184 
     185            if newPassphrase != confirmNewPassphrase: 
     186                self.fail("New and confirmed new password don't match") 
     187                 
     188        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') or \ 
     189                            passphrase 
     190 
     191        self.clnt.changePassphrase(thisSection['username'], 
     192                               passphrase, 
     193                               newPassphrase,  
     194                               path.expandvars(thisSection['sslCertFile']), 
     195                               path.expandvars(thisSection['sslKeyFile']), 
     196                               sslKeyFilePassphrase=sslKeyFilePassphrase) 
     197        print("Changed pass-phrase") 
     198 
     199    def test05GetDelegationWithBootstrappedTrustRoots(self): 
     200        # Get delegation call whilst simulataneously bootstrapping trust roots 
     201        thisSection = self.cfg['test05GetDelegationWithBootstrappedTrustRoots'] 
     202         
     203        passphrase = thisSection.get('passphrase') 
     204        if passphrase is None: 
     205            passphrase = getpass("\n" 
     206                                 "test05GetDelegationWithBootstrappedTrustRoots" 
     207                                 "passphrase: ") 
     208         
     209        # Ensure any previously set trust root files are removed 
     210        self._deleteTrustRootFiles() 
     211         
     212        creds = self.clnt.getDelegation(thisSection['username'], passphrase, 
     213                                        bootstrap=True) 
     214        print "proxy credentials:"  
     215        print ''.join(creds) 
     216               
     217    def test07Destroy(self): 
     218        # destroy credentials for a given user 
     219        thisSection = self.cfg['test07Destroy'] 
     220         
     221        sslKeyFilePassphrase = thisSection.get('sslKeyFilePassphrase') 
     222        if sslKeyFilePassphrase is None: 
     223            sslKeyFilePassphrase = getpass("\ntest07Destroy credential owner " 
     224                                           "passphrase: ") 
     225 
     226        self.clnt.destroy(thisSection['username'],  
     227                      sslCertFile=path.expandvars(thisSection['sslCertFile']), 
     228                      sslKeyFile=path.expandvars(thisSection['sslKeyFile']), 
     229                      sslKeyFilePassphrase=sslKeyFilePassphrase) 
     230        print("Destroy creds for user %s" % thisSection['username']) 
    191231         
    192232         
     
    210250                                   proxyCertMaxLifetime=60000, 
    211251                                   proxyCertLifetime=30000,             
    212                                    caCertFilePath=mkPath('ndg-test-ca.crt')) 
     252                                   caCertDir=mkPath('')) 
    213253             
    214254            self.assert_(client.port == 20000) 
     
    218258            self.assert_(client.proxyCertLifetime == 30000) 
    219259            self.assert_(client.openSSLConfFilePath == mkPath('openssl.conf')) 
    220             self.assert_(client.caCertFilePath == mkPath('ndg-test-ca.crt')) 
     260            self.assert_(client.caCertDir == mkPath('')) 
    221261        finally: 
    222262            os.environ = environBackup        
     
    245285            pass 
    246286         
    247         client.caCertFilePath = mkPath('ca.pem')  
    248287        client.caCertDir = mkPath('/etc/grid-security/certificates')  
    249288         
     
    254293        self.assert_(client.proxyCertLifetime == 70000) 
    255294        self.assert_(client.openSSLConfFilePath == mkPath('ssl.cnf')) 
    256         self.assert_(client.caCertFilePath == mkPath('ca.pem'))  
    257295        self.assert_( 
    258296                client.caCertDir == mkPath('/etc/grid-security/certificates'))  
Note: See TracChangeset for help on using the changeset viewer.