From 67c291cb99625e94f0027e5e0e6764fa39c1d424 Mon Sep 17 00:00:00 2001 From: jorgepastorr Date: Mon, 8 Jul 2024 18:30:00 +0200 Subject: [PATCH] mailboxes ratelimit prepare --- orchestra/contrib/mailboxes/admin.py | 4 ++-- orchestra/contrib/mailboxes/backends.py | 27 ++++++++++++++++++++++--- orchestra/contrib/mailboxes/forms.py | 5 +++++ orchestra/contrib/mailboxes/models.py | 5 +++++ orchestra/contrib/mailboxes/settings.py | 18 +++++++++++++++++ 5 files changed, 54 insertions(+), 5 deletions(-) diff --git a/orchestra/contrib/mailboxes/admin.py b/orchestra/contrib/mailboxes/admin.py index 5315a86c..fe434483 100644 --- a/orchestra/contrib/mailboxes/admin.py +++ b/orchestra/contrib/mailboxes/admin.py @@ -47,7 +47,7 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo ) add_fieldsets = ( (None, { - 'fields': ('account_link', 'name', 'password1', 'password2', 'filtering'), + 'fields': ('account_link', 'name', 'password1', 'password2', 'filtering', 'ratelimit'), }), (_("Custom filtering"), { 'classes': ('collapse',), @@ -61,7 +61,7 @@ class MailboxAdmin(ChangePasswordAdminMixin, SelectAccountAdminMixin, ExtendedMo ) fieldsets = ( (None, { - 'fields': ('name', 'password', 'is_active', 'account_link', 'filtering'), + 'fields': ('name', 'password', 'is_active', 'account_link', 'filtering', 'ratelimit'), }), (_("Custom filtering"), { 'classes': ('collapse',), diff --git a/orchestra/contrib/mailboxes/backends.py b/orchestra/contrib/mailboxes/backends.py index d6c4770f..0b6c2749 100644 --- a/orchestra/contrib/mailboxes/backends.py +++ b/orchestra/contrib/mailboxes/backends.py @@ -679,6 +679,8 @@ class RSpamdRatelimitController(ServiceController): def save(self, mailbox): context = self.get_context(mailbox) self.append(textwrap.dedent(""" + # sed -i '/^%(user)s$/d' %(maps)s + # echo '%(user)s' >> %(path_maps)s%(ratelimit)s.map if ! grep -qx '%(user)s' /etc/rspamd/local.d/maps/usuariosbase.map; then echo '%(user)s' >> /etc/rspamd/local.d/maps/usuariosbase.map RELOAD_RSPAMD=1 @@ -689,6 +691,7 @@ class RSpamdRatelimitController(ServiceController): def delete(self, mailbox): context = self.get_context(mailbox) self.append(textwrap.dedent(""" + # sed -i '/^%(user)s$/d' %(maps)s if grep -qx '%(user)s' /etc/rspamd/local.d/maps/usuariosbase.map; then sed -i '/^%(user)s$/d' /etc/rspamd/local.d/maps/usuariosbase.map RELOAD_RSPAMD=1 @@ -697,11 +700,29 @@ class RSpamdRatelimitController(ServiceController): ) def commit(self): - self.append('[[ $RELOAD_RSPAMD -eq 1 ]] && systemctl reload rspamd.service') + self.append('# [[ $RELOAD_RSPAMD -eq 1 ]] && systemctl reload rspamd.service') super().commit() - + def get_context(self, mailbox): + maps = self.extract_group_maps() context = { 'user': mailbox.name, + 'ratelimit': mailbox.ratelimit, + 'maps': maps, + 'path_maps': settings.MAILBOXES_RATELIMIT_PATH_MAPS, } - return context \ No newline at end of file + return context + + def extract_group_maps(self): + """ + debulve string de todos los ficheros de maps assignados en settings para ratelimit + return string + """ + choice_groups = settings.MAILBOXES_RATELIMIT_GROUP + path = settings.MAILBOXES_RATELIMIT_PATH_MAPS + group_maps = '' + if len(choice_groups) > 0: + for choice in choice_groups: + group_maps += f"{path}{choice[0]}.map " + + return group_maps \ No newline at end of file diff --git a/orchestra/contrib/mailboxes/forms.py b/orchestra/contrib/mailboxes/forms.py index 522b608e..607c246f 100644 --- a/orchestra/contrib/mailboxes/forms.py +++ b/orchestra/contrib/mailboxes/forms.py @@ -54,6 +54,11 @@ class MailboxForm(forms.ModelForm): raise ValidationError("Name length should be less than %i." % max_length) return name + def clean_ratelimit(self): + ratelimit = self.cleaned_data['ratelimit'] + if ratelimit is None: + ratelimit = settings.MAILBOXES_RATELIMIT_GROUP_DEFAULT + return ratelimit class MailboxChangeForm(UserChangeForm, MailboxForm): pass diff --git a/orchestra/contrib/mailboxes/models.py b/orchestra/contrib/mailboxes/models.py index 7122b5e1..7ae16003 100644 --- a/orchestra/contrib/mailboxes/models.py +++ b/orchestra/contrib/mailboxes/models.py @@ -33,6 +33,11 @@ class Mailbox(models.Model): "sieve language. " "This overrides any automatic junk email filtering")) is_active = models.BooleanField(_("active"), default=True) + ratelimit = models.CharField(_("ratelimit"), + max_length=100, null=True, blank=True, + choices=settings.MAILBOXES_RATELIMIT_GROUP, + default=settings.MAILBOXES_RATELIMIT_GROUP_DEFAULT,) + class Meta: verbose_name_plural = _("mailboxes") diff --git a/orchestra/contrib/mailboxes/settings.py b/orchestra/contrib/mailboxes/settings.py index c9412754..e2a61642 100644 --- a/orchestra/contrib/mailboxes/settings.py +++ b/orchestra/contrib/mailboxes/settings.py @@ -203,3 +203,21 @@ MAILBOXES_MOVE_ON_DELETE_PATH = Setting('MAILBOXES_MOVE_ON_DELETE_PATH', help_text="Available fromat names: %s" % ', '.join(_backend_names), validators=[Setting.string_format_validator(_backend_names)], ) + +MAILBOXES_RATELIMIT_GROUP = Setting('MAILBOXES_RATELIMIT_GROUP', ( + ('userbase', 'base'), + ('user100', '100'), + ('user200', '200'), + ('user500', '500'), + ), + help_text="Available messages per second" +) + +MAILBOXES_RATELIMIT_GROUP_DEFAULT = Setting('MAILBOXES_RATELIMIT_GROUP_DEFAULT', + 'userbase', + choices=MAILBOXES_RATELIMIT_GROUP +) + +MAILBOXES_RATELIMIT_PATH_MAPS = Setting('MAILBOXES_RATELIMIT_PATH_MAPS', + '/etc/rspamd/local.d/maps/', +)