Skip to content

Commit 20000a7

Browse files
Merge pull request #809 from REANNZ/metadata_reload
Support metadata reload
2 parents 530e499 + 6e90788 commit 20000a7

File tree

4 files changed

+48
-4
lines changed

4 files changed

+48
-4
lines changed

Diff for: src/saml2/assertion.py

+3
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,9 @@ def _filter_values(vals, vlist=None, must=False):
3535
if not vlist: # No value specified equals any value
3636
return vals
3737

38+
if vals is None: # cannot iterate over None, return early
39+
return vals
40+
3841
if isinstance(vlist, six.string_types):
3942
vlist = [vlist]
4043

Diff for: src/saml2/entity.py

+33
Original file line numberDiff line numberDiff line change
@@ -203,6 +203,39 @@ def __init__(self, entity_type, config=None, config_file="",
203203

204204
self.msg_cb = msg_cb
205205

206+
def reload_metadata(self, metadata_conf):
207+
"""
208+
Reload metadata configuration.
209+
210+
Load a new metadata configuration as defined by metadata_conf (by
211+
passing this to Config.load_metadata) and make this entity (as well as
212+
subordinate objects with own metadata reference) use the new metadata.
213+
214+
The structure of metadata_conf is the same as the 'metadata' entry in
215+
the configuration passed to saml2.Config.
216+
217+
param metadata_conf: Metadata configuration as passed to Config.load_metadata
218+
return: True if successfully reloaded
219+
"""
220+
logger.debug("Loading new metadata")
221+
try:
222+
new_metadata = self.config.load_metadata(metadata_conf)
223+
except Exception as ex:
224+
logger.error("Loading metadata failed", exc_info=ex)
225+
return False
226+
227+
logger.debug("Applying new metadata to main config")
228+
( self.metadata, self.sec.metadata, self.config.metadata ) = [new_metadata]*3
229+
policy = getattr(self.config, "_%s_policy" % self.entity_type, None)
230+
if policy and policy.metadata_store:
231+
logger.debug("Applying new metadata to %s policy", self.entity_type)
232+
policy.metadata_store = self.metadata
233+
234+
logger.debug("Applying new metadata source_id")
235+
self.sourceid = self.metadata.construct_source_id()
236+
237+
return True
238+
206239
def _issuer(self, entityid=None):
207240
""" Return an Issuer instance """
208241
if entityid:

Diff for: src/saml2/mdstore.py

+10-2
Original file line numberDiff line numberDiff line change
@@ -618,7 +618,14 @@ def parse(self, xmlstr):
618618
try:
619619
self.entities_descr = md.entities_descriptor_from_string(xmlstr)
620620
except Exception as e:
621-
raise SAMLError(f'Failed to parse metadata file: {self.filename}') from e
621+
_md_desc = (
622+
f'metadata file: {self.filename}'
623+
if isinstance(self,MetaDataFile)
624+
else f'remote metadata: {self.url}'
625+
if isinstance(self, MetaDataExtern)
626+
else 'metadata'
627+
)
628+
raise SAMLError(f'Failed to parse {_md_desc}') from e
622629

623630
if not self.entities_descr:
624631
self.entity_descr = md.entity_descriptor_from_string(xmlstr)
@@ -1693,4 +1700,5 @@ def dumps(self, format="local"):
16931700

16941701
return "%s" % res
16951702
elif format == "md":
1696-
return json.dumps(self.items(), indent=2)
1703+
# self.items() returns dictitems(), convert that back into a dict
1704+
return json.dumps(dict(self.items()), indent=2)

Diff for: src/saml2/time_util.py

+2-2
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,7 @@ def utc_now():
269269

270270

271271
def before(point):
272-
""" True if point datetime specification is before now.
272+
""" True if current time is before point datetime specification.
273273
274274
NOTE: If point is specified it is supposed to be in local time.
275275
Not UTC/GMT !! This is because that is what gmtime() expects.
@@ -286,7 +286,7 @@ def before(point):
286286

287287

288288
def after(point):
289-
""" True if point datetime specification is equal or after now """
289+
""" True if current time is after or equal to point datetime specification."""
290290
if not point:
291291
return True
292292
else:

0 commit comments

Comments
 (0)