Skip to content

Commit 260eac9

Browse files
authored
different username files (#18)
* login failed receiver will check in allowed fields [#17] * Cleanup - We don't use multiple user fields here These two receivers don't check for credentials dictionary, but rather just uses the user object directly.
1 parent 7243385 commit 260eac9

File tree

2 files changed

+46
-33
lines changed

2 files changed

+46
-33
lines changed

auditing/__init__.py

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,9 +22,20 @@ def login_logger(sender, **kwargs):
2222

2323
@receiver(user_login_failed)
2424
def login_failed_logger(sender, **kwargs):
25-
USER_FIELD = getattr(settings, 'AUDIT_USERNAME_FIELD', 'username')
25+
26+
def get_username_in(credentials: dict):
27+
"""
28+
Find the username in credentials dict based on list of valid username
29+
keys.
30+
"""
31+
USER_FIELDS = getattr(settings, 'AUDIT_USERNAME_FIELDS', ['username'])
32+
for key in USER_FIELDS:
33+
if key in credentials.keys():
34+
return credentials[key]
35+
raise KeyError("Valid username not found in credentials.")
36+
2637
msg_data = get_request_info(kwargs['request'])
27-
msg_data['username'] = kwargs['credentials'][USER_FIELD]
38+
msg_data['username'] = get_username_in(kwargs['credentials'])
2839
logger.warn('"Django Login failed", {}'.format(
2940
format_log_message(msg_data)))
3041

auditing/tests.py

Lines changed: 33 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -159,21 +159,6 @@ def test_ignored_fields(self):
159159
self.assertNotIn('"password1":', out)
160160
self.assertNotIn('"password2":', out)
161161

162-
@override_settings(AUDIT_USERNAME_FIELD='email')
163-
def test_message_custom_user_field(self):
164-
req = self._post(data={
165-
"email": "[email protected]",
166-
"password": "secret",
167-
})
168-
169-
with self.assertLogs('auditing', level='INFO') as cm:
170-
login_logger(
171-
self.mock_sender,
172-
user=MockUser(username='[email protected]'),
173-
request=req)
174-
175-
self.assertIn('"username": "[email protected]"', cm.output[0])
176-
177162

178163
class LoginFailedLoggerReceiverTestCase(SignalsBaseTestCase):
179164

@@ -218,7 +203,7 @@ def test_ignored_fields(self):
218203
self.assertNotIn('"password1": ', out)
219204
self.assertNotIn('"password2": ', out)
220205

221-
@override_settings(AUDIT_USERNAME_FIELD='email')
206+
@override_settings(AUDIT_USERNAME_FIELDS=['email'])
222207
def test_message_custom_user_field(self):
223208
req = self._post(data={
224209
"email": "[email protected]",
@@ -233,6 +218,38 @@ def test_message_custom_user_field(self):
233218

234219
self.assertIn('"username": "wrong"', cm.output[0])
235220

221+
@override_settings(AUDIT_USERNAME_FIELDS=['email', 'username'])
222+
def test_message_fallback_user_field(self):
223+
req = self._post(data={
224+
"username": "tester",
225+
"password": "secret",
226+
})
227+
228+
with self.assertLogs('auditing', level='INFO') as cm:
229+
login_failed_logger(
230+
self.mock_sender,
231+
credentials={'username': 'wrong', 'password': '************'},
232+
request=req)
233+
234+
self.assertIn('"username": "wrong"', cm.output[0])
235+
236+
@override_settings(AUDIT_USERNAME_FIELDS=['email'])
237+
def test_user_field_not_found_raises_error(self):
238+
req = self._post(data={
239+
"username": "tester",
240+
"password": "secret",
241+
})
242+
243+
with self.assertRaises(KeyError) as err:
244+
login_failed_logger(
245+
self.mock_sender,
246+
credentials={'username': 'wrong', 'password': '************'},
247+
request=req)
248+
249+
self.assertEqual(
250+
"'Valid username not found in credentials.'",
251+
str(err.exception))
252+
236253

237254
class LogoutLoggerReceiverTestCase(SignalsBaseTestCase):
238255

@@ -282,21 +299,6 @@ def test_ignored_fields(self):
282299
self.assertNotIn('"password1":', out)
283300
self.assertNotIn('"password2":', out)
284301

285-
@override_settings(AUDIT_USERNAME_FIELD='email')
286-
def test_message_custom_user_field(self):
287-
req = self._post(data={
288-
"email": "[email protected]",
289-
"password": "secret",
290-
})
291-
292-
with self.assertLogs('auditing', level='INFO') as cm:
293-
logout_logger(
294-
self.mock_sender,
295-
user=MockUser('[email protected]'),
296-
request=req)
297-
298-
self.assertIn('"username": "[email protected]"', cm.output[0])
299-
300302

301303
class HTTPHeadersLoggingMiddlewareTestCase(TestCase):
302304

0 commit comments

Comments
 (0)