summaryrefslogtreecommitdiff
path: root/src/saml2/attribute_converter.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/saml2/attribute_converter.py')
-rw-r--r--src/saml2/attribute_converter.py64
1 files changed, 49 insertions, 15 deletions
diff --git a/src/saml2/attribute_converter.py b/src/saml2/attribute_converter.py
index 12834777..74e16288 100644
--- a/src/saml2/attribute_converter.py
+++ b/src/saml2/attribute_converter.py
@@ -21,7 +21,7 @@ from importlib import import_module
from saml2.s_utils import factory, do_ava
from saml2 import saml, extension_elements_to_elements, SAMLError
-from saml2.saml import NAME_FORMAT_URI
+from saml2.saml import NAME_FORMAT_URI, NAME_FORMAT_UNSPECIFIED
class UnknownNameFormat(SAMLError):
@@ -121,14 +121,22 @@ def to_local(acs, statement):
"""
if not acs:
acs = [AttributeConverter()]
+ acsd = {"": acs}
+ else:
+ acsd = dict([(a.name_format, a) for a in acs])
- ava = []
- for aconv in acs:
+ ava = {}
+ for attr in statement.attribute:
try:
- ava = aconv.fro(statement)
- break
- except UnknownNameFormat:
- pass
+ key, val = acsd[attr.name_format].ava_from(attr)
+ except KeyError:
+ key, val = acs[0].lcd_ava_from(attr)
+
+ try:
+ ava[key].extend(val)
+ except KeyError:
+ ava[key] = val
+
return ava
@@ -233,10 +241,39 @@ class AttributeConverter(object):
if self._fro is None or self._to is None:
self.adjust()
+ def lcd_ava_from(self, attribute):
+ """
+ In nothing else works, this should
+
+ :param attribute:
+ :return:
+ """
+ try:
+ name = attribute.friendly_name.strip()
+ except AttributeError:
+ name = attribute.name.strip()
+
+ values = []
+ for value in attribute.attribute_value:
+ if not value.text:
+ values.append('')
+ else:
+ values.append(value.text.strip())
+
+ return name, values
+
def fail_safe_fro(self, statement):
- """ In case there is not formats defined """
+ """ In case there is not formats defined or if the name format is
+ undefined
+
+ :param statement: AttributeStatement instance
+ :return: A dictionary with names and values
+ """
result = {}
for attribute in statement.attribute:
+ if attribute.name_format and \
+ attribute.name_format != NAME_FORMAT_UNSPECIFIED:
+ continue
try:
name = attribute.friendly_name.strip()
except AttributeError:
@@ -281,8 +318,8 @@ class AttributeConverter(object):
return attr, val
def fro(self, statement):
- """ Get the attributes and the attribute values
-
+ """ Get the attributes and the attribute values.
+
:param statement: The AttributeStatement.
:return: A dictionary containing attributes and values
"""
@@ -294,15 +331,12 @@ class AttributeConverter(object):
for attribute in statement.attribute:
if attribute.name_format and self.name_format and \
attribute.name_format != self.name_format:
- raise UnknownNameFormat
+ continue
(key, val) = self.ava_from(attribute)
result[key] = val
- if not result:
- return self.fail_safe_fro(statement)
- else:
- return result
+ return result
def to_format(self, attr):
""" Creates an Attribute instance with name, name_format and