# /opt/trueconf_bot/utils/ad_checker.py # Проверка членства пользователя в группах Active Directory from ldap3 import Server, Connection, ALL from utils.ad_search import search_by_filter as ad_search_all_bases def get_user_groups(cn: str) -> list[str] | None: """ Найти пользователя по CN и вернуть список групп. Ищет по всем OU из AD_BASES. Возвращает None если пользователь не найден. """ entries = ad_search_all_bases("(cn={})".format(cn), ["cn", "sAMAccountName", "memberOf"]) if not entries: return None entry = entries[0] return [str(g) for g in entry.memberOf] def check_group_membership(cn: str, group_pattern: str = "2FA") -> dict: """ Проверить членство пользователя в группе. Args: cn: CN пользователя (например 'Krivochenko_Denis_Sergeevich') group_pattern: подстрока для поиска в имени группы (по умолчанию '2FA') Returns: dict с полями: found: bool — найден ли пользователь cn: str | None — CN пользователя sam: str | None — sAMAccountName in_group: bool — в группе ли groups: list[str] — все группы matching_groups: list[str] — группы с паттерном """ groups = get_user_groups(cn) if groups is None: return { "found": False, "cn": None, "sam": None, "in_group": False, "groups": [], "matching_groups": [], } matching = [g for g in groups if group_pattern.upper() in g.upper()] return { "found": True, "cn": cn, "sam": groups[0].split(",")[0].split("=")[-1], # грубо из DN "in_group": len(matching) > 0, "groups": groups, "matching_groups": matching, }