- Модуль: main
- Путь к файлу: ~/bitrix/modules/main/classes/general/user.php
- Класс: CAllUser
- Вызов: CAllUser::getPolicy
static function getPolicy($userId)
{
global $DB, $CACHE_MANAGER;
static $cache = [];
$cacheId = md5(serialize($userId));
if (isset($cache[$cacheId]))
{
return $cache[$cacheId];
}
$arPolicies = [];
/* Group 2 managed cache */
$sql = "SELECT G.ID GROUP_ID, G.SECURITY_POLICY FROM b_group G WHERE G.ID=2";
if (CACHED_b_group === false)
{
$res = $DB->Query($sql);
$group2Policy = $res->Fetch();
}
elseif ($CACHE_MANAGER->Read(CACHED_b_group, "b_group2", "b_group"))
{
$group2Policy = $CACHE_MANAGER->Get("b_group2");
}
else
{
$rs = $DB->Query($sql);
$group2Policy = $rs->Fetch();
$CACHE_MANAGER->Set("b_group2", $group2Policy);
}
if ($group2Policy)
{
$arPolicies[] = $group2Policy;
}
if (is_array($userId))
{
$arGroups = [];
foreach ($userId as $value)
{
$value = intval($value);
if ($value > 0 && $value != 2)
{
$arGroups[$value] = $value;
}
}
if ($arGroups)
{
$sql =
"SELECT G.ID GROUP_ID, G.SECURITY_POLICY " .
"FROM b_group G " .
"WHERE G.ID in (" . implode(", ", $arGroups) . ")";
$rs = $DB->Query($sql);
while ($ar = $rs->Fetch())
{
$arPolicies[] = $ar;
}
}
}
elseif (intval($userId) > 0)
{
$sql =
"SELECT UG.GROUP_ID, G.SECURITY_POLICY " .
"FROM b_user_group UG, b_group G " .
"WHERE UG.USER_ID = " . intval($userId) . ' ' .
"AND UG.GROUP_ID = G.ID " .
"AND ((UG.DATE_ACTIVE_FROM IS NULL) OR (UG.DATE_ACTIVE_FROM <= " . $DB->CurrentTimeFunction() . ")) " .
"AND ((UG.DATE_ACTIVE_TO IS NULL) OR (UG.DATE_ACTIVE_TO >= " . $DB->CurrentTimeFunction() . ")) ";
$rs = $DB->Query($sql);
while ($ar = $rs->Fetch())
{
$arPolicies[] = $ar;
}
}
// default policy
$policy = new PolicyRulesCollection();
foreach ($arPolicies as $ar)
{
if ($ar["SECURITY_POLICY"])
{
$arGroupPolicy = unserialize($ar["SECURITY_POLICY"], ['allowed_classes' => false]);
}
else
{
continue;
}
if (!is_array($arGroupPolicy))
{
continue;
}
foreach ($arGroupPolicy as $key => $val)
{
$rule = $policy[$key];
if ($rule !== null)
{
if ($rule->assignValue($val))
{
// now we know from which group the rule was last applied
$rule->setGroupId((int)$ar['GROUP_ID']);
}
}
}
}
if (count($cache) <= 10)
{
$cache[$cacheId] = $policy;
}
return $policy;
}