• Модуль: 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;
}