This commit is contained in:
Yuriy Yuriev
2026-07-18 18:33:54 +07:00
parent 6264b24f8f
commit 8bdd0c784e
3 changed files with 44 additions and 152 deletions
+9 -22
View File
@@ -1,51 +1,38 @@
"""
Хранилище учётных данных пользователей.
Хранилище зарегистрированных пользователей.
"""
import asyncio
import json
import logging
from datetime import datetime
from pathlib import Path
from typing import Optional, Dict
logger = logging.getLogger(__name__)
class AuthStorage:
"""Хранилище паролей пользователей в JSON-файле."""
"""Реестр пользователей бота в JSON-файле.
Паролей не хранит: личность подтверждает Telegram, идентификатором
служит user_id.
"""
def __init__(self, file_path: str = "data/users.json"):
self.file_path = Path(file_path)
self.file_path.parent.mkdir(parents=True, exist_ok=True)
self._lock = asyncio.Lock()
async def register(self, user_id: int, password_hash: str, salt: str) -> bool:
async def register(self, user_id: int) -> bool:
async with self._lock:
data = await asyncio.to_thread(self._load_sync)
if str(user_id) in data:
return False
data[str(user_id)] = {"password_hash": password_hash, "salt": salt}
data[str(user_id)] = {"registered_at": datetime.now().isoformat()}
await asyncio.to_thread(self._save_sync, data)
logger.info(f"User {user_id} registered")
return True
async def get_user(self, user_id: int) -> Optional[Dict]:
async with self._lock:
data = await asyncio.to_thread(self._load_sync)
return data.get(str(user_id))
async def change_password(self, user_id: int, new_hash: str, new_salt: str) -> bool:
async with self._lock:
data = await asyncio.to_thread(self._load_sync)
user_str = str(user_id)
if user_str not in data:
return False
data[user_str]["password_hash"] = new_hash
data[user_str]["salt"] = new_salt
await asyncio.to_thread(self._save_sync, data)
logger.info(f"User {user_id} changed password")
return True
async def delete_user(self, user_id: int) -> bool:
async with self._lock:
data = await asyncio.to_thread(self._load_sync)