diff --git a/backend/users/jwt.py b/backend/users/jwt.py index 4cb1bfc..795177a 100644 --- a/backend/users/jwt.py +++ b/backend/users/jwt.py @@ -2,3 +2,11 @@ class CustomTokenObtainSerializer(TokenObtainPairSerializer): username_field = 'email' + + def validate(self, attrs): + # Strip stray whitespace from copy-pasted emails (Issue #474). + # Password is intentionally left untouched. + if isinstance(attrs.get(self.username_field), str): + attrs[self.username_field] = attrs[self.username_field].strip() + return super().validate(attrs) + \ No newline at end of file diff --git a/backend/users/serializers.py b/backend/users/serializers.py index 7ac9fbc..76f89a1 100644 --- a/backend/users/serializers.py +++ b/backend/users/serializers.py @@ -21,10 +21,17 @@ class RegisterSerializer(serializers.Serializer): last_name = serializers.CharField(required=False) def validate_email(self, value): + value = value.strip() if User.objects.filter(email__iexact=value).exists(): raise serializers.ValidationError('A user with this email already exists.') return value + def validate_first_name(self, value): + return value.strip() if value else value + + def validate_last_name(self, value): + return value.strip() if value else value + def create(self, validated_data): org = Organization.objects.create(name=validated_data['organization_name']) user = User.objects.create_user(