users.py 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. from django.conf import settings
  2. from django.contrib.auth.password_validation import validate_password
  3. from rest_framework import serializers
  4. from desecapi.models import User, validate_domain_name
  5. from .captcha import CaptchaSolutionSerializer
  6. from .domains import DomainSerializer
  7. class EmailSerializer(serializers.Serializer):
  8. email = serializers.EmailField()
  9. class EmailPasswordSerializer(EmailSerializer):
  10. password = serializers.CharField()
  11. class ChangeEmailSerializer(serializers.Serializer):
  12. new_email = serializers.EmailField()
  13. def validate_new_email(self, value):
  14. if value == self.context["request"].user.email:
  15. raise serializers.ValidationError("Email address unchanged.")
  16. return value
  17. class ResetPasswordSerializer(EmailSerializer):
  18. captcha = CaptchaSolutionSerializer(required=True)
  19. class UserSerializer(serializers.ModelSerializer):
  20. class Meta:
  21. model = User
  22. fields = (
  23. "created",
  24. "email",
  25. "id",
  26. "limit_domains",
  27. "outreach_preference",
  28. )
  29. read_only_fields = (
  30. "created",
  31. "email",
  32. "id",
  33. "limit_domains",
  34. )
  35. def validate_password(self, value):
  36. if value is not None:
  37. validate_password(value)
  38. return value
  39. def create(self, validated_data):
  40. return User.objects.create_user(**validated_data)
  41. class RegisterAccountSerializer(UserSerializer):
  42. domain = serializers.CharField(required=False, validators=validate_domain_name)
  43. captcha = CaptchaSolutionSerializer(required=False)
  44. class Meta:
  45. model = UserSerializer.Meta.model
  46. fields = (
  47. "email",
  48. "password",
  49. "domain",
  50. "captcha",
  51. "outreach_preference",
  52. )
  53. extra_kwargs = {
  54. "password": {
  55. "write_only": True, # Do not expose password field
  56. "allow_null": True,
  57. }
  58. }
  59. def validate_domain(self, value):
  60. serializer = DomainSerializer(data=dict(name=value), context=self.context)
  61. try:
  62. serializer.is_valid(raise_exception=True)
  63. except serializers.ValidationError:
  64. raise serializers.ValidationError(
  65. serializer.default_error_messages["name_unavailable"],
  66. code="name_unavailable",
  67. )
  68. if (
  69. not settings.REGISTER_LPS_ON_SIGNUP
  70. and DomainSerializer.Meta.model(name=value).is_locally_registrable
  71. ):
  72. raise serializers.ValidationError(
  73. "Registration during sign-up disabled; please create account without a domain name.",
  74. )
  75. return value
  76. def create(self, validated_data):
  77. validated_data.pop("domain", None)
  78. # If validated_data['captcha'] exists, the captcha was also validated, so we can set the user to verified
  79. if "captcha" in validated_data:
  80. validated_data.pop("captcha")
  81. validated_data["needs_captcha"] = False
  82. return super().create(validated_data)