10 changed files with 256 additions and 119 deletions
			
			
		@ -0,0 +1,46 @@ | 
				
			|||||
 | 
					.. image:: https://img.shields.io/badge/license-AGPL--3-blue.svg | 
				
			||||
 | 
					    :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html | 
				
			||||
 | 
					    :alt: License: AGPL-3 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Password Reset Manager | 
				
			||||
 | 
					====================== | 
				
			||||
 | 
					This module helps users to reset and change their password. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Configuration | 
				
			||||
 | 
					============= | 
				
			||||
 | 
					* No additional configurations needed | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Company | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* `Cybrosys Techno Solutions <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					License | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					General Public License, Version 3 (AGPL v3). | 
				
			||||
 | 
					(http://www.gnu.org/licenses/agpl-3.0-standalone.html) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Credits | 
				
			||||
 | 
					------- | 
				
			||||
 | 
					* Developers: 	Version 16: Vishnu V | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Contacts | 
				
			||||
 | 
					-------- | 
				
			||||
 | 
					* Mail Contact : odoo@cybrosys.com | 
				
			||||
 | 
					* Website : https://cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Bug Tracker | 
				
			||||
 | 
					----------- | 
				
			||||
 | 
					Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Maintainer | 
				
			||||
 | 
					========== | 
				
			||||
 | 
					.. image:: https://cybrosys.com/images/logo.png | 
				
			||||
 | 
					   :target: https://cybrosys.com | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					This module is maintained by Cybrosys Technologies. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					For support and more information, please visit `Our Website <https://cybrosys.com/>`__ | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					Further information | 
				
			||||
 | 
					=================== | 
				
			||||
 | 
					HTML Description: `<static/description/index.html>`__ | 
				
			||||
@ -0,0 +1,104 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU LESSER | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU LESSER GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import odoo | 
				
			||||
 | 
					from odoo import http, _ | 
				
			||||
 | 
					from odoo.exceptions import UserError | 
				
			||||
 | 
					from odoo.http import request, dispatch_rpc | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from odoo.addons.auth_signup.controllers.main import AuthSignupHome | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class AuthSignupHomeInherit(AuthSignupHome): | 
				
			||||
 | 
					    @http.route('/web/forgot_password', type='http', auth='public', | 
				
			||||
 | 
					                website=True, sitemap=False, csrf=False) | 
				
			||||
 | 
					    def forgot_password(self): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Handle the "Forgot Password" functionality. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :return: A response containing the "forgot_password" template with the | 
				
			||||
 | 
					         context data. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        qcontext = self.get_auth_signup_qcontext() | 
				
			||||
 | 
					        response = request.render('password_reset_manager.forgot_password', | 
				
			||||
 | 
					                                  qcontext) | 
				
			||||
 | 
					        return response | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route('/web/reset_password/direct', type='http', auth='public', | 
				
			||||
 | 
					                website=True, sitemap=False, csrf=False, ) | 
				
			||||
 | 
					    def web_auth_reset_password_direct(self): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Handle the direct reset password functionality for web authentication. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :return: A response containing the "reset_password_direct" template | 
				
			||||
 | 
					         with the context data. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        qcontext = self.get_auth_signup_qcontext() | 
				
			||||
 | 
					        response = request.render( | 
				
			||||
 | 
					            'password_reset_manager.reset_password_direct', qcontext) | 
				
			||||
 | 
					        return response | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					    @http.route('/web/reset_password/submit', type='http', | 
				
			||||
 | 
					                methods=['POST'], auth="public", website=True, csrf=False) | 
				
			||||
 | 
					    def change_password(self, **kw): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Handle the password change functionality for a user. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :param kw: Keyword arguments received from the request. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :return: A redirect to the login page with a success message or an | 
				
			||||
 | 
					         error message. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        values = {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        # Check if the new password and confirm new password match. | 
				
			||||
 | 
					        if kw['confirm_new_password'] == kw['new_password']: | 
				
			||||
 | 
					            try: | 
				
			||||
 | 
					                # Authenticate the user session with the provided old password | 
				
			||||
 | 
					                uid = request.session.authenticate(request.session.db, | 
				
			||||
 | 
					                                                   kw['user_name'], | 
				
			||||
 | 
					                                                   kw['old_password']) | 
				
			||||
 | 
					                user = request.env['res.users'].search([('id', '=', uid)]) | 
				
			||||
 | 
					                is_user_public = request.env.user.has_group( | 
				
			||||
 | 
					                    'base.group_public') | 
				
			||||
 | 
					                if not is_user_public: | 
				
			||||
 | 
					                    # Update the user's password with the new password. | 
				
			||||
 | 
					                    user.sudo().write({ | 
				
			||||
 | 
					                        'password':  kw['confirm_new_password'] | 
				
			||||
 | 
					                    }) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					                    # Redirect to the login page with a success message. | 
				
			||||
 | 
					                    return request.redirect('/web/login?message=%s' | 
				
			||||
 | 
					                                            % _('Password Changed')) | 
				
			||||
 | 
					                else: | 
				
			||||
 | 
					                    values['error'] = _( | 
				
			||||
 | 
					                        "Public users can't change their password") | 
				
			||||
 | 
					                    return request.render( | 
				
			||||
 | 
					                        'password_reset_manager.reset_password_direct', values) | 
				
			||||
 | 
					            except odoo.exceptions.AccessDenied as e: | 
				
			||||
 | 
					                values['error'] = _("Login or Password Is Incorrect") | 
				
			||||
 | 
					                return request.render( | 
				
			||||
 | 
					                    'password_reset_manager.reset_password_direct', values) | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            values['error'] = _("Password Not Match") | 
				
			||||
 | 
					            return request.render( | 
				
			||||
 | 
					                'password_reset_manager.reset_password_direct', values) | 
				
			||||
@ -1,91 +0,0 @@ | 
				
			|||||
# -*- coding: utf-8 -*- | 
					 | 
				
			||||
############################################################################# | 
					 | 
				
			||||
# | 
					 | 
				
			||||
#    Cybrosys Technologies Pvt. Ltd. | 
					 | 
				
			||||
# | 
					 | 
				
			||||
#    Copyright (C) 2022-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
					 | 
				
			||||
#    Author: Cybrosys Techno Solutions(<https://www.cybrosys.com>) | 
					 | 
				
			||||
# | 
					 | 
				
			||||
#    You can modify it under the terms of the GNU LESSER | 
					 | 
				
			||||
#    GENERAL PUBLIC LICENSE (LGPL v3), Version 3. | 
					 | 
				
			||||
# | 
					 | 
				
			||||
#    This program is distributed in the hope that it will be useful, | 
					 | 
				
			||||
#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					 | 
				
			||||
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					 | 
				
			||||
#    GNU LESSER GENERAL PUBLIC LICENSE (LGPL v3) for more details. | 
					 | 
				
			||||
# | 
					 | 
				
			||||
#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | 
					 | 
				
			||||
#    (LGPL v3) along with this program. | 
					 | 
				
			||||
#    If not, see <http://www.gnu.org/licenses/>. | 
					 | 
				
			||||
# | 
					 | 
				
			||||
############################################################################# | 
					 | 
				
			||||
 | 
					 | 
				
			||||
import logging | 
					 | 
				
			||||
import odoo | 
					 | 
				
			||||
from odoo import http, _ | 
					 | 
				
			||||
from odoo.exceptions import UserError | 
					 | 
				
			||||
from odoo.http import request, dispatch_rpc | 
					 | 
				
			||||
 | 
					 | 
				
			||||
_logger = logging.getLogger(__name__) | 
					 | 
				
			||||
from odoo.addons.auth_signup.controllers.main import AuthSignupHome | 
					 | 
				
			||||
from odoo.addons.web.controllers.database import Database | 
					 | 
				
			||||
 | 
					 | 
				
			||||
 | 
					 | 
				
			||||
class DatabaseInherit(Database): | 
					 | 
				
			||||
    @http.route('/web/rest_by_master_pass/submit', type='http', methods=['POST'], auth="public", website=True, | 
					 | 
				
			||||
                csrf=False) | 
					 | 
				
			||||
    def change_password_by_master(self, *args, **kw): | 
					 | 
				
			||||
        values = {} | 
					 | 
				
			||||
        if kw['confirm_new_password'] == kw['new_password']: | 
					 | 
				
			||||
            if odoo.tools.config.verify_admin_password(kw['master_password']): | 
					 | 
				
			||||
                user_valid = request.env['res.users'].sudo().search([('login', '=', kw['user_name'])]) | 
					 | 
				
			||||
                if user_valid: | 
					 | 
				
			||||
                    query = "update res_users set password='%s' where login='%s'" % ( | 
					 | 
				
			||||
                        kw['confirm_new_password'], kw['user_name']) | 
					 | 
				
			||||
                    request.cr.execute(query) | 
					 | 
				
			||||
                    return request.redirect('/web/login?message=%s' % _('Password Changed')) | 
					 | 
				
			||||
                else: | 
					 | 
				
			||||
                    values['error'] = _("User Name Is Not Valid") | 
					 | 
				
			||||
                    return request.render('password_reset_manager.forgot_password', values) | 
					 | 
				
			||||
 | 
					 | 
				
			||||
            else: | 
					 | 
				
			||||
                values['error'] = _("Master Password Is Incorrect") | 
					 | 
				
			||||
                return request.render('password_reset_manager.forgot_password', values) | 
					 | 
				
			||||
 | 
					 | 
				
			||||
        else: | 
					 | 
				
			||||
            values['error'] = _("Password Not Matched") | 
					 | 
				
			||||
            return request.render('password_reset_manager.forgot_password', values) | 
					 | 
				
			||||
 | 
					 | 
				
			||||
 | 
					 | 
				
			||||
class AuthSignupHomeInherit(AuthSignupHome): | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    @http.route('/web/forgot_password', type='http', auth='public', website=True, sitemap=False, | 
					 | 
				
			||||
                csrf=False, ) | 
					 | 
				
			||||
    def forgot_password(self, *args, **kw): | 
					 | 
				
			||||
        qcontext = self.get_auth_signup_qcontext() | 
					 | 
				
			||||
        response = request.render('password_reset_manager.forgot_password', qcontext) | 
					 | 
				
			||||
        return response | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    @http.route('/web/reset_password/direct', type='http', auth='public', website=True, sitemap=False, csrf=False, ) | 
					 | 
				
			||||
    def web_auth_reset_password_direct(self, *args, **kw): | 
					 | 
				
			||||
        qcontext = self.get_auth_signup_qcontext() | 
					 | 
				
			||||
        response = request.render('password_reset_manager.reset_password_direct', qcontext) | 
					 | 
				
			||||
        return response | 
					 | 
				
			||||
 | 
					 | 
				
			||||
    @http.route('/web/reset_password/submit', type='http', methods=['POST'], auth="public", website=True, csrf=False) | 
					 | 
				
			||||
    def change_password(self, *args, **kw): | 
					 | 
				
			||||
        values = {} | 
					 | 
				
			||||
        if kw['confirm_new_password'] == kw['new_password']: | 
					 | 
				
			||||
            try: | 
					 | 
				
			||||
                uid = request.session.authenticate(request.session.db, kw['user_name'], | 
					 | 
				
			||||
                                                   kw['old_password']) | 
					 | 
				
			||||
                user = request.env['res.users'].search([('id', '=', uid)]) | 
					 | 
				
			||||
                user.password = kw['confirm_new_password'] | 
					 | 
				
			||||
                return request.redirect('/web/login?message=%s' % _('Password Changed')) | 
					 | 
				
			||||
 | 
					 | 
				
			||||
            except odoo.exceptions.AccessDenied as e: | 
					 | 
				
			||||
                values['error'] = _("Login or Password Is Incorrect") | 
					 | 
				
			||||
                return request.render('password_reset_manager.reset_password_direct', values) | 
					 | 
				
			||||
        else: | 
					 | 
				
			||||
            values['error'] = _("Password Not Match") | 
					 | 
				
			||||
            return request.render('password_reset_manager.reset_password_direct', values) | 
					 | 
				
			||||
@ -0,0 +1,71 @@ | 
				
			|||||
 | 
					# -*- coding: utf-8 -*- | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Cybrosys Technologies Pvt. Ltd. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    Copyright (C) 2023-TODAY Cybrosys Technologies(<https://www.cybrosys.com>) | 
				
			||||
 | 
					#    Author: Cybrosys Techno Solutions (<https://www.cybrosys.com>) | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You can modify it under the terms of the GNU LESSER | 
				
			||||
 | 
					#    GENERAL PUBLIC LICENSE (AGPL v3), Version 3. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    This program is distributed in the hope that it will be useful, | 
				
			||||
 | 
					#    but WITHOUT ANY WARRANTY; without even the implied warranty of | 
				
			||||
 | 
					#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
				
			||||
 | 
					#    GNU LESSER GENERAL PUBLIC LICENSE (AGPL v3) for more details. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					#    You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE | 
				
			||||
 | 
					#    (AGPL v3) along with this program | 
				
			||||
 | 
					#    If not, see <http://www.gnu.org/licenses/>. | 
				
			||||
 | 
					# | 
				
			||||
 | 
					############################################################################# | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					import odoo | 
				
			||||
 | 
					from odoo import http, _ | 
				
			||||
 | 
					from odoo.http import request, dispatch_rpc | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					from odoo.addons.web.controllers.database import Database | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					class DatabaseInherit(Database): | 
				
			||||
 | 
					    @http.route('/web/reset_by_master_pass/submit', type='http', | 
				
			||||
 | 
					                methods=['POST'], auth="public", website=True, csrf=False) | 
				
			||||
 | 
					    def change_password_by_master(self, **kw): | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        Endpoint to change a user's password by a master password. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :param kw: Keyword arguments received from the request. | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        :return: A redirect to the login page with a success message or an | 
				
			||||
 | 
					         error message. | 
				
			||||
 | 
					        """ | 
				
			||||
 | 
					        values = {} | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        # Check if the new password and confirm new password match. | 
				
			||||
 | 
					        if kw['confirm_new_password'] == kw['new_password']: | 
				
			||||
 | 
					            # Verify the master password using Odoo's config. | 
				
			||||
 | 
					            if odoo.tools.config.verify_admin_password(kw['master_password']): | 
				
			||||
 | 
					                # Search for a user with the provided user_name. | 
				
			||||
 | 
					                user_valid = request.env['res.users'].sudo().search([ | 
				
			||||
 | 
					                    ('login', '=', kw['user_name'])]) | 
				
			||||
 | 
					                if user_valid: | 
				
			||||
 | 
					                    # Update the user's password with the new password. | 
				
			||||
 | 
					                    user_valid.sudo().write({ | 
				
			||||
 | 
					                        'password': kw['confirm_new_password'] | 
				
			||||
 | 
					                    }) | 
				
			||||
 | 
					                    # Redirect to the login page with a success message. | 
				
			||||
 | 
					                    return request.redirect('/web/login?message=%s' | 
				
			||||
 | 
					                                            % _('Password Changed')) | 
				
			||||
 | 
					                else: | 
				
			||||
 | 
					                    values['error'] = _("User Name Is Not Valid") | 
				
			||||
 | 
					                    return request.render( | 
				
			||||
 | 
					                        'password_reset_manager.forgot_password', values) | 
				
			||||
 | 
					            else: | 
				
			||||
 | 
					                values['error'] = _("Master Password Is Incorrect") | 
				
			||||
 | 
					                return request.render('password_reset_manager.forgot_password', | 
				
			||||
 | 
					                                      values) | 
				
			||||
 | 
					
 | 
				
			||||
 | 
					        else: | 
				
			||||
 | 
					            values['error'] = _("Password Not Matched") | 
				
			||||
 | 
					            return request.render('password_reset_manager.forgot_password', | 
				
			||||
 | 
					                                  values) | 
				
			||||
					Loading…
					
					
				
		Reference in new issue