summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--.gitignore2
-rw-r--r--src/saml2/mdstore.py56
2 files changed, 55 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index 02d5cce4..31041c1c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -13,6 +13,8 @@ dist/
example/sp/identities
subject.db
.idea
+.project
+.pydevproject
.DS_store
.gitignore
debug_*
diff --git a/src/saml2/mdstore.py b/src/saml2/mdstore.py
index 96d610ea..02c4ec30 100644
--- a/src/saml2/mdstore.py
+++ b/src/saml2/mdstore.py
@@ -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'
@@ -134,8 +135,8 @@ class MetaData(object):
# have I seen this entity_id before ? If so if log: ignore it
if entity_descr.entity_id in self.entity:
- print >> sys.stderr,\
- "Duplicated Entity descriptor (entity id: '%s')" %\
+ print >> sys.stderr, \
+ "Duplicated Entity descriptor (entity id: '%s')" % \
entity_descr.entity_id
return
@@ -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)