• Модуль: 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;
}