static function UnGzipArchive(&$updates_dir, &$strError, $DelArch = "Y")
{
$strError_tmp = "";
CUpdateSystem::AddMessage2Log("exec CUpdateSystem::UnGzipArchive");
$stime = CUpdateSystem::getmicrotime();
if ($DelArch!="Y")
$DelArch = "N";
$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 == '')
{
$updates_dir = "update_m".time();
$updates_dir_full = $_SERVER["DOCUMENT_ROOT"]."/bitrix/updates/".$updates_dir;
CUpdateSystem::CheckDirPath($updates_dir_full."/", true);
if (!file_exists($updates_dir_full) || !is_dir($updates_dir_full))
{
$strError_tmp .= "[UUGZA03] ".str_replace("#FILE#", $updates_dir_full, GetMessage("SUPP_UGA_NO_TMP_CAT")).".
";
}
elseif (!is_writable($updates_dir_full))
{
$strError_tmp .= "[UUGZA04] ".str_replace("#FILE#", $updates_dir_full, GetMessage("SUPP_UGA_WRT_TMP_CAT")).".
";
}
}
if ($strError_tmp == '')
{
$bCompressionUsed = true;
$fd = fopen($archiveFileName, "rb");
$flabel = fread($fd, 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, strlen("BITRIX"));
else
$flabel = fread($zp, 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
{
CUpdateSystem::CheckDirPath($updates_dir_full.$curpath, true);
if (!($fp1 = fopen($updates_dir_full.$curpath, "wb")))
{
$strError_tmp .= "[UUGZA074] ".str_replace("#FILE#", $updates_dir_full.$curpath, GetMessage("SUPP_UGA_CANT_OPEN_WR")).".
";
break;
}
if ($contents <> '' && !fwrite($fp1, $contents))
{
$strError_tmp .= "[UUGZA075] ".str_replace("#FILE#", $updates_dir_full.$curpath, GetMessage("SUPP_UGA_CANT_WRITE_F")).".
";
@fclose($fp1);
break;
}
fclose($fp1);
if ($strongUpdateCheck == "Y")
{
$crc32_new = dechex(crc32(file_get_contents($updates_dir_full.$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 ($DelArch=="Y")
@unlink($archiveFileName);
}
CUpdateSystem::AddMessage2Log("TIME UnGzipArchive ".Round(CUpdateSystem::getmicrotime()-$stime, 3)." sec");
if ($strError_tmp <> '')
{
CUpdateSystem::AddMessage2Log($strError_tmp, "CUUGZA");
$strError .= $strError_tmp;
return false;
}
else
return true;
}