Crear middleware para conexiones

This commit is contained in:
Mauricio Baeza 2017-09-30 23:14:44 -05:00
parent a8133a15e4
commit 009c6de608
8 changed files with 174 additions and 33 deletions

View File

@ -21,6 +21,7 @@ class AppLogin(object):
if result['login']:
session.save()
session['user'] = result['user']
session['rfc'] = values['rfc']
req.context['result'] = result
resp.status = falcon.HTTP_200

View File

@ -5,11 +5,12 @@ import getpass
import json
import mimetypes
import os
import sqlite3
import uuid
import bcrypt
from settings import template_lookup, PATH_CP
from settings import log, template_lookup, PATH_CP, COMPANIES
def _get_hash(password):
@ -32,7 +33,55 @@ def get_pass():
msg = 'La contraseña es necesaria'
return False, msg
return True, _get_hash(password)
return True, password
def get_value(arg):
value = input('Introduce el {}: '.format(arg)).strip()
if not value:
msg = 'El {} es requerido'.format(arg)
log.error(msg)
return ''
return value
def _get_args(rfc):
con = sqlite3.connect(COMPANIES)
cursor = con.cursor()
sql = "SELECT con FROM names WHERE rfc=?"
cursor.execute(sql, (rfc,))
values = cursor.fetchone()
if values is None:
msg = 'No se encontró el RFC'
log.error(msg)
return ''
cursor.close()
con.close()
return values[0]
def get_con(rfc=''):
if not rfc:
rfc = get_value('RFC').upper()
if not rfc:
return False
args = _get_args(rfc.upper())
if not args:
return False
return loads(args)
def get_rfcs():
con = sqlite3.connect(COMPANIES)
cursor = con.cursor()
sql = "SELECT * FROM names"
cursor.execute(sql)
values = cursor.fetchall()
cursor.close()
con.close()
return values
def now():
@ -74,6 +123,10 @@ def dumps(data):
return json.dumps(data, default=str)
def loads(data):
return json.loads(data)
def clean(values):
for k, v in values.items():
if isinstance(v, str):

View File

@ -3,7 +3,13 @@
import falcon
from beaker.middleware import SessionMiddleware
from middleware import AuthMiddleware, JSONTranslator, static, handle_404
from middleware import (
AuthMiddleware,
JSONTranslator,
ConnectionMiddleware,
static,
handle_404
)
from models.db import StorageEngine
from controllers.main import (
AppLogin, AppLogout, AppAdmin, AppMain,
@ -14,7 +20,8 @@ from settings import DEBUG
db = StorageEngine()
#~ partners = AppPartners(db)
api = falcon.API(middleware=[AuthMiddleware(), JSONTranslator()])
api = falcon.API(
middleware=[AuthMiddleware(), JSONTranslator(), ConnectionMiddleware()])
api.req_options.auto_parse_form_urlencoded = True
api.add_sink(handle_404, '')

View File

@ -2,6 +2,7 @@
import falcon
from controllers import util
from models import main
from settings import PATH_STATIC
@ -43,3 +44,19 @@ class JSONTranslator(object):
if 'result' not in req.context:
return
resp.body = util.dumps(req.context['result'])
class ConnectionMiddleware(object):
#~ def process_request(self, req, resp):
def process_resource(self, req, resp, resource, params):
id_session = req.cookies.get('beaker.session.id', '')
session = req.env['beaker.session']
rfc = session.get('rfc', '')
if id_session and rfc:
opt = util.get_con(rfc)
main.conectar(opt)
def process_response(self, req, resp, resource):
main.desconectar()

View File

@ -6,10 +6,12 @@ from . import main
class StorageEngine(object):
def __init__(self):
main.conectar()
#~ main.conectar()
pass
def authenticate(self, args):
return main.authenticate(args['usuario'], args['contra'])
#~ return main.authenticate(args['usuario'], args['contra'])
return main.authenticate(args)
def get_partners(self, values):
return main.get_partners(values)

View File

@ -33,7 +33,7 @@ def conectar(opt):
if not db_type in db:
log.error('Tipo de base de datos no soportado')
return False
#~ print ('DB NAME', db_name)
database = db[db_type](db_name, **opt)
try:
database_proxy.initialize(database)
@ -46,6 +46,15 @@ def conectar(opt):
return False
def desconectar():
if database_proxy.obj is None:
return
if not database_proxy.is_closed():
database_proxy.close()
log.info('Desconectado a la BD...')
return
class Configuracion(BaseModel):
clave = TextField()
valor = TextField(default='')
@ -407,14 +416,19 @@ class FacturasImpuestos(BaseModel):
)
def authenticate(usuario, contraseña):
def authenticate(args):
respuesta = {'login': False, 'msg': 'No Autorizado', 'user': ''}
values = util.get_con(args['rfc'])
if not values:
return respuesta
conectar(values)
try:
obj = Usuarios.get(usuario=usuario, es_activo=True)
obj = Usuarios.get(usuario=args['usuario'], es_activo=True)
except Usuarios.DoesNotExist:
return respuesta
if not obj.contraseña.check_password(contraseña):
if not obj.contraseña.check_password(args['contra']):
return respuesta
obj.ultimo_ingreso = util.now()
@ -423,6 +437,7 @@ def authenticate(usuario, contraseña):
respuesta['login'] = True
respuesta['user'] = str(obj)
respuesta['super'] = obj.es_superusuario
#~ desconectar()
return respuesta
@ -494,16 +509,6 @@ def _init_values():
def _crear_tablas():
rfc = input('Introduce el RFC: ').strip().upper()
if not rfc:
msg = 'El RFC es requerido'
log.error(msg)
return
opt = _get_con(rfc)
if not conectar(opt):
return
tablas = [Addendas, Categorias, Certificado, CondicionesPago, Configuracion,
Emisor, Facturas, FacturasDetalle, FacturasImpuestos, Folios, Productos,
SATAduanas, SATFormaPago, SATImpuestos, SATMonedas, SATRegimenes,
@ -515,7 +520,7 @@ def _crear_tablas():
]
database_proxy.create_tables(tablas, True)
log.info('Tablas creadas correctamente...')
return
return True
def migrate_tables():
@ -525,7 +530,11 @@ def migrate_tables():
def _agregar_superusuario():
conectar()
args = util.get_con()
if not args:
return
conectar(args)
usuario = input('Introduce el nuevo nombre para el superusuario: ').strip()
if not usuario:
msg = 'El nombre de usuario es requerido'
@ -548,7 +557,11 @@ def _agregar_superusuario():
def _cambiar_contraseña():
conectar()
args = util.get_con()
if not args:
return
conectar(args)
usuario = input('Introduce el nombre de usuario: ').strip()
if not usuario:
msg = 'El nombre de usuario es requerido'
@ -574,6 +587,24 @@ def _cambiar_contraseña():
return
def _add_emisor(rfc, args):
con = sqlite3.connect(COMPANIES)
cursor = con.cursor()
sql = """
INSERT INTO names
VALUES (?, ?)"""
try:
cursor.execute(sql, (rfc, args))
except sqlite3.IntegrityError as e:
log.error(e)
return False
con.commit()
cursor.close()
con.close()
return True
def _agregar_rfc():
rfc = input('Introduce el nuevo RFC: ').strip().upper()
if not rfc:
@ -592,10 +623,21 @@ def _agregar_rfc():
log.error('Datos de conexión incompletos')
return
if conectar(opt):
log.info('RFC agregado correctamente...')
else:
log.error('No se pudo agregar el RFC')
args = opt.copy()
if conectar(args):
if _add_emisor(rfc, util.dumps(opt)) and _crear_tablas():
log.info('RFC agregado correctamente...')
return
log.error('No se pudo agregar el RFC')
return
def _listar_rfc():
data = util.get_rfcs()
for row in data:
msg = 'RFC: {}\n\t{}'.format(row[0], row[1])
log.info(msg)
return
@ -605,10 +647,12 @@ help_migrate_db = 'Migra las tablas en la base de datos'
help_superuser = 'Crea un nuevo super usuario'
help_change_pass = 'Cambia la contraseña a un usuario'
help_rfc = 'Agrega un nuevo RFC'
help_br = 'Elimina un RFC'
help_lr = 'Listar RFCs'
@click.command(context_settings=CONTEXT_SETTINGS)
@click.option('-bd', '--iniciar-bd',help=help_create_tables,
is_flag=True, default=False)
#~ @click.option('-bd', '--iniciar-bd',help=help_create_tables,
#~ is_flag=True, default=False)
@click.option('-m', '--migrar-bd', help=help_migrate_db,
is_flag=True, default=False)
@click.option('-ns', '--nuevo-superusuario', help=help_superuser,
@ -616,12 +660,15 @@ help_rfc = 'Agrega un nuevo RFC'
@click.option('-cc', '--cambiar-contraseña', help=help_change_pass,
is_flag=True, default=False)
@click.option('-rfc', '--rfc', help=help_rfc, is_flag=True, default=False)
def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña, rfc):
@click.option('-br', '--borrar-rfc', help=help_br, is_flag=True, default=False)
@click.option('-lr', '--listar-rfc', help=help_lr, is_flag=True, default=False)
def main(migrar_bd, nuevo_superusuario, cambiar_contraseña, rfc, borrar_rfc,
listar_rfc):
opt = locals()
if opt['iniciar_bd']:
_crear_tablas()
sys.exit(0)
#~ if opt['iniciar_bd']:
#~ _crear_tablas()
#~ sys.exit(0)
if opt['migrar_bd']:
migrate_tables()
@ -639,6 +686,14 @@ def main(iniciar_bd, migrar_bd, nuevo_superusuario, cambiar_contraseña, rfc):
_agregar_rfc()
sys.exit(0)
if opt['borrar_rfc']:
_borrar_rfc()
sys.exit(0)
if opt['listar_rfc']:
_listar_rfc()
sys.exit(0)
return

Binary file not shown.

View File

@ -1,7 +1,11 @@
var msg_rfc = 'El RFC es requerido'
var msg_user = 'El usuario es requerido'
var msg_pass = 'La contraseña es requerida'
var form_controls = [
{view: 'text', label: 'RFC', id: 'txt_rfc', name: 'rfc',
labelPosition: 'top', required: true, invalidMessage: msg_rfc},
{view: 'text', label: 'Usuario', id: 'txt_usuario', name: 'usuario',
labelPosition: 'top', required: true, invalidMessage: msg_user},
{view: 'text', label: 'Contraseña', id: 'txt_contra', name: 'contra',
@ -13,6 +17,7 @@ var form_controls = [
var msg_header = 'Bienvenido a Empresa Libre'
var ui_login = {
rows: [
{maxHeight: 50},
@ -28,6 +33,7 @@ var ui_login = {
width: 400,
elements: form_controls,
rules:{
rfc:function(value){ return value.trim() != '';},
usuario:function(value){ return value.trim() != '';},
contra:function(value){ return value.trim() != '';},
}