Current Path : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/main/admin/ |
Current File : /var/www/html/clients/amz.e-nk.ru/bitrix/modules/main/admin/site_checker.php |
<? ############################################## # Bitrix Site Manager # # Copyright (c) 2002-2010 Bitrix # # http://www.bitrixsoft.com # # mailto:admin@bitrixsoft.com # ############################################## ini_set("track_errors", "1"); ini_set('display_errors', 1); error_reporting(E_ALL &~E_NOTICE); $message = null; if (!function_exists("file_get_contents")) { function file_get_contents($filename) { $fd = fopen("$filename", "rb"); $content = fread($fd, filesize($filename)); fclose($fd); return $content; } } if (!function_exists("ob_get_clean")) { function ob_get_clean() { $ob_contents = ob_get_contents(); ob_end_clean(); return $ob_contents; } } # NO AUTH TESTS if ($_REQUEST['unique_id'] && $_REQUEST['unique_id'] == checker_get_unique_id()) { if ($_GET['socket_test']) { echo "SUCCESS"; } elseif ($_GET['upload_test']) { $tmp_name = $_FILES['test_file']['tmp_name']; $image = $_SERVER['DOCUMENT_ROOT'].'/bitrix/site_checker.gif'; if (move_uploaded_file($tmp_name, $image)) { $BinaryData0 = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/bitrix/images/1.gif'); $BinaryData1 = file_get_contents($image); if ($BinaryData0 == $BinaryData1) echo "SUCCESS"; unlink($image); } } elseif ($_GET['memory_test']) { @ini_set("memory_limit", "512M"); $max = intval($_GET['max']); if ($max) { for($i=1;$i<=$max;$i++) $a[] = str_repeat(chr($i),1024*1024); // 1 Mb echo "SUCCESS"; } } elseif ($_GET['auth_test']) { $remote_user = $_SERVER["REMOTE_USER"] ? $_SERVER["REMOTE_USER"] : $_SERVER["REDIRECT_REMOTE_USER"]; $strTmp = base64_decode(substr($remote_user,6)); if ($strTmp) list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) = explode(':', $strTmp); if ($_SERVER['PHP_AUTH_USER']=='test_user' && $_SERVER['PHP_AUTH_PW']=='test_password') echo('SUCCESS'); } elseif ($_GET['session_test']) { session_start(); echo $_SESSION['CHECKER_CHECK_SESSION']; $_SESSION['CHECKER_CHECK_SESSION'] = 'SUCCESS'; } elseif ($_GET['redirect_test']) { function SetStatus($status) { $bCgi = (stristr(php_sapi_name(), "cgi") !== false); $bFastCgi = ($bCgi && (array_key_exists('FCGI_ROLE', $_SERVER) || array_key_exists('FCGI_ROLE', $_ENV))); if($bCgi && !$bFastCgi) header("Status: ".$status); else header($_SERVER["SERVER_PROTOCOL"]." ".$status); } function IsHTTPS() { return ($_SERVER["SERVER_PORT"]==443 || strtolower($_SERVER["HTTPS"])=="on"); } function LocalRedirect($url, $skip_security_check=false, $status="302 Found") { $HTTP_HOST = $_SERVER['HTTP_HOST']; $SERVER_PORT = $_SERVER['SERVER_PORT']; $url = str_replace("&","&",$url); $sessid = session_id(); $sessname = session_name(); if (strlen($sessid)>0 && false) { if(strpos($url,$sessname."=")===false) { $arr_url = explode("#",$url); $url_1 = $arr_url[0]; $url_2 = $arr_url[1]; if(!(strpos($url, "?") === false)) $url_1 .= "&".$sessname."=".$sessid; else $url_1 .= "?".$sessname."=".$sessid; $url = $url_1.((strlen($url_2)>0) ? "#".$url_2 : ""); } } $arr = explode("?",$url); if (strpos($arr[0],"/")===false) $url = dirname($_SERVER['PHP_SELF']).$url; // http response splitting defence $url = str_replace ("\r", "", $url); $url = str_replace ("\n", "", $url); SetStatus($status); if( strtolower(substr($url,0,7))=="http://" || strtolower(substr($url,0,8))=="https://" || strtolower(substr($url,0,6))=="ftp://") { header("Request-URI: $url"); header("Content-Location: $url"); header("Location: $url"); } else { if($SERVER_PORT <> 80 && $SERVER_PORT <> 443 && $SERVER_PORT > 0 && strpos($HTTP_HOST, ":") === false) $HTTP_HOST .= ":".$SERVER_PORT; $protocol = (IsHTTPS() ? "https" : "http"); header("Request-URI: $protocol://$HTTP_HOST$url"); header("Content-Location: $protocol://$HTTP_HOST$url"); header("Location: $protocol://$HTTP_HOST$url"); } } if ($_REQUEST['done']) echo 'SUCCESS'; else LocalRedirect($_SERVER['PHP_SELF']."?redirect_test=Y&done=Y&unique_id=".checker_get_unique_id()); } die(); } # END NO AUTH TESTS require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_before.php"); if ($_REQUEST['read_log']) // after prolog to sent correct charset { $oTest = new CTest(); echo file_get_contents($_SERVER['DOCUMENT_ROOT'].$oTest->LogFile); die(); } require_once($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/prolog.php"); define("HELP_FILE", "utilities/site_checker.php"); error_reporting(E_ALL &~E_NOTICE); //////////////////////////////////////////////////////////////////////// ////////// PARAMS ////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// define(SUPPORT_PAGE, LANGUAGE_ID == 'ru' ? 'http://www.1c-bitrix.ru/support/' : 'http://www.bitrixsoft.com/support/'); $SYSTEM_min_avail_memory = 32; // Min & recomended memory in Mb $SYSTEM_rec_avail_memory = 64; $SYSTEM_min_avail_disk = 100; // Min disk size in Mb $SYSTEM_min_avail_disk_tmp = 20; // Min tmp disk size in Mb $PHP_vercheck_min = "5.0.0"; $PHP_vercheck_max = ""; $Apache_vercheck_min = "1.3.0"; $Apache_vercheck_max = ""; $IIS_vercheck_min = "5.0.0"; $IIS_vercheck_max = ""; $MySql_vercheck_min = "4.1.11"; $MySql_vercheck_max = ""; $Oracle_vercheck_min = "10.0"; $Oracle_vercheck_max = ""; $MSSQL_vercheck_min = "9.0"; $MSSQL_vercheck_max = ""; //////////////////////////////////////////////////////////////////////// ////////// END PARAMS ////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// if(!$USER->CanDoOperation('view_other_settings')) $APPLICATION->AuthForm(GetMessage("ACCESS_DENIED")); IncludeModuleLangFile(__FILE__); $aTabs = array( array("DIV" => "edit1", "TAB" => GetMessage("SC_TAB_1"), "ICON" => "site_check", "TITLE" => GetMessage("SC_SUBTITLE_REQUIED")), array("DIV" => "edit2", "TAB" => GetMessage("SC_TAB_2"), "ICON" => "site_check", "TITLE" => GetMessage("SC_SUBTITLE_DISK")), array("DIV" => "edit3", "TAB" => GetMessage('SC_TEST_CONFIG'), "ICON" => "site_check", "TITLE" => GetMessage('SC_TEST_CONFIG')), // array("DIV" => "edit4", "TAB" => GetMessage("SC_TAB_4"), "ICON" => "site_check", "TITLE" => GetMessage("SC_SUBTITLE_SITE_MODULES")), array("DIV" => "edit5", "TAB" => GetMessage("SC_TAB_5"), "ICON" => "site_check", "TITLE" => GetMessage("SC_TIK_TITLE")), ); if ($_POST['access_check'] && check_bitrix_sessid()) { $ob = new CSearchFiles; $ob->TimeLimit = 10; if ($_REQUEST['break_point']) $ob->SkipPath = $_REQUEST['break_point']; $path = $_SERVER['DOCUMENT_ROOT']; $check_type = $_REQUEST['check_type']; if ($check_type == 'upload') $path .= '/'.COption::GetOptionString('main', 'upload_dir', 'upload'); elseif($check_type == 'kernel') $path .= BX_ROOT; elseif($check_type == 'personal') $path .= BX_PERSONAL_ROOT; else $check_type = 'full'; if ($ob->Search($path)) { if ($ob->BreakPoint) { $cnt_total = intval($_REQUEST['cnt_total']) + $ob->FilesCount; ?><form method=post id=postform> <input type=hidden name=access_check value="Y"> <?=bitrix_sessid_post();?> <input type=hidden name=cnt_total value="<?=$cnt_total?>"> <input type=hidden name=check_type value="<?=$check_type?>"> <input type=hidden name=break_point value="<?=htmlspecialchars($ob->BreakPoint)?>"> </form> <? CAdminMessage::ShowMessage(array( 'TYPE' => 'OK', 'HTML' => true, 'MESSAGE' => GetMessage('SC_TESTING'), 'DETAILS' => str_replace(array('#NUM#','#PATH#'),array($cnt_total,$ob->BreakPoint),GetMessage('SC_FILES_CHECKED')), ) ); ?> <script> if (parent.document.getElementById('access_submit').disabled) window.setTimeout("parent.ShowWaitWindow();document.getElementById('postform').submit()",1000); </script><? } else { CAdminMessage::ShowMessage(Array("TYPE"=>"OK", "MESSAGE"=>GetMessage("SC_FILES_OK"))); ?><script>parent.access_check_start(0);</script><? } } else { CAdminMessage::ShowMessage(array( 'TYPE' => 'ERROR', 'MESSAGE' => GetMessage("SC_FILES_FAIL"), 'DETAILS' => implode("<br>\n",$ob->arFail), 'HTML' => true ) ); ?><script>parent.access_check_start(0);</script><? } die(); } elseif($_REQUEST['test_start'] && check_bitrix_sessid()) { $test_mysql = (strtolower($DB->type) == 'mysql'); $oTest = new CTest($_REQUEST['step'], $test_mysql); $oTest->test_last_value = base64_decode($_REQUEST['test_last_value']); $oTest->Start(); echo 'CurrentStatus = Array('.$oTest->percent.',"'.$oTest->strNextTestName.'", "'.($oTest->percent < 100 ? '&step='.$oTest->step.'&test_last_value='.base64_encode($oTest->test_last_value) : '').'","'.$oTest->strCurrentTestName.'","'.CUtil::JSEscape(str_replace(array("\r","\n"),"",$oTest->strResult)).'");'; die(); } $tabControl = new CAdminTabControl("tabControl", $aTabs); $APPLICATION->SetTitle(GetMessage("SC_TITLE")); require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/prolog_admin_after.php"); echo BeginNote(); echo GetMessage("SC_NOTES1"); echo EndNote(); ?> <? $tabControl->Begin(); $tabControl->BeginNextTab(); ?> <tr> <td colspan="2"><?=GetMessage("SC_SUBTITLE_REQUIED_DESC")?></td> </tr> <tr> <td colspan="2"> <table cellpadding="0" cellspacing="0" border="0" width="100%" class="internal"> <tr class="heading"> <td align="center"><b><?=GetMessage("SC_PARAM")?></b></td> <td align="center"><b><?=GetMessage("SC_REQUIED")?></b></td> <td align="center"><b><?=GetMessage("SC_CURRENT")?></b></td> </tr> <? $strSERVER_SOFTWARE = $_SERVER["SERVER_SOFTWARE"]; if (strlen($strSERVER_SOFTWARE)<=0) $strSERVER_SOFTWARE = $_SERVER["SERVER_SIGNATURE"]; $strWebServer = ""; $strWebServerVersion = ""; $strSERVER_SOFTWARE = Trim($strSERVER_SOFTWARE); if (preg_match("#^([a-zA-Z-]+).*?([\d]+\.[\d]+(\.[\d]+)?)#i", $strSERVER_SOFTWARE, $arSERVER_SOFTWARE)) { $strWebServer = $arSERVER_SOFTWARE[1]; $strWebServerVersion = $arSERVER_SOFTWARE[2]; $vercheck_min = ""; $vercheck_max = ""; if (strtoupper($strWebServer)=="APACHE") { $vercheck_min = $Apache_vercheck_min; $vercheck_max = $Apache_vercheck_max; } elseif (strtoupper($strWebServer)=="MICROSOFT-IIS") { $vercheck_min = $IIS_vercheck_min; $vercheck_max = $IIS_vercheck_max; } } ?> <tr> <td valign="top"><?=str_replace("#SERVER#", ((strlen($strWebServer)>0) ? $strWebServer : GetMessage("SC_UNKNOWN")), GetMessage("SC_SERVER_VERS"))?></td> <td valign="top"><? if (strlen($vercheck_min)>0) echo str_replace("#VER#", $vercheck_min, GetMessage("SC_VER_VILKA1")); if (strlen($vercheck_min)>0 && strlen($vercheck_max)>0) echo GetMessage("SC_VER_VILKA2"); if (strlen($vercheck_max)>0) echo str_replace("#VER#", $vercheck_max, GetMessage("SC_VER_VILKA3")); ?></td> <td valign="top"><? if (strlen($strWebServerVersion)>0) ShowResult($strWebServerVersion, ((CheckVersionMinimax($strWebServerVersion, $vercheck_min, $vercheck_max)) ? "O" : "E")); else ShowResult(GetMessage("SC_UNKNOWN1"), "E"); ?></td> </tr> <? if (strtolower($DB->type)=="oracle") { $vercheck_min = $Oracle_vercheck_min; $vercheck_max = $Oracle_vercheck_max; } elseif (strtolower($DB->type)=="mssql") { $vercheck_min = $MSSQL_vercheck_min; $vercheck_max = $MSSQL_vercheck_max; } else { $vercheck_min = $MySql_vercheck_min; $vercheck_max = $MySql_vercheck_max; } ?> <tr> <td valign="top"><?=str_replace("#DB#", $DB->type, GetMessage("SC_DB_VERS"))?></td> <td valign="top"><? if (strlen($vercheck_min)>0) echo str_replace("#VER#", $vercheck_min, GetMessage("SC_VER_VILKA1")); if (strlen($vercheck_min)>0 && strlen($vercheck_max)>0) echo GetMessage("SC_VER_VILKA2"); if (strlen($vercheck_max)>0) echo str_replace("#VER#", $vercheck_max, GetMessage("SC_VER_VILKA3")); ?> </td> <td valign="top"><? if ($version = $DB->GetVersion()) { if (preg_match("#^([\d]+\.[\d]+(\.[\d]+)?)#i", $version, $arVers)) ShowResult($arVers[1], ((CheckVersionMinimax($arVers[1], $vercheck_min, $vercheck_max)) ? "O" : "E")); else ShowResult(GetMessage("SC_UNKNOWN1"), "E"); } else ShowResult(GetMessage("SC_ERR_QUERY_VERS"), "E"); ?></td> </tr> <tr> <td valign="top"><?=GetMessage("SC_PHP_VERS")?></td> <td valign="top"><? if (strlen($PHP_vercheck_min)>0) echo str_replace("#VER#", $PHP_vercheck_min, GetMessage("SC_VER_VILKA1")); if (strlen($PHP_vercheck_min)>0 && strlen($PHP_vercheck_max)>0) echo GetMessage("SC_VER_VILKA2"); if (strlen($PHP_vercheck_max)>0) echo str_replace("#VER#", $PHP_vercheck_max, GetMessage("SC_VER_VILKA3")); ?> </td> <td valign="top"><?ShowResult(phpversion(), (!CheckVersionMinimax(phpversion(), $PHP_vercheck_min, $PHP_vercheck_max) ? "E" : "O"))?></td> </tr> <tr> <td valign="top"><?=GetMessage("SC_OS_VERSION")?></td> <td valign="top"></td> <td valign="top"><?=ShowResult(htmlspecialchars(PHP_OS), "O")?></td> </tr> <? $bDomainFound = false; $bUtf = false; $bChar = false; $arDocRoot = array(); $rs = CSite::GetList($by,$order,array('ACTIVE'=>'Y')); while($f = $rs->Fetch()) { $charset = strtolower($f['CHARSET']); $bFound = strpos($charset,'utf')!==false; $bUtf = $bUtf || $bFound; $bChar = $bChar || !$bFound; $arDocRoot[] = trim($f['DOC_ROOT']); if ($f['SERVER_NAME'] == $_SERVER['SERVER_NAME'] || strpos($f['DOMAINS'],$_SERVER['HTTP_HOST'])!==false) $bDomainFound = true; } ?> <? if (!$bDomainFound) : ?> <tr> <td valign="top"> - <?=GetMessage("SC_VAR_VALUE")?> <i>$_SERVER['HTTP_HOST']</i></td> <td valign="top"><?=GetMessage("SC_DOC_ROOT_HELP")?></td> <td valign="top"><?=ShowResult(htmlspecialchars($_SERVER['HTTP_HOST']), "E")?></td> </tr> <? endif; ?> <? if ($bUtf && (!defined('BX_UTF') || BX_UTF !== true)) : ?> <tr> <td valign="top"> - <?=GetMessage("SC_CONSTANT")?> BX_UTF</td> <td valign="top"><?=GetMessage("SC_UTF_HELP")?></td> <td valign="top"><?=ShowResult(GetMessage("SC_BX_UTF_FAIL"), "E")?></td> </tr> <? endif; ?> <? if ($bUtf && $bChar) : ?> <tr> <td valign="top"> - <?=GetMessage("SC_SITE_CHARSET")?></td> <td valign="top"><?=GetMessage("SC_SITE_CHARSET_HELP")?></td> <td valign="top"><?=ShowResult(GetMessage("SC_SITE_CHARSET_FAIL"), "E")?></td> </tr> <? endif; ?> <? $ms_ok = true; if (count($arDocRoot) == 1) { if ($arDocRoot[0]) { $ms_req = GetMessage('SC_PATH_FAIL'); $ms_cur = htmlspecialchars(trim($arDocRoot[0])); $ms_ok = false; } } else { foreach($arDocRoot as $root) { if ($root) { if (!is_readable($root.'/bitrix')) { $ms_req = GetMessage('SC_ROOT_ACCESS'); $ms_cur = GetMessage('SC_NO_ACCESS').' '.$root.'/bitrix'; $ms_ok = false; break; } } } } ?> <? if (!$ms_ok) : ?> <tr> <td valign="top"> - <?=GetMessage("SC_MULTISITE")?></td> <td valign="top"><?=$ms_req?></td> <td valign="top"><?=ShowResult($ms_cur, "E")?></td> </tr> <? endif; ?> <tr> <td colspan="3"><b><?=GetMessage("SC_PHP_SETTINGS")?></b></td> </tr> <tr> <td valign="top"> - safe mode</td> <td valign="top"><?=GetMessage("SC_TURN_OFF")?></td> <td valign="top"><?=((GetPHPSetting("safe_mode")=="ON") ? ShowResult(GetMessage("SC_TURN_ON"), "E") : ShowResult(GetMessage("SC_TURN_OFF"), "O"))?></td> </tr> <? $overload = intval(ini_get('mbstring.func_overload')); $encoding = strtolower(ini_get('mbstring.internal_encoding')); if ($bUtf) { $mb_string_req = 'mbstring.func_overload=2<br>mbstring.internal_encoding=utf-8'; $mb_string_cur = 'mbstring.func_overload='.$overload.'<br>mbstring.internal_encoding='.$encoding; $mb_string_ok = ($overload == 2) && ($encoding == 'utf8' || $encoding == 'utf-8'); } else { if ($overload == 2) { $mb_string_ok = false === strpos($encoding,'utf'); $mb_string_req = 'mbstring.internal_encoding=cp1251'; $mb_string_cur = 'mbstring.internal_encoding='.$encoding; } else { $mb_string_req = 'mbstring.func_overload=0'; $mb_string_cur = 'mbstring.func_overload='.$overload; $mb_string_ok = $overload == 0; } } ?> <tr> <td valign="top"> - mbstring</td> <td valign="top"><?=$mb_string_req?></td> <td valign="top"><?=ShowResult($mb_string_cur, $mb_string_ok ? "O" : "E")?></td> </tr> <? $val = ini_get_bool('magic_quotes_sybase'); ?> <tr> <td valign="top"> - magic_quotes_sybase</td> <td valign="top"><?=GetMessage("SC_TURN_OFF")?></td> <td valign="top"><?=ShowResult($val ? GetMessage("SC_TURN_ON") : GetMessage("SC_TURN_OFF"), $val ? "E" : "O")?></td> </tr> <? $val = ini_get_bool('allow_call_time_pass_reference'); ?> <tr> <td valign="top"> - allow_call_time_pass_reference</td> <td valign="top"><?=GetMessage("SC_TURN_ON")?></td> <td valign="top"><?=ShowResult($val ? GetMessage("SC_TURN_ON") : GetMessage("SC_TURN_OFF"), $val ? "O" : "E")?></td> </tr> <tr> <td valign="top"> - <?=GetMessage("SC_AVAIL_MEMORY")?></td> <td valign="top"><? if (IntVal($SYSTEM_min_avail_memory)>0) echo str_replace("#SIZE#", $SYSTEM_min_avail_memory, GetMessage("SC_AVAIL_MEMORY_MIN")); if (IntVal($SYSTEM_min_avail_memory)>0 && IntVal($SYSTEM_rec_avail_memory)>0) echo ", "; if (IntVal($SYSTEM_rec_avail_memory)>0) echo str_replace("#SIZE#", $SYSTEM_rec_avail_memory, GetMessage("SC_AVAIL_MEMORY_REC")); ?></td> <td valign="top"><? $memory_limit = ini_get('memory_limit'); if (!$memory_limit || strlen($memory_limit)<=0) $memory_limit = get_cfg_var('memory_limit'); $memory_limit = IntVal(Trim($memory_limit)); echo (($memory_limit < $SYSTEM_min_avail_memory) ? ShowResult($memory_limit." Mb", "E") : ShowResult($memory_limit." Mb", "O") ); ?></td> </tr> <tr> <td valign="top"> - <?=GetMessage("SC_ALLOW_UPLOAD")?> (file_uploads)</td> <td valign="top"><?=GetMessage("SC_TURN_ON1")?></td> <td valign="top"><? if (GetPHPSetting("file_uploads")=="ON") { ShowResult(GetMessage("SC_TURN_ON1"), "O"); $sp = ini_get("upload_tmp_dir"); if (strlen($sp)>0) { echo ", "; echo GetMessage("SC_TEMP_FOLDER")." <b>".$sp."</b> "; if (file_exists($sp)) { if (is_writable($sp)) ShowResult(GetMessage("SC_CAN_WRITE1"), "O"); else ShowResult(GetMessage("SC_CAN_NOT_WRITE1"), "E"); } else ShowResult(GetMessage("SC_NOT_EXISTS"), "E"); } # else # ShowResult(GetMessage("SC_NO_TEMP_FOLDER"), "E"); } else ShowResult(GetMessage("SC_TURN_OFF1"), "E"); ?></td> </tr> <tr> <td colspan="3"><b><?=GetMessage("SC_REQUIED_PHP_MODS")?></b></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/function.fsockopen.php" target="_blank"><?=GetMessage("SC_SOCKET_F")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=((function_exists("fsockopen")) ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/ref.xml.php" target="_blank"><?=GetMessage("SC_MOD_XML")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=((extension_loaded('xml') && function_exists("xml_parser_create")) ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/ref.regex.php" target="_blank"><?=GetMessage("SC_MOD_POSIX_REG")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=(function_exists("eregi") ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/ref.pcre.php" target="_blank"><?=GetMessage("SC_MOD_PERL_REG")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=(function_exists("preg_match") ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/function.imagettftext.php" target="_blank">FreeType library</a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=(function_exists("imagettftext") ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/ref.zlib.php" target="_blank">Zlib Compression</a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?= ((extension_loaded('zlib') && function_exists("gzcompress")) ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E") )?></td> </tr> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/ref.image.php" target="_blank"><?=GetMessage("SC_MOD_GD_F")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?= (function_exists("imagecreatetruecolor") && function_exists("imagecreatefromjpeg") ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E"))?></td> </tr> <? if ($bUtf) : ?> <tr> <td valign="top"> - <a title="<?=GetMessage("SC_EXTINSION_VIEW")?>" href="http://www.php.net/manual/en/book.mbstring.php" target="_blank"><?=GetMessage("SC_MBSTRING_F")?></a></td> <td valign="top"><?=GetMessage("SC_SETTED")?></td> <td valign="top"><?=(function_exists("mb_substr")) ? ShowResult(GetMessage("SC_SETTED"), "O") : ShowResult(GetMessage("SC_NOT_SETTED"), "E")?></td> </tr> <? endif; ?> </table> </td> </tr> <?flush(); $tabControl->BeginNextTab();?> <tr> <td colspan="2"><?echo GetMessage("SC_SUBTITLE_DISK_DESC");?></td> </tr> <tr> <td colspan="2"> <script> function onFrameLoad(ob) { CloseWaitWindow(); if (ob.contentDocument) oDoc = ob.contentDocument; else oDoc = ob.contentWindow.document; document.getElementById('access_result').innerHTML = oDoc.body.innerHTML } function access_check_start(val) { document.getElementById('access_submit').disabled = val ? 'disabled' : ''; document.getElementById('access_stop').disabled = val ? '' : 'disabled'; if (val) ShowWaitWindow(); else CloseWaitWindow(); } </script> <? # CAdminMessage::ShowMessage(Array("MESSAGE"=>GetMessage("SC_CHECK_FILES_ATTENTION"), "TYPE"=>"ERROR","DETAILS"=>GetMessage("SC_CHECK_FILES_WARNING"))); ?> <form method="POST" action="site_checker.php" target="access_frame" onsubmit="access_check_start(1)"> <input type=hidden name=access_check value=Y> <?=bitrix_sessid_post();?> <label><input type=radio name=check_type value=full checked> <?=GetMessage("SC_CHECK_FULL")?></label><br> <label><input type=radio name=check_type value=upload> <?=GetMessage("SC_CHECK_UPLOAD")?></label><br> <label><input type=radio name=check_type value=kernel> <?=GetMessage("SC_CHECK_KERNEL")?></label><br> <? if (BX_ROOT != BX_PERSONAL_ROOT): ?> <label><input type=radio name=check_type value=cache> <?=GetMessage("SC_CHECK_FOLDER")?> <b><?=BX_PERSONAL_ROOT?></b></label><br> <? endif; ?> <br> <input type=submit value="<?=GetMessage("SC_CHECK_B")?>" id="access_submit"> <input type=button value="<?=GetMessage("SC_STOP_B")?>" disabled id="access_stop" onclick="access_check_start(0)"> </form> <div width="100%" id="access_result"></div> <iframe name="access_frame" style="width:1px;height:1px;visibility:hidden" onload="onFrameLoad(this)"></iframe> </td> </tr> <? $tabControl->BeginNextTab(); ?> <tr> <td colspan="2"><?=GetMessage("SC_CONF_HELP")?></td> </tr> <tr> <td colspan="2"> <? $clean_test_table = '<table id="result_table" cellpadding="0" cellspacing="0" border="0" width="100%" class="internal"><tr class="heading"><td width="40%"><b>'.GetMessage("SC_TEST_NAME").'</b></td><td><b>'.GetMessage("SC_TEST_RES").'</b></td></tr></table>'; $oTest = new CTest(); ?> <script> var bTestFinished = false; var bSubmit; function set_start(val) { document.getElementById('test_start').disabled = val ? 'disabled' : ''; document.getElementById('test_stop').disabled = val ? '' : 'disabled'; document.getElementById('progress').style.display = val ? 'block' : 'none'; if (val) { ShowWaitWindow(); document.getElementById('result').innerHTML = '<?=$clean_test_table?>'; document.getElementById('status').innerHTML = '<?=$oTest->strCurrentTestName?>'; document.getElementById('percent').innerHTML = '0%'; document.getElementById('indicator').style.width = '0%'; CHttpRequest.Action = test_onload; CHttpRequest.Send('site_checker.php?test_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>'); } else CloseWaitWindow(); } function test_onload(result) { try { eval(result); iPercent = CurrentStatus[0]; strTestName = CurrentStatus[1]; strNextRequest = CurrentStatus[2]; strCurrentTestName = CurrentStatus[3]; strResult = CurrentStatus[4]; document.getElementById('percent').innerHTML = iPercent + '%'; document.getElementById('indicator').style.width = iPercent + '%'; document.getElementById('status').innerHTML = strTestName; if (strResult != '') { oTable = document.getElementById('result_table'); oRow = oTable.insertRow(-1); oCell = oRow.insertCell(-1); oCell.innerHTML = strCurrentTestName; oCell = oRow.insertCell(-1); oCell.innerHTML = strResult; } if (strNextRequest && document.getElementById('test_start').disabled) CHttpRequest.Send('site_checker.php?test_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>' + strNextRequest); else // Finish { set_start(0); bTestFinished = true; if (bSubmit) { if (window.tabControl) tabControl.SelectTab('edit5'); SubmitToSupport(); } } } catch(e) { CloseWaitWindow(); document.getElementById('test_start').disabled = ''; document.getElementById('result').innerHTML += result; alert('<?=GetMessage("SC_TEST_FAIL")?>'); } } </script> <input type=button value="<?=GetMessage("SC_START_TEST_B")?>" id="test_start" onclick="set_start(1)"> <input type=button value="<?=GetMessage("SC_STOP_TEST_B")?>" disabled id="test_stop" onclick="bSubmit=false;set_start(0)"> <div id="progress" style="display:none;" width="100%"> <br> <div id="status"></div> <table border="0" cellspacing="0" cellpadding="2" width="100%"> <tr> <td height="10"> <div style="border:1px solid #B9CBDF"> <div id="indicator" style="height:10px; width:0%; background-color:#B9CBDF"></div> </div> </td> <td width=30> <span id="percent">0%</span></td> </tr> </table> </div> <div id="result" style="padding-top:10px"></div> </td> </tr> <? flush(); $tabControl->BeginNextTab(); if(!isset($strTicketError)) $strTicketError = ""; if (false && $send_ticket=="Y") { if (strlen($ticket_email)<=0) { $strTicketError .= GetMessage("SC_TIK_NO_EMAIL").". "; $aMsg[] = array("id"=>"ticket_email", "text"=>GetMessage("SC_TIK_NO_EMAIL")); } elseif (!check_email($ticket_email)) { $strTicketError .= GetMessage("SC_TIK_EMAIL_ERR").". "; $aMsg[] = array("id"=>"ticket_email", "text"=>GetMessage("SC_TIK_EMAIL_ERR")); } if (strlen($ticket_text)<=0) { $strTicketError .= GetMessage("SC_TIK_NO_DESCR").". "; $aMsg[] = array("id"=>"ticket_text", "text"=>GetMessage("SC_TIK_NO_DESCR")); } if (strlen($strTicketError)<=0) { // E-Mail address if (defined("THIS_SITE_SUPPORT_EMAIL") && strlen(THIS_SITE_SUPPORT_EMAIL)>0) $strMailEMailTo = THIS_SITE_SUPPORT_EMAIL; else { if ($lang=="ru") $strMailEMailTo = "support@bitrixsoft.ru"; else $strMailEMailTo = "support@bitrixsoft.com"; } if (defined("THIS_SITE_SUPPORT_CHARSET") && strlen(THIS_SITE_SUPPORT_CHARSET)>0) $sCharset = THIS_SITE_SUPPORT_CHARSET; else { if(defined('BX_UTF')) $sCharset = "UTF-8"; elseif($lang=="ru") $sCharset = "windows-1251"; else $sCharset = "iso-8859-1"; } // Subject $strMailSubject = ""; if (false && strlen($ticket_number)>0) { $ticket_number = preg_replace("/[\D]+/i", "", $ticket_number); if ($lang=="ru") $strMailSubject .= "[TID#".$ticket_number."] www.bitrixsoft.ru: ".GetMessage("SC_RUS_L"); else $strMailSubject .= "[TID#".$ticket_number."] www.bitrixsoft.com: Changes in request"; } else { if ($lang=="ru") $strMailSubject = GetMessage("SC_RUS_L1")." ".$_SERVER["SERVER_NAME"]; else $strMailSubject = "Request from ".$_SERVER["SERVER_NAME"]; } // Body $sMimeBoundary = '==Multipart_Boundary_X'.md5(time()).'X'; $strMailHeader = "From: $ticket_email\n". "Reply-To: $ticket_email\n". "X-Priority: 3 (Normal)\n". "Content-Transfer-Encoding: 8bit\n". "Content-Type: multipart/mixed;\n boundary=\"".$sMimeBoundary."\"\n"; "MIME-Version: 1.0"; $strMailText = ""; // Body text $strMailText .= "--".$sMimeBoundary."\n"; $strMailText .= "Content-Type: text/plain; charset=".$sCharset."\nContent-Transfer-Encoding: 8bit\n\n"; $strMailText .= rtrim($ticket_text); if (strlen($_REQUEST["last_error_query"])>0) $strMailText .= "\n\nLast query error:\n".$_REQUEST["last_error_query"]; $strMailText .= "\n\nLicense key: ".(LICENSE_KEY == "DEMO"? "DEMO" : md5("BITRIX".LICENSE_KEY."LICENCE")); $strMailText .= "\n\nVersion: ".(defined("DEMO") ? "DEMO" : (defined("ENCODE") ? "ENCODE" : "FULL")); $strMailText .= "\n\n\$_SERVER array content:\n<code>".print_r($_SERVER, True); $strMailText .= "</code>\n\n\$_ENV array content:\n<code>".print_r($_ENV, True); $strMailText .= "</code>\n\nCurrent time: ".date("Y-m-d H:i:s"); $strMailText .= "\n"; // Body attachment 1 if ($ticket_phpinfo=="Y") { ob_start(); phpinfo(); $PHPinfo = ob_get_clean(); $PHPinfo = chunk_split(base64_encode($PHPinfo)); $strMailText .= "--".$sMimeBoundary."\n"; $strMailText .= "Content-Type: text/html;\n name=\"phpinfo.html\"\n"; $strMailText .= "Content-Transfer-Encoding: base64\n"; $strMailText .= "Content-Disposition: attachment;\n filename=\"phpinfo.html\"\n\n"; $strMailText .= $PHPinfo; } // Body attachment 2 $strMailCheckerPage = chunk_split(base64_encode($strMailCheckerPage)); $strMailText .= "--".$sMimeBoundary."\n"; $strMailText .= "Content-Type: text/html;\n name=\"data.html\"\n"; $strMailText .= "Content-Transfer-Encoding: base64\n"; $strMailText .= "Content-Disposition: attachment;\n filename=\"data.html\"\n\n"; $strMailText .= $strMailCheckerPage; $strMailText .= "--".$sMimeBoundary."--\n"; // Mail $php_errormsg = ""; if (bxmail($strMailEMailTo, $strMailSubject, $strMailText, $strMailHeader, COption::GetOptionString("main", "mail_additional_parameters", ""))) { LocalRedirect("/bitrix/admin/site_checker.php?lang=".LANGUAGE_ID."&ticket_sent=Y&tabControl_active_tab=edit5&ticket_email=".$ticket_email); } else { $strTicketError .= GetMessage("SC_TIK_SEND_ERROR"); if (strlen($php_errormsg)>0) $strTicketError .= ": ".$php_errormsg; $strTicketError .= ". "; } } LocalRedirect("/bitrix/admin/site_checker.php?lang=".LANGUAGE_ID."&tabControl_active_tab=edit5&strTicketError=".urlencode($strTicketError)."&ticket_sent=N&ticket_text=".urlencode($ticket_text)."&ticket_email=".urlencode($ticket_email)); } ?> <tr><td colspan="2"><? if(isset($ticket_sent)) { if(!empty($aMsg)) { $e = new CAdminException($aMsg); $APPLICATION->ThrowException($e); if($e = $APPLICATION->GetException()) { $message = new CAdminMessage(GetMessage("SC_ERROR"), $e); if($message) echo $message->Show(); } } if(strlen($strTicketError)>0 && !$message) CAdminMessage::ShowMessage($strTicketError); elseif(!$message) CAdminMessage::ShowNote(str_replace("#EMAIL#", $ticket_email, GetMessage("SC_TIK_SEND_SUCCESS"))); } ?></td> </tr> <script> function SubmitToSupport() { frm = document.forms.fticket; if (frm.ticket_text.value == '') { alert('<?=GetMessage("SC_NOT_FILLED")?>'); return false; } // frm.submit_button.disabled = 'disabled'; if (!bTestFinished && frm.ticket_test.checked) { alert('<?=GetMessage("SC_TEST_WARN")?>'); if (window.tabControl) tabControl.SelectTab('edit3'); bSubmit = true; // submit after test set_start(1); } else if(frm.ticket_test.checked) { CHttpRequest.Action = function (result) { document.forms.fticket.test_file_contents.value = result; frm.submit(); } CHttpRequest.Send('?read_log=Y'); } else frm.submit(); } </script> <? ?> <form method="POST" action="<?=SUPPORT_PAGE?>" name="fticket"> <input type="hidden" name="send_ticket" value="Y"> <input type="hidden" name="license_key" value="<?=(LICENSE_KEY == "DEMO"? "DEMO" : md5("BITRIX".LICENSE_KEY."LICENCE"))?>"> <input type="hidden" name="test_file_name" value="<?=$oTest->LogFile;?>"> <input type="hidden" name="test_file_contents" value=""> <input type="hidden" name="ticket_title" value="<?=GetMessage('SC_RUS_L1').' '.htmlspecialchars($_SERVER['HTTP_HOST'])?>"> <input type="hidden" name="BX_UTF" value="<?=(defined('BX_UTF') && BX_UTF==true)?'Y':'N'?>"> <input type="hidden" name="tabControl_active_tab" value="edit5"> <tr> <td valign="top"><span class="required">*</span><?=GetMessage("SC_TIK_DESCR")?><br> <small><?=GetMessage("SC_TIK_DESCR_DESCR")?></small></td> <td valign="top"><textarea name="ticket_text" rows="6" cols="60"><?= htmlspecialchars($ticket_text)?></textarea></td> </tr> <tr> <td valign="top"><label for="ticket_test"><?=GetMessage("SC_TIK_ADD_TEST")?></label></td> <td valign="top"><input type="checkbox" id="ticket_test" name="ticket_test" value="Y" checked></td> </tr> <? if (false) { ?> <tr> <td valign="top"><label for="ticket_phpinfo"><?=GetMessage("SC_TIK_ADD_PHPINFO")?></label></td> <td valign="top"><input type="checkbox" id="ticket_phpinfo" name="ticket_phpinfo" value="Y" checked></td> </tr> <? } ?> <?if (strlen($_REQUEST["last_error_query"])>0):?> <tr> <td valign="top"><?=GetMessage("SC_TIK_LAST_ERROR")?></td> <td valign="top"> <?=GetMessage("SC_TIK_LAST_ERROR_ADD")?> <input type="hidden" name="last_error_query" value="<?= htmlspecialchars($_REQUEST["last_error_query"])?>"> </td> </tr> <?endif;?> <tr> <td></td> <td> <input type="button" name="submit_button" onclick="SubmitToSupport()" value="<?=GetMessage("SC_TIK_SEND_MESS")?>"> </td> </tr> <tr> <td colspan=2> <? echo BeginNote(); echo GetMessage("SC_SUPPORT_COMMENT").' <a href="'.SUPPORT_PAGE.'" target=_blank>'.SUPPORT_PAGE.'</a>'; echo EndNote(); ?> </td> </tr> </form> <? //$tabControl->Buttons(); $tabControl -> End(); $tabControl->ShowWarnings("fticket", $message); #echo BeginNote(); #echo GetMessage("SC_COMMENT"); #echo EndNote(); ?> <?require($_SERVER["DOCUMENT_ROOT"]."/bitrix/modules/main/include/epilog_admin.php"); //////////////////////////////////////////////////////////////////////// ////////// FUNCTIONS /////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// function GetPHPSetting($val) { return ((ini_get($val) == "1" || strtoupper(ini_get($val)) == "ON") ? "ON" : "OFF"); } function ShowResult($strRes, $strType = "OK", $return = false) { if (strlen($strRes)>0) { if (strtoupper($strType) == "ERROR" || strtoupper($strType) == "E") $res = "<span style=\"color:red;\"><b>".$strRes."</b></span>"; elseif (strtoupper($strType) == "NOTE" || strtoupper($strType) == "N") $res = "<b>".$strRes."</b>"; else $res = "<span style=\"color:green;\"><b>".$strRes."</b></span>"; if ($return) return $res; else echo $res; } } function CheckVersionMinimax($strCurver, $strMinver, $strMaxver) { $curver = explode(".", $strCurver); for ($i = 0; $i < 3; $i++) $curver[$i] = IntVal($curver[$i]); $minver = explode(".", $strMinver); for ($i = 0; $i < 3; $i++) $minver[$i] = IntVal($minver[$i]); $maxver = explode(".", $strMaxver); for ($i = 0; $i < 3; $i++) $maxver[$i] = IntVal($maxver[$i]); if (($minver[0]>0 || $minver[1]>0 || $minver[2]>0) && ($curver[0]<$minver[0] || (($curver[0]==$minver[0]) && ($curver[1]<$minver[1])) || (($curver[0]==$minver[0]) && ($curver[1]==$minver[1]) && ($curver[2]<$minver[2])) )) return false; elseif (($maxver[0]>0 || $maxver[1]>0 || $maxver[2]>0) && ($curver[0]>$maxver[0] || (($curver[0]==$maxver[0]) && ($curver[1]>$maxver[1])) || (($curver[0]==$maxver[0]) && ($curver[1]==$maxver[1]) && ($curver[2]>=$maxver[2])) )) return false; else return true; } function CheckGetModuleInfo($path) { include_once($path); $arr = explode("/", $path); $i = array_search("modules", $arr); $class_name = $arr[$i+1]; return CModule::CreateModuleObject($class_name); } class CSearchFiles { function CSearchFiles() { $this->StartTime = time(); $this->arFail = array(); $this->FilesCount = 0; $this->MaxFail = 9; $this->TimeLimit = 0; $this->SkipPath = ''; $this->BreakPoint = ''; } function Search($path) { if (time() - $this->StartTime > $this->TimeLimit) { $this->BreakPoint = $path; return count($this->arFail) == 0; } if (count($this->arFail) > $this->MaxFail) return false; if ($this->SkipPath) { if (0!==strpos($this->SkipPath, dirname($path))) return; if ($this->SkipPath == $path) unset($this->SkipPath); } if (is_dir($path)) { if (is_readable($path)) { if (!is_writable($path)) $this->arFail[] = $path; $dir = opendir($path); while($item = readdir($dir)) { if ($item == '.' || $item == '..') continue; $this->Search($path.'/'.$item); if ($this->BreakPoint) break; } closedir($dir); } else $this->arFail[] = $path; } elseif (!$this->SkipPath) { $this->FilesCount++; if (!is_readable($path) || !is_writable($path)) $this->arFail[] = $path; } return count($this->arFail) == 0; } } function getHttpResponse($res, $strRequest, &$strHeaders) { fputs($res, $strRequest); $strHeaders = ""; $bChunked = False; $Content_Length = false; while (!feof($res) && ($line = fgets($res, 4096)) && $line != "\r\n") { $strHeaders .= $line; if (preg_match("/Transfer-Encoding: +chunked/i", $line)) $bChunked = True; if (preg_match("/Content-Length: +([0-9]+)/i", $line, $regs)) $Content_Length = $regs[1]; } $strRes = ""; if ($bChunked) { $maxReadSize = 4096; $length = 0; $line = fgets($res, $maxReadSize); $line = StrToLower($line); $strChunkSize = ""; $i = 0; while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))) { $strChunkSize .= $line[$i]; $i++; } $chunkSize = hexdec($strChunkSize); while ($chunkSize > 0) { $processedSize = 0; $readSize = (($chunkSize > $maxReadSize) ? $maxReadSize : $chunkSize); while ($readSize > 0 && $line = fread($res, $readSize)) { $strRes .= $line; $processedSize += StrLen($line); $newSize = $chunkSize - $processedSize; $readSize = (($newSize > $maxReadSize) ? $maxReadSize : $newSize); } $length += $chunkSize; $line = FGets($res, $maxReadSize); $line = FGets($res, $maxReadSize); $line = StrToLower($line); $strChunkSize = ""; $i = 0; while ($i < StrLen($line) && in_array($line[$i], array("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f"))) { $strChunkSize .= $line[$i]; $i++; } $chunkSize = hexdec($strChunkSize); } } elseif ($Content_Length !== false) { if ($Content_Length > 0) $strRes = fread($res, $Content_Length); } else while ($line = fread($res, 4096)) $strRes .= $line; fclose($res); return $strRes; } class CTest { function CTest($step = 0, $test_mysql = false) { $this->step = intval($step); $this->test_percent = 0; $this->test_last_value = ''; $this->strResult = ''; $this->strError = ''; $this->timeout = 10; // sec for one step $this->arTest = array( array('OpenLog' => GetMessage('SC_T_LOG')), array('check_docroot' => GetMessage('SC_T_DOCROOT')), array('check_socket' => GetMessage('SC_T_SOCK')), array('check_upload' => GetMessage('SC_T_UPLOAD')), array('check_mail' => GetMessage('SC_T_MAIL')), array('check_mail_big' => GetMessage('SC_T_MAIL_BIG')), array('check_mail_b_event' => GetMessage('SC_T_MAIL_B_EVENT')), array('check_localredirect' => GetMessage('SC_T_REDIRECT')), array('check_memory_limit' => GetMessage('SC_T_MEMORY')), array('check_session' => GetMessage('SC_T_SESS')), array('check_session_ua' => GetMessage('SC_T_SESS_UA')), array('check_cache' => GetMessage('SC_T_CACHE')), array('check_update' => GetMessage('SC_UPDATE_ACCESS')), array('check_http_auth' => GetMessage('SC_T_AUTH')), array('check_exec' => GetMessage('SC_T_EXEC')), // array('check_basename' => GetMessage('SC_T_BASENAME')), # http://bugs.php.net/bug.php?id=33898 array('check_suhosin' => GetMessage('SC_T_SUHOSIN')), array('check_security' => GetMessage('SC_T_SECURITY')), array('check_divider' => GetMessage('SC_T_DELIMITER')), array('check_wincache' => GetMessage('SC_T_WINCACHE')), ); $this->arTestDB = array( array('check_mysql_bug_version' => GetMessage('SC_T_MYSQL_VER')), array('check_mysql_time' => GetMessage('SC_T_TIME')), array('check_mysql_mode' => GetMessage('SC_T_SQL_MODE')), array('check_mysql_increment' => GetMessage('SC_T_AUTOINC')), array('check_mysql_table_charset' => GetMessage('SC_T_CHARSET')), array('check_mysql_table_status' => GetMessage('SC_T_STATUS')), ); if ($test_mysql) $this->arTest = array_merge($this->arTest, $this->arTestDB); list($this->function, $this->strCurrentTestName) = each($this->arTest[$this->step]); $this->strNextTestName = $this->strCurrentTestName; include($_SERVER['DOCUMENT_ROOT'].BX_ROOT.'/license_key.php'); if ($LICENSE_KEY) $this->LogFile = BX_ROOT.'/site_checker_'.md5('SITE_CHECKER'.$LICENSE_KEY).'.log'; else $this->LogFile = false; } function Start() { $this->test_percent = 100; // by default @$this->OpenLog('ADD'); if ($this->function != 'OpenLog' && $f = $this->LogResourse) { $text = date('Y-M-d H:i:s').' '.($this->test_last_value ? GetMessage('SC_CONT') : GetMessage('SC_START')).' '.$this->strCurrentTestName.' ('.$this->function.")\n"; fwrite($f, $text); } ob_start(); $result = call_user_func(array($this,$this->function)); $this->strError = ob_get_clean(); if ($result === null) // must return something $this->strResult = $this->Result(false,GetMessage('SC_INT_ERROR').' '.$this->function); elseif ($result === false || $result === true) $this->strResult = $this->Result($result); elseif ($result) $this->strResult = $result; if ($f) { $text = date('Y-M-d H:i:s').' '.GetMessage('SC_END').' '.$this->strCurrentTestName.' ('.$this->function.")\n"; if ($this->test_percent < 100) $text .= $this->test_percent.'% '.GetMessage('SC_PARTIAL').' '.$this->test_last_value."\n"; if ($result === true) $text .= "OK\n"; elseif ($result === false) $text .= "Fail\n"; else $text .= strip_tags($result)."\n"; if ($this->strError) $text .= strip_tags($this->strError)."\n"; fwrite($f, $text); } $this->percent = floor(($this->step + $this->test_percent / 100) / count($this->arTest) * 100); if ($this->test_percent >= 100 && ($this->step + 1) < count($this->arTest)) // next step { $this->step++; $this->test_percent = 0; $this->test_last_value = ''; list($this->function, $this->strNextTestName) = each($this->arTest[$this->step]); } elseif ($result === true) $this->strResult = ''; // in case of temporary result on this step } function Result($res, $text = '') { $type = ($res === null) ? 'NOTE' : ($res ? 'OK' : 'ERROR'); return ShowResult($text ? $text : ($res ? GetMessage('SC_TEST_SUCCESS') : GetMessage('SC_ERROR')), $type, true); } function OpenLog($add = false) { if (!$this->LogFile) return false; if ($this->LogResourse = fopen($_SERVER['DOCUMENT_ROOT'].$this->LogFile, $add ? 'ab' : 'wb')) return $this->Result(null, GetMessage('SC_LOG_OK').' <a href="'.$this->LogFile.'" target="_blank">'.GetMessage('SC_F_OPEN').'</a>'); else return $this->Result(false,GetMessage('SC_CHECK_FILES')); } ###### TESTS ####### function check_mail($big = false) { $body = "Test message.\nDelete it."; if ($big) { $str = file_get_contents(__FILE__); if (!$str) return $this->Result(false, GetMessage('SC_CHECK_FILES')); $body = str_repeat($str, 10); } list($usec0, $sec0) = explode(" ", microtime()); $val = mail("hosting_test@bitrix.ru","Bitrix site checker",$body); list($usec1, $sec1) = explode(" ", microtime()); $time = round($sec1 + $usec1 - $sec0 - $usec0, 2); if ($val) { if ($time > 1) return $this->Result(false, GetMessage('SC_SENT').' '.$time.' '.GetMessage('SC_SEC')); } else return false; return true; } function check_mail_big() { return $this->check_mail($big = true); } function check_mail_b_event() { $res = $GLOBALS['DB']->Query("SELECT COUNT(1) AS A FROM b_event WHERE SUCCESS_EXEC = 'N'"); $f = $res->Fetch(); if ($f['A'] > 0) return $this->Result(false, GetMessage('SC_T_MAIL_B_EVENT_ERR').' '.$f['A']); return true; } function check_socket() { $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $strRequest = "GET ".$_SERVER['PHP_SELF']."?socket_test=Y&unique_id=".checker_get_unique_id()." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); return trim($strRes) == 'SUCCESS'; } function check_upload() { $BinaryData = file_get_contents($_SERVER['DOCUMENT_ROOT'].'/bitrix/images/1.gif'); if (!$BinaryData) return $this->Result(false,GetMessage('SC_CHECK_FILES')); $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $boundary = '--------'.md5(checker_get_unique_id()); $POST = "--$boundary\r\n"; $POST.= 'Content-Disposition: form-data; name="test_file"; filename="1.gif"'."\r\n"; $POST.= 'Content-Type: image/gif'."\r\n"; $POST.= "\r\n"; $POST.= $BinaryData."\r\n"; $POST.= "--$boundary\r\n"; $strRequest = "POST ".$_SERVER['PHP_SELF']."?upload_test=Y&unique_id=".checker_get_unique_id()." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "Content-Type: multipart/form-data; boundary=$boundary\r\n"; $strRequest.= "Content-Length: ".(function_exists('mb_strlen') ? mb_strlen($POST, 'ISO-8859-1') : strlen($POST))."\r\n"; $strRequest.= "\r\n"; $strRequest.= $POST; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); return trim($strRes) == 'SUCCESS'; } function check_memory_limit() { $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $total_steps = 7; $total_fail = 3; if (!$this->test_last_value) { $last_success = 0; $max = 6; $step = 1; } else list($last_success, $max, $step) = unserialize($this->test_last_value); $strRequest = "GET ".$_SERVER['PHP_SELF']."?memory_test=Y&unique_id=".checker_get_unique_id()."&max=".($max - 1)." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); if (trim($strRes) == 'SUCCESS') { $last_success = $max; $max *= 2; } else $max = floor(($last_success + $max) / 2); if ($max < 8) return false; if ($step < $total_steps) { $this->test_percent = floor(100 / $total_steps * $step); $step++; $this->test_last_value = serialize(array($last_success, $max, $step)); return true; } return $this->Result(intval($last_success) > 32, GetMessage('SC_NOT_LESS',array('#VAL#'=>$last_success))); } function check_session() { if (!$this->test_last_value) { $_SESSION['CHECKER_CHECK_SESSION'] = 'SUCCESS'; $this->test_percent = 50; $this->test_last_value = 'Y'; } else { if ($_SESSION['CHECKER_CHECK_SESSION'] != 'SUCCESS') return false; unset($_SESSION['CHECKER_CHECK_SESSION']); } return true; } function check_session_ua() { $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $strRequest = "GET ".$_SERVER['PHP_SELF']."?session_test=Y&unique_id=".checker_get_unique_id()." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; if ($this->test_last_value) // second step: put session id $strRequest.= "Cookie: ".$this->test_last_value."\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); if (!$this->test_last_value) // first step: read session id { if (!preg_match('#Set-Cookie: ('.session_name().'=[a-z0-9\-\_]+?);#i',$strHeaders,$regs)) return false; $this->test_last_value = $regs[1]; $this->test_percent = 50; return true; } else return trim($strRes) == 'SUCCESS'; } function check_http_auth() { $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $strRequest = "GET ".$_SERVER['PHP_SELF']."?auth_test=Y&unique_id=".checker_get_unique_id()." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "Authorization: Basic dGVzdF91c2VyOnRlc3RfcGFzc3dvcmQ=\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); return trim($strRes) == 'SUCCESS'; } function check_update() { $ServerIP = COption::GetOptionString("main", "update_site", "www.bitrixsoft.com"); $ServerPort = 80; $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", ""); $bUseProxy = !$this->test_last_value && strlen($proxyAddr) > 0 && strlen($proxyPort) > 0; if ($bUseProxy) { $proxyPort = IntVal($proxyPort); if ($proxyPort <= 0) $proxyPort = 80; $requestIP = $proxyAddr; $requestPort = $proxyPort; } else { $requestIP = $ServerIP; $requestPort = $ServerPort; } $strRequest = ""; $page = "us_updater_list.php"; if ($bUseProxy) { $strRequest .= "POST http://".$ServerIP."/bitrix/updates/".$page." HTTP/1.0\r\n"; if (strlen($proxyUserName) > 0) $strRequest .= "Proxy-Authorization: Basic ".base64_encode($proxyUserName.":".$proxyPassword)."\r\n"; } else $strRequest .= "POST /bitrix/updates/".$page." HTTP/1.0\r\n"; $strRequest.= "User-Agent: BitrixSMUpdater\r\n"; $strRequest.= "Accept: */*\r\n"; $strRequest.= "Host: ".$ServerIP."\r\n"; $strRequest.= "Accept-Language: en\r\n"; $strRequest.= "Content-type: application/x-www-form-urlencoded\r\n"; $strRequest.= "Content-length: 7\r\n\r\n"; $strRequest.= "lang=en"; $strRequest.= "\r\n"; $res = fsockopen($requestIP, $requestPort, $errno, $errstr, 5); if (!$res) { if ($bUseProxy) return $this->Result(false, GetMessage('SC_NO_PROXY'). ' ('.$errstr.')'); else return $this->Result(false, GetMessage('SC_UPDATE_ERROR') . ' ('.$errstr.')'); } else { $strRes = getHttpResponse($res, $strRequest, $strHeaders); $strRes = strtolower(strip_tags($strRes)); if ($strRes == "license key is invalid" || $strRes == "license key is required") return true; else { if ($bUseProxy) return $this->Result(false, GetMessage('SC_PROXY_ERR_RESP')); else return $this->Result(false, GetMessage('SC_UPDATE_ERR_RESP')); } } } function check_cache() { $dir = $_SERVER["DOCUMENT_ROOT"].BX_PERSONAL_ROOT."/cache"; $file0 = $dir."/".md5(mt_rand()); $file1 = $file0.".tmp"; $file2 = $file0.".php"; if (!file_exists($dir)) mkdir($dir, BX_DIR_PERMISSIONS); return ($f = fopen($file1, 'wb')) && (fclose($f)) && (rename($file1,$file2)) && (unlink($file2)); } function check_exec() { $path = BX_ROOT.'/site_check_exec.php'; if (file_exists($_SERVER['DOCUMENT_ROOT'].$path)) return $this->Result(false,GetMessage('SC_FILE_EXISTS').' '.$path); if (!($f = fopen($_SERVER['DOCUMENT_ROOT'].$path, 'wb'))) return $this->Result(false,GetMessage('SC_CHECK_FILES')); chmod($_SERVER['DOCUMENT_ROOT'].$path, BX_FILE_PERMISSIONS); fwrite($f,'<'.'? echo "SUCCESS"; ?'.'>'); fclose($f); $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $strRequest = "GET ".$path." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); unlink($_SERVER['DOCUMENT_ROOT'].$path); return trim($strRes) == 'SUCCESS'; } function check_basename() { $file = "\xD0\xBC\xD0\xB0\xD0\xBC\xD0\xB0.jpg"; return basename('/test/path/'.$file) == $file; } function check_suhosin() { if (in_array('suhosin',get_loaded_extensions())) return $this->Result(null,GetMessage('SC_WARN_SUHOSIN',array('#VAL#',ini_get('suhosin.simulation')))); return true; } function check_security() { if (function_exists('apache_get_modules') && in_array('mod_security',apache_get_modules())) return $this->Result(null,GetMessage('SC_WARN_SECURITY')); return true; } function check_divider() { $locale_info = localeconv(); $delimiter = $locale_info['decimal_point']; if ($delimiter != '.') return $this->Result(false,GetMessage('SC_DELIMITER_ERR',array('#VAL#',$delimiter))); return true; } function check_wincache() { return intval(ini_get('wincache.chkinterval')) == 0; } function check_localredirect() { if (!$this->test_last_value) { $host = $_SERVER['HTTP_HOST'] ? $_SERVER['HTTP_HOST'] : 'localhost'; $port = $_SERVER['SERVER_PORT'] ? $_SERVER['SERVER_PORT'] : 80; $ssl = $port == 443 ? 'ssl://' : ''; $strRequest = "GET ".$_SERVER['PHP_SELF']."?redirect_test=Y&unique_id=".checker_get_unique_id()." HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "\r\n"; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRes = getHttpResponse($res, $strRequest, $strHeaders); if (preg_match('#Location: (.+)#', $strHeaders, $regs)) { $url = trim($regs[1]); if (!$url) return false; $this->test_last_value = $url; $this->test_percent = 50; return true; } return false; } else { $url = $this->test_last_value; if (!$url) return false; $ar = parse_url($url); $host = $ar['host']; $port = intval($ar['port']) ? intval($ar['port']) : 80; $ssl = $ar['scheme'] == 'https' ? 'ssl://' : ''; $res = fsockopen($ssl.$host, $port, $errno, $errstr, 5); if (!$res) return $this->Result(false,str_replace(array('#SERVER#','#PORT#'),array($host,$port),GetMessage('SC_NO_CONNECT'))); $strRequest = "GET ".$_SERVER['PHP_SELF']."?redirect_test=Y&unique_id=".checker_get_unique_id()."&done=Y HTTP/1.1\r\n"; $strRequest.= "Host: ".$host."\r\n"; $strRequest.= "\r\n"; $strRes = getHttpResponse($res, $strRequest, $strHeaders); return trim($strRes) == 'SUCCESS'; } } function check_docroot() { $dir0 = realpath(str_replace('\\','/',dirname(__FILE__))); $dir1 = realpath(str_replace('\\','/',rtrim($_SERVER['DOCUMENT_ROOT'],'\\/').BX_ROOT).'/modules/main/admin'); if ($dir0 != $dir1) return $this->Result(false,GetMessage('SC_DOCROOT_FAIL',array('#DIR0#'=>$dir0, '#DIR1#'=>$dir1))); return true; } function check_mysql_bug_version() { $ver = $GLOBALS['DB']->GetVersion(); if ($ver == '4.1.21' // sorting || $ver == '5.1.34' // auto_increment || $ver == '5.0.41' // search ) return $this->Result(false,GetMessage('SC_DB_ERR').' '.$ver); return true; } function check_mysql_mode() { $res = $GLOBALS['DB']->Query('SHOW VARIABLES LIKE \'sql_mode\''); $f = $res->Fetch(); if (strlen($f['Value']) > 0) return $this->Result(false,GetMessage('SC_DB_ERR_MODE').' '.$f['Value']); return true; } function check_mysql_time() { $res = $GLOBALS['DB']->Query('SELECT UNIX_TIMESTAMP() AS A'); $f = $res->Fetch(); return abs(time() - $f['A']) < 10; } function check_mysql_increment() { global $DB; $ID = array(); $table = 'b_site_checker_test'; $DB->Query('DROP TABLE IF EXISTS '.$table); $DB->Query('CREATE TABLE '.$table.' (ID int(18) NOT NULL auto_increment, TEST varchar(50) default NULL, PRIMARY KEY (`ID`))'); $DB->Query('INSERT INTO '.$table.'(TEST) VALUES("TEST")'); $DB->Query('INSERT INTO '.$table.'(TEST) VALUES("TEST")'); $res = $DB->Query('SELECT ID FROM '.$table); while($f = $res->Fetch()) $ID[] = $f['ID']; $increment = $ID[1] - $ID[0]; $DB->Query('DROP TABLE IF EXISTS '.$table); return $increment == 1; } function check_mysql_table_charset() { global $DB; $time = time(); $res = $DB->Query('SHOW VARIABLES LIKE "character_set_database"'); $f = $res->Fetch(); $charset = trim($f['Value']); $result = ''; $bSiteUtf = defined('BX_UTF') && BX_UTF === true; $bCharUTf = $charset == 'utf8'; if ($bSiteUtf != $bCharUTf) $result.= $this->Result(false,GetMessage('SC_DB_ERR_CHARSET',array('#CHAR#'=>$charset)))."<br>\n"; $i = 0; $res = $DB->Query('SHOW TABLES LIKE "b_%"'); while($f = $res->Fetch()) { $i++; list($k,$table) = each($f); if ($this->test_last_value) { if ($this->test_last_value == $table) unset($this->test_last_value); continue; } $res0 = $DB->Query('SHOW CREATE TABLE `'.$table.'`'); $f0 = $res0->Fetch(); if (preg_match('/DEFAULT CHARSET=([^ ]+)/i',$f0['Create Table'],$regs)) { $str = str_replace($regs[0],'',$f0['Create Table']); $t_char = trim($regs[1]); if ($charset != $t_char) $result.= $this->Result(false,str_replace(array('#TBL#','#T_CHAR#','#CHARSET#'),array($table,$t_char,$charset),GetMessage('SC_DB_MISC_CHARSET')))."<br>\n"; elseif (preg_match('/character set ([^ ]+)/i',$str,$regs) && trim($regs[1])!=$charset) $result.= $this->Result(false,GetMessage('SC_TABLE_CHARSET_WARN',array('#TABLE#'=>$table)))."<br>\n"; } if (time()-$time >= $this->timeout) { $cnt = $res->SelectedRowsCount(); $this->test_last_value = $table; $this->test_percent = floor($i/$cnt) * 100; break; } } return $result ? $result : true; } function check_mysql_table_status() { global $DB; $time = time(); $result = ''; $res = $DB->Query('SHOW VARIABLES LIKE "collation_database"'); $f = $res->Fetch(); $collation = trim($f['Value']); $warn_size = 1024 * 1024 * 1024 / 2; // 512M $i = 0; $res = $DB->Query('SHOW TABLES LIKE "b_%"'); while($f = $res->Fetch()) { $i++; list($k,$table) = each($f); if ($this->test_last_value) { if ($this->test_last_value == $table) unset($this->test_last_value); continue; } $res0 = $DB->Query('SHOW TABLE STATUS LIKE "'.$table.'"'); $f0 = $res0->Fetch(); if ($f0['Collation'] != $collation) $result.= $this->Result(false,GetMessage('SC_COLLATE_WARN',array('#TABLE#'=>$table,'#VAL0#'=>$f0['Collation'],'#VAL1#'=>$collation)))."<br>\n"; if ($f0['Data_length'] > $warn_size) $result.= $this->Result(null,GetMessage('SC_TABLE_SIZE_WARN',array('#TABLE#'=>$table,'#SIZE#'=>floor($f0['Data_length']/1024/1024))))."<br>\n"; if (time()-$time >= $this->timeout) { $cnt = $res->SelectedRowsCount(); $this->test_last_value = $table; $this->test_percent = floor($i/$cnt) * 100; break; } } return $result ? $result : true; } ############### } function checker_get_unique_id() { @include($_SERVER['DOCUMENT_ROOT'].'/bitrix/license_key.php'); if (!$LICENSE_KEY) $LICENSE_KEY = 'DEMO'; return md5($_SERVER['DOCUMENT_ROOT'].filemtime(__FILE__).$LICENSE_KEY); } //////////////////////////////////////////////////////////////////////// ////////// END FUNCTIONS /////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// ?>