diff --git a/auth_oauth_autologin/__manifest__.py b/auth_oauth_autologin/__manifest__.py index aefba6dc31..e9d13d4cd8 100644 --- a/auth_oauth_autologin/__manifest__.py +++ b/auth_oauth_autologin/__manifest__.py @@ -13,5 +13,4 @@ "depends": ["auth_oauth"], "data": ["views/auth_oauth_provider.xml"], "demo": [], - "assets": {"web.assets_frontend": ["auth_oauth_autologin/static/src/js/*.js"]}, } diff --git a/auth_oauth_autologin/controllers/main.py b/auth_oauth_autologin/controllers/main.py index 2bc8aafa61..349840eb85 100644 --- a/auth_oauth_autologin/controllers/main.py +++ b/auth_oauth_autologin/controllers/main.py @@ -10,8 +10,8 @@ class OAuthAutoLogin(OAuthLogin): - def _autologin_disabled(self, redirect): - url = urlparse(redirect) + def _autologin_disabled(self, request_url): + url = urlparse(request_url) params = dict(parse_qsl(url.query, keep_blank_values=True)) return "no_autologin" in params or "oauth_error" in params or "error" in params @@ -20,15 +20,13 @@ def _autologin_link(self): if len(providers) == 1: return providers[0].get("auth_link") - @http.route( - "/auth/auto_login_redirect_link", - type="json", - auth="none", - ) - def auto_login_redirect_link(self, *args, **kwargs): - redirect = kwargs.get("redirect") - if self._autologin_disabled(redirect): - return False - request.params["redirect"] = redirect - auth_link = self._autologin_link() - return auth_link + @http.route("/web/login", type="http", auth="none") + def web_login(self, *args, **kw): + if not request.session.uid: + request_url = request.httprequest.url + if not self._autologin_disabled(request_url): + auth_link = self._autologin_link() + if auth_link: + return request.redirect(auth_link, local=False) + + return super().web_login(*args, **kw) diff --git a/auth_oauth_autologin/static/src/js/web_login.esm.js b/auth_oauth_autologin/static/src/js/web_login.esm.js deleted file mode 100644 index e58bc5298a..0000000000 --- a/auth_oauth_autologin/static/src/js/web_login.esm.js +++ /dev/null @@ -1,26 +0,0 @@ -/** @odoo-module **/ - -import publicWidget from "@web/legacy/js/public/public_widget"; - -publicWidget.registry.login.include({ - selector: ".oe_login_form", - init() { - this._super(...arguments); - this._rpc = this.bindService("rpc"); - }, - - start: async function () { - const def = this._super.apply(this, arguments); - let url = window.location.href; - if (url.includes("/web/login")) { - url = url.replace("/web/login", "/web"); - } - this._result = await this._rpc("/auth/auto_login_redirect_link", { - redirect: url, - }); - if (this._result) { - window.location = this._result; - } - return def; - }, -}); diff --git a/auth_oauth_autologin/tests/__init__.py b/auth_oauth_autologin/tests/__init__.py new file mode 100644 index 0000000000..0f7752b96b --- /dev/null +++ b/auth_oauth_autologin/tests/__init__.py @@ -0,0 +1 @@ +from . import test_oauth_auto_login diff --git a/auth_oauth_autologin/tests/test_oauth_auto_login.py b/auth_oauth_autologin/tests/test_oauth_auto_login.py new file mode 100644 index 0000000000..9fda36bf7d --- /dev/null +++ b/auth_oauth_autologin/tests/test_oauth_auto_login.py @@ -0,0 +1,129 @@ +# Copyright 2021 ACSONE SA/NV +# License: AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) + +from unittest.mock import Mock, patch + +from odoo.http import Response +from odoo.tests import common + +from odoo.addons.website.tools import MockRequest + +from ..controllers.main import OAuthAutoLogin + +LOGIN_URL = "http://localhost/web/login" + + +class TestOauthAutoLogin(common.HttpCase): + def mock_redirect(self, logout_url, local): + self.redirect_url = logout_url + self.is_local_direct = local + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_already_logged_in(self, mock_web_login): + """Test that auto login is skipped if user is logged in""" + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + with MockRequest(self.env) as request: + request.session = mock_session + self.assertEqual(response, OAuthAutoLogin().web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_no_autologin_parameter_exists(self, mock_web_login): + """Test that auto login is skipped if no_autologin parameter exists""" + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + with MockRequest(self.env) as request: + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + "?no_autologin" + self.assertEqual(response, OAuthAutoLogin().web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_oauth_error_parameter_exists(self, mock_web_login): + """Test that auto login is skipped if oauth_error parameter exists""" + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + with MockRequest(self.env) as request: + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + "?oauth_error=1" + self.assertEqual(response, OAuthAutoLogin().web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_error_parameter_exists(self, mock_web_login): + """Test that auto login is skipped if error parameter exists""" + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + with MockRequest(self.env) as request: + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + "?error=test" + self.assertEqual(response, OAuthAutoLogin().web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_no_provider_has_autologin_set(self, mock_web_login): + """Test that auto login is skipped if error parameter exists""" + instance = OAuthAutoLogin() + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + provider = {} + provider["autologin"] = False + provider["auth_link"] = "https://keycloak.test" + providers = [provider] + with MockRequest(self.env) as request, patch.object( + instance, "list_providers", return_value=providers + ): + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + self.assertEqual(response, instance.web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_skip_auto_login_if_the_provider_has_no_auth_link(self, mock_web_login): + """Test that auto login is skipped if error parameter exists""" + instance = OAuthAutoLogin() + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + provider = {} + provider["autologin"] = True + providers = [provider] + with MockRequest(self.env) as request, patch.object( + instance, "list_providers", return_value=providers + ): + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + self.assertEqual(response, instance.web_login()) + + @patch("odoo.addons.auth_oauth.controllers.main.OAuthLogin.web_login") + def test_oauth_auto_login_with_enabled_provider(self, mock_web_login): + """Test that auto login works if enabled""" + instance = OAuthAutoLogin() + mock_session = Mock() + response = Response() + mock_web_login.return_value = response + provider_1 = {} + provider_1["autologin"] = False + provider_1["auth_link"] = "https://keycloak1.test" + auth_link_2 = "https://keycloak2.test" + provider_2 = {} + provider_2["autologin"] = True + provider_2["auth_link"] = auth_link_2 + providers = [provider_1, provider_2] + with MockRequest(self.env) as request, patch.object( + instance, "list_providers", return_value=providers + ): + request.session = mock_session + mock_session.uid = False + request.httprequest.url = LOGIN_URL + request.redirect = self.mock_redirect + instance.web_login() + self.assertEqual(auth_link_2, self.redirect_url) + self.assertFalse(self.is_local_direct) + self.assertFalse(mock_web_login.called) diff --git a/auth_oauth_autologin/views/assets.xml b/auth_oauth_autologin/views/assets.xml deleted file mode 100644 index 5cbe87c2c9..0000000000 --- a/auth_oauth_autologin/views/assets.xml +++ /dev/null @@ -1,15 +0,0 @@ - - -