|
@@ -0,0 +1,93 @@
|
|
|
+from rest_framework import serializers
|
|
|
+
|
|
|
+from django.contrib.auth import get_user_model
|
|
|
+from django.contrib.auth.password_validation import validate_password
|
|
|
+from django.core.exceptions import ValidationError
|
|
|
+from django.utils.translation import ugettext as _
|
|
|
+
|
|
|
+from misago.users import captcha, validators
|
|
|
+from misago.users.bans import get_email_ban, get_ip_ban, get_username_ban
|
|
|
+
|
|
|
+
|
|
|
+UserModel = get_user_model()
|
|
|
+
|
|
|
+
|
|
|
+__all__ = ['RegisterUserSerializer']
|
|
|
+
|
|
|
+
|
|
|
+class RegisterUserSerializer(serializers.Serializer):
|
|
|
+ username = serializers.CharField(
|
|
|
+ max_length=255,
|
|
|
+ validators=[validators.validate_username],
|
|
|
+ )
|
|
|
+ email = serializers.CharField(
|
|
|
+ max_length=255,
|
|
|
+ validators=[validators.validate_email],
|
|
|
+ )
|
|
|
+ password = serializers.CharField(
|
|
|
+ max_length=255,
|
|
|
+ trim_whitespace=False,
|
|
|
+ )
|
|
|
+
|
|
|
+ def validate_username(self, data):
|
|
|
+ ban = get_username_ban(data, registration_only=True)
|
|
|
+ if ban:
|
|
|
+ if ban.user_message:
|
|
|
+ raise ValidationError(ban.user_message)
|
|
|
+ else:
|
|
|
+ raise ValidationError(_("This usernane is not allowed."))
|
|
|
+ return data
|
|
|
+
|
|
|
+ def validate_email(self, data):
|
|
|
+ ban = get_email_ban(data, registration_only=True)
|
|
|
+ if ban:
|
|
|
+ if ban.user_message:
|
|
|
+ raise ValidationError(ban.user_message)
|
|
|
+ else:
|
|
|
+ raise ValidationError(_("This e-mail address is not allowed."))
|
|
|
+ return data
|
|
|
+
|
|
|
+ def validate(self, data):
|
|
|
+ request = self.context['request']
|
|
|
+
|
|
|
+ ban = get_ip_ban(request.user_ip, registration_only=True)
|
|
|
+ if ban:
|
|
|
+ if ban.user_message:
|
|
|
+ raise ValidationError(ban.user_message)
|
|
|
+ else:
|
|
|
+ raise ValidationError(_("New registrations from this IP address are not allowed."))
|
|
|
+
|
|
|
+ self._added_errors = {}
|
|
|
+
|
|
|
+ try:
|
|
|
+ self.full_clean_password(data)
|
|
|
+ except ValidationError as e:
|
|
|
+ self._added_errors['password'] = [e]
|
|
|
+
|
|
|
+ validators.validate_new_registration(request, self, data)
|
|
|
+
|
|
|
+ if self._added_errors:
|
|
|
+ # fail registration with additional errors
|
|
|
+ raise serializers.ValidationError(self._added_errors)
|
|
|
+
|
|
|
+ # run test for captcha
|
|
|
+ try:
|
|
|
+ captcha.test_request(self.context['request'])
|
|
|
+ except ValidationError as e:
|
|
|
+ raise serializers.ValidationError({'captcha': [e.args[0]]})
|
|
|
+
|
|
|
+ return data
|
|
|
+
|
|
|
+ def full_clean_password(self, data):
|
|
|
+ if data.get('password'):
|
|
|
+ validate_password(
|
|
|
+ data['password'],
|
|
|
+ user=UserModel(
|
|
|
+ username=data.get('username'),
|
|
|
+ email=data.get('email'),
|
|
|
+ ),
|
|
|
+ )
|
|
|
+
|
|
|
+ def add_error(self, field, error):
|
|
|
+ """we are using custom implementation so custom validators work"""
|
|
|
+ self._added_errors.setdefault(field, []).append(error)
|