Changeset 4713


Ignore:
Timestamp:
24/12/08 10:08:29 (11 years ago)
Author:
pjkersha
Message:

Added extra parameter 'siteName' to Attribute Authority map configuration to enable display of a more user friendly listing in the WAYF.

  • re-ran all attribute authority related unit tests
  • TODO: modify and test SSO client WAYF interface to use new param
Location:
TI12-security/trunk/python
Files:
12 edited

Legend:

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

    r4680 r4713  
    277277                                         transdict=self._transdict) 
    278278        except HTTPResponse, e: 
    279             raise AttributeAuthorityClientError, \ 
    280                 "Error initialising service for \"%s\": %s %s" % \ 
    281                 (self.__uri, e.status, e.reason) 
     279            raise AttributeAuthorityClientError( 
     280                "Error initialising service for \"%s\": %s %s" %  
     281                (self.__uri, e.status, e.reason)) 
    282282 
    283283    def getHostInfo(self): 
     
    311311 
    312312        # Unpack response into dict 
    313         hostInfoKw = ['aaURI', 
     313        hostInfoKw = ['siteName', 
     314                      'aaURI', 
    314315                      'aaDN', 
    315316                      'loginURI', 
     
    358359            hostname = host.get_element_hostname() 
    359360             
    360             trustedHostInfo[hostname] = \ 
    361             { 
     361            trustedHostInfo[hostname] = { 
     362                'siteName': host.SiteName, 
    362363                'aaURI': host.AaURI, 
    363364                'aaDN': host.AaDN, 
     
    403404        for host in hosts: 
    404405            hostname = host.Hostname 
    405             allHostInfo[hostname] = \ 
    406             { 
     406            allHostInfo[hostname] = { 
     407                'siteName': host.SiteName, 
    407408                'aaURI': host.AaURI, 
    408409                'aaDN': host.AaDN, 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/utils/configfileparsers.py

    r4682 r4713  
    137137     
    138138    __call__ method enables a standalone read function''' 
    139          
    140     def read(self, propFilePath, validKeys, cfg=None, sections=None, 
    141              wsseSection='WS-Security', prefix=''): 
     139     
     140    defaultOptionNames = ('here',) 
     141     
     142    def read(self,  
     143             propFilePath,  
     144             validKeys,  
     145             cfg=None,  
     146             sections=None, 
     147             defaultItems={},  
     148             prefix=''): 
    142149        """ 
    143150        Read 'ini' type property file - i.e. a flat text file with key/value 
     
    155162        @param sections: sections to be read from - defaults to all sections in the 
    156163        file 
    157         @type wsseSection: basestring 
    158         @param wsseSection: section to read WS-Security settings from as  
    159         specified by WSSecurityConfig class.  WS-Security section doesn't need  
    160         to be present and can be ignored. 
     164        @type defaultItems: dict 
     165        @param defaultItems: add items via this input dictionary as well as by 
     166        retrieval from config file itself.  This only comes into effect if 
     167        cfg was not set and a new config object is created locally. 
    161168        @rtype: dict 
    162169        @return: dict with the loaded properties in 
     
    171178             
    172179        if cfg is None: 
    173             hereDef = {'here': os.path.dirname(propFilePath)} 
    174             self.cfg = CaseSensitiveConfigParser(defaults=hereDef) 
     180            # Add default item for file location to enable convenient  
     181            # substitutions within the file 
     182            defaultItems['here'] = os.path.dirname(propFilePath) 
     183             
     184            self.cfg = CaseSensitiveConfigParser(defaults=defaultItems) 
    175185            self.cfg.read(propFilePath) 
    176186            if not os.path.isfile(propFilePath): 
     
    195205                                               section=section, 
    196206                                               prefix=prefix)) 
    197             else: 
    198                 if section == wsseSection: 
    199                     keys = WSSecurityConfig.propertyDefaults 
    200                 else: 
    201                     keys = validKeys 
    202                      
     207            else:                     
    203208                properties[section] = _parseConfig(self.cfg,  
    204                                                    keys,  
     209                                                   validKeys,  
    205210                                                   section=section, 
    206211                                                   prefix=prefix) 
    207212     
     213                 
     214        # Get rid of 'here' default item to avoid interfering with later 
     215        # processing 
     216        for opt in INIPropertyFile.defaultOptionNames: 
     217            properties.pop(opt, None) 
     218         
    208219        log.debug("Finished reading from INI properties file") 
    209220        return properties 
     
    487498        # using the properties listed here 
    488499        if key == wsseSection: 
    489             validateProperties(properties[key], WSSecurityConfig.propertyDefaults) 
     500            validateProperties(properties[key],  
     501                               WSSecurityConfig.propertyDefaults) 
    490502             
    491503        elif validKeys[key] and isinstance(validKeys[key], dict): 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/zsi/attributeauthority/AttributeAuthority_services.py

    r4692 r4713  
    2929        # no ws-addressing 
    3030 
    31     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84c746c> 
     31    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cad2c> 
    3232    def getAttCert(self, userId,userX509Cert,userAttCert): 
    3333 
     
    4646        return attCert,msg 
    4747 
    48     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84c778c> 
     48    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84d106c> 
    4949    def getHostInfo(self): 
    5050 
     
    5757        response = self.binding.Receive(getHostInfoOutputMsg.typecode) 
    5858        hostname = response._hostname 
     59        siteName = response._siteName 
    5960        aaURI = response._aaURI 
    6061        aaDN = response._aaDN 
     
    6263        loginServerDN = response._loginServerDN 
    6364        loginRequestServerDN = response._loginRequestServerDN 
    64         return hostname,aaURI,aaDN,loginURI,loginServerDN,loginRequestServerDN 
     65        return hostname,siteName,aaURI,aaDN,loginURI,loginServerDN,loginRequestServerDN 
    6566 
    66     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cf2cc> 
     67    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84d1c0c> 
    6768    def getTrustedHostInfo(self, role): 
    6869 
     
    7879        return trustedHosts 
    7980 
    80     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cf44c> 
     81    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84d1d8c> 
    8182    def getAllHostsInfo(self): 
    8283 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/zsi/attributeauthority/AttributeAuthority_services_types.py

    r4521 r4713  
    2323        def __init__(self, pname, ofwhat=(), attributes=None, extend=False, restrict=False, **kw): 
    2424            ns = ns0.HostInfo_Def.schema 
    25             TClist = [ZSI.TC.String(pname="hostname", aname="_hostname", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaURI", aname="_aaURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaDN", aname="_aaDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginURI", aname="_loginURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginServerDN", aname="_loginServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginRequestServerDN", aname="_loginRequestServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="roleList", aname="_roleList", minOccurs=0, maxOccurs="unbounded", nillable=False, typed=False, encoded=kw.get("encoded"))] 
     25            TClist = [ZSI.TC.String(pname="hostname", aname="_hostname", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="siteName", aname="_siteName", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaURI", aname="_aaURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaDN", aname="_aaDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginURI", aname="_loginURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginServerDN", aname="_loginServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginRequestServerDN", aname="_loginRequestServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="roleList", aname="_roleList", minOccurs=0, maxOccurs="unbounded", nillable=False, typed=False, encoded=kw.get("encoded"))] 
    2626            self.attribute_typecode_dict = attributes or {} 
    2727            if extend: TClist += ofwhat 
     
    3434                    # pyclass 
    3535                    self._hostname = None 
     36                    self._siteName = None 
    3637                    self._aaURI = None 
    3738                    self._aaDN = None 
     
    111112        def __init__(self, **kw): 
    112113            ns = ns0.getHostInfoResponse_Dec.schema 
    113             TClist = [ZSI.TC.String(pname="hostname", aname="_hostname", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaURI", aname="_aaURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaDN", aname="_aaDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginURI", aname="_loginURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginServerDN", aname="_loginServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginRequestServerDN", aname="_loginRequestServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded"))] 
     114            TClist = [ZSI.TC.String(pname="hostname", aname="_hostname", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="siteName", aname="_siteName", minOccurs=0, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaURI", aname="_aaURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="aaDN", aname="_aaDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginURI", aname="_loginURI", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginServerDN", aname="_loginServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded")), ZSI.TC.String(pname="loginRequestServerDN", aname="_loginRequestServerDN", minOccurs=1, maxOccurs=1, nillable=False, typed=False, encoded=kw.get("encoded"))] 
    114115            kw["pname"] = ("urn:ndg:security:AttributeAuthority","getHostInfoResponse") 
    115116            kw["aname"] = "_getHostInfoResponse" 
     
    122123                    # pyclass 
    123124                    self._hostname = None 
     125                    self._siteName = None 
    124126                    self._aaURI = None 
    125127                    self._aaDN = None 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/zsi/attributeauthority/attributeauthority.wsdl

    r4521 r4713  
    1616        <xsd:sequence> 
    1717          <xsd:element name="hostname" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     18          <xsd:element name="siteName" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
    1819          <xsd:element name="aaURI" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    1920          <xsd:element name="aaDN" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     
    5253          <xsd:sequence> 
    5354            <xsd:element name="hostname" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
     55            <xsd:element name="siteName" type="xsd:string" minOccurs="0" maxOccurs="1"/> 
    5456            <xsd:element name="aaURI" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
    5557            <xsd:element name="aaDN" type="xsd:string" minOccurs="1" maxOccurs="1"/> 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/zsi/sessionmanager/SessionManager_services.py

    r4692 r4713  
    2929        # no ws-addressing 
    3030 
    31     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84c784c> 
     31    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cac4c> 
    3232    def getSessionStatus(self, userDN,sessID): 
    3333 
     
    4444        return isAlive 
    4545 
    46     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84c7b4c> 
     46    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84caf4c> 
    4747    def connect(self, username,passphrase,createServerSess): 
    4848 
     
    6363        return userX509Cert,userPriKey,issuingCert,sessID 
    6464 
    65     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cd6ec> 
     65    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84d1aec> 
    6666    def disconnect(self, userX509Cert,sessID): 
    6767 
     
    7777        return  
    7878 
    79     # op: <ZSI.wstools.WSDLTools.Message instance at 0x84cd88c> 
     79    # op: <ZSI.wstools.WSDLTools.Message instance at 0x84d1c8c> 
    8080    def getAttCert(self, userX509Cert,sessID,attributeAuthorityURI,reqRole,mapFromTrustedHosts,rtnExtAttCertList,extAttCert,extTrustedHost): 
    8181 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/attributeauthority.py

    r4680 r4713  
    9797 
    9898    _confDir = "conf" 
    99     _propFileName = "attAuthorityProperties.xml" 
     99    _propFileName = "attributeAuthority.cfg" 
    100100     
    101101    # valid configuration property keywords with accepted default values.   
     
    127127    } 
    128128     
    129     WS_SETTINGS_KEY = 'WS-Security' 
     129    mapConfigHostDefaults = { 
     130        'siteName':                 None, 
     131        'aaURI':                    NotImplemented, 
     132        'aaDN':                     NotImplemented, 
     133        'loginURI':                 NotImplemented, 
     134        'loginServerDN':            NotImplemented, 
     135        'loginRequestServerDN':     NotImplemented 
     136    } 
    130137 
    131138    def __init__(self,  
     
    139146        @param propFilePath: path to file containing Attribute Authority 
    140147        configuration parameters.  It defaults to $NDGSEC_AA_PROPFILEPATH or 
    141         if not set, $NDGSEC_DIR/conf/attAuthorityProperties.xml 
     148        if not set, $NDGSEC_DIR/conf/attributeAuthority.cfg 
    142149        - if the filename ends with 'xml', it is assumed to be in the xml  
    143150        format 
     
    163170         
    164171        # Initialise role mapping look-ups - These are set in readMapConfig() 
    165         self.__mapConfig = None 
    166         self.__localRole2RemoteRole = None 
    167         self.__remoteRole2LocalRole = None 
     172        self._mapConfig = None 
     173        self._localRole2RemoteRole = None 
     174        self._remoteRole2LocalRole = None 
    168175 
    169176        self.readProperties() 
     
    175182        # Instantiate Certificate object 
    176183        log.debug("Reading and checking Attribute Authority X.509 cert. ...") 
    177         self.__cert = X509Cert.Read(self.__prop['signingCertFilePath']) 
     184        self.__cert = X509Cert.Read(self._prop['signingCertFilePath']) 
    178185 
    179186        # Check it's valid 
     
    187194        # Check CA certificate 
    188195        log.debug("Reading and checking X.509 CA certificate ...") 
    189         for caCertFile in self.__prop['caCertFilePathList']: 
     196        for caCertFile in self._prop['caCertFilePathList']: 
    190197            caCert = X509Cert(caCertFile) 
    191198            caCert.read() 
     
    201208        # properties file 
    202209        self.__issuer = \ 
    203             self.__cert.dn.serialise(separator=self.__prop['dnSeparator']) 
     210            self.__cert.dn.serialise(separator=self._prop['dnSeparator']) 
    204211 
    205212        self.__issuerSerialNumber = self.__cert.serialNumber 
     
    207214        # Load host sites custom user roles interface to enable the AA to 
    208215        # assign roles in an attribute certificate on a getAttCert request 
    209         self.__userRoles = instantiateClass(self.__prop['userRolesModName'], 
    210                      self.__prop['userRolesClassName'], 
    211                      moduleFilePath=self.__prop.get('userRolesModFilePath'), 
     216        self.__userRoles = instantiateClass(self._prop['userRolesModName'], 
     217                     self._prop['userRolesClassName'], 
     218                     moduleFilePath=self._prop.get('userRolesModFilePath'), 
    212219                     objectType=AAUserRoles, 
    213                      classProperties=self.__prop.get('userRolesPropFile')) 
    214  
    215         attCertFilePath = os.path.join(self.__prop['attCertDir'], 
    216                                        self.__prop['attCertFileName']) 
     220                     classProperties=self._prop.get('userRolesPropFile')) 
     221 
     222        attCertFilePath = os.path.join(self._prop['attCertDir'], 
     223                                       self._prop['attCertFileName']) 
    217224                 
    218225        # Rotating file handler used for logging attribute certificates  
    219226        # issued. 
    220227        self._attCertLog=AttCertLog(attCertFilePath, 
    221                                     backUpCnt=self.__prop['attCertFileLogCnt']) 
     228                                    backUpCnt=self._prop['attCertFileLogCnt']) 
    222229 
    223230 
     
    254261            propBranch = propBranch[section] 
    255262             
    256         self.__prop = propBranch 
     263        self._prop = propBranch 
    257264         
    258265        # Ensure Certificate time parameters are converted to numeric type 
    259         self.__prop['attCertLifetime'] = float(self.__prop['attCertLifetime']) 
    260         self.__prop['attCertNotBeforeOff'] = \ 
    261                                     float(self.__prop['attCertNotBeforeOff']) 
     266        self._prop['attCertLifetime'] = float(self._prop['attCertLifetime']) 
     267        self._prop['attCertNotBeforeOff'] = \ 
     268                                    float(self._prop['attCertNotBeforeOff']) 
    262269 
    263270        # Check directory path 
    264271        try: 
    265             dirList = os.listdir(self.__prop['attCertDir']) 
     272            dirList = os.listdir(self._prop['attCertDir']) 
    266273 
    267274        except OSError, osError: 
     
    269276                                                'Attribute Certificates store ' 
    270277                                                '"%s": %s' %  
    271                                                 (self.__prop['attCertDir'],  
     278                                                (self._prop['attCertDir'],  
    272279                                                 osError.strerror)) 
    273280 
     
    276283    def __repr__(self): 
    277284        """Return file properties dictionary as string""" 
    278         return repr(self.__prop) 
     285        return repr(self._prop) 
    279286     
    280287    def __delitem__(self, key): 
     
    287294        Authority properties 
    288295        """ 
    289         if key not in self.__prop: 
     296        if key not in self._prop: 
    290297            raise KeyError("Invalid key '%s'" % key) 
    291298         
    292         return self.__prop[key] 
     299        return self._prop[key] 
    293300         
    294301    def get(self, kw): 
    295         return self.__prop.get(kw) 
     302        return self._prop.get(kw) 
    296303     
    297304    def clear(self): 
     
    299306    
    300307    def keys(self): 
    301         return self.__prop.keys() 
     308        return self._prop.keys() 
    302309 
    303310    def items(self): 
    304         return self.__prop.items() 
     311        return self._prop.items() 
    305312 
    306313    def values(self): 
    307         return self.__prop.values() 
     314        return self._prop.values() 
    308315 
    309316    def has_key(self, key): 
    310         return self.__prop.has_key(key) 
     317        return self._prop.has_key(key) 
    311318 
    312319    # 'in' operator 
    313320    def __contains__(self, key): 
    314         return key in self.__prop 
     321        return key in self._prop 
    315322 
    316323 
     
    524531            try: 
    525532                userId = holderX509Cert.dn.serialise(\ 
    526                                          separator=self.__prop['dnSeparator'])  
     533                                         separator=self._prop['dnSeparator'])  
    527534            except Exception, e: 
    528535                log.error("Setting user Id from holder certificate DN: %s" % e) 
     
    535542        # First certificate in list contains the public key corresponding to  
    536543        # the private key 
    537         attCert.certFilePathList = [self.__prop['signingCertFilePath']] + \ 
    538                                                                 self.__prop['caCertFilePathList'] 
     544        attCert.certFilePathList = [self._prop['signingCertFilePath']] + \ 
     545                                                                self._prop['caCertFilePathList'] 
    539546              
    540547        # Check for expiry of each certificate                    
     
    542549            X509Cert.Read(x509Cert).isValidTime(raiseExcep=True) 
    543550                                                                 
    544         attCert.signingKeyFilePath = self.__prop['signingPriKeyFilePath'] 
    545         attCert.signingKeyPwd = self.__prop['signingPriKeyPwd'] 
     551        attCert.signingKeyFilePath = self._prop['signingPriKeyFilePath'] 
     552        attCert.signingKeyPwd = self._prop['signingPriKeyPwd'] 
    546553         
    547554         
     
    551558            try: 
    552559                attCert['holder'] = holderX509Cert.dn.serialise( 
    553                                         separator=self.__prop['dnSeparator'])             
     560                                        separator=self._prop['dnSeparator'])             
    554561            except Exception, e: 
    555562                 log.error("Holder X.509 Certificate DN: %s" % e) 
     
    560567        try: 
    561568            attCert['issuer'] = \ 
    562                     issuerDN.serialise(separator=self.__prop['dnSeparator'])             
     569                    issuerDN.serialise(separator=self._prop['dnSeparator'])             
    563570        except Exception, e: 
    564571            log.error("Issuer X.509 Certificate DN: %s" % e) 
    565572            raise  
    566573            
    567         attCert['issuerName'] = self.__prop['name'] 
     574        attCert['issuerName'] = self._prop['name'] 
    568575        attCert['issuerSerialNumber'] = self.__issuerSerialNumber 
    569576 
     
    573580        try: 
    574581            attCert.setValidityTime( 
    575                         lifetime=self.__prop['attCertLifetime'], 
    576                         notBeforeOffset=self.__prop['attCertNotBeforeOff']) 
     582                        lifetime=self._prop['attCertLifetime'], 
     583                        notBeforeOffset=self._prop['attCertNotBeforeOff']) 
    577584 
    578585            # Check against the holder X.509 certificate's expiry if set 
     
    588595                    # still applied 
    589596                    attCert.setValidityTime(dtNotAfter=dtHolderCertNotAfter, 
    590                             notBeforeOffset=self.__prop['attCertNotBeforeOff']) 
     597                            notBeforeOffset=self._prop['attCertNotBeforeOff']) 
    591598             
    592599        except Exception, e: 
     
    649656            try: 
    650657                # Give path to CA cert to allow check 
    651                 userAttCert.certFilePathList=self.__prop['caCertFilePathList'] 
     658                userAttCert.certFilePathList=self._prop['caCertFilePathList'] 
    652659                userAttCert.isValid(raiseExcep=True) 
    653660                 
     
    719726        @type mapConfigFilePath: string 
    720727        @param mapConfigFilePath: file path for map configuration file.  If  
    721         omitted, it uses member variable __prop['mapConfigFile']. 
     728        omitted, it uses member variable _prop['mapConfigFile']. 
    722729        """ 
    723730         
     
    726733        if mapConfigFilePath is not None: 
    727734            if not isinstance(mapConfigFilePath, basestring): 
    728                 raise AttributeAuthorityError( 
    729                 "Input Map Configuration file path must be a valid string.") 
    730              
    731             self.__prop['mapConfigFile'] = mapConfigFilePath 
     735                raise AttributeAuthorityConfigError("Input Map Configuration " 
     736                                                    "file path must be a " 
     737                                                    "valid string.") 
     738             
     739            self._prop['mapConfigFile'] = mapConfigFilePath 
    732740 
    733741 
    734742        try: 
    735             tree = ElementTree.parse(self.__prop['mapConfigFile']) 
     743            tree = ElementTree.parse(self._prop['mapConfigFile']) 
    736744            rootElem = tree.getroot() 
    737745             
    738746        except IOError, e: 
    739             raise AttributeAuthorityConfigError('Error parsing properties file ' 
    740                                           '"%s": %s' % (e.filename,e.strerror))           
     747            raise AttributeAuthorityConfigError('Error parsing properties ' 
     748                                                'file "%s": %s' %  
     749                                                (e.filename,e.strerror))           
    741750        except Exception, e: 
    742             raise AttributeAuthorityConfigError('Error parsing Map Configuration ' 
    743                                           'file: "%s": %s' %  
    744                                           (self.__prop['mapConfigFile'], e)) 
     751            raise AttributeAuthorityConfigError('Error parsing Map ' 
     752                                                'Configuration file: "%s": %s'%  
     753                                                (self._prop['mapConfigFile'],  
     754                                                 e)) 
    745755 
    746756             
     
    753763        # Dictionaries: 
    754764        # 1) to hold all the data 
    755         self.__mapConfig = {'thisHost': {}, 'trustedHosts': {}} 
     765        self._mapConfig = {'thisHost': {}, 'trustedHosts': {}} 
    756766 
    757767        # ... look-up 
    758768        # 2) hosts corresponding to a given role and 
    759769        # 3) roles of external data centre to this data centre 
    760         self.__localRole2TrustedHost = {} 
    761         self.__localRole2RemoteRole = {} 
    762         self.__remoteRole2LocalRole = {} 
     770        self._localRole2TrustedHost = {} 
     771        self._localRole2RemoteRole = {} 
     772        self._remoteRole2LocalRole = {} 
    763773 
    764774 
     
    768778             
    769779        except Exception, e: 
    770             raise AttributeAuthorityConfigError('"thisHost" tag not found in Map ' 
    771                                           'Configuration file "%s"' %  
    772                                           self.__prop['mapConfigFile']) 
     780            raise AttributeAuthorityConfigError('"thisHost" tag not found in ' 
     781                                                'Map Configuration file "%s"' %  
     782                                                self._prop['mapConfigFile']) 
    773783 
    774784        try: 
     
    776786             
    777787        except Exception, e: 
    778             raise AttributeAuthorityConfigError('"name" attribute of "thisHost" ' 
    779                                     'element not found in Map Configuration ' 
    780                                     'file "%s"' % self.__prop['mapConfigFile']) 
     788            raise AttributeAuthorityConfigError('"name" attribute of ' 
     789                                                '"thisHost" element not found ' 
     790                                                'in Map Configuration file ' 
     791                                                '"%s"' %  
     792                                                self._prop['mapConfigFile']) 
    781793 
    782794 
     
    789801        # 
    790802        # P J Kershaw 14/06/06 
    791         if hostName != self.__prop['name']: 
     803        if hostName != self._prop['name']: 
    792804            raise AttributeAuthorityError('"name" attribute of "thisHost" ' 
    793805                                          'element in Map Configuration file ' 
     
    796808         
    797809        # Information for THIS Attribute Authority 
    798         hostDict = {}.fromkeys(('aaURI', 
    799                                 'aaDN', 
    800                                 'loginURI', 
    801                                 'loginServerDN', 
    802                                 'loginRequestServerDN')) 
    803         self.__mapConfig['thisHost'][hostName] = hostDict.copy() 
    804         for k in self.__mapConfig['thisHost'][hostName]: 
    805             self.__mapConfig['thisHost'][hostName][k]=thisHostElem.findtext(k) 
     810        self._mapConfig['thisHost'][hostName] = {} 
     811 
     812        for k, v in AttributeAuthority.mapConfigHostDefaults.items(): 
     813            val = thisHostElem.findtext(k) 
     814            if val is None and v == NotImplemented: 
     815                raise AttributeAuthorityConfigError('<thisHost> option <%s> ' 
     816                                                    'must be set.' % k) 
     817            self._mapConfig['thisHost'][hostName][k] = val 
     818                 
    806819         
    807820        # Information about trusted hosts 
     
    811824                 
    812825            except Exception, e: 
    813                 raise AttributeAuthorityError('Error reading trusted host ' 
    814                                               'name: %s' % e) 
     826                raise AttributeAuthorityConfigError('Error reading trusted ' 
     827                                                    'host name: %s' % e) 
    815828 
    816829             
     
    824837            # 
    825838            # P J Kershaw 25/05/06 
    826             self.__mapConfig['trustedHosts'][trustedHost] = hostDict.copy() 
    827             for k in self.__mapConfig['trustedHosts'][trustedHost]: 
    828                 self.__mapConfig['trustedHosts'][trustedHost][k] = \ 
     839            self._mapConfig['trustedHosts'][trustedHost] = {} 
     840            for k, v in AttributeAuthority.mapConfigHostDefaults.items(): 
     841                val = thisHostElem.findtext(k) 
     842                if val is None and v == NotImplemented: 
     843                    raise AttributeAuthorityConfigError('<trustedHost> option ' 
     844                                                        '<%s> must be set.'%k) 
     845                     
     846                self._mapConfig['trustedHosts'][trustedHost][k] = \ 
    829847                                                        elem.findtext(k)    
    830848 
     
    833851                # Role keyword value requires special parsing before  
    834852                # assignment 
    835                 self.__mapConfig['trustedHosts'][trustedHost]['role'] = \ 
     853                self._mapConfig['trustedHosts'][trustedHost]['role'] = \ 
    836854                                        [dict(i.items()) for i in roleElem] 
    837855            else: 
     
    839857                # role mapping.  e.g. a site's login service trusting other 
    840858                # sites login requests 
    841                 self.__mapConfig['trustedHosts'][trustedHost]['role'] = [] 
     859                self._mapConfig['trustedHosts'][trustedHost]['role'] = [] 
    842860                        
    843             self.__localRole2RemoteRole[trustedHost] = {} 
    844             self.__remoteRole2LocalRole[trustedHost] = {} 
    845              
    846             for role in self.__mapConfig['trustedHosts'][trustedHost]['role']: 
     861            self._localRole2RemoteRole[trustedHost] = {} 
     862            self._remoteRole2LocalRole[trustedHost] = {} 
     863             
     864            for role in self._mapConfig['trustedHosts'][trustedHost]['role']: 
    847865                try: 
    848866                    localRole = role['local'] 
    849867                    remoteRole = role['remote'] 
    850868                except KeyError, e: 
    851                     raise AttributeAuthorityError('Reading map config file "%s": no ' 
    852                                             'element "%s" for host "%s"' % \ 
    853                                             (self.__prop['mapConfigFile'],  
    854                                              e,  
    855                                              trustedHost)) 
     869                    raise AttributeAuthorityError('Reading map configuration ' 
     870                                                  ' file "%s": no element ' 
     871                                                  '"%s" for host "%s"' %  
     872                                                (self._prop['mapConfigFile'],  
     873                                                 e,  
     874                                                 trustedHost)) 
    856875                     
    857876                # Role to host look-up 
    858                 if localRole in self.__localRole2TrustedHost: 
     877                if localRole in self._localRole2TrustedHost: 
    859878                     
    860879                    if trustedHost not in \ 
    861                        self.__localRole2TrustedHost[localRole]: 
    862                         self.__localRole2TrustedHost[localRole].\ 
     880                       self._localRole2TrustedHost[localRole]: 
     881                        self._localRole2TrustedHost[localRole].\ 
    863882                                                        append(trustedHost)                         
    864883                else: 
    865                     self.__localRole2TrustedHost[localRole] = [trustedHost] 
     884                    self._localRole2TrustedHost[localRole] = [trustedHost] 
    866885 
    867886 
     
    869888                # map look-ups 
    870889                try: 
    871                     self.__remoteRole2LocalRole[trustedHost][remoteRole].\ 
     890                    self._remoteRole2LocalRole[trustedHost][remoteRole].\ 
    872891                                                            append(localRole)                   
    873892                except KeyError: 
    874                     self.__remoteRole2LocalRole[trustedHost][remoteRole] = \ 
     893                    self._remoteRole2LocalRole[trustedHost][remoteRole] = \ 
    875894                                                                [localRole] 
    876895                     
    877896                try: 
    878                     self.__localRole2RemoteRole[trustedHost][localRole].\ 
     897                    self._localRole2RemoteRole[trustedHost][localRole].\ 
    879898                                                            append(remoteRole)                   
    880899                except KeyError: 
    881                     self.__localRole2RemoteRole[trustedHost][localRole] = \ 
    882                                                                 [remoteRole]                   
    883         log.info('Loaded map configuration file "%s"' % \ 
    884                  self.__prop['mapConfigFile']) 
    885  
    886         
    887     def userIsRegistered(self, userId): 
    888         """Check a particular user is registered with the Data Centre that the 
    889         Attribute Authority represents 
    890          
    891         Nb. this method is not used internally by AttributeAuthority class and is 
    892         not a required part of the AAUserRoles API 
    893          
    894         @type userId: string  
    895         @param userId: user identity - could be a X500 Distinguished Name 
    896         @rtype: bool 
    897         @return: True if user is registered, False otherwise""" 
    898         log.debug("Calling userIsRegistered ...") 
    899         return self.__userRoles.userIsRegistered(userId) 
     900                    self._localRole2RemoteRole[trustedHost][localRole] = \ 
     901                                                                [remoteRole] 
     902         
     903        # Store trusted host info look-up for retrieval by getTrustedHostInfo 
     904        # method                                                                          
     905        # 
     906        # Nb. {}.fromkeys([...]).keys() is a fudge to get unique elements 
     907        # from a list i.e. convert the list elements to a dict eliminating 
     908        # duplicated elements and convert the keys back into a list. 
     909        self._trustedHostInfo = dict( 
     910        [ 
     911            ( 
     912                k,  
     913                { 
     914                    'siteName':             v['siteName'], 
     915                    'aaURI':                v['aaURI'],  
     916                    'aaDN':                 v['aaDN'],  
     917                    'loginURI':             v['loginURI'],  
     918                    'loginServerDN':        v['loginServerDN'],  
     919                    'loginRequestServerDN': v['loginRequestServerDN'],  
     920                    'role':                 {}.fromkeys([role['remote']  
     921                                                         for role in v['role']] 
     922                                                       ).keys() 
     923                } 
     924            ) for k, v in self._mapConfig['trustedHosts'].items() 
     925        ]) 
     926 
     927        log.info('Loaded map configuration file "%s"' %  
     928                 self._prop['mapConfigFile']) 
    900929        
    901930         
     
    919948        
    920949         
    921     def __getHostInfo(self): 
     950    def _getHostInfo(self): 
    922951        """Return the host that this Attribute Authority represents: its ID, 
    923952        the user login URI and WSDL address.  Call this method via the 
     
    928957        configuration""" 
    929958         
    930         return self.__mapConfig['thisHost'] 
    931          
    932     hostInfo = property(fget=__getHostInfo,  
     959        return self._mapConfig['thisHost'] 
     960         
     961    hostInfo = property(fget=_getHostInfo,  
    933962                        doc="Return information about this host") 
    934963        
     
    952981        log.debug('Calling getTrustedHostInfo with role = "%s" ...' % role)  
    953982                                  
    954         if not self.__mapConfig or not self.__localRole2RemoteRole: 
     983        if not self._mapConfig or not self._localRole2RemoteRole: 
    955984            # This Attribute Authority has no trusted hosts 
    956985            raise AttributeAuthorityNoTrustedHosts("The %s Attribute " 
    957986                                                   "Authority has no trusted " 
    958987                                                   "hosts" %  
    959                                                    self.__prop['name']) 
     988                                                   self._prop['name']) 
    960989 
    961990 
    962991        if role is None: 
    963             # No role input - return all trusted hosts with their WSDL URIs 
     992            # No role input - return all trusted hosts with their service URIs 
    964993            # and the remote roles they map to 
    965             # 
    966             # Nb. {}.fromkeys([...]).keys() is a fudge to get unique elements 
    967             # from a list i.e. convert the list elements to a dict eliminating 
    968             # duplicated elements and convert the keys back into a list. 
    969             trustedHostInfo = dict( 
    970             [ 
    971                 ( 
    972                     k,  
    973                     { 
    974                         'aaURI':                v['aaURI'],  
    975                         'aaDN':                 v['aaDN'],  
    976                         'loginURI':             v['loginURI'],  
    977                         'loginServerDN':        v['loginServerDN'],  
    978                         'loginRequestServerDN': v['loginRequestServerDN'],  
    979                         'role':        {}.fromkeys( 
    980                             [role['remote'] for role in v['role']] 
    981                         ).keys() 
    982                     } 
    983                 ) for k, v in self.__mapConfig['trustedHosts'].items() 
    984             ]) 
     994            return self._trustedHostInfo 
    985995 
    986996        else:            
    987997            # Get trusted hosts for given input local role         
    988998            try: 
    989                 trustedHosts = self.__localRole2TrustedHost[role] 
     999                trustedHosts = self._localRole2TrustedHost[role] 
    9901000            except: 
    9911001                raise AttributeAuthorityNoMatchingRoleInTrustedHosts( 
     
    9941004     
    9951005     
    996             # Get associated WSDL URI and roles for the trusted hosts  
     1006            # Get associated Web service URI and roles for the trusted hosts  
    9971007            # identified and return as a dictionary indexed by host name 
    9981008            trustedHostInfo = dict( 
    999    [( 
    1000         host,  
    1001         { 
    1002             'aaURI': self.__mapConfig['trustedHosts'][host]['aaURI'], 
    1003             'aaDN': self.__mapConfig['trustedHosts'][host]['aaDN'], 
    1004             'loginURI': self.__mapConfig['trustedHosts'][host]['loginURI'], 
    1005             'loginServerDN':  
    1006             self.__mapConfig['trustedHosts'][host]['loginServerDN'], 
    1007             'loginRequestServerDN':  
    1008             self.__mapConfig['trustedHosts'][host]['loginRequestServerDN'], 
    1009             'role': self.__localRole2RemoteRole[host][role] 
    1010         } 
    1011     ) for host in trustedHosts]) 
     1009       [( 
     1010            host,  
     1011            { 
     1012                'siteName': self._mapConfig['trustedHosts'][host]['siteName'], 
     1013                'aaURI':    self._mapConfig['trustedHosts'][host]['aaURI'], 
     1014                'aaDN':     self._mapConfig['trustedHosts'][host]['aaDN'], 
     1015                'loginURI': self._mapConfig['trustedHosts'][host]['loginURI'], 
     1016                'loginServerDN':  
     1017                        self._mapConfig['trustedHosts'][host]['loginServerDN'], 
     1018                'loginRequestServerDN':  
     1019                self._mapConfig['trustedHosts'][host]['loginRequestServerDN'], 
     1020                'role':     self._localRole2RemoteRole[host][role] 
     1021            } 
     1022        ) for host in trustedHosts]) 
    10121023                          
    1013         return trustedHostInfo 
     1024            return trustedHostInfo 
    10141025        
    10151026         
     
    10231034        @return: list of mapped roles""" 
    10241035 
    1025         if not self.__remoteRole2LocalRole: 
     1036        if not self._remoteRole2LocalRole: 
    10261037            raise AttributeAuthorityError("Roles map is not set - ensure "  
    10271038                                    "readMapConfig() has been called.") 
     
    10301041        # Check the host name is a trusted one recorded in the map 
    10311042        # configuration 
    1032         if not self.__remoteRole2LocalRole.has_key(trustedHost): 
     1043        if not self._remoteRole2LocalRole.has_key(trustedHost): 
    10331044            return [] 
    10341045 
     
    10361047        localRoles = [] 
    10371048        for trustedRole in trustedHostRoles: 
    1038             if trustedRole in self.__remoteRole2LocalRole[trustedHost]: 
     1049            if trustedRole in self._remoteRole2LocalRole[trustedHost]: 
    10391050                localRoles.extend(\ 
    1040                         self.__remoteRole2LocalRole[trustedHost][trustedRole]) 
     1051                        self._remoteRole2LocalRole[trustedHost][trustedRole]) 
    10411052                 
    10421053        return localRoles 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/zsi/attributeauthority/AttributeAuthority_services_server.py

    r4521 r4713  
    2020        <xsd:sequence> 
    2121          <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"hostname\" type=\"xsd:string\"/> 
     22          <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"siteName\" type=\"xsd:string\"/> 
    2223          <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"aaURI\" type=\"xsd:string\"/> 
    2324          <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"aaDN\" type=\"xsd:string\"/> 
     
    5657          <xsd:sequence> 
    5758            <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"hostname\" type=\"xsd:string\"/> 
     59            <xsd:element maxOccurs=\"1\" minOccurs=\"0\" name=\"siteName\" type=\"xsd:string\"/> 
    5860            <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"aaURI\" type=\"xsd:string\"/> 
    5961            <xsd:element maxOccurs=\"1\" minOccurs=\"1\" name=\"aaDN\" type=\"xsd:string\"/> 
     
    244246        # If we have an implementation object, copy the result  
    245247        if hasattr(self,'impl'): 
    246             # Should have a tuple of 6 args 
     248            # Should have a tuple of 7 args 
    247249            result._hostname = parameters[0] 
    248             result._aaURI = parameters[1] 
    249             result._aaDN = parameters[2] 
    250             result._loginURI = parameters[3] 
    251             result._loginServerDN = parameters[4] 
    252             result._loginRequestServerDN = parameters[5] 
     250            result._siteName = parameters[1] 
     251            result._aaURI = parameters[2] 
     252            result._aaDN = parameters[3] 
     253            result._loginURI = parameters[4] 
     254            result._loginServerDN = parameters[5] 
     255            result._loginRequestServerDN = parameters[6] 
    253256        return result 
    254257 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/zsi/attributeauthority/__init__.py

    r4680 r4713  
    117117         
    118118        response.Hostname = self.aa.hostInfo.keys()[0] 
     119        response.SiteName = self.aa.hostInfo[response.Hostname]['siteName'] 
    119120        response.AaURI = self.aa.hostInfo[response.Hostname]['aaURI'] 
    120121        response.AaDN = self.aa.hostInfo[response.Hostname]['aaDN'] 
     
    152153        hosts[0].Hostname = self.aa.hostInfo.keys()[0] 
    153154         
    154         hosts[0].AaURI = \ 
    155             self.aa.hostInfo[hosts[0].Hostname]['aaURI'] 
    156         hosts[0].AaDN = \ 
    157             self.aa.hostInfo[hosts[0].Hostname]['aaDN'] 
    158  
     155        hosts[0].AaURI = self.aa.hostInfo[hosts[0].Hostname]['aaURI'] 
     156        hosts[0].SiteName = self.aa.hostInfo[hosts[0].Hostname]['siteName'] 
     157        hosts[0].AaDN = self.aa.hostInfo[hosts[0].Hostname]['aaDN'] 
    159158        hosts[0].LoginURI = self.aa.hostInfo[hosts[0].Hostname]['loginURI'] 
    160159        hosts[0].LoginServerDN = \ 
     
    168167             
    169168            host.Hostname = hostname 
     169            host.SiteName = hostInfo['siteName'] 
    170170            host.AaURI = hostInfo['aaURI'] 
    171171            host.AaDN = hostInfo['aaDN'] 
     
    204204             
    205205            trustedHost.Hostname = hostname 
     206            trustedHost.SiteName = hostInfo['siteName'] 
    206207            trustedHost.AaURI = hostInfo['aaURI'] 
    207208            trustedHost.AaDN = hostInfo['aaDN'] 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/attributeauthority/siteA/siteAMapConfig.xml

    r4654 r4713  
    22<AAmap> 
    33    <thisHost name="Site A"> 
     4                <siteName>The A Centre for Research</siteName> 
    45        <aaURI>http://localhost:5000/AttributeAuthority</aaURI> 
    56        <loginURI>https://localhost/login</loginURI> 
     
    1718    </trusted> 
    1819    <trusted name="Site D"> 
     20                <siteName>The D Research Laboratory</siteName> 
    1921        <aaURI>http://aa.sited.blah</aaURI> 
    2022        <loginURI>https://www.sited.blah/login</loginURI> 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/attributeauthorityclient/test_attributeauthorityclient.py

    r4680 r4713  
    125125            for k, v in hostInfo.items(): 
    126126                self.assert_(k, "hostInfo value key unset") 
    127                 self.assert_(v, "%s value not set" % k) 
    128127                    
    129128        print "Trusted Host Info:\n %s" % trustedHostInfo 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/credentialwallet/credWallet.cfg

    r4680 r4713  
    1616 
    1717# CA certificates for Attribute Certificate signature validation 
    18 caCertFilePathList=$NDGSEC_CREDWALLET_UNITTEST_DIR/ca/ndg-test-ca.crt 
     18caCertFilePathList=%(here)s/ca/ndg-test-ca.crt 
    1919 
    2020# CA certificates for SSL connection peer cert. validation 
    21 sslCACertFilePathList=$NDGSEC_CREDWALLET_UNITTEST_DIR/ca/ndg-test-ca.crt 
     21sslCACertFilePathList=%(here)s/ca/ndg-test-ca.crt 
    2222 
    2323# See attAuthority unit tests to get this service running 
     
    5151# method will add this to the BinarySecurityToken element of the WSSE header.   
    5252# binSecTokValType attribute must be set to 'X509' or 'X509v3' ValueType.   
    53 wssecurity.signingCertFilePath=$NDGSEC_CREDWALLET_UNITTEST_DIR/clnt.crt 
     53wssecurity.signingCertFilePath=%(here)s/clnt.crt 
    5454 
    5555# ... or provide file path to PEM encoded private key file 
Note: See TracChangeset for help on using the changeset viewer.