AD: поиск по нескольким OU (AD_BASES)
- 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
This commit is contained in:
+15
-13
@@ -5,37 +5,39 @@ from ldap3 import Server, Connection, ALL, MODIFY_REPLACE
|
||||
|
||||
# Подтягиваем конфиг
|
||||
sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
|
||||
from config.config import AD_SERVER, AD_USER, AD_PASSWORD, AD_BASE
|
||||
from config.config import AD_SERVER, AD_USER, AD_PASSWORD
|
||||
from utils.ad_search import search_by_login as ad_search_all_bases
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
def upload_photo_to_ad(target_user: str, photo_path: str) -> dict:
|
||||
"""
|
||||
Читает готовое фото с диска и записывает его в атрибут thumbnailPhoto в AD.
|
||||
Ищет пользователя по всем OU из AD_BASES.
|
||||
"""
|
||||
from utils.ad_search import search_by_filter
|
||||
try:
|
||||
# Читаем сырые байты картинки
|
||||
with open(photo_path, "rb") as f:
|
||||
photo_bytes = f.read()
|
||||
|
||||
# Формируем фильтр для поиска
|
||||
# Ищем пользователя в AD по всем OU
|
||||
if '@' in target_user:
|
||||
ldap_filter = f"(mail={target_user})"
|
||||
ldap_filter = "(mail={})".format(target_user)
|
||||
else:
|
||||
ldap_filter = f"(sAMAccountName={target_user})"
|
||||
ldap_filter = "(sAMAccountName={})".format(target_user)
|
||||
|
||||
# Подключаемся к AD
|
||||
entries = search_by_filter(ldap_filter, ["cn"])
|
||||
|
||||
if not entries:
|
||||
return {"success": False, "error": "Пользователь {} не найден в AD.".format(target_user)}
|
||||
|
||||
user_dn = entries[0].entry_dn
|
||||
|
||||
# Подключаемся для модификации
|
||||
server = Server(AD_SERVER, get_info=ALL)
|
||||
conn = Connection(server, user=AD_USER, password=AD_PASSWORD, auto_bind=True)
|
||||
|
||||
# Находим пользователя в дереве (нам нужен его точный путь - DN)
|
||||
conn.search(search_base=AD_BASE, search_filter=ldap_filter, attributes=["cn"])
|
||||
|
||||
if not conn.entries:
|
||||
return {"success": False, "error": f"Пользователь {target_user} не найден в AD."}
|
||||
|
||||
user_dn = conn.entries[0].entry_dn
|
||||
|
||||
# 🪄 МАГИЯ: Перезаписываем атрибут thumbnailPhoto нашими байтами
|
||||
conn.modify(user_dn, {'thumbnailPhoto': [(MODIFY_REPLACE, [photo_bytes])]})
|
||||
|
||||
|
||||
Reference in New Issue
Block a user