client.py 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. from django.core.exceptions import SuspiciousOperation
  2. from django.http import Http404
  3. from simple_sso.sso_client.client import AuthenticateView, Client, LoginView
  4. from ..users.authbackends import MisagoBackend
  5. from .user import get_or_create_user
  6. from .validators import UserDataValidator
  7. class MisagoAuthenticateView(AuthenticateView):
  8. @property
  9. def client(self):
  10. return create_configured_client(self.request)
  11. def get(self, request):
  12. if not request.settings.enable_sso:
  13. raise Http404()
  14. return super().get(request)
  15. class MisagoLoginView(LoginView):
  16. @property
  17. def client(self):
  18. return create_configured_client(self.request)
  19. def get(self, request):
  20. if not request.settings.enable_sso:
  21. raise Http404()
  22. return super().get(request)
  23. def create_configured_client(request):
  24. settings = request.settings
  25. return ClientMisago(
  26. settings.sso_url,
  27. settings.sso_public_key,
  28. settings.sso_private_key,
  29. request=request,
  30. )
  31. class ClientMisago(Client):
  32. def __init__(self, *args, **kwargs):
  33. self.request = kwargs.pop("request")
  34. super().__init__(*args, **kwargs)
  35. self.backend = "%s.%s" % (MisagoBackend.__module__, MisagoBackend.__name__)
  36. def build_user(self, user_data):
  37. validator = UserDataValidator(user_data)
  38. if not validator.is_valid():
  39. failed_fields = ", ".join(validator.errors.keys())
  40. raise SuspiciousOperation(f"User data failed to validate: {failed_fields}")
  41. return get_or_create_user(self.request, validator.cleaned_data)