• Модуль: webdav
  • Путь к файлу: ~/bitrix/modules/webdav/classes/iblock.php
  • Класс: CWebDavIblock
  • Вызов: CWebDavIblock::PROPFIND
function PROPFIND(&$options, &$files, $arParams = array())
{
	global $DB;
	if(empty($files))
	{
		$files = array();
	}
	$files["files"] = array();
	$arParams = (is_array($arParams) ? $arParams : array());
	if ($this->e_rights)
		$options['check_permissions'] = false;
	$this->IsDir($options);
	$arParamsIsDir = $this->arParams;
	$arResult = array("NAV_RESULT" => false, "RESULT" => array());

	if ($arParamsIsDir["not_found"] === true)
	{
		$msg = (($arParamsIsDir['parent_id'] === false) ? GetMessage("WD_FOLDER_NOT_FOUND") : GetMessage("WD_FILE_NOT_FOUND"));
		return $this->ThrowError( "404 Not Found", "DESTINATION_FILE_OR_FOLDER_IS_NOT_FOUND", $msg, __LINE__);
	}
	elseif($arParamsIsDir["is_dir"] != true)
	{
		$db_res = $this->_get_mixed_list(intval($arParamsIsDir["parent_id"]), $arParams, intval($arParamsIsDir["item_id"]));
		if ($db_res && $res = $db_res->Fetch())
		{
			if ($this->MetaNames($res))
			{
				$files["files"]["F".$res["ID"]] = $this->_get_file_info_arr($res, $arParams);
				if ($arParams["return"] == "array")
					$files["files"]["F".$res["ID"]] = $res;
				$arResult["RESULT"]["E".$res["ID"]] = $res; // dummy
			}
		}
	}
	else
	{
		if(!empty($arParamsIsDir['dir_array'][self::UF_LINK_SECTION_ID]))
		{
			$linkWebdav = new self($arParamsIsDir['dir_array'][self::UF_LINK_IBLOCK_ID], $this->base_url . $this->_path, array_merge($this->_originalParams, array(
				'ROOT_SECTION_ID' => $arParamsIsDir['dir_array'][self::UF_LINK_SECTION_ID],
				'symlinkMode' => true,
				'symlinkSectionData' => $arParamsIsDir['dir_array'],
				'symlinkRealRootSectionData' => $this->arRootSection,
			)));
			$options = array(
				'path' => '/',
				'depth' => 1,
				'check_permissions' => false,
			);
			$params = array_merge($arParams, array('PARENT_ID' => $arParamsIsDir['dir_array'][self::UF_LINK_SECTION_ID]));
			$linkWebdav->_path = $this->_path;

			return $linkWebdav->PROPFIND($options, $files, $params);
		}

		//simple detect symlink
		list($contextType, $contextEntityId) = $this->getContextData();
		if($arParamsIsDir['dir_array'])
		{
			$sectionData = $this->getSectionDataForLinkAnalyze($arParamsIsDir['dir_array']['ID'], array(
				'IBLOCK_ID' => $arParamsIsDir['dir_array']['IBLOCK_ID'],
				'ID' => $arParamsIsDir['dir_array']['ID'],
			));

			if(!$this->_symlinkMode && CWebDavSymlinkHelper::isLink($contextType, $contextEntityId, $sectionData))
			{
				$symlinkSectionData = CWebDavSymlinkHelper::getLinkData($contextType, $contextEntityId, $sectionData);
			}
		}
		if(!empty($symlinkSectionData))
		{
			$linkWebdav = new self($symlinkSectionData[self::UF_LINK_IBLOCK_ID], $this->base_url . $this->_path, array_merge($this->_originalParams, array(
				'ROOT_SECTION_ID' => $symlinkSectionData[self::UF_LINK_SECTION_ID],
				'symlinkMode' => true,
				'symlinkSectionData' => $symlinkSectionData,
				'symlinkRealRootSectionData' => $this->arRootSection,
			)));
			$options = array(
				'path' => '/',
				'depth' => 1,
				'check_permissions' => false,
			);
			$params = array_merge($arParams, array('PARENT_ID' => $arParamsIsDir['dir_array']['ID']));
			$linkWebdav->_path = $this->_path;

			return $linkWebdav->PROPFIND($options, $files, $params);
		}

		if ($arParamsIsDir["item_id"] <= 0 || $this->arRootSection["ID"] == $arParamsIsDir["item_id"])
		{
			$files["files"]["iblock"] = $this->get_iblock_info($arr);
			if($this->_symlinkMode)
			{
				$files["files"]["iblock"]['path'] = $this->_path;
				if (SITE_CHARSET != "UTF-8")
					$files["files"]["iblock"]['path'] = $GLOBALS["APPLICATION"]->ConvertCharset($this->_path, SITE_CHARSET, "UTF-8");

			}
			$arResult["IBLOCK"] = $arr;
		}
		else
		{
			$arResult["SECTION"] = $this->arParams["dir_array"];
			if ($this->MetaNames($arResult["SECTION"]))
				$files["files"]["section"] = $this->_get_section_info_arr($arResult["SECTION"]);
			else
				unset($arResult["SECTION"]);
		}

		if (!empty($options["depth"]))
		{
			if (intval($arParamsIsDir["item_id"]) <= 0)
				$arParamsIsDir["item_id"] = ($this->arRootSection ? $this->arRootSection["ID"] : $arParamsIsDir["item_id"]);

			// content search
			$arSearchResults = array();
			if (isset($arParams["FILTER"]["content"]) && $arParams["FILTER"]["content"] <> '' && IsModuleInstalled('search') && CModule::IncludeModule('search'))
			{
				$obSearch = new CSearch;
				if (preg_match("/\.[a-zA-Z]{3,4}$/", $arParams["FILTER"]["content"])) // search by file name?
				{
					$arParams["FILTER"]["content"] = '"'.$arParams["FILTER"]["content"].'"';
				}
				$arSearchParams = array(
					"QUERY" => $arParams["FILTER"]["content"]);
				if (!$this->arRootSection)
				{
					$arSearchParams += array(
						"MODULE_ID" => "iblock",
						"PARAM_2" => $this->IBLOCK_ID);
				}
				else
				{
					if (isset($this->attributes['user_id']))
					{
						$arSearchParams += array(
							"PARAMS" => array("socnet_user" => $this->attributes['user_id']));
					}
					elseif (isset($this->attributes['group_id']))
					{
						$arSearchParams += array(
							"PARAMS" => array("socnet_group" => $this->attributes['group_id']));
					}
				}

				$obSearch->Search($arSearchParams);
				if ($obSearch->errorno != 0)
				{
					$arResult["ERROR_MESSAGE"] = $obSearch->error;
				}
				else
				{
					while($arSearchResultItem = $obSearch->GetNext())
					{
						$arSearchResults[$arSearchResultItem['ITEM_ID']] = true;
					}
				}
			}
			$arSearchOptParams = array_flip(array("SHOW_NEW", "SHOW_HISTORY", "FILE_SIZE_multiply"));

			$arParams["function"] = "propfind";
			$parentID = isset($arParams["FILTER"]) ? ((sizeof(array_diff_key($arParams["FILTER"], $arSearchOptParams))==0) ? $arParamsIsDir["item_id"] : null ) : $arParamsIsDir["item_id"];
			if (isset($arParams["PARENT_ID"]) && intval($arParams["PARENT_ID"]) > 0)
				$parentID = $arParams["PARENT_ID"];

			if (!empty($arParams["FILTER"]))
			{
				$arParams["FILTER"]["SHOW_NEW"] = "Y";
			}
			if ($this->meta_state == "TRASH" && $this->workflow == "bizproc")
			{
				$arParams["FILTER"]["SHOW_HISTORY"] = "Y";
			}


			if (isset($arParams["FILTER"]["doctype"]))
			{
				$arFileTypes = @unserialize(COption::GetOptionString("webdav", "file_types"), ['allowed_classes' => false]);
				if ($arFileTypes !== false)
				{
					foreach ($arFileTypes as $arFileType)
					{
						if ($arParams["FILTER"]["doctype"] == $arFileType["ID"])
							$arParams["FILTER"]["extension"] = str_replace(".","",$arFileType["EXTENSIONS"]);
					}
				}

				unset($arParams["FILTER"]["doctype"]);
			}
			if (isset($arParams["FILTER"]["extension"]))
			{
				$arFltExtensions = array_map('strtoupper', explode(" ", $arParams["FILTER"]["extension"]));
			}

			//$arResult["NAV_RESULT"] = $db_res;

			if (isset($arParams["FILTER"]["content"]) && (sizeof(array_diff_key($arParams["FILTER"], $arSearchOptParams)) === 1))
			{
				// there is only content search
				unset($arParams["FILTER"]["content"]);
				unset($arParams["FILTER"]["FILE_SIZE_multiply"]);
				foreach ($arSearchResults as $itemID => $nopValue)
				{
					$arParams["FILTER"]["ID"] = $itemID;
					$db_res = $this->_get_mixed_list(null, $arParams);

					if ($db_res && $res = $db_res->Fetch())
					{
						if ($this->MetaNames($res))
						{
							if ($res["TYPE"] == "S")
							{
								if (!$this->MetaSectionHide($res))
								{
									$files["files"]["S".$res["ID"]] = $this->_get_section_info_arr($res);
									$arResult["RESULT"]["S".$res["ID"]] = $res;
								}
							}
							else
							{
								$files["files"]["F".$res["ID"]] = $this->_get_file_info_arr($res, $arParams);
								$arResult["RESULT"]["E".$res["ID"]] = $res;
							}
						}
					}
				}
			}
			else
			{
				// there are some other fields to search
				$db_res = $this->_get_mixed_list($parentID, $arParams);
				if ($db_res && $res = $db_res->Fetch())
				{
					do
					{
						if (!empty($arSearchResults) && !isset($arSearchResults[$res["ID"]]))
							continue;
						$this->_parse_webdav_info($res);
						if ($this->meta_state != 'TRASH' && isset($res['PROPS']['BX:']['UNDELETE']))
							continue;
						if ($this->MetaNames($res))
						{
							if ($res["TYPE"] == "S")
							{
								if (!$this->MetaSectionHide($res))
								{
									if (empty($arParams["FILTER"]) || $this->meta_state == "TRASH" || !empty($arParams['FILTER']['SHOW_SECTIONS']))
									{
										$files["files"]["S".$res["ID"]] = $this->_get_section_info_arr($res);
										$arResult["RESULT"]["S".$res["ID"]] = $res;
									}
								}
							}
							else
							{
								if (isset($arFltExtensions))
								{
									$ext = GetFileExtension($res["NAME"]);
									if (! in_array(mb_strtoupper($ext), $arFltExtensions))
										continue;
								}

								$files["files"]["F".$res["ID"]] = $this->_get_file_info_arr($res, $arParams);
								$arResult["RESULT"]["E".$res["ID"]] = $res;
							}
						}
					} while ($res = $db_res->Fetch());
				}
			}
		}
	}

	if ($this->e_rights && (sizeof($arResult['RESULT']) <= 0) && (!$this->GetPermission('SECTION', $arParamsIsDir['item_id'], 'section_read'))) // prevent path disclosure
	{
		$options['check_permissions'] = true;
		$arParamsIsDir = $this->GetObject($options);
		if ($arParamsIsDir["not_found"] === true)
		{
			return $this->ThrowError( "404 Not Found", "DESTINATION_FILE_OR_FOLDER_IS_NOT_FOUND", GetMessage("WD_FOLDER_NOT_FOUND"), __LINE__);
		}
	}
	if ($arParams["return"] == "array")
	{
		return $arResult;
	}
	elseif ($arParams["return"] == "nav_result")
	{
		$arResult["NAV_RESULT"] = new CDBResult;
		$arResult["NAV_RESULT"]->InitFromArray($arResult["RESULT"]);
		return $arResult;
	}
	return true;
}