add AD 2FA group check to instruct Trueconf module

This commit is contained in:
Денис Кривоченко
2026-07-21 23:47:35 +07:00
parent be12045fa8
commit 8fa42206aa
3 changed files with 149 additions and 2 deletions
+33 -1
View File
@@ -3,6 +3,7 @@ from utils.texts import (
EMOJI_DIGITS,
INSTRUCT_MAIN_MENU_TEXT,
INSTRUCT_TRUECONF_TEXT,
INSTRUCT_TRUECONF_WITH_AD,
INSTRUCT_EMAIL_TEXT,
)
import logging
@@ -20,6 +21,35 @@ logger = logging.getLogger(__name__)
router = Router()
def _get_user_cn(user_id: str) -> str:
"""
Получить CN пользователя из AD по его user_id (email или логин).
user_id из TrueConf — это обычно email, например 'ds.krivochenko@sibcem.ru'
"""
from ldap3 import Server, Connection, ALL
from config.config import AD_SERVER, AD_USER, AD_PASSWORD, AD_BASE
from ldap3.utils.conv import escape_filter_chars
try:
server = Server(AD_SERVER, get_info=ALL)
conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True)
safe_id = escape_filter_chars(user_id)
short_username = user_id.split('@')[0] if '@' in user_id else user_id
search_filter = (
f"(&(objectClass=user)(|"
f"(mail={safe_id})"
f"(userPrincipalName={safe_id})"
f"(userPrincipalName={escape_filter_chars(f'{short_username}@sibcem.ru')}))"
f"(sAMAccountName={escape_filter_chars(short_username)})))"
)
conn.search(AD_BASE, search_filter, attributes=["cn", "sAMAccountName"])
if conn.entries:
return str(conn.entries[0].cn)
except Exception as e:
logger.error(f"Ошибка получения CN из AD для {user_id}: {e}")
return user_id # fallback — используем user_id как CN
@router.message()
async def instruct_router_handler(msg: Message):
user_id = msg.from_user.id
@@ -55,7 +85,9 @@ async def instruct_router_handler(msg: Message):
elif cmd == "1":
log_menu_stats(user_id, "Инструкции", "Trueconf")
set_state(user_id, "INSTRUCT_TRUECONF_VIEW")
await msg.answer(INSTRUCT_TRUECONF_TEXT, parse_mode="html")
cn = _get_user_cn(user_id)
text = INSTRUCT_TRUECONF_WITH_AD(EMOJI_DIGITS, cn)
await msg.answer(text, parse_mode="html")
elif cmd == "2":
log_menu_stats(user_id, "Инструкции", "Почта")
set_state(user_id, "INSTRUCT_EMAIL_VIEW")