while ($csvImport->ImportUser()) { if(($mess = $csvImport->GetErrorMessage()) <> '') echo "<script type=\"text/javascript\">parent.window.ShowError('".CUtil::JSEscape($mess)."');</script>"; if (USER_IMPORT_EXECUTION_TIME > 0 && (getmicrotime()-START_EXEC_TIME) > USER_IMPORT_EXECUTION_TIME) die("<script type=\"text/javascript\">parent.window.Start('".$csvFile->GetPos()."',".$cntUsersImport.");</script>"); } die("<script type=\"text/javascript\">parent.window.End(".$cntUsersImport.");</script>"); } elseif ($ldp) { //Ldap Ajax $cntUsersImport = 0; $dbLdapServers = CLdapServer::GetById($ldapServer); if(!($ldp = $dbLdapServers->GetNextServer())) { return false; } if(!$ldp->Connect()) { return false; } if(!$ldp->BindAdmin()) { $ldp->Disconnect(); return false; }
public static function Sync($ldap_server_id) { global $DB, $USER, $APPLICATION; if (!is_object($USER)) { $USER = new CUser(); $bUSERGen = true; } $dbLdapServers = CLdapServer::GetById($ldap_server_id); if (!($oLdapServer = $dbLdapServers->GetNextServer())) { return false; } if (!$oLdapServer->Connect()) { return false; } if (!$oLdapServer->BindAdmin()) { $oLdapServer->Disconnect(); return false; } $APPLICATION->ResetException(); $db_events = GetModuleEvents("ldap", "OnLdapBeforeSync"); while ($arEvent = $db_events->Fetch()) { $arParams['oLdapServer'] = $oLdapServer; if (ExecuteModuleEventEx($arEvent, array(&$arParams)) === false) { if (!($err = $APPLICATION->GetException())) { $APPLICATION->ThrowException("Unknown error"); } return false; } } // select all users from LDAP $arLdapUsers = array(); $ldapLoginAttr = strtolower($oLdapServer->arFields["~USER_ID_ATTR"]); $APPLICATION->ResetException(); $dbLdapUsers = $oLdapServer->GetUserList(); $ldpEx = $APPLICATION->GetException(); while ($arLdapUser = $dbLdapUsers->Fetch()) { $arLdapUsers[strtolower($arLdapUser[$ldapLoginAttr])] = $arLdapUser; } unset($dbLdapUsers); // select all Bitrix CMS users for this LDAP $arUsers = array(); CTimeZone::Disable(); $dbUsers = CUser::GetList($o, $b, array("EXTERNAL_AUTH_ID" => "LDAP#" . $ldap_server_id)); CTimeZone::Enable(); while ($arUser = $dbUsers->Fetch()) { $arUsers[strtolower($arUser["LOGIN"])] = $arUser; } unset($dbUsers); if (!$ldpEx || $ldpEx->msg != 'LDAP_SEARCH_ERROR') { $arDelLdapUsers = array_diff(array_keys($arUsers), array_keys($arLdapUsers)); } if (strlen($oLdapServer->arFields["SYNC_LAST"]) > 0) { $syncTime = MakeTimeStamp($oLdapServer->arFields["SYNC_LAST"]); } else { $syncTime = 0; } $arCache = array(); // selecting a list of groups, from which users will not be imported $noImportGroups = array(); $dbGroups = CLdapServer::GetGroupBan($ldap_server_id); while ($arGroup = $dbGroups->Fetch()) { $noImportGroups[md5($arGroup['LDAP_GROUP_ID'])] = $arGroup['LDAP_GROUP_ID']; } $cnt = 0; // have to update $oLdapServer->arFields["FIELD_MAP"] for user fields // for each one of them looking for similar in user list foreach ($arLdapUsers as $userLogin => $arLdapUserFields) { if (!is_array($arUsers[$userLogin])) { if ($oLdapServer->arFields["SYNC_USER_ADD"] != "Y") { continue; } // if user is not found among already existing ones, then import him // в $arLdapUserFields - user fields from ldap $userActive = $oLdapServer->getLdapValueByBitrixFieldName("ACTIVE", $arLdapUserFields); if ($userActive != "Y") { continue; } $arUserFields = $oLdapServer->GetUserFields($arLdapUserFields, $departmentCache); // $arUserFields here contains LDAP user fields for a LDAP user // make a check, whether this user belongs to those groups only, from which import will not be made... $allUserGroups = $arUserFields['LDAP_GROUPS']; $userImportIsBanned = true; foreach ($allUserGroups as $groupId) { $groupId = trim($groupId); if (!empty($groupId) && !array_key_exists(md5($groupId), $noImportGroups)) { $userImportIsBanned = false; break; } } // ...if he does not, then import him if (!$userImportIsBanned || empty($allUserGroups)) { $oLdapServer->SetUser($arUserFields); } } else { // if date of update is set, then compare it $ldapTime = time(); if ($syncTime > 0 && strlen($oLdapServer->arFields["SYNC_ATTR"]) > 0 && preg_match("'([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\\.0Z'", $arLdapUserFields[strtolower($oLdapServer->arFields["SYNC_ATTR"])], $arTimeMatch)) { $ldapTime = gmmktime($arTimeMatch[4], $arTimeMatch[5], $arTimeMatch[6], $arTimeMatch[2], $arTimeMatch[3], $arTimeMatch[1]); $userTime = MakeTimeStamp($arUsers[$userLogin]["TIMESTAMP_X"]); } if ($syncTime < $ldapTime || $syncTime < $userTime) { // make an update $arUserFields = $oLdapServer->GetUserFields($arLdapUserFields, $arCache); $arUserFields["ID"] = $arUsers[$userLogin]["ID"]; //echo $arUserFields["LOGIN"]." - updated<br>"; $oLdapServer->SetUser($arUserFields); $cnt++; } } } foreach ($arDelLdapUsers as $userLogin) { $USER = new CUser(); if (isset($arUsers[$userLogin]) && $arUsers[$userLogin]['ACTIVE'] == 'Y') { $ID = intval($arUsers[$userLogin]["ID"]); $USER->Update($ID, array('ACTIVE' => 'N')); } } $oLdapServer->Disconnect(); CLdapServer::Update($ldap_server_id, array("~SYNC_LAST" => $DB->CurrentTimeFunction())); if ($bUSERGen) { unset($USER); } return $cnt; }
function Sync($ldap_server_id) { global $DB, $USER, $APPLICATION; if (!is_object($USER)) { $USER = new CUser(); $bUSERGen = true; } $dbLdapServers = CLdapServer::GetById($ldap_server_id); if (!($oLdapServer = $dbLdapServers->GetNextServer())) { return false; } if (!$oLdapServer->Connect()) { return false; } if (!$oLdapServer->BindAdmin()) { $oLdapServer->Disconnect(); return false; } $APPLICATION->ResetException(); $db_events = GetModuleEvents("ldap", "OnLdapBeforeSync"); while ($arEvent = $db_events->Fetch()) { $arParams['oLdapServer'] = $oLdapServer; if (ExecuteModuleEventEx($arEvent, array(&$arParams)) === false) { if (!($err = $APPLICATION->GetException())) { $APPLICATION->ThrowException("Unknown error"); } return false; } } // select all users from LDAP $arLdapUsers = array(); $ldapLoginAttr = strtolower($oLdapServer->arFields["~USER_ID_ATTR"]); $dbLdapUsers = $oLdapServer->GetUserList(); while ($arLdapUser = $dbLdapUsers->Fetch()) { $arLdapUsers[strtolower($arLdapUser[$ldapLoginAttr])] = $arLdapUser; } unset($dbLdapUsers); // select all Bitrix CMS users for this LDAP $arUsers = array(); CTimeZone::Disable(); $dbUsers = CUser::GetList($o, $b, array("EXTERNAL_AUTH_ID" => "LDAP#" . $ldap_server_id)); CTimeZone::Enable(); while ($arUser = $dbUsers->Fetch()) { $arUsers[strtolower($arUser["LOGIN"])] = $arUser; } unset($dbUsers); $arDelLdapUsers = array_diff(array_keys($arUsers), array_keys($arLdapUsers)); if (strlen($oLdapServer->arFields["SYNC_LAST"]) > 0) { $syncTime = MakeTimeStamp($oLdapServer->arFields["SYNC_LAST"]); } else { $syncTime = 0; } $arCache = array(); $cnt = 0; // have to update $oLdapServer->arFields["FIELD_MAP"] for user fields // for each one of them looking for similar in user list foreach ($arLdapUsers as $userLogin => $arLdapUserFields) { if (!is_array($arUsers[$userLogin])) { continue; } // if date of update is set, then compare it $ldapTime = time(); if ($syncTime > 0 && strlen($oLdapServer->arFields["SYNC_ATTR"]) > 0 && preg_match("'([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\\.0Z'", $arLdapUserFields[strtolower($oLdapServer->arFields["SYNC_ATTR"])], $arTimeMatch)) { $ldapTime = gmmktime($arTimeMatch[4], $arTimeMatch[5], $arTimeMatch[6], $arTimeMatch[2], $arTimeMatch[3], $arTimeMatch[1]); $userTime = MakeTimeStamp($arUsers[$userLogin]["TIMESTAMP_X"]); } if ($syncTime < $ldapTime || $syncTime < $userTime) { // make an update $arUserFields = $oLdapServer->GetUserFields($arLdapUserFields, $arCache); $arUserFields["ID"] = $arUsers[$userLogin]["ID"]; //echo $arUserFields["LOGIN"]." - updated<br>"; $oLdapServer->SetUser($arUserFields); $cnt++; } } foreach ($arDelLdapUsers as $userLogin) { $USER = new CUser(); if (isset($arUsers[$userLogin]) && $arUsers[$userLogin]['ACTIVE'] == 'Y') { $ID = intval($arUsers[$userLogin]["ID"]); $USER->Update($ID, array('ACTIVE' => 'N')); } } $oLdapServer->Disconnect(); CLdapServer::Update($ldap_server_id, array("~SYNC_LAST" => $DB->CurrentTimeFunction())); if ($bUSERGen) { unset($USER); } return $cnt; }