Changeset 5510


Ignore:
Timestamp:
24/07/09 11:18:40 (10 years ago)
Author:
pjkersha
Message:

Working SAML Assertion code with ESG specific Group/Role? attributes

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

Legend:

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

    r5507 r5510  
    1919    
    2020from ndg.security.common.utils import QName 
    21  
    22 class XMLConstants(object): 
    23     '''XML related constants.''' 
    24  
    25     # XML Tooling 
    26  
    27     # Configuration namespace 
    28     XMLTOOLING_CONFIG_NS = "http:#www.opensaml.org/xmltooling-config" 
    29  
    30     # Configuration namespace prefix 
    31     XMLTOOLING_CONFIG_PREFIX = "xt" 
    32      
    33     # Name of the object provider used for objects that don't have a registered 
    34     # object provider 
    35     XMLTOOLING_DEFAULT_OBJECT_PROVIDER = "DEFAULT" 
    36  
    37     # Core XML 
    38  
    39     # XML core namespace 
    40     XML_NS = "http:#www.w3.org/XML/1998/namespace" 
    41      
    42     # XML core prefix for xml attributes 
    43     XML_PREFIX = "xml" 
    44  
    45     # XML namespace for xmlns attributes 
    46     XMLNS_NS = "http://www.w3.org/2000/xmlns/" 
    47  
    48     # XML namespace prefix for xmlns attributes 
    49     XMLNS_PREFIX = "xmlns" 
    50  
    51     # XML Schema namespace 
    52     XSD_NS = "http://www.w3.org/2001/XMLSchema" 
    53  
    54     # XML Schema QName prefix 
    55     XSD_PREFIX = "xs" 
    56  
    57     # XML Schema Instance namespace 
    58     XSI_NS = "http://www.w3.org/2001/XMLSchema-instance" 
    59  
    60     # XML Schema Instance QName prefix 
    61     XSI_PREFIX = "xsi" 
    62  
    63     # XML XMLSecSignatureImpl namespace 
    64     XMLSIG_NS = "http://www.w3.org/2000/09/xmldsig#" 
    65  
    66     # XML XMLSecSignatureImpl QName prefix 
    67     XMLSIG_PREFIX = "ds" 
    68  
    69     # XML Encryption namespace 
    70     XMLENC_NS = "http://www.w3.org/2001/04/xmlenc#" 
    71  
    72     # XML Encryption QName prefix 
    73     XMLENC_PREFIX = "xenc" 
    74      
    75     # Local name of EncryptedData element 
    76     XMLENC_ENCDATA_LOCAL_NAME = "EncryptedData" 
    77      
    78     # Local name of EncryptedKey element 
    79     XMLENC_ENCKEY_LOCAL_NAME = "EncryptedKey" 
    80      
     21from ndg.security.common.saml.xml import SAMLConstants, XMLConstants 
     22 
    8123       
    8224class SAMLObject(object): 
    83     pass 
    84  
    85 class SAMLConstants(XMLConstants): 
    86     '''XML related constants used in the SAML specifications.''' 
    87      
    88     # HTTP Constants 
    89      
    90     # HTTP Request Method - POST. 
    91     POST_METHOD = "POST" 
    92      
    93     # HTTP Method - GET. 
    94     GET_METHOD = "GET" 
    95      
    96     # OpenSAML 2 
    97      
    98     # Directory, on the classpath, schemas are located in. 
    99     SCHEMA_DIR = "/schema/" 
    100      
    101     #    Core XML 
    102      
    103     # XML core schema system Id. 
    104     XML_SCHEMA_LOCATION = SCHEMA_DIR + "xml.xsd" 
    105      
    106     #  XML Signature schema Id. 
    107     XMLSIG_SCHEMA_LOCATION = SCHEMA_DIR + "xmldsig-core-schema.xsd" 
    108      
    109     # XML Encryption schema Id. 
    110     XMLENC_SCHEMA_LOCATION = SCHEMA_DIR + "xenc-schema.xsd" 
    111  
    112      
    113     #    SOAP 
    114      
    115     #  SOAP 1.1 schema Id. 
    116     SOAP11ENV_SCHEMA_LOCATION = SCHEMA_DIR + SCHEMA_DIR + "soap-envelope.xsd" 
    117      
    118     #  SOAP 1.1 Envelope XML namespace. 
    119     SOAP11ENV_NS = "http:#schemas.xmlsoap.org/soap/envelope/" 
    120      
    121     #  SOAP 1.1 Envelope QName prefix. 
    122     SOAP11ENV_PREFIX = "SOAP-ENV" 
    123      
    124     #  Liberty PAOS XML Namespace. 
    125     PAOS_NS = "urn:liberty:paos:2003-08" 
    126      
    127     #  Liberty PAOS QName prefix. 
    128     PAOS_PREFIX = "paos" 
    129  
    130      
    131     #    SAML 1.X 
    132      
    133     # SAML 1.0 Assertion schema system Id. 
    134     SAML10_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-01.xsd" 
    135      
    136     # SAML 1.1 Assertion schema system Id. 
    137     SAML11_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-1.1.xsd" 
    138      
    139     # SAML 1.X XML namespace. 
    140     SAML1_NS = "urn:oasis:names:tc:SAML:1.0:assertion" 
    141      
    142     # SAML 1.0 Protocol schema system Id. 
    143     SAML10P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-01.xsd" 
    144      
    145     # SAML 1.1 Protocol schema system Id. 
    146     SAML11P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-1.1.xsd" 
    147  
    148     # SAML 1.X protocol XML namespace. 
    149     SAML10P_NS = "urn:oasis:names:tc:SAML:1.0:protocol" 
    150      
    151     # SAML 1.1 protocol XML namespace, used only in SAML 2 metadata protocol 
    152     # SupportEnumeration. 
    153     SAML11P_NS = "urn:oasis:names:tc:SAML:1.1:protocol" 
    154      
    155     # SAML 1.X Protocol QName prefix. 
    156     SAML1P_PREFIX = "samlp" 
    157  
    158     # SAML 1.X Assertion QName prefix. 
    159     SAML1_PREFIX = "saml" 
    160      
    161     # SAML 1 Metadata extension XML namespace. 
    162     SAML1MD_NS = "urn:oasis:names:tc:SAML:profiles:v1metadata" 
    163      
    164     # SAML 1 Metadata extension schema system Id. 
    165     SAML1MD_SCHEMA_LOCATION = SCHEMA_DIR + "sstc-saml1x-metadata.xsd" 
    166      
    167     # SAML 1 Metadata extension namespace prefix. 
    168     SAML1MD_PREFIX = "saml1md" 
    169      
    170     # URI for SAML 1 Artifact binding. 
    171     SAML1_ARTIFACT_BINDING_URI = \ 
    172         "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" 
    173      
    174     # URI for SAML 1 POST binding. 
    175     SAML1_POST_BINDING_URI = \ 
    176         "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" 
    177      
    178     # URI for SAML 1 SOAP 1.1 binding. 
    179     SAML1_SOAP11_BINDING_URI = \ 
    180         "urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding" 
    181      
    182      
    183     #    SAML 2.0 
    184      
    185     # SAML 2.0 Assertion schema Id. 
    186     SAML20_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-assertion-2.0.xsd" 
    187      
    188     # SAML 2.0 Assertion XML Namespace. 
    189     SAML20_NS = "urn:oasis:names:tc:SAML:2.0:assertion" 
    190      
    191     # SAML 2.0 Assertion QName prefix. 
    192     SAML20_PREFIX ="saml" 
    193      
    194     # SAML 2.0 Protocol schema Id. 
    195     SAML20P_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-protocol-2.0.xsd" 
    196      
    197     # SAML 2.0 Protocol XML Namespace. 
    198     SAML20P_NS = "urn:oasis:names:tc:SAML:2.0:protocol" 
    199      
    200     # SAML 2.0 Protocol QName prefix. 
    201     SAML20P_PREFIX ="samlp" 
    202      
    203     # SAML 2.0 Protocol Third-party extension schema Id. 
    204     SAML20PTHRPTY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
    205                                     "sstc-saml-protocol-ext-thirdparty.xsd" 
    206      
    207     # SAML 2.0 Protocol XML Namespace. 
    208     SAML20PTHRPTY_NS = "urn:oasis:names:tc:SAML:protocol:ext:third-party" 
    209      
    210     # SAML 2.0 Protocol QName prefix. 
    211     SAML20PTHRPTY_PREFIX ="thrpty" 
    212      
    213     # SAML 2.0 Metadata schema Id. 
    214     SAML20MD_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-metadata-2.0.xsd" 
    215      
    216     # SAML 2.0 Metadata XML Namespace. 
    217     SAML20MD_NS ="urn:oasis:names:tc:SAML:2.0:metadata" 
    218      
    219     # SAML 2.0 Standalone Query Metadata extension XML namespace. 
    220     SAML20MDQUERY_NS = "urn:oasis:names:tc:SAML:metadata:ext:query" 
    221      
    222     # SAML 2.0 Standalone Query Metadata extension schema system Id. 
    223     SAML20MDQUERY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
    224                                     "sstc-saml-metadata-ext-query.xsd" 
    225      
    226     # SAML 2.0 Standalone Query Metadata extension prefix. 
    227     SAML20MDQUERY_PREFIX = "query" 
    228      
    229     # SAML 2.0 Metadata QName prefix. 
    230     SAML20MD_PREFIX = "md" 
    231      
    232     # SAML 2.0 Authentication Context schema Id. 
    233     SAML20AC_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-authn-context-2.0.xsd" 
    234      
    235     # SAML 2.0 Authentication Context XML Namespace. 
    236     SAML20AC_NS ="urn:oasis:names:tc:SAML:2.0:ac" 
    237      
    238     # SAML 2.0 Authentication Context QName prefix. 
    239     SAML20AC_PREFIX = "ac" 
    240      
    241     # SAML 2.0 Enhanced Client/Proxy SSO Profile schema Id. 
    242     SAML20ECP_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-ecp-2.0.xsd" 
    243      
    244     # SAML 2.0 Enhanced Client/Proxy SSO Profile XML Namespace. 
    245     SAML20ECP_NS = "urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp" 
    246      
    247     # SAML 2.0 Enhanced Client/Proxy SSO Profile QName prefix. 
    248     SAML20ECP_PREFIX = "ecp" 
    249      
    250     # SAML 2.0 DCE PAC Attribute Profile schema Id. 
    251     SAML20DCE_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-dce-2.0.xsd" 
    252      
    253     # SAML 2.0 DCE PAC Attribute Profile XML Namespace. 
    254     SAML20DCE_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE" 
    255      
    256     # SAML 2.0 DCE PAC Attribute Profile QName prefix. 
    257     SAML20DCE_PREFIX = "DCE" 
    258      
    259     # SAML 2.0 X.500 Attribute Profile schema Id. 
    260     SAML20X500_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-x500-2.0.xsd" 
    261      
    262     # SAML 2.0 X.500 Attribute Profile XML Namespace. 
    263     SAML20X500_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500" 
    264      
    265     # SAML 2.0 X.500 Attribute Profile QName prefix. 
    266     SAML20X500_PREFIX = "x500" 
    267      
    268     # SAML 2.0 XACML Attribute Profile schema Id. 
    269     SAML20XACML_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-xacml-2.0.xsd" 
    270      
    271     # SAML 2.0 XACML Attribute Profile XML Namespace. 
    272     SAML20XACML_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML" 
    273      
    274     # SAML 2.0 XACML Attribute Profile QName prefix. 
    275     SAML20XACML_PREFIX = "xacmlprof" 
    276      
    277     # URI for SAML 2 Artifact binding. 
    278     SAML2_ARTIFACT_BINDING_URI = \ 
    279                         "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" 
    280      
    281     # URI for SAML 2 POST binding. 
    282     SAML2_POST_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
    283      
    284     # URI for SAML 2 POST-SimpleSign binding. 
    285     SAML2_POST_SIMPLE_SIGN_BINDING_URI = \ 
    286                 "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" 
    287      
    288     # URI for SAML 2 HTTP redirect binding. 
    289     SAML2_REDIRECT_BINDING_URI = \ 
    290                 "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
    291      
    292     # URI for SAML 2 SOAP binding. 
    293     SAML2_SOAP11_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" 
     25    """Base class for all SAML types""" 
    29426 
    29527 
    29628class SAMLVersion(object): 
     29    """Version helper class""" 
    29730    VERSION_10 = (1, 0) 
    29831    VERSION_11 = (1, 1) 
     
    727460     
    728461 
    729 class XSGroupRole(SAMLObject):  
    730      '''ESG Specific Group/Role attribute.  ESG attribute permissions are 
    731      organised into group/role pairs 
    732      ''' 
    733      TYPE_LOCAL_NAME = "groupRole" 
     462class XSGroupRoleAttributeValue(AttributeValue):  
     463    '''ESG Specific Group/Role attribute value.  ESG attribute permissions are 
     464    organised into group/role pairs 
     465    ''' 
     466    DEFAULT_NS = "http://www.esg.org" 
     467    DEFAULT_PREFIX = "esg" 
     468    TYPE_LOCAL_NAME = "groupRole" 
     469     
     470    GROUP_ATTRIB_NAME = "group" 
     471    ROLE_ATTRIB_NAME = "role" 
     472     
     473    # QName of the XSI type 
     474    TYPE_NAME = QName(DEFAULT_NS,  
     475                      TYPE_LOCAL_NAME,  
     476                      DEFAULT_PREFIX) 
    734477      
    735      def __init__(self, namespaceURI, elementLocalName, namespacePrefix): 
    736          '''@param namespaceURI the namespace the element is in 
    737          @param elementLocalName the local name of the XML element this Object  
    738          represents 
    739          @param namespacePrefix the prefix for the given namespace''' 
    740          self.namespaceURI = namespaceURI 
    741          self.elementLocalName = elementLocalName 
    742          self.namespacePrefix = namespacePrefix 
    743          self.__group = None 
    744          self.__role = None         
    745            
    746      def _getGroup(self): 
    747          return self.__group 
     478    def __init__(self,  
     479                 namespaceURI=DEFAULT_NS,  
     480                 elementLocalName=TYPE_LOCAL_NAME,  
     481                 namespacePrefix=DEFAULT_PREFIX): 
     482        '''@param namespaceURI: the namespace the element is in 
     483        @param elementLocalName: the local name of the XML element this Object  
     484        represents 
     485        @param namespacePrefix: the prefix for the given namespace''' 
     486        self.__namespaceURI = namespaceURI 
     487        self.__elementLocalName = elementLocalName 
     488        self.__namespacePrefix = namespacePrefix 
     489        self.__group = None 
     490        self.__role = None         
     491 
     492    def _getNamespaceURI(self): 
     493        return self.__namespaceURI 
     494 
     495    def _setNamespaceURI(self, value): 
     496        if not isinstance(value, basestring): 
     497            raise TypeError("Expecting %r type for namespaceURI got %r" % 
     498                            (basestring, value.__class__)) 
     499        self.__namespaceURI = value 
     500 
     501    def _getElementLocalName(self): 
     502        return self.__elementLocalName 
     503 
     504    def _setElementLocalName(self, value): 
     505        if not isinstance(value, basestring): 
     506            raise TypeError("Expecting %r type for elementLocalName got %r" % 
     507                            (basestring, value.__class__)) 
     508        self.__elementLocalName = value 
     509 
     510    def _getNamespacePrefix(self): 
     511        return self.__namespacePrefix 
     512 
     513    def _setNamespacePrefix(self, value): 
     514        if not isinstance(value, basestring): 
     515            raise TypeError("Expecting %r type for namespacePrefix got %r" % 
     516                            (basestring, value.__class__)) 
     517        self.__namespacePrefix = value 
     518 
     519    namespaceURI = property(fget=_getNamespaceURI,  
     520                            fset=_setNamespaceURI,  
     521                            doc="the namespace the element is in") 
     522 
     523    elementLocalName = property(fget=_getElementLocalName,  
     524                                fset=_setElementLocalName,  
     525                                doc="the local name of the XML element this " 
     526                                    "Object represents") 
     527 
     528    namespacePrefix = property(fget=_getNamespacePrefix,  
     529                               fset=_setNamespacePrefix,  
     530                               doc="the prefix for the given namespace") 
     531 
     532    def _getGroup(self): 
     533        return self.__group 
    748534      
    749      def _setGroup(self, group):  
    750          self.__group = group 
     535    def _setGroup(self, group):  
     536        self.__group = group 
    751537      
    752      group = property(fget=_getGroup, fset=_setGroup) 
     538    group = property(fget=_getGroup, fset=_setGroup) 
    753539      
    754      def _getRole(self): 
    755          return self.__role 
     540    def _getRole(self): 
     541        return self.__role 
    756542      
    757      def _setRole(self, role): 
    758          self.__role = role 
     543    def _setRole(self, role): 
     544        self.__role = role 
    759545      
    760      role = property(fget=_getRole, fset=_setRole) 
    761  
    762      def getOrderedChildren(self): 
    763          # no children 
    764          return None 
     546    role = property(fget=_getRole, fset=_setRole) 
     547 
     548    def getOrderedChildren(self): 
     549        # no children 
     550        return None 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/xml/__init__.py

    r5507 r5510  
    1010__contact__ = "Philip.Kershaw@stfc.ac.uk" 
    1111__revision__ = "$Id$" 
    12   
     12 
     13class XMLConstants(object): 
     14    '''XML related constants.''' 
     15 
     16    # XML Tooling 
     17 
     18    # Configuration namespace 
     19    XMLTOOLING_CONFIG_NS = "http:#www.opensaml.org/xmltooling-config" 
     20 
     21    # Configuration namespace prefix 
     22    XMLTOOLING_CONFIG_PREFIX = "xt" 
     23     
     24    # Name of the object provider used for objects that don't have a registered 
     25    # object provider 
     26    XMLTOOLING_DEFAULT_OBJECT_PROVIDER = "DEFAULT" 
     27 
     28    # Core XML 
     29 
     30    # XML core namespace 
     31    XML_NS = "http:#www.w3.org/XML/1998/namespace" 
     32     
     33    # XML core prefix for xml attributes 
     34    XML_PREFIX = "xml" 
     35 
     36    # XML namespace for xmlns attributes 
     37    XMLNS_NS = "http://www.w3.org/2000/xmlns/" 
     38 
     39    # XML namespace prefix for xmlns attributes 
     40    XMLNS_PREFIX = "xmlns" 
     41 
     42    # XML Schema namespace 
     43    XSD_NS = "http://www.w3.org/2001/XMLSchema" 
     44 
     45    # XML Schema QName prefix 
     46    XSD_PREFIX = "xs" 
     47 
     48    # XML Schema Instance namespace 
     49    XSI_NS = "http://www.w3.org/2001/XMLSchema-instance" 
     50 
     51    # XML Schema Instance QName prefix 
     52    XSI_PREFIX = "xsi" 
     53 
     54    # XML XMLSecSignatureImpl namespace 
     55    XMLSIG_NS = "http://www.w3.org/2000/09/xmldsig#" 
     56 
     57    # XML XMLSecSignatureImpl QName prefix 
     58    XMLSIG_PREFIX = "ds" 
     59 
     60    # XML Encryption namespace 
     61    XMLENC_NS = "http://www.w3.org/2001/04/xmlenc#" 
     62 
     63    # XML Encryption QName prefix 
     64    XMLENC_PREFIX = "xenc" 
     65     
     66    # Local name of EncryptedData element 
     67    XMLENC_ENCDATA_LOCAL_NAME = "EncryptedData" 
     68     
     69    # Local name of EncryptedKey element 
     70    XMLENC_ENCKEY_LOCAL_NAME = "EncryptedKey" 
     71     
     72 
     73class SAMLConstants(XMLConstants): 
     74    '''XML related constants used in the SAML specifications.''' 
     75     
     76    # HTTP Constants 
     77     
     78    # HTTP Request Method - POST. 
     79    POST_METHOD = "POST" 
     80     
     81    # HTTP Method - GET. 
     82    GET_METHOD = "GET" 
     83     
     84    # OpenSAML 2 
     85     
     86    # Directory, on the classpath, schemas are located in. 
     87    SCHEMA_DIR = "/schema/" 
     88     
     89    #    Core XML 
     90     
     91    # XML core schema system Id. 
     92    XML_SCHEMA_LOCATION = SCHEMA_DIR + "xml.xsd" 
     93     
     94    #  XML Signature schema Id. 
     95    XMLSIG_SCHEMA_LOCATION = SCHEMA_DIR + "xmldsig-core-schema.xsd" 
     96     
     97    # XML Encryption schema Id. 
     98    XMLENC_SCHEMA_LOCATION = SCHEMA_DIR + "xenc-schema.xsd" 
     99 
     100     
     101    #    SOAP 
     102     
     103    #  SOAP 1.1 schema Id. 
     104    SOAP11ENV_SCHEMA_LOCATION = SCHEMA_DIR + SCHEMA_DIR + "soap-envelope.xsd" 
     105     
     106    #  SOAP 1.1 Envelope XML namespace. 
     107    SOAP11ENV_NS = "http:#schemas.xmlsoap.org/soap/envelope/" 
     108     
     109    #  SOAP 1.1 Envelope QName prefix. 
     110    SOAP11ENV_PREFIX = "SOAP-ENV" 
     111     
     112    #  Liberty PAOS XML Namespace. 
     113    PAOS_NS = "urn:liberty:paos:2003-08" 
     114     
     115    #  Liberty PAOS QName prefix. 
     116    PAOS_PREFIX = "paos" 
     117 
     118     
     119    #    SAML 1.X 
     120     
     121    # SAML 1.0 Assertion schema system Id. 
     122    SAML10_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-01.xsd" 
     123     
     124    # SAML 1.1 Assertion schema system Id. 
     125    SAML11_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-assertion-1.1.xsd" 
     126     
     127    # SAML 1.X XML namespace. 
     128    SAML1_NS = "urn:oasis:names:tc:SAML:1.0:assertion" 
     129     
     130    # SAML 1.0 Protocol schema system Id. 
     131    SAML10P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-01.xsd" 
     132     
     133    # SAML 1.1 Protocol schema system Id. 
     134    SAML11P_SCHEMA_LOCATION = SCHEMA_DIR + "cs-sstc-schema-protocol-1.1.xsd" 
     135 
     136    # SAML 1.X protocol XML namespace. 
     137    SAML10P_NS = "urn:oasis:names:tc:SAML:1.0:protocol" 
     138     
     139    # SAML 1.1 protocol XML namespace, used only in SAML 2 metadata protocol 
     140    # SupportEnumeration. 
     141    SAML11P_NS = "urn:oasis:names:tc:SAML:1.1:protocol" 
     142     
     143    # SAML 1.X Protocol QName prefix. 
     144    SAML1P_PREFIX = "samlp" 
     145 
     146    # SAML 1.X Assertion QName prefix. 
     147    SAML1_PREFIX = "saml" 
     148     
     149    # SAML 1 Metadata extension XML namespace. 
     150    SAML1MD_NS = "urn:oasis:names:tc:SAML:profiles:v1metadata" 
     151     
     152    # SAML 1 Metadata extension schema system Id. 
     153    SAML1MD_SCHEMA_LOCATION = SCHEMA_DIR + "sstc-saml1x-metadata.xsd" 
     154     
     155    # SAML 1 Metadata extension namespace prefix. 
     156    SAML1MD_PREFIX = "saml1md" 
     157     
     158    # URI for SAML 1 Artifact binding. 
     159    SAML1_ARTIFACT_BINDING_URI = \ 
     160        "urn:oasis:names:tc:SAML:1.0:profiles:artifact-01" 
     161     
     162    # URI for SAML 1 POST binding. 
     163    SAML1_POST_BINDING_URI = \ 
     164        "urn:oasis:names:tc:SAML:1.0:profiles:browser-post" 
     165     
     166    # URI for SAML 1 SOAP 1.1 binding. 
     167    SAML1_SOAP11_BINDING_URI = \ 
     168        "urn:oasis:names:tc:SAML:1.0:bindings:SOAP-binding" 
     169     
     170     
     171    #    SAML 2.0 
     172     
     173    # SAML 2.0 Assertion schema Id. 
     174    SAML20_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-assertion-2.0.xsd" 
     175     
     176    # SAML 2.0 Assertion XML Namespace. 
     177    SAML20_NS = "urn:oasis:names:tc:SAML:2.0:assertion" 
     178     
     179    # SAML 2.0 Assertion QName prefix. 
     180    SAML20_PREFIX ="saml" 
     181     
     182    # SAML 2.0 Protocol schema Id. 
     183    SAML20P_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-protocol-2.0.xsd" 
     184     
     185    # SAML 2.0 Protocol XML Namespace. 
     186    SAML20P_NS = "urn:oasis:names:tc:SAML:2.0:protocol" 
     187     
     188    # SAML 2.0 Protocol QName prefix. 
     189    SAML20P_PREFIX ="samlp" 
     190     
     191    # SAML 2.0 Protocol Third-party extension schema Id. 
     192    SAML20PTHRPTY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
     193                                    "sstc-saml-protocol-ext-thirdparty.xsd" 
     194     
     195    # SAML 2.0 Protocol XML Namespace. 
     196    SAML20PTHRPTY_NS = "urn:oasis:names:tc:SAML:protocol:ext:third-party" 
     197     
     198    # SAML 2.0 Protocol QName prefix. 
     199    SAML20PTHRPTY_PREFIX ="thrpty" 
     200     
     201    # SAML 2.0 Metadata schema Id. 
     202    SAML20MD_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-metadata-2.0.xsd" 
     203     
     204    # SAML 2.0 Metadata XML Namespace. 
     205    SAML20MD_NS ="urn:oasis:names:tc:SAML:2.0:metadata" 
     206     
     207    # SAML 2.0 Standalone Query Metadata extension XML namespace. 
     208    SAML20MDQUERY_NS = "urn:oasis:names:tc:SAML:metadata:ext:query" 
     209     
     210    # SAML 2.0 Standalone Query Metadata extension schema system Id. 
     211    SAML20MDQUERY_SCHEMA_LOCATION = SCHEMA_DIR + \ 
     212                                    "sstc-saml-metadata-ext-query.xsd" 
     213     
     214    # SAML 2.0 Standalone Query Metadata extension prefix. 
     215    SAML20MDQUERY_PREFIX = "query" 
     216     
     217    # SAML 2.0 Metadata QName prefix. 
     218    SAML20MD_PREFIX = "md" 
     219     
     220    # SAML 2.0 Authentication Context schema Id. 
     221    SAML20AC_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-authn-context-2.0.xsd" 
     222     
     223    # SAML 2.0 Authentication Context XML Namespace. 
     224    SAML20AC_NS ="urn:oasis:names:tc:SAML:2.0:ac" 
     225     
     226    # SAML 2.0 Authentication Context QName prefix. 
     227    SAML20AC_PREFIX = "ac" 
     228     
     229    # SAML 2.0 Enhanced Client/Proxy SSO Profile schema Id. 
     230    SAML20ECP_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-ecp-2.0.xsd" 
     231     
     232    # SAML 2.0 Enhanced Client/Proxy SSO Profile XML Namespace. 
     233    SAML20ECP_NS = "urn:oasis:names:tc:SAML:2.0:profiles:SSO:ecp" 
     234     
     235    # SAML 2.0 Enhanced Client/Proxy SSO Profile QName prefix. 
     236    SAML20ECP_PREFIX = "ecp" 
     237     
     238    # SAML 2.0 DCE PAC Attribute Profile schema Id. 
     239    SAML20DCE_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-dce-2.0.xsd" 
     240     
     241    # SAML 2.0 DCE PAC Attribute Profile XML Namespace. 
     242    SAML20DCE_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:DCE" 
     243     
     244    # SAML 2.0 DCE PAC Attribute Profile QName prefix. 
     245    SAML20DCE_PREFIX = "DCE" 
     246     
     247    # SAML 2.0 X.500 Attribute Profile schema Id. 
     248    SAML20X500_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-x500-2.0.xsd" 
     249     
     250    # SAML 2.0 X.500 Attribute Profile XML Namespace. 
     251    SAML20X500_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:X500" 
     252     
     253    # SAML 2.0 X.500 Attribute Profile QName prefix. 
     254    SAML20X500_PREFIX = "x500" 
     255     
     256    # SAML 2.0 XACML Attribute Profile schema Id. 
     257    SAML20XACML_SCHEMA_LOCATION = SCHEMA_DIR + "saml-schema-xacml-2.0.xsd" 
     258     
     259    # SAML 2.0 XACML Attribute Profile XML Namespace. 
     260    SAML20XACML_NS = "urn:oasis:names:tc:SAML:2.0:profiles:attribute:XACML" 
     261     
     262    # SAML 2.0 XACML Attribute Profile QName prefix. 
     263    SAML20XACML_PREFIX = "xacmlprof" 
     264     
     265    # URI for SAML 2 Artifact binding. 
     266    SAML2_ARTIFACT_BINDING_URI = \ 
     267                        "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Artifact" 
     268     
     269    # URI for SAML 2 POST binding. 
     270    SAML2_POST_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST" 
     271     
     272    # URI for SAML 2 POST-SimpleSign binding. 
     273    SAML2_POST_SIMPLE_SIGN_BINDING_URI = \ 
     274                "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-POST-SimpleSign" 
     275     
     276    # URI for SAML 2 HTTP redirect binding. 
     277    SAML2_REDIRECT_BINDING_URI = \ 
     278                "urn:oasis:names:tc:SAML:2.0:bindings:HTTP-Redirect" 
     279     
     280    # URI for SAML 2 SOAP binding. 
     281    SAML2_SOAP11_BINDING_URI = "urn:oasis:names:tc:SAML:2.0:bindings:SOAP" 
     282 
    13283 
    14284class XMLObject(object): 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/saml/xml/etree.py

    r5507 r5510  
    1919    # if you've installed it yourself it comes this way 
    2020    import cElementTree as ElementTree 
    21  
    22 from ndg.security.common.saml import SAMLObject, Assertion, Attribute, \ 
    23     AttributeStatement, AttributeValue, XSStringAttributeValue, XMLConstants 
    24      
    25 from ndg.security.common.saml.xml import XMLObject, AssertionXMLObject 
     21     
    2622from ndg.security.common.utils import canonicalize 
    2723 
    2824# XML signature module based on M2Crypto 
    2925from ndg.security.common.xmlsec.etree import XMLSecDoc, InvalidSignature 
     26 
     27from ndg.security.common.saml import SAMLObject, Assertion, Attribute, \ 
     28    AttributeStatement, AttributeValue, XSStringAttributeValue, \ 
     29    XSGroupRoleAttributeValue 
     30     
     31from ndg.security.common.saml.xml import XMLObject, AssertionXMLObject, \ 
     32    XMLConstants 
    3033 
    3134 
     
    5053        return canonicalize(self._elem) 
    5154     
    52  
     55    def prettyPrint(self): 
     56        """Basic pretty printing separating each element on to a new line""" 
     57        xml = self.serialize() 
     58        xml = ">\n".join(xml.split(">")) 
     59        xml = "\n</".join(xml.split("<")) 
     60        xml = '\n'.join(xml.split('\n\n')) 
     61        return xml 
     62     
     63                          
    5364class AssertionETreeObject(ETreeObject, AssertionXMLObject): 
    5465    """ElementTree based XML representation of Assertion class 
     
    5869        AssertionXMLObject.__init__(self) 
    5970     
    60     def create(self, assertion, makeNsDeclaration=True, **attributeFactoryKw): 
     71    def create(self, assertion, makeNsDeclaration=True,  
     72               **attributeValueETreeObjectFactoryKw): 
    6173        """Make a tree of a XML elements based on the assertion""" 
    6274        if not isinstance(assertion, Assertion): 
     
    8294        for attributeStatement in assertion.attributeStatements: 
    8395            attributeStatementElem = attributeStatementETreeObject.create( 
    84                                                     attributeStatement, 
    85                                                     makeNsDeclaration=False, 
    86                                                     **attributeFactoryKw) 
     96                                        attributeStatement, 
     97                                        makeNsDeclaration=False, 
     98                                        **attributeValueETreeObjectFactoryKw) 
    8799            self._elem.append(attributeStatementElem) 
    88100         
    89         log.debug(canonicalize(self._elem)) 
     101        log.debug("Created Assertion:\n\n%s" %  
     102                  ">\n".join(self.serialize().split(">"))) 
    90103        return self._elem 
    91104 
     
    95108     
    96109    def create(self, attributeStatement, makeNsDeclaration=True,  
    97                **attributeFactoryKw): 
     110               **attributeValueETreeObjectFactoryKw): 
    98111        if not isinstance(attributeStatement, AttributeStatement): 
    99112            raise TypeError("Expecting %r type got: %r" % (AttributeStatement,  
     
    107120                AttributeStatement.DEFAULT_ELEMENT_NAME.namespaceURI) 
    108121 
     122        attributeETreeObject = AttributeETreeObject() 
    109123 
    110124        for attribute in attributeStatement.attributes: 
    111125            # Factory enables support for multiple attribute types 
    112             attributeETreeObject = AttributeETreeObjectFactory(attribute) 
    113126            attributeElem = attributeETreeObject.create(attribute, 
    114                                                     makeNsDeclaration=False) 
     127                                        makeNsDeclaration=False, 
     128                                        **attributeValueETreeObjectFactoryKw) 
    115129            self._elem.append(attributeElem) 
    116130         
     
    122136    to make Attribute types"""  
    123137 
    124     def create(self, attribute, makeNsDeclaration=True): 
     138    def create(self, attribute, makeNsDeclaration=True, 
     139               **attributeValueETreeObjectFactoryKw): 
    125140        """Make 'Attribute' element""" 
     141         
    126142        if not isinstance(attribute, Attribute): 
    127143            raise TypeError("Expecting %r type got: %r"%(Attribute, attribute)) 
     
    131147            self._elem.set("xmlns:%s" % Attribute.DEFAULT_ELEMENT_NAME.prefix,  
    132148                           Attribute.DEFAULT_ELEMENT_NAME.namespaceURI) 
    133  
    134         attributeValueETreeObject = AttributeValueETreeObject() 
    135          
    136         for attributeValue in attribute.attributeValues: 
    137             factory = AttributeValueETreeObjectFactory( 
    138                                         **attributeValueETreeObjectFactoryKw) 
    139              
    140             attributeValueETreeObject = factory(attributeValue) 
    141              
    142             attributeValueElem = attributeValueETreeObject.create( 
    143                                                     attributeValue,  
    144                                                     makeNsDeclaration=False) 
    145             self._elem.append(attributeValueElem) 
    146              
    147         return self._elem 
    148  
    149  
    150 class XSStringAttributeETreeObject(ETreeObject): 
    151     """ElementTree XML representation of SAML String Attribute object"""  
    152  
    153     def create(self, attribute, makeNsDeclaration=True, 
    154                **attributeValueETreeObjectFactoryKw): 
    155          
    156         super(XSStringAttributeETreeObject, self).create(attribute, 
    157                                         makeNsDeclaration=makeNsDeclaration) 
    158149             
    159150        if attribute.friendlyName: 
     
    167158                           attribute.nameFormat) 
    168159 
    169         attributeValueETreeObject = XSStringAttributeValueETreeObject() 
    170          
    171160        for attributeValue in attribute.attributeValues: 
     161            factory = AttributeValueETreeObjectFactory( 
     162                                        **attributeValueETreeObjectFactoryKw) 
     163             
     164            attributeValueETreeObject = factory(attributeValue) 
     165             
    172166            attributeValueElem = attributeValueETreeObject.create( 
    173167                                                    attributeValue,  
     
    178172  
    179173     
    180 class AttributeValueETreeObject(ETreeObject): 
    181     """ElementTree XML representation of SAML Attribute Value"""  
     174class AttributeValueETreeObjectBase(ETreeObject): 
     175    """Base class ElementTree XML representation of SAML Attribute Value"""  
    182176     
    183177    def create(self, attributeValue, makeNsDeclaration=True): 
     
    198192 
    199193 
    200 class XSStringAttributeValueETreeObject(AttributeValueETreeObject): 
     194class XSStringAttributeValueETreeObject(AttributeValueETreeObjectBase): 
    201195    """ElementTree XML representation of SAML String type Attribute Value"""  
    202196     
     
    228222 
    229223 
    230 class XSGroupRoleAttributeValueETreeObject(AttributeValueETreeObject): 
     224class XSGroupRoleAttributeValueETreeObject(AttributeValueETreeObjectBase): 
    231225    """ElementTree XML representation of Earth System Grid custom Group/Role  
    232226    Attribute Value"""  
     
    238232                                        makeNsDeclaration=makeNsDeclaration) 
    239233         
    240         if not isinstance(attributeValue,XSGroupRoleAttributeValueETreeObject): 
    241             raise TypeError("Expecting %r type got: %r" %  
    242                             (XSGroupRoleAttributeValueETreeObject,  
    243                              attributeValue))  
    244                     
     234        if not isinstance(attributeValue, XSGroupRoleAttributeValue): 
     235            raise TypeError("Expecting %r type; got: %r" %  
     236                            (XSGroupRoleAttributeValue, attributeValue)) 
     237             
    245238        self._elem.set("%s:%s" % (XMLConstants.XMLNS_PREFIX,  
    246                                   XMLConstants.XSD_PREFIX),  
    247                        XMLConstants.XSD_NS) 
    248          
    249         self._elem.set("%s:%s" % (XMLConstants.XMLNS_PREFIX, 
    250                                   XMLConstants.XSI_PREFIX),  
    251                        XMLConstants.XSI_NS) 
    252          
    253         self._elem.set("%s:%s" % (XMLConstants.XSI_PREFIX, 'type'),  
    254                        "%s:%s" % (XMLConstants.XSD_PREFIX,  
    255                                   XSStringAttributeValue.TYPE_LOCAL_NAME)) 
    256  
    257         self._elem.text = attributeValue.value 
    258  
    259         return self._elem 
    260  
    261 class AttributeETreeObjectFactory(object): 
     239                                  attributeValue.namespacePrefix),  
     240                       attributeValue.namespaceURI) 
     241         
     242        self._elem.set(XSGroupRoleAttributeValue.GROUP_ATTRIB_NAME,  
     243                       attributeValue.group) 
     244         
     245        self._elem.set(XSGroupRoleAttributeValue.ROLE_ATTRIB_NAME,  
     246                       attributeValue.role) 
     247 
     248        return self._elem 
     249 
     250class AttributeValueETreeObjectFactory(object): 
    262251    """Factory for creating ElementTree representations of SAML Attribute  
    263     types 
     252    value types 
    264253    """ 
    265     def __init__(self, customClasses={}):  
     254    classMap = { 
     255        XSStringAttributeValue: XSStringAttributeValueETreeObject 
     256    } 
     257     
     258    def __init__(self, customClassMap={}):  
    266259        """Set-up a SAML class to ElementTree mapping 
    267260        """ 
    268         self.__classLookUp = { 
    269             XSStringAttributeValue: XSStringAttributeValueETreeObject 
    270         } 
    271         for samlClass, etreeClass in customClasses.items():  
    272             if not issubclass(samlClass, Attribute): 
     261        self.__classMap = AttributeValueETreeObjectFactory.classMap 
     262        for samlClass, etreeClass in customClassMap.items():  
     263            if not issubclass(samlClass, AttributeValue): 
    273264                raise TypeError("Input custom class must be derived from %r, " 
    274265                                "got %r instead" % (Attribute, samlClass)) 
    275266                 
    276             self.__classLookUp[samlClass] = etreeClass 
     267            self.__classMap[samlClass] = etreeClass 
    277268             
    278269    def __call__(self, samlObject): 
     
    284275                                                           samlObject)) 
    285276             
    286         xmlObjectClass = self.__classLookUp.get(samlObject.__class__) 
     277        xmlObjectClass = self.__classMap.get(samlObject.__class__) 
    287278        if xmlObjectClass is None: 
    288279            raise TypeError("no matching XMLObject class representation for " 
  • TI12-security/trunk/python/ndg.security.common/ndg/security/common/utils/__init__.py

    r5504 r5510  
    3434 
    3535class QName(ElementTree.QName): 
     36    """Extend ElementTree implementation for improved attribute access support 
     37    """ 
     38     
    3639    def __init__(self, namespaceURI, tag=None, prefix=None): 
    3740        ElementTree.QName.__init__(self, namespaceURI, tag=tag) 
  • TI12-security/trunk/python/ndg.security.test/ndg/security/test/unit/attributeauthority/saml/test_samlinterface.py

    r5507 r5510  
    2020 
    2121from ndg.security.common.saml import Assertion, Attribute, AttributeValue, \ 
    22     AttributeStatement, SAMLVersion, XSGroupRole, XSStringAttributeValue 
    23 from ndg.security.common.saml.xml.etree import AssertionETreeObject 
     22    AttributeStatement, SAMLVersion, XSStringAttributeValue, \ 
     23    XSGroupRoleAttributeValue 
     24from ndg.security.common.saml.xml import XMLConstants 
     25from ndg.security.common.saml.xml.etree import AssertionETreeObject, \ 
     26    XSGroupRoleAttributeValueETreeObject 
    2427 
    2528class Request(object): 
     
    3942        samlUtil = SamlUtil() 
    4043         
     44        # ESG core attributes 
    4145        samlUtil.firstName = "Philip" 
    4246        samlUtil.lastName = "Kershaw" 
    4347        samlUtil.emailAddress = "p.j.k@somewhere" 
    4448         
    45         samlUtil.groupRoleList = [ 
    46             ('urn:badc:security:authz:1.0:attr:org:id:badc',  
    47              'urn:badc:security:authz:1.0:attr:staff') 
    48         ] 
     49        # BADC specific attributes 
     50        badcRoleList = ( 
     51            'urn:badc:security:authz:1.0:attr:rapid',  
     52            'urn:badc:security:authz:1.0:attr:coapec',  
     53            'urn:badc:security:authz:1.0:attr:midas',  
     54            'urn:badc:security:authz:1.0:attr:quest',  
     55            'urn:badc:security:authz:1.0:attr:staff' 
     56        ) 
     57        for role in badcRoleList: 
     58            samlUtil.addAttribute("urn:badc:security:authz:1.0:attr", role) 
     59         
     60        # ESG Group/Role type list 
     61        esgGroupRoleList = ( 
     62            ("ESG-NCAR", "admin"), 
     63            ("ESG-PCMDI", "testUser"), 
     64        ) 
     65        for group, role in esgGroupRoleList: 
     66            samlUtil.addGroupRole(group, role) 
     67         
     68        # Make an assertion object 
    4969        assertion = samlUtil.buildAssertion() 
     70         
     71        # Create XML rendering class using the ElementTree implementation 
    5072        assertionETreeObject = AssertionETreeObject() 
    51         assertionElem = assertionETreeObject.create(assertion) 
    52         print(">\n".join(assertionETreeObject.serialize().split(">"))) 
     73         
     74        # Add mapping for ESG Group/Role Attribute Value to enable ElementTree 
     75        # Attribute Value factory to render the XML output 
     76        attributeValueETreeObjectClassMap = { 
     77            XSGroupRoleAttributeValue: XSGroupRoleAttributeValueETreeObject            
     78        } 
     79         
     80        # Create ElementTree Assertion Element 
     81        assertionElem = assertionETreeObject.create(assertion, 
     82                            customClassMap=attributeValueETreeObjectClassMap) 
     83         
     84        # Serialise to output 
     85        print(assertionETreeObject.prettyPrint()) 
    5386 
    5487 
     
    6194        self.emailAddress = None 
    6295         
    63         self.groupRoleList = [] 
    64         self.miscAttrList = [] 
     96        self.__groupRoleList = [] 
     97        self.__miscAttrList = [] 
    6598 
    6699    def addGroupRole(self, group, role): 
    67         self.groupRoleList.append((group, role)) 
     100        self.__groupRoleList.append((group, role)) 
    68101     
    69102    def addAttribute(self, name, value): 
    70         self.miscAttrList.append((name, value)) 
     103        self.__miscAttrList.append((name, value)) 
    71104 
    72105    def buildAssertion(self): 
     
    111144            emailAddressAttribute = Attribute() 
    112145            emailAddressAttribute.name = "urn:esg:email:address" 
    113             emailAddressAttribute.nameFormat = \ 
    114                                     "http://www.w3.org/2001/XMLSchema#string" 
     146            emailAddressAttribute.nameFormat = XMLConstants.XSD_NS+"#"+\ 
     147                                        XSStringAttributeValue.TYPE_LOCAL_NAME 
    115148            emailAddressAttribute.friendlyName = "emailAddress" 
    116149 
     
    121154            attributeStatement.attributes.append(emailAddressAttribute) 
    122155         
    123 #        if len(self.groupRoleList) > 0: 
    124 #            # custom group/role attribute to be added to attr statement 
    125 #            groupRoleAttr = Attribute() 
    126 #            groupRoleAttr.name = "GroupRole" 
    127 #            groupRoleAttr.nameFormat = XSGroupRole.TYPE_LOCAL_NAME 
    128 # 
    129 #            for group, role in self.groupRoleList: 
    130 #                groupRoleValue = XSGroupRole("http://www.esg.org",  
    131 #                                             "groupRole",  
    132 #                                             "esg") 
    133 # 
    134 #                groupRoleValue.group = group 
    135 #                groupRoleValue.role = role 
    136 # 
    137 #                groupRoleAttrValue = (AttributeValue.DEFAULT_ELEMENT_NAME, 
    138 #                                      groupRoleValue) 
    139 # 
    140 #                groupRoleAttr.attributeValues.append(groupRoleAttrValue) 
    141 #             
    142 #            attributeStatement.attributes.append(groupRoleAttr) 
    143 #         
    144 #        if len(self.miscAttrList) > 0: 
    145 #         
    146 #            for name, value in self.miscAttrList: 
    147 #                attribute = Attribute() 
    148 #                attribute.name = name 
    149 #                attribute.nameFormat="http://www.w3.org/2001/XMLSchema#string" 
    150 # 
    151 #                stringValue = (AttributeValue.DEFAULT_ELEMENT_NAME,  
    152 #                               "string", 
    153 #                               value) 
    154 #                attribute.attributeValues.append(stringValue) 
    155 # 
    156 #                # add all attributes to the attribute statement                                                                                                    
    157 #                attributeStatement.attributes.append(attribute) 
     156        if len(self.__groupRoleList) > 0: 
     157            # custom group/role attribute to be added to attr statement 
     158            groupRoleAttribute = Attribute() 
     159            groupRoleAttribute.name = "GroupRole" 
     160            groupRoleAttribute.nameFormat = \ 
     161                                    XSGroupRoleAttributeValue.TYPE_LOCAL_NAME 
     162 
     163            for group, role in self.__groupRoleList: 
     164                groupRole = XSGroupRoleAttributeValue() 
     165                groupRole.group = group 
     166                groupRole.role = role 
     167 
     168                groupRoleAttribute.attributeValues.append(groupRole) 
     169             
     170            attributeStatement.attributes.append(groupRoleAttribute) 
     171         
     172        for name, value in self.__miscAttrList: 
     173            attribute = Attribute() 
     174            attribute.name = name 
     175            attribute.nameFormat="http://www.w3.org/2001/XMLSchema#string" 
     176 
     177            stringAttributeValue = XSStringAttributeValue() 
     178            stringAttributeValue.value = value 
     179            attribute.attributeValues.append(stringAttributeValue) 
     180 
     181            # add all attributes to the attribute statement                                                                                                    
     182            attributeStatement.attributes.append(attribute) 
    158183             
    159184        assertion.attributeStatements.append(attributeStatement) 
Note: See TracChangeset for help on using the changeset viewer.