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