Changeset 4637


Ignore:
Timestamp:
15/12/08 11:55:58 (11 years ago)
Author:
pjkersha
Message:

#941: completed unit tests. TODO:

  • test egg deployment
  • finalising licensing.
Location:
TI12-security/trunk/python/MyProxyClient
Files:
5 edited

Legend:

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

    r4624 r4637  
    2626import logging 
    2727log = logging.getLogger(__name__) 
    28 import sys, os 
     28 
     29import sys 
     30import os 
    2931import socket 
    3032from M2Crypto import X509, RSA, EVP, m2, BIO, SSL 
    31  
    3233import base64 
    33  
    34 # For parsing of properties file 
    35 try: # python 2.5 
    36     from xml.etree import cElementTree as ElementTree 
    37 except ImportError: 
    38     # if you've installed it yourself it comes this way 
    39     import cElementTree as ElementTree 
     34from ConfigParser import SafeConfigParser 
    4035 
    4136from openssl import OpenSSLConfig, OpenSSLConfigError 
    4237 
    43 from ConfigParser import SafeConfigParser 
    4438 
    4539class CaseSensitiveConfigParser(SafeConfigParser): 
     
    189183    _hostKeySubDirPath = ('etc', 'hostkey.pem') 
    190184     
     185    # Work out default location of proxy file if it exists.  This is set if a 
     186    # call has been made previously to logon / get-delegation 
     187    defProxyFile = sys.platform == 'win32' and 'proxy' or \ 
     188    sys.platform in ('linux2', 'darwin') and '/tmp/x509up_u%s'%(os.getuid()) \ 
     189    or None      
     190     
    191191    # valid configuration property keywords 
    192192    propertyDefaults = { 
     
    198198       'proxyCertMaxLifetime':  43200, 
    199199       'proxyCertLifetime':     43200, 
    200        'caCertFilePathList':    [] 
     200       'caCertFilePath':        None, 
     201       'caCertDir':             None 
    201202    } 
    202  
    203     # Work out default location of proxy file if it exists.  This is set if a 
    204     # call has been made previously to logon / get-delegation 
    205     defProxyFile = sys.platform == 'win32' and 'proxy' or \ 
    206     sys.platform in ('linux2', 'darwin') and '/tmp/x509up_u%s'%(os.getuid()) \ 
    207     or None 
    208  
    209     @classmethod 
    210     def writeProxyFile(cls,proxyCert,proxyPriKey,userX509Cert,filePath=None): 
    211         """Write out proxy cert to file in the same way as myproxy-logon -  
    212         proxy cert, private key, user cert.  Nb. output from logon can be 
    213         passed direct into this method 
    214          
    215         @type proxyCert: string  
    216         @param proxyCert: proxy certificate 
    217         @type proxyPriKey: string 
    218         @param proxyPriKey: private key for proxy 
    219         @type userX509Cert: string 
    220         @param userX509Cert: user certificate which issued the proxy 
    221         @type filePath: string 
    222         @param filePath: set to override the default filePath""" 
    223          
    224         if filePath is None: 
    225             filePath = MyProxyClient.defProxyFile 
    226              
    227         if filePath is None: 
    228             MyProxyClientConfigError("Error setting proxy file path - invalid " 
    229                                      "platform?") 
    230          
    231         outStr = proxyCert + proxyPriKey + userX509Cert        
    232         open(MyProxyClient.defProxyFile, 'w').write(outStr) 
    233         try: 
    234             # Make sure permissions are set correctly 
    235             os.chmod(MyProxyClient.defProxyFile, 0600) 
    236         except Exception, e: 
    237             # Don't leave the file lying around if couldn't change it's 
    238             # permissions 
    239             os.unlink(MyProxyClient.defProxyFile) 
    240              
    241             log.error('Unable to set 0600 permissions for proxy file "%s": %s'%  
    242                       (MyProxyClient.defProxyFile, e)) 
    243             raise 
    244  
    245     @classmethod 
    246     def readProxyFile(cls, filePath=None): 
    247         """Read proxy cert file following the format used by myproxy-logon -  
    248         proxy, cert, private key, user cert. 
    249          
    250         @rtype: tuple 
    251         @return: tuple containing proxy cert, private key, user cert""" 
    252         if filePath is None: 
    253             filePath = MyProxyClient.defProxyFile 
    254              
    255         if filePath is None: 
    256             MyProxyClientConfigError("Error setting proxy file path - invalid " 
    257                                      "platform?") 
    258                 
    259         proxy = open(MyProxyClient.defProxyFile).read() 
    260          
    261         # Split certs and key into separate tuple items 
    262         return tuple(['-----BEGIN'+i for i in proxy.split('-----BEGIN')[1:]]) 
    263          
     203     
     204    # Restrict attributes to the above properties, their equivalent  
     205    # protected values + extra OpenSSL config object. 
     206    __slots__ = propertyDefaults.copy() 
     207    __slots__.update(dict([('_'+k, v) for k,v in propertyDefaults.items()] + 
     208                          [('_openSSLConfig', None), 
     209                           ('_cfg',           None)] 
     210                          ) 
     211                     ) 
    264212         
    265213    def __init__(self, cfgFilePath=None, **prop): 
     
    274222        propertyDefaults class variable for a list of these 
    275223        """ 
    276         
    277         # Configuration file used to get default subject when generating a 
    278         # new proxy certificate request 
    279         self._openSSLConfig = OpenSSLConfig() 
    280224         
    281225        # Default settings.  Nb. '_' - override property methods in order to  
     
    283227        for opt, val in MyProxyClient.propertyDefaults.items(): 
    284228            setattr(self, '_'+opt, val) 
     229 
     230        # Configuration file used to get default subject when generating a 
     231        # new proxy certificate request 
     232        self._openSSLConfig = OpenSSLConfig() 
    285233         
    286234        # Server host name - take from environment variable if available 
    287         if 'MYPROXY_SERVER' in os.environ: 
    288             self.hostname = os.environ['MYPROXY_SERVER'] 
     235        self.hostname = os.environ.get('MYPROXY_SERVER', 
     236                                    MyProxyClient.propertyDefaults['hostname']) 
    289237             
    290238        # ... and port number 
    291         if 'MYPROXY_SERVER_PORT' in os.environ: 
    292             self.port = int(os.environ['MYPROXY_SERVER_PORT']) 
    293  
     239        self.port = int(os.environ.get('MYPROXY_SERVER_PORT',  
     240                                       MyProxyClient.propertyDefaults['port'])) 
     241 
     242        # Server Distinguished Name 
     243        self.serverDN = os.environ.get('MYPROXY_SERVER_DN', 
     244                                    MyProxyClient.propertyDefaults['serverDN']) 
     245             
    294246        # keyword settings 
    295247        for opt, val in prop.items(): 
     
    432384        MyProxy server certificate''' 
    433385         
    434         if not isinstance(val, basestring): 
     386        if isinstance(val, basestring): 
     387            if val == '': 
     388                self._caCertFilePath = None 
     389            else: 
     390                self._caCertFilePath = os.path.expandvars(val) 
     391                 
     392        elif isinstance(val, None): 
    435393            raise AttributeError("Expecting string type for caCertFilePath " 
    436                                  "attribute") 
    437              
    438         self._caCertFilePath = os.path.expandvars(val) 
     394                                 "attribute")        
    439395         
    440396    caCertFilePath = property(fget=_getCACertFilePath, 
     
    451407        validation of MyProxy server certificate. 
    452408         
    453         @type val: basestring 
     409        Set to None to make M2Crypto.SSL.Context.load_verify_locations ignore 
     410        this parameter 
     411         
     412        @type val: basestring/None 
    454413        @param val: directory path''' 
    455414         
    456         if not isinstance(val, basestring): 
    457             raise AttributeError("Expecting string type for caCertDir " 
     415        if isinstance(val, basestring): 
     416            if val == '': 
     417                self._caCertDir = None 
     418            else: 
     419                self._caCertDir = os.path.expandvars(val) 
     420                 
     421        elif isinstance(val, None): 
     422            self._caCertDir = val     
     423        else: 
     424            raise AttributeError("Expecting string or None type for caCertDir " 
    458425                                 "attribute") 
    459              
    460         self._caCertDir = os.path.expandvars(val) 
    461          
    462     caCertFileDir = property(fget=_getCACertDir, 
    463                              fset=_setCACertDir, 
    464                              doc="directory containing PEM encoded CA " 
    465                                  "certs. used along with caCertFilePath " 
    466                                  "setting to validate MyProxy server " 
    467                                  "certificate") 
     426         
     427    caCertDir = property(fget=_getCACertDir, 
     428                         fset=_setCACertDir, 
     429                         doc="directory containing PEM encoded CA " 
     430                             "certificates.  Use along with caCertFilePath " 
     431                             "setting to validate MyProxy server certificate") 
    468432 
    469433 
     
    512476                                    callback=lambda *ar, **kw: ownerPassphrase) 
    513477            except Exception, e: 
    514                 raise MyProxyClientError("Error loading CA cert., cert. and " 
    515                                          "key for SSL connection: %s" % e)  
     478                raise MyProxyClientConfigError("Loading certificate " 
     479                                               "and private key for SSL " 
     480                                               "connection [also check CA " 
     481                                               "certificate settings]: %s" % e)  
    516482             
    517483            # Verify peer's certificate 
     
    664630            
    665631        return pemCerts 
    666  
     632     
     633     
     634    @classmethod 
     635    def writeProxyFile(cls,proxyCert,proxyPriKey,userX509Cert,filePath=None): 
     636        """Write out proxy cert to file in the same way as myproxy-logon -  
     637        proxy cert, private key, user cert.  Nb. output from logon can be 
     638        passed direct into this method 
     639         
     640        @type proxyCert: string  
     641        @param proxyCert: proxy certificate 
     642        @type proxyPriKey: string 
     643        @param proxyPriKey: private key for proxy 
     644        @type userX509Cert: string 
     645        @param userX509Cert: user certificate which issued the proxy 
     646        @type filePath: string 
     647        @param filePath: set to override the default filePath""" 
     648         
     649        if filePath is None: 
     650            filePath = MyProxyClient.defProxyFile 
     651             
     652        if filePath is None: 
     653            MyProxyClientConfigError("Error setting proxy file path - invalid " 
     654                                     "platform?") 
     655         
     656        outStr = proxyCert + proxyPriKey + userX509Cert        
     657        open(MyProxyClient.defProxyFile, 'w').write(outStr) 
     658        try: 
     659            # Make sure permissions are set correctly 
     660            os.chmod(MyProxyClient.defProxyFile, 0600) 
     661        except Exception, e: 
     662            # Don't leave the file lying around if couldn't change it's 
     663            # permissions 
     664            os.unlink(MyProxyClient.defProxyFile) 
     665             
     666            log.error('Unable to set 0600 permissions for proxy file "%s": %s'%  
     667                      (MyProxyClient.defProxyFile, e)) 
     668            raise 
     669 
     670    @classmethod 
     671    def readProxyFile(cls, filePath=None): 
     672        """Read proxy cert file following the format used by myproxy-logon -  
     673        proxy, cert, private key, user cert. 
     674         
     675        @rtype: tuple 
     676        @return: tuple containing proxy cert, private key, user cert""" 
     677        if filePath is None: 
     678            filePath = MyProxyClient.defProxyFile 
     679             
     680        if filePath is None: 
     681            MyProxyClientConfigError("Error setting proxy file path - invalid " 
     682                                     "platform?") 
     683                
     684        proxy = open(MyProxyClient.defProxyFile).read() 
     685         
     686        # Split certs and key into separate tuple items 
     687        return tuple(['-----BEGIN'+i for i in proxy.split('-----BEGIN')[1:]]) 
     688     
    667689 
    668690    def info(self, 
  • TI12-security/trunk/python/MyProxyClient/test/myProxyClient.cfg

    r4624 r4637  
    1313# Delete this element and take setting from MYPROXY_SERVER environment  
    1414# variable if required 
    15 hostname=localhost 
     15#hostname=localhost 
    1616 
    1717# Delete this element to take default setting 7512 or read  
     
    2525 
    2626# Set "host/" prefix to host cert CN as is default with globus 
    27 serverCNprefix=host/ 
     27serverCNPrefix=host/ 
    2828 
    2929# This directory path is used to locate the OpenSSL configuration file 
     
    3535# but the settings can be independent of any Globus installation 
    3636openSSLConfFilePath=$MYPROXYCLIENT_UNITTEST_DIR/openssl.conf 
    37 tmpDir=/tmp 
    3837  
    3938# Limit on maximum lifetime any proxy certificate can have - specified  
    4039# when a certificate is first created by store() method 
    41 proxyCertMaxLifetime= 
     40proxyCertMaxLifetime=86400 
    4241 
    4342# Life time of a proxy certificate when issued from the Proxy Server with 
    4443# getDelegation() method 
    45 proxyCertLifetime= 
     44proxyCertLifetime=64800 
    4645 
    47 caCertFile=$MYPROXYCLIENT_UNITTEST_DIR/ndg-test-ca.crt 
     46caCertFilePath=$MYPROXYCLIENT_UNITTEST_DIR/ndg-test-ca.crt 
  • TI12-security/trunk/python/MyProxyClient/test/proxy.crt

    r3195 r4637  
    22MIICijCCAXKgAwIBAgICAPkwDQYJKoZIhvcNAQEEBQAwQjEMMAoGA1UEChMDTkRH 
    33MQ0wCwYDVQQLEwRCQURDMRAwDgYDVQQLEwdHYWJyaWVsMREwDwYDVQQDEwh0ZXN0 
    4 dXNlcjAeFw0wODAxMDkxNTE3MjlaFw0wODAxMTAwMzIyMjlaMFIxDDAKBgNVBAoT 
     4dXNlcjAeFw0wODEyMTUxMTQ5MzdaFw0wODEyMTYwNTU0MzdaMFIxDDAKBgNVBAoT 
    55A05ERzENMAsGA1UECxMEQkFEQzEQMA4GA1UECxMHR2FicmllbDERMA8GA1UEAxMI 
    66dGVzdHVzZXIxDjAMBgNVBAMTBXByb3h5MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCB 
    7 iQKBgQDhqWIYfha26oLBEWDOXWuctn6toafGev7V1yFW+6k9TnpOSEeeHbppeV7E 
    8 ksWhZdlyEwza4plaiqS2JtF+TMZSx0h4IPUuVZ55zphxat6K85OyHlm2yNv6KCBu 
    9 lA9f4jgXbDaFui1VJd7O63Oc8uFuk/PZxj8lRlI550NNlMi6MwIDAQABMA0GCSqG 
    10 SIb3DQEBBAUAA4IBAQDFbCjIoZ+LPwFegOxVZgoe0hj/M63IUyNJKC9GSjRBgOt8 
    11 vmU4CJtrZYjG2kOcw2sY3ugvY1MVWltNze2NB0vZ6tCIWA7PNlU+1Q5SubAGhulQ 
    12 1td+6sogwNKgSW+5jNqZE3QDUoPkzycP7koULi6Z/DT1fyU0eemMkbhsSbErKvM2 
    13 MKixaHMdRKOhceZvAXxNGjuCmP/GK5v6hIMWPWjYnD0AgsxjH3BN2v8b/plDQUTW 
    14 XiSXt/mJZNjYlbBFNwd4clkjBF4DzRrZRHzg2MRHINEzT1fu6Bi/pC3FJSe3LLI7 
    15 icsekrP4ADnN4IC+scNu2/4iw7OpHwuNEIkPk4oA 
     7iQKBgQDkCGd7W4Ak8WRF91VpdHLhlC85sjl+Y96xF3xSlyLjD8exvaMLCTYqpB/6 
     8uil+nraXWFHBYw0uCjbuBog7IK6eZjbX/okUCIfYJE03GEgPj5i5/wtA/WJYfJcP 
     938yUrrI9sikfjpltE2Y7U9p20Vao5vH+7rLjb/VCpaSRUzV6cQIDAQABMA0GCSqG 
     10SIb3DQEBBAUAA4IBAQDh7+3m0LZoZb5AYV1QS6fIWIKEmCGtJ9dtGnZOSKFJ3PAz 
     11d6f9c1M/PVu6GwQtSNuL3h4QJH8ybDsxrqm3oFzmFdPUuEsxRJQrPllGeQUCRhql 
     12PVv3azp6wUPSwTky/o/N1tMUvp2PNPW7eAXN2Irm0unvAaFyd2KLDgzO8QO0cEtz 
     13D4eHIMRpE6tc5QGEZL8HWVfAaaUlnvIHBIGVpgMrUn0X0EHQQtyzXhlmQfADXJ5m 
     14+Yal9firKyoYoj4uqw6FwqQHPgsJ6SGzSe2GHcyhZCixYLdez6jrx1h30o3LvYGv 
     15vMZuFaLqt9bpmEM4CcDyGovDrrcyK1Z6Nh+e7ekT 
    1616-----END CERTIFICATE----- 
    1717-----BEGIN CERTIFICATE----- 
  • TI12-security/trunk/python/MyProxyClient/test/proxy.key

    r3195 r4637  
    11-----BEGIN RSA PRIVATE KEY----- 
    2 MIICXAIBAAKBgQDhqWIYfha26oLBEWDOXWuctn6toafGev7V1yFW+6k9TnpOSEee 
    3 HbppeV7EksWhZdlyEwza4plaiqS2JtF+TMZSx0h4IPUuVZ55zphxat6K85OyHlm2 
    4 yNv6KCBulA9f4jgXbDaFui1VJd7O63Oc8uFuk/PZxj8lRlI550NNlMi6MwIDAQAB 
    5 AoGASwdkZDxYFQ032DWM+FA7XWmYCOb8v5NZc4QJw7/87zNOmwSRO1MrDbKa/cTH 
    6 DPiuKa2H0qcQ0ffS9/VEJjgkn/U7D1CPMF2WgcHiAJ1ryxUjKUgz63xuEBtauShf 
    7 agCuFaCnEEsXgYJoSvWwsTZHZ5HA9FAGCzj27kB9nQhcQCECQQD8Kux2HP9ku9yi 
    8 dRWdWQLa8X7ytF/6S9CNDuKnkHukjTt3EuNpmP/ideUDGjzS0gE3OMPZ8q5RrLhu 
    9 bEUfcUGZAkEA5RdWATCpig1Q03aURd5YLMSGK1+OfZ8HosoQCN+Tzzr8fgZSeFa3 
    10 gV+v0rxnogPYTppaf9UPyrndBfDurrTRqwJBANmH0bpGY46rfLZsWHwHKC5lO4T1 
    11 UwJhWoQEvkOcoPyflRewJJuYj8z0tN1LSgL3hHL1tgYSkowEeolPPwXTtqkCQEVu 
    12 4DM2I3xi8sdUnjXa4NCYs617pb0vMOpG4bs+wBbD4vjzQ5WTesSsUqbFUYeKMMoK 
    13 ADnUQpgH4xRE5KJwzUcCQH3ippjxJEuDvgRT+T4hIH/htIPLjzxsL4eLhOotw6jF 
    14 /naYrvRH2iAjukBVD30WxHvHda2a0i6p4v6zOkgsRGQ= 
     2MIICXQIBAAKBgQDkCGd7W4Ak8WRF91VpdHLhlC85sjl+Y96xF3xSlyLjD8exvaML 
     3CTYqpB/6uil+nraXWFHBYw0uCjbuBog7IK6eZjbX/okUCIfYJE03GEgPj5i5/wtA 
     4/WJYfJcP38yUrrI9sikfjpltE2Y7U9p20Vao5vH+7rLjb/VCpaSRUzV6cQIDAQAB 
     5AoGBAMJj17N1IRxdG5n5arpnJrfeVxPcNt7jzCczWiwd4wOlpBqFCsSRqbdYClr2 
     68ACc1BLYm3k8MzQYSRNIRkIBbljFWv25eFliE3lEJuANAGEbdemUh183U7E4Nml6 
     7jQTvMxHrq1neGIq/cY+T/D4bOV5DWbHEJi+X9ElAdD/Ou1ExAkEA/iPEpTh0/v17 
     83n3hPMb9QPjwlygf57/MMwA/6aM/LaLEXZeSVXmrT/WWFO53iTaLXqdXy9u4zQHB 
     9nfjcMhN9uwJBAOWztuVNPFMuoJFl0JtVKgHUmx01+iQ60nglcLOnF1Aoq8uusAXr 
     10m3TAp9wX2UUfNd6xv3fsbeTTbEKJTY6wT8MCQEFAd84gN9H8zaAr2/gZ846KHGQD 
     11NmXvlgOGTeK0OpWCFD8fmr/9lGHcYaOQMvr1GUW9W8qI6OMiT087RXZKEN8CQF+q 
     12tK7Vtx0x20ATNomrM56ljKDi3TZ/pS7S8Rhxq/z/o2VmcPtWQF2k64R4Dk6CjC4e 
     13u47X0oEuKPWhN8MI3X8CQQC57zRUIzfWTp9TS5RcFcHU+mYIl843NjpummZ2w+LM 
     14I3fyHRPn8NcZaGyf/DT+hdgFmSquqzZlmH7hMKSfrEd3 
    1515-----END RSA PRIVATE KEY----- 
  • TI12-security/trunk/python/MyProxyClient/test/test_myproxyclient.py

    r4624 r4637  
    2525mkPath = lambda file: jnPath(os.environ['MYPROXYCLIENT_UNITTEST_DIR'], file) 
    2626 
    27 class MyProxyClientTestCase(unittest.TestCase): 
     27class _MyProxyClientTestCase(unittest.TestCase): 
     28    '''Base implements environment settings common to all test case classes''' 
     29    if 'NDGSEC_INT_DEBUG' in os.environ: 
     30        import pdb 
     31        pdb.set_trace() 
     32     
     33    if 'MYPROXYCLIENT_UNITTEST_DIR' not in os.environ: 
     34        os.environ['MYPROXYCLIENT_UNITTEST_DIR'] = \ 
     35            os.path.abspath(os.path.dirname(__file__)) 
     36 
     37 
     38class MyProxyClientLiveTestCase(_MyProxyClientTestCase): 
     39    '''Tests require a connection to a real MyProxy service running on a host 
     40    ''' 
    2841     
    2942    def setUp(self): 
    3043         
    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                  
     44        super(MyProxyClientLiveTestCase, self).setUp() 
     45         
    3946        configParser = CaseSensitiveConfigParser() 
    4047        configFilePath = jnPath(os.environ['MYPROXYCLIENT_UNITTEST_DIR'], 
     
    7784                        ownerPassphrase=ownerPassphrase, 
    7885                        force=False) 
    79         print "Store creds for user %s" % thisSection['username'] 
     86        print("Store creds for user %s" % thisSection['username']) 
    8087     
    8188     
     
    8794        if passphrase is None: 
    8895            passphrase = getpass.getpass(prompt="\ntest2GetDelegation " 
    89                                                 "pass-phrase: ") 
     96                                                "passphrase: ") 
    9097          
    9198        proxyCertFile = xpdVars(thisSection['proxyCertFileOut']) 
    92         proxyKeyFile = xpdVars(thisSection['proxykeyfileout']) 
     99        proxyKeyFile = xpdVars(thisSection['proxyKeyFileOut']) 
    93100 
    94101        creds = self.clnt.getDelegation(thisSection['username'],  
     
    102109    def test3Info(self): 
    103110        '''test3Info: Retrieve information about a given credential''' 
    104         thisSection = thisSection 
     111        thisSection = self.cfg['test3Info'] 
    105112         
    106113        # ownerPassphrase can be omitted from the congif file in which case 
     
    109116        if ownerPassphrase is None: 
    110117            ownerPassphrase = getpass.getpass(prompt="\ntest3Info owner " 
    111                                               "credentials pass-phrase: ") 
     118                                              "credentials passphrase: ") 
    112119 
    113120        credExists, errorTxt, fields = self.clnt.info( 
     
    130137        if passphrase is None: 
    131138            passphrase = getpass.getpass(prompt="test4ChangePassphrase - " 
    132                                                 "pass-phrase: ") 
    133          
    134         newPassphrase = thisSection.get('newpassphrase') 
     139                                                "passphrase: ") 
     140         
     141        newPassphrase = thisSection.get('newPassphrase') 
    135142        if newPassphrase is None: 
    136143            newPassphrase = getpass.getpass(prompt="test4ChangePassphrase " 
    137                                                    "- new pass-phrase: ") 
     144                                                   "- new passphrase: ") 
    138145 
    139146            confirmNewPassphrase = getpass.getpass(prompt=\ 
    140147                                                   "test4ChangePassphrase " 
    141148                                                   "- confirm new " 
    142                                                    "pass-phrase: ") 
     149                                                   "passphrase: ") 
    143150 
    144151            if newPassphrase != confirmNewPassphrase: 
     
    153160                                   xpdVars(thisSection['ownerKeyFile']), 
    154161                                   ownerPassphrase=ownerPassphrase) 
    155         print "Change pass-phrase" 
     162        print("Changed pass-phrase") 
    156163 
    157164 
    158165    def test5Destroy(self): 
    159166        '''test5Destroy: destroy credentials for a given user''' 
    160  
    161         ownerPassphrase = self.cfg['test5Destroy'].get('ownerPassphrase') 
     167        thisSection = self.cfg['test5Destroy'] 
     168         
     169        ownerPassphrase = thisSection.get('ownerPassphrase') 
    162170        if ownerPassphrase is None: 
    163171            ownerPassphrase = getpass.getpass(prompt="\ntest5Destroy " 
    164                                               "credential owner pass-phrase: ") 
     172                                              "credential owner passphrase: ") 
     173 
     174        self.clnt.destroy(thisSection['username'],  
     175                          ownerCertFile=xpdVars(thisSection['ownerCertFile']), 
     176                          ownerKeyFile=xpdVars(thisSection['ownerKeyFile']), 
     177                          ownerPassphrase=ownerPassphrase) 
     178        print("Destroy creds for user %s" % thisSection['username']) 
     179         
     180         
     181from myproxy import OpenSSLConfigError 
     182 
     183class MyProxyClientInterfaceTestCase(_MyProxyClientTestCase): 
     184    '''Test interface for correct getting/setting of attributes''' 
     185     
     186    def test01EnvironmentVarsSet(self): 
    165187 
    166188        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   
    177 class 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) 
     189            environBackup = os.environ.copy() 
     190             
     191            os.environ['MYPROXY_SERVER'] = 'localhost.domain' 
     192            os.environ['MYPROXY_SERVER_DN'] = '/O=NDG/OU=Raphael/CN=raphael' 
     193            os.environ['MYPROXY_SERVER_PORT'] = '20000' 
     194            client = MyProxyClient(serverCNPrefix='', 
     195                                   openSSLConfFilePath=mkPath('openssl.conf'), 
     196                                   proxyCertMaxLifetime=60000, 
     197                                   proxyCertLifetime=30000,             
     198                                   caCertFilePath=mkPath('ndg-test-ca.crt')) 
     199             
     200            self.assert_(client.port == 20000) 
     201            self.assert_(client.hostname == 'localhost.domain') 
     202            self.assert_(client.serverDN == '/O=NDG/OU=Raphael/CN=raphael') 
     203            self.assert_(client.proxyCertMaxLifetime == 60000) 
     204            self.assert_(client.proxyCertLifetime == 30000) 
     205            self.assert_(client.openSSLConfFilePath == mkPath('openssl.conf')) 
     206            self.assert_(client.caCertFilePath == mkPath('ndg-test-ca.crt')) 
     207        finally: 
     208            os.environ = environBackup 
     209             
     210 
     211    def test02SetProperties(self): 
     212         
     213        client = MyProxyClient() 
     214        try: 
     215            client.port = None 
     216            self.fail("Expecting AttributeError raised from port set to " 
     217                      "invalid type") 
     218        except AttributeError: 
     219            pass 
     220 
     221        client.port = 8000 
     222        client.hostname = '127.0.0.1' 
     223        client.serverDN = '/O=NDG/OU=BADC/CN=raphael' 
     224        client.proxyCertMaxLifetime = 80000 
     225        client.proxyCertLifetime = 70000 
     226         
     227        try: 
     228            client.openSSLConfFilePath = mkPath('ssl.cnf') 
     229            self.fail("Expecting OpenSSLConfigError raised for invalid file " 
     230                      "'ssl.cnf'") 
     231        except OpenSSLConfigError: 
     232            pass 
     233         
     234        client.caCertFilePath = mkPath('ca.pem')  
     235        client.caCertDir = mkPath('/etc/grid-security/certificates')  
     236         
     237        self.assert_(client.port == 8000) 
     238        self.assert_(client.hostname == '127.0.0.1') 
     239        self.assert_(client.serverDN == '/O=NDG/OU=BADC/CN=raphael') 
     240        self.assert_(client.proxyCertMaxLifetime == 80000) 
     241        self.assert_(client.proxyCertLifetime == 70000) 
     242        self.assert_(client.openSSLConfFilePath == mkPath('ssl.cnf')) 
     243        self.assert_(client.caCertFilePath == mkPath('ca.pem'))  
     244        self.assert_( 
     245                client.caCertDir == mkPath('/etc/grid-security/certificates'))  
    188246                                         
    189247if __name__ == "__main__": 
Note: See TracChangeset for help on using the changeset viewer.