From 4a70cc36166d51a0bdb07025f492d63b07a2d06d Mon Sep 17 00:00:00 2001 From: "gerald.colangelo" Date: Thu, 29 Sep 2011 18:37:16 +0200 Subject: [PATCH] Added "CREATE_DIRECTORIES" parameters in admin panel. If CREATE_DIRECTORIE is set to "no", skip directories creation on filesystem. --- admin/__init__.py | 3 ++ admin/models.py | 127 ++++++++++++++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 44 deletions(-) diff --git a/admin/__init__.py b/admin/__init__.py index 03e469356..31df01e3a 100644 --- a/admin/__init__.py +++ b/admin/__init__.py @@ -4,6 +4,9 @@ from modoboa.lib import parameters, events from django.utils.translation import ugettext as _ from models import Extension +parameters.register_admin("CREATE_DIRECTORIES", type="list", deflt="yes", + values=[("yes", "yes"), ("no", "no")], + help=_("Modoboa will handle mailbox creation on filesystem")) parameters.register_admin("STORAGE_PATH", type="string", deflt="/var/vmail", help=_("Path to the root directory where messages are stored")) parameters.register_admin("VIRTUAL_UID", type="string", deflt="vmail", diff --git a/admin/models.py b/admin/models.py index 62e94cc78..b618b5d6b 100644 --- a/admin/models.py +++ b/admin/models.py @@ -95,18 +95,27 @@ class Domain(DatesAware): mailbox_count = property(__mailbox_count) def create_dir(self): - path = "%s/%s" % (parameters.get_admin("STORAGE_PATH"), self.name) - return exec_as_vuser("mkdir -p %s" % path) + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + path = "%s/%s" % (parameters.get_admin("STORAGE_PATH"), self.name) + return exec_as_vuser("mkdir -p %s" % path) + else: + return True def rename_dir(self, oldname): - stpath = parameters.get_admin("STORAGE_PATH") - return exec_as_vuser("mv %s/%s %s/%s" \ - % (stpath, oldname, stpath, self.name)) + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + stpath = parameters.get_admin("STORAGE_PATH") + return exec_as_vuser("mv %s/%s %s/%s" \ + % (stpath, oldname, stpath, self.name)) + else: + return True def delete_dir(self): - return exec_as_vuser("rm -r %s/%s" \ - % (parameters.get_admin("STORAGE_PATH"), - self.name)) + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + return exec_as_vuser("rm -r %s/%s" \ + % (parameters.get_admin("STORAGE_PATH"), + self.name)) + else: + return True def delete(self, *args, **kwargs): keepdir = False @@ -190,42 +199,51 @@ class Mailbox(DatesAware): alias_count = property(__alias_count) def create_dir(self): - relpath = "%s/%s" % (self.domain.name, self.address) - abspath = os.path.join(parameters.get_admin("STORAGE_PATH"), relpath) - if self.mbtype == "mbox": - self.path = "%s/Inbox" % self.address - else: - self.path = "%s/" % self.address - if os.path.exists(abspath): - return True - if not exec_as_vuser("mkdir -p %s" % abspath): - return False - if self.mbtype == "mbox": - template = ["Inbox", "Drafts", "Sent", "Trash", "Junk"] - for f in template: - exec_as_vuser("touch %s/%s" % (abspath, f)) - else: - template = [".Drafts/", ".Sent/", ".Trash/", ".Junk/"] - for dir in template: - for sdir in ["cur", "new", "tmp"]: - exec_as_vuser("mkdir -p %s/%s/%s/%s" \ - % (abspath, self.mdirroot, dir, sdir)) - return True + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + relpath = "%s/%s" % (self.domain.name, self.address) + abspath = os.path.join(parameters.get_admin("STORAGE_PATH"), relpath) + if self.mbtype == "mbox": + self.path = "%s/Inbox" % self.address + else: + self.path = "%s/" % self.address + if os.path.exists(abspath): + return True + if not exec_as_vuser("mkdir -p %s" % abspath): + return False + if self.mbtype == "mbox": + template = ["Inbox", "Drafts", "Sent", "Trash", "Junk"] + for f in template: + exec_as_vuser("touch %s/%s" % (abspath, f)) + else: + template = [".Drafts/", ".Sent/", ".Trash/", ".Junk/"] + for dir in template: + for sdir in ["cur", "new", "tmp"]: + exec_as_vuser("mkdir -p %s/%s/%s/%s" \ + % (abspath, self.mdirroot, dir, sdir)) + return True + else: + return True def rename_dir(self, domain, newaddress): - if self.domain.name == domain and newaddress == self.address: - return True - path = "%s/%s" % (parameters.get_admin("STORAGE_PATH"), domain) - code = exec_as_vuser("mv %s/%s %s/%s" \ - % (path, self.address, path, newaddress)) - if code: - self.path = "%s/" % newaddress - return code + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + if self.domain.name == domain and newaddress == self.address: + return True + path = "%s/%s" % (parameters.get_admin("STORAGE_PATH"), domain) + code = exec_as_vuser("mv %s/%s %s/%s" \ + % (path, self.address, path, newaddress)) + if code: + self.path = "%s/" % newaddress + return code + else: + return True def delete_dir(self): - return exec_as_vuser("rm -r %s/%s/%s" \ - % (parameters.get_admin("STORAGE_PATH"), - self.domain.name, self.address)) + if parameters.get_admin("CREATE_DIRECTORIES") == "yes": + return exec_as_vuser("rm -r %s/%s/%s" \ + % (parameters.get_admin("STORAGE_PATH"), + self.domain.name, self.address)) + else: + return True def save(self, *args, **kwargs): if not self.create_dir(): @@ -253,8 +271,19 @@ class Mailbox(DatesAware): if kwargs.has_key("password") and kwargs["password"] != u"é": self.password = crypt_password(kwargs["password"]) - self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid - self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid + # If we ever had numerical uid, don't resolve it + v_uid = parameters.get_admin("VIRTUAL_UID"); + if v_uid.isdigit(): + self.uid = v_uid + else: + self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid + # Just the same for gid + v_gid = parameters.get_admin("VIRTUAL_GID") + if v_gid.isdigit: + self.gid = v_gid + else: + self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid + if kwargs.has_key("quota") and kwargs["quota"] is not None \ and int(kwargs["quota"]) < self.domain.quota: self.quota = kwargs["quota"] @@ -280,8 +309,18 @@ class Mailbox(DatesAware): self.user = user if not self.create_dir(): raise AdminError(_("Failed to initialise mailbox, check permissions")) - self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid - self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid + # If we ever had numerical uid, don't resolve it + v_uid = parameters.get_admin("VIRTUAL_UID"); + if v_uid.isdigit(): + self.uid = v_uid + else: + self.uid = pwd.getpwnam(parameters.get_admin("VIRTUAL_UID")).pw_uid + # Just the same for gid + v_gid = parameters.get_admin("VIRTUAL_GID") + if v_gid.isdigit: + self.gid = v_gid + else: + self.gid = pwd.getpwnam(parameters.get_admin("VIRTUAL_GID")).pw_gid self.quota = self.domain.quota super(Mailbox, self).save()