From e01b422c1398e43e190fba7c376b78ca8212338a Mon Sep 17 00:00:00 2001 From: Marie PUPO JEAMMET Date: Tue, 25 Nov 2025 15:20:15 +0100 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8(mailboxes)=20check=20imported=20mailb?= =?UTF-8?q?oxes=20don't=20clash=20with=20existing=20alias?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit check that dimail imported mailboxes don't use the same username as existing aliases. --- .../tests/test_utils_dimail_client.py | 45 ++++++++++++------- src/backend/mailbox_manager/utils/dimail.py | 10 +++-- 2 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/backend/mailbox_manager/tests/test_utils_dimail_client.py b/src/backend/mailbox_manager/tests/test_utils_dimail_client.py index 2403fea..d9d626b 100644 --- a/src/backend/mailbox_manager/tests/test_utils_dimail_client.py +++ b/src/backend/mailbox_manager/tests/test_utils_dimail_client.py @@ -40,22 +40,22 @@ def test_dimail_synchronization__already_sync(dimail_token_ok): assert pre_sync_mailboxes.count() == 3 dimail_client = DimailAPIClient() - + # Ensure successful response using "responses": # token response in fixtures responses.get( re.compile(rf".*/domains/{domain.name}/mailboxes/"), json=[ - { - "type": "mailbox", - "status": "broken", - "email": f"{mailbox.local_part}@{domain.name}", - "givenName": mailbox.first_name, - "surName": mailbox.last_name, - "displayName": f"{mailbox.first_name} {mailbox.last_name}", - } - for mailbox in pre_sync_mailboxes - ], + { + "type": "mailbox", + "status": "broken", + "email": f"{mailbox.local_part}@{domain.name}", + "givenName": mailbox.first_name, + "surName": mailbox.last_name, + "displayName": f"{mailbox.first_name} {mailbox.last_name}", + } + for mailbox in pre_sync_mailboxes + ], status=status.HTTP_200_OK, content_type="application/json", ) @@ -75,8 +75,10 @@ def test_dimail_synchronization__synchronize_mailboxes(mock_warning, dimail_toke domain = factories.MailDomainEnabledFactory() assert not models.Mailbox.objects.exists() + existing_alias = factories.AliasFactory(domain=domain) + dimail_client = DimailAPIClient() - + # Ensure successful response using "responses": # token response in fixtures mailbox_valid = { @@ -111,15 +113,24 @@ def test_dimail_synchronization__synchronize_mailboxes(mock_warning, dimail_toke "surName": "Vang", "displayName": "Jean Vang", } + mailbox_existing_username = { + "type": "mailbox", + "status": "broken", + "email": f"{existing_alias.local_part}@{domain.name}", + "givenName": "Support", + "surName": "email", + "displayName": "Support email", + } responses.get( re.compile(rf".*/domains/{domain.name}/mailboxes/"), json=[ - mailbox_valid, - mailbox_with_wrong_domain, - mailbox_with_invalid_domain, - mailbox_with_invalid_local_part, - ], + mailbox_valid, + mailbox_with_wrong_domain, + mailbox_with_invalid_domain, + mailbox_with_invalid_local_part, + mailbox_existing_username, + ], status=status.HTTP_200_OK, content_type="application/json", ) diff --git a/src/backend/mailbox_manager/utils/dimail.py b/src/backend/mailbox_manager/utils/dimail.py index 344b536..7a6b233 100644 --- a/src/backend/mailbox_manager/utils/dimail.py +++ b/src/backend/mailbox_manager/utils/dimail.py @@ -377,14 +377,16 @@ class DimailAPIClient: dimail_mailboxes = response.json() known_mailboxes = models.Mailbox.objects.filter(domain=domain) known_aliases = [ - known_alias.local_part + known_alias.local_part for known_alias in models.Alias.objects.filter(domain=domain) ] imported_mailboxes = [] for dimail_mailbox in dimail_mailboxes: - if dimail_mailbox["email"] not in [ - str(known_mailboxes) for known_mailboxes in known_mailboxes - ] and dimail_mailbox['email'].split('@')[0] not in known_aliases: + if ( + dimail_mailbox["email"] + not in [str(known_mailboxes) for known_mailboxes in known_mailboxes] + and dimail_mailbox["email"].split("@")[0] not in known_aliases + ): try: # sometimes dimail api returns email from another domain, # so we decide to exclude this kind of email