33
44from saml2 import element_to_extension_element
55from saml2 import extension_elements_to_elements
6+ from saml2 import ExtensionElement
67from saml2 import SamlBase
78from 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