Changeset 6828 for TI12-security/trunk


Ignore:
Timestamp:
21/04/10 09:43:01 (10 years ago)
Author:
pjkersha
Message:
 
Location:
TI12-security/trunk/MyProxyClient/myproxy
Files:
1 edited
4 copied
1 moved

Legend:

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

    r6827 r6828  
    112112class MyProxyClientRetrieveError(MyProxyClientError): 
    113113    """Error recovering a response from MyProxy""" 
     114 
     115class MyProxyCredentialsAlreadyExist(MyProxyClientError): 
     116    """Attempting to upload credentials to the server which already exist.  - 
     117    See MyProxyClient.store 
     118    """ 
     119     
     120class MyProxyClientGetTrustRootsError(MyProxyClientError): 
     121    """Error retrieving trust roots""" 
    114122             
    115123         
     
    599607         
    600608        @param msg: string response message from MyProxy server 
    601         @*fieldNames: the content of additional fields can be returned by  
    602         specifying the field name or names as additional arguments e.g. info 
    603         method passes 'CRED_START_TIME', 'CRED_END_TIME' and 'CRED_OWNER' 
    604         field names.  The content of fields is returned as an extra element 
    605         in the tuple response.  This element is itself a dictionary indexed 
    606         by field name. 
    607         @return tuple of integer response and errorTxt string (if any) 
    608         """ 
    609          
     609        @return: tuple of integer response and errorTxt string (if any) and all  
     610        the fields parsed.  fields is a list of two element, field name, field  
     611        value tuples. 
     612        @rtype: tuple 
     613        """   
    610614        lines = msg.split('\n') 
     615        fields = [tuple(line.split('=', 1)) for line in lines][:-1] 
    611616         
    612617        # get response value 
    613         responselines = filter(lambda x: x.startswith('RESPONSE'), lines) 
    614         responseline = responselines[0] 
    615         respCode = int(responseline.split('=')[1]) 
    616          
     618        respCode = [int(v) for k, v in fields if k == 'RESPONSE'][0] 
     619 
    617620        # get error text 
    618         errorTxt = "" 
    619         errorlines = filter(lambda x: x.startswith('ERROR'), lines) 
    620         for e in errorlines: 
    621             etext = e.split('=', 1)[1] 
    622             errorTxt += os.linesep + etext 
    623          
     621        errorTxt = os.linesep.join([v for k, v in fields if k == 'ERROR']) 
     622         
     623        # Check for custom fields requested by caller to this method 
    624624        if fieldNames: 
    625             fields = {} 
    626                          
    627             for fieldName in fieldNames: 
    628                 fieldlines = filter(lambda x: x.startswith(fieldName), lines) 
    629                 try: 
    630                     # Nb. '1' arg to split ensures owner DN is not split up. 
    631                     field = fieldlines[0].split('=', 1)[1] 
    632                     fields[fieldName]=field.isdigit() and int(field) or field 
    633  
    634                 except IndexError: 
    635                     # Ignore fields that aren't found 
    636                     pass 
    637                  
    638             return respCode, errorTxt, fields 
     625            fieldsDict = {} 
     626            for k, v in fields: 
     627                names = [name for name in fieldNames if k.startswith(name)] 
     628                if len(names) == 0: 
     629                    continue 
     630                else: 
     631                    if v.isdigit(): 
     632                        fieldsDict[k] = int(v) 
     633                    else: 
     634                        fieldsDict[k] = v 
     635               
     636            # Return additional dict item in tuple   
     637            return respCode, errorTxt, fieldsDict 
    639638        else: 
    640             return respCode, errorTxt 
    641      
     639            return respCode, errorTxt    
    642640   
    643641    def _deserializeCerts(self, inputDat): 
     
    788786        # Pass in the names of fields to return in the dictionary 'field'  
    789787        respCode, errorTxt, field = self._deserializeResponse(dat,  
    790                                                              'CRED_START_TIME',  
    791                                                              'CRED_END_TIME',  
    792                                                              'CRED_OWNER') 
     788                                                              'CRED_START_TIME',  
     789                                                              'CRED_END_TIME',  
     790                                                              'CRED_OWNER') 
    793791 
    794792        return not bool(respCode), errorTxt, field 
     
    985983                         ownerKeyFile=ownerKeyFile, 
    986984                         ownerPassphrase=ownerPassphrase)[0]: 
    987                 raise MyProxyClientError( 
     985                raise MyProxyCredentialsAlreadyExist( 
    988986                        "Credentials already exist for user: %s" % username) 
    989987 
     
    11611159                        MyProxyClient.SERVER_RESP_BLK_SIZE) 
    11621160             
    1163         respCode, errorTxt, fields = self._deserializeResponse(dat,  
    1164                                                                'TRUSTED_CERTS') 
     1161        respCode, errorTxt, fileData = self._deserializeResponse(dat,  
     1162                                                                'TRUSTED_CERTS', 
     1163                                                                'FILEDATA_') 
    11651164        if respCode: 
    1166             raise MyProxyClientGetError(errorTxt) 
    1167          
    1168         # Skip terminating line 
    1169         lines = dat.split('\n')[:-1] 
    1170         log.debug("Response = %r", lines) 
    1171  
    1172         fileNameKeys = fields['TRUSTED_CERTS'].split(',') 
    1173         respDict = dict([tuple(line.split('=', 1))  
    1174                          for line in lines if line.startswith('FILEDATA_')]) 
    1175          
    1176         filesDict = dict([(k, base64.b64decode(respDict['FILEDATA_' + k]))  
    1177                           for k in fileNameKeys]) 
     1165            raise MyProxyClientGetTrustRootsError(errorTxt) 
     1166         
     1167        filesDict = dict([(k, base64.b64decode(v))  
     1168                          for k, v in fileData.items() if k != 'TRUSTED_CERTS']) 
    11781169         
    11791170        return filesDict 
Note: See TracChangeset for help on using the changeset viewer.