From 4dc5d9960e503174bfa57a01a84f94190650a59f Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 23 Aug 2023 16:08:41 +0200 Subject: [PATCH 1/3] Only create not internal aliases from account form see #3021 --- modoboa/admin/forms/account.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index d08d3fff4..65ce8ed6d 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -403,6 +403,7 @@ class AccountFormMail(forms.Form, DynamicForm): def _update_aliases(self, user, account): """Update mailbox aliases.""" + # 1. We check if existing aliases were removed... qset = self.mb.aliasrecipient_set.select_related("alias").filter( alias__internal=False) for ralias in qset: @@ -414,22 +415,26 @@ class AccountFormMail(forms.Form, DynamicForm): alias.delete() else: self.aliases.remove(ralias.alias.address) + # 2. Nothing left to do, return if not self.aliases: return + # 3. Check limits at all levels core_signals.can_create_object.send( self.__class__, context=user, klass=models.Alias, count=len(self.aliases)) core_signals.can_create_object.send( self.__class__, context=self.mb.domain, object_type="mailbox_aliases", count=len(self.aliases)) + # 4. Create / update aliases for alias in self.aliases: if self.mb.aliasrecipient_set.select_related("alias").filter( - alias__address=alias).exists(): + alias__address=alias, internal=False).exists(): continue local_part, domname = split_mailbox(alias) al, _ = models.Alias.objects.get_or_create( address=alias, domain=models.Domain.objects.get(name=domname), + internal=False, defaults={'enabled': account.is_active}, ) al.add_recipients([self.mb.full_address]) From 495c670effd9b1231ae6cb0eed4a928968bdf5fe Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Wed, 23 Aug 2023 16:48:14 +0200 Subject: [PATCH 2/3] Fixed wrong filter --- modoboa/admin/forms/account.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modoboa/admin/forms/account.py b/modoboa/admin/forms/account.py index 65ce8ed6d..8fd2572b6 100644 --- a/modoboa/admin/forms/account.py +++ b/modoboa/admin/forms/account.py @@ -428,7 +428,7 @@ class AccountFormMail(forms.Form, DynamicForm): # 4. Create / update aliases for alias in self.aliases: if self.mb.aliasrecipient_set.select_related("alias").filter( - alias__address=alias, internal=False).exists(): + alias__address=alias, alias__internal=False).exists(): continue local_part, domname = split_mailbox(alias) al, _ = models.Alias.objects.get_or_create( From 5e94c8d8ba0efab47065e5c9d47886491be1561d Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 25 Aug 2023 17:13:30 +0200 Subject: [PATCH 3/3] Added test --- modoboa/admin/tests/test_account.py | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/modoboa/admin/tests/test_account.py b/modoboa/admin/tests/test_account.py index d47faf17e..6f1c7ab88 100644 --- a/modoboa/admin/tests/test_account.py +++ b/modoboa/admin/tests/test_account.py @@ -135,6 +135,26 @@ class AccountTestCase(ModoTestCase): self.ajax_post(reverse("admin:account_add"), values) self.assertTrue(alias.aliasrecipient_set.count() == 2) + def test_create_alias_on_existing_account(self): + values = { + "email": "tester@test.com", + "username": "tester@test.com", + "role": "SimpleUsers", + "random_password": "on", + "quota_act": True, + "is_active": True, + "stepid": "step2", + "aliases": "user@test.com", + } + self.ajax_post(reverse("admin:account_add"), values) + # Check that internal alias has not been updated + alias = models.Alias.objects.get( + address="user@test.com", internal=True) + self.assertTrue(alias.aliasrecipient_set.count() == 1) + alias = models.Alias.objects.get( + address="user@test.com", internal=False) + self.assertTrue(alias.aliasrecipient_set.count() == 1) + def test_create_disabled_account(self): """Check if account and alias are disabled.""" values = {