Merge pull request #61 from koliber/loader_remote_xml_option
Created another way of loading remote_metadata. Allows you to specify a ...
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -13,6 +13,8 @@ dist/
|
|||||||
example/sp/identities
|
example/sp/identities
|
||||||
subject.db
|
subject.db
|
||||||
.idea
|
.idea
|
||||||
|
.project
|
||||||
|
.pydevproject
|
||||||
.DS_store
|
.DS_store
|
||||||
.gitignore
|
.gitignore
|
||||||
debug_*
|
debug_*
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ from saml2.validate import valid_instance
|
|||||||
from saml2.time_util import valid
|
from saml2.time_util import valid
|
||||||
from saml2.validate import NotValid
|
from saml2.validate import NotValid
|
||||||
from saml2.sigver import security_context
|
from saml2.sigver import security_context
|
||||||
|
from importlib import import_module
|
||||||
|
|
||||||
__author__ = 'rolandh'
|
__author__ = 'rolandh'
|
||||||
|
|
||||||
@@ -134,8 +135,8 @@ class MetaData(object):
|
|||||||
|
|
||||||
# have I seen this entity_id before ? If so if log: ignore it
|
# have I seen this entity_id before ? If so if log: ignore it
|
||||||
if entity_descr.entity_id in self.entity:
|
if entity_descr.entity_id in self.entity:
|
||||||
print >> sys.stderr,\
|
print >> sys.stderr, \
|
||||||
"Duplicated Entity descriptor (entity id: '%s')" %\
|
"Duplicated Entity descriptor (entity id: '%s')" % \
|
||||||
entity_descr.entity_id
|
entity_descr.entity_id
|
||||||
return
|
return
|
||||||
|
|
||||||
@@ -353,8 +354,11 @@ class MetaDataFile(MetaData):
|
|||||||
self.filename = filename
|
self.filename = filename
|
||||||
self.cert = cert
|
self.cert = cert
|
||||||
|
|
||||||
|
def get_metadata_content(self):
|
||||||
|
return open(self.filename).read()
|
||||||
|
|
||||||
def load(self):
|
def load(self):
|
||||||
_txt = open(self.filename).read()
|
_txt = self.get_metadata_content()
|
||||||
if self.cert:
|
if self.cert:
|
||||||
node_name = "%s:%s" % (md.EntitiesDescriptor.c_namespace,
|
node_name = "%s:%s" % (md.EntitiesDescriptor.c_namespace,
|
||||||
md.EntitiesDescriptor.c_tag)
|
md.EntitiesDescriptor.c_tag)
|
||||||
@@ -369,6 +373,49 @@ class MetaDataFile(MetaData):
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
class MetaDataLoader(MetaDataFile):
|
||||||
|
"""
|
||||||
|
Handles Metadata file loaded by a passed in function.
|
||||||
|
The format of the file is the SAML Metadata format.
|
||||||
|
"""
|
||||||
|
def __init__(self, onts, attrc, loader_callable, cert=None):
|
||||||
|
MetaData.__init__(self, onts, attrc)
|
||||||
|
self.metadata_provider_callable = self.get_metadata_loader(loader_callable)
|
||||||
|
self.cert = cert
|
||||||
|
|
||||||
|
def get_metadata_loader(self, func):
|
||||||
|
if callable(func):
|
||||||
|
return func
|
||||||
|
|
||||||
|
i = func.rfind('.')
|
||||||
|
module, attr = func[:i], func[i + 1:]
|
||||||
|
try:
|
||||||
|
mod = import_module(module)
|
||||||
|
except Exception, e:
|
||||||
|
raise RuntimeError('Cannot find metadata provider function %s: "%s"' % (func, e))
|
||||||
|
|
||||||
|
try:
|
||||||
|
metadata_loader = getattr(mod, attr)
|
||||||
|
except AttributeError:
|
||||||
|
raise RuntimeError(
|
||||||
|
'Module "%s" does not define a "%s" metadata loader' %
|
||||||
|
(module, attr)
|
||||||
|
)
|
||||||
|
|
||||||
|
if not callable(metadata_loader):
|
||||||
|
raise RuntimeError(
|
||||||
|
'Metadata loader %s.%s must be callable' %
|
||||||
|
(module, attr)
|
||||||
|
)
|
||||||
|
|
||||||
|
return metadata_loader
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def get_metadata_content(self):
|
||||||
|
return self.metadata_provider_callable()
|
||||||
|
|
||||||
|
|
||||||
class MetaDataExtern(MetaData):
|
class MetaDataExtern(MetaData):
|
||||||
"""
|
"""
|
||||||
Class that handles metadata store somewhere on the net.
|
Class that handles metadata store somewhere on the net.
|
||||||
@@ -463,6 +510,9 @@ class MetadataStore(object):
|
|||||||
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])
|
||||||
|
elif typ == "loader":
|
||||||
|
key = args[0]
|
||||||
|
md = MetaDataLoader(self.onts, self.attrc, args[0])
|
||||||
else:
|
else:
|
||||||
raise SAMLError("Unknown metadata type '%s'" % typ)
|
raise SAMLError("Unknown metadata type '%s'" % typ)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user