Changeset 1858


Ignore:
Timestamp:
13/12/06 17:04:49 (13 years ago)
Author:
pjkersha
Message:

server/ndg/security/server/MyProxy.py: integrated from Tests/m2CryptoMyPxClnt
but tests and fixes required.
test/ndg/security/test/AttAuthority/AttAuthorityClientTest.py: cleaned up
tests.
test/ndg/security/test/MyProxy/init.py: MyProxy? unit test package
test/MyProxy/myProxyProperties.xml: test XML properties file for client class
test/MyProxy/myProxyClientTest.cfg: config file for unit test
test/MyProxy/MyProxyClientTest.py: unit test module - no tests working yet

Location:
TI12-security/trunk/python
Files:
5 added
3 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/conf/myProxyProperties.xml

    r964 r1858  
    44        Nb. MYPROXY_SERVER environment variable if set, overrides this setting 
    55        --> 
    6         <myProxyServer>localhost</myProxyServer> 
     6        <hostname>localhost</hostname> 
     7        <port>7512</port> 
    78        <!-- 
    89        Nb. GRID_SECURITY_DIR environment variable if set, overrides this setting 
     
    1112        --> 
    1213        <gridSecurityDir>$GLOBUS_LOCATION/etc</gridSecurityDir> 
    13         <credStorageDir></credStorageDir> 
    1414        <!-- Open SSL Configuration settings --> 
    1515        <openSSLConfFileName>globus-user-ssl.conf</openSSLConfFileName> 
    1616        <tmpDir>/tmp</tmpDir> 
    17         <path>$GLOBUS_LOCATION/bin:$GLOBUS_LOCATION/sbin:/usr/bin:/bin</path> 
    1817        <!--  
    19                 Limit on maximum lifetime any proxy certificate can have - specified when 
    20                 a certificate is first created by addUser() method 
    21                 --> 
     18                Limit on maximum lifetime any proxy certificate can have - specified  
     19            when a certificate is first created by store() method 
     20        --> 
    2221        <proxyCertMaxLifetime></proxyCertMaxLifetime> <!-- in hours --> 
    2322        <!--  
     
    2625                --> 
    2726        <proxyCertLifetime></proxyCertLifetime> <!-- in hours --> 
    28         <simpleCACltProp> 
    29             <wsdl></wsdl> 
    30             <xmlSigKeyFile></xmlSigKeyFile> 
    31             <xmlSigCertFile></xmlSigCertFile> 
    32             <xmlSigCertPPhrase></xmlSigCertPPhrase> 
    33         </simpleCACltProp> 
    3427</myProxyProp> 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/MyProxy.py

    r1857 r1858  
    5353     
    5454    @cvar __getCmd: get command string 
     55    @cvar __infoCmd: info command string 
     56    @cvar __destroyCmd: destroy command string 
     57    @cvar __changePassphrase: command string to change cred pass-phrase 
    5558    @cvar __storeCmd: store command string 
    56     @cvar _certReqParamName: names of parameters needed to generate a  
     59    @cvar _hostCertSubDirPath: sub-directory path host certificate (as tuple) 
     60    @cvar _hostKeySubDirPath: sub-directory path to host key (as tuple) 
     61    @cvar _certReqDNdefaultsName: names of parameters needed to generate a  
    5762    certificate request e.g. CN, OU etc. 
    5863    """ 
     
    8994LIFETIME=%d\0""" 
    9095 
    91   
    92     _certReqParamName = ('O', 'OU') 
     96    _hostCertSubDirPath = ('etc', 'hostcert.pem') 
     97    _hostKeySubDirPath = ('etc', 'hostkey.pem') 
     98     
     99    _certReqDNdefaultsName = ('O', 'OU') 
    93100 
    94101    # valid configuration property keywords 
    95     __validKeys = ['myProxyServer', 
     102    __validKeys = ('hostname', 
     103                   'port', 
    96104                   'gridSecurityDir', 
    97                    'credStorageDir', 
    98105                   'openSSLConfFileName', 
    99106                   'tmpDir', 
    100                    'path', 
    101107                   'proxyCertMaxLifetime', 
    102                    'proxyCertLifetime', 
    103                    'simpleCACltProp', 
    104                    'simpleCASrvProp'] 
     108                   'proxyCertLifetime') 
    105109 
    106110    # For checking whether MyProxy server name is localhost 
     
    112116 
    113117    #_________________________________________________________________________             
    114     def __init__(self,  
    115                  propFilePath=None, 
    116                  hostname=os.environ.get('MYPROXY_SERVER'),  
    117                  port=7512, 
    118                  **prop): 
     118    def __init__(self, propFilePath=None, **prop): 
     119        """Make an initial settings for client connections to MyProxy 
     120         
     121        Settings are held in a dictionary which can be set from **prop, 
     122        a call to setProperties() or by passing settings in an XML file 
     123        given by propFilePath 
     124         
     125        @param propFilePath:   set properties via a configuration file 
     126        @param **prop:         set properties via keywords - see __validKeys 
     127        class variable for a list of these 
    119128        """ 
    120         @param hostname string for MyProxy server - defaults to  
    121         MYPROXY_SERVER environment variable 
    122         @param integer port number MyProxy is running on 
    123         propFilePath:   set properties via a configuration file 
    124         prop:           set properties via keywords 
    125         """ 
    126         self.hostname = hostname 
    127         self.port = port 
    128          
     129 
    129130        # Set-up parameter names for certificate request 
    130         self.__certReqParam = {}.fromkeys(MyProxyClient._certReqParamName) 
     131        self.__certReqDNdefaults = {} 
    131132         
    132133        # Check for parameter names set from input 
    133         self.certReqParam = certReqKw 
    134  
    135  
     134        #self.certReqDNdefaults = None 
     135 
     136        # settings dictionary 
    136137        self.__prop = {} 
    137              
     138         
     139        # Defaults 
     140        self.__prop['port'] = 7512 
     141        self.__prop['proxyCertLifetime'] = 43200 
     142        self.__prop['proxyCertMaxLifetime'] = 43200 
    138143        
    139144        # Configuration file used to get default subject when generating a 
     
    152157 
    153158        # Grid security directory - environment variable setting overrides 
    154         if 'GRID_SECURITY_DIR' in self.__env: 
     159        if 'GRID_SECURITY_DIR' in os.environ: 
    155160            self.__prop['gridSecurityDir'] = self.__env['GRID_SECURITY_DIR']             
    156161 
     
    160165 
    161166        # Server host name - environment setting overrides 
    162         if 'MYPROXY_SERVER' in self.__env: 
    163             self.__prop['myProxyServer'] = self.__env['MYPROXY_SERVER']  
    164             
     167        if 'MYPROXY_SERVER' in os.environ: 
     168            self.__prop['hostname'] = os.environ['MYPROXY_SERVER'] 
     169             
     170        # ... and port number 
     171        if 'MYPROXY_SERVER_PORT' in os.environ: 
     172            self.__prop['port'] = os.environ['MYPROXY_SERVER_PORT'] 
    165173 
    166174    #_________________________________________________________________________ 
     
    171179        invalidKeys = [key for key in prop if key not in self.__validKeys] 
    172180        if invalidKeys: 
    173             raise MyProxyClientError, "Property name \"%s\" is invalid" % key 
     181            raise MyProxyClientError, 'Invalid property name(s) set: "%s"' % \ 
     182                                    '", "'.join(invalidKeys) 
    174183                 
    175184        self.__prop.update(prop) 
    176185 
    177186        # Update openssl conf file path 
    178         if 'gridSecurityDir' in prop or 'openSSLConfFileName' in prop: 
    179              
     187        if 'gridSecurityDir' in prop or 'openSSLConfFileName' in prop:             
    180188            self.__openSSLConf.filePath = \ 
    181189                            os.path.join(self.__prop['gridSecurityDir'], 
     
    189197        propFilePath|propertiesElem 
    190198 
    191         propFilePath: set to read from the specified file 
    192         propertiesElem:     set to read beginning from a cElementTree node""" 
     199        @param propFilePath: set to read from the specified file 
     200        @param propertiesElem: set to read beginning from a cElementTree node 
     201        @return None 
     202        """ 
    193203 
    194204        if propFilePath is not None: 
    195  
    196205            try: 
    197206                tree = ElementTree.parse(propFilePath) 
     
    199208                 
    200209            except IOError, e: 
    201                 raise MyProxyClientError(\ 
     210                raise MyProxyClientError, \ 
    202211                                "Error parsing properties file \"%s\": %s" % \ 
    203                                 (e.filename, e.strerror)) 
    204  
    205                  
     212                                (e.filename, e.strerror)            
    206213            except Exception, e: 
    207                 raise MyProxyClientError("Error parsing properties file: %s" % \ 
    208                                     str(e)) 
    209  
     214                raise MyProxyClientError, \ 
     215                                "Error parsing properties file: %s" % str(e) 
     216                                 
    210217        if propElem is None: 
    211             raise MyProxyClientError("Root element for parsing is not defined") 
     218            raise MyProxyClientError, \ 
     219                    "Root element for parsing properties file is not defined" 
    212220 
    213221 
     
    221229                elem.text = os.path.expandvars(elem.text) 
    222230 
    223             prop[elem.tag] = elem.text 
    224              
    225  
    226         # Check for SimpleCA properties - should be either WS client or 
    227         # local server property settings 
    228         if 'simpleCACltProp' in prop: 
    229  
    230             tagElem = propElem.find('simpleCACltProp') 
    231             if not tagElem: 
    232                 raise MyProxyClientError("Tag %s not found in file" % \ 
    233                                    'simpleCACltProp') 
    234              
    235             try: 
    236                 simpleCAClt = SimpleCAClient() 
    237                 simpleCAClt.readProperties(propElem=tagElem) 
    238                  
    239             except Exception, e: 
    240                 raise MyProxyClientError("Setting SimpleCAClient properties: %s"%e) 
    241  
    242             prop['simpleCACltProp'] = simpleCAClt() 
    243              
    244         elif 'simpleCASrvProp' in prop: 
    245  
    246             tagElem = propElem.find('simpleCASrvProp') 
    247             if not tagElem: 
    248                 raise MyProxyClientError("Tag %s not found in file" % \ 
    249                                    'simpleCASrvProp') 
    250              
    251             try: 
    252                 simpleCA = SimpleCA() 
    253                 simpleCA.readProperties(propElem=tagElem) 
    254                  
    255             except Exception, e: 
    256                 raise MyProxyClientError("Setting SimpleCA properties: %s" % e) 
    257  
    258             prop['simpleCASrvProp'] = simpleCA() 
    259  
    260         else: 
    261             raise MyProxyClientError(\ 
    262                 "Neither %s or %s tags found in properties file" % \ 
    263                 ('simpleCACltProp', 'simpleCASrvProp')) 
    264  
    265  
     231            if elem.text.isdigit(): 
     232                prop[elem.tag] = int(elem.text) 
     233            else: 
     234                prop[elem.tag] = elem.text 
     235             
    266236        self.setProperties(**prop) 
    267237     
     
    272242        local machine myproxy-admin-* commands won't work.  This affects 
    273243        addUser and userIsRegistered commands"""         
    274         return self.__prop['myProxyServer'] in self.__class__.__localHostnames 
     244        return self.__prop['hostname'] in self.__class__.__localHostnames 
    275245 
    276246    #_________________________________________________________________________         
    277247    def __setCertReqParam(self, dict): 
    278         '''certReqParam property set method - forces setting of certificate  
     248        '''certReqDNdefaults property set method - forces setting of certificate  
    279249        request parameter names to valid values 
    280250         
     
    282252         
    283253        invalidKw = [k for k in dict \ 
    284                      if k not in MyProxyClient._certReqParamName] 
     254                     if k not in MyProxyClient._certReqDNdefaultsName] 
    285255        if invalidKw: 
    286256            raise MyProxyClientError, \ 
    287257    "Invalid certificate request keyword(s): %s.  Valid keywords are: %s" % \ 
    288     (', '.join(invalidKw), ', '.join(MyProxyClient._certReqParamName)) 
    289      
    290         self.__certReqParam.update(dict) 
     258    (', '.join(invalidKw), ', '.join(MyProxyClient._certReqDNdefaultsName)) 
     259     
     260        self.__certReqDNdefaults.update(dict) 
    291261 
    292262    #_________________________________________________________________________         
    293263    def __getCertReqParam(self): 
    294         """certReqParam property set method - for Certificate request  
     264        """certReqDNdefaults property set method - for Certificate request  
    295265        parameters dict""" 
    296         return self.__certReqParam 
    297      
    298      
    299     certReqParam = property(fset=__setCertReqParam, 
     266        return self.__certReqDNdefaults 
     267     
     268     
     269    certReqDNdefaults = property(fset=__setCertReqParam, 
    300270                            fget=__getCertReqParam, 
    301271                            doc="Dictionary of parameters for cert. request") 
     
    329299        req.set_pubkey(pubKey) 
    330300         
     301        if self.__certReqDNdefaults: 
     302            certReqDNdefaults = self.__certReqDNdefaults 
     303        else: 
     304            defaultReqDN = self.__openSSLConf.getReqDN() 
     305             
     306            certReqDNdefaults['O'] = defaultReqDN['0.organizationName'] 
     307            certReqDNdefaults['OU'] = defaultReqDN['0.organizationUnitName'] 
     308             
     309        import pdb;pdb.set_trace() 
     310         
    331311        # Set DN 
    332312        x509Name = X509.X509_Name() 
    333313        x509Name.CN = CN 
    334         x509Name.OU = self.__certReqParam['OU'] 
    335         x509Name.O = self.__certReqParam['O'] 
     314        x509Name.OU = certReqDNdefaults['OU'] 
     315        x509Name.O = certReqDNdefaults['O'] 
    336316        req.set_subject_name(x509Name) 
    337317         
     
    432412        given username 
    433413         
    434         Exceptions:  GetError, StoreCredError 
     414        Exceptions:  GetError, RetrieveError 
    435415         
    436416        @param username: username selected for credential 
     
    449429        if not ownerCertFile or not ownerKeyFile: 
    450430            if globusLoc: 
    451                 ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
    452                 ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     431                ownerCertFile = os.path.join(globusLoc,  
     432                                         *MyProxyClient._hostCertSubDirPath) 
     433                ownerKeyFile = os.path.join(globusLoc,  
     434                                         *MyProxyClient._hostKeySubDirPath) 
    453435            else: 
    454436                raise MyProxyClientError, \ 
     
    472454        # host/<hostname> one 
    473455        conn.clientPostConnectionCheck = None 
    474         conn.connect((self.hostname, self.port)) 
     456        conn.connect((self.__prop['hostname'], self.__prop['port'])) 
    475457         
    476458        # send globus compatibility stuff 
     
    503485        """change pass-phrase protecting the credentials for a given username 
    504486         
    505         Exceptions:  GetError, StoreCredError 
     487        Exceptions:  GetError, RetrieveError 
    506488         
    507489        @param username: username of credential 
     
    522504        if not ownerCertFile or not ownerKeyFile: 
    523505            if globusLoc: 
    524                 ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
    525                 ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     506                ownerCertFile = os.path.join(globusLoc,  
     507                                         *MyProxyClient._hostCertSubDirPath) 
     508                ownerKeyFile = os.path.join(globusLoc,  
     509                                         *MyProxyClient._hostKeySubDirPath) 
    526510            else: 
    527511                raise MyProxyClientError, \ 
    528512            "No client authentication cert. and private key file were given" 
    529513         
    530         import pdb;pdb.set_trace() 
    531514        context = Context(protocol='sslv3') 
    532515        context.load_cert(ownerCertFile, 
     
    545528        # host/<hostname> one 
    546529        conn.clientPostConnectionCheck = None 
    547         conn.connect((self.hostname, self.port)) 
     530        conn.connect((self.__prop['hostname'], self.__prop['port'])) 
    548531         
    549532        # send globus compatibility stuff 
     
    572555        """destroy credentials from the server for a given username 
    573556         
    574         Exceptions:  GetError, StoreCredError 
     557        Exceptions:  GetError, RetrieveError 
    575558         
    576559        @param username: username selected for credential 
     
    589572        if not ownerCertFile or not ownerKeyFile: 
    590573            if globusLoc: 
    591                 ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
    592                 ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     574                ownerCertFile = os.path.join(globusLoc,  
     575                                         *MyProxyClient._hostCertSubDirPath) 
     576                ownerKeyFile = os.path.join(globusLoc,  
     577                                         *MyProxyClient._hostKeySubDirPath) 
    593578            else: 
    594579                raise MyProxyClientError, \ 
     
    612597        # host/<hostname> one 
    613598        conn.clientPostConnectionCheck = None 
    614         conn.connect((self.hostname, self.port)) 
     599        conn.connect((self.__prop['hostname'], self.__prop['port'])) 
    615600         
    616601        # send globus compatibility stuff 
     
    637622              ownerKeyFile=None, 
    638623              ownerPassphrase=None, 
    639               lifetime=43200): 
     624              lifetime=None): 
    640625        """Upload credentials to the server 
    641626         
    642         Exceptions:  GetError, StoreCredError 
     627        Exceptions:  GetError, RetrieveError 
    643628         
    644629        @param username: username selected for credential 
     
    659644        @return none 
    660645        """ 
     646         
     647        lifetime = lifetime or self.__prop['proxyCertMaxLifetime'] 
     648         
    661649        globusLoc = os.environ.get('GLOBUS_LOCATION') 
    662650        if not ownerCertFile or not ownerKeyFile: 
    663651            if globusLoc: 
    664                 ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
    665                 ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     652                ownerCertFile = os.path.join(globusLoc,  
     653                                         *MyProxyClient._hostCertSubDirPath) 
     654                ownerKeyFile = os.path.join(globusLoc,  
     655                                         *MyProxyClient._hostKeySubDirPath) 
    666656            else: 
    667657                ownerCertFile = certFile  
     
    685675        # host/<hostname> one 
    686676        conn.clientPostConnectionCheck = None 
    687         conn.connect((self.hostname, self.port)) 
     677        conn.connect((self.__prop['hostname'], self.__prop['port'])) 
    688678         
    689679        # send globus compatibility stuff 
     
    715705         
    716706    #_________________________________________________________________________            
    717     def logon(self, username, passphrase, lifetime=43200): 
     707    def logon(self, username, passphrase, lifetime=None): 
    718708        """Retrieve a proxy credential from a MyProxy server 
    719709         
     
    726716        proxy certificate, it's private key and the signing certificate. 
    727717        """ 
    728      
     718         
     719        lifetime = lifetime or self.__prop['proxyCertLifetime'] 
     720         
    729721        context = Context(protocol='sslv3') 
    730722         
     
    740732        # host/<hostname> one 
    741733        conn.clientPostConnectionCheck = None 
    742         conn.connect((self.hostname, self.port)) 
     734        conn.connect((self.__prop['hostname'], self.__prop['port'])) 
    743735         
    744736        # send globus compatibility stuff 
     
    746738     
    747739        # send get command 
    748         cmd = MyProxyClient.__getCmd % (username,passphrase,lifetime) 
     740        cmd = MyProxyClient.__getCmd % (username, passphrase, lifetime) 
    749741        conn.write(cmd) 
    750742     
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/AttAuthorityClientTest.py

    r1824 r1858  
    11#!/usr/bin/e 
    2 """NDG Attribute Authority client  
     2"""NDG Attribute Authority client unit tests 
    33 
    44NERC Data Grid Project 
     
    2020     
    2121    def setUp(self): 
    22         try: 
    23             # Session Manager WSDL 
    24             self.uri = 'http://127.0.0.1:5700/AttributeAuthority' 
    25      
    26             # Instantiate WS proxy 
    27             self.clnt = AttAuthorityClient(self.uri,  
    28                                            tracefile=sys.stderr) 
    29         except Exception, e: 
    30             self.fail(str(e)) 
    31              
    32              
    33     def tearDown(self): 
    34         pass 
    35      
     22        # Session Manager WSDL 
     23        self.uri = 'http://127.0.0.1:5700/AttributeAuthority' 
     24 
     25        # Instantiate WS proxy 
     26        self.clnt = AttAuthorityClient(self.uri, tracefile=sys.stderr) 
     27    
    3628     
    3729    def testGetPubKey(self): 
     
    4335 
    4436    def testGetTrustedHostInfo(self): 
    45          
    46         try: 
    47             role = 'role' 
    48             self.clnt.getTrustedHostInfo(role) 
    49         except Exception, e: 
    50             self.fail(str(e)) 
     37        """testGetTrustedHostInfo: retrieve trusted host info matching a 
     38        given role""" 
     39        role = 'role' 
     40        self.clnt.getTrustedHostInfo(role) 
    5141 
    5242 
    5343    def testGetTrustedHostInfoWithNoRole(self): 
    54          
    55         try: 
    56             self.clnt.getTrustedHostInfo() 
    57         except Exception, e: 
    58             self.fail(str(e)) 
    59  
     44        """testGetTrustedHostInfoWithNoRole: retrieve trusted host info  
     45        irrespective of role""" 
     46        self.clnt.getTrustedHostInfo() 
    6047 
    6148    def testGetHostInfo(self): 
    62          
    63         try: 
    64             self.clnt.getHostInfo() 
    65         except Exception, e: 
    66             self.fail(str(e)) 
     49        """testGetHostInfo: retrieve info for AA host""" 
     50        self.clnt.getHostInfo() 
    6751 
    6852 
Note: See TracChangeset for help on using the changeset viewer.