49 lines
2.1 KiB
Python
49 lines
2.1 KiB
Python
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."} |