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;
}