Skip to content

Commit 5cd5ebd

Browse files
author
Roland Hedberg
committed
Refactored the support for metadata extension in the config file.
1 parent d7f50d4 commit 5cd5ebd

File tree

3 files changed

+87
-15
lines changed

3 files changed

+87
-15
lines changed

src/saml2/metadata.py

Lines changed: 39 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
from saml2.sigver import pre_signature_part
2424

2525
from saml2.s_utils import factory
26+
from saml2.s_utils import rec_factory
2627
from saml2.s_utils import sid
2728

2829
__author__ = 'rolandh'
@@ -51,6 +52,7 @@
5152
"organization_url": ("url", md.OrganizationURL)
5253
}
5354

55+
5456
def metadata_tostring_fix(desc, nspair):
5557
MDNS = '"urn:oasis:names:tc:SAML:2.0:metadata"'
5658
XMLNSXS = " xmlns:xs=\"http://www.w3.org/2001/XMLSchema\""
@@ -60,7 +62,7 @@ def metadata_tostring_fix(desc, nspair):
6062
return xmlstring
6163

6264

63-
def create_metadata_string(configfile, config, valid, cert, keyfile, id, name,
65+
def create_metadata_string(configfile, config, valid, cert, keyfile, mid, name,
6466
sign):
6567
valid_for = 0
6668
nspair = {"xs": "http://www.w3.org/2001/XMLSchema"}
@@ -85,16 +87,16 @@ def create_metadata_string(configfile, config, valid, cert, keyfile, id, name,
8587
conf.xmlsec_binary = config.xmlsec_binary
8688
secc = security_context(conf)
8789

88-
if id:
89-
desc = entities_descriptor(eds, valid_for, name, id,
90+
if mid:
91+
desc = entities_descriptor(eds, valid_for, name, mid,
9092
sign, secc)
9193
valid_instance(desc)
9294

9395
return metadata_tostring_fix(desc, nspair)
9496
else:
9597
for eid in eds:
9698
if sign:
97-
desc = sign_entity_descriptor(eid, id, secc)
99+
desc = sign_entity_descriptor(eid, mid, secc)
98100
else:
99101
desc = eid
100102
valid_instance(desc)
@@ -372,6 +374,21 @@ def do_idpdisc(discovery_response):
372374
}
373375

374376

377+
def do_extensions(mname, item):
378+
try:
379+
_mod = __import__("saml2.extension.%s" % mname, globals(), locals(),
380+
mname)
381+
except ImportError:
382+
return None
383+
else:
384+
res = []
385+
386+
for _cname, ava in item.items():
387+
cls = getattr(_mod, _cname)
388+
res.append(rec_factory(cls, **ava))
389+
return res
390+
391+
375392
def _do_nameid_format(cls, conf, typ):
376393
namef = conf.getattr("name_id_format", typ)
377394
if namef:
@@ -421,19 +438,30 @@ def do_spsso_descriptor(conf, cert=None):
421438
spsso = md.SPSSODescriptor()
422439
spsso.protocol_support_enumeration = samlp.NAMESPACE
423440

441+
exts = conf.getattr("extensions", "sp")
442+
if exts:
443+
if spsso.extensions is None:
444+
spsso.extensions = md.Extensions()
445+
446+
for key, val in exts.items():
447+
_ext = do_extensions(key, val)
448+
if _ext:
449+
for _e in _ext:
450+
spsso.extensions.add_extension_element(_e)
451+
424452
endps = conf.getattr("endpoints", "sp")
425453
if endps:
426454
for (endpoint, instlist) in do_endpoints(endps,
427455
ENDPOINTS["sp"]).items():
428456
setattr(spsso, endpoint, instlist)
429457

430-
ext = do_endpoints(endps, ENDPOINT_EXT["sp"])
431-
if ext:
432-
if spsso.extensions is None:
433-
spsso.extensions = md.Extensions()
434-
for vals in ext.values():
435-
for val in vals:
436-
spsso.extensions.add_extension_element(val)
458+
# ext = do_endpoints(endps, ENDPOINT_EXT["sp"])
459+
# if ext:
460+
# if spsso.extensions is None:
461+
# spsso.extensions = md.Extensions()
462+
# for vals in ext.values():
463+
# for val in vals:
464+
# spsso.extensions.add_extension_element(val)
437465

438466
if cert:
439467
encryption_type = conf.encryption_type

src/saml2/s_utils.py

Lines changed: 35 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,7 @@ def fticks_log(sp, logf, idp_entity_id, user_id, secret, assertion):
413413
"PN": csum.hexdigest(),
414414
"AM": ac.AuthnContextClassRef.text
415415
}
416-
logf.info(FTICKS_FORMAT % "#".join(["%s=%s" % (a,v) for a,v in info]))
416+
logf.info(FTICKS_FORMAT % "#".join(["%s=%s" % (a, v) for a, v in info]))
417417

418418

419419
def dynamic_importer(name, class_name=None):
@@ -428,14 +428,14 @@ def dynamic_importer(name, class_name=None):
428428

429429
try:
430430
package = imp.load_module(name, fp, pathname, description)
431-
except Exception, e:
431+
except Exception:
432432
raise
433433

434434
if class_name:
435435
try:
436436
_class = imp.load_module("%s.%s" % (name, class_name), fp,
437-
pathname, description)
438-
except Exception, e:
437+
pathname, description)
438+
except Exception:
439439
raise
440440

441441
return package, _class
@@ -452,3 +452,34 @@ def exception_trace(exc):
452452
_exc = "Exception: %s" % exc.message.encode("utf-8", "replace")
453453

454454
return {"message": _exc, "content": "".join(message)}
455+
456+
457+
def rec_factory(cls, **kwargs):
458+
_inst = cls()
459+
for key, val in kwargs.items():
460+
if key in ["text", "lang"]:
461+
setattr(_inst, key, val)
462+
elif key in _inst.c_attributes:
463+
try:
464+
val = str(val)
465+
except Exception:
466+
continue
467+
else:
468+
setattr(_inst, key, val)
469+
elif key in _inst.c_child_order:
470+
for tag, _cls in _inst.c_children.values():
471+
if tag == key:
472+
if isinstance(_cls, list):
473+
_cls = _cls[0]
474+
claim = []
475+
if isinstance(val, list):
476+
for v in val:
477+
claim.append(rec_factory(_cls, **v))
478+
else:
479+
claim.append(rec_factory(_cls, **val))
480+
else:
481+
claim = rec_factory(_cls, **val)
482+
setattr(_inst, key, claim)
483+
break
484+
485+
return _inst

src/saml2/validate.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,6 +201,18 @@ def valid_unsigned_short(val):
201201
return True
202202

203203

204+
def valid_positive_integer(val):
205+
try:
206+
integer = int(val)
207+
except ValueError:
208+
raise NotValid("positive integer")
209+
210+
if integer > 0:
211+
return True
212+
else:
213+
raise NotValid("positive integer")
214+
215+
204216
def valid_non_negative_integer(val):
205217
try:
206218
integer = int(val)
@@ -269,6 +281,7 @@ def valid_anytype(val):
269281
"dateTime": valid_date_time,
270282
"anyURI": valid_any_uri,
271283
"nonNegativeInteger": valid_non_negative_integer,
284+
"PositiveInteger": valid_positive_integer,
272285
"boolean": valid_boolean,
273286
"unsignedShort": valid_unsigned_short,
274287
"duration": valid_duration,

0 commit comments

Comments
 (0)