add restart storage
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
import asyncio
|
||||
import hashlib
|
||||
import json
|
||||
import secrets
|
||||
import logging
|
||||
from datetime import datetime, timedelta
|
||||
from pathlib import Path
|
||||
from typing import Dict, Optional
|
||||
|
||||
from config.settings import settings
|
||||
@@ -10,6 +12,7 @@ from config.settings import settings
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
ADMIN_PASSWORD = settings.ADMIN_PASSWORD
|
||||
_SESSIONS_FILE = Path("data/sessions.json")
|
||||
|
||||
|
||||
class AuthManager:
|
||||
@@ -22,6 +25,7 @@ class AuthManager:
|
||||
self._max_attempts = 5
|
||||
self._lockout_duration = 300
|
||||
self._session_timeout = timedelta(minutes=session_timeout_minutes)
|
||||
self._restore_sessions()
|
||||
|
||||
@staticmethod
|
||||
def _hash_password(password: str, salt: str = None) -> tuple:
|
||||
@@ -53,14 +57,37 @@ class AuthManager:
|
||||
self._sessions[user_id] = datetime.now()
|
||||
self._roles[user_id] = "admin" if is_admin else "user"
|
||||
self._failed_attempts.pop(user_id, None)
|
||||
self._save_sessions()
|
||||
logger.info(f"User {user_id} logged in as {self._roles[user_id]}")
|
||||
|
||||
def logout(self, user_id: int):
|
||||
self._sessions.pop(user_id, None)
|
||||
self._roles.pop(user_id, None)
|
||||
self._failed_attempts.pop(user_id, None)
|
||||
self._save_sessions()
|
||||
logger.info(f"User {user_id} logged out")
|
||||
|
||||
def _save_sessions(self) -> None:
|
||||
try:
|
||||
_SESSIONS_FILE.parent.mkdir(parents=True, exist_ok=True)
|
||||
data = {str(uid): role for uid, role in self._roles.items()}
|
||||
_SESSIONS_FILE.write_text(json.dumps(data), encoding="utf-8")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to save sessions: {e}")
|
||||
|
||||
def _restore_sessions(self) -> None:
|
||||
try:
|
||||
if not _SESSIONS_FILE.exists():
|
||||
return
|
||||
data = json.loads(_SESSIONS_FILE.read_text(encoding="utf-8"))
|
||||
for uid_str, role in data.items():
|
||||
uid = int(uid_str)
|
||||
self._sessions[uid] = datetime.now()
|
||||
self._roles[uid] = role
|
||||
logger.info(f"Restored {len(data)} sessions")
|
||||
except Exception as e:
|
||||
logger.warning(f"Failed to restore sessions: {e}")
|
||||
|
||||
def is_locked_out(self, user_id: int) -> bool:
|
||||
if user_id not in self._failed_attempts:
|
||||
return False
|
||||
|
||||
Reference in New Issue
Block a user