fix
This commit is contained in:
+20
-118
@@ -33,7 +33,6 @@ from services.payment_service import HelketPayment
|
||||
from services.twitch_api import get_viewer_count
|
||||
from auth.manager import AuthManager
|
||||
from auth.storage import AuthStorage
|
||||
from auth import ADMIN_PASSWORD
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
@@ -75,7 +74,7 @@ class BotInterface:
|
||||
self._menu_top_msg: Dict[int, int] = {} # user_id -> reply keyboard message_id
|
||||
self._chat_history: Dict[int, list] = {}
|
||||
self._bot_ref = bot_ref
|
||||
self._waiting_password: Dict[int, str] = {} # user_id -> "register" or "login"
|
||||
self._waiting_password: Dict[int, str] = {} # user_id -> "admin_upgrade"
|
||||
self._start_time = datetime.now()
|
||||
|
||||
async def _update_commands(self):
|
||||
@@ -102,74 +101,12 @@ class BotInterface:
|
||||
await interface._show_main_menu(message)
|
||||
return
|
||||
|
||||
if interface.auth_manager.is_authenticated(user_id):
|
||||
await interface._show_user_menu(message)
|
||||
return
|
||||
|
||||
exists = await interface.auth_storage.user_exists(user_id)
|
||||
if exists:
|
||||
sent = await message.answer("С возвращением! Введите пароль:")
|
||||
interface._waiting_password[user_id] = "login"
|
||||
else:
|
||||
sent = await message.answer(
|
||||
"Добро пожаловать!\n\nПридумайте пароль для входа (мин. 4 символа):"
|
||||
)
|
||||
interface._waiting_password[user_id] = "register"
|
||||
interface._menu_msg[user_id] = sent.message_id
|
||||
|
||||
@dp.message(Command("register"))
|
||||
async def cmd_register(message: Message):
|
||||
"""Регистрация: /register <пароль>"""
|
||||
await interface._safe_delete(message.bot, message.chat.id, message.message_id)
|
||||
parts = message.text.split(maxsplit=1)
|
||||
if len(parts) < 2 or len(parts[1]) < 4:
|
||||
await interface._send_temp(message, "❌ Использование: /register <пароль от 4 символов>")
|
||||
return
|
||||
password = parts[1]
|
||||
user_id = message.from_user.id
|
||||
exists = await interface.auth_storage.user_exists(user_id)
|
||||
if exists:
|
||||
await interface._send_temp(message, "⚠️ Вы уже зарегистрированы. Используйте /login <пароль>")
|
||||
return
|
||||
password_hash, salt = interface.auth_manager._hash_password(password)
|
||||
await interface.auth_storage.register(user_id, password_hash, salt)
|
||||
is_admin = (password == ADMIN_PASSWORD)
|
||||
interface.auth_manager.login(user_id, is_admin=is_admin)
|
||||
if is_admin:
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
else:
|
||||
await interface._show_user_menu(message)
|
||||
|
||||
@dp.message(Command("login"))
|
||||
async def cmd_login(message: Message):
|
||||
"""Вход: /login <пароль>"""
|
||||
await interface._safe_delete(message.bot, message.chat.id, message.message_id)
|
||||
parts = message.text.split(maxsplit=1)
|
||||
if len(parts) < 2:
|
||||
await interface._send_temp(message, "❌ Использование: /login <пароль>")
|
||||
return
|
||||
password = parts[1]
|
||||
user_id = message.from_user.id
|
||||
user_data = await interface.auth_storage.get_user(user_id)
|
||||
if not user_data:
|
||||
await interface._send_temp(message, "❌ Вы не зарегистрированы.\nИспользуйте /register <пароль>")
|
||||
return
|
||||
if interface.auth_manager.is_locked_out(user_id):
|
||||
await interface._send_temp(message, "🔒 Слишком много попыток. Попробуйте позже.")
|
||||
return
|
||||
if password == ADMIN_PASSWORD:
|
||||
interface.auth_manager.login(user_id, is_admin=True)
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
elif interface.auth_manager.verify_password(
|
||||
password, user_data["password_hash"], user_data["salt"]
|
||||
):
|
||||
# Пароля для входа нет — личность подтверждает сам Telegram.
|
||||
# Первый /start заодно регистрирует пользователя.
|
||||
await interface.auth_storage.register(user_id)
|
||||
if not interface.auth_manager.is_authenticated(user_id):
|
||||
interface.auth_manager.login(user_id, is_admin=False)
|
||||
await interface._show_user_menu(message)
|
||||
else:
|
||||
interface.auth_manager.record_failed_attempt(user_id)
|
||||
await interface._send_temp(message, "❌ Неверный пароль")
|
||||
await interface._show_user_menu(message)
|
||||
|
||||
@dp.message(Command("logout"))
|
||||
async def cmd_logout(message: Message):
|
||||
@@ -1345,62 +1282,27 @@ class BotInterface:
|
||||
await message.answer(f"❌ Не удалось отправить: {e}")
|
||||
return
|
||||
|
||||
# Ввод пароля (неавторизованный пользователь ждёт пароль)
|
||||
# Ввод пароля администратора (единственный оставшийся пароль)
|
||||
if user_id in interface._waiting_password:
|
||||
if not text:
|
||||
return
|
||||
# Пароль удаляем немедленно
|
||||
await interface._safe_delete(message.bot, message.chat.id, message.message_id)
|
||||
mode = interface._waiting_password.pop(user_id)
|
||||
interface._waiting_password.pop(user_id)
|
||||
|
||||
if mode == "register":
|
||||
if len(text) < 4:
|
||||
sent = await message.answer("Пароль слишком короткий, мин. 4 символа:")
|
||||
interface._menu_msg[user_id] = sent.message_id
|
||||
interface._waiting_password[user_id] = "register"
|
||||
return
|
||||
password_hash, salt = interface.auth_manager._hash_password(text)
|
||||
await interface.auth_storage.register(user_id, password_hash, salt)
|
||||
is_admin = (text == ADMIN_PASSWORD)
|
||||
interface.auth_manager.login(user_id, is_admin=is_admin)
|
||||
if is_admin:
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
else:
|
||||
await interface._show_user_menu(message)
|
||||
if interface.auth_manager.is_locked_out(user_id):
|
||||
await interface._send_temp(message, "🔒 Слишком много попыток. Попробуйте позже.")
|
||||
return
|
||||
|
||||
elif mode == "login":
|
||||
user_data = await interface.auth_storage.get_user(user_id)
|
||||
if not user_data:
|
||||
await interface._send_temp(message, "Вы не зарегистрированы")
|
||||
return
|
||||
if interface.auth_manager.is_locked_out(user_id):
|
||||
await interface._send_temp(message, "Слишком много попыток, попробуйте позже")
|
||||
return
|
||||
if text == ADMIN_PASSWORD:
|
||||
interface.auth_manager.login(user_id, is_admin=True)
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
elif interface.auth_manager.verify_password(
|
||||
text, user_data["password_hash"], user_data["salt"]
|
||||
):
|
||||
interface.auth_manager.login(user_id, is_admin=False)
|
||||
await interface._show_user_menu(message)
|
||||
else:
|
||||
interface.auth_manager.record_failed_attempt(user_id)
|
||||
sent = await message.answer("Неверный пароль, попробуйте ещё раз:")
|
||||
interface._menu_msg[user_id] = sent.message_id
|
||||
interface._waiting_password[user_id] = "login"
|
||||
|
||||
elif mode == "admin_upgrade":
|
||||
if text == ADMIN_PASSWORD:
|
||||
interface.auth_manager.login(user_id, is_admin=True)
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
else:
|
||||
sent = await message.answer("Неверный пароль администратора:")
|
||||
interface._menu_msg[user_id] = sent.message_id
|
||||
interface._waiting_password[user_id] = "admin_upgrade"
|
||||
if interface.auth_manager.verify_admin_password(text):
|
||||
interface.auth_manager.login(user_id, is_admin=True)
|
||||
await interface._update_commands()
|
||||
await interface._show_main_menu(message)
|
||||
else:
|
||||
interface.auth_manager.record_failed_attempt(user_id)
|
||||
sent = await message.answer("Неверный пароль администратора:")
|
||||
interface._menu_msg[user_id] = sent.message_id
|
||||
interface._waiting_password[user_id] = "admin_upgrade"
|
||||
return
|
||||
|
||||
# Ввод шагов создания задачи (пользователь)
|
||||
|
||||
Reference in New Issue
Block a user