• Модуль: main
  • Путь к файлу: ~/bitrix/modules/main/classes/general/update_client_partner.php
  • Класс: CUpdateClientPartner
  • Вызов: CUpdateClientPartner::UnGzipArchive
static function UnGzipArchive(&$updatesDir, &$strError, $bDelArch = true)
{
	$strError_tmp = "";

	CUpdateClientPartner::AddMessage2Log("exec CUpdateClientPartner::UnGzipArchive");
	$stime = microtime(true);

	$archiveFileName = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/update_archive.gz";

	if (!file_exists($archiveFileName) || !is_file($archiveFileName))
		$strError_tmp .= "[UUGZA01] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_NO_TMP_FILE")).". ";

	if ($strError_tmp == '')
	{
		if (!is_readable($archiveFileName))
			$strError_tmp .= "[UUGZA02] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_NO_READ_FILE")).". ";
	}

	if ($strError_tmp == '')
	{
		$updatesDir = "update_m".time();
		$updatesDirFull = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updatesDir;
		CUpdateClientPartner::__CheckDirPath($updatesDirFull."/", true);

		if (!file_exists($updatesDirFull) || !is_dir($updatesDirFull))
			$strError_tmp .= "[UUGZA03] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_UGA_NO_TMP_CAT")).". ";
		elseif (!is_writable($updatesDirFull))
			$strError_tmp .= "[UUGZA04] ".str_replace("#FILE#", $updatesDirFull, GetMessage("SUPP_UGA_WRT_TMP_CAT")).". ";
	}

	if ($strError_tmp == '')
	{
		$bCompressionUsed = true;

		$fd = fopen($archiveFileName, "rb");
		$flabel = fread($fd, mb_strlen("BITRIX"));
		fclose($fd);

		if ($flabel == "BITRIX")
			$bCompressionUsed = false;
	}

	if ($strError_tmp == '')
	{
		if ($bCompressionUsed)
			$zp = gzopen($archiveFileName, "rb9f");
		else
			$zp = fopen($archiveFileName, "rb");

		if (!$zp)
			$strError_tmp .= "[UUGZA05] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_CANT_OPEN")).". ";
	}

	if ($strError_tmp == '')
	{
		if ($bCompressionUsed)
			$flabel = gzread($zp, mb_strlen("BITRIX"));
		else
			$flabel = fread($zp, mb_strlen("BITRIX"));

		if ($flabel != "BITRIX")
		{
			$strError_tmp .= "[UUGZA06] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";

			if ($bCompressionUsed)
				gzclose($zp);
			else
				fclose($zp);
		}
	}

	if ($strError_tmp == '')
	{
		$strongUpdateCheck = COption::GetOptionString("main", "strong_update_check", "Y");

		while (true)
		{
			if ($bCompressionUsed)
				$add_info_size = gzread($zp, 5);
			else
				$add_info_size = fread($zp, 5);

			$add_info_size = trim($add_info_size);
			if (intval($add_info_size) > 0 && intval($add_info_size)."!"==$add_info_size."!")
			{
				$add_info_size = intval($add_info_size);
			}
			else
			{
				if ($add_info_size != "RTIBE")
					$strError_tmp .= "[UUGZA071] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";

				break;
			}

			if ($bCompressionUsed)
				$add_info = gzread($zp, $add_info_size);
			else
				$add_info = fread($zp, $add_info_size);

			$add_info_arr = explode("|", $add_info);
			if (count($add_info_arr) != 3)
			{
				$strError_tmp .= "[UUGZA072] ".str_replace("#FILE#", $archiveFileName, GetMessage("SUPP_UGA_BAD_FORMAT")).". ";
				break;
			}

			$size = $add_info_arr[0];
			$curpath = $add_info_arr[1];
			$crc32 = $add_info_arr[2];

			$contents = "";
			if (intval($size) > 0)
			{
				if ($bCompressionUsed)
					$contents = gzread($zp, $size);
				else
					$contents = fread($zp, $size);
			}

			$crc32_new = dechex(crc32($contents));

			if ($crc32_new != $crc32)
			{
				$strError_tmp .= "[UUGZA073] ".str_replace("#FILE#", $curpath, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
				break;
			}
			else
			{
				CUpdateClientPartner::__CheckDirPath($updatesDirFull.$curpath, true);

				if (!($fp1 = fopen($updatesDirFull.$curpath, "wb")))
				{
					$strError_tmp .= "[UUGZA074] ".str_replace("#FILE#", $updatesDirFull.$curpath, GetMessage("SUPP_UGA_CANT_OPEN_WR")).". ";
					break;
				}

				if ($contents <> '' && !fwrite($fp1, $contents))
				{
					$strError_tmp .= "[UUGZA075] ".str_replace("#FILE#", $updatesDirFull.$curpath, GetMessage("SUPP_UGA_CANT_WRITE_F")).". ";
					@fclose($fp1);
					break;
				}
				fclose($fp1);

				if ($strongUpdateCheck == "Y")
				{
					$crc32_new = dechex(crc32(file_get_contents($updatesDirFull.$curpath)));
					if ($crc32_new != $crc32)
					{
						$strError_tmp .= "[UUGZA0761] ".str_replace("#FILE#", $curpath, GetMessage("SUPP_UGA_FILE_CRUSH")).". ";
						break;
					}
				}
			}
		}

		if ($bCompressionUsed)
			gzclose($zp);
		else
			fclose($zp);
	}

	if ($strError_tmp == '')
	{
		if ($bDelArch)
			@unlink($archiveFileName);
	}

	CUpdateClientPartner::AddMessage2Log("TIME UnGzipArchive ".Round(microtime(true) - $stime, 3)." sec");

	if ($strError_tmp <> '')
	{
		CUpdateClientPartner::AddMessage2Log($strError_tmp, "CUUGZA");
		$strError .= $strError_tmp;
		return false;
	}
	else
		return true;
}