Commit aeea746b by Juan

Reset User

1 parent 511000b5
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from odoo import http from odoo import http
import random, os, json import random, os, json
import werkzeug
import random, os, json
from . import rsp
import base64, string, random
TextoAlta = """Hemos resibido su pedido de alta en el sistema. TextoAlta = """Hemos resibido su pedido de alta en el sistema.
Pronto se comunicara con usted por este medio un representante de Lappa.""" Pronto se comunicara con usted por este medio un representante de Lappa."""
TextoRecuperacion = """Se a pedido resetear la contraseña de tu usuario {} de LAIKA, si no fuiste vos innforma al administrador. CODIGO: {}"""
# Agregar mensaje de numero repetido # Agregar mensaje de numero repetido
class dispositivos(http.Controller): class dispositivos(http.Controller):
...@@ -68,3 +74,113 @@ class dispositivos(http.Controller): ...@@ -68,3 +74,113 @@ class dispositivos(http.Controller):
@http.route('/lappa/blank', auth='public', type='http' , website=True ,csrf=False, methods = ['POST','GET','OPTIONS']) @http.route('/lappa/blank', auth='public', type='http' , website=True ,csrf=False, methods = ['POST','GET','OPTIONS'])
def index6(self, **kw): def index6(self, **kw):
return("") return("")
#"""Controlador de acceso a firmas"""
@http.route('/lappa/usuarios/resetearconntrasena', auth='public', type='http' , website=True ,csrf=False, methods = ['POST','GET'])
def indexvcxx(self, **kw):
#print(kw)
try:
tel = kw["celular"]
info = self.ResetUsuario(tel)
#print(info)
url = '/lappa/usuarios/resetearconntrasenaetp3?cewc={}&edsac={}&decsdas={}'.format(info["token"],info["usuario"],self.cualquiera(7))
rto = werkzeug.utils.redirect(url)
except:
rto = rsp.html
#print(rto)
return(rto)
@http.route('/lappa/usuarios/resetearconntrasenaetp3', auth='public', type='http' , website=True ,csrf=False, methods = ['GET'])
def indsdfsdex3(self, **kw):
try:
UID = kw["UID"]
token = kw["token"]
passw = kw['password']
codigo = kw['codigo']
if self.ChequearToken(codigo,token):
self.cambiar_pass(UID,passw)
return(werkzeug.utils.redirect('/'))
except:
UID = kw["edsac"]
token = kw["cewc"]
#print(UID,token)
html = rsp.html3.replace("{TOKEN}",token)
html = html.replace("{UID}",UID)
return(html)
def ResetUsuario(self,celular):
rto = False
user = http.request.env['res.users'].sudo().search([["CelularRecuperacion","=",celular]])
#print(user)
if len(user) == 1:
url = http.request.env['ir.config_parameter'].sudo().get_param('web.base.url')
clave = self.GeneradorClave(6)#Cantidad de caracteres en la clabe
text = TextoRecuperacion.format(user.display_name, clave[0])#lo que se envia por mensaje
#print(text)
self.enviar_mensaje(mensaje=text,telefono=celular,titulo="Administracion LAIKA")
rto = {"token": clave[1], "usuario":user.id}
return(rto)
def enviar_mensaje(self, tipo='Whatsapp', mensaje="mensaje", titulo="Titulo",email="",telefono=""):#Crea mensaje y lo envia
#Hay que agregar al modelo la relacion con los mensajes para tener trazavilidad
vals = {"mensaje_nombre":titulo,
"mensaje_descripcion":mensaje,
"mensaje_numero_whatsapp":telefono,
"mensaje_direccion_mail":email,
"identidad":1}
mensaje = http.request.env['asw.mensaje'].sudo().create(vals)
mensaje.tipo = tipo
mensaje.enviar()
@http.route('/lappa/usuarios/resetearconntrasenaetp2', auth='public', type='http' , website=True ,csrf=False, methods = ['GET'])
def index2(self, **kw):
print(kw)
#vewrftbv={}&vfds={}&wdcwexas=dwdwqcaA
try:
UID = int(kw["token"])
passw = kw['password']
self.cambiar_pass(UID,passw)
return(werkzeug.utils.redirect('/'))
except:
pass
try:
UID = kw["vfds"]
rto = rsp.html3.replace("{TOKEN}",UID)
except:
rto = werkzeug.utils.redirect('/')
return(rto)
def cambiar_pass(self,UID, passw):
user = http.request.env['res.users'].sudo().search([["id","=",UID]])
user.password = passw
def GeneradorClave(self,largo=6):
codigo = self.cualquiera(largo)
token = self.encodear(codigo)
return(codigo,token)
def ChequearToken(self,codigo,token):
if self.decodificar(token) == codigo:
return(True)
else:
return(False)
def cualquiera(self,largo=6):
return(''.join(random.choice(string.digits + string.ascii_letters) for _ in range(largo)))
def encodear(self,text):
message_bytes = text.encode('ascii')
base64_bytes = base64.b64encode(message_bytes)
base64_message = base64_bytes.decode('ascii')
return(base64_message)
def decodificar(self,bs):
base64_bytes = bs.encode('ascii')
message_bytes = base64.b64decode(base64_bytes)
message = message_bytes.decode('ascii')
return(message)
...@@ -5,7 +5,7 @@ import random, os, json ...@@ -5,7 +5,7 @@ import random, os, json
import base64, string, random import base64, string, random
TextoAlta = """Se a pedido resetear la contraseña de tu usuario {} de LAIKA, si no fuiste vos no hagas nada. Si quieres hacerlo sigue el siguiente enlase {}/usuarios/resetearconntrasenaetp2?vewrftbv={}&vfds={}&wdcwexas=dwdwqcaA""" TextoAlta = """Se a pedido resetear la contraseña de tu usuario {} de LAIKA, si no fuiste vos no hagas nada. Si quieres hacerlo sigue el siguiente enlase {}/usuarios/resetearconntrasenaetp2?vewrftbv={}&vfds={}&wdcwexas=dwdwqcaA"""
TextoRecuperacion = """Se a pedido resetear la contraseña de tu usuario {} de LAIKA, si no fuiste vos innforma al administrador. CODIGO: {}""" TextoRecuperacion = """Se a pedido resetear la contraseña de tu usuario {} de LAIKA, si no fuiste vos innforma al administrador. CODIGO: {} URL {}"""
class restablecedor(http.Controller): class restablecedor(http.Controller):
"""Controlador de acceso a firmas""" """Controlador de acceso a firmas"""
...@@ -58,6 +58,7 @@ class restablecedor(http.Controller): ...@@ -58,6 +58,7 @@ class restablecedor(http.Controller):
user = http.request.env['res.users'].sudo().search([["CelularRecuperacion","=",celular]]) user = http.request.env['res.users'].sudo().search([["CelularRecuperacion","=",celular]])
if len(user) == 1: if len(user) == 1:
clave = self.GeneradorClave(6)#Cantidad de caracteres en la clabe clave = self.GeneradorClave(6)#Cantidad de caracteres en la clabe
url = 'https://lappa.hgt.com.ar/lappa/usuarios/resetearconntrasenaetp3?cewc={}&edsac={}&decsdas={}'.format(info["token"],info["usuario"],self.cualquiera(7))
text = TextoRecuperacion.format(user.display_name, clave[0])#lo que se envia por mensaje text = TextoRecuperacion.format(user.display_name, clave[0])#lo que se envia por mensaje
self.enviar_mensaje(mensaje=text,telefono=celular,titulo="Administracion LAIKA") self.enviar_mensaje(mensaje=text,telefono=celular,titulo="Administracion LAIKA")
rto = {"token": clave, "usuario":user,} rto = {"token": clave, "usuario":user,}
......
html = """<!DOCTYPE html>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<!------ Include the above in your HEAD tag ---------->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<div class="form-gap"></div>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-default">
<div class="panel-body">
<div class="text-center">
<h3><i class="fa fa-lock fa-4x"></i></h3>
<h2 class="text-center">¿No te acordas la contraseña?</h2>
<p>Podes regenerar la contraseña co tu telefono</p>
<div class="panel-body">
<form id="register-form" role="form" autocomplete="off" class="form" method="post">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope color-blue"></i></span>
<input id="celular" name="celular" placeholder="N° Celular" class="form-control" type="phone">
</div>
</div>
<div class="form-group">
<input name="recover-submit" class="btn btn-lg btn-primary btn-block" value="Regeenrar Contraseña" type="submit">
</div>
<input type="hidden" class="hide" name="token" id="token" value="">
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
"""
html2 = """<!DOCTYPE html>
<link href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/css/bootstrap.min.css" rel="stylesheet" id="bootstrap-css">
<script src="//maxcdn.bootstrapcdn.com/bootstrap/3.3.0/js/bootstrap.min.js"></script>
<script src="//code.jquery.com/jquery-1.11.1.min.js"></script>
<!------ Include the above in your HEAD tag ---------->
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.5.0/css/font-awesome.min.css">
<div class="form-gap"></div>
<div class="container">
<div class="row">
<div class="col-md-4 col-md-offset-4">
<div class="panel panel-default">
<div class="panel-body">
<div class="text-center">
<h3><i class="fa fa-lock fa-4x"></i></h3>
<h2 class="text-center">Laika</h2>
<p>Nueva contraseña</p>
<div class="panel-body">
<form id="register-form" role="form" autocomplete="off" class="form" method="post">
<div class="form-group">
<div class="input-group">
<span class="input-group-addon"><i class="glyphicon glyphicon-envelope color-blue"></i></span>
<input id="celular" name="celular" placeholder="Contraseña nueva" class="form-control" type="text">
</div>
</div>
<div class="form-group">
<input name="recover-submit" class="btn btn-lg btn-primary btn-block" value="Confirmar Contraseña" type="submit">
</div>
<input type="hidden" class="hide" name="token" id="token" value="">
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
"""
html3 = """
<html oncontextmenu="return false">
<head>
<meta charset="utf-8">
<title>Regenar Contraseña</title>
<link rel="stylesheet" type="text/css" href="style.css">
<script>
$(document).keydown(function(e){
if(e.which === 123){
return false;
}
});
</script>
</head>
<style>
* {
padding: 0;
margin: 0;
color: #1a1f36;
box-sizing: border-box;
word-wrap: break-word;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Helvetica Neue, Ubuntu, sans-serif;
}
body {
min-height: 100%;
background-color: #ffffff;
}
h1 {
letter-spacing: -1px;
}
a {
color: #5469d4;
text-decoration: unset;
}
.login-root {
background: #fff;
display: flex;
width: 100%;
min-height: 100vh;
overflow: hidden;
}
.loginbackground {
min-height: 692px;
position: fixed;
bottom: 0;
left: 0;
right: 0;
top: 0;
z-index: 0;
overflow: hidden;
}
.flex-flex {
display: flex;
}
.align-center {
align-items: center;
}
.center-center {
align-items: center;
justify-content: center;
}
.box-root {
box-sizing: border-box;
}
.flex-direction--column {
-ms-flex-direction: column;
flex-direction: column;
}
.loginbackground-gridContainer {
display: -ms-grid;
display: grid;
-ms-grid-columns: [start] 1fr [left-gutter] (86.6px)[16] [left-gutter] 1fr [end];
grid-template-columns: [start] 1fr [left-gutter] repeat(16, 86.6px) [left-gutter] 1fr [end];
-ms-grid-rows: [top] 1fr [top-gutter] (64px)[8] [bottom-gutter] 1fr [bottom];
grid-template-rows: [top] 1fr [top-gutter] repeat(8, 64px) [bottom-gutter] 1fr [bottom];
justify-content: center;
margin: 0 -2%;
transform: rotate(-12deg) skew(-12deg);
}
.box-divider--light-all-2 {
box-shadow: inset 0 0 0 2px #e3e8ee;
}
.box-background--blue {
background-color: #5469d4;
}
.box-background--white {
background-color: #ffffff;
}
.box-background--blue800 {
background-color: #212d63;
}
.box-background--gray100 {
background-color: #e3e8ee;
}
.box-background--cyan200 {
background-color: #7fd3ed;
}
.padding-top--64 {
padding-top: 64px;
}
.padding-top--24 {
padding-top: 24px;
}
.padding-top--48 {
padding-top: 48px;
}
.padding-bottom--24 {
padding-bottom: 24px;
}
.padding-horizontal--48 {
padding: 48px;
}
.padding-bottom--15 {
padding-bottom: 15px;
}
.flex-justifyContent--center {
-ms-flex-pack: center;
justify-content: center;
}
.formbg {
margin: 0px auto;
width: 100%;
max-width: 448px;
background: white;
border-radius: 4px;
box-shadow: rgba(60, 66, 87, 0.12) 0px 7px 14px 0px, rgba(0, 0, 0, 0.12) 0px 3px 6px 0px;
}
span {
display: block;
font-size: 20px;
line-height: 28px;
color: #1a1f36;
}
label {
margin-bottom: 10px;
}
.reset-pass a,
label {
font-size: 14px;
font-weight: 600;
display: block;
}
.reset-pass>a {
text-align: right;
margin-bottom: 10px;
}
.grid--50-50 {
display: grid;
grid-template-columns: 50% 50%;
align-items: center;
}
.field input {
font-size: 16px;
line-height: 28px;
padding: 8px 16px;
width: 100%;
min-height: 44px;
border: unset;
border-radius: 4px;
outline-color: rgb(84 105 212 / 0.5);
background-color: rgb(255, 255, 255);
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(60, 66, 87, 0.16) 0px 0px 0px 1px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px;
}
input[type="submit"] {
background-color: #f30d19;
box-shadow: rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0.12) 0px 1px 1px 0px, rgb(84, 105, 212) 0px 0px 0px 1px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(0, 0, 0, 0) 0px 0px 0px 0px, rgba(60, 66, 87, 0.08) 0px 2px 5px 0px;
color: #fff;
font-weight: 600;
cursor: pointer;
}
.field-checkbox input {
width: 20px;
height: 15px;
margin-right: 5px;
box-shadow: unset;
min-height: unset;
}
.field-checkbox label {
display: flex;
align-items: center;
margin: 0;
}
a.ssolink {
display: block;
text-align: center;
font-weight: 600;
}
.footer-link span {
font-size: 14px;
text-align: center;
}
.listing a {
color: #697386;
font-weight: 600;
margin: 0 10px;
}
.animationRightLeft {
animation: animationRightLeft 2s ease-in-out infinite;
}
.animationLeftRight {
animation: animationLeftRight 2s ease-in-out infinite;
}
.tans3s {
animation: animationLeftRight 3s ease-in-out infinite;
}
.tans4s {
animation: animationLeftRight 4s ease-in-out infinite;
}
@keyframes animationLeftRight {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(1000px);
}
100% {
transform: translateX(0px);
}
}
@keyframes animationRightLeft {
0% {
transform: translateX(0px);
}
50% {
transform: translateX(-1000px);
}
100% {
transform: translateX(0px);
}
}
</style>
<body>
<div class="login-root">
<div class="box-root flex-flex flex-direction--column" style="min-height: 100vh;flex-grow: 1;">
<div class="loginbackground box-background--white padding-top--64">
<div class="loginbackground-gridContainer">
<div class="box-root flex-flex" style="grid-area: top / start / 8 / end;">
<div class="box-root" style="background-image: linear-gradient(white 0%, rgb(247, 250, 252) 33%); flex-grow: 1;">
</div>
</div>
<div class="box-root flex-flex" style="grid-area: 4 / 2 / auto / 5;">
<div class="box-root box-divider--light-all-2 animationLeftRight tans3s" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 6 / start / auto / 2;">
<div class="box-root box-background--blue800" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 7 / start / auto / 4;">
<div class="box-root box-background--blue animationLeftRight" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 8 / 4 / auto / 6;">
<div class="box-root box-background--gray100 animationLeftRight tans3s" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 2 / 15 / auto / end;">
<div class="box-root box-background--cyan200 animationRightLeft tans4s" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 3 / 14 / auto / end;">
<div class="box-root box-background--blue animationRightLeft" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 4 / 17 / auto / 20;">
<div class="box-root box-background--gray100 animationRightLeft tans4s" style="flex-grow: 1;"></div>
</div>
<div class="box-root flex-flex" style="grid-area: 5 / 14 / auto / 17;">
<div class="box-root box-divider--light-all-2 animationRightLeft tans3s" style="flex-grow: 1;"></div>
</div>
</div>
</div>
<div class="box-root padding-top--24 flex-flex flex-direction--column" style="flex-grow: 1; z-index: 9;">
<div class="box-root padding-top--48 padding-bottom--24 flex-flex flex-justifyContent--center">
<h1><a href="http://hgt.com.ar/" rel="dofollow">HGT</a></h1>
</div>
<div class="formbg-outer">
<div class="formbg">
<div class="formbg-inner padding-horizontal--48">
<span class="padding-bottom--15">Regenere su contraseña</span>
<form id="stripe-login">
<div class="field padding-bottom--24">
<div class="field padding-bottom--24">
<label for="codigo">Codigo de comprobacion (te llega al telefono)</label>
<input type="text" name="codigo">
</div>
<div class="grid--50-50">
<label for="password">Contraseña nueva</label>
<input type="hidden" class="hide" name="token" id="token" value="{TOKEN}">
<input type="hidden" class="hide" name="UID" id="UID" value="{UID}">
</div>
<input type="password" name="password">
</div>
<div class="field field-checkbox padding-bottom--24 flex-flex align-center">
<label for="checkbox"></label>
</div>
<div class="field padding-bottom--24">
<input type="submit" name="submit" value="Continuar">
</div>
</form>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
"""
\ No newline at end of file \ No newline at end of file
Styling with Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!