24 " ".$DB->DateToCharFunction(
"ls.TIMESTAMP_X").
" as TIMESTAMP_X, ".
25 " ".$DB->DateToCharFunction(
"ls.SYNC_LAST").
" as SYNC_LAST ".
26 "FROM b_ldap_server ls ";
31 $arSqlSearch = Array();
33 $fkCount =
count($filter_keys);
35 for(
$i=0;
$i<$fkCount;
$i++)
41 $cOperationType =
$res[
"OPERATION"];
47 case "USER_GROUP_ACCESSORY":
53 case "CONNECTION_TYPE":
65 case "ADMIN_PASSWORD":
69 case "GROUP_NAME_ATTR":
70 case "GROUP_MEMBERS_ATTR":
73 case "USER_NAME_ATTR":
74 case "USER_LAST_NAME_ATTR":
75 case "USER_EMAIL_ATTR":
76 case "USER_GROUP_ATTR":
77 $arSqlSearch[] = CldapUtil::FilterCreate(
"ls.".
$key,
$val,
"string", $cOperationType);
85 for(
$i=0, $ssCount=
count($arSqlSearch);
$i<$ssCount;
$i++)
87 if($arSqlSearch[
$i] <>
'')
90 $strSqlSearch .=
" AND (".$arSqlSearch[
$i].
") ";
94 $arSqlOrder = Array();
95 foreach($arOrder as $by=>
$order)
97 $order = mb_strtolower(
$order) ===
'asc' ?
'asc' :
'desc';
99 switch(mb_strtoupper($by))
109 case "ADMIN_PASSWORD":
114 case "GROUP_ID_ATTR":
115 case "GROUP_NAME_ATTR":
116 case "GROUP_MEMBERS_ATTR":
119 case "USER_NAME_ATTR":
120 case "USER_LAST_NAME_ATTR":
121 case "USER_EMAIL_ATTR":
122 case "USER_GROUP_ATTR":
123 case "USER_GROUP_ACCESSORY":
125 case "CONNECTION_TYPE":
126 $arSqlOrder[] =
" ls.".$by.
" ".
$order.
" ";
129 $arSqlOrder[] =
" ls.TIMESTAMP_X ".$order.
" ";
139 $strSqlOrder =
" ORDER BY ";
143 $strSqlOrder .= mb_strtolower($arSqlOrder[
$i]);
146 $strSql .=
" WHERE 1=1 ".$strSqlSearch.$strSqlOrder;
431 public static function Sync($ldap_server_id)
435 self::$syncErrors =
array();
437 if(!is_object(
$USER))
444 if(!($oLdapServer = $dbLdapServers->GetNextServer()))
447 if(!$oLdapServer->Connect())
450 if(!$oLdapServer->BindAdmin())
452 $oLdapServer->Disconnect();
459 while($arEvent = $db_events->Fetch())
473 $arLdapUsers =
array();
474 $ldapLoginAttr = mb_strtolower($oLdapServer->arFields[
"~USER_ID_ATTR"]);
477 $dbLdapUsers = $oLdapServer->GetUserList();
480 while($arLdapUser = $dbLdapUsers->Fetch())
481 $arLdapUsers[mb_strtolower($arLdapUser[$ldapLoginAttr])] = $arLdapUser;
488 CTimeZone::Disable();
489 $dbUsers = CUser::GetList(
'',
'', Array(
"EXTERNAL_AUTH_ID"=>
"LDAP#".$ldap_server_id));
492 while($arUser = $dbUsers->Fetch())
493 $arUsers[mb_strtolower($arUser[
"LOGIN"])] = $arUser;
497 $arDelLdapUsers =
array();
499 if(!$ldpEx || $ldpEx->msg !=
'LDAP_SEARCH_ERROR')
500 $arDelLdapUsers = array_diff(array_keys($arUsers), array_keys($arLdapUsers));
502 if($oLdapServer->arFields[
"SYNC_LAST"] <>
'')
503 $syncTime =
MakeTimeStamp($oLdapServer->arFields[
"SYNC_LAST"]);
508 $departmentCache =
array();
511 foreach($arLdapUsers as $userLogin => $arLdapUserFields)
513 if(!is_array($arUsers[$userLogin]))
516 if($oLdapServer->arFields[
"SYNC_USER_ADD"] !=
"Y")
521 $userActive = $oLdapServer->getLdapValueByBitrixFieldName(
"ACTIVE", $arLdapUserFields);
523 if($userActive !=
"Y")
526 $arUserFields = $oLdapServer->GetUserFields($arLdapUserFields, $departmentCache);
528 if(self::isUserInBannedGroups($ldap_server_id, $arUserFields))
531 if($oLdapServer->SetUser($arUserFields))
535 else if(\
Bitrix\Ldap\Limit::isUserLimitExceeded())
547 && $oLdapServer->arFields[
"SYNC_ATTR"] <>
''
548 && preg_match(
"'([0-9]{4})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})([0-9]{2})\.0Z'", $arLdapUserFields[mb_strtolower($oLdapServer->arFields[
"SYNC_ATTR"])], $arTimeMatch)
551 $ldapTime = gmmktime($arTimeMatch[4], $arTimeMatch[5], $arTimeMatch[6], $arTimeMatch[2], $arTimeMatch[3], $arTimeMatch[1]);
552 $userTime =
MakeTimeStamp($arUsers[$userLogin][
"TIMESTAMP_X"]);
555 if($syncTime < $ldapTime || $syncTime < $userTime)
557 $arUserFields = $oLdapServer->GetUserFields($arLdapUserFields, $departmentCache);
559 if(self::isUserInBannedGroups($ldap_server_id, $arUserFields))
562 $arUserFields[
"ID"] = $arUsers[$userLogin][
"ID"];
564 if($oLdapServer->SetUser($arUserFields))
568 else if(\
Bitrix\Ldap\Limit::isUserLimitExceeded())
576 if(
$USER->LAST_ERROR !=
'')
578 self::$syncErrors[] = $userLogin.
': '.
$USER->LAST_ERROR;
579 $USER->LAST_ERROR =
'';
583 foreach ($arDelLdapUsers as $userLogin)
586 if (isset($arUsers[$userLogin]) && $arUsers[$userLogin][
'ACTIVE'] ==
'Y')
588 $ID = intval($arUsers[$userLogin][
"ID"]);
593 $oLdapServer->Disconnect();
604 static $noImportGroups =
null;
606 if($noImportGroups ===
null)
608 $noImportGroups =
array();
612 $noImportGroups[md5($arGroup[
'LDAP_GROUP_ID'])] = $arGroup[
'LDAP_GROUP_ID'];
615 if(empty($noImportGroups))
618 $allUserGroups = $arUserFields[
'LDAP_GROUPS'];
621 foreach($allUserGroups as $groupId)
623 $groupId = trim($groupId);
625 if(!empty($groupId) && array_key_exists(md5($groupId), $noImportGroups))