Changeset 5648


Ignore:
Timestamp:
20/08/09 16:30:16 (10 years ago)
Author:
pjkersha
Message:

ndg.security.server.attributeauthority.AttributeAuthority?: added samlAttributeQuery method and new AttributeInterface?.getAttributes plugin class method to enable SAML support as need for ESG.

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

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/python/Makefile

    r5592 r5648  
    11# 
    2 # NERC Data Grid Project 
     2# NERC DataGrid Project 
    33# 
    44# @author P J Kershaw 15/03/07 
     
    2121                cd $$dir; \ 
    2222                ${PYTHON} setup.py bdist_egg; \ 
     23                cd ..; \ 
     24        done; 
     25 
     26develop: 
     27        @-for dir in ${EGG_DIRS}; do \ 
     28                cd $$dir; \ 
     29                ${PYTHON} setup.py develop; \ 
    2330                cd ..; \ 
    2431        done; 
  • TI12-security/trunk/python/Tests/pylonsAttributeAuthority/ndgsecurity/development.ini

    r4233 r5648  
    3030 
    3131[filter:AttributeAuthorityFilter] 
    32 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     32paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    3333ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
    3434referencedFilters = wsseSignatureVerificationFilter01 
  • TI12-security/trunk/python/ndg.security.saml/saml/common/__init__.py

    r5620 r5648  
    8686    def __ne__(self, version): 
    8787        return self.__eq__(version) 
    88      
     88             
     89    def __gt__(self, version):                 
     90        if isinstance(version, basestring): 
     91            return self.__version > SAMLVersion.valueOf(version) 
     92        elif isinstance(version, (tuple, list)): 
     93            return self.__version > tuple(version) 
     94        else: 
     95            raise TypeError("Expecting string, tuple or list type for SAML " 
     96                            "version comparison; got %r" % version) 
     97             
     98    def __lt__(self, version): 
     99        if isinstance(version, basestring): 
     100            return self.__version < SAMLVersion.valueOf(version) 
     101        elif isinstance(version, (tuple, list)): 
     102            return self.__version < tuple(version) 
     103        else: 
     104            raise TypeError("Expecting string, tuple or list type for SAML " 
     105                            "version comparison; got %r" % version) 
     106             
     107    def __ge__(self, version):                 
     108        if isinstance(version, basestring): 
     109            return self.__version >= SAMLVersion.valueOf(version) 
     110        elif isinstance(version, (tuple, list)): 
     111            return self.__version >= tuple(version) 
     112        else: 
     113            raise TypeError("Expecting string, tuple or list type for SAML " 
     114                            "version comparison; got %r" % version) 
     115             
     116    def __le__(self, version):                 
     117        if isinstance(version, basestring): 
     118            return self.__version <= SAMLVersion.valueOf(version) 
     119        elif isinstance(version, (tuple, list)): 
     120            return self.__version <= tuple(version) 
     121        else: 
     122            raise TypeError("Expecting string, tuple or list type for SAML " 
     123                            "version comparison; got %r" % version) 
     124    
    89125    @staticmethod 
    90126    def valueOf(version): 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/attributeauthority.py

    r5644 r5648  
    1111__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1212__revision__ = '$Id:attributeauthority.py 4367 2008-10-29 09:27:59Z pjkersha $' 
    13  
    14 import types 
    15  
    16  
    17 # Create unique names for attribute certificates 
    18 import tempfile 
     13import logging 
     14log = logging.getLogger(__name__) 
     15 
    1916import os 
    20  
    21 # Alter system path for dynamic import of user roles class 
    22 import sys 
     17import re 
    2318 
    2419# For parsing of properties file 
     
    2924    import cElementTree as ElementTree 
    3025 
    31 import logging 
    32 log = logging.getLogger(__name__) 
    33  
    34 import re 
     26# SAML 2.0 Attribute Query Support - added 20/08/2009 
     27from uuid import uuid4 
     28from datetime import datetime, timedelta 
     29from saml.saml2.core import Response, Assertion, Attribute, AttributeValue, \ 
     30    AttributeStatement, SAMLVersion, Subject, NameID, Issuer, AttributeQuery, \ 
     31    XSStringAttributeValue, XSGroupRoleAttributeValue, Conditions, Status, \ 
     32    StatusCode 
     33     
     34from saml.common.xml import SAMLConstants 
     35from saml.xml.etree import AssertionElementTree, AttributeQueryElementTree, \ 
     36    ResponseElementTree, XSGroupRoleAttributeValueElementTree 
    3537 
    3638from ndg.security.common.utils import TypedList 
     39from ndg.security.common.utils.classfactory import instantiateClass 
    3740from ndg.security.common.utils.configfileparsers import \ 
    3841    CaseSensitiveConfigParser 
    3942     
    40 # X509 Certificate handling 
     43# X.509 Certificate handling 
    4144from ndg.security.common.X509 import X509Cert 
    4245 
    4346# NDG Attribute Certificate 
    44 from ndg.security.common.AttCert import AttCert, AttCertRead, AttCertParse 
    45  
    46 from ndg.security.common.utils.configfileparsers import \ 
    47     readAndValidateProperties 
    48 from ndg.security.common.utils.classfactory import instantiateClass 
     47from ndg.security.common.AttCert import AttCert 
     48 
    4949 
    5050class AttributeAuthorityError(Exception): 
     
    5353        log.error(msg) 
    5454        Exception.__init__(self, msg) 
     55 
    5556 
    5657class AttributeAuthorityConfigError(Exception): 
     
    6162        Exception.__init__(self, msg) 
    6263         
     64         
    6365class AttributeAuthorityAccessDenied(AttributeAuthorityError): 
    6466    """NDG Attribute Authority - access denied exception. 
     
    6769    but that the request is otherwise valid.  In all other error cases raise 
    6870    AttributeAuthorityError"""    
    69  
     71     
     72     
    7073class AttributeAuthorityNoTrustedHosts(AttributeAuthorityError): 
    7174    """Raise from getTrustedHosts if there are no trusted hosts defined in 
    7275    the map configuration""" 
     76 
    7377 
    7478class AttributeAuthorityNoMatchingRoleInTrustedHosts(AttributeAuthorityError): 
     
    132136        'caCertFilePathList':   [], 
    133137        'attCertLifetime':      -1, 
    134         'attCertNotBeforeOff':  0, 
     138        'attCertNotBeforeOff':  0., 
    135139        'attCertFileName':      '', 
    136140        'attCertFileLogCnt':    0, 
     
    403407                           doc="Distinguished Name separator character used " 
    404408                               "with X.509 Certificate issuer certificate") 
    405      
    406     mapConfig = property(fget=_getMapConfig,  
    407                          doc="MapConfig object") 
    408  
    409     cert = property(fget=_getCert,  
    410                     fset=_setCert,  
    411                     doc="X.509 Issuer Certificate") 
    412  
    413     issuer = property(fget=_getIssuer,  
    414                       fset=_setIssuer,  
    415                       doc="Issuer name") 
    416  
    417     issuerSerialNumber = property(fget=_getIssuerSerialNumber,  
    418                                   fset=_setIssuerSerialNumber,  
    419                                   doc="Issuer Serial Number") 
    420  
    421     attCertLog = property(fget=_getAttCertLog, 
    422                           fset=_setAttCertLog,  
    423                           doc="Attribute certificate logging object") 
    424  
    425     name = property(fget=_getName,  
    426                     fset=_setName,  
    427                     doc="Issuer organisation name") 
    428  
    429     attCertLifetime = property(fget=_getAttCertLifetime,  
    430                                fset=_setAttCertLifetime,  
    431                                doc="Attribute certificate lifetime") 
    432  
    433     attCertNotBeforeOff = property(fget=_getAttCertNotBeforeOff,  
    434                                    fset=_setAttCertNotBeforeOff,  
    435                                    doc="Attribute certificate clock skew in " 
    436                                        "seconds") 
    437  
    438     attCertDir = property(fget=_getAttCertDir,  
    439                           fset=_setAttCertDir,  
    440                           doc="Attribute certificate log directory") 
    441  
    442     attributeInterface = property(fget=_getAttributeInterface,  
    443                                   doc="Attribute Interface object") 
    444  
    445     name = property(fget=_getName, fset=_setName, doc="Organisation Name") 
    446  
    447     trustedHostInfo = property(fget=_getTrustedHostInfo,  
    448                                fset=_setTrustedHostInfo,  
    449                                doc="Dictionary of trusted organisations") 
    450          
    451     @classmethod 
    452     def fromPropertyFile(cls, propFilePath=None, propFileSection='DEFAULT', 
    453                          propPrefix='attributeauthority.',  
    454                          bReadMapConfig=True): 
    455         """Create new NDG Attribute Authority instance from the property file 
    456         settings 
    457  
    458         @type propFilePath: string 
    459         @param propFilePath: path to file containing Attribute Authority 
    460         configuration parameters.  It defaults to $NDGSEC_AA_PROPFILEPATH or 
    461         if not set, $NDGSEC_DIR/conf/attributeAuthority.cfg 
    462         @type propFileSection: basestring 
    463         @param propFileSection: section of properties file to read from. 
    464         properties files 
    465         @type propPrefix: basestring 
    466         @param propPrefix: set a prefix for filtering attribute authority 
    467         property names - useful where properties are being parsed from a file 
    468         section containing parameter names for more than one application 
    469         @type bReadMapConfig: boolean 
    470         @param bReadMapConfig: by default the Map Configuration file is  
    471         read.  Set this flag to False to override. 
    472         """ 
    473              
    474         attributeAuthority = AttributeAuthority() 
    475         if propFileSection: 
    476             attributeAuthority.propFileSection = propFileSection 
    477              
    478         if propPrefix: 
    479             attributeAuthority.propPrefix = propPrefix 
    480  
    481         attributeAuthority.propFilePath = propFilePath             
    482         attributeAuthority.readProperties() 
    483         attributeAuthority.initialise(bReadMapConfig=bReadMapConfig) 
    484      
    485         return attributeAuthority 
    486  
    487          
    488     @classmethod 
    489     def fromProperties(cls, propPrefix='attributeauthority.',  
    490                        bReadMapConfig=True, **prop): 
    491         """Create new NDG Attribute Authority instance from input property 
    492         keywords 
    493  
    494         @type propPrefix: basestring 
    495         @param propPrefix: set a prefix for filtering attribute authority 
    496         property names - useful where properties are being parsed from a file 
    497         section containing parameter names for more than one application 
    498         @type bReadMapConfig: boolean 
    499         @param bReadMapConfig: by default the Map Configuration file is  
    500         read.  Set this flag to False to override. 
    501         """ 
    502         attributeAuthority = AttributeAuthority() 
    503         if propPrefix: 
    504             attributeAuthority.propPrefix = propPrefix 
    505                 
    506         attributeAuthority.setProperties(**prop) 
    507         attributeAuthority.initialise(bReadMapConfig=bReadMapConfig) 
    508          
    509         return attributeAuthority 
    510      
    511     def initialise(self, bReadMapConfig=True): 
    512         """Convenience method for set up of Attribute Interface, map 
    513         configuration and PKI""" 
    514          
    515         # Read the Map Configuration file 
    516         if bReadMapConfig: 
    517             self.readMapConfig() 
    518  
    519         # Instantiate Certificate object 
    520         log.debug("Reading and checking Attribute Authority X.509 cert. ...") 
    521         self.cert = X509Cert.Read(self.signingCertFilePath) 
    522  
    523         # Check it's valid 
    524         try: 
    525             self.cert.isValidTime(raiseExcep=True) 
    526              
    527         except Exception, e: 
    528             raise AttributeAuthorityError("Attribute Authority's certificate " 
    529                                           "is invalid: %s" % e) 
    530          
    531         # Check CA certificate 
    532         log.debug("Reading and checking X.509 CA certificate ...") 
    533         for caCertFile in self.caCertFilePathList: 
    534             caCert = X509Cert(caCertFile) 
    535             caCert.read() 
    536              
    537             try: 
    538                 caCert.isValidTime(raiseExcep=True) 
    539                  
    540             except Exception, e: 
    541                 raise AttributeAuthorityError('CA certificate "%s" is ' 
    542                                               'invalid: %s'% (caCert.dn, e)) 
    543          
    544         # Issuer details - serialise using the separator string set in the 
    545         # properties file 
    546         self.issuer = self.cert.dn.serialise(separator=self.dnSeparator) 
    547  
    548         self.issuerSerialNumber = self.cert.serialNumber 
    549          
    550         # Load user - user attribute look-up plugin  
    551         self.initAttributeInterface() 
    552          
    553         attCertFilePath = os.path.join(self.attCertDir, self.attCertFileName) 
    554                  
    555         # Rotating file handler used for logging attribute certificates  
    556         # issued. 
    557         self.attCertLog = AttCertLog(attCertFilePath, 
    558                                      backUpCnt=self.attCertFileLogCnt) 
    559  
    560     def setProperties(self, **prop): 
    561         """Set configuration from an input property dictionary 
    562         @type prop: dict 
    563         @param prop: properties dictionary containing configuration items 
    564         to be set 
    565         """ 
    566         lenPropPrefix = len(self.propPrefix) 
    567          
    568         # '+ 1' allows for the dot separator  
    569         lenAttributeInterfacePrefix = len( 
    570                             AttributeAuthority.ATTRIBUTE_INTERFACE_KEYNAME) + 1 
    571          
    572         for name, val in prop.items(): 
    573             if name.startswith(self.propPrefix): 
    574                 name = name[lenPropPrefix:] 
    575              
    576             if name.startswith(AttributeAuthority.ATTRIBUTE_INTERFACE_KEYNAME): 
    577                 name = name[lenAttributeInterfacePrefix:] 
    578                 self.attributeInterfaceCfg[name] = val 
    579                 continue 
    580              
    581             if name not in AttributeAuthority.propertyDefaults: 
    582                 raise AttributeError('Invalid attribute name "%s"' % name) 
    583              
    584             if isinstance(val, basestring): 
    585                 val = os.path.expandvars(val) 
    586              
    587             if isinstance(AttributeAuthority.propertyDefaults[name], list): 
    588                 val = AttributeAuthority.CONFIG_LIST_SEP_PAT.split(val) 
    589                  
    590             # This makes an implicit call to the appropriate property method 
    591             try: 
    592                 setattr(self, name, val) 
    593             except AttributeError: 
    594                 raise AttributeError("Can't set attribute \"%s\"" % name)           
    595              
    596     def readProperties(self): 
    597         '''Read the properties files and do some checking/converting of input  
    598         values 
    599         ''' 
    600         if not os.path.isfile(self.propFilePath): 
    601             raise IOError('Error parsing properties file "%s": No such file' %  
    602                           self.propFilePath) 
    603              
    604         defaultItems = {'here': os.path.dirname(self.propFilePath)} 
    605          
    606         cfg = CaseSensitiveConfigParser(defaults=defaultItems) 
    607         cfg.read(self.propFilePath) 
    608          
    609         cfgItems = dict([(name, val)  
    610                          for name, val in cfg.items(self.propFileSection) 
    611                          if name != 'here']) 
    612         self.setProperties(**cfgItems) 
    613  
    614     def initAttributeInterface(self): 
    615         '''Load host sites custom user roles interface to enable the AA to 
    616         # assign roles in an attribute certificate on a getAttCert request''' 
    617         classProperties = {} 
    618         classProperties.update(self.attributeInterfaceCfg) 
    619          
    620         modName = classProperties.pop('modName') 
    621         className = classProperties.pop('className')   
    622          
    623         # file path may be omitted     
    624         modFilePath = classProperties.pop('modFilePath', None)  
    625                        
    626         self.__attributeInterface = instantiateClass(modName, 
    627                                              className, 
    628                                              moduleFilePath=modFilePath, 
    629                                              objectType=AttributeInterface, 
    630                                              classProperties=classProperties) 
     409             
     410    def _getMapConfigFilePath(self): 
     411        return self.__mapConfigFilePath 
     412     
     413    def _setMapConfigFilePath(self, val): 
     414        if not isinstance(val, basestring): 
     415            raise AttributeAuthorityConfigError("Input Map Configuration " 
     416                                                "file path must be a " 
     417                                                "valid string.") 
     418        self.__mapConfigFilePath = val 
     419           
     420    mapConfigFilePath = property(fget=_getMapConfigFilePath, 
     421                                 fset=_setMapConfigFilePath, 
     422                                 doc="File path for Role Mapping configuration")  
    631423 
    632424    def setPropFilePath(self, val=None): 
     
    739531                          fget=getPropPrefix, 
    740532                          doc="Set a prefix for ini file properties")    
     533     
     534    mapConfig = property(fget=_getMapConfig,  
     535                         doc="MapConfig object") 
     536 
     537    cert = property(fget=_getCert,  
     538                    fset=_setCert,  
     539                    doc="X.509 Issuer Certificate") 
     540 
     541    issuer = property(fget=_getIssuer,  
     542                      fset=_setIssuer,  
     543                      doc="Issuer name") 
     544 
     545    issuerSerialNumber = property(fget=_getIssuerSerialNumber,  
     546                                  fset=_setIssuerSerialNumber,  
     547                                  doc="Issuer Serial Number") 
     548 
     549    attCertLog = property(fget=_getAttCertLog, 
     550                          fset=_setAttCertLog,  
     551                          doc="Attribute certificate logging object") 
     552 
     553    name = property(fget=_getName,  
     554                    fset=_setName,  
     555                    doc="Issuer organisation name") 
     556 
     557    attCertLifetime = property(fget=_getAttCertLifetime,  
     558                               fset=_setAttCertLifetime,  
     559                               doc="Attribute certificate lifetime") 
     560 
     561    attCertNotBeforeOff = property(fget=_getAttCertNotBeforeOff,  
     562                                   fset=_setAttCertNotBeforeOff,  
     563                                   doc="Attribute certificate clock skew in " 
     564                                       "seconds") 
     565 
     566    attCertDir = property(fget=_getAttCertDir,  
     567                          fset=_setAttCertDir,  
     568                          doc="Attribute certificate log directory") 
     569 
     570    attributeInterface = property(fget=_getAttributeInterface,  
     571                                  doc="Attribute Interface object") 
     572 
     573    name = property(fget=_getName, fset=_setName, doc="Organisation Name") 
     574 
     575    trustedHostInfo = property(fget=_getTrustedHostInfo,  
     576                               fset=_setTrustedHostInfo,  
     577                               doc="Dictionary of trusted organisations") 
     578         
     579    @classmethod 
     580    def fromPropertyFile(cls, propFilePath=None, propFileSection='DEFAULT', 
     581                         propPrefix='attributeauthority.',  
     582                         bReadMapConfig=True): 
     583        """Create new NDG Attribute Authority instance from the property file 
     584        settings 
     585 
     586        @type propFilePath: string 
     587        @param propFilePath: path to file containing Attribute Authority 
     588        configuration parameters.  It defaults to $NDGSEC_AA_PROPFILEPATH or 
     589        if not set, $NDGSEC_DIR/conf/attributeAuthority.cfg 
     590        @type propFileSection: basestring 
     591        @param propFileSection: section of properties file to read from. 
     592        properties files 
     593        @type propPrefix: basestring 
     594        @param propPrefix: set a prefix for filtering attribute authority 
     595        property names - useful where properties are being parsed from a file 
     596        section containing parameter names for more than one application 
     597        @type bReadMapConfig: boolean 
     598        @param bReadMapConfig: by default the Map Configuration file is  
     599        read.  Set this flag to False to override. 
     600        """ 
     601             
     602        attributeAuthority = AttributeAuthority() 
     603        if propFileSection: 
     604            attributeAuthority.propFileSection = propFileSection 
     605             
     606        if propPrefix: 
     607            attributeAuthority.propPrefix = propPrefix 
     608 
     609        attributeAuthority.propFilePath = propFilePath             
     610        attributeAuthority.readProperties() 
     611        attributeAuthority.initialise(bReadMapConfig=bReadMapConfig) 
     612     
     613        return attributeAuthority 
     614 
     615         
     616    @classmethod 
     617    def fromProperties(cls, propPrefix='attributeauthority.',  
     618                       bReadMapConfig=True, **prop): 
     619        """Create new NDG Attribute Authority instance from input property 
     620        keywords 
     621 
     622        @type propPrefix: basestring 
     623        @param propPrefix: set a prefix for filtering attribute authority 
     624        property names - useful where properties are being parsed from a file 
     625        section containing parameter names for more than one application 
     626        @type bReadMapConfig: boolean 
     627        @param bReadMapConfig: by default the Map Configuration file is  
     628        read.  Set this flag to False to override. 
     629        """ 
     630        attributeAuthority = AttributeAuthority() 
     631        if propPrefix: 
     632            attributeAuthority.propPrefix = propPrefix 
     633                
     634        attributeAuthority.setProperties(**prop) 
     635        attributeAuthority.initialise(bReadMapConfig=bReadMapConfig) 
     636         
     637        return attributeAuthority 
     638     
     639    def initialise(self, bReadMapConfig=True): 
     640        """Convenience method for set up of Attribute Interface, map 
     641        configuration and PKI""" 
     642         
     643        # Read the Map Configuration file 
     644        if bReadMapConfig: 
     645            self.readMapConfig() 
     646 
     647        # Instantiate Certificate object 
     648        log.debug("Reading and checking Attribute Authority X.509 cert. ...") 
     649        self.cert = X509Cert.Read(self.signingCertFilePath) 
     650 
     651        # Check it's valid 
     652        try: 
     653            self.cert.isValidTime(raiseExcep=True) 
     654             
     655        except Exception, e: 
     656            raise AttributeAuthorityError("Attribute Authority's certificate " 
     657                                          "is invalid: %s" % e) 
     658         
     659        # Check CA certificate 
     660        log.debug("Reading and checking X.509 CA certificate ...") 
     661        for caCertFile in self.caCertFilePathList: 
     662            caCert = X509Cert(caCertFile) 
     663            caCert.read() 
     664             
     665            try: 
     666                caCert.isValidTime(raiseExcep=True) 
     667                 
     668            except Exception, e: 
     669                raise AttributeAuthorityError('CA certificate "%s" is ' 
     670                                              'invalid: %s'% (caCert.dn, e)) 
     671         
     672        # Issuer details - serialise using the separator string set in the 
     673        # properties file 
     674        self.issuer = self.cert.dn.serialise(separator=self.dnSeparator) 
     675 
     676        self.issuerSerialNumber = self.cert.serialNumber 
     677         
     678        # Load user - user attribute look-up plugin  
     679        self.initAttributeInterface() 
     680         
     681        attCertFilePath = os.path.join(self.attCertDir, self.attCertFileName) 
     682                 
     683        # Rotating file handler used for logging attribute certificates  
     684        # issued. 
     685        self.attCertLog = AttCertLog(attCertFilePath, 
     686                                     backUpCnt=self.attCertFileLogCnt) 
     687 
     688    def setProperties(self, **prop): 
     689        """Set configuration from an input property dictionary 
     690        @type prop: dict 
     691        @param prop: properties dictionary containing configuration items 
     692        to be set 
     693        """ 
     694        lenPropPrefix = len(self.propPrefix) 
     695         
     696        # '+ 1' allows for the dot separator  
     697        lenAttributeInterfacePrefix = len( 
     698                            AttributeAuthority.ATTRIBUTE_INTERFACE_KEYNAME) + 1 
     699         
     700        for name, val in prop.items(): 
     701            if name.startswith(self.propPrefix): 
     702                name = name[lenPropPrefix:] 
     703             
     704            if name.startswith(AttributeAuthority.ATTRIBUTE_INTERFACE_KEYNAME): 
     705                name = name[lenAttributeInterfacePrefix:] 
     706                self.attributeInterfaceCfg[name] = val 
     707                continue 
     708             
     709            if name not in AttributeAuthority.propertyDefaults: 
     710                raise AttributeError('Invalid attribute name "%s"' % name) 
     711             
     712            if isinstance(val, basestring): 
     713                val = os.path.expandvars(val) 
     714             
     715            if isinstance(AttributeAuthority.propertyDefaults[name], list): 
     716                val = AttributeAuthority.CONFIG_LIST_SEP_PAT.split(val) 
     717                 
     718            # This makes an implicit call to the appropriate property method 
     719            try: 
     720                setattr(self, name, val) 
     721            except AttributeError: 
     722                raise AttributeError("Can't set attribute \"%s\"" % name)           
     723             
     724    def readProperties(self): 
     725        '''Read the properties files and do some checking/converting of input  
     726        values 
     727        ''' 
     728        if not os.path.isfile(self.propFilePath): 
     729            raise IOError('Error parsing properties file "%s": No such file' %  
     730                          self.propFilePath) 
     731             
     732        defaultItems = {'here': os.path.dirname(self.propFilePath)} 
     733         
     734        cfg = CaseSensitiveConfigParser(defaults=defaultItems) 
     735        cfg.read(self.propFilePath) 
     736         
     737        cfgItems = dict([(name, val)  
     738                         for name, val in cfg.items(self.propFileSection) 
     739                         if name != 'here']) 
     740        self.setProperties(**cfgItems) 
     741 
     742    def initAttributeInterface(self): 
     743        '''Load host sites custom user roles interface to enable the AA to 
     744        # assign roles in an attribute certificate on a getAttCert request''' 
     745        classProperties = {} 
     746        classProperties.update(self.attributeInterfaceCfg) 
     747         
     748        modName = classProperties.pop('modName') 
     749        className = classProperties.pop('className')   
     750         
     751        # file path may be omitted     
     752        modFilePath = classProperties.pop('modFilePath', None)  
     753                       
     754        self.__attributeInterface = instantiateClass(modName, 
     755                                             className, 
     756                                             moduleFilePath=modFilePath, 
     757                                             objectType=AttributeInterface, 
     758                                             classProperties=classProperties) 
    741759 
    742760    def getAttCert(self, 
     
    927945                # Read externally provided certificate 
    928946                try: 
    929                     userAttCert = AttCertRead(userAttCertFilePath) 
     947                    userAttCert = AttCert.Read(userAttCertFilePath) 
    930948                     
    931949                except Exception, e: 
     
    935953                # Allow input as a string but convert to  
    936954                if isinstance(userAttCert, basestring): 
    937                     userAttCert = AttCertParse(userAttCert) 
     955                    userAttCert = AttCert.Parse(userAttCert) 
    938956                     
    939957                elif not isinstance(userAttCert, AttCert): 
     
    10211039            raise AttributeAuthorityError('New Attribute Certificate "%s": %s'% 
    10221040                                          (attCert.filePath, e)) 
    1023              
    1024     def _getMapConfigFilePath(self): 
    1025         return self.__mapConfigFilePath 
    1026      
    1027     def _setMapConfigFilePath(self, val): 
    1028         if not isinstance(val, basestring): 
    1029             raise AttributeAuthorityConfigError("Input Map Configuration " 
    1030                                                 "file path must be a " 
    1031                                                 "valid string.") 
    1032         self.__mapConfigFilePath = val 
    1033            
    1034     mapConfigFilePath = property(fget=_getMapConfigFilePath, 
    1035                                  fset=_setMapConfigFilePath, 
    1036                                  doc="File path for Role Mapping configuration")  
    1037          
     1041 
     1042    def samlAttributeQuery(self, attributeQuery): 
     1043        """Respond to SAML 2.0 Attribute Query 
     1044        """ 
     1045        if not isinstance(attributeQuery, AttributeQuery): 
     1046            raise TypeError('Expecting %r for attribute query; got %r' % 
     1047                            (AttributeQuery, type(attributeQuery))) 
     1048            
     1049        samlResponse = Response() 
     1050         
     1051        samlResponse.issueInstant = datetime.utcnow() 
     1052        if self.attCertNotBeforeOff != 0: 
     1053            samlResponse.issueInstant += timedelta( 
     1054                                            seconds=self.attCertNotBeforeOff) 
     1055             
     1056        samlResponse.id = str(uuid4()) 
     1057        samlResponse.issuer = Issuer() 
     1058         
     1059        samlResponse.status = Status() 
     1060        samlResponse.status.statusCode = StatusCode() 
     1061        samlResponse.status.statusCode.value = StatusCode.SUCCESS_URI         
     1062         
     1063        # Attribute Query validation ... 
     1064        utcNow = datetime.utcnow() 
     1065        if attributeQuery.issueInstant >= utcNow: 
     1066            msg = ('SAML Attribute Query issueInstant [%s] is at or after ' 
     1067                   'the current clock time [%s]') % \ 
     1068                   (attributeQuery.issueInstant, SAMLDateTime.toString(utcNow)) 
     1069            log.error(msg) 
     1070                       
     1071            samlResponse.status.statusCode.value = StatusCode.REQUESTER_URI 
     1072            samlResponse.status.statusMessage = msg 
     1073            return samlResponse 
     1074             
     1075        elif attributeQuery.version < SAMLVersion.VERSION_20: 
     1076            samlResponse.status.statusCode.value = \ 
     1077                                        StatusCode.REQUEST_VERSION_TOO_LOW_URI 
     1078            return samlResponse 
     1079         
     1080        elif attributeQuery.version > SAMLVersion.VERSION_20: 
     1081            samlResponse.status.statusCode.value = \ 
     1082                                        StatusCode.REQUEST_VERSION_TOO_HIGH_URI 
     1083            return samlResponse 
     1084         
     1085        elif attributeQuery.subject.nameID.format != "urn:esg:openid": 
     1086            log.error('SAML Attribute Query subject format is "%r"; expecting ' 
     1087                      '"%s"' % (attributeQuery.subject.nameID.format, 
     1088                                "urn:esg:openid")) 
     1089            samlResponse.status.statusCode.value = StatusCode.REQUESTER_URI 
     1090            samlResponse.status.statusMessage = \ 
     1091                                "Subject Name ID format is not recognised" 
     1092            return samlResponse 
     1093         
     1094        elif attributeQuery.issuer.format != "urn:esg:issuer": 
     1095            log.error('SAML Attribute Query subject format is "%r"; expecting ' 
     1096                      '"%s"' % (attributeQuery.subject.nameID.format, 
     1097                                "urn:esg:issuer")) 
     1098            samlResponse.status.statusCode.value = StatusCode.REQUESTER_URI 
     1099            samlResponse.status.statusMessage = \ 
     1100                                "Issuer Name ID format is not recognised" 
     1101            return samlResponse 
     1102         
     1103        # Gather requested attributes and pass to attribute interface for 
     1104        # retrieval of values 
     1105        requestedAttributeNames = [attribute.name  
     1106                                   for attribute in attributeQuery.attributes] 
     1107         
     1108        try: 
     1109            # Return a dictionary of name, value pairs 
     1110            attributes = self.getAttributes(attributeQuery.subject.nameID.value, 
     1111                                            requestedAttributeNames, 
     1112                                            attributeQuery.subject.nameID.value) 
     1113        except Exception, e: 
     1114            # TODO: exception handling for requested attributes not allowed  
     1115            # etc. 
     1116            pass 
     1117         
     1118        # Nb. SAML 2.0 spec says issuer format must be omitted 
     1119        samlResponse.issuer.value = self.issuer 
     1120         
     1121        samlResponse.inResponseTo = attributeQuery.id 
     1122         
     1123        # Create a new assertion to hold the attributes to be returned 
     1124        assertion = Assertion() 
     1125         
     1126        assertion.version = SAMLVersion(SAMLVersion.VERSION_20) 
     1127        assertion.id = str(uuid4()) 
     1128        assertion.issueInstant = samlResponse.issueInstant 
     1129         
     1130        assertion.conditions = Conditions() 
     1131        assertion.conditions.notBefore = assertion.issueInstant 
     1132        assertion.conditions.notOnOrAfter = assertion.conditions.notBefore + \ 
     1133            timedelta(seconds=self.attCertLifetime) 
     1134         
     1135        assertion.subject = Subject()   
     1136        assertion.subject.nameID = NameID() 
     1137        assertion.subject.nameID.format = attributeQuery.subject.nameID.format 
     1138        assertion.subject.nameID.value = attributeQuery.subject.nameID.value 
     1139 
     1140        attributeStatement = AttributeStatement() 
     1141         
     1142        for attrName, val in attributes.items(): 
     1143            samlAttribute = Attribute() 
     1144            samlAttribute.name = attrName 
     1145            samlAttribute.nameFormat = samlAttribute.nameFormat 
     1146            samlAttribute.friendlyName = samlAttribute.friendlyName 
     1147             
     1148            samlAttributeValue = XSStringAttributeValue() 
     1149            samlAttributeValue.value = val 
     1150            samlAttribute.attributeValues.append(samlAttributeValue) 
     1151            attributeStatement.attributes.append(samlAttribute) 
     1152  
     1153        assertion.attributeStatements.append(attributeStatement)        
     1154        samlResponse.assertions.append(assertion) 
     1155         
     1156        # Add mapping for ESG Group/Role Attribute Value to enable ElementTree 
     1157        # Attribute Value factory to render the XML output 
     1158        toXMLTypeMap = { 
     1159            XSGroupRoleAttributeValue: XSGroupRoleAttributeValueElementTree 
     1160        } 
     1161 
     1162        return samlResponse 
     1163     
    10381164    def readMapConfig(self): 
    10391165        """Parse Map Configuration file. 
     
    14101536        """ 
    14111537 
    1412  
    14131538    def getRoles(self, userId): 
    14141539        """Virtual method - Derived method should return the roles for the  
     
    14191544        @rtype: list 
    14201545        @return: list of roles for the given user ID""" 
    1421         raise NotImplementedError( 
    1422             self.getRoles.__doc__.replace('\n       ','')) 
    1423                           
     1546        raise NotImplementedError(self.getRoles.__doc__) 
     1547  
     1548    def getAttributes(self, userId, requestedAttributeNames, requestorId): 
     1549        """Virtual method should be implemented in a derived class to enable 
     1550        AttributeAuthority.samlAttributeQuery - The derived method should  
     1551        return the attributes requested for the given user's Id or else raise  
     1552        an exception 
     1553         
     1554        @type userId: string  
     1555        @param userId: user identity e.g. user Distinguished Name 
     1556        @type requestedAttributeNames: list  
     1557        @param requestedAttributeNames: list of attribute names set in the  
     1558        attribute query 
     1559        @type requestorId: basestring 
     1560        @param requestorId: identity of the agent making the attribute query 
     1561        @rtype: dict 
     1562        @return: list of attribute name, value pairs for the given user ID""" 
     1563        raise NotImplementedError(self.getAttributes.__doc__) 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/wsgi/wssecurity.py

    r5516 r5648  
    1717 
    1818from ZSI.writer import SoapWriter 
    19 from ndg.security.common.wssecurity.signaturehandler.foursuite import SignatureHandler 
    20 from ndg.security.server.wsgi.soap import ZSIMiddleware, ZSIMiddlewareError 
     19from ndg.security.common.wssecurity.signaturehandler.foursuite import \ 
     20    SignatureHandler 
     21from ndg.security.server.wsgi.zsi import ZSIMiddleware, ZSIMiddlewareError 
    2122 
    2223class WSSecurityFilterError(ZSIMiddlewareError): 
  • TI12-security/trunk/python/ndg.security.server/ndg/security/server/zsi/attributeauthority/__init__.py

    r5637 r5648  
    5353        # Initialise Attribute Authority class - property file will be 
    5454        # picked up from default location under $NDG_DIR directory 
    55         self.aa = AttributeAuthority(**kw) 
     55        self.aa = AttributeAuthority.fromProperties(**kw) 
    5656 
    5757 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/config/attributeauthority/sitea/site-a.ini

    r5637 r5648  
    1414wsseCfgFilePath = %(here)s/site-a.ini 
    1515wsseCfgFileSection = WS-Security 
     16 
     17[server:main] 
     18use = egg:Paste#http 
     19host = 0.0.0.0 
     20port = 5000 
     21 
     22[app:mainApp] 
     23paste.app_factory = ndg.security.test.config.attributeauthority.sitea.siteAServerApp:app_factory 
     24 
     25# Chain of SOAP Middleware filters 
     26[pipeline:main] 
     27pipeline = wsseSignatureVerificationFilter  
     28                   AttributeAuthorityFilter  
     29                   wsseSignatureFilter  
     30                   mainApp 
     31 
     32 
     33[filter:AttributeAuthorityFilter] 
     34paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
     35ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
     36ServiceSOAPBindingPropPrefix = attributeAuthority 
     37attributeAuthority.wsseSignatureVerificationFilterID = wsseSignatureVerificationFilter01 
    1638 
    1739# Attribute Authority settings 
     
    5173attributeAuthority.caCertFilePathList: $NDGSEC_TEST_CONFIG_DIR/ca/ndg-test-ca.crt 
    5274 
    53 [server:main] 
    54 use = egg:Paste#http 
    55 host = 0.0.0.0 
    56 port = 5000 
    57  
    58 [app:mainApp] 
    59 paste.app_factory = ndg.security.test.config.attributeauthority.sitea.siteAServerApp:app_factory 
    60  
    61 # Chain of SOAP Middleware filters 
    62 [pipeline:main] 
    63 pipeline = wsseSignatureVerificationFilter  
    64                    AttributeAuthorityFilter  
    65                    wsseSignatureFilter  
    66                    mainApp 
    67  
    68  
    69 [filter:AttributeAuthorityFilter] 
    70 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
    71 ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
    72 ServiceSOAPBindingPropPrefix = AttributeAuthority 
    73 AttributeAuthority.propPrefix = attributeAuthority 
    74 AttributeAuthority.propFilePath = %(here)s/site-a.ini 
    75 AttributeAuthority.wsseSignatureVerificationFilterID = wsseSignatureVerificationFilter01 
    7675referencedFilters = wsseSignatureVerificationFilter01 
    7776path = /AttributeAuthority 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/config/attributeauthority/siteb/site-b.ini

    r5637 r5648  
    1414wsseCfgFilePath = %(here)s/site-b.ini 
    1515wsseCfgFileSection = WS-Security 
     16 
     17[server:main] 
     18use = egg:Paste#http 
     19host = 0.0.0.0 
     20port = 5100 
     21 
     22[app:mainApp] 
     23paste.app_factory = ndg.security.test.config.attributeauthority.siteb.siteBServerApp:app_factory 
     24 
     25# Chain of SOAP Middleware filters 
     26[pipeline:main] 
     27pipeline = wsseSignatureVerificationFilter AttributeAuthorityFilter wsseSignatureFilter mainApp 
     28 
     29 
     30[filter:AttributeAuthorityFilter] 
     31paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
     32ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
     33ServiceSOAPBindingPropPrefix = attributeAuthority 
     34attributeAuthority.wsseSignatureVerificationFilterID = wsseSignatureVerificationFilter01 
    1635 
    1736# Attribute Authority settings 
     
    5170attributeAuthority.caCertFilePathList: $NDGSEC_TEST_CONFIG_DIR/ca/ndg-test-ca.crt 
    5271 
    53 [server:main] 
    54 use = egg:Paste#http 
    55 host = 0.0.0.0 
    56 port = 5100 
    57  
    58 [app:mainApp] 
    59 paste.app_factory = ndg.security.test.config.attributeauthority.siteb.siteBServerApp:app_factory 
    60  
    61 # Chain of SOAP Middleware filters 
    62 [pipeline:main] 
    63 pipeline = wsseSignatureVerificationFilter AttributeAuthorityFilter wsseSignatureFilter mainApp 
    64  
    65  
    66 [filter:AttributeAuthorityFilter] 
    67 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
    68 ServiceSOAPBindingClass = ndg.security.server.zsi.attributeauthority.AttributeAuthorityWS 
    69 ServiceSOAPBindingPropPrefix = AttributeAuthority 
    70 AttributeAuthority.propPrefix = attributeAuthority 
    71 AttributeAuthority.propFilePath = %(here)s/site-b.ini 
    72 AttributeAuthority.wsseSignatureVerificationFilterID = wsseSignatureVerificationFilter01 
    7372referencedFilters = wsseSignatureVerificationFilter01 
    7473path = /AttributeAuthority 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/config/sessionmanager/session-manager.ini

    r5465 r5648  
    131131 
    132132[filter:SessionManagerFilter] 
    133 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     133paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    134134ServiceSOAPBindingClass = ndg.security.server.zsi.sessionmanager.SessionManagerWS 
    135135ServiceSOAPBindingPropPrefix = SessionManager 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/authz/securityservices.ini

    r5637 r5648  
    361361# This filter is a container for a binding to a SOAP based interface to the 
    362362# Attribute Authority 
    363 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     363paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    364364 
    365365# Use this ZSI generated SOAP service interface class to handle i/o for this 
     
    406406# This filter is a container for a binding to a SOAP based interface to the 
    407407# Session Manager 
    408 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     408paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    409409 
    410410# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/authz_lite/securityservices.ini

    r5637 r5648  
    233233# This filter is a container for a binding to a SOAP based interface to the 
    234234# Attribute Authority 
    235 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     235paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    236236 
    237237# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/combinedservices/services.ini

    r5637 r5648  
    224224# This filter is a container for a binding to a SOAP based interface to the 
    225225# Attribute Authority 
    226 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     226paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    227227 
    228228# Use this ZSI generated SOAP service interface class to handle i/o for this 
     
    269269# This filter is a container for a binding to a SOAP based interface to the 
    270270# Session Manager 
    271 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     271paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    272272 
    273273# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/openid/securityservices.ini

    r5637 r5648  
    312312# This filter is a container for a binding to a SOAP based interface to the 
    313313# Attribute Authority 
    314 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     314paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    315315 
    316316# Use this ZSI generated SOAP service interface class to handle i/o for this 
     
    357357# This filter is a container for a binding to a SOAP based interface to the 
    358358# Session Manager 
    359 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     359paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    360360 
    361361# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/openidprovider/securityservices.ini

    r5637 r5648  
    278278# This filter is a container for a binding to a SOAP based interface to the 
    279279# Attribute Authority 
    280 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     280paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    281281 
    282282# Use this ZSI generated SOAP service interface class to handle i/o for this 
     
    323323# This filter is a container for a binding to a SOAP based interface to the 
    324324# Session Manager 
    325 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     325paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    326326 
    327327# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/integration/openidrelyingparty_withapp/securityservices.ini

    r5637 r5648  
    180180# This filter is a container for a binding to a SOAP based interface to the 
    181181# Attribute Authority 
    182 paste.filter_app_factory = ndg.security.server.wsgi.soap:SOAPBindingMiddleware 
     182paste.filter_app_factory = ndg.security.server.wsgi.zsi:SOAPBindingMiddleware 
    183183 
    184184# Use this ZSI generated SOAP service interface class to handle i/o for this 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/credentialwallet/test_credentialwallet.py

    r5290 r5648  
    171171                   
    172172        credWallet = CredentialWallet(cfg=self.cfg.get('setUp', 'cfgFilePath')) 
    173         credWallet.attributeAuthority = AttributeAuthority( 
     173        credWallet.attributeAuthority = AttributeAuthority.fromPropertyFile( 
    174174                                            propFilePath=aaPropFilePath) 
    175175        attCert = credWallet.getAttCert() 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/nosetests.ini

    r5560 r5648  
    1313# 
    1414[nosetests] 
    15 exclude: test_ssl 
    1615tests: ./x509/test_x509.py, 
    1716        ./x509/test_x509.py, 
     
    2625        ./openid/relyingparty/validation/test_validation.py, 
    2726        ./xmlsec/etree/test_etree.py, 
    28         ./wsgi/authn/test_authn.py, 
     27#       ./wsgi/authn/test_authn.py, 
    2928#       ./wsgi/ssl/test_ssl.py, 
    3029        ./wsgi/authz/test_authz.py, 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/sessionmanager/test_sessionmanager.py

    r5290 r5648  
    361361        section = 'test12GetAttCertFromLocalAAInstance' 
    362362        aaPropFilePath = self.cfg.get(section, 'aaPropFilePath') 
    363         attributeAuthority=AttributeAuthority(propFilePath=aaPropFilePath) 
     363        attributeAuthority=AttributeAuthority.fromPropertyFile( 
     364                                                propFilePath=aaPropFilePath) 
    364365         
    365366        attCert = self.sm.getAttCert(sessID=self.sessID,  
Note: See TracChangeset for help on using the changeset viewer.