activation.py 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from django.core.exceptions import PermissionDenied
  2. from django.contrib.auth import get_user_model
  3. from django.shortcuts import get_object_or_404, render
  4. from django.urls import reverse
  5. from django.utils.translation import gettext as _
  6. from ...core.exceptions import Banned
  7. from ..bans import get_user_ban
  8. from ..decorators import deny_authenticated, deny_banned_ips
  9. from ..tokens import is_activation_token_valid
  10. User = get_user_model()
  11. def activation_view(f):
  12. @deny_authenticated
  13. @deny_banned_ips
  14. def decorator(request, *args, **kwargs):
  15. if request.settings.enable_oauth2_client:
  16. raise PermissionDenied(
  17. _("Please use %(provider)s to activatee your account.")
  18. % {"provider": request.settings.oauth2_provider}
  19. )
  20. return f(request, *args, **kwargs)
  21. return decorator
  22. @activation_view
  23. def request_activation(request):
  24. request.frontend_context.update(
  25. {"SEND_ACTIVATION_API": reverse("misago:api:send-activation")}
  26. )
  27. return render(request, "misago/activation/request.html")
  28. class ActivationStopped(Exception):
  29. pass
  30. class ActivationError(Exception):
  31. pass
  32. @activation_view
  33. def activate_by_token(request, pk, token):
  34. inactive_user = get_object_or_404(User, pk=pk, is_active=True)
  35. try:
  36. if not inactive_user.requires_activation:
  37. message = _("%(user)s, your account is already active.")
  38. raise ActivationStopped(message % {"user": inactive_user.username})
  39. if not is_activation_token_valid(inactive_user, token):
  40. message = _(
  41. "%(user)s, your activation link is invalid. "
  42. "Try again or request new activation link."
  43. )
  44. raise ActivationError(message % {"user": inactive_user.username})
  45. ban = get_user_ban(inactive_user, request.cache_versions)
  46. if ban:
  47. raise Banned(ban)
  48. except ActivationStopped as e:
  49. return render(request, "misago/activation/stopped.html", {"message": e.args[0]})
  50. except ActivationError as e:
  51. return render(
  52. request, "misago/activation/error.html", {"message": e.args[0]}, status=400
  53. )
  54. inactive_user.requires_activation = User.ACTIVATION_NONE
  55. inactive_user.save(update_fields=["requires_activation"])
  56. message = _("%(user)s, your account has been activated!")
  57. return render(
  58. request,
  59. "misago/activation/done.html",
  60. {"message": message % {"user": inactive_user.username}},
  61. )