Ignore:
Timestamp:
11/03/10 14:55:42 (10 years ago)
Author:
pjkersha
Message:
  • Working Attribute Authority client unit tests. Configuration parameters such as issuer and flags to test query timestamp and SAML version string have now been moved out of the Attribute Authority to the generic SAML subject Query middleware interface ndg.security.server.wsgi.saml.SOAPQueryInterfaceMiddleware. This could be moved into the SAML egg at a later stage. The AuthzDecisionQuery? interface should be retested to allow for these changes.
Location:
TI12-security/trunk/NDGSecurity/python
Files:
13 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/saml_utils/binding/soap/subjectquery.py

    r6675 r6721  
    221221 
    222222    def _setClockSkewTolerance(self, value): 
    223         if isinstance(value, (float, int, long)): 
     223        if isinstance(value, timedelta): 
     224            self.__clockSkewTolerance = value 
     225             
     226        elif isinstance(value, (float, int, long)): 
    224227            self.__clockSkewTolerance = timedelta(seconds=value) 
    225228             
     
    227230            self.__clockSkewTolerance = timedelta(seconds=float(value)) 
    228231        else: 
    229             raise TypeError('Expecting float, int, long or string type for ' 
    230                             '"clockSkewTolerance"; got %r' % type(value)) 
     232            raise TypeError('Expecting timedelta, float, int, long or string ' 
     233                            'type for "clockSkewTolerance"; got %r' %  
     234                            type(value)) 
    231235 
    232236    clockSkewTolerance = property(fget=_getClockSkewTolerance,  
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/attributeauthority.py

    r6720 r6721  
    1616import os 
    1717import re 
     18import traceback 
    1819 
    1920# For parsing of properties file 
     
    117118 
    118119    __slots__ = ( 
    119         '__issuerName',  
    120120        '__assertionLifetime',  
    121121        '__dnSeparator', 
     
    132132         
    133133        # Initial config file property based attributes 
    134         self.__issuerName = None 
    135134        self.__assertionLifetime = None 
    136135        self.__dnSeparator = None 
     
    159158        for attrName, val in attrDict.items(): 
    160159            setattr(self, attrName, val) 
    161              
    162     def _getIssuerName(self): 
    163         return self.__issuerName 
    164  
    165     def _setIssuerName(self, value): 
    166         if not isinstance(value, basestring): 
    167             raise TypeError('Expecting string type for "issuerName" attribute; ' 
    168                             'got %r' % type(value)) 
    169          
    170         self.__issuerName = value 
    171  
    172     issuerName = property(_getIssuerName, _setIssuerName,  
    173                           doc="Name of Attribute Authority organisation " 
    174                               "issuing a response to a query") 
    175160     
    176161    def _getAssertionLifetime(self): 
     
    435420                setattr(self, name, val) 
    436421            except AttributeError: 
    437                 raise AttributeError("Can't set attribute \"%s\"" % name)           
     422                raise AttributeError("Can't set attribute \"%s\": %s" %  
     423                                     (name, traceback.format_exc())) 
    438424             
    439425    def readProperties(self): 
     
    482468                                             classProperties=classProperties) 
    483469 
    484     def samlAttributeQuery(self, attributeQuery): 
     470    def samlAttributeQuery(self, attributeQuery, samlResponse): 
    485471        """Respond to SAML 2.0 Attribute Query 
    486472        """ 
     
    488474            raise TypeError('Expecting %r for attribute query; got %r' % 
    489475                            (AttributeQuery, type(attributeQuery))) 
    490             
    491         samlResponse = Response() 
    492          
    493         samlResponse.issueInstant = datetime.utcnow() 
    494         if self.attCertNotBeforeOff != 0: 
    495             samlResponse.issueInstant += timedelta( 
    496                                             seconds=self.attCertNotBeforeOff) 
    497              
    498         samlResponse.id = str(uuid4()) 
    499         samlResponse.issuer = Issuer() 
    500          
    501         # Initialise to success status but reset on error 
    502         samlResponse.status = Status() 
    503         samlResponse.status.statusCode = StatusCode() 
    504         samlResponse.status.statusMessage = StatusMessage() 
    505         samlResponse.status.statusCode.value = StatusCode.SUCCESS_URI 
    506          
    507         # Nb. SAML 2.0 spec says issuer format must be omitted 
    508         samlResponse.issuer.value = self.issuer 
    509          
    510         samlResponse.inResponseTo = attributeQuery.id 
    511476         
    512477        # Attribute Query validation ... 
    513478        utcNow = datetime.utcnow() 
    514         if attributeQuery.issueInstant >= utcNow + self.clockSkew: 
    515             msg = ('SAML Attribute Query issueInstant [%s] is at or after ' 
    516                    'the current clock time [%s]') % \ 
    517                    (attributeQuery.issueInstant, SAMLDateTime.toString(utcNow)) 
    518             log.error(msg) 
    519                        
    520             samlResponse.status.statusCode.value = StatusCode.REQUESTER_URI 
    521             samlResponse.status.statusMessage = StatusMessage() 
    522             samlResponse.status.statusMessage.value = msg 
    523             return samlResponse 
    524              
    525         elif attributeQuery.version < SAMLVersion.VERSION_20: 
    526             samlResponse.status.statusCode.value = \ 
    527                                         StatusCode.REQUEST_VERSION_TOO_LOW_URI 
    528             return samlResponse 
    529          
    530         elif attributeQuery.version > SAMLVersion.VERSION_20: 
    531             samlResponse.status.statusCode.value = \ 
    532                                         StatusCode.REQUEST_VERSION_TOO_HIGH_URI 
    533             return samlResponse 
    534          
    535         elif (attributeQuery.subject.nameID.format !=  
    536               EsgSamlNamespaces.NAMEID_FORMAT): 
     479        if (attributeQuery.subject.nameID.format !=  
     480            EsgSamlNamespaces.NAMEID_FORMAT): 
    537481            log.error('SAML Attribute Query subject format is %r; expecting ' 
    538482                      '%r' % (attributeQuery.subject.nameID.format, 
     
    606550        @return: samlAttributeQuery method function wrapper 
    607551        """ 
    608         def samlAttributeQueryWrapper(attributeQuery): 
    609             """ 
    610             @type attributeQuery: saml.saml2.core.AttributeQuery 
     552        def samlAttributeQueryWrapper(attributeQuery, response): 
     553            """Attribute Query method.  This must adhere to the function 
     554            signature specified by  
     555            ndg.security.server.wsgi.saml.SOAPQueryInterfaceMiddleware 
     556            @type attributeQuery: ndg.saml.saml2.core.AttributeQuery 
    611557            @param attributeQuery: SAML Attribute Query 
    612             @rtype: saml.saml2.core.Response 
     558            @rtype: ndg.saml.saml2.core.Response 
    613559            @return: SAML response 
    614560            """ 
    615             return self.samlAttributeQuery(attributeQuery) 
     561            return self.samlAttributeQuery(attributeQuery, response) 
    616562         
    617563        return samlAttributeQueryWrapper 
     
    972918     
    973919    ISSUER_NAME_FORMAT = Issuer.X509_SUBJECT 
    974     ISSUER_NAME_OPTNAME = 'issuerName' 
    975920    CONNECTION_STRING_OPTNAME = 'connectionString' 
    976921    ATTRIBUTE_SQLQUERY_OPTNAME = 'attributeSqlQuery' 
     
    984929     
    985930    __slots__ = ( 
    986         ISSUER_NAME_OPTNAME, 
    987931        CONNECTION_STRING_OPTNAME, 
    988932        ATTRIBUTE_SQLQUERY_OPTNAME, 
     
    1007951        if not sqlAlchemyInstalled: 
    1008952            raise AttributeInterfaceConfigError("SQLAlchemy is not installed") 
    1009          
    1010         self.__issuerName = None 
     953 
    1011954        self.__connectionString = None 
    1012955        self.__attributeSqlQuery = None 
     
    1041984            object.__setattr__(self, name, value) 
    1042985             
    1043         elif (name[cls.SAML_ATTRIBUTE2SQLQUERY_OPTNAME_LEN] in  
     986        elif (len(name) > cls.SAML_ATTRIBUTE2SQLQUERY_OPTNAME_LEN and 
     987              name[cls.SAML_ATTRIBUTE2SQLQUERY_OPTNAME_LEN] in  
    1044988              cls.SAML_ATTRIBUTE2SQLQUERY_ATTRNAME_DELIMITERS): 
    1045989            # A special 'samlAttribute2SqlQuery[._]+' attribute name has been  
     
    10641008            else: 
    10651009                setattr(self, name, val) 
    1066  
    1067     def _getIssuerName(self): 
    1068         return self.__issuerName 
    1069  
    1070     def _setIssuerName(self, value): 
    1071         if not isinstance(value, basestring): 
    1072             raise TypeError('Expecting string type for "%s" attribute; got %r'% 
    1073                             (SQLAlchemyAttributeInterface.ISSUER_NAME_OPTNAME, 
    1074                              type(value))) 
    1075  
    1076         self.__issuerName = value 
    1077  
    1078     issuerName = property(_getIssuerName,  
    1079                           _setIssuerName,  
    1080                           doc="The name of the issuing organisation.  This is " 
    1081                               "expected to be an X.509 Distinguished Name") 
    10821010             
    10831011    def _getSamlAssertionLifetime(self): 
     
    13001228        assertion.issueInstant = response.issueInstant 
    13011229     
     1230        # Assumes SAML response issuer name set independently -  
     1231        # ndg.security.server.wsgi.saml.SOAPQueryInterfaceMiddleware 
    13021232        assertion.issuer = Issuer() 
    1303         assertion.issuer.value = self.issuerName 
     1233        assertion.issuer.value = response.issuer.value 
    13041234        assertion.issuer.format = Issuer.X509_SUBJECT 
    13051235 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/attributeauthority.py

    r6686 r6721  
    7878            AttributeAuthorityMiddleware.DEFAULT_ATTR_QUERY_IFACE_KEYNAME) 
    7979         
    80         self.aa = AttributeAuthority.fromProperties(propPrefix=prefix, 
    81                                                     **app_conf) 
     80        self.aa = AttributeAuthority.fromProperties(prefix=prefix, **app_conf) 
    8281        self.attributeQuery = self.aa.samlAttributeQueryFactory() 
    8382 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_server/ndg/security/server/wsgi/saml/__init__.py

    r6686 r6721  
    1515from cStringIO import StringIO 
    1616from uuid import uuid4 
    17 from datetime import datetime 
     17from datetime import datetime, timedelta 
    1818from xml.etree import ElementTree 
    1919 
    20 from ndg.saml.saml2.core import Response, AttributeQuery, Status, StatusCode  
     20from ndg.saml.common import SAMLVersion 
     21from ndg.saml.utils import SAMLDateTime 
     22from ndg.saml.saml2.core import (Response, SubjectQuery, Status, StatusCode, 
     23                                 StatusMessage, Issuer)  
    2124from ndg.saml.xml import UnknownAttrProfile 
    22 from ndg.saml.xml.etree import AttributeQueryElementTree, ResponseElementTree 
    23  
     25 
     26from ndg.security.common.utils import str2Bool 
     27from ndg.security.common.utils.factory import importModuleObject 
     28from ndg.security.common.soap.etree import SOAPEnvelope 
    2429from ndg.security.common.saml_utils.esg import XSGroupRoleAttributeValue 
    2530from ndg.security.common.saml_utils.esg.xml.etree import ( 
    2631                                        XSGroupRoleAttributeValueElementTree) 
    27 from ndg.security.common.soap.etree import SOAPEnvelope 
    28 from ndg.security.common.utils.factory import importModuleObject 
    2932from ndg.security.server.wsgi import NDGSecurityPathFilter 
    3033from ndg.security.server.wsgi.soap import SOAPMiddleware 
     
    3841    """WSGI SAML 2.0 SOAP Query Interface Configuration problem""" 
    3942 
    40    
     43 
    4144class SOAPQueryInterfaceMiddleware(SOAPMiddleware, NDGSecurityPathFilter): 
    4245    """Implementation of SAML 2.0 SOAP Binding for Query/Request Binding 
     
    6265    SERIALISE_OPTNAME = 'serialise' 
    6366    DESERIALISE_OPTNAME = 'deserialise'  
    64       
     67    SAML_VERSION_OPTNAME = 'samlVersion' 
     68    ISSUER_OPTNAME = 'issuer' 
     69     
    6570    CONFIG_FILE_OPTNAMES = ( 
    6671        PATH_OPTNAME, 
     
    7075        RESPONSE_ENVELOPE_CLASS_OPTNAME, 
    7176        SERIALISE_OPTNAME, 
    72         DESERIALISE_OPTNAME 
     77        DESERIALISE_OPTNAME, 
     78        SAML_VERSION_OPTNAME, 
     79        ISSUER_OPTNAME 
    7380    ) 
    7481     
     
    9097        self.__deserialise = None 
    9198        self.__issuer = None 
    92         self.__clockSkewTolerance = 0. 
     99        self.__clockSkewTolerance = timedelta(seconds=0.) 
    93100        self.__verifyTimeConditions = True 
     101        self.__verifySAMLVersion = True 
     102        self.__samlVersion = SAMLVersion.VERSION_20 
    94103                  
    95104    def initialise(self, global_conf, prefix='', **app_conf): 
     
    186195                                        'Conditions set in the returned ' 
    187196                                        'response assertions') 
    188      
     197 
     198    def _getVerifySAMLVersion(self): 
     199        return self.__verifySAMLVersion 
     200 
     201    def _setVerifySAMLVersion(self, value): 
     202        if isinstance(value, bool): 
     203            self.__verifySAMLVersion = value 
     204             
     205        if isinstance(value, basestring): 
     206            self.__verifySAMLVersion = str2Bool(value) 
     207        else: 
     208            raise TypeError('Expecting bool or string type for ' 
     209                            '"verifySAMLVersion"; got %r instead' %  
     210                            type(value)) 
     211 
     212    verifySAMLVersion = property(_getVerifySAMLVersion,  
     213                                 _setVerifySAMLVersion,  
     214                                 doc='Set to True to verify the SAML version ' 
     215                                     'set in the query against the SAML ' 
     216                                     'Version set in the "samlVersion" ' 
     217                                     'attribute') 
     218         
    189219    def _getClockSkewTolerance(self): 
    190220        return self.__clockSkewTolerance 
    191221 
    192222    def _setClockSkewTolerance(self, value): 
    193         if isinstance(value, (float, int, long)): 
     223        if isinstance(value, timedelta): 
     224            self.__clockSkewTolerance = value 
     225             
     226        elif isinstance(value, (float, int, long)): 
    194227            self.__clockSkewTolerance = timedelta(seconds=value) 
    195228             
     
    197230            self.__clockSkewTolerance = timedelta(seconds=float(value)) 
    198231        else: 
    199             raise TypeError('Expecting float, int, long or string type for ' 
    200                             '"clockSkew"; got %r' % type(value))   
     232            raise TypeError('Expecting timedelta, float, int, long or string ' 
     233                            'type for "clockSkewTolerance"; got %r' %  
     234                            type(value))   
    201235                 
    202236    clockSkewTolerance = property(fget=_getClockSkewTolerance,  
    203237                                  fset=_setClockSkewTolerance,  
    204238                                  doc="Set a tolerance of +/- n seconds to " 
    205                                       "allow for clock skew when checking " 
     239                                      "allow for clock skew when checking the " 
    206240                                      "timestamps of client queries") 
     241 
     242    def _getSamlVersion(self): 
     243        return self.__samlVersion 
     244 
     245    def _setSamlVersion(self, value): 
     246        if not isinstance(value, basestring): 
     247            raise TypeError('Expecting string type for "samlVersion"; got %r' %  
     248                            type(value))  
     249        self.__samlVersion = value 
     250 
     251    samlVersion = property(_getSamlVersion, _setSamlVersion, None,  
     252                           "SAML Version to enforce for incoming queries.  " 
     253                           "Defaults to version 2.0") 
    207254 
    208255    @classmethod 
     
    279326         
    280327        log.debug("SOAPQueryInterfaceMiddleware.__call__: received SAML " 
    281                   "SOAP AttributeQuery ...") 
     328                  "SOAP SQuery ...") 
    282329        
    283330        queryElem = soapRequest.body.elem[0] 
     
    290337            samlQuery = self.deserialise(queryElem) 
    291338             
    292         except UnknownAttrProfile: 
    293             log.exception("%r raised parsing incoming query: " %  
     339        except UnknownAttrProfile, e: 
     340            log.exception("%r raised parsing incoming query: %s" %  
    294341                          (type(e), traceback.format_exc())) 
    295342            samlResponse.statusCode.value = StatusCode.UNKNOWN_ATTR_PROFILE_URI 
     
    303350             
    304351            # Basic validation 
    305             self._validateQuery(samlQuery) 
     352            self._validateQuery(samlQuery, samlResponse) 
    306353             
    307354            samlResponse.inResponseTo = samlQuery.id 
     
    329376        return [response] 
    330377     
    331     def _validateQuery(self, query): 
    332         if not self.verifyTimeConditions: 
    333             log.debug("Skipping verification of SAML Response time conditions") 
    334              
     378    def _validateQuery(self, query, response): 
     379        """Checking incoming query issue instant and version 
     380        @type query: saml.saml2.core.SubjectQuery  
     381        @param query: SAML subject query to be checked 
     382        @type: saml.saml2.core.Response 
     383        @param: SAML Response  
     384        """ 
     385        self._verifyQueryTimeConditions(query, response) 
     386        self._verifyQuerySAMLVersion(query, response) 
     387         
     388    def _verifyQueryTimeConditions(self, query, response): 
     389        """Checking incoming query issue instant 
     390        @type query: saml.saml2.core.SubjectQuery  
     391        @param query: SAML subject query to be checked 
     392        @type: saml.saml2.core.Response 
     393        @param: SAML Response  
     394        @raise QueryIssueInstantInvalid: for invalid issue instant 
     395        """ 
     396        if not self.verifyTimeConditions:  
     397            log.debug("Skipping verification of SAML query time conditions") 
     398            return 
     399               
    335400        utcNow = datetime.utcnow()  
    336401        nowPlusSkew = utcNow + self.clockSkewTolerance 
    337402         
    338         if response.issueInstant > nowPlusSkew: 
     403        if query.issueInstant > nowPlusSkew: 
    339404            msg = ('SAML Attribute Query issueInstant [%s] is after ' 
    340405                   'the clock time [%s] (skewed +%s)' %  
     
    346411            samlRespError.response = response 
    347412            raise samlRespError 
    348  
     413             
     414    def _verifyQuerySAMLVersion(self, query, response): 
     415        """Checking incoming query issue SAML version 
     416         
     417        @type query: saml.saml2.core.SubjectQuery  
     418        @param query: SAML subject query to be checked 
     419        @type: saml.saml2.core.Response 
     420        @param: SAML Response  
     421        """ 
     422        if not self.verifySAMLVersion: 
     423            log.debug("Skipping verification of SAML query version") 
     424            return 
     425         
     426        if query.version < self.samlVersion: 
     427            msg = ("Query SAML version %r is lower than the supported " 
     428                   "value %r" 
     429                   % (query.version, self.samlVersion)) 
     430            response.status.statusCode.value = \ 
     431                                        StatusCode.REQUEST_VERSION_TOO_LOW_URI 
     432            return 
     433         
     434        elif query.version > self.samlVersion: 
     435            msg = ("Query SAML version %r is higher than the supported " 
     436                   "value %r" 
     437                   % (query.version, self.samlVersion)) 
     438            response.status.statusCode.value = \ 
     439                                        StatusCode.REQUEST_VERSION_TOO_HIGH_URI 
     440            return             
     441         
    349442    def _initResponse(self): 
    350443        """Create a SAML Response object with basic settings if any have been 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/attributeauthority/sitea/README

    r5290 r6721  
    88    
    99   $ paster serve site-a.ini 
     10       
     11 - sitea_attributeauthority.py: script to invoke the service: 
     12  
     13   $ python ./sitea_attributeauthority.py 
    1014    
    11  - siteAAttributeAuthority.cfg: example standalone Attribute Authority config 
    12    file without Paste configuration 
     15   This script can be used to test the service but the unit tests start up and 
     16   close down attribute authority instances atuomatically.  See:  
     17   ndg.security.test.unit.BaseTestCase 
    1318    
    14  - siteAMapConfig.xml: configures trust relationships with other organisations 
    15    (site b for the tests) 
     19 - sitea_attributeinterface.py: attribute interface plugin to the Attribute  
     20   Authority determines what attributes a given user is entitled to.  In a  
     21   production deployment this might link to a user database or other repository. 
    1622    
    17  - siteAServerApp.py: script to invoke the service: 
    18   
    19    $ python ../siteAServerApp.py 
    20     
    21    This script is used as a convenience method for running the unit tests. 
    22     
    23  - siteAUserRoles.py: attribute interface plugin to the Attribute Authority 
    24    determines what attributes a given user is entitled to.  In a production 
    25    deployment this might link to a user database or other repository. 
    26     
    27 P J Kershaw 14/05/09 
     23Initial version: P J Kershaw 14/05/09 
     24Updated: P J Kershaw 11/03/10 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/attributeauthority/sitea/site-a.ini

    r6720 r6721  
    2121 
    2222[app:mainApp] 
    23 paste.app_factory = ndg.security.test.config.attributeauthority.sitea.siteAServerApp:app_factory 
     23paste.app_factory = ndg.security.test.config.attributeauthority.sitea.sitea_attributeauthority:app_factory 
    2424 
    2525# Chain of SOAP Middleware filters - Nb. WS-Security filters apply to the SOAP 
     
    4343attributeAuthority.environKeyNameAttributeQueryInterface: %(attributeQueryInterfaceEnvironKeyName)s 
    4444 
    45 # Attribute Authority settings 
    46 # 'name' setting MUST agree with map config file 'thisHost' name attribute 
    47 attributeAuthority.name: Site A 
     45# Attribute Authority settings... 
    4846 
    4947# Lifetime is measured in seconds 
     
    5553# user ID 
    5654attributeAuthority.attributeInterface.modFilePath: %(here)s 
    57 attributeAuthority.attributeInterface.modName: siteAUserRoles 
    58 attributeAuthority.attributeInterface.className: TestUserRoles 
     55attributeAuthority.attributeInterface.className: sitea_attributeinterface.TestUserRoles 
    5956 
    6057# SAML SOAP Binding to the Attribute Authority 
     
    6865saml.soapbinding.serialise = ndg.security.common.saml_utils.esg.xml.etree:EsgResponseElementTree.toXML 
    6966 
    70 saml.soapbinding.pathMatchList = /AttributeAuthority/saml 
     67saml.soapbinding.pathMatchList = /AttributeAuthority 
    7168saml.soapbinding.queryInterfaceKeyName = %(attributeQueryInterfaceEnvironKeyName)s 
    7269 
     
    7471# tolerance for query issueInstant parameter. Set here to 3 minutes 
    7572saml.soapbinding.clockSkewTolerance: 180.0 
     73 
     74saml.soapbinding.issuer: /O=Site A/CN=Attribute Authority 
    7675 
    7776# Logging configuration 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/config/attributeauthority/sitea/sitea_attributeinterface.py

    r6720 r6721  
    7777    VALID_REQUESTOR_IDS = BaseTestCase.VALID_REQUESTOR_IDS 
    7878     
    79     ISSUER_NAME = "/O=Site A/CN=Attribute Authority" 
    80      
    8179    INSUFFICIENT_PRIVILEGES_REQUESTOR_ID = X500DN.fromString( 
    8280                                        "/O=Site B/CN=Authorisation Service") 
     
    128126     
    129127        assertion.issuer = Issuer() 
    130         assertion.issuer.value = TestUserRoles.ISSUER_NAME 
     128        assertion.issuer.value = response.issuer.value 
    131129        assertion.issuer.format = Issuer.X509_SUBJECT 
    132130         
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/__init__.py

    r6276 r6721  
    7474    SITEA_SAML_ISSUER_NAME = "/O=Site A/CN=Attribute Authority" 
    7575     
    76     SESSIONMANAGER_PORTNUM = 5500 
    77      
    7876    NDGSEC_UNITTESTS_DISABLE_THREAD_SERVICES_ENVVAR = \ 
    7977        'NDGSEC_UNITTESTS_DISABLE_THREAD_SERVICES' 
     
    182180                                              'site-a.ini')) 
    183181        self.addService(cfgFilePath=siteACfgFilePath,  
    184                         port=port or BaseTestCase.SITEA_ATTRIBUTEAUTHORITY_PORTNUM, 
     182                        port=(port or  
     183                              BaseTestCase.SITEA_ATTRIBUTEAUTHORITY_PORTNUM), 
    185184                        withSSL=withSSL) 
    186185         
     
    190189                                              'site-b.ini')) 
    191190        self.addService(cfgFilePath=siteBCfgFilePath,  
    192                         port=port or BaseTestCase.SITEB_ATTRIBUTEAUTHORITY_PORTNUM, 
    193                         withSSL=withSSL)         
    194  
    195     def startSessionManager(self): 
    196         """Serve test Session Manager service""" 
    197         cfgFilePath = mkDataDirPath(join('sessionmanager',  
    198                                          'session-manager.ini')) 
    199         self.addService(cfgFilePath=cfgFilePath,  
    200                         port=BaseTestCase.SESSIONMANAGER_PORTNUM) 
    201          
     191                        port=(port or  
     192                              BaseTestCase.SITEB_ATTRIBUTEAUTHORITY_PORTNUM), 
     193                        withSSL=withSSL) 
    202194 
    203195    def __del__(self): 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/attributeauthority/test_attributeauthority.cfg

    r6719 r6721  
    1010prefix=attribute-authority. 
    1111attribute-authority.assertionLifetime = 3600 
    12 attribute-authority.issuerName = /O=My Organisation/OU=Centre/CN=Attribute Authority  
    1312attribute-authority.attributeInterface.className = ndg.security.server.attributeauthority.AttributeInterface 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/attributeauthority/test_attributeauthority.py

    r6720 r6721  
    4646    PROPERTIES_FILENAME = 'test_attributeauthority.cfg' 
    4747    PROPERTIES_FILEPATH = path.join(THIS_DIR, PROPERTIES_FILENAME) 
    48     ISSUER_NAME = '/O=My Organisation/OU=Centre/CN=Attribute Authority' 
    4948    ASSERTION_LIFETIME = "86400" 
    5049 
     
    5453        self.assert_(aa) 
    5554        self.assert_(aa.assertionLifetime == 3600) 
    56         self.assert_(aa.issuerName == cls.ISSUER_NAME) 
    5755         
    5856    def _createAttributeAuthorityHelper(self): 
     
    6664                                       'AttributeInterface') 
    6765         
    68         aa = AttributeAuthority.fromProperties(issuerName=cls.ISSUER_NAME, 
     66        aa = AttributeAuthority.fromProperties( 
    6967                    assertionLifetime=cls.ASSERTION_LIFETIME, 
    7068                    attributeInterface_className=attributeInterfaceClassName) 
     
    8179        # Check lifetime property converted from string input to float 
    8280        self.assert_(aa.assertionLifetime == float(cls.ASSERTION_LIFETIME)) 
    83         self.assert_(aa.issuerName == cls.ISSUER_NAME) 
    8481        self.assert_(isinstance(aa.attributeInterface, AttributeInterface)) 
    8582 
     
    9289        self.assert_(aa2) 
    9390        self.assert_(aa2.assertionLifetime == aa.assertionLifetime) 
    94         self.assert_(aa2.issuerName == aa.issuerName) 
    9591        self.assert_(isinstance(aa2.attributeInterface, AttributeInterface)) 
    9692     
     
    322318            '/O=ESG/OU=NCAR/CN=Gateway') 
    323319         
    324         attributeInterface.setProperties(samlAssertionLifetime=28800., 
    325                                 issuerName='/CN=Attribute Authority/O=Site A') 
     320        attributeInterface.setProperties(samlAssertionLifetime=28800.) 
    326321         
    327322        attributeInterface.samlSubjectSqlQuery = ( 
     
    414409         
    415410            SQLAlchemyAttributeInterfaceTestCase.ATTRIBUTE_NAMES[0]:  
    416                 SQLAlchemyAttributeInterfaceTestCase.SAML_ATTRIBUTES_SQLQUERY                     
     411                SQLAlchemyAttributeInterfaceTestCase.SAML_ATTRIBUTES_SQLQUERY 
    417412        } 
    418413         
     
    427422            '/O=ESG/OU=NCAR/CN=Gateway') 
    428423         
    429         attributeInterface.setProperties(samlAssertionLifetime=28800., 
    430                                 issuerName='/CN=Attribute Authority/O=Site A') 
     424        attributeInterface.setProperties(samlAssertionLifetime=28800.) 
    431425         
    432426        attributeInterface.samlSubjectSqlQuery = ( 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/attributeauthority/test_sqlalchemyattributeinterface.cfg

    r6062 r6721  
    11[DEFAULT] 
    2 attributeInterface.issuerName = /O=Site A/CN=Attribute Authority 
    32attributeInterface.samlSubjectSqlQuery = select count(*) from users where openid = '${userId}' 
    43attributeInterface.samlAttribute2SqlQuery.1 = "urn:esg:first:name" "select firstname from users where openid = '${userId}'" 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/attributeauthorityclient/test_samlattributeauthorityclient.cfg

    r6575 r6721  
    1212# included here 
    1313[test01AttributeQuery] 
    14 uri = http://localhost:5000/AttributeAuthority/saml 
     14uri = http://localhost:5000/AttributeAuthority/ 
    1515subject = https://openid.localhost/philip.kershaw 
    1616siteAttributeName = urn:siteA:security:authz:1.0:attr 
    1717 
    1818[test02AttributeQueryInvalidIssuer] 
    19 uri = http://localhost:5000/AttributeAuthority/saml 
     19uri = http://localhost:5000/AttributeAuthority/ 
    2020subject = https://openid.localhost/philip.kershaw 
    2121siteAttributeName = urn:siteA:security:authz:1.0:attr 
    2222 
    2323[test03AttributeQueryUnknownSubject] 
    24 uri = http://localhost:5000/AttributeAuthority/saml 
     24uri = http://localhost:5000/AttributeAuthority/ 
    2525subject = https://openid.localhost/unknown 
    2626siteAttributeName = urn:siteA:security:authz:1.0:attr 
    2727 
    2828[test04AttributeQueryInvalidAttrName] 
    29 uri = http://localhost:5000/AttributeAuthority/saml 
     29uri = http://localhost:5000/AttributeAuthority/ 
    3030subject = https://openid.localhost/philip.kershaw 
    3131siteAttributeName = invalid-attr 
    3232prefix = saml. 
    33 saml.serialise = saml.xml.etree:AttributeQueryElementTree.toXML 
    34 saml.deserialise = saml.xml.etree:ResponseElementTree.fromXML 
     33saml.serialise = ndg.saml.xml.etree:AttributeQueryElementTree.toXML 
     34saml.deserialise = ndg.saml.xml.etree:ResponseElementTree.fromXML 
    3535 
    3636[test05AttributeQuerySOAPBindingInterface] 
    37 uri = http://localhost:5000/AttributeAuthority/saml 
     37uri = http://localhost:5000/AttributeAuthority/ 
    3838subject = https://openid.localhost/philip.kershaw 
    3939 
    4040[test06AttributeQueryFromConfig] 
    41 uri = http://localhost:5000/AttributeAuthority/saml 
     41uri = http://localhost:5000/AttributeAuthority/ 
    4242subject = https://openid.localhost/philip.kershaw 
    4343 
     
    4949 
    5050[test07AttributeQuerySslSOAPBindingInterface] 
    51 uri = http://localhost:5000/AttributeAuthority/saml 
     51uri = http://localhost:5000/AttributeAuthority/ 
    5252subject = https://openid.localhost/philip.kershaw 
    5353 
     
    6363attributeQuery.sslPriKeyFilePath = $NDGSEC_TEST_CONFIG_DIR/pki/test.key 
    6464attributeQuery.sslValidDNs = /C=UK/ST=Oxfordshire/O=BADC/OU=Security/CN=localhost, /O=Site A/CN=Attribute Authority 
     65 
  • TI12-security/trunk/NDGSecurity/python/ndg_security_test/ndg/security/test/unit/attributeauthorityclient/test_samlattributeauthorityclient.py

    r6720 r6721  
    298298         
    299299        self.assert_(response.status.statusCode.value==StatusCode.SUCCESS_URI) 
    300               
    301     def test08AuthzDecisionQuery(self): 
    302         _cfg = self.cfg['test02AuthzDecisionQuery'] 
    303          
    304         query = AuthzDecisionQuery() 
    305         query.version = SAMLVersion(SAMLVersion.VERSION_20) 
    306         query.id = str(uuid4()) 
    307         query.issueInstant = datetime.utcnow() 
    308          
    309         query.issuer = Issuer() 
    310         query.issuer.format = Issuer.X509_SUBJECT 
    311         query.issuer.value = str( 
    312                 AttributeAuthoritySAMLInterfaceTestCase.VALID_REQUESTOR_IDS[0]) 
    313                          
    314         query.subject = Subject()   
    315         query.subject.nameID = NameID() 
    316         query.subject.nameID.format = EsgSamlNamespaces.NAMEID_FORMAT 
    317         query.subject.nameID.value = _cfg['subject'] 
    318  
    319         binding = SOAPBinding() 
    320         binding.serialise = AuthzDecisionQueryElementTree.toXML 
    321         binding.deserialise = ResponseElementTree.fromXML 
    322         response = binding.send(query, _cfg['uri']) 
    323  
    324         samlResponseElem = ResponseElementTree.toXML(response) 
    325          
    326         print("SAML Response ...") 
    327         print(ElementTree.tostring(samlResponseElem)) 
    328         print("Pretty print SAML Response ...") 
    329         print(prettyPrint(samlResponseElem)) 
    330          
    331         self.assert_( 
    332             response.status.statusCode.value==StatusCode.REQUEST_DENIED_URI) 
    333300 
    334301        
Note: See TracChangeset for help on using the changeset viewer.