users.py 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. from django.contrib.auth import authenticate, get_user_model, login
  2. from django.core.exceptions import PermissionDenied
  3. from django.utils.translation import ugettext as _
  4. from django.views.decorators.csrf import csrf_protect
  5. from rest_framework import status, viewsets
  6. from rest_framework.response import Response
  7. from misago.conf import settings
  8. from misago.core import forms
  9. from misago.core.mail import mail_user
  10. from misago.users import captcha
  11. from misago.users.bans import ban_ip
  12. from misago.users.forms.register import RegisterForm
  13. from misago.users.models import (ACTIVATION_REQUIRED_USER,
  14. ACTIVATION_REQUIRED_ADMIN)
  15. from misago.users.rest_permissions import (BasePermission,
  16. IsAuthenticatedOrReadOnly, UnbannedAnonOnly)
  17. from misago.users.serializers import AuthenticatedUserSerializer
  18. from misago.users.tokens import make_activation_token
  19. from misago.users.validators import validate_new_registration
  20. class UserViewSetPermission(BasePermission):
  21. def has_permission(self, request, view):
  22. if view.action == 'create':
  23. policy = UnbannedAnonOnly()
  24. else:
  25. policy = IsAuthenticatedOrReadOnly()
  26. return policy.has_permission(request, view)
  27. class UserViewSet(viewsets.ViewSet):
  28. permission_classes = (UserViewSetPermission,)
  29. queryset = get_user_model().objects.all()
  30. def list(self, request):
  31. pass
  32. def create(self, request):
  33. return _create_user(request)
  34. @csrf_protect
  35. def _create_user(request):
  36. if settings.account_activation == 'disabled':
  37. raise PermissionDenied(
  38. _("New users registrations are currently disabled."))
  39. form = RegisterForm(request.data)
  40. try:
  41. captcha.test_request(request)
  42. except forms.ValidationError as e:
  43. form.add_error('captcha', e)
  44. if not form.is_valid():
  45. return Response(form.errors,
  46. status=status.HTTP_400_BAD_REQUEST)
  47. captcha.reset_session(request.session)
  48. try:
  49. validate_new_registration(
  50. request.user_ip,
  51. form.cleaned_data['username'],
  52. form.cleaned_data['email'])
  53. except PermissionDenied:
  54. staff_message = _("This ban was automatically imposed on "
  55. "%(date)s due to denied register attempt.")
  56. message_formats = {'date': date_format(timezone.now())}
  57. staff_message = staff_message % message_formats
  58. validation_ban = ban_ip(
  59. request.user_ip,
  60. staff_message=staff_message,
  61. length={'days': 1}
  62. )
  63. raise PermissionDenied(
  64. _("Your IP address is banned from performing this action."),
  65. {'ban': validation_ban.get_serialized_message()})
  66. activation_kwargs = {}
  67. if settings.account_activation == 'user':
  68. activation_kwargs = {
  69. 'requires_activation': ACTIVATION_REQUIRED_USER
  70. }
  71. elif settings.account_activation == 'admin':
  72. activation_kwargs = {
  73. 'requires_activation': ACTIVATION_REQUIRED_ADMIN
  74. }
  75. User = get_user_model()
  76. new_user = User.objects.create_user(form.cleaned_data['username'],
  77. form.cleaned_data['email'],
  78. form.cleaned_data['password'],
  79. joined_from_ip=request.user_ip,
  80. set_default_avatar=True,
  81. **activation_kwargs)
  82. mail_subject = _("Welcome on %(forum_title)s forums!")
  83. mail_subject = mail_subject % {'forum_title': settings.forum_name}
  84. if settings.account_activation == 'none':
  85. authenticated_user = authenticate(
  86. username=new_user.email,
  87. password=form.cleaned_data['password'])
  88. login(request, authenticated_user)
  89. mail_user(request, new_user, mail_subject,
  90. 'misago/emails/register/complete')
  91. return Response({
  92. 'activation': 'active',
  93. 'username': new_user.username,
  94. 'email': new_user.email
  95. })
  96. else:
  97. activation_token = make_activation_token(new_user)
  98. activation_by_admin = new_user.requires_activation_by_admin
  99. activation_by_user = new_user.requires_activation_by_user
  100. mail_user(
  101. request, new_user, mail_subject,
  102. 'misago/emails/register/inactive',
  103. {
  104. 'activation_token': activation_token,
  105. 'activation_by_admin': activation_by_admin,
  106. 'activation_by_user': activation_by_user,
  107. })
  108. if activation_by_admin:
  109. activation_method = 'activation_by_admin'
  110. else:
  111. activation_method = 'activation_by_user'
  112. return Response({
  113. 'activation': activation_method,
  114. 'username': new_user.username,
  115. 'email': new_user.email
  116. })