Changeset 2080


Ignore:
Timestamp:
31/01/07 10:15:32 (12 years ago)
Author:
pjkersha
Message:
  • Working unit test: Session Manager Client getAttCert call *

python/ndg.security.server/ndg/security/server/SessionMgr/server-config.tac:
ensure AttCert? response is explicitly converted to a string before dispatch. Previously
signature check was failing for client recipient.

python/ndg.security.common/ndg/security/common/CredWallet.py:

  • fixed - added metaclass declaration to include _MetaCredWallet. This contains some

useful class variables declared as properties.

rather every time a web service call is made via getAttCert, getAttCert and
getAATrustedHostInfo. Likewise, alternative aaPropFilePath property setting actually
instantiates a local Attribute Authority at the same time. Nb. calls can be made to
an AA web service (aaURI property) or AA running locally (pass the file path for its
properties file aaPropFilePath).

  • added epydoc headers to more methods.
Location:
TI12-security/trunk/python
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/CredWallet.py

    r2079 r2080  
    2727aaImportError = True 
    2828try: 
    29     from ndg.security.common.AttAuthority import AttAuthorityClient, \ 
    30         AttAuthorityClientError 
     29    # AttAuthority client package resides with CredWallet module in  
     30    # ndg.security.common 
     31    from AttAuthority import AttAuthorityClient, AttAuthorityClientError 
    3132    aaImportError = False 
    3233     
     
    159160    """Volatile store of user credentials associated with a user session""" 
    160161 
     162    __metaclass__ = _MetaCredWallet 
     163     
    161164    def __init__(self, 
    162165                 proxyCert, 
    163166                 proxyPriKey, 
    164167                 userCert, 
     168                 aaURI=None, 
     169                 aaPropFilePath=None, 
    165170                 caCertFilePath=None, 
    166171                 credRepos=None, 
     
    180185        @param userCert: X.509 cert for issuer of proxy 
    181186         
     187        @type aaURI: string 
     188        @keyword aaURI: URI of Attribute Authority to make requests to.   
     189        Setting this ALSO creates an AttAuthorityClient instance  
     190        self.__aaClnt.  - See aaURI property for details. 
     191         
     192        @type aaPropFilePath: string 
     193        @keyword aaPropFilePath: properties file path for an Attribute  
     194        Authority to make requests to.  Setting this ALSO creates an  
     195        AttAuthority instance self.__aa running locally.   - See aa property  
     196        for details.  aaURI takes precedence over this keyword i.e. if an 
     197        aaURI has been set, then calls are made to the AA web service at this 
     198        location rather to any self.__aa running locally. 
     199         
    182200        @type caCertFilePath: string 
    183201        @keyword caCertFilePath: Certificate Authority's certificate - used in 
     
    215233        self.__setUserCert(userCert) 
    216234         
     235        self.__setAAuri(aaURI) 
    217236        self.__setCAcertFilePath(caCertFilePath) 
    218237                 
     
    401420 
    402421    #_________________________________________________________________________ 
     422    def __setAAuri(self, aaURI): 
     423        """Set property method for Attribute Authority Web Service URI to 
     424        connect to.  This method ALSO SETS UP THE CLIENT INTERFACE 
     425         
     426        @type aaURI: string 
     427        @param aaURI: Attribute Authority Web Service URI.  Set to None to 
     428        initialise.  Set to a URI to instantiate a new AA client""" 
     429        if aaURI is None: 
     430            self.__aaClnt = None 
     431            return 
     432         
     433        self.__aaClnt = AttAuthorityClient(uri=aaURI,  
     434                                           signingCert=self.__proxyCert, 
     435                                           signingPriKey=self.__proxyPriKey) 
     436             
     437    aaURI = property(fset=__setAAuri, 
     438             doc="AA URI - setting also sets up AttAuthorityClient instance!") 
     439 
     440 
     441    #_________________________________________________________________________ 
     442    def __getAAclnt(self): 
     443        """Get property method for Attribute Authority Web Service client 
     444        instance.  Use aaURI propert to set up aaClnt 
     445         
     446        @type aaClnt: AttAuthorityClient 
     447        @param aaClnt: Attribute Authority Web Service client instance""" 
     448        return self.__aaClnt 
     449             
     450    aaClnt = property(fget=__getAAclnt, doc="AA web service client instance") 
     451 
     452 
     453    #_________________________________________________________________________ 
     454    def __setAApropFilePath(self, aaPropFilePath): 
     455        """Set property method for the properties file of a local 
     456        Attribute Authority.  This method ALSO SETS UP THE LOCAL Attribute  
     457        Authority object to retrieve ACs from.  the property aaURI takes 
     458        precedence: if an aaURI is set then it assumed that an Attribute 
     459        Authority will be connected to via a web service call 
     460         
     461        @type aaPropFilePath: string 
     462        @param aaPropFilePath: Attribute Authority properties file.  Setting  
     463        this instantiates a new AA locally""" 
     464        if aaPropFilePath is None: 
     465            self.__aa = None 
     466            return 
     467 
     468        # Make a new attribute authority instance  
     469        self.__aa = AttAuthority(propFilePath=aaPropFilePath) 
     470 
     471    aaPropFilePath = property(fset=__setAApropFilePath, 
     472    doc="AA properties file path - setting this also sets up an AA locally!") 
     473 
     474 
     475    #_________________________________________________________________________ 
     476    def __getAA(self): 
     477        """Get property method for Attribute Authority Web Service client 
     478        instance.  Use aaURI propert to set up aaClnt 
     479         
     480        @type aaClnt: AttAuthorityClient 
     481        @param aaClnt: Attribute Authority Web Service client instance""" 
     482        return self.__aaClnt 
     483             
     484    aa = property(fget=__getAA, doc="Attribute Authority instance") 
     485 
     486 
     487    #_________________________________________________________________________ 
    403488    def isValid(self, **x509CertKeys): 
    404         """Check wallet's proxy cert.  If expired return False""" 
     489        """Check wallet's proxy cert.  If expired return False 
     490         
     491        @type **x509CertKeys: dict 
     492        @param **x509CertKeys: keywords applying to  
     493        ndg.security.common.X509.X509Cert.isValid method""" 
    405494        try: 
    406495            return self.__proxyCert.isValidTime(**x509CertKeys) 
    407496 
    408497        except Exception, e: 
    409             raise CredWalletError("Credential Wallet: %s" % e) 
     498            raise CredWalletError, "Credential Wallet: %s" % e 
    410499 
    411500     
     
    413502    def addCredential(self, attCert, bUpdateCredRepos=True): 
    414503        """Add a new attribute certificate to the list of credentials held. 
    415         Return True if certificate was added otherwise False.  - If an 
     504 
     505        @type attCert: 
     506        @param attCert: new attribute Certificate to be added 
     507        @type bUpdateCredRepos: bool 
     508        @keyword bUpdateCredRepos: if set to True, and a repository exists it  
     509        will be updated with the new credentials also 
     510         
     511        @rtype: bool 
     512        @return: True if certificate was added otherwise False.  - If an 
    416513        existing certificate from the same issuer has a later expiry it will 
    417         take precence and the new input certificate is ignored. 
    418  
    419         attCert:            new attribute Certificate to be added 
    420         bUpdateCredRepos:   if set to True, and a repository exisits it will 
    421                             be updated with the new credentials also""" 
     514        take precence and the new input certificate is ignored.""" 
    422515 
    423516        # Check input 
    424         try: 
    425             if not isinstance(attCert, AttCert): 
    426                 raise CredWalletError(\ 
    427                     "Attribute Certificate must be an AttCert type object") 
    428                      
    429         except Exception, e: 
    430             raise CredWalletError, "Attribute Certificate input: %s" % e 
    431  
     517        if not isinstance(attCert, AttCert): 
     518            raise CredWalletError,\ 
     519                "Attribute Certificate must be an AttCert type object" 
    432520 
    433521        # Check certificate validity 
     
    436524             
    437525        except AttCertError, e: 
    438             raise CredWalletError("Adding Credential: %s" % e) 
     526            raise CredWalletError, "Adding Credential: %s" % e 
    439527         
    440528 
     
    496584    def updateCredRepos(self, auditCred=True): 
    497585        """Copy over non-persistent credentials held by wallet into the 
    498         perminent repository.""" 
     586        perminent repository. 
     587         
     588        @type auditCred: bool 
     589        @keyword auditCred: filter existing credentials in the repository 
     590        removing invalid ones""" 
    499591 
    500592        if not self.__credRepos: 
    501             raise CredWalletError( 
    502                   "No Credential Repository has been created for this wallet") 
     593            raise CredWalletError, \ 
     594                  "No Credential Repository has been created for this wallet" 
    503595                             
    504596        # Filter out invalid certs unless auditCred flag is explicitly set to 
     
    512604        self.__credRepos.addCredentials(self.__dn, attCertList) 
    513605 
     606 
    514607    #_________________________________________________________________________                     
    515     def __getAttCert(self, 
    516                      aaPropFilePath=None, 
    517                      aaURI=None, 
    518                      extAttCert=None, 
    519                      bDebug=False): 
     608    def __getAttCert(self, extAttCert=None): 
    520609         
    521610        """Wrapper to Attribute Authority attribute certificate request.  See 
     
    528617        and added into the wallet 
    529618 
    530         @type aaURI: string 
    531         @keyword aaURI: to call as a web service, specify the URI for the  
    532         Attribute Authority. 
    533          
    534         @type aaPropFilePath: string 
    535         @keyword aaPropFilePath: Altenrative to aaURI - to run on the local  
    536         machine, specify the local Attribute Authority configuration file. 
    537  
    538         :              
    539                                  
    540619        @type extAttCert: ndg.security.common.AttCert.AttCert 
    541620        @keyword extAttCert: an existing Attribute Certificate which can  
     
    543622        Attribute Authority""" 
    544623             
    545         if aaURI is not None: 
    546             try: 
    547                 aaClnt = AttAuthorityClient(uri=aaURI, 
    548                                             signingCert=self.__proxyCert, 
    549                                             signingPriKey=self.__proxyPriKey) 
    550             except Exception, e: 
    551                 raise CredWalletError, "Attribute certificate request: %s" % e 
    552                
     624        if self.__aaClnt is not None: 
    553625            try:                           
    554                 attCert = aaClnt.getAttCert(self.__userCert.toString(),  
    555                                               userAttCert=extAttCert)                 
     626                attCert = self.__aaClnt.getAttCert(self.__userCert.toString(),  
     627                                                   userAttCert=extAttCert)                 
    556628            except Exception, e: 
    557629                raise CredWalletAuthorisationDenied, str(e) 
     
    565637                raise CredWalletError, "Attribute Authority Configuration " +\ 
    566638                                      "file path must be a valid string" 
    567                                      
    568             try: 
    569                 # Make a new attribute authority instance  
    570                 aa = AttAuthority(propFilePath=aaPropFilePath) 
    571                  
    572             except Exception, e: 
    573                 raise CredWalletError, "Attribute certificate request: %s" % e 
    574639 
    575640            try: 
    576641                # Request a new attribute certificate from the Attribute 
    577642                # Authority 
    578                 attCert = aa.getAttCert(userCert=self.__proxyCert, 
    579                                         userAttCert=extAttCert) 
     643                attCert = self.__aa.getAttCert(userCert=self.__proxyCert, 
     644                                               userAttCert=extAttCert) 
    580645                 
    581646            except AttAuthorityAccessDenied, e: 
     
    609674 
    610675    #_________________________________________________________________________ 
    611     def getAATrustedHostInfo(self, 
     676    def getAATrustedHostInfo(self,  
    612677                             userRole=None, 
    613                              aaURI=None, 
    614678                             aaPropFilePath=None, 
    615                              bDebug=False): 
     679                             aaURI=None): 
    616680        """Wrapper to Attribute Authority getTrustedHostInfo 
    617681         
    618         userRole:               get hosts which have a mapping to this role 
    619         aaURI|aaPropFilePath:  to call as a web service, specify the file 
    620                                 path or URI for the Attribute Authority's 
    621                                 WSDL.  Otherwise, to run on the local machine, 
    622                                 specify a local Attribute Authority 
    623                                 configuration file.""" 
    624          
    625         if aaURI is not None: 
     682        getAATrustedHostInfo([userRole=r, ][aaPropFilePath=f|aaURI=u]) 
     683                    
     684        @type userRole: string 
     685        @keyword userRole: get hosts which have a mapping to this role 
     686         
     687        @type aaURI: string 
     688        @keyword aaURI: to call as a web service, specify the URI for the  
     689        Attribute Authority. 
     690         
     691        @type aaPropFilePath: string 
     692        @keyword aaPropFilePath: Altenrative to aaURI - to run on the local  
     693        machine, specify the local Attribute Authority configuration file. 
     694        """ 
     695         
     696        if aaURI: 
     697            self.__setAAuri(aaURI) 
     698        elif aaPropFilePath: 
     699            self.__setAAPropFilePath  
     700 
     701             
     702        if self.__aaClnt is not None: 
    626703            # Call Attribute Authority WS 
    627704            try: 
    628                 aaClnt = AttAuthorityClient(uri=aaURI, 
    629                                         signingCert=self.__proxyCertFilePath, 
    630                                         signingPriKey=self.__clntPriKey) 
    631                                      
    632                 trustedHostInfo = aaClnt.getTrustedHostInfo(role=userRole)                 
    633                 return trustedHostInfo 
     705                return self.__aaClnt.getTrustedHostInfo(role=userRole)                 
    634706                            
    635707            except Exception, e: 
     
    637709                            "Requesting trusted host information: %s" % str(e)                 
    638710 
    639         elif aaPropFilePath is not None: 
     711        elif self.__aa is not None: 
    640712 
    641713            # Call local based Attribute Authority with settings from the  
    642714            # configuration file aaPropFilePath 
    643             if not instance(aaURI, basestring): 
    644                 raise CredWalletError, "Attribute Authority Configuration " +\ 
    645                                       "file path must be a valid string" 
    646                                      
    647715            try: 
    648                 # Make a new attribute authority instance  
    649                 aa = AttAuthority(aaPropFilePath) 
    650  
    651716                # Request a new attribute certificate from the Attribute 
    652717                # Authority 
    653                 return aa.getTrustedHostInfo(role=userRole) 
     718                return self.__aa.getTrustedHostInfo(role=userRole) 
    654719                 
    655720            except Exception, e: 
     
    768833        replace it.""" 
    769834 
    770  
     835        if aaURI: 
     836            self.__setAAuri(aaURI) 
     837        elif aaPropFilePath: 
     838            self.__setAAPropFilePath  
     839            
    771840        if not refreshAttCert and self.__credentials: 
    772841            # Refresh flag is not set so it's OK to check for any existing 
     
    776845            # Find out the site ID for the target AA by calling AA's host 
    777846            # info WS method 
    778             aaClnt = AttAuthorityClient(uri=aaURI,  
    779                                         signingCert=self.__proxyCert, 
    780                                         signingPriKey=self.__proxyPriKey) 
    781              
    782             hostInfo = aaClnt.getHostInfo() 
    783             aaName = hostInfo.keys()[0] 
     847            try: 
     848                hostInfo = self.__aaClnt.getHostInfo() 
     849                aaName = hostInfo.keys()[0] 
     850            except Exception, e: 
     851                raise CredWalletError, "Getting host info: %s" % e 
    784852             
    785853            # Look in the wallet for an AC with the same issuer name 
     
    861929            # Request Authorisation from Attribute Authority 
    862930            try: 
    863                 attCert = self.__getAttCert(aaURI=aaURI, 
    864                                             aaPropFilePath=aaPropFilePath, 
    865                                             extAttCert=extAttCert)                 
     931                attCert = self.__getAttCert(extAttCert=extAttCert)                 
    866932                # Access granted 
    867933                return attCert 
     
    897963                try: 
    898964                    trustedHostInfo = self.getAATrustedHostInfo(reqRole, 
    899                                             aaURI=aaURI, 
    900965                                            aaPropFilePath=aaPropFilePath) 
    901966                except Exception, e: 
     
    9771042                raise authorisationError 
    9781043             
    979  
    980     #_________________________________________________________________________ 
    981     def __retrieveURI(self, uri): 
    982         """Retrieve content from a URI - use to get public key from a  
    983         remote Attribute Authority 
    984          
    985         Nb. If tempFile goes out of scope the temporary file containing the  
    986         URI content will be deleted also""" 
    987          
    988         try: 
    989             tempFile = tempfile.NamedTemporaryFile() 
    990             (fileName, httpResp) = urllib.urlretrieve(uri, tempFile.name) 
    991         except Exception, e: 
    992             raise CredWalletError, "Error retrieving from URI " + \ 
    993                                   "\"%s\": %s" % (uri, str(e)) 
    994      
    995         # Expecting plain text format for returned public key file 
    996         # 404 error would come back as 'text/html' 
    997         if 'text/plain' not in httpResp['Content-type']: 
    998             raise CredWalletError, "Error retrieving from URI " + \ 
    999                                    "\"%s\": expecting \"plain/text\"" % uri 
    1000              
    1001         return tempFile 
    1002   
     1044              
    10031045         
    10041046#_____________________________________________________________________________ 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/SessionMgr/server-config.tac

    r2079 r2080  
    8585 
    8686 
    87         response.AttCert, response.StatusCode, response.Msg, \ 
    88                 response.ExtAttCert = result 
     87        response.AttCert = result[0].toString()  
     88        response.StatusCode, response.Msg, response.ExtAttCert = result[1:] 
    8989         
    9090        return request, response 
Note: See TracChangeset for help on using the changeset viewer.