09b19f9ced
- config.py: AD_BASE -> AD_BASES (кортеж OU) - utils/ad_search.py: новая утилита для поиска по всем OU - utils/ad_checker.py: использовать ad_search - utils/otp_service.py: использовать ad_search - lk/handlers.py: использовать ad_search - transcription_bot/handlers.py: использовать ad_search - service_desk/handlers.py: использовать ad_search - instruct/handlers.py: использовать ad_search - photo_bot/ad_helper.py: использовать ad_search - photo_bot/check_ad_photo.py: использовать ad_search - check_ad_2fa.py: использовать ad_search - debug_ad_filter.py: обновить для AD_BASES - lk/test_lk_payslip.py: обновить для AD_BASES
60 lines
2.1 KiB
Python
60 lines
2.1 KiB
Python
# /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,
|
|
}
|