From 46d10b24e8816245e4105457faf4418a3b6b0e97 Mon Sep 17 00:00:00 2001 From: Ivan Kanakarakis Date: Tue, 28 Jun 2022 15:11:12 +0300 Subject: Allow exceptions to directly set the StatusCode in an error response Signed-off-by: Ivan Kanakarakis --- src/saml2/s_utils.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/src/saml2/s_utils.py b/src/saml2/s_utils.py index c2e8ef71..f0d983c9 100644 --- a/src/saml2/s_utils.py +++ b/src/saml2/s_utils.py @@ -218,29 +218,42 @@ def identity_attribute(form, attribute, forward_map=None): def error_status_factory(info): - if isinstance(info, Exception): + if not isinstance(info, Exception): + (status_code_status_code_value, status_message_text) = info + else: try: exc_val = EXCEPTION2STATUS[info.__class__] except KeyError: exc_val = samlp.STATUS_AUTHN_FAILED + try: - msg = info.args[0] + exc_context = info.args[0] + err_ctx = ( + {"status_message_text": exc_context} + if isinstance(exc_context, str) + else exc_context + ) except IndexError: - msg = "%s" % info - else: - (exc_val, msg) = info + err_ctx = {"status_message_text": str(info)} - if msg: - status_msg = samlp.StatusMessage(text=msg) - else: - status_msg = None + status_message_text = err_ctx.get("status_message_text") + status_code_status_code_value = err_ctx.get( + "status_code_status_code_value", exc_val + ) + + status_msg = ( + samlp.StatusMessage(text=status_message_text) + if status_message_text + else None + ) status = samlp.Status( status_message=status_msg, status_code=samlp.StatusCode( value=samlp.STATUS_RESPONDER, - status_code=samlp.StatusCode( - value=exc_val))) + status_code=samlp.StatusCode(value=status_code_status_code_value), + ), + ) return status -- cgit v1.2.1