• Модуль: ldap
  • Путь к файлу: ~/bitrix/modules/ldap/classes/general/ldap.php
  • Класс: CLDAP
  • Вызов: CLDAP::SetUser
public function SetUser($arLdapUser, $bAddNew = true)
{
	global $USER;

	$isHead = false;
	$bUSERGen = false;
	$userActive = '';

	if(!is_object($USER))
	{
		$USER = new CUser();
		$bUSERGen = true;
	}

	// process previously saved department data
	if (IsModuleInstalled('intranet') && is_array($arLdapUser['UF_DEPARTMENT']))
	{
		$isHead = $arLdapUser['UF_DEPARTMENT']['IS_HEAD'];
		// replace temporary value with a real one
		$arLdapUser['UF_DEPARTMENT'] = array($arLdapUser['UF_DEPARTMENT']['ID']);
	}

	if(isset($arLdapUser["ID"]))
	{
		$ID = intval($arLdapUser["ID"]);
		self::PrepareUserPhoto($ID,$arLdapUser);
		$USER->Update($ID, $arLdapUser);
	}
	else
	{
		$ldapUserID = 0;
		$bitrixUserId = 0;
		$res = CUser::GetList(
			"", "",
			array('LOGIN_EQUAL_EXACT' => $arLdapUser['LOGIN']),
			array('FIELDS' => array('ID', 'EXTERNAL_AUTH_ID', 'ACTIVE'))
		);

		while($ar_res = $res->Fetch())
		{
			if($ar_res['EXTERNAL_AUTH_ID'] == $arLdapUser['EXTERNAL_AUTH_ID'])
			{
				$bitrixUserId = $ar_res['ID'];
				$userActive =  $ar_res['ACTIVE'];
				break;
			}
			else
			{
				$bAddNew = ($bAddNew && COption::GetOptionString("ldap", "ldap_create_duplicate_login_user", 'Y') == 'Y');
			}
		}

		if($bitrixUserId <= 0 && $ldapUserID <= 0)
		{
			if($bAddNew && !BitrixLdapLimit::isUserLimitExceeded())
			{
				if($arLdapUser["EMAIL"] == '')
				{
					$arLdapUser["EMAIL"] = COption::GetOptionString("ldap", "default_email", 'no@email');
				}

				$arLdapUser['PASSWORD'] = (string)(new Password());
				$ID = $USER->Add($arLdapUser);
			}
			else
			{
				$ID = 0;
			}
		}
		else
		{
			$ID = ($ldapUserID > 1 ? $ldapUserID : $bitrixUserId);
			self::PrepareUserPhoto($ID,$arLdapUser);

			//Performance to skip CIntranetEventHandlers::UpdateActivity();
			if(isset($arLdapUser['ACTIVE']) && $userActive == $arLdapUser['ACTIVE'])
				unset($arLdapUser['ACTIVE']);

			$USER->Update($ID, $arLdapUser);
		}

		$ID = intval($ID);
	}

	// - add this user to groups
	if ($ID > 0)
	{
		// - set as head of department
		if (IsModuleInstalled('intranet') && $isHead)
		{
			CLdapUtil::SetDepartmentHead($ID,$arLdapUser['UF_DEPARTMENT'][0]);
		}

		$arGroupMaps = $this->GetGroupMaps();

		if(!empty($arGroupMaps))
		{
			// For each group finding all superior ones
			$arUserLdapGroups = Array();
			$arLdapGroups = $this->GetGroupListArray();
			$this->GetAllMemberOf($arLdapUser['LDAP_GROUPS'], $arUserLdapGroups, $arLdapGroups);

			$arGroupMaps = $this->GetGroupMaps();
			$arUserBitrixGroups = $USER->GetUserGroup($ID);
			$arUserBitrixGroupsNew = array();

			$prevGroups = $arUserBitrixGroups;
			sort($prevGroups);

			foreach($arGroupMaps as $fromLdapGroup=>$arToUserGroups)
			{
				foreach($arToUserGroups as $toUserGroup)
				{
					if (($k = array_search($toUserGroup, $arUserBitrixGroups)) !== false)
					{
						unset($arUserBitrixGroups[$k]);
					}

					// If there is such a group among user's
					if (in_array($fromLdapGroup, $arUserLdapGroups))
					{
						$arUserBitrixGroupsNew[] = $toUserGroup;
					}
				}
			}
			$arUserBitrixGroups = array_merge($arUserBitrixGroups, array_unique($arUserBitrixGroupsNew));
			sort($arUserBitrixGroups);

			if($arUserBitrixGroups <> $prevGroups)
			{
				$USER->SetUserGroup($ID, $arUserBitrixGroups);
			}
		}
	}

	if($bUSERGen)
	{
		unset($USER);
	}

	return $ID;
}