fix: validate AD email match to prevent wrong requester fallback
This commit is contained in:
@@ -73,16 +73,27 @@ sd_sessions = {}
|
|||||||
def get_ad_user_sync(user_id: str):
|
def get_ad_user_sync(user_id: str):
|
||||||
"""Ищем по email/UPN (search_by_user_id), НЕ по sAMAccountName.
|
"""Ищем по email/UPN (search_by_user_id), НЕ по sAMAccountName.
|
||||||
user_id из TrueConf — обычно email вида 'login@tcs.sibcem.ru'.
|
user_id из TrueConf — обычно email вида 'login@tcs.sibcem.ru'.
|
||||||
Функция сама заменит @tcs.sibcem.ru на @sibcem.ru и найдёт правильную учётку."""
|
Функция сама заменит @tcs.sibcem.ru на @sibcem.ru и найдёт правильную учётку.
|
||||||
|
ВАЖНО: если найденный пользователь не совпадает с запрошенным по email — возвращаем None."""
|
||||||
try:
|
try:
|
||||||
from utils.ad_search import search_by_user_id
|
from utils.ad_search import search_by_user_id
|
||||||
entries = search_by_user_id(user_id, ["displayName", "mail", "l", "userAccountControl"])
|
entries = search_by_user_id(user_id, ["displayName", "mail", "l", "userAccountControl"])
|
||||||
if entries:
|
if not entries:
|
||||||
|
return None
|
||||||
user = entries[0]
|
user = entries[0]
|
||||||
|
mail = user.mail.value if 'mail' in user else None
|
||||||
|
if not mail:
|
||||||
|
return None
|
||||||
|
# Валидация: извлекаем логин из user_id и из mail, сравниваем
|
||||||
|
req_login = user_id.split("@")[0] if "@" in user_id else user_id
|
||||||
|
mail_login = mail.split("@")[0] if "@" in mail else mail
|
||||||
|
if req_login.lower() != mail_login.lower():
|
||||||
|
logger.info(f"AD user mismatch: requested login={req_login}, found mail={mail} (login={mail_login})")
|
||||||
|
return None
|
||||||
uac = user.userAccountControl.value if 'userAccountControl' in user else 0
|
uac = user.userAccountControl.value if 'userAccountControl' in user else 0
|
||||||
return {
|
return {
|
||||||
"name": user.displayName.value if 'displayName' in user else user_id,
|
"name": user.displayName.value if 'displayName' in user else user_id,
|
||||||
"mail": user.mail.value if 'mail' in user else None,
|
"mail": mail,
|
||||||
"city": user.l.value if 'l' in user else "Кемерово",
|
"city": user.l.value if 'l' in user else "Кемерово",
|
||||||
"is_disabled": bool(uac & 2)
|
"is_disabled": bool(uac & 2)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user