File size: 4,156 Bytes
c58df45
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
import os
from azure.cosmos import CosmosClient, exceptions
from azure.cosmos.exceptions import CosmosHttpResponseError
import bcrypt
import base64
from ..database.sql_db import (
    get_user,
    get_student_user,
    get_admin_user,
    get_teacher_user,
    create_student_user,
    update_student_user,
    delete_student_user
)

import logging

logger = logging.getLogger(__name__)

# ... (c贸digo de inicializaci贸n)
def clean_and_validate_key(key):
    key = key.strip()
    while len(key) % 4 != 0:
        key += '='
    try:
        base64.b64decode(key)
        return key
    except:
        raise ValueError("La clave proporcionada no es v谩lida")

# Verificar las variables de entorno
endpoint = os.getenv("COSMOS_ENDPOINT")
key = os.getenv("COSMOS_KEY")

if not endpoint or not key:
    raise ValueError("Las variables de entorno COSMOS_ENDPOINT y COSMOS_KEY deben estar configuradas")

key = clean_and_validate_key(key)
####################################################


def authenticate_user(username, password):
    try:
        user_item = get_user(username)
        if user_item and verify_password(user_item['password'], password):
            logger.info(f"Usuario autenticado: {username}, Rol: {user_item['role']}")
            return True, user_item['role']
        logger.warning(f"Autenticaci贸n fallida para el usuario: {username}")
        return False, None
    except Exception as e:
        logger.error(f"Error durante la autenticaci贸n del usuario: {str(e)}")
        return False, None

def authenticate_admin(username, password):
    return authenticate_user(username, password)

def authenticate_student(username, password):
    return authenticate_user(username, password)

def authenticate_teacher(username, password):
    return authenticate_user(username, password)

############################
def register_student(username, password, additional_info=None):
    try:
        if get_student_user(username):
            logger.warning(f"Intento de registro de estudiante existente: {username}")
            return False  # El estudiante ya existe

        success = create_student_user(username, password, additional_info)
        if success:
            logger.info(f"Nuevo estudiante registrado: {username}")
            return True
        else:
            logger.error(f"Error al registrar nuevo estudiante: {username}")
            return False
    except Exception as e:
        logger.error(f"Error al registrar estudiante: {str(e)}")
        return False

def update_student_info(username, new_info):
    try:
        success = update_student_user(username, new_info)
        if success:
            logger.info(f"Informaci贸n del estudiante actualizada: {username}")
            return True
        else:
            logger.error(f"Error al actualizar informaci贸n del estudiante: {username}")
            return False
    except Exception as e:
        logger.error(f"Error al actualizar informaci贸n del estudiante: {str(e)}")
        return False

def delete_student(username):
    try:
        success = delete_student_user(username)
        if success:
            logger.info(f"Estudiante eliminado: {username}")
            return True
        else:
            logger.error(f"Error al eliminar estudiante: {username}")
            return False
    except Exception as e:
        logger.error(f"Error al eliminar estudiante: {str(e)}")
        return False


# ... (funciones de hash y verificaci贸n de contrase帽a)

def hash_password(password):
    """Hash a password for storing."""
    return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

##################################################################################33

def verify_password(stored_password, provided_password):
    """Verify a stored password against one provided by user"""
    return bcrypt.checkpw(provided_password.encode('utf-8'), stored_password.encode('utf-8'))
######################################################################################################