source: TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/saml_utils/esgf/__init__.py @ 7698

Subversion URL: http://proj.badc.rl.ac.uk/svn/ndg/TI12-security/trunk/NDGSecurity/python/ndg_security_common/ndg/security/common/saml_utils/esgf/__init__.py@7698
Revision 7698, 6.2 KB checked in by pjkersha, 10 years ago (diff)

Integrated SAML ESGF Group/Role? attribute value type into SAML Attribute Authority client unit tests.

  • Property svn:keywords set to Id
Line 
1"""SAML 2.0 Earth System Grid specific functionality
2
3NERC DataGrid Project
4"""
5__author__ = "P J Kershaw"
6__date__ = "09/11/09"
7__copyright__ = "(C) 2009 Science and Technology Facilities Council"
8__license__ = "BSD - see LICENSE file in top-level directory"
9__contact__ = "Philip.Kershaw@stfc.ac.uk"
10__revision__ = '$Id$'
11from ndg.saml.saml2.core import (XSStringAttributeValue, AttributeValue, 
12                                 Attribute)
13from ndg.saml.common.xml import QName, SAMLConstants
14
15from ndg.security.common.utils import TypedList
16
17
18class  _MetaESGFSamlNamespaces(type):
19    """Meta class enables read-only constants"""
20    @property
21    def FIRSTNAME_ATTRNAME(self):
22        return "urn:esg:first:name"
23   
24    @property
25    def FIRSTNAME_FRIENDLYNAME(self):
26        return "FirstName"
27   
28    @property
29    def LASTNAME_ATTRNAME(self):
30        return "urn:esg:last:name"
31   
32    @property
33    def LASTNAME_FRIENDLYNAME(self):
34        return "LastName"
35   
36    @property
37    def EMAILADDRESS_ATTRNAME(self):
38        return "urn:esg:email:address"
39   
40    @property
41    def EMAILADDRESS_FRIENDLYNAME(self):
42        return "EmailAddress"
43   
44    @property
45    def NAMEID_FORMAT(self):
46        return "urn:esg:openid"
47
48 
49class ESGFSamlNamespaces(object):
50    """Earth System Grid specific constants for use with SAML assertions"""
51    __metaclass__ = _MetaESGFSamlNamespaces
52   
53   
54class ESGFGroupRoleAttributeValue(AttributeValue): 
55    '''ESG Specific Group/Role attribute value.  ESG attribute permissions are
56    organised into group/role pairs
57    '''
58    DEFAULT_NS = "http://www.earthsystemgrid.org"
59    DEFAULT_PREFIX = "esg"
60    TYPE_LOCAL_NAME = "groupRole"
61   
62    GROUP_ATTRIB_NAME = "group"
63    ROLE_ATTRIB_NAME = "role"
64    DEFAULT_ROLE_NAME = "default"
65   
66    # QName of the XSI type
67    TYPE_NAME = QName(DEFAULT_NS, 
68                      TYPE_LOCAL_NAME, 
69                      DEFAULT_PREFIX)
70     
71    def __init__(self, 
72                 namespaceURI=DEFAULT_NS, 
73                 elementLocalName=TYPE_LOCAL_NAME, 
74                 namespacePrefix=DEFAULT_PREFIX):
75        '''@param namespaceURI: the namespace the element is in
76        @param elementLocalName: the local name of the XML element this Object
77        represents
78        @param namespacePrefix: the prefix for the given namespace'''
79        self.__namespaceURI = namespaceURI
80        self.__elementLocalName = elementLocalName
81        self.__namespacePrefix = namespacePrefix
82        self.__group = None
83        self.__role = None       
84
85    def _getNamespaceURI(self):
86        return self.__namespaceURI
87
88    def _setNamespaceURI(self, value):
89        if not isinstance(value, basestring):
90            raise TypeError("Expecting %r type for namespaceURI got %r" %
91                            (basestring, value.__class__))
92        self.__namespaceURI = value
93
94    def _getElementLocalName(self):
95        return self.__elementLocalName
96
97    def _setElementLocalName(self, value):
98        if not isinstance(value, basestring):
99            raise TypeError("Expecting %r type for elementLocalName got %r" %
100                            (basestring, value.__class__))
101        self.__elementLocalName = value
102
103    def _getNamespacePrefix(self):
104        return self.__namespacePrefix
105
106    def _setNamespacePrefix(self, value):
107        if not isinstance(value, basestring):
108            raise TypeError("Expecting %r type for namespacePrefix got %r" %
109                            (basestring, value.__class__))
110        self.__namespacePrefix = value
111
112    namespaceURI = property(fget=_getNamespaceURI, 
113                            fset=_setNamespaceURI, 
114                            doc="the namespace the element is in")
115
116    elementLocalName = property(fget=_getElementLocalName, 
117                                fset=_setElementLocalName, 
118                                doc="the local name of the XML element this "
119                                    "Object represents")
120
121    namespacePrefix = property(fget=_getNamespacePrefix, 
122                               fset=_setNamespacePrefix, 
123                               doc="the prefix for the given namespace")
124
125    def _getGroup(self):
126        return self.__group
127     
128    def _setGroup(self, group): 
129        if not isinstance(group, basestring):
130            raise TypeError('Expecting a string type for "group" attribute; '
131                            'got %r' % type(group))
132        self.__group = group
133     
134    group = property(fget=_getGroup, fset=_setGroup, doc="Group value")
135     
136    def _getRole(self):
137        return self.__role
138     
139    def _setRole(self, role):
140        if not isinstance(role, basestring):
141            raise TypeError('Expecting a string type for "role" attribute; '
142                            'got %r' % type(role))           
143        self.__role = role
144     
145    role = property(fget=_getRole, fset=_setRole, doc="Role value")
146
147    def _setValue(self, value):
148        if not isinstance(value, (tuple, list)) and len(value) != 2:
149            raise TypeError('Expecting a two element tuple or list for group/'
150                            'role value; got %r' % type(value))
151           
152        self.group, self.role = value
153       
154    def _getValue(self):
155        return self.group, self.role
156   
157    value = property(_getValue, _setValue, 
158                     doc="group/role attribute value tuple")
159   
160    def getOrderedChildren(self):
161        # no children
162        return None
163
164
165class ESGFDefaultQueryAttributes(object):   
166    XSSTRING_NS = "%s#%s" % (
167        SAMLConstants.XSD_NS,
168        XSStringAttributeValue.TYPE_LOCAL_NAME
169    )
170   
171    ATTRIBUTES = TypedList(Attribute)
172    N_ATTRIBUTES = 3
173    i = 0
174    for i in range(N_ATTRIBUTES): 
175        ATTRIBUTES.append(Attribute())
176    del i
177   
178    ATTRIBUTES[0].name = ESGFSamlNamespaces.FIRSTNAME_ATTRNAME
179    ATTRIBUTES[0].friendlyName = ESGFSamlNamespaces.FIRSTNAME_FRIENDLYNAME
180    ATTRIBUTES[0].nameFormat = XSSTRING_NS
181
182    ATTRIBUTES[1].name = ESGFSamlNamespaces.LASTNAME_ATTRNAME
183    ATTRIBUTES[1].friendlyName = ESGFSamlNamespaces.LASTNAME_FRIENDLYNAME
184    ATTRIBUTES[1].nameFormat = XSSTRING_NS
185   
186    ATTRIBUTES[2].name = ESGFSamlNamespaces.EMAILADDRESS_ATTRNAME
187    ATTRIBUTES[2].friendlyName = ESGFSamlNamespaces.EMAILADDRESS_FRIENDLYNAME
188    ATTRIBUTES[2].nameFormat =  XSSTRING_NS
Note: See TracBrowser for help on using the repository browser.