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
|
||||
subject.db
|
||||
.idea
|
||||
.project
|
||||
.pydevproject
|
||||
.DS_store
|
||||
.gitignore
|
||||
debug_*
|
||||
|
||||
@@ -21,6 +21,7 @@ from saml2.validate import valid_instance
|
||||
from saml2.time_util import valid
|
||||
from saml2.validate import NotValid
|
||||
from saml2.sigver import security_context
|
||||
from importlib import import_module
|
||||
|
||||
__author__ = 'rolandh'
|
||||
|
||||
@@ -353,8 +354,11 @@ class MetaDataFile(MetaData):
|
||||
self.filename = filename
|
||||
self.cert = cert
|
||||
|
||||
def get_metadata_content(self):
|
||||
return open(self.filename).read()
|
||||
|
||||
def load(self):
|
||||
_txt = open(self.filename).read()
|
||||
_txt = self.get_metadata_content()
|
||||
if self.cert:
|
||||
node_name = "%s:%s" % (md.EntitiesDescriptor.c_namespace,
|
||||
md.EntitiesDescriptor.c_tag)
|
||||
@@ -369,6 +373,49 @@ class MetaDataFile(MetaData):
|
||||
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 that handles metadata store somewhere on the net.
|
||||
@@ -463,6 +510,9 @@ class MetadataStore(object):
|
||||
elif typ == "mdfile":
|
||||
key = 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:
|
||||
raise SAMLError("Unknown metadata type '%s'" % typ)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user