fix: mailbox deletion respects alias setting

This commit is contained in:
Carlos Quintana 2025-08-12 12:34:34 +02:00 committed by Carlos Quintana
parent c776a05ca4
commit 532d69844d
2 changed files with 32 additions and 12 deletions

View file

@ -2982,10 +2982,17 @@ class Mailbox(Base, ModelMixin):
alias.mailbox_id = first_mb.id
alias._mailboxes.remove(first_mb)
else:
from app.alias_delete import perform_alias_deletion
from app.alias_delete import perform_alias_deletion, move_alias_to_trash
# If the user setting is DeleteImmediately, perform alias deletion
# Otherwise, if the user setting is MoveToTrash, assign the default mailbox and move them to trash
# only put aliases that have mailbox as a single mailbox into trash
perform_alias_deletion(alias, user, AliasDeleteReason.MailboxDeleted)
if user.alias_delete_action == UserAliasDeleteAction.DeleteImmediately:
perform_alias_deletion(
alias, user, AliasDeleteReason.MailboxDeleted
)
else:
alias.mailbox_id = user.default_mailbox_id
move_alias_to_trash(alias, user, AliasDeleteReason.MailboxDeleted)
Session.commit()
cls.filter(cls.id == obj_id).delete()

View file

@ -43,13 +43,17 @@ def teardown_module():
def ensure_alias_is_trashed(
alias: Alias, expected_audit_log_size: int, reason: AliasDeleteReason
):
assert alias.enabled is False
assert alias.delete_on is not None
assert alias.delete_reason == reason
) -> Alias:
db_alias = Alias.get(alias.id)
assert db_alias is not None
assert db_alias.enabled is False
assert db_alias.delete_on is not None
assert db_alias.delete_reason == reason
# Ensure audit log
audit_logs: List[AliasAuditLog] = AliasAuditLog.filter_by(alias_id=alias.id).all()
audit_logs: List[AliasAuditLog] = AliasAuditLog.filter_by(
alias_id=db_alias.id
).all()
assert len(audit_logs) == expected_audit_log_size
assert (
audit_logs[expected_audit_log_size - 2].action
@ -61,9 +65,11 @@ def ensure_alias_is_trashed(
)
# Ensure DeletedAlias instance is not created
deleted_alias: Optional[DeletedAlias] = DeletedAlias.get_by(email=alias.email)
deleted_alias: Optional[DeletedAlias] = DeletedAlias.get_by(email=db_alias.email)
assert deleted_alias is None
return db_alias
def ensure_alias_is_deleted(
alias_id: int,
@ -205,9 +211,16 @@ def test_delete_mailbox_deletes_alias_with_user_setting(
Mailbox.delete(mb.id)
ensure_alias_is_deleted(
alias_id, alias_email, 2, reason=AliasDeleteReason.MailboxDeleted
)
if user_setting == UserAliasDeleteAction.MoveToTrash:
db_alias = ensure_alias_is_trashed(
alias, 2, reason=AliasDeleteReason.MailboxDeleted
)
# Ensure mailbox_id has been changed to the user's default mailbox id
assert db_alias.mailbox_id == user.default_mailbox_id
elif user_setting == UserAliasDeleteAction.DeleteImmediately:
ensure_alias_is_deleted(
alias_id, alias_email, 2, reason=AliasDeleteReason.MailboxDeleted
)
# Restore alias