From 4612f6a7eeb5815cffc2e7dd36abb4846b79a14e Mon Sep 17 00:00:00 2001 From: nda Date: Tue, 14 Nov 2023 13:43:36 +0000 Subject: [PATCH] [FIX] auth_signup, website: make reset password multi website friendly The "reset password" feature does not take into account multi-website. steps to reproduce: - create a website A - uncheck 'Shared Customer Accounts' on website A - create a portal user user@example.com on website A - create a website B - uncheck 'Shared Customer Accounts' on website B - create a portal user user@example.com on website B - reset password for user@example.com on any website before this commit: An error is raised "No account found for this login" (which is false, actually 2 accounts are found) after this commit: Only the user linked to the current website is properly selected opw-3551540 closes odoo/odoo#142110 X-original-commit: a2196253d6cf90dca3042a777703e0679f74f542 Signed-off-by: Romain Derie (rde) --- addons/auth_signup/i18n/auth_signup.pot | 6 +++++ addons/auth_signup/models/res_users.py | 8 ++++--- addons/website/models/res_users.py | 5 ++++ .../tests/test_website_reset_password.py | 23 +++++++++++++++++++ odoo/addons/base/models/res_users.py | 4 ++++ 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/addons/auth_signup/i18n/auth_signup.pot b/addons/auth_signup/i18n/auth_signup.pot index 58495cb741e..0fd1215471e 100644 --- a/addons/auth_signup/i18n/auth_signup.pot +++ b/addons/auth_signup/i18n/auth_signup.pot @@ -488,6 +488,12 @@ msgstr "" msgid "Marc Demo" msgstr "" +#. module: auth_signup +#: code:addons/auth_signup/models/res_users.py:0 +#, python-format +msgid "Multiple accounts found for this login" +msgstr "" + #. module: auth_signup #. odoo-python #: code:addons/auth_signup/models/res_users.py:0 diff --git a/addons/auth_signup/models/res_users.py b/addons/auth_signup/models/res_users.py index fab61db18de..7d418187ee4 100644 --- a/addons/auth_signup/models/res_users.py +++ b/addons/auth_signup/models/res_users.py @@ -166,11 +166,13 @@ class ResUsers(models.Model): """ retrieve the user corresponding to login (login or email), and reset their password """ - users = self.search([('login', '=', login)]) + users = self.search(self._get_login_domain(login)) + if not users: + users = self.search(self._get_email_domain(login)) if not users: - users = self.search([('email', '=', login)]) - if len(users) != 1: raise Exception(_('No account found for this login')) + if len(users) > 1: + raise Exception(_('Multiple accounts found for this login')) return users.action_reset_password() def action_reset_password(self): diff --git a/addons/website/models/res_users.py b/addons/website/models/res_users.py index f6ab17e03fe..d108ad03b2c 100644 --- a/addons/website/models/res_users.py +++ b/addons/website/models/res_users.py @@ -41,6 +41,11 @@ class ResUsers(models.Model): website = self.env['website'].get_current_website() return super(ResUsers, self)._get_login_domain(login) + website.website_domain() + @api.model + def _get_email_domain(self, email): + website = self.env['website'].get_current_website() + return super()._get_email_domain(email) + website.website_domain() + @api.model def _get_login_order(self): return 'website_id, ' + super(ResUsers, self)._get_login_order() diff --git a/addons/website/tests/test_website_reset_password.py b/addons/website/tests/test_website_reset_password.py index b104871643c..d6e1269c8e5 100644 --- a/addons/website/tests/test_website_reset_password.py +++ b/addons/website/tests/test_website_reset_password.py @@ -75,3 +75,26 @@ class TestWebsiteResetPassword(HttpCase): # The most specific user should be selected self.authenticate("bobo@mail.com", "bobo@mail.com") self.assertEqual(self.session["uid"], user2.id) + + def test_multi_website_reset_password_user_specific_user_account(self): + # Create same user on different websites with 'Specific User Account' + # option enabled and then reset password. Only the user from the + # current website should be reset. + website_1, website_2 = self.env['website'].create([ + {'name': 'Website 1', 'specific_user_account': True}, + {'name': 'Website 2', 'specific_user_account': True}, + ]) + + login = 'user@example.com' # same login for both users + user_website_1, user_website_2 = self.env['res.users'].with_context(no_reset_password=True).create([ + {'website_id': website_1.id, 'login': login, 'email': login, 'name': login}, + {'website_id': website_2.id, 'login': login, 'email': login, 'name': login}, + ]) + + self.assertFalse(user_website_1.signup_valid) + self.assertFalse(user_website_2.signup_valid) + + self.env['res.users'].with_context(website_id=website_1.id).reset_password(login) + + self.assertTrue(user_website_1.signup_valid) + self.assertFalse(user_website_2.signup_valid) diff --git a/odoo/addons/base/models/res_users.py b/odoo/addons/base/models/res_users.py index 2308c5f1087..66db1662a05 100644 --- a/odoo/addons/base/models/res_users.py +++ b/odoo/addons/base/models/res_users.py @@ -767,6 +767,10 @@ class Users(models.Model): def _get_login_domain(self, login): return [('login', '=', login)] + @api.model + def _get_email_domain(self, email): + return [('email', '=', email)] + @api.model def _get_login_order(self): return self._order