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 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 = "(mail={})".format(target_user) else: ldap_filter = "(sAMAccountName={})".format(target_user) 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) # 🪄 МАГИЯ: Перезаписываем атрибут 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."}