signals.py 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. import logging
  2. from django.contrib.auth.signals import user_logged_in, user_login_failed
  3. from django.db.models.signals import post_save
  4. from django.dispatch import receiver
  5. from netbox.config import get_config
  6. from users.models import User, UserConfig
  7. from utilities.request import get_client_ip
  8. @receiver(user_login_failed)
  9. def log_user_login_failed(sender, credentials, request, **kwargs):
  10. logger = logging.getLogger('netbox.auth.login')
  11. username = credentials.get("username")
  12. if client_ip := get_client_ip(request):
  13. logger.info(f"Failed login attempt for username: {username} from {client_ip}")
  14. else:
  15. logger.warning(
  16. "Client IP address could not be determined for validation. Check that the HTTP server is properly "
  17. "configured to pass the required header(s)."
  18. )
  19. logger.info(f"Failed login attempt for username: {username}")
  20. @receiver(user_logged_in)
  21. def set_language_on_login(sender, user, request, **kwargs):
  22. """
  23. Store the user's preferred language on the request so that middleware can set the language cookie. This ensures the
  24. language preference is applied even when logging in via an external auth provider (e.g. social-app-django) that
  25. does not go through NetBox's LoginView.
  26. """
  27. if hasattr(user, 'config'):
  28. if language := user.config.get('locale.language'):
  29. request._language_cookie = language
  30. @receiver(post_save, sender=User)
  31. def create_userconfig(instance, created, raw=False, **kwargs):
  32. """
  33. Automatically create a new UserConfig when a new User is created. Skip this if importing a user from a fixture.
  34. """
  35. if created and not raw:
  36. config = get_config()
  37. UserConfig(user=instance, data=config.DEFAULT_USER_PREFERENCES).save()