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