diff -U 3 -dHrN -- a/trytond/protocols/wrappers.py b/trytond/protocols/wrappers.py --- a/trytond/protocols/wrappers.py 2019-08-11 19:34:43.000000000 +0200 +++ b/trytond/protocols/wrappers.py 2021-07-27 15:59:38.213817153 +0200 @@ -8,7 +8,6 @@ from werkzeug.wrappers import Request as _Request, Response from werkzeug.utils import cached_property -from werkzeug.http import wsgi_to_bytes, bytes_to_wsgi from werkzeug.datastructures import Authorization from werkzeug.exceptions import abort, HTTPException @@ -84,7 +83,8 @@ def parse_authorization_header(value): if not value: return - value = wsgi_to_bytes(value) + if not isinstance(value, bytes): + value = value.encode('latin1') try: auth_type, auth_info = value.split(None, 1) auth_type = auth_type.lower() @@ -98,9 +98,9 @@ except Exception: return return Authorization('session', { - 'username': bytes_to_wsgi(username), + 'username': username.decode("latin1"), 'userid': userid, - 'session': bytes_to_wsgi(session), + 'session': session.decode("latin1"), }) @@ -171,16 +171,17 @@ pool = Pool() UserApplication = pool.get('res.user.application') - authorization = wsgi_to_bytes(request.headers['Authorization']) + authorization = request.headers['Authorization'] try: auth_type, auth_info = authorization.split(None, 1) auth_type = auth_type.lower() except ValueError: abort(401) - if auth_type != b'bearer': + if auth_type != 'bearer': abort(403) - application = UserApplication.check(bytes_to_wsgi(auth_info), name) + application = UserApplication.check(auth_info, name) + if not application: abort(403) transaction = Transaction()