• Модуль: iblock
  • Путь к файлу: ~/bitrix/modules/iblock/classes/general/iblocksection.php
  • Класс: CAllIBlockSection
  • Вызов: CAllIBlockSection::_check_rights_sql
static function _check_rights_sql($min_permission, $permissionsBy = null)
{
	global $DB, $USER;
	$min_permission = (mb_strlen($min_permission) == 1) ? $min_permission : CIBlockRights::PUBLIC_READ;

	if ($permissionsBy !== null)
		$permissionsBy = (int)$permissionsBy;
	if ($permissionsBy < 0)
		$permissionsBy = null;

	if ($permissionsBy !== null)
	{
		$iUserID = $permissionsBy;
		$strGroups = implode(',', CUser::GetUserGroup($permissionsBy));
		$bAuthorized = false;
	}
	else
	{
		if (is_object($USER))
		{
			$iUserID = (int)$USER->GetID();
			$strGroups = $USER->GetGroups();
			$bAuthorized = $USER->IsAuthorized();
		}
		else
		{
			$iUserID = 0;
			$strGroups = "2";
			$bAuthorized = false;
		}
	}

	$stdPermissions = "
		SELECT IBLOCK_ID
		FROM b_iblock_group IBG
		WHERE IBG.GROUP_ID IN (".$strGroups.")
		AND IBG.PERMISSION >= '".$DB->ForSQL($min_permission)."'
	";
	if(!defined("ADMIN_SECTION"))
		$stdPermissions .= "
			AND (IBG.PERMISSION='" . CIBlockRights::FULL_ACCESS . "' OR B.ACTIVE='Y')
		";

	if($min_permission >= CIBlockRights::FULL_ACCESS)
		$operation = 'section_rights_edit';
	elseif($min_permission >= CIBlockRights::EDIT_ACCESS)
		$operation = 'section_edit';
	elseif($min_permission >= CIBlockRights::PUBLIC_READ)
		$operation = 'section_read';
	else
		$operation = '';

	if($operation)
	{
		$acc = new CAccess;
		$acc->UpdateCodes($permissionsBy !== null ? array('USER_ID' => $permissionsBy) : false);
	}

	if($operation == "section_read")
	{
		$extPermissions = "
			SELECT SR.SECTION_ID
			FROM b_iblock_section_right SR
			INNER JOIN b_iblock_right IBR ON IBR.ID = SR.RIGHT_ID
			".($iUserID > 0? "LEFT": "INNER")." JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = ".$iUserID."
			WHERE SR.SECTION_ID = BS.ID
			AND IBR.OP_SREAD = 'Y'
			".($bAuthorized || $iUserID > 0? "
				AND (UA.USER_ID IS NOT NULL
				".($bAuthorized? "OR IBR.GROUP_CODE = 'AU'": "")."
				".($iUserID > 0? "OR (IBR.GROUP_CODE = 'CR' AND BS.CREATED_BY = ".$iUserID.")": "")."
			)": "")."
		";

		$strResult = "(
			B.ID IN ($stdPermissions)
			OR (B.RIGHTS_MODE = 'E' AND EXISTS ($extPermissions))
		)";
	}
	elseif($operation)
	{
		$extPermissions = "
			SELECT SR.SECTION_ID
			FROM b_iblock_section_right SR
			INNER JOIN b_iblock_right IBR ON IBR.ID = SR.RIGHT_ID
			INNER JOIN b_task_operation T ON T.TASK_ID = IBR.TASK_ID
			INNER JOIN b_operation O ON O.ID = T.OPERATION_ID
			".($iUserID > 0? "LEFT": "INNER")." JOIN b_user_access UA ON UA.ACCESS_CODE = IBR.GROUP_CODE AND UA.USER_ID = ".$iUserID."
			WHERE SR.SECTION_ID = BS.ID
			AND O.NAME = '".$operation."'
			".($bAuthorized || $iUserID > 0? "
				AND (UA.USER_ID IS NOT NULL
				".($bAuthorized? "OR IBR.GROUP_CODE = 'AU'": "")."
				".($iUserID > 0? "OR (IBR.GROUP_CODE = 'CR' AND BS.CREATED_BY = ".$iUserID.")": "")."
			)": "")."
		";

		$strResult = "(
			B.ID IN ($stdPermissions)
			OR (B.RIGHTS_MODE = 'E' AND EXISTS ($extPermissions))
		)";
	}
	else
	{
		$strResult = "(
			B.ID IN ($stdPermissions)
		)";
	}

	return $strResult;
}