users.py 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  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. return value
  69. def validate(self, attrs):
  70. if (
  71. not settings.REGISTER_LPS
  72. and attrs.get("captcha") is not None
  73. and attrs.get("domain") is not None
  74. and DomainSerializer.Meta.model(name=attrs["domain"]).is_locally_registrable
  75. ):
  76. raise serializers.ValidationError(
  77. {
  78. "domain": [
  79. DomainSerializer.default_error_messages["name_unavailable"]
  80. ]
  81. },
  82. code="name_unavailable",
  83. )
  84. return super().validate(attrs)
  85. def create(self, validated_data):
  86. validated_data.pop("domain", None)
  87. # If validated_data['captcha'] exists, the captcha was also validated, so we can set the user to verified
  88. if "captcha" in validated_data:
  89. validated_data.pop("captcha")
  90. validated_data["needs_captcha"] = False
  91. return super().create(validated_data)