- Модуль: ldap
- Путь к файлу: ~/bitrix/modules/ldap/classes/general/ldap.php
- Класс: CLDAP
- Вызов: CLDAP::GetUserFields
public function GetUserFields($arLdapUser, &$departmentCache=FALSE)
{
global $APPLICATION;
$arFields = array(
'DN' => $arLdapUser['dn'],
'LOGIN' => $arLdapUser[mb_strtolower($this->arFields['~USER_ID_ATTR'])],
'EXTERNAL_AUTH_ID' => 'LDAP#'.$this->arFields['ID'],
'LDAP_GROUPS' => $arLdapUser[mb_strtolower($this->arFields['~USER_GROUP_ATTR'])],
);
// for each field, do the conversion
foreach($this->arFields["FIELD_MAP"] as $userField=>$attr)
$arFields[$userField] = $this->getLdapValueByBitrixFieldName($userField, $arLdapUser);
$APPLICATION->ResetException();
$db_events = GetModuleEvents("ldap", "OnLdapUserFields");
while($arEvent = $db_events->Fetch())
{
$arParams = array(array(&$arFields, &$arLdapUser));
if(ExecuteModuleEventEx($arEvent, $arParams)===false)
{
if(!($err = $APPLICATION->GetException()))
$APPLICATION->ThrowException("Unknown error");
return false;
}
$arFields = $arParams[0][0];
}
// set a department field, if needed
if (empty($arFields['UF_DEPARTMENT']) && isModuleInstalled('intranet')
&& $this->arFields['IMPORT_STRUCT'] && $this->arFields['IMPORT_STRUCT']=='Y')
{
//$arLdapUser[$this->arFields['USER_DN_ATTR']]
$username = $arLdapUser[$this->arFields['USER_ID_ATTR']];
if ($arDepartment = $this->GetDepartmentIdForADUser($arLdapUser[$this->arFields['USER_DEPARTMENT_ATTR']],$arLdapUser[$this->arFields['USER_MANAGER_ATTR']],$username,$departmentCache))
{
// fill in cache. it is done outside the function because it has many exit points
if ($departmentCache)
$departmentCache[$username] = $arDepartment;
// this is not final assignment
// $arFields['UF_DEPARTMENT'] sould contain array of department ids
// but somehow we have to return an information whether this user is a department head
// so we'll save this data here temporarily
$arFields['UF_DEPARTMENT'] = $arDepartment;
}
else
{
$arFields['UF_DEPARTMENT'] = array();
}
// at this point $arFields['UF_DEPARTMENT'] should be set to some value, even an empty array is ok
}
if (!is_array($arFields['LDAP_GROUPS']))
$arFields['LDAP_GROUPS'] = (!empty($arFields['LDAP_GROUPS']) ? array($arFields['LDAP_GROUPS']) : array());
$primarygroupid_name_attr = 'primarygroupid';
$primarygrouptoken_name_attr = 'primarygrouptoken';
$groupMemberAttr = null;
$userIdAttr = null;
if ($this->arFields['USER_GROUP_ACCESSORY'] == 'Y')
{
$primarygroupid_name_attr = mb_strtolower($this->arFields['GROUP_ID_ATTR']);
$primarygrouptoken_name_attr = mb_strtolower($this->arFields['USER_GROUP_ATTR']);
$userIdAttr = mb_strtolower($this->arFields['USER_ID_ATTR']);
$groupMemberAttr = mb_strtolower($this->arFields['GROUP_MEMBERS_ATTR']);
}
$arAllGroups = $this->GetGroupListArray();
if (!is_array($arAllGroups) || count($arAllGroups) <= 0)
return $arFields;
$arGroup = reset($arAllGroups);
do
{
if(in_array($arGroup['ID'], $arFields['LDAP_GROUPS']))
continue;
if (
(is_set($arLdapUser, $primarygroupid_name_attr)
&& $arGroup[$primarygrouptoken_name_attr] == $arLdapUser[$primarygroupid_name_attr]
)
||
($this->arFields['USER_GROUP_ACCESSORY'] == 'Y'
&& is_set($arGroup, $groupMemberAttr)
&& (
(is_array($arGroup[$groupMemberAttr])
&& in_array($arLdapUser[$userIdAttr], $arGroup[$groupMemberAttr])
)
||
$arLdapUser[$userIdAttr] == $arGroup[$groupMemberAttr]
)
)
)
{
$arFields['LDAP_GROUPS'][] = $arGroup['ID'];
if ($this->arFields['USER_GROUP_ACCESSORY'] == 'N')
break;
}
}
while ($arGroup = next($arAllGroups));
return $arFields;
}