Skip to content

Commit

Permalink
different username files (#18)
Browse files Browse the repository at this point in the history
* 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.
  • Loading branch information
andrewebdev authored Apr 14, 2021
1 parent 7243385 commit 260eac9
Show file tree
Hide file tree
Showing 2 changed files with 46 additions and 33 deletions.
15 changes: 13 additions & 2 deletions auditing/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,20 @@ def login_logger(sender, **kwargs):

@receiver(user_login_failed)
def login_failed_logger(sender, **kwargs):
USER_FIELD = getattr(settings, 'AUDIT_USERNAME_FIELD', 'username')

def get_username_in(credentials: dict):
"""
Find the username in credentials dict based on list of valid username
keys.
"""
USER_FIELDS = getattr(settings, 'AUDIT_USERNAME_FIELDS', ['username'])
for key in USER_FIELDS:
if key in credentials.keys():
return credentials[key]
raise KeyError("Valid username not found in credentials.")

msg_data = get_request_info(kwargs['request'])
msg_data['username'] = kwargs['credentials'][USER_FIELD]
msg_data['username'] = get_username_in(kwargs['credentials'])
logger.warn('"Django Login failed", {}'.format(
format_log_message(msg_data)))

Expand Down
64 changes: 33 additions & 31 deletions auditing/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,21 +159,6 @@ def test_ignored_fields(self):
self.assertNotIn('"password1":', out)
self.assertNotIn('"password2":', out)

@override_settings(AUDIT_USERNAME_FIELD='email')
def test_message_custom_user_field(self):
req = self._post(data={
"email": "user@example.com",
"password": "secret",
})

with self.assertLogs('auditing', level='INFO') as cm:
login_logger(
self.mock_sender,
user=MockUser(username='user@example.com'),
request=req)

self.assertIn('"username": "user@example.com"', cm.output[0])


class LoginFailedLoggerReceiverTestCase(SignalsBaseTestCase):

Expand Down Expand Up @@ -218,7 +203,7 @@ def test_ignored_fields(self):
self.assertNotIn('"password1": ', out)
self.assertNotIn('"password2": ', out)

@override_settings(AUDIT_USERNAME_FIELD='email')
@override_settings(AUDIT_USERNAME_FIELDS=['email'])
def test_message_custom_user_field(self):
req = self._post(data={
"email": "user@example.com",
Expand All @@ -233,6 +218,38 @@ def test_message_custom_user_field(self):

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

@override_settings(AUDIT_USERNAME_FIELDS=['email', 'username'])
def test_message_fallback_user_field(self):
req = self._post(data={
"username": "tester",
"password": "secret",
})

with self.assertLogs('auditing', level='INFO') as cm:
login_failed_logger(
self.mock_sender,
credentials={'username': 'wrong', 'password': '************'},
request=req)

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

@override_settings(AUDIT_USERNAME_FIELDS=['email'])
def test_user_field_not_found_raises_error(self):
req = self._post(data={
"username": "tester",
"password": "secret",
})

with self.assertRaises(KeyError) as err:
login_failed_logger(
self.mock_sender,
credentials={'username': 'wrong', 'password': '************'},
request=req)

self.assertEqual(
"'Valid username not found in credentials.'",
str(err.exception))


class LogoutLoggerReceiverTestCase(SignalsBaseTestCase):

Expand Down Expand Up @@ -282,21 +299,6 @@ def test_ignored_fields(self):
self.assertNotIn('"password1":', out)
self.assertNotIn('"password2":', out)

@override_settings(AUDIT_USERNAME_FIELD='email')
def test_message_custom_user_field(self):
req = self._post(data={
"email": "user@example.com",
"password": "secret",
})

with self.assertLogs('auditing', level='INFO') as cm:
logout_logger(
self.mock_sender,
user=MockUser('user@example.com'),
request=req)

self.assertIn('"username": "user@example.com"', cm.output[0])


class HTTPHeadersLoggingMiddlewareTestCase(TestCase):

Expand Down

0 comments on commit 260eac9

Please sign in to comment.