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