From 55bdf3a82f78c7b1ade75a4f40efe2e03f13b129 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Mon, 27 Feb 2017 16:17:08 +0100 Subject: [PATCH] Fixed mailbox removal. see #1046 --- .../commands/handle_mailbox_operations.py | 16 ++++++++++------ modoboa/admin/models/domain.py | 3 +-- modoboa/admin/views/domain.py | 2 +- 3 files changed, 12 insertions(+), 9 deletions(-) diff --git a/modoboa/admin/management/commands/handle_mailbox_operations.py b/modoboa/admin/management/commands/handle_mailbox_operations.py index 42b605708..20b4af734 100644 --- a/modoboa/admin/management/commands/handle_mailbox_operations.py +++ b/modoboa/admin/management/commands/handle_mailbox_operations.py @@ -2,10 +2,11 @@ import logging import os +import shutil from django.core.management.base import BaseCommand -from param_tools import tools as param_tools +from modoboa.parameters import tools as param_tools from modoboa.lib.sysutils import exec_cmd from modoboa.lib.exceptions import InternalError @@ -52,13 +53,16 @@ class Command(BaseCommand): raise OperationError(output) def delete_mailbox(self, operation): + """Try to delete a mailbox tree on filesystem.""" if not os.path.exists(operation.argument): return - code, output = exec_cmd( - "rm -r %s" % operation.argument - ) - if code: - raise OperationError(output) + + def onerror(function, path, excinfo): + """Handle errors.""" + self.logger.critical( + "delete failed (reason: {})".format(excinfo)) + + shutil.rmtree(operation.argument, False, onerror) def check_pidfile(self, path): """Check if this command is already running diff --git a/modoboa/admin/models/domain.py b/modoboa/admin/models/domain.py index cfae8f6f3..e580fddae 100644 --- a/modoboa/admin/models/domain.py +++ b/modoboa/admin/models/domain.py @@ -226,8 +226,7 @@ class Domain(AdminObject): if self.alias_set.count(): ungrant_access_to_objects(self.alias_set.all()) if param_tools.get_global_parameter("auto_account_removal"): - for account in User.objects.filter(mailbox__domain=self): - account.delete(fromuser, keepdir) + User.objects.filter(mailbox__domain=self).delete() elif self.mailbox_set.count(): Quota.objects.filter(username__contains="@%s" % self.name).delete() ungrant_access_to_objects(self.mailbox_set.all()) diff --git a/modoboa/admin/views/domain.py b/modoboa/admin/views/domain.py index e1141a6ed..3348ec93d 100644 --- a/modoboa/admin/views/domain.py +++ b/modoboa/admin/views/domain.py @@ -135,7 +135,7 @@ def editdomain(request, dom_id): @login_required @permission_required("admin.delete_domain") def deldomain(request, dom_id): - keepdir = True if request.POST.get("keepdir", "false") == "true" else False + keepdir = request.POST.get("keepdir", "false") == "true" try: mb = Mailbox.objects.get(user__id=request.user.id) except Mailbox.DoesNotExist: