From 025ad1a4f884b7920ee9ebcb12876b926a6b3d0c Mon Sep 17 00:00:00 2001
From: yahyaprogrammer123
Date: Sun, 12 Oct 2025 09:28:35 +0300
Subject: [PATCH] mig sttl_otp_login by yahya
---
odex30_base/sttl_otp_login/__init__.py | 2 +
odex30_base/sttl_otp_login/__manifest__.py | 28 +
.../sttl_otp_login/controller/__init__.py | 2 +
.../sttl_otp_login/controller/otp_login.py | 152 ++++
.../sttl_otp_login/controller/otp_signup.py | 148 ++++
odex30_base/sttl_otp_login/data/cron.xml | 14 +
odex30_base/sttl_otp_login/models/__init__.py | 2 +
.../sttl_otp_login/models/otp_verification.py | 18 +
.../sttl_otp_login/models/res_users.py | 58 ++
.../security/ir.model.access.csv | 2 +
.../security/security_group.xml | 12 +
.../app_images/email_validation.png | Bin 0 -> 45256 bytes
.../app_images/product_catalog.png | Bin 0 -> 47742 bytes
.../app_images/product_description.png | Bin 0 -> 57978 bytes
.../app_images/timesheet_calendar.png | Bin 0 -> 60402 bytes
.../app_images/timesheet_forecasting.png | Bin 0 -> 55800 bytes
.../description/app_images/timesheet_lock.png | Bin 0 -> 52124 bytes
.../description/assets/icons/footer.png | Bin 0 -> 23139 bytes
.../description/assets/icons/industry.png | Bin 0 -> 29741 bytes
.../static/description/assets/icons/logo.png | Bin 0 -> 3673 bytes
.../description/assets/icons/services1.png | Bin 0 -> 44366 bytes
.../static/description/banner.jpg | Bin 0 -> 45787 bytes
.../static/description/banner.png | Bin 0 -> 134480 bytes
.../static/description/email_otp.png | Bin 0 -> 61218 bytes
.../description/email_otp_authentication.mkv | Bin 0 -> 1218592 bytes
.../static/description/icon.png | Bin 0 -> 6056 bytes
.../static/description/image/15.png | Bin 0 -> 18804 bytes
.../static/description/image/16A.png | Bin 0 -> 18255 bytes
.../static/description/image/canada-flag.png | Bin 0 -> 1417 bytes
.../static/description/image/india-flag.jpg | Bin 0 -> 12525 bytes
.../static/description/image/support.svg | 28 +
.../static/description/image/uk-flag-img.jpg | Bin 0 -> 14024 bytes
.../description/image/united-state-flag.jpg | Bin 0 -> 12783 bytes
.../static/description/index.html | 733 ++++++++++++++++++
.../static/description/login.png | Bin 0 -> 26977 bytes
.../static/description/login_otp.png | Bin 0 -> 67773 bytes
.../static/description/otp_login_laptop.png | Bin 0 -> 50927 bytes
.../static/description/otp_login_link.png | Bin 0 -> 37229 bytes
.../static/description/signup.png | Bin 0 -> 34697 bytes
.../static/description/signup_otp.png | Bin 0 -> 90293 bytes
.../sttl_otp_login/views/login_view.xml | 109 +++
.../sttl_otp_login/views/otp_signup.xml | 83 ++
.../sttl_otp_login/views/otp_verification.xml | 44 ++
43 files changed, 1435 insertions(+)
create mode 100644 odex30_base/sttl_otp_login/__init__.py
create mode 100644 odex30_base/sttl_otp_login/__manifest__.py
create mode 100644 odex30_base/sttl_otp_login/controller/__init__.py
create mode 100644 odex30_base/sttl_otp_login/controller/otp_login.py
create mode 100644 odex30_base/sttl_otp_login/controller/otp_signup.py
create mode 100644 odex30_base/sttl_otp_login/data/cron.xml
create mode 100644 odex30_base/sttl_otp_login/models/__init__.py
create mode 100644 odex30_base/sttl_otp_login/models/otp_verification.py
create mode 100644 odex30_base/sttl_otp_login/models/res_users.py
create mode 100644 odex30_base/sttl_otp_login/security/ir.model.access.csv
create mode 100644 odex30_base/sttl_otp_login/security/security_group.xml
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/email_validation.png
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/product_catalog.png
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/product_description.png
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/timesheet_calendar.png
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/timesheet_forecasting.png
create mode 100644 odex30_base/sttl_otp_login/static/description/app_images/timesheet_lock.png
create mode 100644 odex30_base/sttl_otp_login/static/description/assets/icons/footer.png
create mode 100644 odex30_base/sttl_otp_login/static/description/assets/icons/industry.png
create mode 100644 odex30_base/sttl_otp_login/static/description/assets/icons/logo.png
create mode 100644 odex30_base/sttl_otp_login/static/description/assets/icons/services1.png
create mode 100644 odex30_base/sttl_otp_login/static/description/banner.jpg
create mode 100644 odex30_base/sttl_otp_login/static/description/banner.png
create mode 100644 odex30_base/sttl_otp_login/static/description/email_otp.png
create mode 100644 odex30_base/sttl_otp_login/static/description/email_otp_authentication.mkv
create mode 100644 odex30_base/sttl_otp_login/static/description/icon.png
create mode 100644 odex30_base/sttl_otp_login/static/description/image/15.png
create mode 100644 odex30_base/sttl_otp_login/static/description/image/16A.png
create mode 100644 odex30_base/sttl_otp_login/static/description/image/canada-flag.png
create mode 100644 odex30_base/sttl_otp_login/static/description/image/india-flag.jpg
create mode 100644 odex30_base/sttl_otp_login/static/description/image/support.svg
create mode 100644 odex30_base/sttl_otp_login/static/description/image/uk-flag-img.jpg
create mode 100644 odex30_base/sttl_otp_login/static/description/image/united-state-flag.jpg
create mode 100644 odex30_base/sttl_otp_login/static/description/index.html
create mode 100644 odex30_base/sttl_otp_login/static/description/login.png
create mode 100644 odex30_base/sttl_otp_login/static/description/login_otp.png
create mode 100644 odex30_base/sttl_otp_login/static/description/otp_login_laptop.png
create mode 100644 odex30_base/sttl_otp_login/static/description/otp_login_link.png
create mode 100644 odex30_base/sttl_otp_login/static/description/signup.png
create mode 100644 odex30_base/sttl_otp_login/static/description/signup_otp.png
create mode 100644 odex30_base/sttl_otp_login/views/login_view.xml
create mode 100644 odex30_base/sttl_otp_login/views/otp_signup.xml
create mode 100644 odex30_base/sttl_otp_login/views/otp_verification.xml
diff --git a/odex30_base/sttl_otp_login/__init__.py b/odex30_base/sttl_otp_login/__init__.py
new file mode 100644
index 0000000..9ccd0de
--- /dev/null
+++ b/odex30_base/sttl_otp_login/__init__.py
@@ -0,0 +1,2 @@
+from . import controller
+from . import models
diff --git a/odex30_base/sttl_otp_login/__manifest__.py b/odex30_base/sttl_otp_login/__manifest__.py
new file mode 100644
index 0000000..21cc408
--- /dev/null
+++ b/odex30_base/sttl_otp_login/__manifest__.py
@@ -0,0 +1,28 @@
+# -*- coding: utf-8 -*-
+{
+ "name": "Email OTP Authentication",
+ "version": "18.0.1.0.0",
+ "author": "Silver Touch Technologies Limited",
+ 'category': 'Tools',
+ "website": "https://www.silvertouch.com/",
+ "description": """
+ """,
+ "summary": """
+ This module allows the user authentication of the database via OTP.
+ """,
+ 'depends': ['base', 'mail', 'web', 'website', 'auth_signup'],
+ 'data': [
+ "security/ir.model.access.csv",
+ "security/security_group.xml",
+ "views/otp_verification.xml",
+ "views/login_view.xml",
+ "views/otp_signup.xml",
+ "data/cron.xml"
+ ],
+ "price": 0,
+ "currency": "USD",
+ "license": "LGPL-3",
+ 'installable': True,
+ 'application': False,
+ 'images': ['static/description/banner.png']
+}
\ No newline at end of file
diff --git a/odex30_base/sttl_otp_login/controller/__init__.py b/odex30_base/sttl_otp_login/controller/__init__.py
new file mode 100644
index 0000000..cd38dc9
--- /dev/null
+++ b/odex30_base/sttl_otp_login/controller/__init__.py
@@ -0,0 +1,2 @@
+from . import otp_login
+from . import otp_signup
diff --git a/odex30_base/sttl_otp_login/controller/otp_login.py b/odex30_base/sttl_otp_login/controller/otp_login.py
new file mode 100644
index 0000000..ae64e6c
--- /dev/null
+++ b/odex30_base/sttl_otp_login/controller/otp_login.py
@@ -0,0 +1,152 @@
+from odoo import http, _
+from odoo.http import request
+from odoo.addons.web.controllers.home import Home
+from odoo.exceptions import AccessDenied
+from random import choice
+import string
+import logging
+
+
+from odoo.addons.web.controllers.utils import ensure_db
+
+_logger = logging.getLogger(__name__)
+
+
+class OtpLoginHome(Home):
+ @http.route(website=True, auth='public')
+ def web_login(self, redirect=None, **kw):
+ """Customized web_login for OTP flow (Odoo 18 compatible)"""
+ ensure_db()
+ qcontext = request.params.copy()
+
+
+ if request.httprequest.method == 'GET':
+ otp_login = kw.get('otp_login')
+ otp = kw.get('otp')
+
+ if otp_login and otp:
+ _logger.info("Rendering OTP verification page.")
+ return request.render("sttl_otp_login.custom_login_template", {
+ 'otp': True,
+ 'otp_login': True,
+ })
+
+
+ if otp_login:
+ _logger.info("Rendering OTP login page.")
+ return request.render("sttl_otp_login.custom_login_template", {
+ 'otp_login': True,
+ })
+
+
+ return super(OtpLoginHome, self).web_login(redirect, **kw)
+
+
+ else:
+ login = kw.get('login')
+ password = kw.get('password')
+
+ if login:
+ request.params['login'] = login.strip()
+ if password:
+ request.params['password'] = password.strip()
+
+ _logger.info("Processing standard login for %s", login)
+ return super(OtpLoginHome, self).web_login(redirect, **kw)
+
+ def generate_otp(self, digits=4):
+ otp = ''.join(choice(string.digits) for _ in range(digits))
+ _logger.info("Generated OTP: %s", otp)
+ return otp
+
+ @http.route('/otp/login', type='http', auth='public', website=True, csrf=False)
+ def web_otp_login(self, **kw):
+ email = (kw.get('login') or '').strip()
+
+ if not email:
+ return request.render("sttl_otp_login.custom_login_template", {
+ 'error': _('Please enter your email or login first.'),
+ 'otp_login': True,
+ })
+
+
+ user = request.env['res.users'].sudo().search([('login', '=', email)], limit=1)
+ if not user:
+ _logger.warning(" No user found for OTP login: %s", email)
+ return request.render("sttl_otp_login.custom_login_template", {
+ 'error': _('No user found with this email.'),
+ 'otp_login': True,
+ })
+
+
+ OTP = self.generate_otp(4)
+
+
+ request.env['otp.verification'].sudo().create({
+ 'email': email,
+ 'otp': OTP,
+ 'state': 'unverified',
+ })
+
+ _logger.info(" OTP for %s is %s", email, OTP)
+
+ # عرض صفحة إدخال OTP
+ return request.render("sttl_otp_login.custom_login_template", {
+ 'otp_login': True,
+ 'otp': True,
+ 'login': email,
+ 'otp_no': OTP,
+ # 'info_message': _("A verification code was sent to your email.")
+ })
+
+ @http.route('/otp/verify', type='http', auth='public', website=True, csrf=False)
+ def web_otp_verify(self, **kw):
+
+ email = kw.get('login')
+ otp_input = kw.get('otp')
+
+
+ otp_rec = request.env['otp.verification'].sudo().search(
+ [('email', '=', email)], order='create_date desc', limit=1
+ )
+
+ if not otp_rec or otp_rec.otp != otp_input:
+ return request.render('sttl_otp_login.custom_login_template', {
+ 'error': _("Invalid OTP. Please try again."),
+ 'otp_login': True,
+ 'login': email,
+ })
+
+
+ otp_rec.state = 'verified'
+
+
+ user = request.env['res.users'].sudo().search([('login', '=', email)], limit=1)
+ if not user:
+ return request.render('sttl_otp_login.custom_login_template', {
+ 'error': _("No account found for this email."),
+ 'otp_login': True,
+ 'login': email,
+ })
+
+
+ try:
+ credential = {'login': email, 'password': user.password or ''}
+ auth_info = request.session.authenticate(request.db, credential)
+
+
+ if auth_info and auth_info.get('uid'):
+ with request.env.registry.cursor() as cr:
+ env = request.env(user=auth_info['uid'])
+ request.session.finalize(env)
+
+ _logger.info(" User %s logged in successfully via OTP", email)
+ return request.redirect('/web')
+
+ except Exception as e:
+ _logger.exception(" Failed OTP login for %s: %s", email, e)
+ return request.render('sttl_otp_login.custom_login_template', {
+ 'error': _("An unexpected error occurred. Please try again."),
+ 'otp_login': True,
+ 'login': email,
+ })
\ No newline at end of file
diff --git a/odex30_base/sttl_otp_login/controller/otp_signup.py b/odex30_base/sttl_otp_login/controller/otp_signup.py
new file mode 100644
index 0000000..b36eb7a
--- /dev/null
+++ b/odex30_base/sttl_otp_login/controller/otp_signup.py
@@ -0,0 +1,148 @@
+from odoo import http, _
+from odoo.http import request
+from odoo.addons.web.controllers.home import Home
+from odoo.exceptions import UserError
+import logging
+import string
+from random import choice
+
+_logger = logging.getLogger(__name__)
+
+
+class OtpSignup(Home):
+
+ def generate_otp(self, digits=4):
+
+ otp = ''.join(choice(string.digits) for _ in range(digits))
+ _logger.info(" Generated OTP: %s", otp)
+ return otp
+
+
+ @http.route('/web/signup/otp', type='http', auth='public', website=True, sitemap=False)
+ def web_signup_otp(self, **kw):
+ qcontext = request.params.copy()
+ if request.httprequest.method == 'GET':
+ return request.render('sttl_otp_login.custom_otp_signup', qcontext)
+ OTP = self.generate_otp(4)
+ email = qcontext.get("login")
+
+ password = qcontext.get("password")
+ confirm_password = qcontext.get("confirm_password")
+
+
+ if not email or not password or not confirm_password:
+ qcontext["error"] = _("All fields are required.")
+ return request.render('sttl_otp_login.custom_otp_signup', qcontext)
+
+ if password != confirm_password:
+ qcontext["error"] = _("Passwords do not match, please retype them.")
+ return request.render('sttl_otp_login.custom_otp_signup', qcontext)
+
+
+ user_exist = request.env["res.users"].sudo().search([("login", "=", email)], limit=1)
+ if user_exist:
+ qcontext["error"] = _("Another user is already registered using this email address.")
+ return request.render('sttl_otp_login.custom_otp_signup', qcontext)
+ else:
+ email = str(qcontext.get('login'))
+ # name = str(qcontext.get('name'))
+ # vals = {
+ # 'otp': OTP,
+ # 'email': email
+ # }
+ #send to email
+ # email_from = request.env.company.email
+ # mail_body = """\
+ #
+ #
+ #
+ # Dear %s,
+ #
+ #
+ # To complete the verification process for your Odoo account,
+ #
Please use the following One-Time Password (OTP): %s
+ #
+ # Thanks & Regards.
+ #
+ #
+ #
+ # """ % (name, OTP)
+ # mail = request.env['mail.mail'].sudo().create({
+ # 'subject': _('Verify Your Odoo Account - OTP Required'),
+ # 'email_from': email_from,
+ # 'email_to': email,
+ # 'body_html': mail_body,
+ # })
+ # mail.send()
+ # response = request.render('sttl_otp_login.custom_otp_signup', {'otp': True, 'otp_login': True,
+ # 'login': qcontext["login"],
+ # 'otp_no': OTP,
+ # 'name': qcontext["name"],
+ # 'password': qcontext["password"],
+ # 'confirm_password': qcontext[
+ # "confirm_password"]})
+ # res = request.env['otp.verification'].sudo().create(vals)
+ # return response
+
+ #send in local
+
+ request.env['otp.verification'].sudo().create({
+ 'otp': OTP,
+ 'email': email,
+ 'state': 'unverified',
+ })
+
+ qcontext.update({
+ 'otp': True,
+ 'otp_login': True,
+ 'login': email,
+ 'otp_no': OTP,
+ 'password': password,
+ 'confirm_password': confirm_password,
+ 'info_message': f"Your OTP is: {OTP}",
+ })
+
+ return request.render('sttl_otp_login.custom_otp_signup', qcontext)
+
+
+ @http.route('/web/signup/otp/verify', type='http', auth='public', website=True, sitemap=False)
+ def web_otp_signup_verify(self, **kw):
+ email = kw.get('login')
+ otp_input = kw.get('otp')
+ name = kw.get('name')
+ password = kw.get('password')
+ confirm_password = kw.get('confirm_password')
+
+ otp_rec = request.env['otp.verification'].sudo().search(
+ [('email', '=', email)], order="create_date desc", limit=1
+ )
+
+
+ if not otp_rec or otp_rec.otp != otp_input:
+ return request.render('sttl_otp_login.custom_otp_signup', {
+ 'otp': True, 'otp_login': True,
+ 'login': email, 'name': name,
+ 'password': password, 'confirm_password': confirm_password,
+ 'error': _("Invalid OTP. Please try again."),
+ })
+
+
+ otp_rec.state = 'verified'
+
+ user = request.env['res.users'].sudo().create({
+ 'name': name,
+ 'login': email,
+ 'password': password,
+ })
+ request.env.cr.commit()
+
+ _logger.info(" User %s created successfully.", email)
+
+
+ credential = {'login': email, 'password': password}
+ request.session.authenticate(request.db, credential)
+
+ _logger.info(" User %s logged in successfully.", email)
+
+
+ return request.redirect('/web')
diff --git a/odex30_base/sttl_otp_login/data/cron.xml b/odex30_base/sttl_otp_login/data/cron.xml
new file mode 100644
index 0000000..c061902
--- /dev/null
+++ b/odex30_base/sttl_otp_login/data/cron.xml
@@ -0,0 +1,14 @@
+
+
+
+
+ OTP : Delete the OTPs generated
+
+ code
+ model._cron_delete_verified_otp()
+ 1
+ weeks
+ True
+
+
+
diff --git a/odex30_base/sttl_otp_login/models/__init__.py b/odex30_base/sttl_otp_login/models/__init__.py
new file mode 100644
index 0000000..35443f6
--- /dev/null
+++ b/odex30_base/sttl_otp_login/models/__init__.py
@@ -0,0 +1,2 @@
+from . import otp_verification
+from . import res_users
diff --git a/odex30_base/sttl_otp_login/models/otp_verification.py b/odex30_base/sttl_otp_login/models/otp_verification.py
new file mode 100644
index 0000000..59049cf
--- /dev/null
+++ b/odex30_base/sttl_otp_login/models/otp_verification.py
@@ -0,0 +1,18 @@
+from odoo import fields, models, api
+
+
+class OtpVerification(models.Model):
+ _name = "otp.verification"
+ _description = 'Otp Verification'
+
+ otp = fields.Text(string="OTP")
+ state = fields.Selection([
+ ('verified', 'Verified'),
+ ('unverified', 'Unverified'),
+ ('rejected', 'Rejected')], string="State", default="unverified")
+ email = fields.Char(string="email")
+
+ @api.model
+ def _cron_delete_verified_otp(self):
+ otp = self.search([])
+ otp.unlink()
diff --git a/odex30_base/sttl_otp_login/models/res_users.py b/odex30_base/sttl_otp_login/models/res_users.py
new file mode 100644
index 0000000..d5f2c6c
--- /dev/null
+++ b/odex30_base/sttl_otp_login/models/res_users.py
@@ -0,0 +1,58 @@
+import logging
+from odoo import api, models, SUPERUSER_ID, _
+from odoo.exceptions import AccessDenied
+from odoo.http import request
+
+from odoo.addons.mail.models.fetchmail import name
+
+_logger = logging.getLogger(name)
+
+class ResUsers(models.Model):
+ _inherit = "res.users"
+
+
+ @classmethod
+ def _login(cls, db, credential, user_agent_env):
+ login = credential.get('login')
+ password = credential.get('password')
+ login_type = credential.get('type', 'password')
+ otp = credential.get('otp')
+
+ ip = request.httprequest.environ.get('REMOTE_ADDR') if request else 'n/a'
+ _logger.info(" Login attempt: %s (type=%s)", login, login_type)
+
+ try:
+ with cls.pool.cursor() as cr:
+ env = api.Environment(cr, SUPERUSER_ID, {})
+ user = env[cls._name].search(env[cls._name]._get_login_domain(login),
+ order=env[cls._name]._get_login_order(),
+ limit=1)
+ if not user:
+ raise AccessDenied(_("Invalid login"))
+ user = user.with_user(user)
+
+ if login_type == 'otp':
+ otp_record = env['otp.verification'].sudo().search([
+ ('email', '=', user.login),
+ ('otp', '=', otp),
+ ('state', '=', 'unverified')
+ ], order='create_date desc', limit=1)
+
+ if not otp_record:
+ raise AccessDenied(_("Invalid OTP"))
+
+ otp_record.state = 'verified'
+ auth_info = {'uid': user.id, 'auth_method': 'otp', 'mfa': 'skip'}
+ else:
+
+ user._check_credentials({'type': 'password', 'password': password}, user_agent_env)
+ auth_info = {'uid': user.id, 'auth_method': 'password'}
+
+ user._update_last_login()
+
+ except AccessDenied:
+ _logger.warning(" Login failed for %s from %s", login, ip)
+ raise
+
+ _logger.info(" Login success for %s from %s", login, ip)
+ return auth_info
diff --git a/odex30_base/sttl_otp_login/security/ir.model.access.csv b/odex30_base/sttl_otp_login/security/ir.model.access.csv
new file mode 100644
index 0000000..bb7fd7b
--- /dev/null
+++ b/odex30_base/sttl_otp_login/security/ir.model.access.csv
@@ -0,0 +1,2 @@
+id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
+access_otp_verification,sttl_custom_reports_so.access_otp_verification,model_otp_verification,,1,1,1,1
\ No newline at end of file
diff --git a/odex30_base/sttl_otp_login/security/security_group.xml b/odex30_base/sttl_otp_login/security/security_group.xml
new file mode 100644
index 0000000..8317a10
--- /dev/null
+++ b/odex30_base/sttl_otp_login/security/security_group.xml
@@ -0,0 +1,12 @@
+
+
+
+ OTP Table
+ User access levels for OTP module
+ 10
+
+
+ Admin
+
+
+
\ No newline at end of file
diff --git a/odex30_base/sttl_otp_login/static/description/app_images/email_validation.png b/odex30_base/sttl_otp_login/static/description/app_images/email_validation.png
new file mode 100644
index 0000000000000000000000000000000000000000..0d91390fdc513e205b0be1de2361c01d6ad67e7e
GIT binary patch
literal 45256
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
z
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
literal 0
HcmV?d00001
diff --git a/odex30_base/sttl_otp_login/static/description/app_images/product_catalog.png b/odex30_base/sttl_otp_login/static/description/app_images/product_catalog.png
new file mode 100644
index 0000000000000000000000000000000000000000..1f9bb439dfa8999b404a049552ef0c92cd674568
GIT binary patch
literal 47742
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