new changes to squash after review:

- fix misspellings errors in documentation
- add unit test to avoid github checkers red status in codecov tests.
- add validation of email from and domain whitelist fields.
- update documentation remove roadmap for already updated functionalities.
- update translations
This commit is contained in:
Katherine Zaoral 2020-09-04 17:45:56 -03:00 committed by Maksym Yankin
parent 7a9fcb44e3
commit 201e35d24e
9 changed files with 132 additions and 67 deletions

View File

@ -31,17 +31,17 @@ being appended into the proper Sender header instead. To accomplish this we:
* Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
it will let us to search the proper mail server to be used to send the messages
where the message 'From' email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.
there is not mail server that matches then will use the default mail server to
send the message.
* Add a Email From field that will let us to email from a specific address taking
into account this conditions:
1) If the sender domain match with the domain whitelist then the original
message's 'From' will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.
mail server is able to send in the name of the sender domain.
2) If the original message's 'From' does not match with the domain whitelist
then the email From is replaced with the Email From field value.
@ -62,12 +62,6 @@ Usage
* Set the `Email From` option to an email address
* Set the `Domain Whitelist` option with the domain whitelist
Known issues / Roadmap
======================
* Add validation of smtp_from field to ensure that is a valid email address
* Add validation of domain_whitelist field to ensure that they are valid domains
Bug Tracker
===========

View File

@ -15,6 +15,16 @@ msgstr ""
"Content-Transfer-Encoding: \n"
"Plural-Forms: \n"
#. module: mail_outbound_static
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid ""
"%s is not a valid domain. Please define a list of valid domains separated by"
" comma"
msgstr ""
"%s no es un dominio válido. Por favor defina una lista de dominios validos separados por"
" comas"
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid ""
@ -23,10 +33,10 @@ msgid ""
"messages where the message 'From' email domain match with the domain "
"whitelist."
msgstr ""
"Lista de dominios permitidos separados por comas. Si no se ha seleccionado un servidor SMTP "
"nos permitirá seleccionar el servidor de mail apropiado para enviar los "
"mensajes donde el dominio del email del 'De' coincida con la lista blanca "
"de dominios."
"Lista de dominios permitidos separados por comas. Si no se ha seleccionado "
"un servidor SMTP nos permitirá seleccionar el servidor de mail apropiado "
"para enviar los mensajes donde el dominio del email del 'De' coincida con la"
" lista blanca de dominios."
#. module: mail_outbound_static
#: model:ir.model.fields,field_description:mail_outbound_static.field_ir_mail_server__domain_whitelist
@ -46,8 +56,8 @@ msgstr "Servidor de correo"
#. module: mail_outbound_static
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid "Please define a list of domains separate by comma"
msgstr "Por favor defina una lista de dominios separados por coma"
msgid "Not a valid Email From"
msgstr "No es un Email De válido"
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__smtp_from
@ -57,7 +67,7 @@ msgid ""
"replaced with this value. If does match with the domain whitelist then the "
"original message's 'From' will not change"
msgstr ""
"Definalo para usar un dirección de correo 'De' especifica. Si el 'De' del mensaje "
"original no coincide con la lista blanca de dominios entonces este será "
"remplazado con este valor. Si coincide con la lista blanca de dominios entonces "
"el 'De' del mensajee original no cambiará"
"Definalo para usar un dirección de correo 'De' especifica. Si el 'De' del "
"mensaje original no coincide con la lista blanca de dominios entonces este "
"será remplazado con este valor. Si coincide con la lista blanca de dominios "
"entonces el 'De' del mensajee original no cambiará"

View File

@ -20,6 +20,14 @@ msgstr ""
msgid "Display Name"
msgstr ""
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid ""
"%s is not a valid domain. Please define a list of valid domains separated by"
" comma"
msgstr ""
#. module: mail_outbound_static
#: model:ir.model.fields,help:mail_outbound_static.field_ir_mail_server__domain_whitelist
msgid ""
"Allowed Domains list separated by commas. If there is not given SMTP server "
@ -56,7 +64,7 @@ msgstr ""
#. module: mail_outbound_static
#: code:addons/mail_outbound_static/models/ir_mail_server.py:0
#, python-format
msgid "Please define a list of domains separate by comma"
msgid "Not a valid Email From"
msgstr ""
#. module: mail_outbound_static

View File

@ -1,6 +1,7 @@
# Copyright 2017 LasLabs Inc.
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
import re
from email.utils import formataddr, parseaddr
from odoo import _, api, fields, models, tools
@ -28,16 +29,37 @@ class IrMailServer(models.Model):
@api.constrains("domain_whitelist")
def check_valid_domain_whitelist(self):
if self.domain_whitelist:
values = False
try:
values = list(self.domain_whitelist.split(","))
except Exception:
pass
domains = list(self.domain_whitelist.split(","))
for domain in domains:
if not self._is_valid_domain(domain):
raise ValidationError(
_(
"%s is not a valid domain. Please define a list of"
" valid domains separated by comma"
)
% (domain)
)
if not isinstance(values, list):
raise ValidationError(
_("Please define a list of domains separate by comma")
)
@api.constrains("smtp_from")
def check_valid_smtp_from(self):
if self.smtp_from:
match = re.match(
r"^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\."
r"[a-z]{2,4})$",
self.smtp_from,
)
if match is None:
raise ValidationError(_("Not a valid Email From"))
def _is_valid_domain(self, domain_name):
domain_regex = (
r"(([\da-zA-Z])([_\w-]{,62})\.){,127}(([\da-zA-Z])"
r"[_\w-]{,61})?([\da-zA-Z]\.((xn\-\-[a-zA-Z\d]+)|([a-zA-Z\d]{2,})))"
)
domain_regex = "{}$".format(domain_regex)
valid_domain_name_regex = re.compile(domain_regex, re.IGNORECASE)
domain_name = domain_name.lower().strip()
return True if re.match(valid_domain_name_regex, domain_name) else False
@api.model
def _get_domain_whitelist(self, domain_whitelist_string):

View File

@ -4,17 +4,17 @@ being appended into the proper Sender header instead. To accomplish this we:
* Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
it will let us to search the proper mail server to be used to send the messages
where the message 'From' email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.
there is not mail server that matches then will use the default mail server to
send the message.
* Add a Email From field that will let us to email from a specific address taking
into account this conditions:
1) If the sender domain match with the domain whitelist then the original
message's 'From' will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.
mail server is able to send in the name of the sender domain.
2) If the original message's 'From' does not match with the domain whitelist
then the email From is replaced with the Email From field value.

View File

@ -1,2 +0,0 @@
* Add validation of smtp_from field to ensure that is a valid email address
* Add validation of domain_whitelist field to ensure that they are valid domains

View File

@ -374,15 +374,15 @@ being appended into the proper Sender header instead. To accomplish this we:</p>
<ul class="simple">
<li>Add a domain whitelist field in the mail server model. This one represent an
allowed Domains list separated by commas. If there is not given SMTP server
it will let us to search the proper mail server to be used to sent themessages
it will let us to search the proper mail server to be used to send the messages
where the message From email domain match with the domain whitelist. If
there is not mail sever that match then will use the default mail server to
sent the message.</li>
there is not mail server that matches then will use the default mail server to
send the message.</li>
<li>Add a Email From field that will let us to email from a specific address taking
into account this conditions:<ol class="arabic">
<li>If the sender domain match with the domain whitelist then the original
messages From will remain as it is and will not be changed because the
mail server is able to sent in the name of the sender domain.</li>
mail server is able to send in the name of the sender domain.</li>
<li>If the original messages From does not match with the domain whitelist
then the email From is replaced with the Email From field value.</li>
</ol>
@ -395,12 +395,11 @@ server configured in the system.</li>
<div class="contents local topic" id="contents">
<ul class="simple">
<li><a class="reference internal" href="#usage" id="id1">Usage</a></li>
<li><a class="reference internal" href="#known-issues-roadmap" id="id2">Known issues / Roadmap</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id3">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id4">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id5">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id6">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id7">Maintainers</a></li>
<li><a class="reference internal" href="#bug-tracker" id="id2">Bug Tracker</a></li>
<li><a class="reference internal" href="#credits" id="id3">Credits</a><ul>
<li><a class="reference internal" href="#authors" id="id4">Authors</a></li>
<li><a class="reference internal" href="#contributors" id="id5">Contributors</a></li>
<li><a class="reference internal" href="#maintainers" id="id6">Maintainers</a></li>
</ul>
</li>
</ul>
@ -413,15 +412,8 @@ server configured in the system.</li>
<li>Set the <cite>Domain Whitelist</cite> option with the domain whitelist</li>
</ul>
</div>
<div class="section" id="known-issues-roadmap">
<h1><a class="toc-backref" href="#id2">Known issues / Roadmap</a></h1>
<ul class="simple">
<li>Add validation of smtp_from field to ensure that is a valid email address</li>
<li>Add validation of domain_whitelist field to ensure that they are valid domains</li>
</ul>
</div>
<div class="section" id="bug-tracker">
<h1><a class="toc-backref" href="#id3">Bug Tracker</a></h1>
<h1><a class="toc-backref" href="#id2">Bug Tracker</a></h1>
<p>Bugs are tracked on <a class="reference external" href="https://github.com/OCA/social/issues">GitHub Issues</a>.
In case of trouble, please check there if your issue has already been reported.
If you spotted it first, help us smashing it by providing a detailed and welcomed
@ -429,9 +421,9 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
<p>Do not contact contributors directly about support or help with technical issues.</p>
</div>
<div class="section" id="credits">
<h1><a class="toc-backref" href="#id4">Credits</a></h1>
<h1><a class="toc-backref" href="#id3">Credits</a></h1>
<div class="section" id="authors">
<h2><a class="toc-backref" href="#id5">Authors</a></h2>
<h2><a class="toc-backref" href="#id4">Authors</a></h2>
<ul class="simple">
<li>brain-tec AG</li>
<li>LasLabs</li>
@ -439,7 +431,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="contributors">
<h2><a class="toc-backref" href="#id6">Contributors</a></h2>
<h2><a class="toc-backref" href="#id5">Contributors</a></h2>
<ul class="simple">
<li>Frédéric Garbely &lt;<a class="reference external" href="mailto:frederic.garbely&#64;braintec-group.com">frederic.garbely&#64;braintec-group.com</a>&gt;</li>
<li>Dave Lasley &lt;<a class="reference external" href="mailto:dave&#64;laslabs.com">dave&#64;laslabs.com</a>&gt;</li>
@ -450,7 +442,7 @@ If you spotted it first, help us smashing it by providing a detailed and welcome
</ul>
</div>
<div class="section" id="maintainers">
<h2><a class="toc-backref" href="#id7">Maintainers</a></h2>
<h2><a class="toc-backref" href="#id6">Maintainers</a></h2>
<p>This module is maintained by the OCA.</p>
<a class="reference external image-reference" href="https://odoo-community.org"><img alt="Odoo Community Association" src="https://odoo-community.org/logo.png" /></a>
<p>OCA, or the Odoo Community Association, is a nonprofit organization whose

View File

@ -9,6 +9,7 @@ from email import message_from_string
from mock import MagicMock
import odoo.tools as tools
from odoo.exceptions import ValidationError
from odoo.tests.common import TransactionCase
_logger = logging.getLogger(__name__)
@ -118,7 +119,7 @@ class TestIrMailServer(TransactionCase):
message["Return-Path"], '"{}" <{}>'.format(user, self.email_from)
)
def test_1_from_outgoing_server_domainone(self):
def test_01_from_outgoing_server_domainone(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainone.com"
email_from = "Mitchell Admin <admin@%s>" % domain
@ -137,7 +138,7 @@ class TestIrMailServer(TransactionCase):
% (used_mail_server.name, expected_mail_server.name),
)
def test_2_from_outgoing_server_domaintwo(self):
def test_02_from_outgoing_server_domaintwo(self):
self._init_mail_server_domain_whilelist_based()
domain = "domaintwo.com"
email_from = "Mitchell Admin <admin@%s>" % domain
@ -156,7 +157,7 @@ class TestIrMailServer(TransactionCase):
% (used_mail_server.name, expected_mail_server.name),
)
def test_3_from_outgoing_server_another(self):
def test_03_from_outgoing_server_another(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "Mitchell Admin <admin@%s>" % domain
@ -177,7 +178,7 @@ class TestIrMailServer(TransactionCase):
% (used_mail_server.name, expected_mail_server.name),
)
def test_4_from_outgoing_server_none_use_config(self):
def test_04_from_outgoing_server_none_use_config(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "Mitchell Admin <admin@%s>" % domain
@ -203,7 +204,7 @@ class TestIrMailServer(TransactionCase):
used_mail_server, "using this mail server %s" % (used_mail_server.name)
)
def test_5_from_outgoing_server_none_same_domain(self):
def test_05_from_outgoing_server_none_same_domain(self):
self._init_mail_server_domain_whilelist_based()
# Find config values
@ -229,7 +230,7 @@ class TestIrMailServer(TransactionCase):
used_mail_server = self.Model.browse(used_mail_server)
self.assertFalse(used_mail_server)
def test_6_from_outgoing_server_no_name_from(self):
def test_06_from_outgoing_server_no_name_from(self):
self._init_mail_server_domain_whilelist_based()
domain = "example.com"
email_from = "test@%s" % domain
@ -248,7 +249,7 @@ class TestIrMailServer(TransactionCase):
% (used_mail_server.name, expected_mail_server.name),
)
def test_7_from_outgoing_server_multidomain_1(self):
def test_07_from_outgoing_server_multidomain_1(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainthree.com"
email_from = "Mitchell Admin <admin@%s>" % domain
@ -267,7 +268,7 @@ class TestIrMailServer(TransactionCase):
% (used_mail_server.name, expected_mail_server.name),
)
def test_8_from_outgoing_server_multidomain_3(self):
def test_08_from_outgoing_server_multidomain_3(self):
self._init_mail_server_domain_whilelist_based()
domain = "domainmulti.com"
email_from = "test@%s" % domain
@ -285,3 +286,43 @@ class TestIrMailServer(TransactionCase):
"It using %s but we expect to use %s"
% (used_mail_server.name, expected_mail_server.name),
)
def test_09_not_valid_domain_whitelist(self):
self._init_mail_server_domain_whilelist_based()
mail_server = self.mail_server_domainone
mail_server.domain_whitelist = "example.com"
error_msg = (
"%s is not a valid domain. Please define a list of valid"
" domains separated by comma"
)
with self.assertRaisesRegex(ValidationError, error_msg % "asdasd"):
mail_server.domain_whitelist = "asdasd"
with self.assertRaisesRegex(ValidationError, error_msg % "asdasd"):
mail_server.domain_whitelist = "example.com, asdasd"
with self.assertRaisesRegex(ValidationError, error_msg % "invalid"):
mail_server.domain_whitelist = "example.com; invalid"
with self.assertRaisesRegex(ValidationError, error_msg % ";"):
mail_server.domain_whitelist = ";"
with self.assertRaisesRegex(ValidationError, error_msg % "."):
mail_server.domain_whitelist = "hola.com,."
def test_10_not_valid_smtp_from(self):
self._init_mail_server_domain_whilelist_based()
mail_server = self.mail_server_domainone
error_msg = "Not a valid Email From"
with self.assertRaisesRegex(ValidationError, error_msg):
mail_server.smtp_from = "asdasd"
with self.assertRaisesRegex(ValidationError, error_msg):
mail_server.smtp_from = "example.com"
with self.assertRaisesRegex(ValidationError, error_msg):
mail_server.smtp_from = "."
mail_server.smtp_from = "notifications@test.com"

View File

@ -12,7 +12,7 @@
<field name="arch" type="xml">
<xpath expr="//field[@name='smtp_pass']" position="after">
<field name="domain_whitelist"/>
<field name="smtp_from" />
<field name="smtp_from" widget="email"/>
</xpath>
</field>
</record>