Changeset 1854


Ignore:
Timestamp:
12/12/06 17:07:03 (13 years ago)
Author:
pjkersha
Message:

Working version of info with additional information passed back about
credential owner and start and end times for the credential.

Also, removed debug info code.

File:
1 edited

Legend:

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

    r1852 r1854  
    3333    """Error recovering a response from MyProxy""" 
    3434 
    35  
    36 debug = 0 
    37 def debuglevel(level): 
    38     global debug 
    39     return debug >= level 
    4035 
    4136class MyProxyClient(object): 
     
    162157     
    163158    #_________________________________________________________________________            
    164     def _deserializeResponse(self, msg): 
     159    def _deserializeResponse(self, msg, *fieldNames): 
    165160        """ 
    166161        Deserialize a MyProxy server response 
    167162         
    168163        @param msg: string response message from MyProxy server 
     164        @*fieldNames: the content of additional fields can be returned by  
     165        specifying the field name or names as additional arguments e.g. info 
     166        method passes 'CRED_START_TIME', 'CRED_END_TIME' and 'CRED_OWNER' 
     167        field names.  The content of fields is returned as an extra element 
     168        in the tuple response.  This element is itself a dictionary indexed 
     169        by field name. 
    169170        @return tuple of integer response and errorTxt string (if any) 
    170171        """ 
     
    181182        errorlines = filter(lambda x: x.startswith('ERROR'), lines) 
    182183        for e in errorlines: 
    183             etext = e.split('=')[1] 
     184            etext = e.split('=', 1)[1] 
    184185            errorTxt += etext 
    185186         
    186         return respCode, errorTxt 
     187        if fieldNames: 
     188            fields = {} 
     189                         
     190            for fieldName in fieldNames: 
     191                fieldlines = filter(lambda x: x.startswith(fieldName), lines) 
     192                try: 
     193                    # Nb. '1' arg to split ensures owner DN is not split up. 
     194                    field = fieldlines[0].split('=', 1)[1] 
     195                    fields[fieldName]=field.isdigit() and int(field) or field 
     196 
     197                except IndexError: 
     198                    # Ignore fields that aren't found 
     199                    pass 
     200                 
     201            return respCode, errorTxt, fields 
     202        else: 
     203            return respCode, errorTxt 
    187204     
    188205   
     
    265282         
    266283        # connect to myproxy server 
    267         if debuglevel(1):   print "debug: connect to myproxy server" 
    268284        conn = Connection(context, sock=socket.socket()) 
    269285         
     
    274290         
    275291        # send globus compatibility stuff 
    276         if debuglevel(1):    
    277             print "debug: send globus compat byte" 
    278292        conn.write('0') 
    279293     
    280         # send destroy command 
    281         if debuglevel(1):   
    282             print "debug: send info command" 
    283              
    284         storeCmd = MyProxyClient.__infoCmd % (username) 
    285         conn.write(storeCmd) 
     294        # send info command 
     295        cmd = MyProxyClient.__infoCmd % (username) 
     296        conn.write(cmd) 
    286297     
    287298        # process server response 
    288         if debuglevel(1):    
    289             print "debug: get server response for info command request" 
    290              
    291299        dat = conn.recv(8192) 
    292         if debuglevel(1):    
    293             print dat 
    294              
    295         respCode, errorTxt = self._deserializeResponse(dat) 
    296         if respCode: 
    297             raise GetError, errorTxt 
    298         else: 
    299             if debuglevel(1):    
    300                 print "debug: server response ok" 
    301                  
    302         return bool(respCode) 
     300          
     301        # Pass in the names of fields to return in the dictionary 'field'  
     302        respCode, errorTxt, field = self._deserializeResponse(dat,  
     303                                                         'CRED_START_TIME',  
     304                                                         'CRED_END_TIME',  
     305                                                         'CRED_OWNER') 
     306 
     307        return not bool(respCode), errorTxt, field 
    303308 
    304309 
     
    346351         
    347352        # connect to myproxy server 
    348         if debuglevel(1):   print "debug: connect to myproxy server" 
    349353        conn = Connection(context, sock=socket.socket()) 
    350354         
     
    355359         
    356360        # send globus compatibility stuff 
    357         if debuglevel(1):    
    358             print "debug: send globus compat byte" 
    359361        conn.write('0') 
    360362     
    361         # send destroy command 
    362         if debuglevel(1):   
    363             print "debug: send destroy command" 
    364              
    365         storeCmd = MyProxyClient.__destroyCmd % (username) 
    366         conn.write(storeCmd) 
     363        # send store command 
     364        cmd = MyProxyClient.__destroyCmd % (username) 
     365        conn.write(cmd) 
    367366     
    368367        # process server response 
    369         if debuglevel(1):    
    370             print "debug: get server response for destroy command request" 
    371              
    372368        dat = conn.recv(8192) 
    373         if debuglevel(1):    
    374             print dat 
    375369             
    376370        respCode, errorTxt = self._deserializeResponse(dat) 
    377371        if respCode: 
    378372            raise GetError, errorTxt 
    379         else: 
    380             if debuglevel(1):    
    381                 print "debug: server response ok" 
    382373 
    383374 
     
    436427         
    437428        # connect to myproxy server 
    438         if debuglevel(1):   print "debug: connect to myproxy server" 
    439429        conn = Connection(context, sock=socket.socket()) 
    440430         
     
    445435         
    446436        # send globus compatibility stuff 
    447         if debuglevel(1):    
    448             print "debug: send globus compat byte" 
    449437        conn.write('0') 
    450438     
    451439        # send store command 
    452         if debuglevel(1):   
    453             print "debug: send store command" 
    454              
    455         storeCmd = MyProxyClient.__storeCmd % (username, lifetime) 
    456         conn.write(storeCmd) 
     440        cmd = MyProxyClient.__storeCmd % (username, lifetime) 
     441        conn.write(cmd) 
    457442     
    458443        # process server response 
    459         if debuglevel(1):    
    460             print "debug: get server response for store command request" 
    461              
    462444        dat = conn.recv(8192) 
    463         if debuglevel(1):    
    464             print dat 
    465445             
    466446        respCode, errorTxt = self._deserializeResponse(dat) 
    467447        if respCode: 
    468448            raise GetError, errorTxt 
    469         else: 
    470             if debuglevel(1):    
    471                 print "debug: server response ok" 
    472449         
    473450        # Send certificate and private key 
     
    479456     
    480457        # process server response 
    481         if debuglevel(1):    
    482             print "debug: get server response for store command completed" 
    483458        resp = conn.recv(8192) 
    484459        respCode, errorTxt = self._deserializeResponse(resp) 
    485460        if respCode: 
    486461            raise RetrieveError, errorTxt 
    487         else: 
    488             if debuglevel(1): 
    489                 print "debug: server response ok" 
    490          
    491          
     462         
     463    #_________________________________________________________________________            
    492464    def logon(self, username, passphrase, lifetime=43200): 
    493465        """Retrieve a proxy credential from a MyProxy server 
     
    510482         
    511483        # connect to myproxy server 
    512         if debuglevel(1):   print "debug: connect to myproxy server" 
    513484        conn = Connection(context, sock=socket.socket()) 
    514485         
     
    519490         
    520491        # send globus compatibility stuff 
    521         if debuglevel(1):   print "debug: send globus compat byte" 
    522492        conn.write('0') 
    523493     
    524494        # send get command 
    525         if debuglevel(1):   print "debug: send get command" 
    526         getCmd = MyProxyClient.__getCmd % (username,passphrase,lifetime) 
    527         conn.write(getCmd) 
     495        cmd = MyProxyClient.__getCmd % (username,passphrase,lifetime) 
     496        conn.write(cmd) 
    528497     
    529498        # process server response 
    530         if debuglevel(1):   print "debug: get server response" 
    531499        dat = conn.recv(8192) 
    532         if debuglevel(1):   print dat 
    533500        respCode, errorTxt = self._deserializeResponse(dat) 
    534501        if respCode: 
    535502            raise GetError, errorTxt 
    536         else: 
    537             if debuglevel(1):   print "debug: server response ok" 
    538503         
    539504        # generate and send certificate request 
    540505        # - The client will generate a public/private key pair and send a  
    541506        #   NULL-terminated PKCS#10 certificate request to the server. 
    542         if debuglevel(1):   print "debug: send cert request" 
    543      
    544507        certReq, priKey = self._createCertReq(username) 
    545508        conn.send(certReq) 
     
    551514         
    552515        # - n certs 
    553         if debuglevel(1):   print "debug: receive certs" 
    554516        dat = conn.recv(8192) 
    555         if debuglevel(2): 
    556             print "debug: dumping cert data to myproxy.dump" 
    557             f = file('myproxy.dump','w') 
    558             f.write(dat) 
    559             f.close() 
    560517     
    561518        # process server response 
    562         if debuglevel(1):   print "debug: get server response" 
    563519        resp = conn.recv(8192) 
    564520        respCode, errorTxt = self._deserializeResponse(resp) 
    565521        if respCode: 
    566522            raise RetrieveError, errorTxt 
    567         else: 
    568             if debuglevel(1):   print "debug: server response ok" 
    569523     
    570524        # deserialize certs from received cert data 
     
    578532        # - private key 
    579533        # - rest of cert chain 
    580         if debuglevel(1):   print "debug: write proxy and certs to",outfile 
    581          
    582534        creds = pemCerts[0]+priKey+''.join([cert for cert in pemCerts[1:]]) 
    583535         
     
    668620    "The username with which the credential is stored on the MyProxy server") 
    669621 
    670     parser.add_option("-d",  
    671                       "--debug",  
    672                       dest="debug",  
    673                       type="int", 
    674                       default=0, 
    675                       help=\ 
    676 "Debug mode: 1=print debug info; 2=print as in (1), and dump data to myproxy.dump") 
    677  
    678622    (options, args) = parser.parse_args() 
    679623     
    680     debug = options.debug 
    681      
     624 
    682625    # process options     
    683626    username = options.username 
     
    717660             
    718661        except Exception,e: 
    719             if debuglevel(1): 
    720                 import traceback 
    721                 traceback.print_exc() 
    722             else: 
    723                 print "Error:", e 
     662            print "Error:", e 
     663            sys.exit(1) 
    724664                 
    725665    elif options.info: 
    726666        try: 
    727             myProxy.info(username,  
    728                          options.certFile, 
    729                          options.keyFile, 
    730                          ownerPassphrase=open('../tmp2').read().strip()) 
    731             
     667            credExists, errorTxt, fields = myProxy.info(username,  
     668                             options.certFile, 
     669                             options.keyFile, 
     670                             ownerPassphrase=open('../tmp2').read().strip()) 
     671            if credExists: 
     672                print "username: %s" % username 
     673                print "owner: %s" % fields['CRED_OWNER'] 
     674                print "  time left: %d" % \ 
     675                        (fields['CRED_END_TIME'] - fields['CRED_START_TIME']) 
     676            else: 
     677                ownerCert = X509.load_cert(options.certFile) 
     678                ownerCertDN = '/' + \ 
     679                    ownerCert.get_subject().as_text().replace(', ', '/') 
     680                print "no credentials found for user %s, owner \"%s\"" % \ 
     681                    (username, ownerCertDN) 
     682 
    732683        except Exception, e: 
    733             if debuglevel(1): 
    734                 import traceback 
    735                 traceback.print_exc() 
    736             else: 
    737                 import traceback 
    738                 traceback.print_exc() 
    739                 print "Error:", e 
     684            print "Error:", e 
     685            sys.exit(1) 
    740686                 
    741687    elif options.destroy: 
     
    747693            
    748694        except Exception, e: 
    749             if debuglevel(1): 
    750                 import traceback 
    751                 traceback.print_exc() 
    752             else: 
    753                 import traceback 
    754                 traceback.print_exc() 
    755                 print "Error:", e 
     695            print "Error:", e 
     696            sys.exit(1) 
    756697    else: 
    757698        try: 
     
    765706            
    766707        except Exception, e: 
    767             if debuglevel(1): 
    768                 import traceback 
    769                 traceback.print_exc() 
    770             else: 
    771                 import traceback 
    772                 traceback.print_exc() 
    773                 print "Error:", e 
     708            print "Error:", e 
     709            sys.exit(1) 
    774710 
    775711 
Note: See TracChangeset for help on using the changeset viewer.