- Модуль: webdav
- Путь к файлу: ~/bitrix/modules/webdav/classes/iblocksocnet.php
- Класс: CIBlockWebdavSocnet
- Вызов: CIBlockWebdavSocnet::CanAccessFiles
static function CanAccessFiles($iblock_id, $entity_type, $entity_id)
{
$result = false;
$iblock_id = intval($iblock_id);
$entity_id = intval($entity_id);
if (
($iblock_id > 0) &&
($entity_id > 0) &&
($entity_type == 'group' || $entity_type == 'user')
)
{
//cache
$value = false;
static $data = array();
$CACHE_PATH = "/".SITE_ID."/webdav/can_access_files";
$CACHE_ID = $iblock_id;
$CACHE_TIME = 3600*24*30;
$docCache = new CPHPCache;
if (!isset($data[$iblock_id]))
{
if ($docCache->InitCache($CACHE_TIME, $CACHE_ID, $CACHE_PATH))
$value = $docCache->GetVars();
$data[$iblock_id] = $value;
}
if (isset($data[$iblock_id][$entity_type][$entity_id]))
return $data[$iblock_id][$entity_type][$entity_id];
//end cache
CModule::IncludeModule('iblock');
$rIB = CIBlock::GetList(
array(),
array(
'ID' => $iblock_id,
"CHECK_PERMISSIONS"=>"N"
)
);
if (
$rIB
&& ($arIB = $rIB->Fetch())
&& ($arIB["RIGHTS_MODE"] === "E")
)
{
$rootSectionID = self::GetSectionID($iblock_id, $entity_type, $entity_id);
if ($rootSectionID !== false)
{
$ibRights = new CIBlockSectionRights($iblock_id, $rootSectionID);
$result = $ibRights->UserHasRightTo($iblock_id, $rootSectionID, 'section_read');
if (!$result)
{
$arParams = array(
"DOCUMENT_TYPE" => array(
"webdav",
"CIBlockDocumentWebdavSocnet",
implode("_", array("iblock", $iblock_id, $entity_type, $entity_id))
),
"ROOT_SECTION_ID" => $rootSectionID,
"ATTRIBUTES" => (
($entity_type == "user")
? array('user_id' => $entity_id)
: array('group_id' => $entity_id)
)
);
$ob = new CWebDavIblock($iblock_id, '', $arParams);
if ($ob && empty($ob->arError) && ($ob->permission > 'D'))
{
$files = array();
$options = array("path" => '/', "depth" => 1);
$res = $ob->PROPFIND($options, $files, array("return" => "array"));
$result = (is_array($res) && (sizeof($res['RESULT']) > 0)); // at least 1 item can be read
}
}
}
else // no files exist, no rights set, but feature is turn on in group
{
return true;
}
}
else
{
$result = (CIBlock::GetPermission($iblock_id) > "D");
}
// cache
if ($data[$iblock_id] === false)
$data[$iblock_id] = array();
$data[$iblock_id][$entity_type][$entity_id] = $result;
$docCache->Clean($CACHE_ID, $CACHE_PATH);
$docCache->InitCache($CACHE_TIME, $CACHE_ID, $CACHE_PATH);
if ($docCache->StartDataCache())
{
global $CACHE_MANAGER;
$CACHE_MANAGER->StartTagCache($CACHE_PATH);
$CACHE_MANAGER->RegisterTag("iblock_id_".$iblock_id);
$CACHE_MANAGER->RegisterTag('wd_socnet');
$CACHE_MANAGER->EndTagCache();
$docCache->EndDataCache($data[$iblock_id]);
}
// end cache
}
return $result;
}