From 0f1a90aacb751830992ebcafc88af3a709b1cfc6 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 4 Dec 2020 09:37:30 +0100 Subject: [PATCH 1/2] Replaced CharField by TextField. see #2081 --- .../migrations/0018_auto_20201204_0935.py | 18 ++++++++++++++++++ modoboa/admin/models/alarm.py | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 modoboa/admin/migrations/0018_auto_20201204_0935.py diff --git a/modoboa/admin/migrations/0018_auto_20201204_0935.py b/modoboa/admin/migrations/0018_auto_20201204_0935.py new file mode 100644 index 000000000..35bdf2f62 --- /dev/null +++ b/modoboa/admin/migrations/0018_auto_20201204_0935.py @@ -0,0 +1,18 @@ +# Generated by Django 2.2.12 on 2020-12-04 08:35 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('admin', '0017_alarm'), + ] + + operations = [ + migrations.AlterField( + model_name='alarm', + name='title', + field=models.TextField(), + ), + ] diff --git a/modoboa/admin/models/alarm.py b/modoboa/admin/models/alarm.py index 12ea82d39..8168fe51d 100644 --- a/modoboa/admin/models/alarm.py +++ b/modoboa/admin/models/alarm.py @@ -33,7 +33,7 @@ class Alarm(models.Model): db_index=True ) - title = models.CharField(max_length=150) + title = models.TextField() internal_name = models.CharField(max_length=120) objects = models.Manager.from_queryset(AlarmQuerySet)() From 1827bce52d8002060b68ec24752080f5af7a2a76 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Thu, 11 Feb 2021 17:16:21 +0100 Subject: [PATCH 2/2] Run doveadm command as vmail user. see #2084 --- modoboa/admin/app_settings.py | 12 +----------- modoboa/admin/models/mailbox.py | 12 +----------- modoboa/core/app_settings.py | 9 ++++++--- modoboa/core/commands/templates/settings.py.tpl | 2 ++ modoboa/lib/sysutils.py | 11 +++++++---- 5 files changed, 17 insertions(+), 29 deletions(-) diff --git a/modoboa/admin/app_settings.py b/modoboa/admin/app_settings.py index f1275c709..8de7dca47 100644 --- a/modoboa/admin/app_settings.py +++ b/modoboa/admin/app_settings.py @@ -145,14 +145,6 @@ class AdminParametersForm(param_forms.AdminParametersForm): ) ) - mailboxes_owner = forms.CharField( - label=ugettext_lazy("Mailboxes owner"), - initial="vmail", - help_text=ugettext_lazy( - "The UNIX account who owns mailboxes on the filesystem" - ) - ) - default_mailbox_quota = forms.IntegerField( label=ugettext_lazy("Default mailbox quota"), initial=0, @@ -198,8 +190,7 @@ class AdminParametersForm(param_forms.AdminParametersForm): # Visibility rules visibility_rules = { "valid_mxs": "enable_mx_checks=True", - "domains_must_have_authorized_mx": "enable_mx_checks=True", - "mailboxes_owner": "handle_mailboxes=True", + "domains_must_have_authorized_mx": "enable_mx_checks=True" } def __init__(self, *args, **kwargs): @@ -234,7 +225,6 @@ class AdminParametersForm(param_forms.AdminParametersForm): hide_fields = True if hide_fields: del self.fields["handle_mailboxes"] - del self.fields["mailboxes_owner"] def clean_default_domain_quota(self): """Ensure quota is a positive integer.""" diff --git a/modoboa/admin/models/mailbox.py b/modoboa/admin/models/mailbox.py index cbea1a775..1b5ae5625 100644 --- a/modoboa/admin/models/mailbox.py +++ b/modoboa/admin/models/mailbox.py @@ -1,8 +1,5 @@ """Models related to mailboxes management.""" -import os -import pwd - from reversion import revisions as reversion from django.contrib.contenttypes.models import ContentType @@ -153,14 +150,7 @@ class Mailbox(mixins.MessageLimitMixin, AdminObject): if not admin_params.get("handle_mailboxes"): return None if self.__mail_home is None: - curuser = pwd.getpwuid(os.getuid()).pw_name - mbowner = admin_params["mailboxes_owner"] - options = {} - if curuser != mbowner: - options["sudo_user"] = mbowner - code, output = doveadm_cmd( - "user -f home %s" % self.full_address, **options - ) + code, output = doveadm_cmd("user -f home %s" % self.full_address) if code: raise lib_exceptions.InternalError( _("Failed to retrieve mailbox location (%s)") % output) diff --git a/modoboa/core/app_settings.py b/modoboa/core/app_settings.py index c545614c8..3f90b4140 100644 --- a/modoboa/core/app_settings.py +++ b/modoboa/core/app_settings.py @@ -49,9 +49,7 @@ class GeneralParametersForm(param_forms.AdminParametersForm): password_scheme = forms.ChoiceField( label=ugettext_lazy("Default password scheme"), - choices=[(hasher.name, ugettext_lazy(hasher.label)) - for hasher in PasswordHasher.get_password_hashers() - if hasher().scheme in get_dovecot_schemes()], + choices=[], initial="sha512crypt", help_text=ugettext_lazy("Scheme used to crypt mailbox passwords"), ) @@ -528,6 +526,11 @@ class GeneralParametersForm(param_forms.AdminParametersForm): self._add_visibilty_rules( sms_backends.get_all_backend_visibility_rules() ) + self.fields["password_scheme"].choices = [ + (hasher.name, ugettext_lazy(hasher.label)) + for hasher in PasswordHasher.get_password_hashers() + if hasher().scheme in get_dovecot_schemes() + ] def _add_dynamic_fields(self): new_fields = OrderedDict() diff --git a/modoboa/core/commands/templates/settings.py.tpl b/modoboa/core/commands/templates/settings.py.tpl index c604ca92b..726860ee9 100644 --- a/modoboa/core/commands/templates/settings.py.tpl +++ b/modoboa/core/commands/templates/settings.py.tpl @@ -197,6 +197,8 @@ REST_FRAMEWORK = { # DOVECOT_LOOKUP_PATH = ('/path/to/dovecot', ) +# DOVECOT_USER = 'vmail' + MODOBOA_API_URL = 'https://api.modoboa.org/1/' DISABLE_DASHBOARD_EXTERNAL_QUERIES = False diff --git a/modoboa/lib/sysutils.py b/modoboa/lib/sysutils.py index 05e84c41f..d290a04a7 100644 --- a/modoboa/lib/sysutils.py +++ b/modoboa/lib/sysutils.py @@ -5,6 +5,7 @@ This module extra functions/shortcuts to communicate with the system import inspect import os +import pwd import re import subprocess @@ -42,8 +43,7 @@ def exec_cmd(cmd, sudo_user=None, pinput=None, capture_output=True, **kwargs): return process.returncode, output -def doveadm_cmd(params, sudo_user=None, pinput=None, - capture_output=True, **kwargs): +def doveadm_cmd(params, pinput=None, capture_output=True, **kwargs): """Execute doveadm command. Run doveadm command using the current user. Set :keyword:`sudo_user` if @@ -69,14 +69,17 @@ def doveadm_cmd(params, sudo_user=None, pinput=None, if os.path.isfile(fpath) and os.access(fpath, os.X_OK): dpath = fpath break + dovecot_user = getattr(settings, "DOVECOT_USER", "vmail") + curuser = pwd.getpwuid(os.getuid()).pw_name + sudo_user = dovecot_user if curuser != dovecot_user else None if dpath: return exec_cmd("{} {}".format(dpath, params), sudo_user=sudo_user, pinput=pinput, capture_output=capture_output, **kwargs) - else: - raise OSError("doveadm command not found") + + raise OSError("doveadm command not found") def guess_extension_name():