47 lines
1.1 KiB
Python
47 lines
1.1 KiB
Python
import logging
|
|
import uuid
|
|
from dataclasses import asdict
|
|
from datetime import datetime, timedelta
|
|
|
|
import bcrypt
|
|
import jwt
|
|
|
|
import config
|
|
from users.classes import User
|
|
|
|
|
|
def generate_uid(username: str) -> str:
|
|
uid_bytes = (username + uuid.uuid4().hex).encode("utf-8")
|
|
uid_hash = bcrypt.hashpw(uid_bytes, bcrypt.gensalt())
|
|
return uid_hash.decode("utf-8")
|
|
|
|
|
|
def generate_token(user: User) -> str:
|
|
user.last_activity = datetime.now()
|
|
user_dict = asdict(user)
|
|
encoded_jwt = jwt.encode(user_dict, config.SECRET, algorithm="HS256")
|
|
return encoded_jwt
|
|
|
|
|
|
def decode_token(token: str) -> User | None:
|
|
decoded_dict = jwt.decode(token, config.SECRET, algorithms="HS256")
|
|
decoded_dict["last_activity"] = decoded_dict["_last_activity_str"]
|
|
del decoded_dict["_last_activity_str"]
|
|
try:
|
|
return User(**decoded_dict)
|
|
except Exception as e:
|
|
logging.error(e)
|
|
return None
|
|
|
|
|
|
def is_inactive_too_long(user: User) -> bool:
|
|
dt1 = user.last_activity
|
|
dt2 = datetime.now()
|
|
|
|
diff = dt2 - dt1
|
|
max_diff = timedelta(hours=config.MAX_USER_INACTIVE_HOURS)
|
|
|
|
if diff > max_diff:
|
|
return True
|
|
return False
|