views.py 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. from functools import wraps
  2. from logging import getLogger
  3. from django.contrib.auth import get_user_model, login
  4. from django.http import Http404
  5. from django.shortcuts import redirect, render
  6. from django.urls import reverse
  7. from django.views.decorators.cache import never_cache
  8. from ..core.exceptions import Banned
  9. from ..users.bans import get_user_ban
  10. from ..users.decorators import deny_banned_ips
  11. from ..users.registration import send_welcome_email
  12. from .client import (
  13. create_login_url,
  14. get_access_token,
  15. get_code_grant,
  16. get_user_data,
  17. )
  18. from .exceptions import (
  19. OAuth2Error,
  20. OAuth2UserAccountDeactivatedError,
  21. OAuth2UserDataValidationError,
  22. )
  23. from .user import get_user_from_data
  24. logger = getLogger("misago.oauth2")
  25. User = get_user_model()
  26. def oauth2_view(f):
  27. f = deny_banned_ips(f)
  28. @wraps(f)
  29. @never_cache
  30. def wrapped_oauth2_view(request):
  31. if not request.settings.enable_oauth2_client:
  32. raise Http404()
  33. return f(request)
  34. return wrapped_oauth2_view
  35. @oauth2_view
  36. def oauth2_login(request):
  37. redirect_to = create_login_url(request)
  38. return redirect(redirect_to)
  39. @oauth2_view
  40. def oauth2_complete(request):
  41. try:
  42. code_grant = get_code_grant(request)
  43. token = get_access_token(request, code_grant)
  44. user_data = get_user_data(request, token)
  45. user, created = get_user_from_data(request, user_data)
  46. if not user.is_active:
  47. raise OAuth2UserAccountDeactivatedError()
  48. if not user.is_staff:
  49. if user_ban := get_user_ban(user, request.cache_versions):
  50. raise Banned(user_ban)
  51. except OAuth2UserDataValidationError as error:
  52. logger.exception(
  53. "OAuth2 Profile Error",
  54. extra={
  55. f"error[{error_index}]": str(error_msg)
  56. for error_index, error_msg in enumerate(error.error_list)
  57. },
  58. )
  59. return render(
  60. request,
  61. "misago/errorpages/oauth2_profile.html",
  62. {
  63. "error": error,
  64. "error_list": error.error_list,
  65. },
  66. status=400,
  67. )
  68. except OAuth2Error as error:
  69. logger.exception("OAuth2 Error")
  70. return render(
  71. request,
  72. "misago/errorpages/oauth2.html",
  73. {"error": error},
  74. status=400,
  75. )
  76. if created and request.settings.oauth2_send_welcome_email:
  77. send_welcome_email(request, user)
  78. if not user.requires_activation:
  79. login(request, user)
  80. return redirect(reverse("misago:index"))