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