Prevent creation of same alias addresses using different case

fix #3134
This commit is contained in:
Antoine Nguyen
2023-12-21 17:47:06 +01:00
parent 492fe50550
commit 8407a49e26
3 changed files with 15 additions and 4 deletions
+3 -3
View File
@@ -469,7 +469,7 @@ class AliasSerializer(serializers.ModelSerializer):
"""Check domain."""
local_part, self.domain = admin_models.validate_alias_address(
value, self.context["request"].user, instance=self.instance)
return value
return value.lower()
def create(self, validated_data):
"""Create appropriate objects."""
@@ -498,13 +498,13 @@ class SenderAddressSerializer(serializers.ModelSerializer):
def validate_address(self, value):
"""Check domain."""
local_part, domain = email_utils.split_mailbox(value)
local_part, domain = email_utils.split_mailbox(value.lower())
domain = admin_models.Domain.objects.filter(name=domain).first()
user = self.context["request"].user
if domain and not user.can_access(domain):
raise serializers.ValidationError(
_("You don't have access to this domain."))
return value
return value.lower()
def validate_mailbox(self, value):
"""Check permission."""
+11
View File
@@ -678,6 +678,17 @@ class AliasAPITestCase(ModoAPITestCase):
response = self.client.post(url, data, format="json")
self.assertEqual(response.status_code, 201)
def test_create_duplicate_alias(self):
url = reverse("v1:alias-list")
response = self.client.post(url, self.ALIAS_DATA, format="json")
self.assertEqual(response.status_code, 201)
# Try with same address but different case
data = copy.deepcopy(self.ALIAS_DATA)
data["address"] = "ALIAS_fromapi@test.com"
response = self.client.post(url, data, format="json")
self.assertEqual(response.status_code, 400)
def test_create_alias_as_domadmin(self):
"""As DomainAdmin, try to create a new alias."""
self.client.credentials(
+1 -1
View File
@@ -28,7 +28,7 @@ def validate_alias_address(
address, creator, internal=False, instance=None, ignore_existing=False
):
"""Check if the given alias address can be created by creator."""
local_part, domain = split_mailbox(address)
local_part, domain = split_mailbox(address.lower())
domain = Domain.objects.filter(name=domain).first()
if domain is None:
raise ValidationError(_("Domain not found."))