summaryrefslogtreecommitdiff
path: root/addons/website/static/src/js
diff options
context:
space:
mode:
authorRomain Derie <rde@odoo.com>2021-04-16 15:21:33 +0000
committerRomain Derie <rde@odoo.com>2021-05-03 16:16:12 +0000
commit0490828de135406675b8c6949cf31cdccd697b02 (patch)
tree6d049da8da93ba29ff0dd776a97e1318aa394bdd /addons/website/static/src/js
parent3470a3c94e06d92afcd8a8129f80e4dfea14efe4 (diff)
[FIX] http_routing, website: prevent crash when using `fw` in url
Before this commit, the routing map generated and used would be the one from the website the request is performed, instead of the one from the `fw` website ID which will be the one we redirect the user to. This issue was introduced with the routing map by website, be8fc2296b38 and is restricted to a single case: a publisher using the website switcher, and it won't happen on next page naviguation/refresh as the `fw` website id will be the same as the current website's ID. Thus there won't be any routing map mismatch. Step to reproduce: - Create a page on website 2, set it as homepage - Naviguate to website 1 on '/' url - Naviguate to website 2 on '/' url This will raise a werkzeug error about `EndPoint not iterable`. ----- Technical analysis ------ This is the current flow: 1. `_dispatch()` is setting `website_routing` to `get_current_website()` -> 2 2. `_dispatch()` is calling `_match()` 3. `_match()` is calling `routing_map()` with key = `website_routing`, which was set to 2 in step 1. 4. `routing_map()` is calling `_generate_routing_rules()` which generate the rules based on `website_routing`, which was set to 2 in step 1. 5. `_dispatch()` authenticate the user by calling `_authenticate()` 6. `_dispatch()` is calling `_add_dispatch_parameter()`, where URL param `fw` is forced in session, so `get_current_website()` now return the correct `website_id` -> 1 The issue: in order to handle the `fw` URL parameter (step 6.), we need to check the rights to ensure we can allow the website switch. To check rights, user need to be authenticated (step 5.), which is done after generating the routing map (2. & 3. & 4.). The routing map is generated based on the current website (step 1.) Step 6 depends of steps 5 which depends of steps 2/3/4 which depend of step 1, but step 1 should depend of step 6, which is an impossible cycle. closes odoo/odoo#70278 X-original-commit: 878e28f93a65756fa2002ef2af5b02a3e2c59b1b Signed-off-by: Jérémy Kersten (jke) <jke@openerp.com> Signed-off-by: Romain Derie <rdeodoo@users.noreply.github.com>
Diffstat (limited to 'addons/website/static/src/js')
-rw-r--r--addons/website/static/src/js/backend/dashboard.js2
-rw-r--r--addons/website/static/src/js/content/website_root.js8
2 files changed, 5 insertions, 5 deletions
diff --git a/addons/website/static/src/js/backend/dashboard.js b/addons/website/static/src/js/backend/dashboard.js
index d9daa81b45a..b705067543c 100644
--- a/addons/website/static/src/js/backend/dashboard.js
+++ b/addons/website/static/src/js/backend/dashboard.js
@@ -137,7 +137,7 @@ var Dashboard = AbstractAction.extend({
on_go_to_website: function (ev) {
ev.preventDefault();
var website = _.findWhere(this.websites, {selected: true});
- window.location.href = $.param.querystring(website.domain + '/', {'fw': website.id});
+ window.location.href = `/website/force/${website.id}`;
},
on_save_ga_client_id: function(ga_client_id, ga_analytics_key) {
diff --git a/addons/website/static/src/js/content/website_root.js b/addons/website/static/src/js/content/website_root.js
index 5d52902272c..c2844a49176 100644
--- a/addons/website/static/src/js/content/website_root.js
+++ b/addons/website/static/src/js/content/website_root.js
@@ -313,12 +313,12 @@ var WebsiteRoot = publicRootData.PublicRoot.extend(KeyboardNavigationMixin, {
_onWebsiteSwitch: function (ev) {
var websiteId = ev.currentTarget.getAttribute('website-id');
var websiteDomain = ev.currentTarget.getAttribute('domain');
- var url = window.location.href;
+ let url = `/website/force/${websiteId}`;
if (websiteDomain && window.location.hostname !== websiteDomain) {
- var path = window.location.pathname + window.location.search + window.location.hash;
- url = websiteDomain + path;
+ url = websiteDomain + url;
}
- window.location.href = $.param.querystring(url, {'fw': websiteId});
+ const path = window.location.pathname + window.location.search + window.location.hash;
+ window.location.href = $.param.querystring(url, {'path': path});
},
/**
* @private