Added some extra functionality.
This commit is contained in:
@@ -67,9 +67,12 @@ def destinations(srvs):
|
|||||||
return [s["location"] for s in srvs]
|
return [s["location"] for s in srvs]
|
||||||
|
|
||||||
|
|
||||||
def attribute_requirement(entity):
|
def attribute_requirement(entity, index=None):
|
||||||
res = {"required": [], "optional": []}
|
res = {"required": [], "optional": []}
|
||||||
for acs in entity["attribute_consuming_service"]:
|
for acs in entity["attribute_consuming_service"]:
|
||||||
|
if index is not None and acs["index"] != index:
|
||||||
|
continue
|
||||||
|
|
||||||
for attr in acs["requested_attribute"]:
|
for attr in acs["requested_attribute"]:
|
||||||
if "is_required" in attr and attr["is_required"] == "true":
|
if "is_required" in attr and attr["is_required"] == "true":
|
||||||
res["required"].append(attr)
|
res["required"].append(attr)
|
||||||
@@ -133,6 +136,9 @@ class MetaData(object):
|
|||||||
def __getitem__(self, item):
|
def __getitem__(self, item):
|
||||||
return self.entity[item]
|
return self.entity[item]
|
||||||
|
|
||||||
|
def __setitem__(self, key, value):
|
||||||
|
self.entity[key] = value
|
||||||
|
|
||||||
def do_entity_descriptor(self, entity_descr):
|
def do_entity_descriptor(self, entity_descr):
|
||||||
if self.check_validity:
|
if self.check_validity:
|
||||||
try:
|
try:
|
||||||
@@ -221,7 +227,7 @@ class MetaData(object):
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
logger.debug("service(%s, %s, %s, %s)" % (entity_id, typ, service,
|
logger.debug("service(%s, %s, %s, %s)" % (entity_id, typ, service,
|
||||||
binding))
|
binding))
|
||||||
try:
|
try:
|
||||||
srvs = []
|
srvs = []
|
||||||
for t in self[entity_id][typ]:
|
for t in self[entity_id][typ]:
|
||||||
@@ -297,12 +303,14 @@ class MetaData(object):
|
|||||||
|
|
||||||
return self.service(entity_id, typ, service)
|
return self.service(entity_id, typ, service)
|
||||||
|
|
||||||
def attribute_requirement(self, entity_id, index=0):
|
def attribute_requirement(self, entity_id, index=None):
|
||||||
""" Returns what attributes the SP requires and which are optional
|
""" Returns what attributes the SP requires and which are optional
|
||||||
if any such demands are registered in the Metadata.
|
if any such demands are registered in the Metadata.
|
||||||
|
|
||||||
:param entity_id: The entity id of the SP
|
:param entity_id: The entity id of the SP
|
||||||
:param index: which of the attribute consumer services its all about
|
:param index: which of the attribute consumer services its all about
|
||||||
|
if index=None then return all attributes expected by all
|
||||||
|
attribute_consuming_services.
|
||||||
:return: 2-tuple, list of required and list of optional attributes
|
:return: 2-tuple, list of required and list of optional attributes
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -310,7 +318,7 @@ class MetaData(object):
|
|||||||
|
|
||||||
try:
|
try:
|
||||||
for sp in self[entity_id]["spsso_descriptor"]:
|
for sp in self[entity_id]["spsso_descriptor"]:
|
||||||
_res = attribute_requirement(sp)
|
_res = attribute_requirement(sp, index)
|
||||||
res["required"].extend(_res["required"])
|
res["required"].extend(_res["required"])
|
||||||
res["optional"].extend(_res["optional"])
|
res["optional"].extend(_res["optional"])
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@@ -513,6 +521,7 @@ class MetaDataMD(MetaData):
|
|||||||
|
|
||||||
class MetadataStore(object):
|
class MetadataStore(object):
|
||||||
def __init__(self, onts, attrc, config, ca_certs=None,
|
def __init__(self, onts, attrc, config, ca_certs=None,
|
||||||
|
check_validity=True,
|
||||||
disable_ssl_certificate_validation=False):
|
disable_ssl_certificate_validation=False):
|
||||||
"""
|
"""
|
||||||
:params onts:
|
:params onts:
|
||||||
@@ -523,11 +532,16 @@ class MetadataStore(object):
|
|||||||
"""
|
"""
|
||||||
self.onts = onts
|
self.onts = onts
|
||||||
self.attrc = attrc
|
self.attrc = attrc
|
||||||
self.http = HTTPBase(verify=disable_ssl_certificate_validation,
|
|
||||||
ca_bundle=ca_certs)
|
if disable_ssl_certificate_validation:
|
||||||
|
self.http = HTTPBase(verify=False, ca_bundle=ca_certs)
|
||||||
|
else:
|
||||||
|
self.http = HTTPBase(verify=True, ca_bundle=ca_certs)
|
||||||
|
|
||||||
self.security = security_context(config)
|
self.security = security_context(config)
|
||||||
self.ii = 0
|
self.ii = 0
|
||||||
self.metadata = {}
|
self.metadata = {}
|
||||||
|
self.check_validity = check_validity
|
||||||
|
|
||||||
def load(self, typ, *args, **kwargs):
|
def load(self, typ, *args, **kwargs):
|
||||||
if typ == "local":
|
if typ == "local":
|
||||||
@@ -539,10 +553,16 @@ class MetadataStore(object):
|
|||||||
_md = MetaData(self.onts, self.attrc, args[0], **kwargs)
|
_md = MetaData(self.onts, self.attrc, args[0], **kwargs)
|
||||||
elif typ == "remote":
|
elif typ == "remote":
|
||||||
key = kwargs["url"]
|
key = kwargs["url"]
|
||||||
|
_args = {}
|
||||||
|
for _key in ["node_name", "check_validity"]:
|
||||||
|
try:
|
||||||
|
_args[_key] = kwargs[_key]
|
||||||
|
except KeyError:
|
||||||
|
pass
|
||||||
|
|
||||||
_md = MetaDataExtern(self.onts, self.attrc,
|
_md = MetaDataExtern(self.onts, self.attrc,
|
||||||
kwargs["url"], self.security,
|
kwargs["url"], self.security,
|
||||||
kwargs["cert"], self.http,
|
kwargs["cert"], self.http, **_args)
|
||||||
node_name=kwargs.get('node_name'))
|
|
||||||
elif typ == "mdfile":
|
elif typ == "mdfile":
|
||||||
key = args[0]
|
key = args[0]
|
||||||
_md = MetaDataMD(self.onts, self.attrc, args[0])
|
_md = MetaDataMD(self.onts, self.attrc, args[0])
|
||||||
@@ -559,6 +579,8 @@ class MetadataStore(object):
|
|||||||
for key, vals in spec.items():
|
for key, vals in spec.items():
|
||||||
for val in vals:
|
for val in vals:
|
||||||
if isinstance(val, dict):
|
if isinstance(val, dict):
|
||||||
|
if not self.check_validity:
|
||||||
|
val["check_validity"] = False
|
||||||
self.load(key, **val)
|
self.load(key, **val)
|
||||||
else:
|
else:
|
||||||
self.load(key, val)
|
self.load(key, val)
|
||||||
@@ -633,7 +655,7 @@ class MetadataStore(object):
|
|||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_SOAP
|
binding = BINDING_SOAP
|
||||||
return self.service(entity_id, "pdp_descriptor",
|
return self.service(entity_id, "pdp_descriptor",
|
||||||
"authz_service", binding)
|
"authz_service", binding)
|
||||||
|
|
||||||
def assertion_id_request_service(self, entity_id, binding=None, typ=None):
|
def assertion_id_request_service(self, entity_id, binding=None, typ=None):
|
||||||
# AuthnAuthority + IDP + PDP + AttributeAuthority
|
# AuthnAuthority + IDP + PDP + AttributeAuthority
|
||||||
@@ -642,7 +664,7 @@ class MetadataStore(object):
|
|||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_SOAP
|
binding = BINDING_SOAP
|
||||||
return self.service(entity_id, "%s_descriptor" % typ,
|
return self.service(entity_id, "%s_descriptor" % typ,
|
||||||
"assertion_id_request_service", binding)
|
"assertion_id_request_service", binding)
|
||||||
|
|
||||||
def single_logout_service(self, entity_id, binding=None, typ=None):
|
def single_logout_service(self, entity_id, binding=None, typ=None):
|
||||||
# IDP + SP
|
# IDP + SP
|
||||||
@@ -651,35 +673,35 @@ class MetadataStore(object):
|
|||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_HTTP_REDIRECT
|
binding = BINDING_HTTP_REDIRECT
|
||||||
return self.service(entity_id, "%s_descriptor" % typ,
|
return self.service(entity_id, "%s_descriptor" % typ,
|
||||||
"single_logout_service", binding)
|
"single_logout_service", binding)
|
||||||
|
|
||||||
def manage_name_id_service(self, entity_id, binding=None, typ=None):
|
def manage_name_id_service(self, entity_id, binding=None, typ=None):
|
||||||
# IDP + SP
|
# IDP + SP
|
||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_HTTP_REDIRECT
|
binding = BINDING_HTTP_REDIRECT
|
||||||
return self.service(entity_id, "%s_descriptor" % typ,
|
return self.service(entity_id, "%s_descriptor" % typ,
|
||||||
"manage_name_id_service", binding)
|
"manage_name_id_service", binding)
|
||||||
|
|
||||||
def artifact_resolution_service(self, entity_id, binding=None, typ=None):
|
def artifact_resolution_service(self, entity_id, binding=None, typ=None):
|
||||||
# IDP + SP
|
# IDP + SP
|
||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_HTTP_REDIRECT
|
binding = BINDING_HTTP_REDIRECT
|
||||||
return self.service(entity_id, "%s_descriptor" % typ,
|
return self.service(entity_id, "%s_descriptor" % typ,
|
||||||
"artifact_resolution_service", binding)
|
"artifact_resolution_service", binding)
|
||||||
|
|
||||||
def assertion_consumer_service(self, entity_id, binding=None, _="spsso"):
|
def assertion_consumer_service(self, entity_id, binding=None, _="spsso"):
|
||||||
# SP
|
# SP
|
||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_HTTP_POST
|
binding = BINDING_HTTP_POST
|
||||||
return self.service(entity_id, "spsso_descriptor",
|
return self.service(entity_id, "spsso_descriptor",
|
||||||
"assertion_consumer_service", binding)
|
"assertion_consumer_service", binding)
|
||||||
|
|
||||||
def attribute_consuming_service(self, entity_id, binding=None, _="spsso"):
|
def attribute_consuming_service(self, entity_id, binding=None, _="spsso"):
|
||||||
# SP
|
# SP
|
||||||
if binding is None:
|
if binding is None:
|
||||||
binding = BINDING_HTTP_REDIRECT
|
binding = BINDING_HTTP_REDIRECT
|
||||||
return self.service(entity_id, "spsso_descriptor",
|
return self.service(entity_id, "spsso_descriptor",
|
||||||
"attribute_consuming_service", binding)
|
"attribute_consuming_service", binding)
|
||||||
|
|
||||||
def discovery_response(self, entity_id, binding=None, _="spsso"):
|
def discovery_response(self, entity_id, binding=None, _="spsso"):
|
||||||
if binding is None:
|
if binding is None:
|
||||||
@@ -863,7 +885,11 @@ class MetadataStore(object):
|
|||||||
for _md in self.metadata.values():
|
for _md in self.metadata.values():
|
||||||
for ent_id, ent_desc in _md.items():
|
for ent_id, ent_desc in _md.items():
|
||||||
if descriptor in ent_desc:
|
if descriptor in ent_desc:
|
||||||
res.append(ent_id)
|
if ent_id in res:
|
||||||
|
#print "duplicated entity_id: %s" % res
|
||||||
|
pass
|
||||||
|
else:
|
||||||
|
res.append(ent_id)
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def service_providers(self):
|
def service_providers(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user