diff --git a/modoboa/admin/serializers.py b/modoboa/admin/serializers.py index 07d092ecf..d16c7757d 100644 --- a/modoboa/admin/serializers.py +++ b/modoboa/admin/serializers.py @@ -166,9 +166,10 @@ class WritableAccountSerializer(AccountSerializer): class AliasSerializer(serializers.ModelSerializer): """Base Alias serializer.""" - address = lib_fields.DRFEmailFieldUTF8() + address = lib_fields.DRFEmailFieldUTF8AndEmptyUser() recipients = serializers.ListField( - child=lib_fields.DRFEmailFieldUTF8(), allow_empty=False) + child=lib_fields.DRFEmailFieldUTF8AndEmptyUser(), + allow_empty=False) class Meta: model = admin_models.Alias diff --git a/modoboa/admin/tests/api.py b/modoboa/admin/tests/api.py index 2681e86f1..c58ca7e65 100644 --- a/modoboa/admin/tests/api.py +++ b/modoboa/admin/tests/api.py @@ -328,6 +328,12 @@ class AliasAPITestCase(ModoAPITestCase): address="user_éé@nonlocal.com", r_mailbox__isnull=True, r_alias__isnull=True).exists()) + # Create catchall alias + data = copy.deepcopy(self.ALIAS_DATA) + data["address"] = "@test.com" + response = self.client.post(url, data, format="json") + self.assertEqual(response.status_code, 201) + def test_update_alias(self): """Try to update an alias.""" alias = models.Alias.objects.get(address="alias@test.com") diff --git a/modoboa/lib/fields.py b/modoboa/lib/fields.py index a797c055f..c5e81ff11 100644 --- a/modoboa/lib/fields.py +++ b/modoboa/lib/fields.py @@ -49,3 +49,17 @@ class DRFEmailFieldUTF8(serializers.CharField): validator = validators.UTF8EmailValidator( message=self.error_messages["invalid"]) self.validators.append(validator) + + +class DRFEmailFieldUTF8AndEmptyUser(serializers.CharField): + """Custom DRF email field to support UTF8 and empty local part.""" + + default_error_messages = { + "invalid": ugettext_lazy("Enter a valid email address.") + } + + def __init__(self, **kwargs): + super(DRFEmailFieldUTF8AndEmptyUser, self).__init__(**kwargs) + validator = validators.UTF8AndEmptyUserEmailValidator( + message=self.error_messages["invalid"]) + self.validators.append(validator) diff --git a/modoboa/lib/validators.py b/modoboa/lib/validators.py index c056a7ea9..86fbbc85b 100644 --- a/modoboa/lib/validators.py +++ b/modoboa/lib/validators.py @@ -53,11 +53,11 @@ class UTF8EmailValidator(EmailValidator): validate_utf8_email = UTF8EmailValidator() -class UT8AndEmptyUserEmailValidator(UTF8EmailValidator): +class UTF8AndEmptyUserEmailValidator(UTF8EmailValidator): """Same as upper + allows empty local part.""" user_regex = re.compile( ur"(^$|" + UTF8EmailValidator.user_regex_raw, re.IGNORECASE) -validate_utf8_and_empty_user_email = UT8AndEmptyUserEmailValidator() +validate_utf8_and_empty_user_email = UTF8AndEmptyUserEmailValidator()