diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index af6554f483c..e2833559374 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -21,7 +21,7 @@ import odoo from odoo import http, models, fields, _ from odoo.exceptions import AccessError -from odoo.http import request +from odoo.http import request, SessionExpiredException from odoo.osv import expression from odoo.tools import OrderedSet, escape_psql, html_escape as escape from odoo.addons.http_routing.models.ir_http import slug, slugify, _guess_mimetype @@ -106,7 +106,7 @@ class Website(Home): if homepage_url and homepage_url != '/': try: return request._serve_ir_http() - except (AccessError, NotFound): + except (AccessError, NotFound, SessionExpiredException): pass # Fallback on first accessible menu diff --git a/addons/website/models/ir_http.py b/addons/website/models/ir_http.py index 0d6c38ce26a..5f58ebab4e8 100644 --- a/addons/website/models/ir_http.py +++ b/addons/website/models/ir_http.py @@ -123,6 +123,14 @@ class Http(models.AbstractModel): model=ModelConverter, ) + @classmethod + def _get_public_users(cls): + public_users = super()._get_public_users() + website = request.env(user=SUPERUSER_ID)['website'].get_current_website() # sudo + if website: + public_users.append(website._get_cached('user_id')) + return public_users + @classmethod def _auth_method_public(cls): """ If no user logged, set the public user of current website, or default diff --git a/addons/website/tests/test_page.py b/addons/website/tests/test_page.py index d8a859d516a..e3673cfbabc 100644 --- a/addons/website/tests/test_page.py +++ b/addons/website/tests/test_page.py @@ -407,6 +407,34 @@ class WithContext(HttpCase): self.assertEqual(r.url, home_url_full) self.assertIn(b'o_website_info', r.content) + # Case 6: Check controller redirect which has different `auth` method + website.homepage_url = '/my' + # ------------------------------------------- + # / page exists | first menu | homepage_url + # ------------------------------------------- + # no | /contactus | /my + # ------------------------------------------- + r = self.url_open(home_url) + self.assertEqual(r.status_code, 200) + self.assertNotIn(b' My Portal', r.content) + self.assertIn(b'<title> Contact Us', r.content) + self.assertEqual(r.url, contactus_url_full) + self.assertEqual(r.history[0].status_code, 303) + # Now with /contactus which is a public content + self.env['website.menu'].create({ + 'name': '/my first menu', + 'website_id': website.id, + 'parent_id': website.menu_id.id, + 'url': '/my', + 'sequence': 1, + }) + r = self.url_open(home_url) + self.assertEqual(r.status_code, 200) + self.assertNotIn(b'<title> My Portal', r.content) + self.assertIn(b'<title> Login', r.content) + self.assertIn('/web/login?redirect', r.url) + self.assertEqual(r.history[0].status_code, 303) + def test_07_alternatives(self): website = self.env.ref('website.default_website') lang_fr = self.env['res.lang']._activate_lang('fr_FR') diff --git a/odoo/addons/base/models/ir_http.py b/odoo/addons/base/models/ir_http.py index 54f422bca32..d8f21acff7b 100644 --- a/odoo/addons/base/models/ir_http.py +++ b/odoo/addons/base/models/ir_http.py @@ -91,9 +91,13 @@ class IrHttp(models.AbstractModel): rule, args = cls.routing_map().bind_to_environ(request.httprequest.environ).match(path_info=path_info, return_rule=True) return rule, args + @classmethod + def _get_public_users(cls): + return [request.env.ref('base.public_user').id] + @classmethod def _auth_method_user(cls): - if request.env.uid is None: + if request.env.uid in [None] + cls._get_public_users(): raise http.SessionExpiredException("Session expired") @classmethod