views.py 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. from django.contrib.auth import REDIRECT_FIELD_NAME, login
  2. from django.core.exceptions import PermissionDenied
  3. from django.http import Http404
  4. from django.urls import reverse
  5. from django.utils.translation import gettext as _
  6. from django.views.decorators.cache import never_cache
  7. from django.views.decorators.csrf import csrf_exempt
  8. from social_core.actions import do_auth, do_complete
  9. from social_django.views import _do_login
  10. from social_django.utils import load_strategy
  11. def get_provider_from_request(request, backend):
  12. try:
  13. return request.socialauth[backend]
  14. except KeyError:
  15. raise Http404()
  16. def social_auth_view(f):
  17. def social_auth_view_wrapper(request, backend, *args, **kwargs):
  18. if request.settings.enable_oauth2_client:
  19. raise PermissionDenied(
  20. _(
  21. "This feature has been disabled. "
  22. "Please use %(provider)s to sign in."
  23. )
  24. % {"provider": request.settings.oauth2_provider}
  25. )
  26. provider = get_provider_from_request(request, backend)
  27. request.strategy = load_strategy(request)
  28. backend_class = provider["auth_backend"]
  29. request.backend = backend_class(
  30. request.strategy,
  31. reverse("misago:social-complete", kwargs={"backend": backend}),
  32. )
  33. return f(request, backend, *args, **kwargs)
  34. return social_auth_view_wrapper
  35. @never_cache
  36. @social_auth_view
  37. def auth(request, backend):
  38. return do_auth(request.backend, redirect_name=REDIRECT_FIELD_NAME)
  39. @never_cache
  40. @csrf_exempt
  41. @social_auth_view
  42. def complete(request, backend, *args, **kwargs):
  43. return do_complete(
  44. request.backend,
  45. do_login,
  46. user=request.user,
  47. redirect_name=REDIRECT_FIELD_NAME,
  48. request=request,
  49. *args,
  50. **kwargs
  51. )
  52. def do_login(backend, user, social_user):
  53. user.backend = "misago.users.authbackends.MisagoBackend"
  54. login(backend.strategy.request, user)