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:
Roland Hedberg
2013-12-16 00:17:26 -08:00
2 changed files with 55 additions and 3 deletions

2
.gitignore vendored
View File

@@ -13,6 +13,8 @@ dist/
example/sp/identities
subject.db
.idea
.project
.pydevproject
.DS_store
.gitignore
debug_*

View File

@@ -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)