28 if (empty(static::$arAuthProviders))
30 foreach (
GetModuleEvents(
"main",
"OnAuthProvidersBuildList",
true) as $arEvent)
35 if (!is_array(
$res[0]))
53 $USER_ID = intval($USER_ID);
55 if (!isset(static::$arChecked[
$provider][$USER_ID]))
57 $cacheId = static::GetCheckCacheId(
$provider, $USER_ID);
59 if (CACHED_b_user_access_check !==
false &&
$CACHE_MANAGER->Read(CACHED_b_user_access_check, $cacheId, static::CHECK_CACHE_DIR))
67 from b_user_access_check
68 where USER_ID = " . $USER_ID .
"
72 static::$arChecked[
$provider][$USER_ID] = [];
73 while ($check =
$res->Fetch())
75 static::$arChecked[
$provider][$USER_ID][] = $check[
'DATE_CHECK'];
78 if (CACHED_b_user_access_check !==
false)
87 foreach (static::$arChecked[
$provider][$USER_ID] as $dateCheck)
89 $date = $helper->convertFromDbDateTime($dateCheck);
90 if ($date && $date->getTimestamp() <= $now->
getTimestamp())
99 public function UpdateCodes(
$arParams =
false)
110 $USER_ID = intval(
$USER->GetID());
117 $now =
new DateTime();
119 foreach (static::$arAuthProviders as $providerId => $providerDescription)
122 $provider =
new $providerDescription[
"CLASS"];
124 if (is_callable([
$provider,
"UpdateCodes"]))
127 if (static::NeedToRecalculate($providerId, $USER_ID, $now))
129 $lockName =
"update_codes.{$providerId}.{$USER_ID}";
140 static::DeleteCodes($providerId, $USER_ID);
146 static::UpdateStat($providerId, $USER_ID, $now);
157 static::ClearCache($USER_ID);
174 $sql = $helper->getInsertIgnore(
176 '(USER_ID, PROVIDER_ID, ACCESS_CODE)',
177 "VALUES ({$userId}, '{$helper->forSql($provider)}', '{$helper->forSql($code)}')"
198 DELETE FROM b_user_access
199 WHERE USER_ID = {$userId}
200 AND PROVIDER_ID = '{$helper->forSql($provider)}'
201 AND ACCESS_CODE = '{$helper->forSql($code)}'
215 unset(static::$userCodes[
$userId]);
227 if ($dateCheck ===
null)
229 $dateCheck =
new DateTime(
'1974-12-07',
'Y-m-d');
232 $sql = $helper->getInsertIgnore(
'b_user_access_check',
'(USER_ID, PROVIDER_ID, DATE_CHECK)',
"
233 SELECT ID, '{$DB->ForSQL($provider)}', {$helper->convertToDbDateTime($dateCheck)}
235 WHERE ID = {$userId}"
249 $dateCheck =
new DateTime(
'1974-12-07',
'Y-m-d');
251 $sql = $helper->getInsertIgnore(
'b_user_access_check',
'(USER_ID, PROVIDER_ID, DATE_CHECK)',
"
252 SELECT USER_ID, PROVIDER_ID, {$helper->convertToDbDateTime($dateCheck)}
254 WHERE PROVIDER_ID = '" . $helper->forSQL(
$provider) .
"'
256 GROUP BY USER_ID, PROVIDER_ID
271 return "access_codes" .
$userId;
282 delete from b_user_access
283 where user_id = {$userId}
284 and provider_id = '{$helper->forSql($providerId)}'
297 delete from b_user_access_check
298 where user_id = {$userId}
299 and provider_id = '{$DB->ForSql($provider)}'
300 and date_check <= {$helper->convertToDbDateTime($now)}
321 $access->UpdateCodes([
'USER_ID' => $USER_ID]);
338 if (trim(
$code) <>
'')
340 $arIn[] =
"'" .
$DB->ForSQL(trim(
$code)) .
"'";
345 $arWhere[] =
"access_code in(" . implode(
",", $arIn) .
")";
349 $arWhere[] =
"provider_id='" .
$DB->ForSQL(
$val) .
"'";
357 $arWhere[] =
"provider_id <> 'imchat'";
361 if (!empty($arWhere))
363 $sWhere =
" and " . implode(
" and ", $arWhere);
366 return $DB->Query(
"select * from b_user_access where user_id=" . intval($USER_ID) . $sWhere);
373 $USER_ID = intval($USER_ID);
376 $access->UpdateCodes([
'USER_ID' => $USER_ID]);
378 if (empty(
$arFilter) && isset(static::$userCodes[$USER_ID]))
380 return static::$userCodes[$USER_ID];
383 $useCache = (empty(
$arFilter) && CACHED_b_user_access_check !==
false);
384 $cacheId = static::GetCodesCacheId($USER_ID);
386 if ($useCache &&
$CACHE_MANAGER->Read(CACHED_b_user_access_check, $cacheId, static::CACHE_DIR))
407 static::$userCodes[$USER_ID] =
$arCodes;
416 foreach (static::$arAuthProviders as
$provider)
419 if (is_callable([$cl,
"GetFormHtml"]))
421 $res = call_user_func_array([$cl,
"GetFormHtml"], [$this->arParams]);
426 "HTML" =>
$res[
"HTML"],
427 "SELECTED" =>
$res[
"SELECTED"] ??
false,
437 if (isset(static::$arAuthProviders[
$arParams[
"provider"]]))
439 $cl =
new static::$arAuthProviders[
$arParams[
"provider"]][
"CLASS"];
440 if (is_callable([$cl,
"AjaxRequest"]))
442 return call_user_func_array([$cl,
"AjaxRequest"], [$this->arParams]);
457 foreach (static::$arAuthProviders as
$provider)
460 if (is_callable([$cl,
"GetNames"]))
462 $res = call_user_func_array([$cl,
"GetNames"], [
$arCodes]);
465 foreach (
$res as $codeId => $codeValues)
467 $codeValues[
'provider_id'] =
$provider[
'ID'];
476 uasort(
$arResult, [
'CAccess',
'CmpNames']);
484 $c = strcmp(
$a[
"provider"], $b[
"provider"]);
490 return strcmp(
$a[
"name"], $b[
"name"]);
500 "prefixes" => (
$provider[
"PREFIXES"] ?? []),
512 "PROVIDER_NAME" =>
GetMessage(
"access_group"),
514 "CLASS" =>
"CGroupAuthProvider",
521 "CLASS" =>
"CUserAuthProvider",
526 "PROVIDER_NAME" =>
"",
528 "CLASS" =>
"COtherAuthProvider",
536 $USER_ID = intval($USER_ID);
538 $DB->Query(
"delete from b_user_access where user_id=" . $USER_ID);
539 $DB->Query(
"delete from b_user_access_check where user_id=" . $USER_ID);
542 foreach (static::$arChecked as
$provider => $dummy)
544 static::ClearCheckCache(
$provider, $USER_ID);
547 static::ClearCache($USER_ID);
554 foreach ($arLRU as
$provider => $arRecent)
556 if (is_array($arRecent))
558 $arLastRecent = CUserOptions::GetOption(
"access_dialog_recent",
$provider, []);
560 $arItems = array_keys($arRecent);
561 $arItems = array_unique(array_merge($arItems, $arLastRecent));
562 $arItems = array_slice($arItems, 0, 20);
564 CUserOptions::SetOption(
"access_dialog_recent",
$provider, $arItems);
571 $res = CUserOptions::GetOption(
"access_dialog_recent",
$provider, []);
593 if (
$connection->getIndexName(
'b_user_access', [
'USER_ID',
'ACCESS_CODE'],
true) ===
'ux_ua_user_access')
599 select ID, USER_ID, ACCESS_CODE
607 while (
$code = $codes->fetch())
612 delete from b_user_access
614 and USER_ID = {$code['USER_ID']}
615 and ACCESS_CODE = '{$code['ACCESS_CODE']}'
621 return "CAccess::deleteDuplicatesAgent({$id});";
627 alter table b_user_access
628 drop index ix_ua_user_access,
629 add UNIQUE INDEX ux_ua_user_access (USER_ID, ACCESS_CODE)
632 catch (
Main\
DB\SqlQueryException)
634 return "CAccess::deleteDuplicatesAgent();";
641AddEventHandler(
"main",
"OnAuthProvidersBuildList", [
"CAccess",
"GetProviders"]);
if(!Loader::includeModule('messageservice')) $provider
if(!is_object($USER)||! $USER->IsAuthorized()) $userId
static getConnection($name="")
static RecalculateForUser($userId, $provider, DateTime $dateCheck=null)
static UpdateStat($provider, $userId, DateTime $now)
static ClearCheckCache($provider, $userId)
static RemoveCode($userId, $provider, $code)
static DeleteCodes($providerId, $userId)
static GetLastRecentlyUsed($provider)
static OnUserDelete($USER_ID)
GetNames($arCodes, $bSort=false)
static GetCodesCacheId($userId)
static RecalculateForProvider($provider)
static NeedToRecalculate($provider, $USER_ID, DateTime $now)
static GetUserCodesArray($USER_ID, $arFilter=[])
static AddCode($userId, $provider, $code)
static GetUserCodes($USER_ID, $arFilter=[], bool $updateCodes=true)
static SaveLastRecentlyUsed($arLRU)
__construct($arParams=false)
static deleteDuplicatesAgent(int $lastId=0)
static GetCheckCacheId($provider, $userId)
static ClearCache($userId)
if(!is_null($config))($config as $configItem)(! $configItem->isVisible()) $code
if(!is_array($deviceNotifyCodes)) $access
ExecuteModuleEventEx($arEvent, $arParams=[])
AddEventHandler($FROM_MODULE_ID, $MESSAGE_ID, $CALLBACK, $SORT=100, $FULL_PATH=false)
GetModuleEvents($MODULE_ID, $MESSAGE_ID, $bReturnArray=false)
IncludeModuleLangFile($filepath, $lang=false, $bReturnArray=false)
GetMessage($name, $aReplace=null)
sortByColumn(array &$array, $columns, $callbacks='', $defaultValueIfNotSetValue=null, $preserveKeys=false)
if( $daysToExpire >=0 &&$daysToExpire< 60 elseif)( $daysToExpire< 0)
if(empty($signedUserToken)) $key