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
+15 -12
View File
@@ -1,8 +1,6 @@
import asyncio
import hashlib
import json
import secrets
import logging
import secrets
from datetime import datetime, timedelta
from pathlib import Path
from typing import Dict, Optional
@@ -16,7 +14,11 @@ _SESSIONS_FILE = Path("data/sessions.json")
class AuthManager:
"""Управляет авторизацией: хеширование паролей, сессии, верификация, роли."""
"""Управляет сессиями и ролями.
Личность пользователя подтверждает Telegram, поэтому пароля для входа нет.
ADMIN_PASSWORD остаётся единственным секретом — им повышают роль до admin.
"""
def __init__(self, session_timeout_minutes: int = 120):
self._sessions: Dict[int, datetime] = {}
@@ -28,15 +30,16 @@ class AuthManager:
self._restore_sessions()
@staticmethod
def _hash_password(password: str, salt: str = None) -> tuple:
if salt is None:
salt = secrets.token_hex(16)
result = hashlib.sha256((salt + password).encode()).hexdigest()
return result, salt
def verify_admin_password(password: str) -> bool:
"""Проверяет пароль администратора.
def verify_password(self, password: str, password_hash: str, salt: str) -> bool:
computed, _ = self._hash_password(password, salt)
return secrets.compare_digest(computed, password_hash)
Пустой ADMIN_PASSWORD означает, что админ-режим отключён — иначе
ненастроенный бот пускал бы в админку по пустой строке.
"""
if not ADMIN_PASSWORD:
logger.warning("ADMIN_PASSWORD not set — admin mode is disabled")
return False
return secrets.compare_digest(password, ADMIN_PASSWORD)
def is_authenticated(self, user_id: int) -> bool:
if user_id not in self._sessions: