-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdatabase.py
90 lines (70 loc) · 2.82 KB
/
database.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
import functools
from typing import Dict
import pyjson5
from data_objects import *
from singleton import Singleton
import bcrypt
def get_hashed_password(plain_text_password: str) -> str:
# Hash a password for the first time
# (Using bcrypt, the salt is saved into the hash itself)
return bcrypt.hashpw(plain_text_password.encode(), bcrypt.gensalt()).decode()
def check_password(plain_text_password: str, hashed_password: str) -> bool:
# Check hashed password. Using bcrypt, the salt is saved into the hash itself
return bcrypt.checkpw(plain_text_password.encode(), hashed_password.encode())
@functools.cache
def parse_database() -> tuple[list[KeyData], list[UserData]]:
with open("./passwords.json") as json_data:
d = pyjson5.load(json_data)
passwords: Dict[str, str] = {v["id"]: v["password"] for v in d["passwords"]}
with open("./database.json") as json_data:
d = pyjson5.load(json_data)
keys = [
KeyData(id=v["id"], rf_id=v["rf_id"], name=v["name"]) for v in d["keys"]
]
users = [
UserData(
id=v["id"],
rf_id=v["rf_id"],
name=v["name"],
username=v["username"],
password=passwords[v["id"]],
authorized_for=v["authorized_for"],
)
for v in d["users"]
]
return keys, users
class KeysDB(Singleton):
_keys_by_id: Dict[str, KeyData]
_keys_by_rf_id: Dict[str, KeyData]
def __init__(self):
keys, _ = parse_database()
self._keys_by_id = {v.id: v for v in keys}
self._keys_by_rf_id = {v.rf_id: v for v in keys}
def by_id(self, k_id: str) -> KeyData | None:
return self._keys_by_id.get(k_id)
def by_rf_id(self, rf_id: str) -> KeyData | None:
return self._keys_by_rf_id.get(rf_id)
class UsersDB(Singleton):
_users_by_id: Dict[str, UserData]
_users_by_rf_id: Dict[str, UserData]
_users_by_username: Dict[str, UserData]
def __init__(self):
_, users = parse_database()
self._users_by_id = {v.id: v for v in users}
self._users_by_rf_id = {v.rf_id: v for v in users}
self._users_by_username = {v.username: v for v in users}
def by_id(self, k_id: str) -> UserData | None:
return self._users_by_id.get(k_id)
def by_rf_id(self, rf_id: str) -> UserData | None:
return self._users_by_rf_id.get(rf_id)
def by_username(self, username: str) -> UserData | None:
return self._users_by_username.get(username)
def by_username_check_password(
self, username: str, password: str
) -> UserData | None:
user = self._users_by_username.get(username)
if user is None:
return None
if check_password(password, user.password):
return user
return None