@@ -129,16 +129,22 @@ def operation(self, saml_msg, binding):
129
129
resp = BadRequest ('Error parsing request or no request' )
130
130
return resp (self .environ , self .start_response )
131
131
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 = {}
132
138
try :
133
139
_encrypt_cert = encrypt_cert_from_item (
134
140
saml_msg ["req_info" ].message )
135
141
return self .do (saml_msg ["SAMLRequest" ], binding ,
136
142
saml_msg ["RelayState" ],
137
- encrypt_cert = _encrypt_cert )
143
+ encrypt_cert = _encrypt_cert , ** args )
138
144
except KeyError :
139
145
# Can live with no relay state # TODO or can we, for inacademia?
140
146
return self .do (saml_msg ["SAMLRequest" ], binding ,
141
- saml_msg ["RelayState" ])
147
+ saml_msg ["RelayState" ], ** args )
142
148
143
149
def artifact_operation (self , saml_msg ):
144
150
if not saml_msg :
@@ -341,7 +347,8 @@ def do(self, query, binding_in, relay_state="", encrypt_cert=None):
341
347
logger .debug ("HTTPargs: %s" % http_args )
342
348
return self .response (self .binding_out , http_args )
343
349
344
- def _store_request (self , saml_msg ):
350
+ @staticmethod
351
+ def _store_request (saml_msg ):
345
352
logger .debug ("_store_request: %s" % saml_msg )
346
353
key = sha1 (saml_msg ["SAMLRequest" ]).hexdigest ()
347
354
# store the AuthnRequest
@@ -369,8 +376,8 @@ def redirect(self):
369
376
370
377
_req = self .req_info .message
371
378
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
374
381
issuer = _req .issuer .text
375
382
_certs = IDP .metadata .certs (issuer , "any" , "signing" )
376
383
verified_ok = False
@@ -384,7 +391,7 @@ def redirect(self):
384
391
385
392
if self .user :
386
393
if _req .force_authn is not None and \
387
- _req .force_authn .lower () == 'true' :
394
+ _req .force_authn .lower () == 'true' :
388
395
saml_msg ["req_info" ] = self .req_info
389
396
key = self ._store_request (saml_msg )
390
397
return self .not_authn (key , _req .requested_authn_context )
@@ -581,6 +588,7 @@ def not_found(environ, start_response):
581
588
582
589
class SLO (Service ):
583
590
def do (self , request , binding , relay_state = "" , encrypt_cert = None ):
591
+
584
592
logger .info ("--- Single Log Out Service ---" )
585
593
try :
586
594
logger .debug ("req: '%s'" % request )
0 commit comments