function SetUser($arLdapUser, $bAddNew = true) { global $USER; $isHead = false; $bUSERGen = false; 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; if (isset($_REQUEST["ldap_user_id"]) && strlen($_REQUEST["ldap_user_id"]) == 32) { $dbUser = CUser::GetList($O = "", $B = "", array("XML_ID" => $_REQUEST["ldap_user_id"], 'EXTERNAL_AUTH_ID' => $arLdapUser['EXTERNAL_AUTH_ID'])); if ($arUser = $dbUser->Fetch()) { if ($arUser["XML_ID"]) { $ldapUserID = $arUser["ID"]; } } } $res = CUser::GetList($O = "", $B = "", array('LOGIN_EQUAL_EXACT' => $arLdapUser['LOGIN'], 'EXTERNAL_AUTH_ID' => $arLdapUser['EXTERNAL_AUTH_ID'])); $arLdapUser['PASSWORD'] = uniqid(rand(), true); if (!($ar_res = $res->Fetch()) && $ldapUserID < 1) { if ($bAddNew) { if (strlen($arLdapUser["EMAIL"]) <= 0) { $arLdapUser["EMAIL"] = COption::GetOptionString("ldap", "default_email", 'no@email'); } $ID = $USER->Add($arLdapUser); } else { $ID = 0; } } else { $ID = $ldapUserID > 1 ? $ldapUserID : $ar_res['ID']; self::PrepareUserPhoto($ID, $arLdapUser); $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]); } // 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; }