From fb9efde4f3ac42e0eb00a1af148b682dd56fc072 Mon Sep 17 00:00:00 2001 From: Benoit Socias Date: Mon, 6 Feb 2023 13:25:13 +0000 Subject: [PATCH] [FIX] *: replace werkzeug's Response by odoo's Response *: base, http_routing, mass_mailing, web, web_editor, website_slides In some situations `werkzeug.wrappers.Response` are used instead of `odoo.http.Reponse` that extends it. This is a problem because since [1] the calls to `set_cookie` expect it to accept the `cookie_type` parameter, which is not the case in the base werkzeug implementation. This commit replaces the `werkzeug.wrappers.Response` by `odoo.http.Response`. [1]: https://github.com/odoo/odoo/commit/2cbda6c98ee947cea1d06c09880eee8c758304a8 closes odoo/odoo#112827 X-original-commit: 28da08292b7028575e628c5ad846fc05d30498f2 Signed-off-by: Julien Castiaux (juc) --- addons/http_routing/models/ir_http.py | 4 ++-- addons/mass_mailing/controllers/main.py | 4 ++-- addons/web/controllers/binary.py | 12 +++++++++--- addons/web/controllers/database.py | 9 ++------- addons/web/controllers/report.py | 4 ---- addons/web_editor/controllers/main.py | 5 ++--- addons/website_slides/controllers/main.py | 4 ++-- odoo/addons/base/controllers/rpc.py | 3 +-- odoo/http.py | 1 + 9 files changed, 21 insertions(+), 25 deletions(-) diff --git a/addons/http_routing/models/ir_http.py b/addons/http_routing/models/ir_http.py index c2b8c92197f..a4d95e48274 100644 --- a/addons/http_routing/models/ir_http.py +++ b/addons/http_routing/models/ir_http.py @@ -23,7 +23,7 @@ from odoo import api, models, exceptions, tools, http from odoo.addons.base.models import ir_http from odoo.addons.base.models.ir_http import RequestUID from odoo.addons.base.models.ir_qweb import QWebException -from odoo.http import request +from odoo.http import request, Response from odoo.osv import expression from odoo.tools import config, ustr, pycompat @@ -656,7 +656,7 @@ class IrHttp(models.AbstractModel): except Exception: code, html = 418, request.env['ir.ui.view']._render_template('http_routing.http_error', values) - response = werkzeug.wrappers.Response(html, status=code, content_type='text/html;charset=utf-8') + response = Response(html, status=code, content_type='text/html;charset=utf-8') cls._post_dispatch(response) return response diff --git a/addons/mass_mailing/controllers/main.py b/addons/mass_mailing/controllers/main.py index afcd83d254d..8bf401dc245 100644 --- a/addons/mass_mailing/controllers/main.py +++ b/addons/mass_mailing/controllers/main.py @@ -5,7 +5,7 @@ import base64 import werkzeug from odoo import _, exceptions, http, tools -from odoo.http import request +from odoo.http import request, Response from odoo.tools import consteq from markupsafe import Markup, escape @@ -123,7 +123,7 @@ class MassMailController(http.Controller): raise BadRequest() request.env['mailing.trace'].sudo().set_opened(domain=[('mail_mail_id_int', 'in', [mail_id])]) - response = werkzeug.wrappers.Response() + response = Response() response.mimetype = 'image/gif' response.data = base64.b64decode(b'R0lGODlhAQABAIAAANvf7wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==') diff --git a/addons/web/controllers/binary.py b/addons/web/controllers/binary.py index 768da11a543..0a73b173001 100644 --- a/addons/web/controllers/binary.py +++ b/addons/web/controllers/binary.py @@ -17,7 +17,7 @@ import odoo import odoo.modules.registry from odoo import http, _ from odoo.exceptions import AccessError, UserError -from odoo.http import request +from odoo.http import request, Response from odoo.modules import get_resource_path from odoo.tools import file_open, file_path, replace_exceptions from odoo.tools.mimetypes import guess_mimetype @@ -241,8 +241,14 @@ class Binary(http.Controller): imgext = '.' + mimetype.split('/')[1] if imgext == '.svg+xml': imgext = '.svg' - response = send_file(image_data, request.httprequest.environ, - download_name=imgname + imgext, mimetype=mimetype, last_modified=row[1]) + response = send_file( + image_data, + request.httprequest.environ, + download_name=imgname + imgext, + mimetype=mimetype, + last_modified=row[1], + response_class=Response, + ) else: response = http.Stream.from_path(placeholder('nologo.png')).get_response() except Exception: diff --git a/addons/web/controllers/database.py b/addons/web/controllers/database.py index fd99cd198b5..f797a4663f1 100644 --- a/addons/web/controllers/database.py +++ b/addons/web/controllers/database.py @@ -6,17 +6,12 @@ import os import re import tempfile -import werkzeug -import werkzeug.exceptions -import werkzeug.utils -import werkzeug.wrappers -import werkzeug.wsgi from lxml import html import odoo import odoo.modules.registry from odoo import http -from odoo.http import content_disposition, dispatch_rpc, request +from odoo.http import content_disposition, dispatch_rpc, request, Response from odoo.service import db from odoo.tools.misc import file_open, str2bool from odoo.tools.translate import _ @@ -138,7 +133,7 @@ class Database(http.Controller): ('Content-Disposition', content_disposition(filename)), ] dump_stream = odoo.service.db.dump_db(name, None, backup_format) - response = werkzeug.wrappers.Response(dump_stream, headers=headers, direct_passthrough=True) + response = Response(dump_stream, headers=headers, direct_passthrough=True) return response except Exception as e: _logger.exception('Database.backup') diff --git a/addons/web/controllers/report.py b/addons/web/controllers/report.py index a51384a910d..c24155aaca9 100644 --- a/addons/web/controllers/report.py +++ b/addons/web/controllers/report.py @@ -3,11 +3,7 @@ import json import logging -import werkzeug import werkzeug.exceptions -import werkzeug.utils -import werkzeug.wrappers -import werkzeug.wsgi from werkzeug.urls import url_parse from odoo import http diff --git a/addons/web_editor/controllers/main.py b/addons/web_editor/controllers/main.py index f96a7c49257..ce1b1417c99 100644 --- a/addons/web_editor/controllers/main.py +++ b/addons/web_editor/controllers/main.py @@ -9,13 +9,12 @@ import requests import uuid import werkzeug.exceptions import werkzeug.urls -import werkzeug.wrappers from PIL import Image, ImageFont, ImageDraw from lxml import etree from base64 import b64decode, b64encode from datetime import datetime -from odoo.http import request +from odoo.http import request, Response from odoo import http, tools, _, SUPERUSER_ID from odoo.addons.http_routing.models.ir_http import slug, unslug from odoo.addons.web_editor.tools import get_video_url_data @@ -140,7 +139,7 @@ class Web_Editor(http.Controller): # output image output = io.BytesIO() outimage.save(output, format="PNG") - response = werkzeug.wrappers.Response() + response = Response() response.mimetype = 'image/png' response.data = output.getvalue() response.headers['Cache-Control'] = 'public, max-age=604800' diff --git a/addons/website_slides/controllers/main.py b/addons/website_slides/controllers/main.py index 3739bfa6961..3f7c3c53807 100644 --- a/addons/website_slides/controllers/main.py +++ b/addons/website_slides/controllers/main.py @@ -15,7 +15,7 @@ from odoo.addons.website.controllers.main import QueryURL from odoo.addons.website.models.ir_http import sitemap_qs2dom from odoo.addons.website_profile.controllers.main import WebsiteProfile from odoo.exceptions import AccessError, ValidationError, UserError, MissingError -from odoo.http import request +from odoo.http import request, Response from odoo.osv import expression from odoo.tools import email_split @@ -801,7 +801,7 @@ class WebsiteSlides(WebsiteProfile): @http.route('''/slides/slide//pdf_content''', type='http', auth="public", website=True, sitemap=False) def slide_get_pdf_content(self, slide): - response = werkzeug.wrappers.Response() + response = Response() response.data = slide.binary_content and base64.b64decode(slide.binary_content) or b'' response.mimetype = 'application/pdf' return response diff --git a/odoo/addons/base/controllers/rpc.py b/odoo/addons/base/controllers/rpc.py index e18b8acc421..4569e8fdd20 100644 --- a/odoo/addons/base/controllers/rpc.py +++ b/odoo/addons/base/controllers/rpc.py @@ -5,10 +5,9 @@ import xmlrpc.client from datetime import date, datetime from markupsafe import Markup -from werkzeug.wrappers import Response import odoo -from odoo.http import Controller, route, dispatch_rpc, request +from odoo.http import Controller, route, dispatch_rpc, request, Response from odoo.fields import Date, Datetime, Command from odoo.tools import lazy, ustr from odoo.tools.misc import frozendict diff --git a/odoo/http.py b/odoo/http.py index 7226ef0afc9..39084570dbf 100644 --- a/odoo/http.py +++ b/odoo/http.py @@ -410,6 +410,7 @@ def send_file(filepath_or_fp, mimetype=None, as_attachment=False, filename=None, last_modified=mtime, etag=add_etags, max_age=cache_timeout, + response_class=Response, conditional=conditional )