-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathuser.py
112 lines (89 loc) · 3.56 KB
/
user.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
# Questo modulo implementa una semplice versione di un database per gli utenti in memoria.
import uuid
import bcrypt
from enum import Enum
from datetime import datetime
from resultmsg import Result
import json
import utils
users = []
# Utenti sono memorizzati come dizionari.
# utente = {
# 'id': '123'
# 'name': 'giuseppe',
# 'surname': 'capasso',
# 'password': '123',
# 'email': '[email protected]'
# 'created': '5-03-2024',
# }
# Result è un'enumerazione. Serve a rendere più leggibile il codice. Ad esempio,
# potrei far ritornare 2 quando un utente non viene trovato, ma questo sarebbe poco leggibile.
# In python, le enumerazioni sono un particolare tipo di classe che ereditano da Enum.
def loadUsers(db_file):
usrdb = utils.fileDbReader(db_file)
if not usrdb:
usrdb = []
return usrdb
#Metodo di utilità per cercare un utente dato in ingresso l'email. Se non esiste viene ritornato None
def findUserByEmail(email: str) -> dict:
print(len(users))
for user in users:
if user['email'] == email:
return user
return None
#Metodo di utilità per cercare un utente dato in ingresso un ID. Se non esiste viene ritornato None
def findUserByID(id: str) -> dict:
bID = uuid.UUID(id)
for user in users:
if user['id'] == bID:
return user
return None
# SaveUser memorizza un utente nel sistema dopo la procedura di signin degli utenti.
# Prima controlla che non sia già registrato un utente con la stessa email, altrimenti ritorna un errore
# con la chiamata uuid.uuid4() si genera una stringa randomica che rappresenta l'ID dell'utente
# è fortemente sconsigliata la memorizzazione delle password degli utenti in chiaro, in quanto
# sarebbero accessibili da tutti. In questo caso utilizziamo il modulo bcrypt ("https://github.com/pyca/bcrypt/")
# Bcrypt fornisce due funzioni:
# hashpw: che ritorna una versione "hashata" della password
# chechpw: che effettua un confronto tra una password in chiaro e una hashata per vedere se corrispondono
# Alla fine viene creato un utente e inserito nella lista
def SaveUser(name: str, surname: str, email: str, password: str) -> (Result, dict):
if findUserByEmail(email) is None:
id = str(uuid.uuid4())
hashed = bcrypt.hashpw(password.encode('utf8'), bcrypt.gensalt())
user = {
"id": id,
"name": name,
"surname": surname,
"email": email,
"created": datetime.utcnow().isoformat(),
"password": hashed.decode("utf-8")
}
users.append(user.copy())
user['password'] = ''
#store
written = utils.fileDbWrite('users.db',users)
if not written:
return Result.NOT_FOUND, None
return Result.OK, user
else:
return Result.DUPLICATED, None
# La funzione login controlla che esiste un utente con l'email inserita ed usa la funzione bcrypt.checkpw per controllare che la password sia corretta.
def Login(email: str, password: str)-> (Result, dict):
u = findUserByEmail(email)
if u is not None and bcrypt.checkpw(password.encode('utf8'), u['password'].encode('utf8')):
res = u.copy()
res ['password'] = ''
return Result.OK, res
else:
return Result.NOT_AUTHORIZED, None
def DeleteUser(usr: str) -> (Result, dict):
u = findUserByEmail(usr)
if u is None:
return Result.NOT_FOUND
users.remove(u)
#store
written = utils.fileDbWrite('users.db',users)
if not written:
return Result.NOT_FOUND, None
return Result.OK