Skip to content

Commit 169fc48

Browse files
authored
Add traceback info to logger messages within exceptions (#394)
* Replace older exception formatting with f-strings * Add exception info to logging
1 parent fcee903 commit 169fc48

File tree

5 files changed

+20
-19
lines changed

5 files changed

+20
-19
lines changed

djangosaml2/backends.py

+4-6
Original file line numberDiff line numberDiff line change
@@ -283,19 +283,17 @@ def get_or_create_user(
283283
try:
284284
user = UserModel.objects.get(**user_query_args)
285285
except MultipleObjectsReturned:
286-
logger.error(
287-
"Multiple users match, model: %s, lookup: %s",
288-
UserModel._meta,
289-
user_query_args,
286+
logger.exception(
287+
f"Multiple users match, model: {UserModel._meta}, lookup: {user_query_args}",
290288
)
291289
except UserModel.DoesNotExist:
292290
# Create new one if desired by settings
293291
if create_unknown_user:
294292
user = UserModel(**{user_lookup_key: user_lookup_value})
295293
created = True
296-
logger.debug(f"New user created: {user}")
294+
logger.debug(f"New user created: {user}", exc_info=True)
297295
else:
298-
logger.error(
296+
logger.exception(
299297
f"The user does not exist, model: {UserModel._meta}, lookup: {user_query_args}"
300298
)
301299

djangosaml2/utils.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ def get_idp_sso_supported_bindings(
8080
except UnknownSystemEntity:
8181
raise UnknownSystemEntity
8282
except Exception as e:
83-
logger.error(f"get_idp_sso_supported_bindings failed with: {e}")
83+
logger.exception(f"get_idp_sso_supported_bindings failed with: {e}")
8484

8585

8686
def get_location(http_info):
@@ -116,7 +116,9 @@ def validate_referral_url(request, url):
116116
# This will also resolve Django URL pattern names
117117
url = resolve_url(url)
118118
except NoReverseMatch:
119-
logger.debug("Could not validate given referral url is a valid URL")
119+
logger.debug(
120+
"Could not validate given referral url is a valid URL", exc_info=True
121+
)
120122
return None
121123

122124
# Ensure the user-originating redirection url is safe.

djangosaml2/views.py

+8-7
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,7 @@ class LoginView(SPConfigMixin, View):
175175

176176
def unknown_idp(self, request, idp):
177177
msg = f"Error: IdP EntityID {escape(idp)} was not found in metadata"
178-
logger.error(msg)
178+
logger.exception(msg)
179179
return HttpResponse(msg, status=403)
180180

181181
def load_sso_kwargs_scoping(self, sso_kwargs):
@@ -358,7 +358,7 @@ def get(self, request, *args, **kwargs):
358358
**sso_kwargs,
359359
)
360360
except TypeError as e:
361-
logger.error(f"{_msg}: {e}")
361+
logger.exception(f"{_msg}: {e}")
362362
return HttpResponse(_msg)
363363
else:
364364
http_response = HttpResponseRedirect(get_location(result))
@@ -369,7 +369,7 @@ def get(self, request, *args, **kwargs):
369369
try:
370370
location = client.sso_location(selected_idp, binding)
371371
except TypeError as e:
372-
logger.error(f"{_msg}: {e}")
372+
logger.exception(f"{_msg}: {e}")
373373
return HttpResponse(_msg)
374374

375375
session_id, request_xml = client.create_authn_request(
@@ -396,7 +396,8 @@ def get(self, request, *args, **kwargs):
396396
)
397397
except TemplateDoesNotExist as e:
398398
logger.debug(
399-
f"TemplateDoesNotExist: [{self.post_binding_form_template}] - {e}"
399+
f"TemplateDoesNotExist: [{self.post_binding_form_template}] - {e}",
400+
exc_info=True
400401
)
401402

402403
if not http_response:
@@ -410,7 +411,7 @@ def get(self, request, *args, **kwargs):
410411
)
411412
except TypeError as e:
412413
_msg = f"Can't prepare the authentication for {selected_idp}"
413-
logger.error(f"{_msg}: {e}")
414+
logger.exception(f"{_msg}: {e}")
414415
return HttpResponse(_msg)
415416
else:
416417
http_response = HttpResponse(result["data"])
@@ -545,7 +546,7 @@ def post(self, request, attribute_mapping=None, create_unknown_user=None):
545546
try:
546547
self.custom_validation(response)
547548
except Exception as e:
548-
logger.warning(f"SAML Response validation error: {e}")
549+
logger.warning(f"SAML Response validation error: {e}", exc_info=True)
549550
return self.handle_acs_failure(
550551
request,
551552
status=400,
@@ -808,7 +809,7 @@ def do_logout_service(self, request, data, binding):
808809
)
809810
except StatusError as e:
810811
response = None
811-
logger.warning("Error logging out from remote provider: " + str(e))
812+
logger.warning(f"Error logging out from remote provider: {e}", exc_info=True)
812813
state.sync()
813814
return finish_logout(request, response)
814815

setup.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ def read(*rnames):
2727

2828
setup(
2929
name="djangosaml2",
30-
version="1.9.0",
30+
version="1.9.1",
3131
description="pysaml2 integration for Django",
3232
long_description=read("README.md"),
3333
long_description_content_type="text/markdown",

tests/testprofiles/tests.py

+3-3
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ def test_get_or_create_user_duplicates(self):
294294
self.assertFalse(created)
295295
self.assertIn(
296296
"ERROR:djangosaml2:Multiple users match, model: testprofiles.testuser, lookup: {'age': ''}",
297-
logs.output,
297+
logs.output[0],
298298
)
299299

300300
def test_get_or_create_user_no_create(self):
@@ -314,7 +314,7 @@ def test_get_or_create_user_no_create(self):
314314
self.assertFalse(created)
315315
self.assertIn(
316316
"ERROR:djangosaml2:The user does not exist, model: testprofiles.testuser, lookup: {'username': 'paul'}",
317-
logs.output,
317+
logs.output[0],
318318
)
319319

320320
def test_get_or_create_user_create(self):
@@ -334,7 +334,7 @@ def test_get_or_create_user_create(self):
334334
self.assertTrue(created)
335335
self.assertIn(
336336
f"DEBUG:djangosaml2:New user created: {user}",
337-
logs.output,
337+
logs.output[0],
338338
)
339339

340340
def test_deprecations(self):

0 commit comments

Comments
 (0)