Changeset 1852


Ignore:
Timestamp:
11/12/06 17:34:46 (13 years ago)
Author:
pjkersha
Message:

Added working info and destroy methods. TODO: info command returns True/False?
if credential exists but additional information can be parsed from the
response such as the owner of the credential and the remaining time before
the credential expires.

File:
1 edited

Legend:

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

    r1851 r1852  
    5353PASSPHRASE=%s 
    5454LIFETIME=%d\0""" 
    55      
     55 
     56    __infoCmd="""VERSION=MYPROXYv2 
     57COMMAND=2 
     58USERNAME=%s 
     59PASSPHRASE=PASSPHRASE 
     60LIFETIME=0""" 
     61  
     62    __destroyCmd="""VERSION=MYPROXYv2 
     63COMMAND=3 
     64USERNAME=%s 
     65PASSPHRASE=PASSPHRASE 
     66LIFETIME=0""" 
     67    
    5668    __storeCmd="""VERSION=MYPROXYv2 
    5769COMMAND=5 
     
    6072LIFETIME=%d\0""" 
    6173 
     74  
    6275    _certReqParamName = ('O', 'OU') 
    6376 
     
    172185         
    173186        return respCode, errorTxt 
    174       
     187     
    175188   
    176189    #_________________________________________________________________________              
     
    206219            
    207220        return pemCerts 
     221 
     222 
     223    #_________________________________________________________________________    
     224    def info(self, 
     225             username,  
     226             ownerCertFile=None, 
     227             ownerKeyFile=None, 
     228             ownerPassphrase=None): 
     229        """return True/False whether credentials exist on the server for a  
     230        given username 
     231         
     232        Exceptions:  GetError, StoreCredError 
     233         
     234        @param username: username selected for credential 
     235        @param ownerCertFile: certificate used for client authentication with 
     236        the MyProxy server SSL connection.  This ID will be set as the owner 
     237        of the stored credentials.  Only the owner can later remove  
     238        credentials with myproxy-destroy or the destroy method.  If not set, 
     239        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem  
     240        @param ownerKeyFile: corresponding private key file.  See explanation 
     241        for ownerCertFile 
     242        @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     243        private key is not password protected.   
     244        @return none 
     245        """ 
     246        globusLoc = os.environ.get('GLOBUS_LOCATION') 
     247        if not ownerCertFile or not ownerKeyFile: 
     248            if globusLoc: 
     249                ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
     250                ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     251            else: 
     252                raise MyProxyClientError, \ 
     253            "No client authentication cert. and private key file were given" 
     254         
     255        import pdb;pdb.set_trace() 
     256        context = Context(protocol='sslv3') 
     257        context.load_cert(ownerCertFile, 
     258                          keyfile=ownerKeyFile, 
     259                          callback=lambda *ar, **kw: ownerPassphrase) 
     260     
     261        # Disable for compatibility with myproxy server (er, globus) 
     262        # globus doesn't handle this case, apparently, and instead 
     263        # chokes in proxy delegation code 
     264        context.set_options(m2.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) 
     265         
     266        # connect to myproxy server 
     267        if debuglevel(1):   print "debug: connect to myproxy server" 
     268        conn = Connection(context, sock=socket.socket()) 
     269         
     270        # Fudge to avoid checking client cert - seems to pick globus  
     271        # host/<hostname> one 
     272        conn.clientPostConnectionCheck = None 
     273        conn.connect((self.hostname, self.port)) 
     274         
     275        # send globus compatibility stuff 
     276        if debuglevel(1):    
     277            print "debug: send globus compat byte" 
     278        conn.write('0') 
     279     
     280        # send destroy command 
     281        if debuglevel(1):   
     282            print "debug: send info command" 
     283             
     284        storeCmd = MyProxyClient.__infoCmd % (username) 
     285        conn.write(storeCmd) 
     286     
     287        # process server response 
     288        if debuglevel(1):    
     289            print "debug: get server response for info command request" 
     290             
     291        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) 
     303 
     304 
     305    #_________________________________________________________________________    
     306    def destroy(self, 
     307                username,  
     308                ownerCertFile=None, 
     309                ownerKeyFile=None, 
     310                ownerPassphrase=None): 
     311        """destroy credentials from the server for a given username 
     312         
     313        Exceptions:  GetError, StoreCredError 
     314         
     315        @param username: username selected for credential 
     316        @param ownerCertFile: certificate used for client authentication with 
     317        the MyProxy server SSL connection.  This ID will be set as the owner 
     318        of the stored credentials.  Only the owner can later remove  
     319        credentials with myproxy-destroy or the destroy method.  If not set, 
     320        this argument defaults to $GLOBUS_LOCATION/etc/hostcert.pem  
     321        @param ownerKeyFile: corresponding private key file.  See explanation 
     322        for ownerCertFile 
     323        @param ownerPassphrase: passphrase for ownerKeyFile.  Omit if the 
     324        private key is not password protected.   
     325        @return none 
     326        """ 
     327        globusLoc = os.environ.get('GLOBUS_LOCATION') 
     328        if not ownerCertFile or not ownerKeyFile: 
     329            if globusLoc: 
     330                ownerCertFile = os.path.join(globusLoc, 'etc', 'hostcert.pem') 
     331                ownerKeyFile = os.path.join(globusLoc, 'etc', 'hostkey.pem') 
     332            else: 
     333                raise MyProxyClientError, \ 
     334            "No client authentication cert. and private key file were given" 
     335         
     336        import pdb;pdb.set_trace() 
     337        context = Context(protocol='sslv3') 
     338        context.load_cert(ownerCertFile, 
     339                          keyfile=ownerKeyFile, 
     340                          callback=lambda *ar, **kw: ownerPassphrase) 
     341     
     342        # Disable for compatibility with myproxy server (er, globus) 
     343        # globus doesn't handle this case, apparently, and instead 
     344        # chokes in proxy delegation code 
     345        context.set_options(m2.SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS) 
     346         
     347        # connect to myproxy server 
     348        if debuglevel(1):   print "debug: connect to myproxy server" 
     349        conn = Connection(context, sock=socket.socket()) 
     350         
     351        # Fudge to avoid checking client cert - seems to pick globus  
     352        # host/<hostname> one 
     353        conn.clientPostConnectionCheck = None 
     354        conn.connect((self.hostname, self.port)) 
     355         
     356        # send globus compatibility stuff 
     357        if debuglevel(1):    
     358            print "debug: send globus compat byte" 
     359        conn.write('0') 
     360     
     361        # send destroy command 
     362        if debuglevel(1):   
     363            print "debug: send destroy command" 
     364             
     365        storeCmd = MyProxyClient.__destroyCmd % (username) 
     366        conn.write(storeCmd) 
     367     
     368        # process server response 
     369        if debuglevel(1):    
     370            print "debug: get server response for destroy command request" 
     371             
     372        dat = conn.recv(8192) 
     373        if debuglevel(1):    
     374            print dat 
     375             
     376        respCode, errorTxt = self._deserializeResponse(dat) 
     377        if respCode: 
     378            raise GetError, errorTxt 
     379        else: 
     380            if debuglevel(1):    
     381                print "debug: server response ok" 
    208382 
    209383 
     
    423597     
    424598    parser = optparse.OptionParser() 
     599    parser.add_option("-i",  
     600                      "--info",  
     601                      dest="info",  
     602                      default=False, 
     603                      action="store_true", 
     604                      help="check whether a credential exists") 
     605 
     606    parser.add_option("-z",  
     607                      "--destroy",  
     608                      dest="destroy",  
     609                      default=False, 
     610                      action="store_true", 
     611                      help="destroy credential") 
     612 
    425613    parser.add_option("-g",  
    426614                      "--get-delegation",  
     
    533721                traceback.print_exc() 
    534722            else: 
     723                print "Error:", e 
     724                 
     725    elif options.info: 
     726        try: 
     727            myProxy.info(username,  
     728                         options.certFile, 
     729                         options.keyFile, 
     730                         ownerPassphrase=open('../tmp2').read().strip()) 
     731            
     732        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 
     740                 
     741    elif options.destroy: 
     742        try: 
     743            myProxy.destroy(username,  
     744                            ownerCertFile=options.certFile, 
     745                            ownerKeyFile=options.keyFile, 
     746                            ownerPassphrase=open('../tmp2').read().strip()) 
     747            
     748        except Exception, e: 
     749            if debuglevel(1): 
     750                import traceback 
     751                traceback.print_exc() 
     752            else: 
     753                import traceback 
     754                traceback.print_exc() 
    535755                print "Error:", e 
    536756    else: 
Note: See TracChangeset for help on using the changeset viewer.