Skip to content

Commit 4acf592

Browse files
committed
Keep unknown metadata extensions
Signed-off-by: Ivan Kanakarakis <[email protected]>
1 parent f0a6d63 commit 4acf592

File tree

2 files changed

+39
-11
lines changed

2 files changed

+39
-11
lines changed

src/saml2/__init__.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -981,14 +981,16 @@ def extension_element_to_element(extension_element, translation_functions,
981981
return None
982982

983983

984-
def extension_elements_to_elements(extension_elements, schemas):
984+
def extension_elements_to_elements(extension_elements, schemas, keep_unmatched=False):
985985
""" Create a list of elements each one matching one of the
986986
given extension elements. This is of course dependent on the access
987987
to schemas that describe the extension elements.
988988
989989
:param extension_elements: The list of extension elements
990990
:param schemas: Imported Python modules that represent the different
991991
known schemas used for the extension elements
992+
:param keep_unmatched: Whether to keep extension elements that did not match any
993+
schemas
992994
:return: A list of elements, representing the set of extension elements
993995
that was possible to match against a Class in the given schemas.
994996
The elements returned are the native representation of the elements
@@ -1004,13 +1006,19 @@ def extension_elements_to_elements(extension_elements, schemas):
10041006
return res
10051007

10061008
for extension_element in extension_elements:
1007-
for schema in schemas:
1008-
inst = extension_element_to_element(extension_element,
1009-
schema.ELEMENT_FROM_STRING,
1010-
schema.NAMESPACE)
1011-
if inst:
1012-
res.append(inst)
1013-
break
1009+
convert_results = (
1010+
inst
1011+
for schema in schemas
1012+
for inst in [
1013+
extension_element_to_element(
1014+
extension_element, schema.ELEMENT_FROM_STRING, schema.NAMESPACE
1015+
)
1016+
]
1017+
if inst
1018+
)
1019+
result = next(convert_results, extension_element if keep_unmatched else None)
1020+
if result:
1021+
res.append(result)
10141022

10151023
return res
10161024

src/saml2/mdie.py

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
from saml2 import element_to_extension_element
55
from saml2 import extension_elements_to_elements
6+
from saml2 import ExtensionElement
67
from saml2 import SamlBase
78
from saml2 import md
89

@@ -30,12 +31,20 @@ def _eval(val, onts, mdb_safe):
3031
return None
3132
else:
3233
return val
33-
elif isinstance(val, dict) or isinstance(val, SamlBase):
34+
elif (
35+
isinstance(val, dict)
36+
or isinstance(val, SamlBase)
37+
or isinstance(val, ExtensionElement)
38+
):
3439
return to_dict(val, onts, mdb_safe)
3540
elif isinstance(val, list):
3641
lv = []
3742
for v in val:
38-
if isinstance(v, dict) or isinstance(v, SamlBase):
43+
if (
44+
isinstance(v, dict)
45+
or isinstance(v, SamlBase)
46+
or isinstance(v, ExtensionElement)
47+
):
3948
lv.append(to_dict(v, onts, mdb_safe))
4049
else:
4150
lv.append(v)
@@ -61,7 +70,9 @@ def to_dict(_dict, onts, mdb_safe=False):
6170
continue
6271
val = getattr(_dict, key)
6372
if key == "extension_elements":
64-
_eel = extension_elements_to_elements(val, onts)
73+
_eel = extension_elements_to_elements(
74+
val, onts, keep_unmatched=True
75+
)
6576
_val = [_eval(_v, onts, mdb_safe) for _v in _eel]
6677
elif key == "extension_attributes":
6778
if mdb_safe:
@@ -77,6 +88,15 @@ def to_dict(_dict, onts, mdb_safe=False):
7788
if mdb_safe:
7889
key = key.replace(".", "__")
7990
res[key] = _val
91+
elif isinstance(_dict, ExtensionElement):
92+
res = {
93+
key: _val
94+
for key, val in _dict.__dict__.items()
95+
if val and key not in IMP_SKIP
96+
for _val in [_eval(val, onts, mdb_safe)]
97+
if _val
98+
}
99+
res["__class__"] = "%s&%s" % (_dict.namespace, _dict.tag)
80100
else:
81101
for key, val in _dict.items():
82102
_val = _eval(val, onts, mdb_safe)

0 commit comments

Comments
 (0)