File size: 3,438 Bytes
e09caf0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
from flask import Blueprint, render_template, request, redirect, url_for, session, flash
from models.usuario import UsuarioModel
import random
import string
import base64
from io import BytesIO
from captcha.image import ImageCaptcha # Librer铆a para generar im谩genes captcha

# Blueprint para Autenticaci贸n (Login/Logout)
auth_bp = Blueprint('auth', __name__)
model = UsuarioModel()

# Funci贸n para generar un captcha de imagen mas moderno
def generar_captcha_imagen():
    # Generar una cadena aleatoria de 4 caracteres (letras y n煤meros)
    caracteres = string.ascii_uppercase + string.digits
    captcha_text = ''.join(random.choice(caracteres) for _ in range(4))
    session['captcha_text'] = captcha_text # Guardar en sesi贸n para validar
    
    # Crear la imagen con la librer铆a
    image = ImageCaptcha(width=200, height=80)
    data = image.generate(captcha_text)
    
    # Convertir la imagen a Base64 para enviarla al HTML sin archivos temporales
    buffered = BytesIO()
    buffered.write(data.getvalue())
    img_str = base64.b64encode(buffered.getvalue()).decode()
    return f"data:image/png;base64,{img_str}"

# Ruta para Login
@auth_bp.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        # Validar Captcha Primero
        captcha_user = request.form.get('captcha_input', '').upper()
        if not captcha_user or captcha_user != session.get('captcha_text'):
            flash('C贸digo de seguridad incorrecto. Int茅ntalo de nuevo.')
            return redirect(url_for('auth.login'))

        usuario = request.form['usuario']
        password = request.form['password']
        
        user = model.login(usuario, password)
        
        if user:
            session['user_id'] = user['idusuario']
            session['username'] = user['usuario']
            return redirect(url_for('persona.index'))
        else:
            flash('Usuario o contrase帽a incorrectos')
            
    captcha_img = generar_captcha_imagen()
    return render_template('login.html', captcha_img=captcha_img)

# Ruta para Registro
@auth_bp.route('/registro', methods=['GET', 'POST'])
def registro():
    if request.method == 'POST':
        # Validar Captcha
        captcha_user = request.form.get('captcha_input', '').upper()
        if not captcha_user or captcha_user != session.get('captcha_text'):
            flash('C贸digo de seguridad incorrecto. Int茅ntalo de nuevo.')
            return render_template('registro.html', captcha_img=generar_captcha_imagen())

        usuario = request.form['usuario']
        password = request.form['password']
        confirm_password = request.form['confirm_password']
        
        if password != confirm_password:
            flash('Las contrase帽as no coinciden')
        else:
            success, message = model.registrar(usuario, password)
            if success:
                flash(message)
                return redirect(url_for('auth.login'))
            else:
                flash(message)
                
    captcha_img = generar_captcha_imagen()
    return render_template('registro.html', captcha_img=captcha_img)



# Ruta para cerrar sesi贸n

@auth_bp.route('/logout')
def logout():
    # Limpiar todos los datos de la sesi贸n
    session.clear()
    # Redirigir al login
    return redirect(url_for('auth.login'))