Changeset 7682 for TI12-security


Ignore:
Timestamp:
01/11/10 16:30:22 (9 years ago)
Author:
pjkersha
Message:

Working and tested version with functionality for adding custom attribute value types and functions.

Location:
TI12-security/trunk/ndg_xacml/ndg/xacml
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • TI12-security/trunk/ndg_xacml/ndg/xacml/core/attributevalue.py

    r7661 r7682  
    150150    def __repr__(self): 
    151151        return "%s = %r " % (super(AttributeValue, self).__repr__(), 
    152                              self.__value) 
     152                             self.value) 
    153153 
    154154    def __eq__(self, attrVal): 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/core/functions/__init__.py

    r7668 r7682  
    611611        @type functionNs: basestring 
    612612        """ 
     613        # Try map for custom function class 
     614        if functionNs in self: 
     615            return self[functionNs] 
     616         
     617        # else try the class factory - there is one factory per family of  
     618        # functions e.g. bag functions, at least one member of functions etc. 
    613619        functionFactory = self.__classFactoryMap.get(functionNs) 
    614620        if functionFactory is not None: 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/core/rule.py

    r7365 r7682  
    390390            else: 
    391391                decision = Decision.NOT_APPLICABLE 
    392                  
     392                
     393            log.debug('Rule %r evaluates to %s', self.id, decision)  
    393394            return decision 
    394395         
  • TI12-security/trunk/ndg_xacml/ndg/xacml/core/rule_combining_alg.py

    r7108 r7682  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id$" 
    12 from abc import ABCMeta, abstractmethod 
     12import logging 
     13log = logging.getLogger(__name__) 
     14 
     15from abc import abstractmethod 
    1316 
    1417from ndg.xacml.core.context.result import Decision 
     
    8689                atLeastOneError = True 
    8790     
    88                 if effect(rule) == Decision.DENY: 
     91                if rule.effect.value == Decision.DENY: 
    8992                    potentialDeny = True 
    9093                     
     
    130133             
    131134            if decision == Decision.PERMIT: 
     135                log.debug("Rule %r permits, returning overall permit decision", 
     136                          rule.id) 
    132137                return Decision.PERMIT 
    133138             
     
    144149         
    145150        if potentialPermit: 
     151            log.debug('Rule found with potential permit but it evaluates to ' 
     152                      'indeterminate, returning overall indeterminate decision') 
    146153            return Decision.INDETERMINATE 
    147154         
    148155        if atLeastOneDeny: 
     156            log.debug('At least one rule with a deny decision found, returning ' 
     157                      'overall deny decision') 
    149158            return Decision.DENY 
    150159         
    151160        if atLeastOneError: 
    152             return Decision.INDETERMINATE 
    153          
     161            log.debug('At least one rule with an error found, returning ' 
     162                      'overall indeterminate decision') 
     163            return Decision.INDETERMINATE 
     164         
     165        log.debug('No rules were applicable to the request, returning ' 
     166                  'overall not applicable decision') 
    154167        return Decision.NOT_APPLICABLE 
    155168 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/parsers/etree/policyreader.py

    r7109 r7682  
    9898            elif localName == Rule.ELEMENT_LOCAL_NAME: 
    9999                RuleReader = ReaderFactory.getReader(Rule) 
    100                 policy.rules.append(RuleReader.parse(childElem)) 
     100                rule = RuleReader.parse(childElem) 
     101                if rule.id in [_rule.id for _rule in policy.rules]: 
     102                    raise XMLParseError("Duplicate Rule ID %r found" % rule.id) 
     103                     
     104                policy.rules.append(rule) 
    101105                    
    102106            elif localName == xacmlType.OBLIGATIONS_LOCAL_NAME: 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/__init__.py

    r7666 r7682  
    1414from ndg.xacml.core.attributevalue import (AttributeValueClassFactory,  
    1515                                           AttributeValue) 
     16from ndg.xacml.core.functions.v1.bag import BagBase 
     17from ndg.xacml.core.functions.v1.at_least_one_member_of import \ 
     18    AtLeastOneMemberOfBase  
     19     
    1620from ndg.xacml.parsers import XMLParseError 
    1721from ndg.xacml.parsers.etree import QName 
     
    4650    def value(self): 
    4751        """Override default value property to give custom result.  Also, 
    48         'value' becomes a read-only property""" 
    49         return self.group, self.value 
     52        'value' becomes a read-only property.  Making this change is critical 
     53        to the function of the GroupRoleAtLeastOneMemberOf class below - it 
     54        relies on being able to make comparison of the value attribute of  
     55        different GroupRoleAttributeValue instances.  Defined this way,  
     56        comparison is by group,role to group,role tuple 
     57        """ 
     58        return self.group, self.role 
    5059     
     60 
     61class GroupRoleBag(BagBase): 
     62    """Bag function for Group/Role custom attribute value type""" 
     63    TYPE = GroupRoleAttributeValue 
     64    FUNCTION_NS = 'urn:grouprole-bag' 
     65 
     66   
     67class GroupRoleAtLeastOneMemberOf(AtLeastOneMemberOfBase): 
     68    """At least one member of function for Group/Role custom attribute value  
     69    type""" 
     70    TYPE = GroupRoleAttributeValue 
     71    FUNCTION_NS = 'urn:grouprole-bag' 
     72 
    5173     
    5274class ETreeGroupRoleDataTypeReader(ETreeDataTypeReaderBase): 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/context/test_pdp.py

    r7666 r7682  
    3636        'http://localhost/action-and-single-subject-role-restricted' 
    3737    AT_LEAST_ONE_SUBJECT_ROLE_RESTRICTED_ID = \ 
    38         'http://localhost/at-least-of-subject-role-restricted' 
     38        'http://localhost/at-least-one-of-subject-role-restricted' 
    3939         
    4040    def setUp(self): 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/context/test_pdp_with_custom_attributevalue_types.py

    r7668 r7682  
    2020from ndg.xacml.core.attributevalue import AttributeValueClassFactory 
    2121from ndg.xacml.core.functions import functionMap 
    22 from ndg.xacml.core.functions.v1.bag import BagBase 
    23 from ndg.xacml.core.functions.v1.at_least_one_member_of import \ 
    24     AtLeastOneMemberOfBase  
    2522from ndg.xacml.core.context.request import Request 
    2623from ndg.xacml.core.context.subject import Subject 
     
    3532from ndg.xacml.test import (XACML_ESGFTEST1_FILEPATH,   
    3633                            GroupRoleAttributeValue,  
    37                             ETreeGroupRoleDataTypeReader) 
     34                            ETreeGroupRoleDataTypeReader, 
     35                            GroupRoleBag, 
     36                            GroupRoleAtLeastOneMemberOf) 
    3837from ndg.xacml.test.context import (AnyUriAttributeValue, StringAttributeValue, 
    3938                                    SUBJECT_ID) 
    4039 
    41  
     40     
    4241class XacmlEvalPdpWithCustomAttrTypes(unittest.TestCase): 
    4342    """Evaluate a policy which contains custom XACML Attribute Value Data types 
    4443    """ 
    4544    AT_LEAST_ONE_SUBJECT_ROLE_RESTRICTED_ID = \ 
    46         'http://localhost/at-least-of-subject-role-restricted'        
    47           
     45        'http://localhost/at-least-one-of-subject-role-restricted'        
     46    SUBJECT_DOES_NOT_HAVE_ANY_OF_SPECIFIED_ROLES_ID = \ 
     47        'http://localhost/subject-does-not-have-any-of-specified-roles' 
     48         
    4849    @staticmethod 
    4950    def _createRequestCtx(resourceId,  
     
    121122         
    122123        # Add extra matching and bag functions 
     124        functionMap['urn:grouprole-bag'] = GroupRoleBag 
     125        functionMap['urn:grouprole-at-least-one-member-of' 
     126                    ] = GroupRoleAtLeastOneMemberOf 
    123127         
    124128        # Example policy with custom attribute value type used with ESGF  
     
    135139            self.failIf(result.decision != Decision.PERMIT,  
    136140                        "Expecting Permit decision")     
    137              
     141                     
     142    def test02SubjectDoesNotHaveAnyOfSpecifiedRolesForResource(self): 
     143        # Test at least one member function 
     144        request = self._createRequestCtx( 
     145        self.__class__.SUBJECT_DOES_NOT_HAVE_ANY_OF_SPECIFIED_ROLES_ID, 
     146        action='write') 
     147         
     148        response = self.pdp.evaluate(request) 
     149        self.failIf(response is None, "Null response") 
     150        for result in response.results: 
     151            self.failIf(result.decision != Decision.DENY,  
     152                        "Expecting Deny decision")     
     153            
    138154             
    139155if __name__ == "__main__": 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/esgf1.xml

    r7666 r7682  
    4545                    <!-- Pattern match the request URI --> 
    4646                    <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
    47                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/at-least-of-subject-role-restricted.*$</AttributeValue> 
     47                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/at-least-one-of-subject-role-restricted.*$</AttributeValue> 
    4848                        <ResourceAttributeDesignator 
    4949                            AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
     
    8383        </Condition> 
    8484    </Rule> 
     85    <Rule RuleId="Subject doesn't have any of specified roles" Effect="Permit"> 
     86        <!--  
     87            Example where test subject doesn't have the required roles 
     88        --> 
     89        <Target> 
     90            <Resources> 
     91                <Resource> 
     92                    <!-- Pattern match the request URI --> 
     93                    <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
     94                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/subject-does-not-have-any-of-specified-roles.*$</AttributeValue> 
     95                        <ResourceAttributeDesignator 
     96                            AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
     97                            DataType="http://www.w3.org/2001/XMLSchema#anyURI"/> 
     98                    </ResourceMatch> 
     99                </Resource> 
     100            </Resources> 
     101        </Target> 
     102         
     103        <!--  
     104            The condition narrows down the constraints layed down in the target to 
     105            something more specific 
     106             
     107            The user must have at least one of the roles set - in this 
     108            case 'staff' 
     109        --> 
     110        <Condition> 
     111            <Apply FunctionId="urn:grouprole-at-least-one-member-of"> 
     112                <SubjectAttributeDesignator  
     113                    AttributeId="urn:esg:attr" 
     114                    DataType="urn:grouprole"/> 
     115                <Apply FunctionId="urn:grouprole-bag"> 
     116                    <AttributeValue DataType="urn:grouprole"> 
     117                        <esg:groupRole> 
     118                            <esg:group>ACME</esg:group> 
     119                            <esg:role>PrincipalInvestigator</esg:role> 
     120                        </esg:groupRole> 
     121                    </AttributeValue> 
     122                    <AttributeValue DataType="urn:grouprole"> 
     123                        <esg:groupRole> 
     124                            <esg:group>Staff</esg:group> 
     125                            <esg:role>Administrator</esg:role> 
     126                        </esg:groupRole> 
     127                    </AttributeValue> 
     128                </Apply> 
     129            </Apply> 
     130        </Condition> 
     131    </Rule> 
    85132</Policy> 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/ndg1.xml

    r7445 r7682  
    131131                    <!-- Pattern match the request URI --> 
    132132                    <ResourceMatch MatchId="urn:oasis:names:tc:xacml:2.0:function:anyURI-regexp-match"> 
    133                         <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/at-least-of-subject-role-restricted.*$</AttributeValue> 
     133                        <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#anyURI">^http://localhost/at-least-one-of-subject-role-restricted.*$</AttributeValue> 
    134134                        <ResourceAttributeDesignator 
    135135                            AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" 
  • TI12-security/trunk/ndg_xacml/ndg/xacml/test/policy/test_policy.py

    r7666 r7682  
    1717 
    1818from ndg.xacml.core.policy import Policy 
     19from ndg.xacml.core.functions import functionMap 
    1920from ndg.xacml.core.attributedesignator import SubjectAttributeDesignator 
    2021from ndg.xacml.core.attributeselector import AttributeSelector 
     
    2627from ndg.xacml.test import (XACML_NDGTEST1_FILEPATH, THIS_DIR,  
    2728                            GroupRoleAttributeValue,  
    28                             ETreeGroupRoleDataTypeReader) 
     29                            ETreeGroupRoleDataTypeReader, 
     30                            GroupRoleBag, 
     31                            GroupRoleAtLeastOneMemberOf) 
    2932                                
    3033     
     
    275278                                ETreeGroupRoleDataTypeReader) 
    276279         
     280        # Add extra matching and bag functions 
     281        functionMap['urn:grouprole-bag'] = GroupRoleBag 
     282        functionMap['urn:grouprole-at-least-one-member-of' 
     283                    ] = GroupRoleAtLeastOneMemberOf 
     284                             
    277285        PolicyReader = ReaderFactory.getReader(Policy) 
    278286        policy = PolicyReader.parse(self.__class__.XACML_ESGFTEST1_FILEPATH) 
Note: See TracChangeset for help on using the changeset viewer.