Skip to content

Commit 429677d

Browse files
author
Roland Hedberg
committed
SAML request may contain signature and sigalg arguments
1 parent 6f0ff86 commit 429677d

File tree

1 file changed

+14
-6
lines changed

1 file changed

+14
-6
lines changed

example/idp2/idp.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -129,16 +129,22 @@ def operation(self, saml_msg, binding):
129129
resp = BadRequest('Error parsing request or no request')
130130
return resp(self.environ, self.start_response)
131131
else:
132+
# saml_msg may also contain Signature and SigAlg
133+
if "Signature" in saml_msg:
134+
args = {"signature": saml_msg["signature"],
135+
"sigalg": saml_msg["SigAlg"]}
136+
else:
137+
args = {}
132138
try:
133139
_encrypt_cert = encrypt_cert_from_item(
134140
saml_msg["req_info"].message)
135141
return self.do(saml_msg["SAMLRequest"], binding,
136142
saml_msg["RelayState"],
137-
encrypt_cert=_encrypt_cert)
143+
encrypt_cert=_encrypt_cert, **args)
138144
except KeyError:
139145
# Can live with no relay state # TODO or can we, for inacademia?
140146
return self.do(saml_msg["SAMLRequest"], binding,
141-
saml_msg["RelayState"])
147+
saml_msg["RelayState"], **args)
142148

143149
def artifact_operation(self, saml_msg):
144150
if not saml_msg:
@@ -341,7 +347,8 @@ def do(self, query, binding_in, relay_state="", encrypt_cert=None):
341347
logger.debug("HTTPargs: %s" % http_args)
342348
return self.response(self.binding_out, http_args)
343349

344-
def _store_request(self, saml_msg):
350+
@staticmethod
351+
def _store_request(saml_msg):
345352
logger.debug("_store_request: %s" % saml_msg)
346353
key = sha1(saml_msg["SAMLRequest"]).hexdigest()
347354
# store the AuthnRequest
@@ -369,8 +376,8 @@ def redirect(self):
369376

370377
_req = self.req_info.message
371378

372-
if "SigAlg" in saml_msg and "Signature" in saml_msg: # Signed
373-
# request
379+
if "SigAlg" in saml_msg and "Signature" in saml_msg:
380+
# Signed request
374381
issuer = _req.issuer.text
375382
_certs = IDP.metadata.certs(issuer, "any", "signing")
376383
verified_ok = False
@@ -384,7 +391,7 @@ def redirect(self):
384391

385392
if self.user:
386393
if _req.force_authn is not None and \
387-
_req.force_authn.lower() == 'true':
394+
_req.force_authn.lower() == 'true':
388395
saml_msg["req_info"] = self.req_info
389396
key = self._store_request(saml_msg)
390397
return self.not_authn(key, _req.requested_authn_context)
@@ -581,6 +588,7 @@ def not_found(environ, start_response):
581588

582589
class SLO(Service):
583590
def do(self, request, binding, relay_state="", encrypt_cert=None):
591+
584592
logger.info("--- Single Log Out Service ---")
585593
try:
586594
logger.debug("req: '%s'" % request)

0 commit comments

Comments
 (0)