From df98dd6a6e95865e39030005d072de2c734b12c0 Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 6 Feb 2015 09:26:48 +0100 Subject: [PATCH 1/2] Prevent an Internal Error. --- modoboa/extensions/amavis/views.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index a15165090..7400d76a5 100644 --- a/modoboa/extensions/amavis/views.py +++ b/modoboa/extensions/amavis/views.py @@ -156,7 +156,9 @@ def viewmail_selfservice(request, mail_id, @selfservice(viewmail_selfservice) def viewmail(request, mail_id): - rcpt = request.GET["rcpt"] + rcpt = request.GET.get("rcpt", None) + if rcpt is None: + raise BadRequest(_("Invalid request")) if request.user.email == rcpt: get_connector().set_msgrcpt_status(rcpt, mail_id, 'V') elif request.user.mailbox_set.count(): From 9faf21a97f51f016a977d304838799d22637afea Mon Sep 17 00:00:00 2001 From: Antoine Nguyen Date: Fri, 6 Feb 2015 19:02:09 +0100 Subject: [PATCH 2/2] Fix wrong calls. see #680 --- modoboa/extensions/amavis/__init__.py | 12 +++-------- .../extensions/amavis/general_callbacks.py | 3 ++- modoboa/extensions/amavis/lib.py | 20 +++++++++++-------- .../postfix_relay_domains/__init__.py | 12 +++-------- .../postfix_relay_domains/amavis_callbacks.py | 4 +++- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/modoboa/extensions/amavis/__init__.py b/modoboa/extensions/amavis/__init__.py index 552e006dd..7ca09f161 100644 --- a/modoboa/extensions/amavis/__init__.py +++ b/modoboa/extensions/amavis/__init__.py @@ -29,21 +29,15 @@ class Amavis(ModoExtension): for existing domains to let Amavis consider them local. """ from modoboa.extensions.admin.models import Domain - from modoboa.extensions.amavis.models import Users from modoboa.extensions.amavis.lib import ( create_user_and_policy, create_user_and_use_policy ) for dom in Domain.objects.all(): - try: - Users.objects.get(email="@%s" % dom.name) - except Users.DoesNotExist: - create_user_and_policy(dom.name) + policy = create_user_and_policy("@{0}".format(dom.name)) for domalias in dom.domainalias_set.all(): - try: - Users.objects.get(email='@%s' % domalias.name) - except Users.DoesNotExist: - create_user_and_use_policy(domalias.name, dom.name) + domalias_pattern = "@{0}".format(domalias.name) + create_user_and_use_policy(domalias_pattern, policy) def load(self): from .app_settings import ParametersForm, UserSettings diff --git a/modoboa/extensions/amavis/general_callbacks.py b/modoboa/extensions/amavis/general_callbacks.py index 32e42cb01..c98c5fb24 100644 --- a/modoboa/extensions/amavis/general_callbacks.py +++ b/modoboa/extensions/amavis/general_callbacks.py @@ -44,7 +44,8 @@ def on_domain_deleted(domain): @events.observe("DomainAliasCreated") def on_domain_alias_created(user, domainalias): create_user_and_use_policy( - "@{0}".format(domainalias.name), domainalias.target.name + "@{0}".format(domainalias.name), + "@{0}".format(domainalias.target.name) ) diff --git a/modoboa/extensions/amavis/lib.py b/modoboa/extensions/amavis/lib.py index 646ca46c8..459613689 100644 --- a/modoboa/extensions/amavis/lib.py +++ b/modoboa/extensions/amavis/lib.py @@ -235,6 +235,8 @@ def create_user_and_policy(name, priority=7): :param str name: name :return: the new ``Policy`` object """ + if Users.objects.filter(email=name).exists(): + return Policy.objects.get(policy_name=name[:32]) policy = Policy.objects.create(policy_name=name[:32]) Users.objects.create( email=name, fullname=name, priority=priority, policy=policy @@ -242,14 +244,15 @@ def create_user_and_policy(name, priority=7): return policy -def create_user_and_use_policy(name, policy_name, priority=7): +def create_user_and_use_policy(name, policy, priority=7): """Create a *users* record and use an existing policy. :param str name: user record name - :param str policy_name: policy name + :param str policy: string or Policy instance """ - policy = Policy.objects.get(policy_name="@{0}".format(policy_name[:32])) - Users.objects.create( + if isinstance(policy, basestring): + policy = Policy.objects.get(policy_name=policy[:32]) + Users.objects.get_or_create( email=name, fullname=name, priority=priority, policy=policy ) @@ -319,9 +322,9 @@ def setup_manual_learning_for_domain(domain): :return: True if learning has been setup, False otherwise """ - if Policy.objects.filter(sa_username=domain.name).count(): + if Policy.objects.filter(sa_username=domain.name).exists(): return False - policy = Policy.objects.get(policy_name=domain.name) + policy = Policy.objects.get(policy_name=domain.name[:32]) policy.sa_username = domain.name policy.save() return True @@ -333,8 +336,9 @@ def setup_manual_learning_for_mbox(mbox): :return: True if learning has been setup, False otherwise """ result = False - if not Policy.objects.filter(policy_name=mbox.full_address).exists(): - policy = create_user_and_policy(mbox.full_address) + pname = mbox.full_address[:32] + if not Policy.objects.filter(policy_name=pname).exists(): + policy = create_user_and_policy(pname) for alias in mbox.alias_addresses: create_user_and_use_policy(alias, policy) result = True diff --git a/modoboa/extensions/postfix_relay_domains/__init__.py b/modoboa/extensions/postfix_relay_domains/__init__.py index d3451781e..2eff6661b 100644 --- a/modoboa/extensions/postfix_relay_domains/__init__.py +++ b/modoboa/extensions/postfix_relay_domains/__init__.py @@ -48,21 +48,15 @@ def init_amavis_dependant_features(): We create records for *users* and *policy* tables for each defined relay domain or relay domain alias. """ - from modoboa.extensions.amavis.models import Users from modoboa.extensions.amavis.lib import ( create_user_and_policy, create_user_and_use_policy ) for rdom in RelayDomain.objects.all(): - try: - Users.objects.get(email="@%s" % rdom.name) - except Users.DoesNotExist: - create_user_and_policy(rdom.name) + policy = create_user_and_policy("@{0}".format(rdom.name)) for rdomalias in rdom.relaydomainalias_set.all(): - try: - Users.objects.get(email='@%s' % rdomalias.name) - except Users.DoesNotExist: - create_user_and_use_policy(rdomalias.name, rdom.name) + rdomalias_pattern = "@{0}".format(rdomalias.name) + create_user_and_use_policy(rdomalias_pattern, policy) class PostfixRelayDomains(ModoExtension): diff --git a/modoboa/extensions/postfix_relay_domains/amavis_callbacks.py b/modoboa/extensions/postfix_relay_domains/amavis_callbacks.py index 05d4f29c9..d73770986 100644 --- a/modoboa/extensions/postfix_relay_domains/amavis_callbacks.py +++ b/modoboa/extensions/postfix_relay_domains/amavis_callbacks.py @@ -25,7 +25,9 @@ def on_relay_domain_deleted(rdomain): @events.observe("RelayDomainAliasCreated") def on_relay_domain_alias_created(user, rdomainalias): create_user_and_use_policy( - "@{0}".format(rdomainalias.name), rdomainalias.target.name) + "@{0}".format(rdomainalias.name), + "@{0}".format(rdomainalias.target.name) + ) @events.observe("RelayDomainAliasDeleted")