-
Notifications
You must be signed in to change notification settings - Fork 0
/
dbUsuarios.py
161 lines (132 loc) · 4.46 KB
/
dbUsuarios.py
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
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
from os import path
from datetime import datetime
from werkzeug.security import generate_password_hash, check_password_hash
import dateutil.parser
import copy
import json
import random
import string
DATAFOLDER = "data/"
DATAUSERS = DATAFOLDER + "usuarios.json"
def iniciaFicheroUsuarios(usr, pwd):
# Obtiene el contenido de 'usuarios.json'
# Si el fichero no existe lo crea
if not path.exists(DATAUSERS):
now = datetime.now()
password = generate_password_hash(pwd)
data = {}
data[usr] = {'password': password, 'admin': True,
'data': getNombreFicheroAleatorio(), 'createDate': now, 'accessDate': now}
guardaUsuarios(data)
return None
def CodificaFechaHora(obj):
# Para usar en JSON.DUMP: Convierte Fecha y Hora a texto en formato ISO
if isinstance(obj, datetime):
return obj.isoformat()
def DecodificaFechaHora(dct):
# Para usar en JSON.LOAD: Obtiene Fecha y Hora a partir de un texto en formato ISO
for k, v in dct.items():
if isinstance(v, str) and len(v) == 26:
try:
dct[k] = dateutil.parser.isoparse(v)
except:
pass
return dct
def getUsuarios():
# Obtiene el contenido de 'usuarios.json'
with open(DATAUSERS, 'r') as f:
data = json.load(f, object_hook=DecodificaFechaHora)
return data
def getUsuariosParcial():
# Obtiene el contenido de 'usuarios.json'
with open(DATAUSERS, 'r') as f:
data = json.load(f, object_hook=DecodificaFechaHora)
# Copia los datos de usuarios omitiendo datos confidenciales y cambiando tipos de Fecha a Texto
usrs = []
for k, v in data.items():
usrs.append({'username': k, 'admin': v['admin'], 'createDate': v['createDate'].strftime(
"%Y-%m-%d %H:%M"), 'accessDate': v['accessDate'].strftime("%Y-%m-%d %H:%M")})
usuarios = sorted(usrs, key=lambda p: p['username'])
return usuarios
def guardaUsuarios(data):
# Guarda el contenido de 'usuarios.json'
with open(DATAUSERS, 'w') as f:
json.dump(data, f, indent=True, default=CodificaFechaHora)
def getNombreFicheroAleatorio():
# Obtiene un nombre de fichero con 12 letras aleatorias
letras = string.ascii_lowercase
while True:
txt = ''.join(random.choice(letras) for i in range(12))
txt = 'data.' + txt + '.json'
if not path.exists(DATAFOLDER + txt):
break
return txt
def getDatosUsuario(usr):
# Obtiene los datos de un usuario
data = getUsuarios()
user = usr.strip().lower()
usuario = copy.deepcopy(data[user])
del usuario['password']
return usuario
def getFicheroUsuario(usr):
# Obtiene el nombre del fichero de datos de un usuario
data = getUsuarios()
user = usr.strip().lower()
return data[user]['data']
def login(user, pwd):
# Comprueba si existe un usuario con su contraseña y hace login
data = getUsuarios()
ok = user in data
if ok:
ok = check_password_hash(data[user]['password'], pwd)
if ok:
data[user]['accessDate'] = datetime.now()
guardaUsuarios(data)
if ok:
usuario = copy.deepcopy(data[user])
del usuario['password']
return usuario
else:
return None
def register(user, pwd):
# Registra un nuevo usuario
data = getUsuarios()
ok = user not in data
if ok and len(user) > 4 and len(pwd) > 4:
now = datetime.now()
password = generate_password_hash(pwd)
data[user] = {'password': password, 'admin': False,
'data': getNombreFicheroAleatorio(), 'createDate': now, 'accessDate': now}
guardaUsuarios(data)
usuario = copy.deepcopy(data[user])
del usuario['password']
return usuario
else:
return None
def check(user, pwd):
# Comprueba si existe un usuario con su contraseña
data = getUsuarios()
ok = user in data
if ok:
ok = check_password_hash(data[user]['password'], pwd)
return ok
def putPassword(user, pwd):
# Cambia contraseña
data = getUsuarios()
ok = user in data
if ok and len(pwd) > 4:
data[user]['password'] = generate_password_hash(pwd)
guardaUsuarios(data)
return True
else:
return False
def deleteUsuario(user):
# Eliminar usuario
data = getUsuarios()
ok = user in data
if ok and not data[user]['admin']:
del data[user]
guardaUsuarios(data)
return True
else:
return False