Changeset 2178 for TI12-security


Ignore:
Timestamp:
16/02/07 15:51:32 (13 years ago)
Author:
pjkersha
Message:

* Change to AttCert? format and AA WS interface and AttAuthority? class for DEWS *

  • New userId element in Attribute Certificates + getAttCert call to an AA can specify a

user ID to be set in the returned AC.

python/ndg.security.server/ndg/security/server/AttAuthority/server-config.tac,
python/ndg.security.server/ndg/security/server/AttAuthority/AttAuthority_services_server.py,
python/ndg.security.common/ndg/security/common/AttAuthority/AttAuthority_services.py,
python/ndg.security.common/ndg/security/common/AttAuthority/AttAuthority_services_types.py,
python/www/html/attAuthority.wsdl:
added userId to WSDL interface.

python/ndg.security.server/ndg/security/server/AttAuthority/init.py:

  • added userId to getAttCert method.
  • changed refs to proxyCert to holderCert because cert meay not be a proxy
  • changed call to AttCert?.getRoles to AttCert?.roles
  • changed refs to userDN to userId

python/ndg.security.common/ndg/security/common/XMLSec.py: "ns1" is not needed for
reference C14N unsuppressed prefixes.

python/ndg.security.common/ndg/security/common/X509.py: made 'serialize' and 'deserialize'
aliases to serialise and deserialise methods respectively.

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

  • made AttCert? namespace a configurable class variable
  • changed all get/set attribute methods to private methods used by new-style class

properties.

  • updated setitem to use appropriate set* methods.
  • fix to setIssuerSerialNumber ref to 'issuerSerialNumber' instead of 'serialNumber'

python/ndg.security.common/ndg/security/common/AttAuthority/init.py: AA WS client -
added userId as keyword to getAttCert.

python/ndg.security.common/ndg/security/common/CredWallet.py: replace AttCert?.getRoles()
calls with AttCert?.roles property

python/ndg.security.test/ndg/security/test/AttAuthority/siteAUserRoles.py,
python/ndg.security.test/ndg/security/test/AttAuthority/siteBUserRoles.py:
swap refs to userDN with userId.

python/ndg.security.test/ndg/security/test/AttAuthority/AttAuthorityClientTest.py:
added new test for where an explicit userId is set.

python/ndg.security.test/ndg/security/test/AttAuthority/attAuthorityClientTest.cfg:
added userId parameter.

python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py: added tests for
property get calls.

python/ndg.security.test/ndg/security/test/MyProxy/Makefile: include call to MyProxy?
test to get proxy cert and private key.

Location:
TI12-security/trunk/python
Files:
19 edited

Legend:

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

    r2107 r2178  
    2929        # no ws-addressing 
    3030 
    31     # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cf460c> 
    32     def getAttCert(self, userCert,userAttCert): 
     31    # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cf48ac> 
     32    def getAttCert(self, userId,userCert,userAttCert): 
    3333 
    3434        request = getAttCertInputMsg() 
     35        request._userId = userId 
    3536        request._userCert = userCert 
    3637        request._userAttCert = userAttCert 
     
    4546        return attCert,msg 
    4647 
    47     # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cf492c> 
     48    # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cf4bcc> 
    4849    def getHostInfo(self): 
    4950 
     
    6061        return hostname,aaURI,loginURI 
    6162 
    62     # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cfb2ac> 
     63    # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cfb56c> 
    6364    def getTrustedHostInfo(self, role): 
    6465 
     
    7475        return trustedHosts 
    7576 
    76     # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cfb42c> 
     77    # op: <ZSI.wstools.WSDLTools.Message instance at 0xb6cfb6ec> 
    7778    def getX509Cert(self): 
    7879 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/AttAuthority/AttAuthority_services_types.py

    r2085 r2178  
    4646        def __init__(self, **kw): 
    4747            ns = ns0.getAttCert_Dec.schema 
    48             TClist = [ZSI.TC.String(pname="userCert", aname="_userCert", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="userAttCert", aname="_userAttCert", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded"))] 
     48            TClist = [ZSI.TC.String(pname="userId", aname="_userId", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="userCert", aname="_userCert", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="userAttCert", aname="_userAttCert", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded"))] 
    4949            kw["pname"] = ("urn:ndg:security:attAuthority","getAttCert") 
    5050            kw["aname"] = "_getAttCert" 
     
    5656                def __init__(self): 
    5757                    # pyclass 
     58                    self._userId = None 
    5859                    self._userCert = None 
    5960                    self._userAttCert = None 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/AttAuthority/__init__.py

    r2136 r2178  
    276276 
    277277    #_________________________________________________________________________ 
    278     def getAttCert(self, userCert=None, userAttCert=None): 
     278    def getAttCert(self, userId=None, userCert=None, userAttCert=None): 
    279279        """Request attribute certificate from NDG Attribute Authority Web  
    280280        Service. 
     281         
     282        @type userId: string 
     283        @keyword userId: DN of the X.509 certificate used in SOAP digital  
     284        signature corresponds to the *holder* of the Attribute Certificate 
     285        that is issued.  Set this additional field to specify an alternate 
     286        user ID to associate with the AC.  This is useful in the case where, 
     287        as in the DEWS project, the holder will be a server cert. rather than 
     288        a user proxy cert. 
     289         
     290        If this keword is omitted, userId in the AC will default to the same 
     291        value as the holder DN. 
    281292         
    282293        @type userCert: string 
     
    302313             
    303314        try:  
    304             sAttCert, msg = self.__srv.getAttCert(userCert, userAttCert)   
     315            sAttCert, msg = self.__srv.getAttCert(userId,userCert,userAttCert)   
    305316             
    306317        except Exception, e: 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/AttCert.py

    r2175 r2178  
    8080#_____________________________________________________________________________ 
    8181class AttCert(dict, XMLSecDoc): 
    82     """NDG Attribute Certificate (Authorisation or Access Token).""" 
     82    """NDG Attribute Certificate (Authorisation or Access Token). 
     83     
     84    @type __validProvenanceSettings: tuple 
     85    @cvar: string constants for allowable certificate provenance settings 
     86     
     87    @type namespace: string 
     88    @cvar namespace: namespace for Attribute Certificate""" 
    8389     
    8490    __metaclass__ = _MetaAttCert 
     
    8793    # certificate 
    8894    __validProvenanceSettings = ('original', 'mapped') 
    89  
     95    namespace = "urn:ndg.security" 
    9096 
    9197    #_________________________________________________________________________     
     
    126132        self.__holderDN = None 
    127133 
    128         self.setProvenance(provenance) 
     134        self.__setProvenance(provenance) 
    129135         
    130136        # Certificate life time interval in seconds 
     
    210216    #_________________________________________________________________________     
    211217    def __setitem__(self, key, item):         
    212         """Set an item from the __dat, __dat['validity'] or  
    213         __dat['attributes'] dictionaries.  This class behaves as data  
     218        """Set an item from the __dat dictionary.  This class behaves as data  
    214219        dictionary of Attribute Certificate properties 
    215220 
     221        @type key: string 
    216222        @param key: name of key - key can be specified belonging to validity 
    217223        or the attributes sub dictionaries 
     224         
     225        @type item: string / int 
    218226        @param item: value to set dictionary item to 
    219227        """ 
     
    223231 
    224232            # key recognised - check if setting provenance 
    225             if key is "provenance": 
    226                 self.setProvenance(item) 
     233            if key == "provenance": 
     234                self.__setProvenance(item) 
    227235                 
     236            elif key == "version": 
     237                self.__setVersion(item) 
     238                  
     239            elif key == "holder": 
     240                self.__setHolder(item) 
     241                 
     242            elif key == "issuer": 
     243                self.__setIssuer(item) 
     244             
     245            elif key == "issuerName": 
     246                self.__setIssuerName(item) 
     247             
     248            elif key == "issuerSerialNumber": 
     249                self.__setIssuerSerialNumber(item) 
     250          
     251            elif key == "userId": 
     252                self.__setUserId(item) 
     253                    
    228254            elif key == "validity": 
    229255                raise KeyError, "'%s': use setValidityTime method " % \ 
     
    234260                    key + "set list of role attributes"             
    235261            else:     
    236                 self.__dat[key] = item 
     262                raise KeyError, "Key '%s' not recognised for %s'" % \ 
     263                               (key, self.__class__.__name__) 
    237264 
    238265        elif key in self.__dat['attributes'] or \ 
     
    374401         
    375402    #_________________________________________________________________________     
     403    def __setIssuerName(self, issuerName): 
     404        """Set the name of the issuer""" 
     405        if not isinstance(issuerName, basestring): 
     406            raise AttributeError, "issuerName must be a string" 
     407         
     408        self.__dat['issuerName'] = issuerName 
     409     
     410    #_________________________________________________________________________     
     411    def __getIssuerName(self): 
     412        """@return the name of the issuer""" 
     413        return self.__dat['issuerName'] 
     414 
     415    issuerName = property(fget=__getIssuerName,  
     416                          fset=__setIssuerName, 
     417                          doc="Certificate Issuer name") 
     418    
     419    #_________________________________________________________________________     
     420    def __setIssuerSerialNumber(self, serialNumber): 
     421        """@param serialNumber: the issuer serial number""" 
     422        if not isinstance(serialNumber, int): 
     423            raise AttributeError, "issuerSerialNumber must be an integer" 
     424 
     425        self.__dat['issuerSerialNumber'] = serialNumber 
     426     
     427    #_________________________________________________________________________     
     428    def __getIssuerSerialNumber(self): 
     429        """@return the issuer serial number""" 
     430        return self.__dat['issuerSerialNumber'] 
     431     
     432    issuerSerialNumber = property(fget=__getIssuerSerialNumber,  
     433                                  fset=__setIssuerSerialNumber, 
     434                                  doc="Certificate Issuer Serial Number") 
     435  
     436         
     437    #_________________________________________________________________________     
    376438    def __setUserId(self, userId): 
    377439        """Set the name of the userId 
     
    381443            raise AttributeError, "userId must be a string" 
    382444         
    383         self.__dat['userId'] = issuerName 
     445        self.__dat['userId'] = userId 
    384446     
    385447    #_________________________________________________________________________     
     
    391453    userId = property(fget=__getUserId,  
    392454                      fset=__setUserId, 
    393                       doc="Certificate Issuer DN") 
    394          
    395     #_________________________________________________________________________     
    396     def __setIssuerName(self, issuerName): 
    397         """Set the name of the issuer""" 
    398         if not isinstance(issuerName, basestring): 
    399             raise AttributeError, "issuerName must be a string" 
    400          
    401         self.__dat['issuerName'] = issuerName 
    402      
    403     #_________________________________________________________________________     
    404     def __getIssuerName(self): 
    405         """@return the name of the issuer""" 
    406         return self.__dat['issuerName'] 
    407  
    408     issuerName = property(fget=__getIssuerName,  
    409                           fset=__setIssuerName, 
    410                           doc="Certificate Issuer name") 
    411     
    412     #_________________________________________________________________________     
    413     def __setIssuerSerialNumber(self, serialNumber): 
    414         """@param serialNumber: the issuer serial number""" 
    415         if not isinstance(issuerSerialNumber, int): 
    416             raise AttributeError, "issuerSerialNumber must be an integer" 
    417  
    418         self.__dat['issuerSerialNumber'] = serialNumber 
    419      
    420     #_________________________________________________________________________     
    421     def __getIssuerSerialNumber(self): 
    422         """@return the issuer serial number""" 
    423         return self.__dat['issuerSerialNumber'] 
    424      
    425     issuerSerialNumber = property(fget=__getIssuerSerialNumber,  
    426                                   fset=__setIssuerSerialNumber, 
    427                                   doc="Certificate Issuer Serial Number") 
    428  
     455                      doc="Certificate user identifier") 
     456     
    429457 
    430458    # Nb. no setValidityNotBefore/setValidityNotAfter methods - use 
     
    444472            return self.__dat['validity']['notBefore'] 
    445473 
     474    validityNotBefore = property(fget=getValidityNotBefore,  
     475                                  doc="Validity not before time as a string") 
     476 
    446477 
    447478    #_________________________________________________________________________     
     
    458489            return self.__dat['validity']['notAfter'] 
    459490 
    460      
    461     #_________________________________________________________________________     
    462     def getRoleSet(self): 
    463         """@return the roleSet as a list of role dictionaries.""" 
     491    validityNotAfter = property(fget=getValidityNotAfter,  
     492                                doc="Validity not after time as a string") 
     493 
     494     
     495    #_________________________________________________________________________     
     496    def __getRoleSet(self): 
     497        """@rtype: list of dict type 
     498        @return the roleSet as a list of role dictionaries.""" 
    464499        return self.__dat['attributes']['roleSet'] 
    465500 
    466  
    467     #_________________________________________________________________________     
    468     def getRoles(self): 
     501    roleSet = property(fget=__getRoleSet,  
     502                       doc="Role set dictionary") 
     503 
     504    #_________________________________________________________________________     
     505    def __getRoles(self): 
    469506        """Return roles as a list 
    470507         
     
    476513        except: 
    477514            return [] 
    478  
    479          
    480     #_________________________________________________________________________     
    481     def setProvenance(self, provenance): 
     515         
     516    roles = property(fget=__getRoles,  
     517                     doc="List of roles in Attribute Certificate") 
     518 
     519         
     520    #_________________________________________________________________________     
     521    def __setProvenance(self, provenance): 
    482522        """Set the provenance for the certificate: 'original' or 'mapped'. 
    483523         
     
    492532     
    493533    #_________________________________________________________________________     
    494     def getProvenance(self): 
     534    def __getProvenance(self): 
    495535        """Get the provenance for the certificate. 
    496536         
    497537        @return provenance of certificate mapped or original""" 
    498538        return self.__dat['provenance'] 
    499      
     539 
     540    provenance = property(fget=__getProvenance, 
     541                          fset=__setProvenance,  
     542                          doc="Provenance of the cert. - original or mapped") 
     543    
    500544 
    501545    #_________________________________________________________________________     
     
    715759         
    716760        # Create string of all XML content         
    717         xmlTxt = """<attributeCertificate targetNamespace="urn:ndg:security"> 
     761        xmlTxt = '<attributeCertificate targetNamespace="%s">' % \ 
     762                                                self.__class__.namespace + \ 
     763""" 
    718764    <acInfo> 
    719765        <version>""" + self.__dat['version'] + """</version> 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/CredWallet.py

    r2165 r2178  
    994994                     
    995995                    if hostName in trustedHostInfo and attCert.isOriginal():                         
    996                         for role in attCert.getRoles(): 
     996                        for role in attCert.roles: 
    997997                            if role in trustedHostInfo[hostName]['role']:                                 
    998998                                extAttCertList.append(attCert) 
     
    10131013                            # Check the certificate contains at least one of 
    10141014                            # the required roles 
    1015                             roles = extAttCert.getRoles() 
    1016                             if [True for r in roles if r in info['role']]: 
     1015                            if [True for r in extAttCert.roles \ 
     1016                                if r in info['role']]: 
    10171017                               extAttCertList.append(extAttCert) 
    10181018 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/Gatekeeper/Gatekeeper.py

    r2058 r2178  
    177177            try: 
    178178                input.isValid(raiseExcep=True,  
    179                             certFilePathList=self.__prop['caCertFilePath'])                             
     179                              certFilePathList=self.__prop['caCertFilePath']) 
    180180            except Exception, e: 
    181181                raise GatekeeperError, "Access denied for input: %s" % str(e) 
    182182             
    183             return input.getRoles() 
     183            return input.roles 
    184184        else: 
    185185            raise GatekeeperError("Input must be a role, role list or " + \ 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/X509.py

    r2072 r2178  
    574574        return sDN 
    575575 
    576  
     576    serialize = serialise 
     577     
    577578    def deserialise(self, dn, separator=None): 
    578579 
     
    623624                              (dn, str(excep))) 
    624625 
    625  
     626    deserialize = deserialise 
     627     
    626628    def parseSeparator(self, dn): 
    627629 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/XMLSec.py

    r2136 r2178  
    349349                        xmlTxt=None, 
    350350                        inclX509Cert=True, 
    351                         refC14nKw={'unsuppressedPrefixes': ['xmlns', 'ns1']}, 
     351                        refC14nKw={'unsuppressedPrefixes': ['xmlns']}, 
    352352                        signedInfoC14nKw={'unsuppressedPrefixes': ['ds']}): 
    353353         
     
    386386 
    387387        parentNode.setAttributeNS(XMLNS.BASE, 'xmlns:%s' % 'ds', DSIG.BASE) 
    388         parentNode.setAttributeNS(XMLNS.BASE, 'xmlns:%s'%'ec', DSIG.C14N_EXCL) 
    389          
    390         # Serialize and re-parse prior to reference generation - calculating 
    391         # canonicalization based on soapWriter.dom.node seems to give an 
    392         # error: the order of wsu:Id attribute is not correct 
    393         #docNode = Reader().fromString(str(soapWriter)) 
     388        parentNode.setAttributeNS(XMLNS.BASE,'xmlns:%s' % 'ec',DSIG.C14N_EXCL) 
    394389         
    395390        # Namespaces for XPath searches 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/AttAuthority/AttAuthority_services_server.py

    r2107 r2178  
    2929        <xsd:complexType> 
    3030          <xsd:sequence> 
     31            <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"userId\" type=\"xsd:string\"/> 
    3132            <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"userCert\" type=\"xsd:string\"/> 
    3233            <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"userAttCert\" type=\"xsd:string\"/> 
     
    211212    def soap_getAttCert(self, ps): 
    212213        self.request = ps.Parse(getAttCertInputMsg.typecode) 
    213         parameters = (self.request._userCert, self.request._userAttCert) 
    214  
    215         # If we have an implementation object use it 
    216         if hasattr(self,'impl'): 
    217             parameters = self.impl.getAttCert(parameters[0],parameters[1]) 
     214        parameters = (self.request._userId, self.request._userCert, self.request._userAttCert) 
     215 
     216        # If we have an implementation object use it 
     217        if hasattr(self,'impl'): 
     218            parameters = self.impl.getAttCert(parameters[0],parameters[1],parameters[2]) 
    218219 
    219220        result = getAttCertOutputMsg() 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/AttAuthority/__init__.py

    r2136 r2178  
    297297    #_________________________________________________________________________ 
    298298    def getAttCert(self, 
    299                    proxyCert=None, 
    300                    proxyCertFilePath=None, 
     299                   userId=None, 
     300                   holderCert=None, 
     301                   holderCertFilePath=None, 
    301302                   userAttCert=None, 
    302303                   userAttCertFilePath=None): 
     
    304305        """Request a new Attribute Certificate for use in authorisation 
    305306 
    306         getAttCert([proxyCert=px|proxyCertFilePath=pxFile, ] 
     307        getAttCert([userId=uid][holderCert=px|holderCertFilePath=pxFile, ] 
    307308                   [userAttCert=cert|userAttCertFilePath=certFile]) 
    308                     
    309         @type proxyCert: string / ndg.security.common.X509.X509Cert type 
    310         @keyword proxyCert: base64 encoded string containing user proxy cert./ 
    311         X.509 cert object 
    312          
    313         @keyword proxyCertFilePath: string 
    314         @param proxyCertFilePath: file path to proxy certificate. 
     309          
     310        @type userId: string 
     311        @keyword userId: identifier for the user who is entitled to the roles 
     312        in the certificate that is issued.  If this keyword is omitted, then 
     313        the userId will be set to the DN of the holder. 
     314         
     315        holder = the holder of the certificate - an inidividual user or an 
     316        organisation to which the user belongs who vouches for that user's ID 
     317         
     318        userId = the identifier for the user who is entitled to the roles 
     319        specified in the Attribute Certificate that is issued. 
     320                   
     321        @type holderCert: string / ndg.security.common.X509.X509Cert type 
     322        @keyword holderCert: base64 encoded string containing proxy cert./ 
     323        X.509 cert object corresponding to the ID who will be the HOLDER of 
     324        the Attribute Certificate that will be issued.  - Normally, using 
     325        proxy certificates, the holder and user ID are the same but there 
     326        may be cases where the holder will be an organisation ID.  This is the 
     327        case for NDG security with the DEWS project 
     328         
     329        @keyword holderCertFilePath: string 
     330        @param holderCertFilePath: file path to proxy/X.509 certificate of  
     331        candidate holder 
    315332       
    316333        @type userAttCert: string or AttCert type 
     
    327344 
    328345 
    329         # Read proxy certificate 
     346        # Read X.509 certificate 
    330347        try:             
    331             if proxyCertFilePath is not None: 
     348            if holderCertFilePath is not None: 
    332349                                     
    333350                # Proxy Certificate input as a file  
    334                 userProxyCert = X509Cert() 
    335                 userProxyCert.read(proxyCertFilePath) 
    336                  
    337             elif isinstance(proxyCert, basestring): 
     351                holderCert = X509Cert() 
     352                holderCert.read(holderCertFilePath) 
     353                 
     354            elif isinstance(holderCert, basestring): 
    338355 
    339356                # Proxy Certificate input as string text 
    340                 userProxyCert = X509Cert() 
    341                 userProxyCert.parse(proxyCert) 
    342                  
    343             elif isinstance(proxyCert, X509Cert): 
    344                  
    345                 # Proxy is an NDG X509Cert type 
    346                 userProxyCert = proxyCert 
    347                  
    348             else: 
     357                holderCert = X509CertParse(holderCert) 
     358                 
     359            elif not isinstance(holderCert, X509Cert): 
    349360                raise AttAuthorityError, \ 
    350                 "No input proxy certificate file path or cert text/object set" 
     361                "No input X.509 certificate file path or cert text/object set" 
    351362             
    352363        except Exception, e: 
     
    356367        # Check proxy certificate hasn't expired 
    357368        try: 
    358             userProxyCert.isValidTime(raiseExcep=True) 
     369            holderCert.isValidTime(raiseExcep=True) 
    359370             
    360371        except Exception, e: 
     
    364375             
    365376        # Get Distinguished name from certificate as an X500DN type 
    366         userDN = userProxyCert.dn 
    367          
     377        if userId is None: 
     378            try: 
     379                userId = holderCert.dn.serialise(\ 
     380                                         separator=self.__prop['dnSeparator'])  
     381            except Exception, e: 
     382                raise AttAuthorityError, \ 
     383                    "Setting user Id from holder certificate DN: %s" % e 
     384        
    368385         
    369386        # Make a new Attribute Certificate instance passing in certificate 
     
    384401        try: 
    385402            attCert['holder'] = \ 
    386                         userDN.serialise(separator=self.__prop['dnSeparator']) 
    387              
    388         except Exception, e: 
    389             raise AttAuthorityError, "User DN: %s" % e 
     403                holderCert.dn.serialise(separator=self.__prop['dnSeparator'])             
     404        except Exception, e: 
     405            raise AttAuthorityError, "Holder DN: %s" % e 
    390406 
    391407         
     
    394410        try: 
    395411            attCert['issuer'] = \ 
    396                     issuerDN.serialise(separator=self.__prop['dnSeparator']) 
    397              
     412                    issuerDN.serialise(separator=self.__prop['dnSeparator'])             
    398413        except Exception, e: 
    399414            raise AttAuthorityError, "Issuer DN: %s" % e 
     
    402417        attCert['issuerSerialNumber'] = self.__issuerSerialNumber 
    403418 
    404  
     419        attCert['userId'] = userId 
     420         
    405421        # Set validity time 
    406422        try: 
     
    410426 
    411427            # Check against the proxy certificate's expiry 
    412             dtUsrProxyNotAfter = userProxyCert.notAfter 
     428            dtHolderCertNotAfter = holderCert.notAfter 
    413429             
    414430            if attCert.getValidityNotAfter(asDatetime=True) > \ 
    415                dtUsrProxyNotAfter: 
     431               dtHolderCertNotAfter: 
    416432 
    417433                # Adjust the attribute certificate's expiry date time 
     
    419435                # ... but also make ensure that the not before skew is still 
    420436                # applied 
    421                 attCert.setValidityTime(dtNotAfter=dtUsrProxyNotAfter, 
     437                attCert.setValidityTime(dtNotAfter=dtHolderCertNotAfter, 
    422438                        notBeforeOffset=self.__prop['attCertNotBeforeOff']) 
    423439             
     
    428444        # Check name is registered with this Attribute Authority - if no 
    429445        # user roles are found, the user is not registered 
    430         userRoles = self.getRoles(str(userDN)) 
     446        userRoles = self.getRoles(userId) 
    431447        if userRoles:             
    432448            # Set as an Original Certificate 
     
    488504 
    489505 
    490             # Check that's it's holder matches the user certificate DN 
    491             try: 
    492                 holderDN = X500DN(dn=userAttCert['holder']) 
    493                  
    494             except Exception, e: 
    495                 raise AttAuthorityError, \ 
    496                                     "Error creating X500DN for holder: %s" + e 
    497              
    498             if holderDN != userDN: 
     506            # Check that's it's holder matches the candidate holder  
     507            # certificate DN 
     508            if userAttCert.holderDN != holderCert.dn: 
    499509                raise AttAuthorityError, \ 
    500510                    "User certificate and Attribute Certificate DNs " + \ 
    501                     "don't match: %s and %s" % (userDN, holderDN) 
     511                    'don\'t match: "%s" and "%s"' % (holderCert.dn,  
     512                                                     userAttCert.holderDN) 
    502513             
    503514   
    504515            # Get roles from external Attribute Certificate 
    505             trustedHostRoles = userAttCert.getRoles() 
     516            trustedHostRoles = userAttCert.roles 
    506517 
    507518 
     
    519530             
    520531            # Mark new Attribute Certificate as mapped 
    521             attCert['provenance'] = AttCert.mappedProvenance 
     532            attCert.provenance = AttCert.mappedProvenance 
    522533 
    523534            # End set mapped certificate block 
     
    773784         
    774785    #_________________________________________________________________________      
    775     def userIsRegistered(self, userDN): 
     786    def userIsRegistered(self, userId): 
    776787        """Check a particular user is registered with the Data Centre that the 
    777788        Attribute Authority represents 
     
    779790        Nb. this method is not used internally by AttAuthority class 
    780791         
    781         @type userDN: string  
    782         @param userDN: user Distinguished Name 
     792        @type userId: string  
     793        @param userId: user identity - could be a X500 Distinguished Name 
    783794        @rtype: bool 
    784795        @return: True if user is registered, False otherwise""" 
    785         return self.__userRoles.userIsRegistered(userDN) 
     796        return self.__userRoles.userIsRegistered(userId) 
    786797        
    787798         
    788799    #_________________________________________________________________________      
    789     def getRoles(self, dn): 
    790         """Get the roles available to the registered user identified userDN. 
     800    def getRoles(self, userId): 
     801        """Get the roles available to the registered user identified userId. 
    791802 
    792803        @type dn: string  
    793         @param dn: user Distinguished Name 
    794         @return: list of roles for the given user DN""" 
     804        @param dn: user identifier - could be a X500 Distinguished Name 
     805        @return: list of roles for the given user ID""" 
    795806 
    796807        # Call to AAUserRoles derived class.  Each Attribute Authority 
     
    798809        # define how roles are accessed 
    799810        try: 
    800             return self.__userRoles.getRoles(dn) 
     811            return self.__userRoles.getRoles(userId) 
    801812 
    802813        except Exception, e: 
     
    972983 
    973984 
    974     def userIsRegistered(self, dn): 
     985    def userIsRegistered(self, userId): 
    975986        """Derived method should return True if user is known otherwise 
    976987        False 
     
    979990        to be implemented in a derived class. 
    980991         
    981         @type dn: string  
    982         @param dn: user Distinguished Name to look up. 
     992        @type userId: string  
     993        @param userId: user Distinguished Name to look up. 
    983994        @rtype: bool 
    984995        @return: True if user is registered, False otherwise""" 
    985996        raise NotImplementedError, \ 
    986             self.UserIsRegistered.__doc__.replace('\n       ','') 
    987  
    988  
    989     def getRoles(self, dn): 
     997            self.userIsRegistered.__doc__.replace('\n       ','') 
     998 
     999 
     1000    def getRoles(self, userId): 
    9901001        """Derived method should return the roles for the given user's 
    991         DN or else raise an exception 
    992          
    993         @type dn: string  
    994         @param dn: user Distinguished Name 
     1002        Id or else raise an exception 
     1003         
     1004        @type userId: string  
     1005        @param userId: user identity e.g. user Distinguished Name 
    9951006        @rtype: list 
    996         @return: list of roles for the given user DN""" 
     1007        @return: list of roles for the given user ID""" 
    9971008        raise NotImplementedError, \ 
    9981009            self.getRoles.__doc__.replace('\n       ','') 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/AttAuthority/server-config.tac

    r2136 r2178  
    5050        # Get certificate corresponding to private key that signed the 
    5151        # message - i.e. the user's proxy 
    52         proxyCert = WSSecurityHandler.signatureHandler.verifyingCert 
     52        holderCert = WSSecurityHandler.signatureHandler.verifyingCert 
    5353         
    5454        try:     
    55                 attCert = self.aa.getAttCert(proxyCert=proxyCert, 
     55                attCert = self.aa.getAttCert(userId=request.UserId, 
     56                                                                         holderCert=holderCert, 
    5657                                                                         userAttCert=request.UserAttCert)                                                           
    5758                response.AttCert = attCert.toString() 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/ca/server-config.tac

    r2153 r2178  
    11#!/usr/bin/env python 
    2 """NDG Security Session Manager .tac file  
     2"""NDG Security Certificate Authority .tac file  
    33 
    44This file enables the Session Manager web service to be  
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/AttAuthorityClientTest.py

    r2085 r2178  
    9595        attCert.filePath = self.cfg['test5GetAttCert']['attcertfilepath'] 
    9696        attCert.write() 
     97         
     98    def test6GetAttCertWithUserIdSet(self):         
     99        """test6GetAttCertWithUserIdSet: Request attribute certificate from  
     100        NDG Attribute Authority Web Service setting a specific user Id  
     101        independent of the signer of the SOAP request.""" 
     102     
     103        # Read user Certificate into a string ready for passing via WS 
     104        try: 
     105            userCertFilePath = \ 
     106    self.cfg['test6GetAttCertWithUserIdSet'].get('issuingusercertfilepath') 
     107            userCertTxt = open(userCertFilePath, 'r').read() 
     108         
     109        except TypeError: 
     110            # No issuing cert set 
     111            userCertTxt = None 
     112                 
     113        except IOError, ioErr: 
     114            raise "Error reading certificate file \"%s\": %s" % \ 
     115                                    (ioErr.filename, ioErr.strerror) 
    97116 
     117        # Make attribute certificate request 
     118        userId = self.cfg['test6GetAttCertWithUserIdSet']['userid'] 
     119        attCert = self.clnt.getAttCert(userId=userId, 
     120                                       userCert=userCertTxt) 
     121         
     122        print "Attribute Certificate: \n\n:" + str(attCert) 
     123         
     124        attCert.filePath = self.cfg['test5GetAttCert']['attcertfilepath'] 
     125        attCert.write() 
    98126 
    99     def test6GetMappedAttCert(self):         
    100         """test6GetMappedAttCert: Request mapped attribute certificate from  
     127    def test7GetMappedAttCert(self):         
     128        """test7GetMappedAttCert: Request mapped attribute certificate from  
    101129        NDG Attribute Authority Web Service.""" 
    102130     
     
    104132        try: 
    105133            userCertFilePath = \ 
    106             self.cfg['test6GetMappedAttCert'].get('issuingusercertfilepath') 
     134            self.cfg['test7GetMappedAttCert'].get('issuingusercertfilepath') 
    107135            userCertTxt = open(userCertFilePath, 'r').read() 
    108136         
     
    119147        try: 
    120148            userAttCert = AttCertRead(\ 
    121                 self.cfg['test6GetMappedAttCert']['userattcertfilepath']) 
     149                self.cfg['test7GetMappedAttCert']['userattcertfilepath']) 
    122150             
    123151        except IOError, ioErr: 
     
    127155        # Make client to site B Attribute Authority     
    128156        clnt = AttAuthorityClient( 
    129 uri=self.cfg['test6GetMappedAttCert']['uri'],  
    130 signingCertFilePath=self.cfg['test6GetMappedAttCert']['usercertfilepath'], 
    131 signingPriKeyFilePath=self.cfg['test6GetMappedAttCert']['userprikeyfilepath'], 
     157uri=self.cfg['test7GetMappedAttCert']['uri'],  
     158signingCertFilePath=self.cfg['test7GetMappedAttCert']['usercertfilepath'], 
     159signingPriKeyFilePath=self.cfg['test7GetMappedAttCert']['userprikeyfilepath'], 
    132160tracefile=sys.stderr) 
    133161     
     
    148176                    "test4GetTrustedHostInfoWithNoRole", 
    149177                    "test5GetAttCert", 
    150                     "test6GetMappedAttCert", 
     178                    "test6GetAttCertWithUserIdSet", 
     179                    "test7GetMappedAttCert", 
    151180                  )) 
    152181        unittest.TestSuite.__init__(self, map) 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/attAuthorityClientTest.cfg

    r2170 r2178  
    3535attCertFilePath = ./ac.xml 
    3636 
    37 [test6GetMappedAttCert] 
     37[test6GetAttCertWithUserIdSet] 
     38userId = userWhoIsEntitledToTheRolesInThisCert 
     39 
     40[test7GetMappedAttCert] 
    3841userprikeypwd =  
    3942usercertfilepath = ./proxy-cert.pem 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/siteAUserRoles.py

    r2051 r2178  
    2424 
    2525 
    26     def userIsRegistered(self, dn): 
     26    def userIsRegistered(self, userId): 
    2727        return True 
    2828 
    2929 
    30     def getRoles(self, dn): 
     30    def getRoles(self, userId): 
    3131        return ['staff', 'postdoc', 'undergrad']  
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttAuthority/siteBUserRoles.py

    r2051 r2178  
    2424 
    2525 
    26     def userIsRegistered(self, dn): 
     26    def userIsRegistered(self, userId): 
    2727        return False 
    2828 
    2929 
    30     def getRoles(self, dn): 
     30    def getRoles(self, userId): 
    3131        # Make so that Site B never returns any roles - the only way to 
    3232        # get an Attribute Certificate is then through the role mapping 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/AttCert/AttCertTest.py

    r1970 r2178  
    7676        self.attCert.addRoles('atsr') 
    7777         
    78         print "test6AddRoles: " + ', '.join(self.attCert.getRoles()) 
     78        print "test6AddRoles: " + ', '.join(self.attCert.roles) 
    7979 
    8080  
    81     def test6aDictSet(self): 
    82         'test6aDictSet: test __setitem__' 
     81    def test6aSet(self): 
     82        'test6aSet: test __setitem__ and property methods' 
     83        self.attCert.version = "1.0" 
    8384        self.attCert['issuer'] = '/O=NDG/OU=BADC/CN=Attribute Authority' 
    8485        self.attCert['issuerName'] = 'BADC' 
    85         self.attCert['holder'] = '/O=NDG/OU=BADC/CN=pjkershaw' 
     86        self.attCert.issuerSerialNumber = 1234 
     87        self.attCert['holder'] = '/O=NDG/OU=BADC/CN=server.cert.ac.uk' 
     88        self.attCert.userId = '/O=NDG/OU=BADC/CN=pjkershaw' 
    8689         
    8790        try: 
    8891            self.attCert['validity'] = 'invalid' 
    8992        except KeyError, e: 
    90             print "test6aDictSet: PASSED - %s" % e 
     93            print "test6aSet: PASSED - %s" % e 
    9194             
    9295        try: 
    9396            self.attCert['attributes'] = 'roleSet' 
    9497        except KeyError, e: 
    95             print "test6aDictSet: PASSED - %s" % e 
     98            print "test6aSet: PASSED - %s" % e 
    9699             
    97100        try: 
    98101            self.attCert['attributes']['roleSet'] = ['role1', 'role2'] 
    99102        except KeyError, e: 
    100             print "test6aDictSet: PASSED - %s" % e 
    101  
    102     def test6bDictGet(self): 
    103         'test6bDictGet: test __getitem__' 
    104         print "test6bDictGet ..." 
    105         print self.test2SetProvenance() 
    106         print self.test4SetValidityTime() 
    107         print self.test6AddRoles() 
    108         print self.test6aDictSet() 
    109         print self.attCert['issuer'] 
    110         print self.attCert['holder'] 
    111         print self.attCert['validity'] 
    112         print self.attCert['attributes'] 
    113         print self.attCert['attributes']['roleSet']  
     103            print "test6aSet: PASSED - %s" % e 
     104 
     105    def test6bGet(self): 
     106        'test6bGet: test __getitem__ and property methods' 
     107        print "test6bGet ..." 
     108        self.test2SetProvenance() 
     109        self.test4SetValidityTime() 
     110        self.test6AddRoles() 
     111        self.test6aSet() 
     112 
     113        print "self.attCert['version'] = %s" % self.attCert['version'] 
     114        print "self.attCert.version = %s" % self.attCert.version 
     115         
     116        print "self.attCert['issuer'] = %s" % self.attCert['issuer'] 
     117        print "self.attCert.issuer = %s" % self.attCert.issuer 
     118        print "self.attCert.issuerDN = %s" % self.attCert.issuerDN 
     119 
     120        print "self.attCert['issuerName'] = %s" % self.attCert['issuerName'] 
     121        print "self.attCert.issuerName = %s" % self.attCert.issuerName 
     122         
     123        print "self.attCert['issuerSerialNumber'] = %s" % \ 
     124                                            self.attCert['issuerSerialNumber'] 
     125        print "self.attCert.issuerSerialNumber = %s" % \ 
     126                                            self.attCert.issuerSerialNumber 
     127         
     128        print "self.attCert['holder'] = %s" % self.attCert['holder'] 
     129        print "self.attCert.holder = %s" % self.attCert.holder 
     130        print "self.attCert.holderDN = %s" % self.attCert.holderDN 
     131 
     132        print "self.attCert['userId'] = %s" % self.attCert['userId'] 
     133        print "self.attCert.userId = %s" % self.attCert.userId 
     134         
     135        print "self.attCert['validity'] = %s" % self.attCert['validity'] 
     136        print "self.attCert.validityNotBefore = %s" % \ 
     137                                                self.attCert.validityNotBefore 
     138        print "self.attCert.validityNotAfter = %s" % \ 
     139                                                self.attCert.validityNotAfter 
     140                                                 
     141        print "self.attCert.getValidityNotBefore(asDatetime=True) = %s" % \ 
     142                            self.attCert.getValidityNotBefore(asDatetime=True) 
     143        print "self.attCert.getValidityNotAfter(asDatetime=True) = %s" % \ 
     144                            self.attCert.getValidityNotAfter(asDatetime=True) 
     145         
     146        print "self.attCert['attributes'] = %s" % self.attCert['attributes'] 
     147        print "self.attCert['attributes']['roleSet'] %s: " % \ 
     148                                        self.attCert['attributes']['roleSet']  
     149        print "self.attCert.roleSet = %s" % self.attCert.roleSet 
     150        print "self.attCert.roles = %s" % self.attCert.roles 
    114151 
    115152    def test7CreateXML(self): 
     
    131168        self.test5SetDefaultValidityTime() 
    132169        self.test6AddRoles() 
    133         self.test6aDictSet()     
     170        self.test6aSet()     
    134171         
    135172        self.attCert.filePath = self.cfg['test9Sign']['filepath'] 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/MyProxy/Makefile

    r2085 r2178  
    1616initAttAuthorityClientUnittest: ${PROXYFILES} 
    1717        @echo Set-up AttAuthority unit test by copying proxy file output from this test... 
     18        ./MyProxyClientTest.py MyProxyClientTestCase.test2GetDelegation 
    1819        cp ${PROXYFILES} ../AttAuthority 
  • TI12-security/trunk/python/www/html/attAuthority.wsdl

    r2107 r2178  
    2525        <xsd:complexType> 
    2626          <xsd:sequence> 
     27            <xsd:element name="userId" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
    2728            <xsd:element name="userCert" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
    2829            <xsd:element name="userAttCert" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
Note: See TracChangeset for help on using the changeset viewer.