@ -6,25 +6,24 @@ import telebot
from sqlalchemy . future import Engine
from . . import cryptography , database
from . utils import (
accounts_to_json ,
base_handler ,
get_all_accounts ,
json_to_accounts ,
send_tmp_message ,
)
Message = telebot . types . Message
def _send_tmp_message (
bot : telebot . TeleBot , chat_id : telebot . types . Message , text : str , timeout : int = 5
) - > None :
bot_mes = bot . send_message ( chat_id , text , parse_mode = " MarkdownV2 " )
time . sleep ( timeout )
bot . delete_message ( chat_id , bot_mes . id )
def get_accounts (
bot : telebot . TeleBot , engine : Engine , mes : telebot . types . Message
) - > None :
accounts = database . get . get_accounts ( engine , mes . from_user . id )
bot . delete_message ( mes . chat . id , mes . id )
return _ send_tmp_message(
return send_tmp_message (
bot ,
mes . chat . id ,
" Ваши аккаунты: \n " + " \n " . join ( accounts ) if accounts else " У вас нет аккаунтов" ,
@ -32,16 +31,10 @@ def get_accounts(
)
def _base ( bot : telebot . TeleBot , mes : Message , prev_mes : Message | None = None ) - > None :
bot . delete_message ( mes . chat . id , mes . id )
if prev_mes is not None :
bot . delete_message ( prev_mes . chat . id , prev_mes . id )
def delete_all (
bot : telebot . TeleBot , engine : Engine , mes : telebot . types . Message
) - > None :
_ base( bot , mes )
base_handler ( bot , mes )
bot_mes = bot . send_message (
mes . chat . id ,
" Вы действительно хотите удалить все ваши аккаунты? Это действие нельзя отменить. Отправьте YES для подтверждения " ,
@ -54,20 +47,20 @@ def delete_all(
def _delete_all (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " YES " :
database . delete . purge_accounts ( engine , mes . from_user . id )
database . delete . delete_master_pass ( engine , mes . from_user . id )
_ send_tmp_message( bot , mes . chat . id , " Всё успешно удалено " , timeout = 10 )
send_tmp_message( bot , mes . chat . id , " Всё успешно удалено " , timeout = 10 )
else :
_ send_tmp_message( bot , mes . chat . id , " Вы отправили не YES, ничего не удалено " )
send_tmp_message( bot , mes . chat . id , " Вы отправили не YES, ничего не удалено " )
def set_master_password ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
_ base( bot , mes , None )
base_handler ( bot , mes , None )
if database . get . get_master_pass ( engine , mes . from_user . id ) is not None :
return _ send_tmp_message( bot , mes . chat . id , " Мастер пароль уже существует " )
return send_tmp_message( bot , mes . chat . id , " Мастер пароль уже существует " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте мастер пароль " )
bot . register_next_step_handler (
mes , functools . partial ( _set_master_pass2 , bot , engine , bot_mes )
@ -77,22 +70,22 @@ def set_master_password(bot: telebot.TeleBot, engine: Engine, mes: Message) -> N
def _set_master_pass2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
hash_ , salt = cryptography . master_pass . encrypt_master_pass ( text )
database . add . add_master_pass ( engine , mes . from_user . id , salt , hash_ )
_ send_tmp_message( bot , mes . chat . id , " Успех " )
send_tmp_message( bot , mes . chat . id , " Успех " )
del mes , text
gc . collect ( )
def reset_master_pass ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
_ base( bot , mes )
base_handler ( bot , mes )
if database . get . get_master_pass ( engine , mes . from_user . id ) is None :
return _ send_tmp_message( bot , mes . chat . id , " Мастер пароль не задан " )
return send_tmp_message( bot , mes . chat . id , " Мастер пароль не задан " )
bot_mes = bot . send_message (
mes . chat . id ,
" Отправьте новый мастер пароль, осторожно, все текущие аккаунты будут удалены навсегда " ,
@ -105,15 +98,15 @@ def reset_master_pass(bot: telebot.TeleBot, engine: Engine, mes: Message) -> Non
def _reset_master_pass2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
hash_ , salt = cryptography . master_pass . encrypt_master_pass ( text )
database . delete . purge_accounts ( engine , mes . from_user . id )
database . change . change_master_pass ( engine , mes . from_user . id , salt , hash_ )
_ send_tmp_message(
send_tmp_message(
bot , mes . chat . id , " В с е ваши аккаунты удалены, а мастер пароль изменён"
)
del mes , text
@ -121,11 +114,11 @@ def _reset_master_pass2(
def add_account ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
_ base( bot , mes )
base_handler ( bot , mes )
master_password_from_db = database . get . get_master_pass ( engine , mes . from_user . id )
if master_password_from_db is None :
return _ send_tmp_message( bot , mes . chat . id , " Нет мастер пароля " )
return send_tmp_message( bot , mes . chat . id , " Нет мастер пароля " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте название аккаунта " )
@ -137,13 +130,13 @@ def add_account(bot: telebot.TeleBot, engine: Engine, mes: Message) -> None:
def _add_account2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
if text in database . get . get_accounts ( engine , mes . from_user . id ) :
return _ send_tmp_message(
return send_tmp_message(
bot , mes . chat . id , " Аккаунт с таким именем уже существует "
)
@ -162,10 +155,10 @@ def _add_account3(
data : dict [ str , str ] ,
mes : Message ,
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
data [ " login " ] = text
@ -183,10 +176,10 @@ def _add_account4(
data : dict [ str , str ] ,
mes : Message ,
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
data [ " passwd " ] = text
@ -204,14 +197,14 @@ def _add_account5(
data : dict [ str , str ] ,
mes : Message ,
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
salt , hash_ = database . get . get_master_pass ( engine , mes . from_user . id )
if cryptography . master_pass . encrypt_master_pass ( text , salt ) != hash_ :
return _ send_tmp_message( bot , mes . chat . id , " Н е подходит главный пароль" )
return send_tmp_message( bot , mes . chat . id , " Н е подходит главный пароль" )
name , login , passwd = data [ " name " ] , data [ " login " ] , data [ " passwd " ]
@ -223,7 +216,7 @@ def _add_account5(
engine , mes . from_user . id , name , salt , enc_login , enc_pass
)
_ send_tmp_message(
send_tmp_message(
bot , mes . chat . id , " Успех " if result else " Произошла не предвиденная ошибка "
)
@ -233,7 +226,7 @@ def _add_account5(
def get_account ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
_ base( bot , mes )
base_handler ( bot , mes )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте название аккаунта " )
bot . register_next_step_handler (
mes , functools . partial ( _get_account2 , bot , engine , bot_mes )
@ -243,13 +236,13 @@ def get_account(bot: telebot.TeleBot, engine: Engine, mes: Message) -> None:
def _get_account2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
if text not in database . get . get_accounts ( engine , mes . from_user . id ) :
return _ send_tmp_message( bot , mes . chat . id , " Нет такого аккаунта " )
return send_tmp_message( bot , mes . chat . id , " Нет такого аккаунта " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте мастер пароль " )
bot . register_next_step_handler (
@ -260,19 +253,19 @@ def _get_account2(
def _get_account3 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , name : str , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
master_pass = database . get . get_master_pass ( engine , mes . from_user . id )
if master_pass is None :
return _ send_tmp_message( bot , mes . chat . id , " Нет мастер пароля " )
return send_tmp_message( bot , mes . chat . id , " Нет мастер пароля " )
master_salt , hash_pass = master_pass
if cryptography . master_pass . encrypt_master_pass ( text , master_salt ) != hash_pass :
return _ send_tmp_message( bot , mes . chat . id , " Н е подходит мастер пароль" )
return send_tmp_message( bot , mes . chat . id , " Н е подходит мастер пароль" )
salt , enc_login , enc_pass = database . get . get_account_info (
engine , mes . from_user . id , name
@ -280,7 +273,7 @@ def _get_account3(
login , passwd = cryptography . other_accounts . decrypt_account_info (
enc_login , enc_pass , text . encode ( " utf-8 " ) , salt
)
_ send_tmp_message(
send_tmp_message(
bot ,
mes . chat . id ,
f " Логин: \n ` { login } ` \n Пароль: \n ` { passwd } ` \n Нажмите на логин или пароль, чтобы скопировать " ,
@ -292,7 +285,7 @@ def _get_account3(
def delete_account ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
_ base( bot , mes )
base_handler ( bot , mes )
bot_mes = bot . send_message (
mes . chat . id , " Отправьте название аккаунта, который вы хотите удалить "
)
@ -305,16 +298,16 @@ def delete_account(bot: telebot.TeleBot, engine: Engine, mes: Message) -> None:
def _delete_account2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
_ base( bot , mes , prev_mes )
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return _ send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
return send_tmp_message( bot , mes . chat . id , " Успешная отмена " )
if text not in database . get . get_accounts ( engine , mes . from_user . id ) :
return _ send_tmp_message( bot , mes . chat . id , " Нет такого аккаунта " )
return send_tmp_message( bot , mes . chat . id , " Нет такого аккаунта " )
database . delete . delete_account ( engine , mes . from_user . id , text )
_ send_tmp_message( bot , mes . chat . id , " Аккаунт удалён " )
send_tmp_message( bot , mes . chat . id , " Аккаунт удалён " )
def help ( bot : telebot . TeleBot , mes : telebot . types . Message ) - > None :
@ -327,9 +320,126 @@ def help(bot: telebot.TeleBot, mes: telebot.types.Message) -> None:
/ delete_all - удалить все аккаунты и мастер пароль
/ reset_master_pass - удалить все аккаунты и изменить мастер пароль
/ cancel - отмена текущего действия
/ help - помощь """
/ help - помощь
/ export - получить пароли в json формате
/ import - импортировать пароли из json в файле в таком же формате , как из / export """
bot . send_message ( mes . chat . id , message )
def cancel ( bot : telebot . TeleBot , mes : Message ) - > None :
_send_tmp_message ( bot , mes . chat . id , " Нет активного действия " )
send_tmp_message ( bot , mes . chat . id , " Нет активного действия " )
def export ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
base_handler ( bot , mes )
master_password_from_db = database . get . get_master_pass ( engine , mes . from_user . id )
if master_password_from_db is None :
return send_tmp_message ( bot , mes . chat . id , " Нет мастер пароля " )
if not database . get . get_accounts ( engine , mes . from_user . id ) :
return send_tmp_message ( bot , mes . chat . id , " Нет аккаунтов " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте мастер пароль " )
bot . register_next_step_handler (
mes , functools . partial ( _export2 , bot , engine , bot_mes )
)
def _export2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return send_tmp_message ( bot , mes . chat . id , " Успешная отмена " )
master_salt , hash_pass = database . get . get_master_pass ( engine , mes . from_user . id )
if cryptography . master_pass . encrypt_master_pass ( text , master_salt ) != hash_pass :
return send_tmp_message ( bot , mes . chat . id , " Н е подходит мастер пароль" )
accounts = get_all_accounts ( engine , mes . from_user . id , text )
json_io = accounts_to_json ( accounts )
bot_mes = bot . send_document ( mes . chat . id , json_io )
del text , accounts , json_io
gc . collect ( )
time . sleep ( 30 )
bot . delete_message ( bot_mes . chat . id , bot_mes . id )
def import_accounts ( bot : telebot . TeleBot , engine : Engine , mes : Message ) - > None :
base_handler ( bot , mes )
master_password_from_db = database . get . get_master_pass ( engine , mes . from_user . id )
if master_password_from_db is None :
return send_tmp_message ( bot , mes . chat . id , " Нет мастер пароля " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте json файл " )
bot . register_next_step_handler (
mes , functools . partial ( _import2 , bot , engine , bot_mes )
)
def _import2 (
bot : telebot . TeleBot , engine : Engine , prev_mes : Message , mes : Message
) - > None :
base_handler ( bot , mes , prev_mes )
if mes . text is not None :
text = mes . text . strip ( )
if text == " /cancel " :
return send_tmp_message ( bot , mes . chat . id , " Успешная отмена " )
if mes . document is None :
send_tmp_message ( bot , mes . chat . id , " Вы должны отправить документ " )
file_info = bot . get_file ( mes . document . file_id )
downloaded_file = bot . download_file ( file_info . file_path )
try :
accounts = json_to_accounts ( downloaded_file . decode ( " utf-8 " ) )
except Exception :
send_tmp_message ( bot , mes . chat . id , " Ошибка во время работы с файлом " )
bot_mes = bot . send_message ( mes . chat . id , " Отправьте мастер пароль " )
bot . register_next_step_handler (
mes , functools . partial ( _import3 , bot , engine , bot_mes , accounts )
)
def _import3 (
bot : telebot . TeleBot ,
engine : Engine ,
prev_mes : Message ,
accounts : list [ tuple [ str , str , str ] ] ,
mes : Message ,
) - > None :
base_handler ( bot , mes , prev_mes )
text = mes . text . strip ( )
if text == " /cancel " :
return send_tmp_message ( bot , mes . chat . id , " Успешная отмена " )
master_salt , hash_pass = database . get . get_master_pass ( engine , mes . from_user . id )
if cryptography . master_pass . encrypt_master_pass ( text , master_salt ) != hash_pass :
return send_tmp_message ( bot , mes . chat . id , " Н е подходит мастер пароль" )
failed : list [ str ] = [ ]
for account in accounts :
name , login , passwd = account
enc_login , enc_passwd , salt = cryptography . other_accounts . encrypt_account_info (
login , passwd , text . encode ( " utf-8 " )
)
result = database . add . add_account (
engine , mes . from_user . id , name , salt , enc_login , enc_passwd
)
if not result :
failed . append ( name )
if failed :
mes_text = " Н е удалось добавить:\n " + " \n " . join ( failed )
else :
mes_text = " Успех "
send_tmp_message ( bot , mes . chat . id , mes_text , 10 )
del text , mes , accounts
gc . collect ( )