diff --git a/modoboa/extensions/amavis/general_callbacks.py b/modoboa/extensions/amavis/general_callbacks.py index 1e1c9b9d5..87bfd3115 100644 --- a/modoboa/extensions/amavis/general_callbacks.py +++ b/modoboa/extensions/amavis/general_callbacks.py @@ -1,3 +1,5 @@ +"""General event callbacks.""" + from django.core.urlresolvers import reverse from django.utils.translation import ugettext as _ from django.template import Template, Context @@ -16,15 +18,11 @@ def create_relay_domains_records(): """Create records for existing relay domains.""" from modoboa.extensions.postfix_relay_domains.models import RelayDomain - for dom in RelayDomain.objects.all(): - name = "@{0}".format(dom.name) - policy, created = Policy.objects.get_or_create(policy_name=name[:32]) - Users.objects.get_or_create( - email=name, fullname=name, priority=7, policy=policy) - for rdalias in dom.relaydomainalias_set.all(): - name = "@{0}".format(rdalias.name) - Users.objects.get_or_create( - email=name, fullname=name, priority=7, policy=policy) + for rdom in RelayDomain.objects.all(): + policy = create_user_and_policy("@{0}".format(rdom.name)) + for rdomalias in rdom.relaydomainalias_set.all(): + rdomalias_pattern = "@{0}".format(rdomalias.name) + create_user_and_use_policy(rdomalias_pattern, policy) @events.observe("InitialDataLoaded") @@ -67,7 +65,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 543913b8d..a1ab982e7 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/amavis/modo_extension.py b/modoboa/extensions/amavis/modo_extension.py index 55f73ba3e..81b287a44 100644 --- a/modoboa/extensions/amavis/modo_extension.py +++ b/modoboa/extensions/amavis/modo_extension.py @@ -16,10 +16,13 @@ from modoboa.extensions.admin.models import Domain from modoboa.lib import parameters from . import general_callbacks -from .models import Policy, Users +from .lib import create_user_and_policy, create_user_and_use_policy class Amavis(ModoExtension): + + """The Amavis extension.""" + name = "amavis" label = "Amavis frontend" version = "1.0" @@ -36,15 +39,10 @@ class Amavis(ModoExtension): def load_initial_data(self): """Create records for existing domains and co.""" for dom in Domain.objects.all(): - name = "@{0}".format(dom.name) - policy, created = Policy.objects.get_or_create( - policy_name=name[:32]) - Users.objects.get_or_create( - email=name, fullname=name, priority=7, policy=policy) - for dalias in dom.domainalias_set.all(): - name = "@{0}".format(dalias.name) - Users.objects.get_or_create( - email=name, fullname=name, priority=7, policy=policy) + policy = create_user_and_policy("@{0}".format(dom.name)) + for domalias in dom.domainalias_set.all(): + domalias_pattern = "@{0}".format(domalias.name) + create_user_and_use_policy(domalias_pattern, policy) if not exts_pool.is_extension_installed( "modoboa.extensions.postfix_relay_domains"): diff --git a/modoboa/extensions/amavis/views.py b/modoboa/extensions/amavis/views.py index f44f40ca5..40fba3722 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(): 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")