127 lines
3.6 KiB
Python
127 lines
3.6 KiB
Python
__author__ = 'rolandh'
|
|
|
|
#!/usr/bin/env python
|
|
from saml2 import element_to_extension_element
|
|
from saml2 import extension_elements_to_elements
|
|
from saml2 import SamlBase
|
|
from saml2 import md
|
|
|
|
__author__ = 'rolandh'
|
|
|
|
"""
|
|
Functions used to import metadata from and export it to a pysaml2 format
|
|
"""
|
|
|
|
IMP_SKIP = ["_certs", "e_e_"]
|
|
EXP_SKIP = ["__class__"]
|
|
|
|
# From pysaml2 SAML2 metadata format to Python dictionary
|
|
def _eval(val, onts):
|
|
"""
|
|
Convert a value to a basic dict format
|
|
:param val: The value
|
|
:param onts: Schemas to be used in the conversion
|
|
:return: The basic dictionary
|
|
"""
|
|
if isinstance(val, basestring):
|
|
val = val.strip()
|
|
if not val:
|
|
return None
|
|
else:
|
|
return val
|
|
elif isinstance(val, dict) or isinstance(val, SamlBase):
|
|
return to_dict(val, onts)
|
|
elif isinstance(val, list):
|
|
lv = []
|
|
for v in val:
|
|
if isinstance(v, dict) or isinstance(v, SamlBase):
|
|
lv.append(to_dict(v, onts))
|
|
else:
|
|
lv.append(v)
|
|
return lv
|
|
return val
|
|
|
|
def to_dict(_dict, onts):
|
|
"""
|
|
Convert a pysaml2 SAML2 metadata format into a basic dictionary format
|
|
The export interface.
|
|
|
|
:param _dict: The pysaml2 metadata instance
|
|
:param onts: Schemas to use for the conversion
|
|
:return: The converted information
|
|
"""
|
|
res = {}
|
|
if isinstance(_dict, SamlBase):
|
|
res["__class__"] = "%s&%s" % (_dict.c_namespace,_dict.c_tag)
|
|
for key in _dict.keyswv():
|
|
if key in IMP_SKIP:
|
|
continue
|
|
val = getattr(_dict, key)
|
|
if key == "extension_elements":
|
|
_eel = extension_elements_to_elements(val, onts)
|
|
_val = [_eval(_v, onts) for _v in _eel]
|
|
else:
|
|
_val = _eval(val, onts)
|
|
|
|
if _val:
|
|
res[key] = _val
|
|
else:
|
|
for key, val in _dict.items():
|
|
_val = _eval(val, onts)
|
|
if _val:
|
|
res[key] = _val
|
|
return res
|
|
|
|
|
|
# From Python dictionary to pysaml2 SAML2 metadata format
|
|
|
|
def _kwa(val, onts):
|
|
"""
|
|
Key word argument conversion
|
|
|
|
:param val: A dictionary
|
|
:param onts: Schemas to use in the conversion
|
|
:return: A converted dictionary
|
|
"""
|
|
return dict([(k,from_dict(v, onts)) for k,v in val.items() if k not in EXP_SKIP])
|
|
|
|
def from_dict(val, onts):
|
|
"""
|
|
Converts a dictionary into a pysaml2 object
|
|
:param val: A dictionary
|
|
:param onts: Schemas to use in the conversion
|
|
:return: The pysaml2 object instance
|
|
"""
|
|
if isinstance(val, dict):
|
|
if "__class__" in val:
|
|
ns, typ = val["__class__"].split("&")
|
|
cls = getattr(onts[ns], typ)
|
|
if cls is md.Extensions:
|
|
lv = []
|
|
for key, ditems in val.items():
|
|
if key in EXP_SKIP:
|
|
continue
|
|
for item in ditems:
|
|
ns, typ = item["__class__"].split("&")
|
|
cls = getattr(onts[ns], typ)
|
|
kwargs = _kwa(item, onts)
|
|
inst = cls(**kwargs)
|
|
lv.append(element_to_extension_element(inst))
|
|
return lv
|
|
else:
|
|
kwargs = _kwa(val, onts)
|
|
inst = cls(**kwargs)
|
|
return inst
|
|
else:
|
|
res = {}
|
|
for key, v in val.items():
|
|
res[key] = from_dict(v, onts)
|
|
return res
|
|
elif isinstance(val, basestring):
|
|
return val
|
|
elif isinstance(val, list):
|
|
return [from_dict(v, onts) for v in val]
|
|
else:
|
|
return val
|
|
|