diff --git a/src/bot/message_handlers.py b/src/bot/message_handlers.py index a8cfee2..d01f61a 100644 --- a/src/bot/message_handlers.py +++ b/src/bot/message_handlers.py @@ -58,21 +58,31 @@ async def get_accounts( async def delete_all(bot: AsyncTeleBot, engine: Engine, mes: Message) -> None: await base_handler(bot, mes) + master_pass = db.get.get_master_pass(engine, mes.from_user.id) + if master_pass is None: + await send_tmp_message(bot, mes.chat.id, "У вас нет мастер пароля") + return bot_mes = await bot.send_message( mes.chat.id, "Вы действительно хотите удалить все ваши аккаунты? Это действие " "нельзя отменить. " - "Отправьте YES для подтверждения", + "Отправьте мастер пароль для подтверждения", + ) + register_state( + mes, functools.partial(_delete_all2, bot, engine, master_pass, bot_mes) ) - register_state(mes, functools.partial(_delete_all2, bot, engine, bot_mes)) async def _delete_all2( - bot: AsyncTeleBot, engine: Engine, prev_mes: Message, mes: Message + bot: AsyncTeleBot, + engine: Engine, + master_pass: db.models.MasterPass, + prev_mes: Message, + mes: Message, ) -> None: await base_handler(bot, mes, prev_mes) text = mes.text.strip() - if text == "YES": + if encryption.master_pass.check_master_pass(text, master_pass): db.delete.purge_accounts(engine, mes.from_user.id) db.delete.delete_master_pass(engine, mes.from_user.id) await send_tmp_message( @@ -85,7 +95,7 @@ async def _delete_all2( await send_tmp_message( bot, mes.chat.id, - "Вы отправили не YES, ничего не удалено", + "Вы отправили не верный мастер пароль, ничего не удалено", ) @@ -134,7 +144,8 @@ async def reset_master_pass( ) -> None: await base_handler(bot, mes) - if db.get.get_master_pass(engine, mes.from_user.id) is None: + master_pass = db.get.get_master_pass(engine, mes.from_user.id) + if master_pass is None: return await send_tmp_message( bot, mes.chat.id, @@ -143,17 +154,48 @@ async def reset_master_pass( bot_mes = await bot.send_message( mes.chat.id, - "Отправьте новый мастер пароль, осторожно, все текущие аккаунты " - "будут удалены навсегда", + "Отправьте текущий мастер пароль", ) register_state( mes, - functools.partial(_reset_master_pass2, bot, engine, bot_mes), + functools.partial( + _reset_master_pass2, + bot, + engine, + master_pass, + bot_mes, + ), ) async def _reset_master_pass2( + bot: AsyncTeleBot, + engine: Engine, + master_pass: db.models.MasterPass, + prev_mes: Message, + mes: Message, +) -> None: + await base_handler(bot, mes, prev_mes) + text = mes.text.strip() + if text == "/cancel": + await send_tmp_message(bot, mes.chat.id, "Успешная отмена") + + if not encryption.master_pass.check_master_pass(text, master_pass): + await send_tmp_message(bot, mes.chat.id, "Неверный мастер пароль") + return + + bot_mes = await bot.send_message( + mes.chat.id, + "Отправьте новый мастер пароль. Осторожно, все аккаунты будут удалены", + ) + register_state( + mes, + functools.partial(_reset_master_pass3, bot, engine, bot_mes), + ) + + +async def _reset_master_pass3( bot: AsyncTeleBot, engine: Engine, prev_mes: Message, mes: Message ) -> None: await base_handler(bot, mes, prev_mes) @@ -428,13 +470,14 @@ async def delete_account( register_state( mes, - functools.partial(_delete_account2, bot, engine, bot_mes), + functools.partial(_delete_account2, bot, engine, master_pass, bot_mes), ) async def _delete_account2( bot: AsyncTeleBot, engine: Engine, + master_pass: db.models.MasterPass, prev_mes: Message, mes: Message, ): @@ -448,27 +491,36 @@ async def _delete_account2( bot_mes = await bot.send_message( mes.from_user.id, - f'Вы уверены, что хотите удалить аккаунт "{text}"?\nОтправьте YES для ' - "подтверждения", + f'Вы уверены, что хотите удалить аккаунт "{text}"?\nОтправьте мастер ' + "пароль для подтверждения", ) register_state( mes, - functools.partial(_delete_account3, bot, engine, bot_mes, text), + functools.partial( + _delete_account3, + bot, + engine, + master_pass, + bot_mes, + text, + ), ) async def _delete_account3( bot: AsyncTeleBot, engine: Engine, + master_pass: db.models.MasterPass, prev_mes: Message, account_name: str, mes: Message, ) -> None: await base_handler(bot, mes, prev_mes) text = mes.text.strip() - if text != "YES": - return await send_tmp_message(bot, mes.chat.id, "Успешная отмена") + if not encryption.master_pass.check_master_pass(text, master_pass): + await send_tmp_message(bot, mes.chat.id, "Неверный пароль") + return db.delete.delete_account(engine, mes.from_user.id, account_name) await send_tmp_message(bot, mes.chat.id, "Аккаунт удалён")