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 example/sp/identities
subject.db subject.db
.idea .idea
.project
.pydevproject
.DS_store .DS_store
.gitignore .gitignore
debug_* debug_*

View File

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