AIdeaText commited on
Commit
5a3bf61
verified
1 Parent(s): 355977f

Upload 2 files

Browse files
Files changed (2) hide show
  1. modules/auth/__init__.py +0 -0
  2. modules/auth/auth.py +195 -0
modules/auth/__init__.py ADDED
File without changes
modules/auth/auth.py ADDED
@@ -0,0 +1,195 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ##########modules/auth/auth.py
2
+
3
+ import os
4
+ import streamlit as st
5
+ from azure.cosmos import CosmosClient, exceptions
6
+ from azure.cosmos.exceptions import CosmosHttpResponseError
7
+ import bcrypt
8
+ import base64
9
+ from ..database.sql_db import (
10
+ get_user,
11
+ get_student_user,
12
+ get_admin_user,
13
+ create_student_user,
14
+ update_student_user,
15
+ delete_student_user,
16
+ record_login,
17
+ record_logout
18
+ )
19
+
20
+ import logging
21
+
22
+ from datetime import datetime, timezone
23
+
24
+ logger = logging.getLogger(__name__)
25
+
26
+ def clean_and_validate_key(key):
27
+ """Limpia y valida la clave de CosmosDB"""
28
+ key = key.strip()
29
+ while len(key) % 4 != 0:
30
+ key += '='
31
+ try:
32
+ base64.b64decode(key)
33
+ return key
34
+ except:
35
+ raise ValueError("La clave proporcionada no es v谩lida")
36
+
37
+ # Verificar las variables de entorno
38
+ endpoint = os.getenv("COSMOS_ENDPOINT")
39
+ key = os.getenv("COSMOS_KEY")
40
+
41
+ if not endpoint or not key:
42
+ raise ValueError("Las variables de entorno COSMOS_ENDPOINT y COSMOS_KEY deben estar configuradas")
43
+
44
+ key = clean_and_validate_key(key)
45
+
46
+
47
+ def authenticate_user(username, password):
48
+ """Autentica un usuario y registra el inicio de sesi贸n"""
49
+ try:
50
+ user_item = get_user(username)
51
+
52
+ if not user_item:
53
+ logger.warning(f"Usuario no encontrado: {username}")
54
+ return False, None
55
+
56
+ if verify_password(user_item['password'], password):
57
+ logger.info(f"Usuario autenticado: {username}, Rol: {user_item['role']}")
58
+
59
+ try:
60
+ session_id = record_login(username)
61
+ if session_id:
62
+ st.session_state.session_id = session_id
63
+ st.session_state.username = username
64
+ st.session_state.login_time = datetime.now(timezone.utc).isoformat()
65
+ logger.info(f"Sesi贸n iniciada: {session_id}")
66
+ else:
67
+ logger.warning("No se pudo registrar la sesi贸n")
68
+ except Exception as e:
69
+ logger.error(f"Error al registrar inicio de sesi贸n: {str(e)}")
70
+
71
+ return True, user_item['role']
72
+
73
+ logger.warning(f"Contrase帽a incorrecta para usuario: {username}")
74
+ return False, None
75
+
76
+ except Exception as e:
77
+ logger.error(f"Error durante la autenticaci贸n del usuario: {str(e)}")
78
+ return False, None
79
+
80
+ def authenticate_student(username, password):
81
+ """Autentica un estudiante"""
82
+ success, role = authenticate_user(username, password)
83
+ if success and role == 'Estudiante':
84
+ return True, role
85
+ return False, None
86
+
87
+ def authenticate_admin(username, password):
88
+ """Autentica un administrador"""
89
+ success, role = authenticate_user(username, password)
90
+ if success and role == 'Administrador':
91
+ return True, role
92
+ return False, None
93
+
94
+ def register_student(username, password, additional_info=None):
95
+ """Registra un nuevo estudiante"""
96
+ try:
97
+ if get_student_user(username):
98
+ logger.warning(f"Estudiante ya existe: {username}")
99
+ return False
100
+
101
+ hashed_password = hash_password(password)
102
+
103
+ # Asegurarse que additional_info tenga el rol correcto
104
+ if not additional_info:
105
+ additional_info = {}
106
+ additional_info['role'] = 'Estudiante'
107
+
108
+ success = create_student_user(username, hashed_password, additional_info)
109
+ if success:
110
+ logger.info(f"Nuevo estudiante registrado: {username}")
111
+ return True
112
+
113
+ logger.error(f"Error al crear estudiante: {username}")
114
+ return False
115
+
116
+ except Exception as e:
117
+ logger.error(f"Error al registrar estudiante: {str(e)}")
118
+ return False
119
+
120
+ def update_student_info(username, new_info):
121
+ """Actualiza la informaci贸n de un estudiante"""
122
+ try:
123
+ if 'password' in new_info:
124
+ new_info['password'] = hash_password(new_info['password'])
125
+
126
+ success = update_student_user(username, new_info)
127
+ if success:
128
+ logger.info(f"Informaci贸n actualizada: {username}")
129
+ return True
130
+
131
+ logger.error(f"Error al actualizar: {username}")
132
+ return False
133
+
134
+ except Exception as e:
135
+ logger.error(f"Error en actualizaci贸n: {str(e)}")
136
+ return False
137
+
138
+ def delete_student(username):
139
+ """Elimina un estudiante"""
140
+ try:
141
+ success = delete_student_user(username)
142
+ if success:
143
+ logger.info(f"Estudiante eliminado: {username}")
144
+ return True
145
+
146
+ logger.error(f"Error al eliminar: {username}")
147
+ return False
148
+
149
+ except Exception as e:
150
+ logger.error(f"Error en eliminaci贸n: {str(e)}")
151
+ return False
152
+
153
+ def logout():
154
+ """Cierra la sesi贸n del usuario"""
155
+ try:
156
+ if 'session_id' in st.session_state and 'username' in st.session_state:
157
+ success = record_logout(
158
+ st.session_state.username,
159
+ st.session_state.session_id
160
+ )
161
+ if success:
162
+ logger.info(f"Sesi贸n cerrada: {st.session_state.username}")
163
+ else:
164
+ logger.warning(f"Error al registrar cierre de sesi贸n: {st.session_state.username}")
165
+
166
+ except Exception as e:
167
+ logger.error(f"Error en logout: {str(e)}")
168
+ finally:
169
+ st.session_state.clear()
170
+
171
+ def hash_password(password):
172
+ """Hashea una contrase帽a"""
173
+ return bcrypt.hashpw(
174
+ password.encode('utf-8'),
175
+ bcrypt.gensalt()
176
+ ).decode('utf-8')
177
+
178
+ def verify_password(stored_password, provided_password):
179
+ """Verifica una contrase帽a"""
180
+ return bcrypt.checkpw(
181
+ provided_password.encode('utf-8'),
182
+ stored_password.encode('utf-8')
183
+ )
184
+
185
+ __all__ = [
186
+ 'authenticate_user',
187
+ 'authenticate_admin',
188
+ 'authenticate_student',
189
+ 'register_student',
190
+ 'update_student_info',
191
+ 'delete_student',
192
+ 'logout',
193
+ 'hash_password',
194
+ 'verify_password'
195
+ ]