From 99fd5ebe88ccf57df63a6b82f53497d0ee02540c Mon Sep 17 00:00:00 2001 From: Admin Date: Tue, 13 Oct 2026 12:28:44 +0400 Subject: [PATCH] =?UTF-8?q?feat(security):=20=D0=BE=D0=B3=D1=80=D0=B0?= =?UTF-8?q?=D0=BD=D0=B8=D1=87=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=98=D0=98-?= =?UTF-8?q?=D1=8E=D1=80=D0=B8=D1=81=D1=82=D0=B0=20=D1=82=D0=BE=D0=BB=D1=8C?= =?UTF-8?q?=D0=BA=D0=BE=20=D0=B4=D0=BB=D1=8F=20=D0=B0=D0=B4=D0=BC=D0=B8?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=B8=20=D0=BF=D0=BE=D0=BB=D1=8C=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D1=82=D0=B5=D0=BB=D0=B5=D0=B9=20=D1=81=20=D0=BF?= =?UTF-8?q?=D1=80=D0=B0=D0=B2=D0=BE=D0=BC=20has=5Fai=5Faccess?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- handlers/legal_advisor.py | 40 +++++++++++++++++++++++++++++++++++---- 1 file changed, 36 insertions(+), 4 deletions(-) diff --git a/handlers/legal_advisor.py b/handlers/legal_advisor.py index af94ca6..a4b52a1 100644 --- a/handlers/legal_advisor.py +++ b/handlers/legal_advisor.py @@ -106,6 +106,14 @@ async def determine_user_role(user_id: int) -> str: @router.message(F.text.casefold().startswith(("/юрист", "/jurist"))) async def cmd_legal_advisor(message: Message, state: FSMContext, bot: Bot): role = await determine_user_role(message.from_user.id) + if role not in ("admin", "lawyer"): + await message.answer( + "🔒 Модуль юридической аналитики находится в режиме калибровки Советом Дома.\n\n" + "Доступ открывается индивидуально администратором (@ktybdsq).\n" + "Если вам требуется консультация по протечкам, тарифам или судебным спорам — напишите председателю Совета Дома.", + parse_mode='HTML' + ) + return # Проверяем, не задал ли пользователь вопрос прямо в команде: /юрист Какой срок ответа? parts = (message.text or "").split(maxsplit=1) @@ -125,7 +133,6 @@ async def cmd_legal_advisor(message: Message, state: FSMContext, bot: Bot): role_desc = { "admin": "👑 Режим Стратегического Аналитика (Администратор)", "lawyer": "⚖️ Режим Судебного Юриста (Совет дома / Активист)", - "resident": "🏡 Соседский Юридический Помощник" }.get(role, "🏡 Юридический Помощник") text = ( @@ -141,10 +148,18 @@ async def cmd_legal_advisor(message: Message, state: FSMContext, bot: Bot): async def cb_legal_advisor(callback: CallbackQuery, state: FSMContext): await callback.answer() role = await determine_user_role(callback.from_user.id) + if role not in ("admin", "lawyer"): + await callback.message.answer( + "🔒 Модуль юридической аналитики находится в режиме калибровки Советом Дома.\n\n" + "Доступ открывается индивидуально администратором (@ktybdsq).\n" + "Если вам требуется консультация по протечкам, тарифам или судебным спорам — напишите председателю Совета Дома.", + parse_mode='HTML' + ) + return + role_desc = { "admin": "👑 Режим Стратегического Аналитика (Администратор)", "lawyer": "⚖️ Режим Судебного Юриста (Совет дома / Активист)", - "resident": "🏡 Соседский Юридический Помощник" }.get(role, "🏡 Юридический Помощник") text = ( @@ -162,6 +177,15 @@ async def cb_legal_advisor(callback: CallbackQuery, state: FSMContext): async def process_text_legal_question(message: Message, state: FSMContext, bot: Bot): user_id = message.from_user.id role = await determine_user_role(user_id) + if role not in ("admin", "lawyer"): + await message.answer( + "🔒 Модуль юридической аналитики находится в режиме калибровки Советом Дома.\n\n" + "Доступ открывается индивидуально администратором (@ktybdsq).", + parse_mode='HTML' + ) + await state.clear() + return + question = message.text status_msg = await message.answer( @@ -197,18 +221,26 @@ async def process_text_legal_question(message: Message, state: FSMContext, bot: ) else: # В личном диалоге отвечаем напрямую - header = f"⚖️ Юридический совет ({result.get('latency_sec')} сек):" + header = f"⚖️ Юридический ответ ({result.get('latency_sec')} сек):" await send_split_message(message, header, result["text"]) await state.clear() -# === ОБРАБОТКА ГОЛОСОВЫХ ВОПРОСОВ (НА ТИВНОЕ МУЛЬТИМОДАЛЬНОЕ РАСПОЗНАВАНИЕ) === +# === ОБРАБОТКА ГОЛОСОВЫХ ВОПРОСОВ (НАТИВНОЕ МУЛЬТИМОДАЛЬНОЕ РАСПОЗНАВАНИЕ) === @router.message(LegalQuestionState.waiting_for_question, F.voice) @router.message(F.voice & F.chat.type == "private") async def process_voice_legal_question(message: Message, state: FSMContext, bot: Bot): user_id = message.from_user.id role = await determine_user_role(user_id) + if role not in ("admin", "lawyer"): + await message.answer( + "🔒 Модуль юридической аналитики находится в режиме калибровки Советом Дома.\n\n" + "Доступ открывается индивидуально администратором (@ktybdsq).", + parse_mode='HTML' + ) + await state.clear() + return status_msg = await message.answer( "🎙 Слушаю голосовое сообщение и сопоставляю с законами РФ...",