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