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