From eae1a0a7abd09afbf390af8d4e92f68878c84ef4 Mon Sep 17 00:00:00 2001 From: std-odoo Date: Thu, 16 Mar 2023 09:00:38 +0000 Subject: [PATCH] [FIX] mass_mailing: the blank.gif image in the emails always raise a 500 error Bug === Since 6185f14807bf527652cd928bf040fd7c596f77ca we check the existence before marking the as opened, but since 57ae1b9b8b61f5f4719a8a81e9d0d21fab58cfda we remove the automatically when we send them. The result is that this endpoint always raise a 500 error. To be: the existence shouldn't be checked in this endpoint (the token is valid for the raw integer id). Task-3234519 closes odoo/odoo#115842 Signed-off-by: Thibault Delavallee (tde) --- addons/mass_mailing/controllers/main.py | 4 ++-- addons/mass_mailing/models/mail_mail.py | 8 ++++---- addons/mass_mailing/tests/test_mailing_controllers.py | 11 +++++++---- 3 files changed, 13 insertions(+), 10 deletions(-) diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index 8bf401dc245..dbf721d45cc 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -118,8 +118,8 @@ class MassMailController(http.Controller): @http.route('/mail/track///blank.gif', type='http', auth='public') def track_mail_open(self, mail_id, token, **post): """ Email tracking. """ - mail = request.env['mail.mail'].sudo().browse(mail_id).exists() - if not mail or not consteq(token, mail._generate_mail_recipient_token()): + expected_token = request.env['mail.mail']._generate_mail_recipient_token(mail_id) + if not consteq(token, expected_token): raise BadRequest() request.env['mailing.trace'].sudo().set_opened(domain=[('mail_mail_id_int', 'in', [mail_id])]) diff --git a/addons/mass_mailing/models/mail_mail.py b/addons/mass_mailing/models/mail_mail.py index 7d5a6e3d28f..5505cd1b451 100644 --- a/addons/mass_mailing/models/mail_mail.py +++ b/addons/mass_mailing/models/mail_mail.py @@ -25,15 +25,15 @@ class MailMail(models.Model): return mails def _get_tracking_url(self): - token = self._generate_mail_recipient_token() + token = self._generate_mail_recipient_token(self.id) return werkzeug.urls.url_join( self.get_base_url(), f'mail/track/{self.id}/{token}/blank.gif' ) - def _generate_mail_recipient_token(self): - self.ensure_one() - return tools.hmac(self.env(su=True), 'mass_mailing-mail_mail-open', self.id) + @api.model + def _generate_mail_recipient_token(self, mail_id): + return tools.hmac(self.env(su=True), 'mass_mailing-mail_mail-open', mail_id) def _prepare_outgoing_body(self): """ Override to add the tracking URL to the body and to add trace ID in diff --git a/addons/mass_mailing/tests/test_mailing_controllers.py b/addons/mass_mailing/tests/test_mailing_controllers.py index de181ba070d..14000b65947 100644 --- a/addons/mass_mailing/tests/test_mailing_controllers.py +++ b/addons/mass_mailing/tests/test_mailing_controllers.py @@ -73,22 +73,25 @@ class TestMailingControllers(MassMailCommon, HttpCase): mailing.action_send_mail() mail = self._find_mail_mail_wrecord(self.test_contact) + mail_id_int = mail.id + mail_tracking_url = mail._get_tracking_url() mailing_trace = mail.mailing_trace_ids self.assertEqual(mail.state, 'sent') self.assertEqual(len(mailing_trace), 1) self.assertFalse(mailing_trace.open_datetime) self.assertEqual(mailing_trace.trace_status, 'sent') + mail.unlink() # the mail might be removed during the email sending + self.env.flush_all() with freeze_time(self._reference_now): - response = self.url_open(mail._get_tracking_url()) + response = self.url_open(mail_tracking_url) self.assertEqual(response.status_code, 200) - self.assertEqual(mail.state, 'sent') self.assertEqual(mailing_trace.open_datetime, self._reference_now) self.assertEqual(mailing_trace.trace_status, 'open') track_url = werkzeug.urls.url_join( - mail.get_base_url(), - 'mail/track/%s/fake_token/blank.gif' % mail.id + mailing.get_base_url(), + f'mail/track/{mail_id_int}/fake_token/blank.gif' ) response = self.url_open(track_url) self.assertEqual(response.status_code, 400)