diff --git a/password_reset_manager/README.rst b/password_reset_manager/README.rst new file mode 100644 index 000000000..0e615ccc6 --- /dev/null +++ b/password_reset_manager/README.rst @@ -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 `__ + +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 `__ + +Further information +=================== +HTML Description: ``__ diff --git a/password_reset_manager/__init__.py b/password_reset_manager/__init__.py index 7b4bf8780..c81e9076e 100755 --- a/password_reset_manager/__init__.py +++ b/password_reset_manager/__init__.py @@ -3,19 +3,19 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2022-TODAY Cybrosys Technologies() -# Author: Cybrosys Techno Solutions() +# Copyright (C) 2023-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions () # # You can modify it under the terms of the GNU LESSER -# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# 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 (LGPL v3) for more details. +# GNU LESSER GENERAL PUBLIC LICENSE (AGPL v3) for more details. # # You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE -# (LGPL v3) along with this program. +# (AGPL v3) along with this program # If not, see . # ############################################################################# diff --git a/password_reset_manager/__manifest__.py b/password_reset_manager/__manifest__.py index 71910b8f3..988e230cb 100755 --- a/password_reset_manager/__manifest__.py +++ b/password_reset_manager/__manifest__.py @@ -3,32 +3,34 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2022-TODAY Cybrosys Technologies() -# Author: Cybrosys Techno Solutions() +# Copyright (C) 2023-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions () # # You can modify it under the terms of the GNU LESSER -# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# 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 (LGPL v3) for more details. +# GNU LESSER GENERAL PUBLIC LICENSE (AGPL v3) for more details. # # You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE -# (LGPL v3) along with this program. +# (AGPL v3) along with this program # If not, see . # ############################################################################# +# """manifest""" { 'name': "Password Reset Manager", - 'version': '16.0.1.0.0', - 'summary': """User Password Reset Manager""", - 'description': """User Password Reset Manager""", - 'category': 'Technical', + 'version': '16.0.1.0.1', + 'category': 'Extra Tools', + 'summary': "User Password Reset Manager", + 'description': "This module helps users to change and reset forgotten " + "password. ", 'author': "Cybrosys Techno Solutions", - 'website': "https://www.cybrosys.com", 'company': 'Cybrosys Techno Solutions', 'maintainer': 'Cybrosys Techno Solutions', + 'website': "https://www.cybrosys.com", 'depends': ['auth_signup', 'web'], 'data': [ 'views/reset_password.xml', @@ -36,5 +38,6 @@ 'images': ['static/description/banner.png'], 'license': "AGPL-3", 'installable': True, + 'auto_install': False, 'application': True, } diff --git a/password_reset_manager/controllers/__init__.py b/password_reset_manager/controllers/__init__.py index 5ab2c146b..12d3cfe1d 100644 --- a/password_reset_manager/controllers/__init__.py +++ b/password_reset_manager/controllers/__init__.py @@ -3,21 +3,22 @@ # # Cybrosys Technologies Pvt. Ltd. # -# Copyright (C) 2022-TODAY Cybrosys Technologies() -# Author: Cybrosys Techno Solutions() +# Copyright (C) 2023-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions () # # You can modify it under the terms of the GNU LESSER -# GENERAL PUBLIC LICENSE (LGPL v3), Version 3. +# 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 (LGPL v3) for more details. +# GNU LESSER GENERAL PUBLIC LICENSE (AGPL v3) for more details. # # You should have received a copy of the GNU LESSER GENERAL PUBLIC LICENSE -# (LGPL v3) along with this program. +# (AGPL v3) along with this program # If not, see . # ############################################################################# -from . import main \ No newline at end of file +from . import auth_signup +from . import web diff --git a/password_reset_manager/controllers/auth_signup.py b/password_reset_manager/controllers/auth_signup.py new file mode 100644 index 000000000..e7e0626a6 --- /dev/null +++ b/password_reset_manager/controllers/auth_signup.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions () +# +# 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 . +# +############################################################################# + +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) diff --git a/password_reset_manager/controllers/main.py b/password_reset_manager/controllers/main.py deleted file mode 100644 index 6be6ca148..000000000 --- a/password_reset_manager/controllers/main.py +++ /dev/null @@ -1,91 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################# -# -# Cybrosys Technologies Pvt. Ltd. -# -# Copyright (C) 2022-TODAY Cybrosys Technologies() -# Author: Cybrosys Techno Solutions() -# -# 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 . -# -############################################################################# - -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) diff --git a/password_reset_manager/controllers/web.py b/password_reset_manager/controllers/web.py new file mode 100644 index 000000000..5ca95e6ae --- /dev/null +++ b/password_reset_manager/controllers/web.py @@ -0,0 +1,71 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies() +# Author: Cybrosys Techno Solutions () +# +# 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 . +# +############################################################################# + +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) diff --git a/password_reset_manager/doc/RELEASE_NOTES.md b/password_reset_manager/doc/RELEASE_NOTES.md index 160a70f03..72ad2f167 100644 --- a/password_reset_manager/doc/RELEASE_NOTES.md +++ b/password_reset_manager/doc/RELEASE_NOTES.md @@ -3,3 +3,4 @@ #### 21.12.2022 #### Version 16.0.1.0.0 #### ADD +Initial Commit for Password Reset Manager diff --git a/password_reset_manager/static/description/index.html b/password_reset_manager/static/description/index.html index be7821274..0dcc06c23 100644 --- a/password_reset_manager/static/description/index.html +++ b/password_reset_manager/static/description/index.html @@ -548,4 +548,4 @@ - \ No newline at end of file + diff --git a/password_reset_manager/views/reset_password.xml b/password_reset_manager/views/reset_password.xml index f9e134ffb..a351bb2c7 100644 --- a/password_reset_manager/views/reset_password.xml +++ b/password_reset_manager/views/reset_password.xml @@ -3,7 +3,7 @@ - \ No newline at end of file +