import logging import os import sys 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 logger = logging.getLogger(__name__) def upload_photo_to_ad(target_user: str, photo_path: str) -> dict: """ Читает готовое фото с диска и записывает его в атрибут thumbnailPhoto в AD. """ try: # Читаем сырые байты картинки with open(photo_path, "rb") as f: photo_bytes = f.read() # Формируем фильтр для поиска if '@' in target_user: ldap_filter = f"(mail={target_user})" else: ldap_filter = f"(sAMAccountName={target_user})" # Подключаемся к AD 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])]}) if conn.result['result'] == 0: return {"success": True} else: return {"success": False, "error": str(conn.result['description'])} except Exception as e: logger.error(f"Ошибка загрузки в AD для {target_user}: {e}") return {"success": False, "error": "Сбой при связи с сервером Active Directory."}