Выполнить проверку permission denied bitrix sessid error

Ошибки при проверке системы в Битрикс Модули веб-сервера Ошибка: Загружен модуль mod_dav/mod_dav_fs, WebDav не будет работать Решение: Удалите файл /etc/httpd/conf.modules.d/00-dav.conf Размер стека и pcre.recursion_limit VDS хостинг В файле /etc/php.d/bitrixenv.ini изменим параметр: В скрипте запуска сервера HTTP Apache /etc/rc.d/init.d/httpd изменим функцию start(), добавив в нее одну строку ulimit -s unlimited В итоге должно получиться примерно […]

Содержание

  1. Ошибки при проверке системы в Битрикс
  2. Модули веб-сервера
  3. Размер стека и pcre.recursion_limit
  4. VDS хостинг
  5. Виртуальный хостинг
  6. Режим работы MySQL
  7. Вариант 1
  8. Вариант 2
  9. Структура базы данных
  10. Проверка системы (check_socket): Fail
  11. Здравствуйте у меня проблема при проверки системы. Permission denied: BITRIX SESSID
  12. 8 ответов
  13. Похожие вопросы
  14. Алена Мохова (Все сообщения пользователя)
  15. Переустановил сервер сайта, поднял сайт запускаю проверку доступа — получаю Permission denied:
  16. 5 ответов
  17. Похожие вопросы

Ошибки при проверке системы в Битрикс

Модули веб-сервера

Ошибка: Загружен модуль mod_dav/mod_dav_fs, WebDav не будет работать
Решение: Удалите файл /etc/httpd/conf.modules.d/00-dav.conf

Размер стека и pcre.recursion_limit

VDS хостинг

  1. В файле /etc/php.d/bitrixenv.ini изменим параметр:
  2. В скрипте запуска сервера HTTP Apache /etc/rc.d/init.d/httpd изменим функцию start(), добавив в нее одну строку ulimit -s unlimited
  3. В итоге должно получиться примерно следующее:

Виртуальный хостинг

Для виртуального хостинга в файле .htaccess

Режим работы MySQL

Вариант 1

  1. Подключиться к серверу под root
  2. Открыть один из файлов (у всех могут быть разные, варианты)
    • /etc/my.cnf
    • /etc/alternatives/my.cnf
    • /etc/bitrix-my.cnf
  3. Добавить строку в блоке # InnoDB parameters

Вариант 2

  1. В файл after_connect.php добавить:
  2. В файл after_connect_d7.php добавить:

Структура базы данных

Ошибка: В таблице b_search_content_stem поле STEM «varchar(50) NOT NULL» не соответствует описанию на диске «int(11) NOT NULL»
Решение: Удалить модуль поиска вместе с таблицами и Заново установить модуль поиска и переиндексировать сайт.

Ошибка: В таблице b_search_content_freq поле STEM «varchar(50) NOT NULL DEFAULT «» » не соответствует описанию на диске «int(11) NOT NULL DEFAULT «0» «
Решение: Удалить модуль поиска вместе с таблицами и Заново установить модуль поиска и переиндексировать сайт.

Ошибка: Структура базы данных: Ошибочный ответ сервера. Не удалось завершить тестирование.
Решение: В файле /bitrix/modules/main/install/mysql/install.sql найти строку:
и заменить на:

Ошибка: В таблице b_user_hit_auth поле TIMESTAMP_X «datetime NULL DEFAULT NULL » не соответствует описанию на диске «timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP»
Решение: Выполнить запрос в Настройки → Инструменты → SQL запрос:

Источник

Проверка системы (check_socket): Fail

Подскажите, пожалуйста, как решить проблему?

Журнал проверки системы
2020-Sep-09 23:23:14 Наличие необходимых модулей php (check_php_modules): Ok
Все необходимые модули установлены
2020-Sep-09 23:23:14 Обязательные параметры PHP (check_php_settings): Ok
Настройки правильные
2020-Sep-09 23:23:14 Модули веб-сервера (check_security): Ok
Конфликтов не выявлено
2020-Sep-09 23:23:14 Значения переменных сервера (check_server_vars): Ok
Корректные
2020-Sep-09 23:23:14 Сохранение сессии (check_session): Ok
50% done
2020-Sep-09 23:23:14 Сохранение сессии (check_session): Ok
Успешно
2020-Sep-09 23:23:14 Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Ok
Правильные. Сайт работает в UTF кодировке
2020-Sep-09 23:23:14 Служебные скрипты в корне сайта (check_install_scripts): Ok
Отсутствуют
2020-Sep-09 23:23:14 Работа с сокетами (check_socket): Fail
Connection to ssl://bx24.мой домен.pro:443 Success
== Request ==
GET /bitrix/admin/site_checker.php?test_type=socket_test&unique_id=мой id HTTP/1.1
Host: bx.мой домен.pro

== Response ==
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 09 Sep 2020 20:23:14 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 34
Connection: keep-alive
Vary: HTTPS
X-Powered-By: PHP/7.2.28
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

== Body ==
Permission denied: UNIQUE ID ERROR
==========

Источник

Здравствуйте у меня проблема при проверки системы. Permission denied: BITRIX SESSID

ERROR не подскажете куда посмотреть? А вообще у меня проблема что сайт отдает форму авторизации вместо сайта. Аксес файл есть, вроде все норм

8 ответов

не так настроили многосайтовость или в корне сайта нет .access.php

значит косяк с многосайтом

в двух словах куда именно посмотреть, а то переносил ажмин который не знает битрикса но переносил с живого

чистите также куки, когда меняете.. а том может быть, что уже исправили, но сессия косячит

да про кукисы видел в инете, чистил

настройки сайтов первым делом dbcon в php_interface может там определяется сайт своим алгоритмом настройки хостинга, наличие симлинков с правильным владельцем

сейчас все провер, но насчет владельцая еще вчера на него думал, не подскажете какой он должен быть

Похожие вопросы

Добрый день Я как-то делал подарочные сертификаты на битриксе, были они сделаны таким образом, что каждый сертификат — это по сути отдельная сущность, ну типа сертификат на 50.

А как можно при помощи регулярного выражения заменить пробел перед цифрой на неразрывный?

Всем привет. Есть немного нетривиальная задачка, второй день ломаю голову. Есть инфоблок с подборками, в элементах которого указывается url страницы с отфильтрованными товар.

в плане? переиспользовать купон не получится

Друзья, как вызвать связанные товары по ID в catalog:section? Сейчас при поиске по сайту перекидывает на страницу с искомым товаром. После этого товара нужно вывести связанны.

Здравствуйте. Что означает @ и точка в ключе, когда делаем выборку?

народ, такой вопрос — можно ли с одного проекта дернуть модуль в другой?Или он к ключу привязывается?

ну всмысле я понимаю откуда и куда дергать модули, дальнейшие действия какие?

а кто нибудь может объяснить в чем прикол битрикса24?Судя по всему там тоже есть интернет магазин но с функционалом CRM?Он как то удобней обычного битрикса?Написан с 0 на друг.

Источник

Алена Мохова (Все сообщения пользователя)

Есть интернет-магазин на битриксе, нам необходимо сделать так, чтобы другой сайт смог во фрейме отобразить этот. Но при попытке это сделать возникает ошибка в консоли:

В итоге скрипты с сайта вообще не подгружаются и не работают. Пробовали грузить во фрейм другие сайты, на них все было хорошо. Сделали вывод что что-то не так именно у нас.

Возможно кто-то знает как решить эту проблему.

Нашла на форуме похожую проблему http://dev.1c-bitrix.ru/support/forum/forum6/topic69248/ но решения там не увидела.

Настраиваю подписку на сайте — не авторизованные пользователи вписывают свой емэйл, им на почту приходит письмо о подписке, они ее подтверждают и в битрикс это все хорошо записывается.
Но почему-то самой рассылки не происходит.
В настройках рассылок указан и шаблон, и время автоматической генерации.
Но при создании выпусков, те отправляются на почту хорошо.

В чем причина проблемы с рассылками?

На сайт приходит запрос, в котором посылают json-массив с параметрами заказа. Мы должны распарсить и записать заказ в битрикс.
Все это происходит хорошо.
Но только на сайте в кодировке UTF-8. На сайте с кодировкой Windows-1251 записывается все, кроме позиции.
Сравнивала массивы, которые получаются при записи и они идентичны, но почему-то все равно не работает.

Сначала я создаю заказ, потом добавляю в него позиции.

Алексей Тарасов, совсем забыла про то что он должен возвращать сам себя ))) спасибо.

теперь он добавляется как надо, но перед ним каждый раз создается агент с именем BitrixMainDataCacheEngineFiles::DelayedDelete(1);
а потом удаляется.

с чем это может быть связано?

Пишу собственный модуль. При нажатии на кнопку он должен создавать агента, а при нажатии на другую кнопку, удалять его. И он это все делает. Один раз.
А если я создам агента, затем удалю, а затем снова нажму создать, он больше не создает его.

Почему это может происходить? Подскажите, пожалуйста.

Источник

Переустановил сервер сайта, поднял сайт запускаю проверку доступа — получаю Permission denied:

BITRIX SESSID ERROR кто может подсказать в чем причина ? установка на актуальной версии битриксового веб-окружения

5 ответов

да, проблема решилась. Правда, не очень уже помню что там было:)

просто тоже самое, вангую из за смены домена. Просто рабочий на домене, а бекап развернул на поддомене и там посыпались эти ошибки

я тогда, помоему, просто очистил куки браузера и смог войти в админку, а там уже сменить домен в настройках

в админку заходит , но ничего не дает править. Я уже напрямую в бд настройки правлю

Похожие вопросы

Добрый день Я как-то делал подарочные сертификаты на битриксе, были они сделаны таким образом, что каждый сертификат — это по сути отдельная сущность, ну типа сертификат на 50.

А как можно при помощи регулярного выражения заменить пробел перед цифрой на неразрывный?

Всем привет. Есть немного нетривиальная задачка, второй день ломаю голову. Есть инфоблок с подборками, в элементах которого указывается url страницы с отфильтрованными товар.

в плане? переиспользовать купон не получится

Друзья, как вызвать связанные товары по ID в catalog:section? Сейчас при поиске по сайту перекидывает на страницу с искомым товаром. После этого товара нужно вывести связанны.

Здравствуйте. Что означает @ и точка в ключе, когда делаем выборку?

народ, такой вопрос — можно ли с одного проекта дернуть модуль в другой?Или он к ключу привязывается?

ну всмысле я понимаю откуда и куда дергать модули, дальнейшие действия какие?

а кто нибудь может объяснить в чем прикол битрикса24?Судя по всему там тоже есть интернет магазин но с функционалом CRM?Он как то удобней обычного битрикса?Написан с 0 на друг.

Источник

screenshot

ERROR
не подскажете куда посмотреть?

А вообще у меня проблема что сайт отдает форму авторизации вместо сайта.

Аксес файл есть, вроде все норм

russian

software

it

bitrix


8

ответов

не так настроили многосайтовость
или в корне сайта нет .access.php


Kartofka

.access.php есть

значит косяк с многосайтом


Andrew Zahalski

значит косяк с многосайтом

в двух словах куда именно посмотреть, а то переносил ажмин который не знает битрикса но переносил с живого


Kartofka

.access.php есть

чистите также куки, когда меняете.. а том может быть, что уже исправили, но сессия косячит


Andrew Zahalski

чистите также куки, когда меняете.. а том может бы…

да про кукисы видел в инете, чистил


Kartofka

в двух словах куда именно посмотреть, а то перенос…

настройки сайтов первым делом
dbcon в php_interface может там определяется сайт своим алгоритмом
настройки хостинга, наличие симлинков с правильным владельцем


Andrew Zahalski

настройки сайтов первым делом
dbcon в php_interfac…

сейчас все провер, но насчет владельцая еще вчера на него думал, не подскажете какой он должен быть

<? /** * Bitrix Framework * @package bitrix * @subpackage main * @copyright 2001-2013 Bitrix */ /** * Bitrix vars * * @global CMain $APPLICATION * @global CUser $USER */ @ini_set(«track_errors«, «1«); @ini_set(‘display_errors’, 1); error_reporting(E_ALL & ~E_NOTICE & ~E_STRICT); $message = null; define(‘DEBUG_FLAG’, str_replace(‘\’,‘/’,$_SERVER[‘DOCUMENT_ROOT’] . ‘/bitrix/site_checker_debug’)); // NO AUTH TESTS if ($_REQUEST[‘unique_id’]) { if (!file_exists(DEBUG_FLAG) && $_REQUEST[‘unique_id’] != checker_get_unique_id()) die(‘<h1>Permission denied: UNIQUE ID ERROR</h1>’); switch ($_GET[‘test_type’]) { case ‘socket_test’: echo «SUCCESS«; break; case ‘dbconn_test’: ob_start(); define(‘NOT_CHECK_PERMISSIONS’, true); require($_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules/main/include/prolog_before.php’); $buff = »; while(ob_get_level()) { $buff .= ob_get_contents(); ob_end_clean(); } ob_end_clean(); if (function_exists(‘mb_internal_encoding’)) mb_internal_encoding(‘ISO-8859-1’); echo $buff === » ? ‘SUCCESS’ : ‘Length: ‘.strlen($buff).‘ (‘.$buff . ‘)’; break; case ‘pcre_recursion_test’: $a = str_repeat(‘a’,16000); if (preg_match(‘/(a)+/’,$a)) // Segmentation fault (core dumped) echo ‘SUCCESS’; else echo ‘CLEAN’; break; case ‘method_exists’: $arRes= Array ( «CLASS» => «», «CALC_METHOD» => «» ); method_exists($arRes[‘CLASS’], $arRes[‘CALC_METHOD’]); echo ‘SUCCESS’; break; case ‘upload_test’: if (function_exists(‘mb_internal_encoding’)) mb_internal_encoding(‘ISO-8859-1’); $dir = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/tmp’; if (!file_exists($dir)) mkdir($dir); $binaryData = »; for($i=40;$i<240;$i++) $binaryData .= chr($i); if ($_REQUEST[‘big’]) $binaryData = str_repeat($binaryData, 21000); if ($_REQUEST[‘raw’]) $binaryData_received = file_get_contents(‘php://input’); elseif (move_uploaded_file($tmp_name = $_FILES[‘test_file’][‘tmp_name’], $image = $dir.‘/site_checker.bin’)) { $binaryData_received = file_get_contents($image); unlink($image); } else { echo ‘move_uploaded_file(‘.$tmp_name.‘,’.$image.‘)=false’.»n»; echo ‘$_FILES=’.»n»; print_r($_FILES); die(); } if ($binaryData === $binaryData_received) echo «SUCCESS«; else echo ‘strlen($binaryData)=’.strlen($binaryData).‘, strlen($binaryData_received)=’.strlen($binaryData_received); break; case ‘post_test’: $ok = true; for ($i=0;$i<201;$i++) $ok = $ok && ($_POST[‘i’.$i] == md5($i)); echo $ok ? ‘SUCCESS’ : ‘FAIL’; break; case ‘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«; } break; case ‘auth_test’: $remote_user = $_SERVERREMOTE_USER«] ? $_SERVERREMOTE_USER«] : $_SERVERREDIRECT_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’); break; case ‘session_test’: session_start(); echo $_SESSION[‘CHECKER_CHECK_SESSION’]; $_SESSION[‘CHECKER_CHECK_SESSION’] = ‘SUCCESS’; break; case ‘redirect_test’: foreach(array(‘SERVER_PORT’,‘HTTPS’,‘FCGI_ROLE’,‘SERVER_PROTOCOL’,‘SERVER_PORT’,‘HTTP_HOST’) as $key) $GLOBALS[‘_SERVER’][$key] = $GLOBALS[‘_REQUEST’][$key]; function IsHTTPS() { return ($_SERVERSERVER_PORT«]==443 || strtolower($_SERVERHTTPS«])==»on«); } 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($_SERVERSERVER_PROTOCOL«].» «.$status); } if ($_REQUEST[‘done’]) echo ‘SUCCESS’; else { SetStatus302 Found«); $protocol = (IsHTTPS() ? «https» : «http«); $host = $_SERVER[‘HTTP_HOST’]; if($_SERVER[‘SERVER_PORT’] <> 80 && $_SERVER[‘SERVER_PORT’] <> 443 && $_SERVER[‘SERVER_PORT’] > 0 && strpos($_SERVER[‘HTTP_HOST’], «:«) === false) $host .= «:«.$_SERVER[‘SERVER_PORT’]; $url = «?redirect_test=Y&done=Y&unique_id=«.checker_get_unique_id(); header(«Request-URI: «.$protocol://«.$host.$url); header(«Content-Location: «.$protocol://«.$host.$url); header(«Location: «.$protocol://«.$host.$url); exit; } break; default: break; } if ($fix_mode = intval($_GET[‘fix_mode’])) { if ($_REQUEST[‘charset’]) { define(‘LANG_CHARSET’, $_REQUEST[‘charset’]); header(‘Content-type: text/plain; charset=’.LANG_CHARSET); } define(‘LANGUAGE_ID’, preg_match(‘#[a-z]{2}#’,$_REQUEST[‘lang’],$regs) ? $regs[0] : ‘en’); include_once($_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules/main/lang/’.LANGUAGE_ID.‘/admin/site_checker.php’); InitPureDB(); if (!function_exists(‘GetMessage’)) { function GetMessage($code, $arReplace = array()) { global $MESS; $strResult = $MESS[$code]; foreach($arReplace as $k => $v) $strResult = str_replace($k, $v, $strResult); return $strResult; } } if (!function_exists(‘JSEscape’)) { function JSEscape($s) { static $aSearch = array(«xe2x80xa9», «\», ««, «»», «rn», «r», «n», «xe2x80xa8»); static $aReplace = array «, «\\», «\«, ‘\»‘, «n», «n», «\n’+n«, «\n’+n«); $val = str_replace($aSearch, $aReplace, $s); return preg_replace(«‘</script’i«, «</s’+’cript«, $val); } } $oTest = new CSiteCheckerTest($_REQUEST[‘step’],(int) $_REQUEST[‘fix_mode’]); if (file_exists(DEBUG_FLAG)) $oTest->timeout = 30; if ($_REQUEST[‘global_test_vars’] && ($d = base64_decode($_REQUEST[‘global_test_vars’]))) $oTest->arTestVars = unserialize($d); else $oTest->arTestVars = array(); $oTest->Start(); if ($oTest->percent < 100) { $strNextRequest = ‘&step=’.$oTest->step.‘&global_test_vars=’.base64_encode(serialize($oTest->arTestVars)); $strFinalStatus = »; } else { $strNextRequest = »; $strFinalStatus = ‘100%’; } echo iPercent = ‘.$oTest->percent.‘; test_percent = ‘.$oTest->test_percent.‘; strCurrentTestFunc = «‘.$oTest->last_function.‘»; strCurrentTestName = «‘.JSEscape($oTest->strCurrentTestName).‘»; strNextTestName = «‘.JSEscape($oTest->strNextTestName).‘»; strNextRequest = «‘.JSEscape($strNextRequest).‘»; strResult = «‘.JSEscape(str_replace(array(«r»,»n»),»»,$oTest->strResult)).‘»; strFinalStatus = «‘.JSEscape($strFinalStatus).‘»; ; } die(); } // END NO AUTH TESTS if (file_exists(DEBUG_FLAG)) { define(‘NOT_CHECK_PERMISSIONS’, true); define(«BX_COMPRESSION_DISABLED«, true); } if($_REQUEST[‘test_start’]) { define(«NO_KEEP_STATISTIC«, true); define(«NO_AGENT_CHECK«, true); } require_once($_SERVERDOCUMENT_ROOT«].»/bitrix/modules/main/include/prolog_admin_before.php«); IncludeModuleLangFile(__FILE__); require_once($_SERVERDOCUMENT_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/’)); $Apache_vercheck_min = «1.3.0«; $Apache_vercheck_max = «»; $IIS_vercheck_min = «5.0.0«; $IIS_vercheck_max = «»; //////////////////////////////////////////////////////////////////////// ////////// END PARAMS ////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// if ($USER->CanDoOperation(‘view_other_settings’)) { if (file_exists(DEBUG_FLAG)) if (!unlink(DEBUG_FLAG)) CAdminMessage::ShowMessage(ArrayTYPE«=>»ERROR«, «MESSAGE«=>‘Can’t delete ‘ . DEBUG_FLAG)); } elseif(!defined(‘NOT_CHECK_PERMISSIONS’) || NOT_CHECK_PERMISSIONS !== true) $APPLICATION->AuthForm(GetMessageACCESS_DENIED«)); $aTabs = array( arrayDIV» => «edit1«, «TAB» => GetMessageSC_TEST_CONFIG«), «ICON» => «site_check«, «TITLE» => GetMessageSC_SUBTITLE_REQUIED«)), arrayDIV» => «edit2«, «TAB» => GetMessageSC_TAB_2«), «ICON» => «site_check«, «TITLE» => GetMessageSC_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»)), arrayDIV» => «edit5«, «TAB» => GetMessageSC_TAB_5«), «ICON» => «site_check«, «TITLE» => GetMessageSC_TIK_TITLE«)), ); if ($_POST[‘access_check’]) { if (defined(‘NOT_CHECK_PERMISSIONS’) && NOT_CHECK_PERMISSIONS ===true || check_bitrix_sessid()) { $ob = new CSearchFiles; $ob->TimeLimit = 10; if ($_REQUEST[‘break_point’]) $ob->SkipPath = $_REQUEST[‘break_point’]; $check_type = $_REQUEST[‘check_type’]; $sNextPath = »; if ($check_type == ‘upload’) { if (!file_exists($tmp = $_SERVER[‘DOCUMENT_ROOT’].BX_PERSONAL_ROOT.‘/tmp’)) mkdir($tmp); $upload = $_SERVER[‘DOCUMENT_ROOT’].‘/’.COption::GetOptionString(‘main’, ‘upload_dir’, ‘upload’); if (0===strpos($_REQUEST[‘break_point’], $upload)) $path = $upload; else { $path = $tmp; $sNextPath = $upload; } } elseif($check_type == ‘kernel’) $path = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix’; elseif($check_type == ‘personal’) $path = $_SERVER[‘DOCUMENT_ROOT’].BX_PERSONAL_ROOT; else { $path = $_SERVER[‘DOCUMENT_ROOT’]; $check_type = ‘full’; } if ($ob->Search($path)) { if ($ob->BreakPoint || $sNextPath) { if ($ob->BreakPoint) $sNextPath = $ob->BreakPoint; $cnt_total = intval($_REQUEST[‘cnt_total’]) + $ob->FilesCount; ?><form method=post id=postform> <input type=hidden name=access_check valueY«> <input type=hidden name=lang value<?=LANGUAGE_ID?>«> <?=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<?=htmlspecialcharsbx($sNextPath)?>«> </form> <? CAdminMessage::ShowMessage(array( ‘TYPE’ => ‘OK’, ‘HTML’ => true, ‘MESSAGE’ => GetMessage(‘SC_TESTING’), ‘DETAILS’ => str_replace(array(‘#NUM#’,‘#PATH#’),array($cnt_total,$sNextPath),GetMessage(‘SC_FILES_CHECKED’)), ) ); ?> <script> if (parent.document.getElementById(‘access_submit’).disabled) window.setTimeout(«parent.ShowWaitWindow();document.getElementById(‘postform’).submit()»,500); </script><? } else { if ($check_type == ‘full’) COption::SetOptionString(‘main’, ‘site_checker_access’, ‘Y’); CAdminMessage::ShowMessage(ArrayTYPE«=>»OK«, «MESSAGE«=>GetMessageSC_FILES_OK«))); ?><script>parent.access_check_start(0);</script><? } } else { COption::SetOptionString(‘main’, ‘site_checker_access’, ‘N’); CAdminMessage::ShowMessage(array( ‘TYPE’ => ‘ERROR’, ‘MESSAGE’ => GetMessageSC_FILES_FAIL«), ‘DETAILS’ => implode(«<br>n»,$ob->arFail), ‘HTML’ => true ) ); ?><script>parent.access_check_start(0);</script><? } } else echo ‘<h1>Permission denied: BITRIX SESSID ERROR</h1>’; exit; } elseif($_REQUEST[‘test_start’]) { if (defined(‘NOT_CHECK_PERMISSIONS’) && NOT_CHECK_PERMISSIONS ===true || check_bitrix_sessid()) { $oTest = new CSiteCheckerTest($_REQUEST[‘step’],(int) $_REQUEST[‘fix_mode’]); if ($_REQUEST[‘global_test_vars’] && ($d = base64_decode($_REQUEST[‘global_test_vars’]))) { if (!CheckSerializedData($d)) die(‘Error unserialize’); $oTest->arTestVars = unserialize($d); } else $oTest->arTestVars = array(); $oTest->Start($_REQUEST[‘failed’]); if ($oTest->percent < 100) { $strNextRequest = ‘&step=’.$oTest->step.‘&global_test_vars=’.base64_encode(serialize($oTest->arTestVars)); $strFinalStatus = »; } else { $strNextRequest = »; $strFinalStatus = ‘100%’; } echo iPercent = ‘.$oTest->percent.‘; test_percent = ‘.$oTest->test_percent.‘; strCurrentTestFunc = «‘.$oTest->last_function.‘»; strCurrentTestName = «‘.CUtil::JSEscape($oTest->strCurrentTestName).‘»; strNextTestName = «‘.CUtil::JSEscape($oTest->strNextTestName).‘»; strNextRequest = «‘.CUtil::JSEscape($strNextRequest).‘»; strResult = «‘.CUtil::JSEscape(str_replace(array(«r»,»n»),»»,$oTest->strResult)).‘»; strFinalStatus = «‘.CUtil::JSEscape($strFinalStatus).‘»; ; } else echo ‘<h1>Permission denied: BITRIX SESSID ERROR</h1>’; exit; } elseif ($_REQUEST[‘read_log’]) // after prolog to sent correct charset { header(‘Content-type: text/plain; charset=’.LANG_CHARSET); $oTest = new CSiteCheckerTest(); echo file_get_contents($_SERVER[‘DOCUMENT_ROOT’].$oTest->LogFile); exit; } elseif ($_REQUEST[‘help_id’]) { echo ‘<div style=»font-size:1.2em;padding:20px»>’; if ($h = GetMessage(‘SC_HELP_’ . strtoupper($_REQUEST[‘help_id’]))) { $h = str_replace(‘<code>’,‘<div style=»border:1px solid #CCC;margin:10px;padding:10px;font-family:monospace;background-color:#FEFEFA»>’,$h); $h = str_replace(‘</code>’,‘</div>’,$h); echo nl2br($h); echo ‘<br><br>’.GetMessage(‘SC_READ_MORE’); } else echo GetMessage(‘SC_HELP_NOTOPIC’); echo ‘</div>’; exit; } elseif ($fix_mode = intval($_REQUEST[‘fix_mode’])) { ?> <table idfix_table» width100%» classinternal» stylepadding:20px;padding-bottom:0;«> <tr classheading«> <td width40%«><b><?=GetMessageSC_TEST_NAME«)?></b></td><td><b><?=GetMessageSC_TEST_RES«)?></b></td> </tr> </table> <div idfix_status«></div> <script> var fix_mode = <?=$fix_mode?>; BX.ajax.get(‘site_checker.php?fix_mode=’ + fix_mode + ‘&test_start=Y&lang=<?=LANGUAGE_ID?>&charset=<?=LANG_CHARSET?>&<?=bitrix_sessid_get()?>&unique_id=<?=checker_get_unique_id()?>, fix_onload); </script> <? exit; } $tabControl = new CAdminTabControltabControl«, $aTabs, true, true); $APPLICATION->SetTitle(GetMessageSC_TITLE«)); require($_SERVERDOCUMENT_ROOT«].»/bitrix/modules/main/include/prolog_admin_after.php«); echo BeginNote(); echo GetMessageSC_NOTE«, array(‘#VAL#’ => DEBUG_FLAG)); echo EndNote(); ?> <? $tabControl->Begin(); $tabControl->BeginNextTab(); ?> <tr> <td colspan2«><?=GetMessageSC_SUBTITLE_REQUIED_DESC«)?></td> </tr> <tr> <td colspan2«> <? $clean_test_table = ‘<table id=»result_table» width=»100%» class=»internal»><tr class=»heading»><td width=»40%»><b>’.GetMessageSC_TEST_NAME«).‘</b></td><td><b>’.GetMessageSC_TEST_RES«).‘</b></td></tr></table>’; $oTest = new CSiteCheckerTest(); ?> <style> tr.sc_hover td { background-color:#f1f3f9; } .sc_link { float:right; cursor:pointer; color:#637ad0; text-decoration:underline; } .sc_cell { vertical-align:top; padding:4px !important; } .test_status { } </style> <script> var bTestFinished = false; var bSubmit; function show_popup(title, link, confirm_text) { if (confirm_text && !confirm(confirm_text)) return; var d = new BX.CAdminDialog({ ‘title’: title, ‘content_url’: ‘/bitrix/admin/site_checker.php’ + link, // ‘content_post’: this.JSParamsToPHP(arParams, ‘PARAMS’)+ ‘&’ + // this.JSParamsToPHP(arProp, ‘PROP’)+’&’+this.SESS, ‘draggable’: true, ‘resizable’: true, ‘buttons’: [BX.CAdminDialog.btnClose] }); d.Show(); } function set_start(val) { document.getElementById(‘test_start’).disabled = val ? ‘disabled’ : »; document.getElementById(‘test_stop’).disabled = val ? » : ‘disabled’; document.getElementById(‘progress’).style.visibility = val ? ‘visible’ : ‘hidden’; 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%’; BX.ajax.get(‘site_checker.php?test_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?>, test_onload); } else CloseWaitWindow(); } function test_onload(result) { try { if (result) eval(result); else throw ‘Empty result’; } catch(e) { console.log(result); strNextRequest += ‘&failed=1’; } if (document.getElementById(‘test_start’).disabled) // Stop was not pressed { document.getElementById(‘percent’).innerHTML = iPercent + ‘%’; document.getElementById(‘indicator’).style.width = iPercent + ‘%’; document.getElementById(‘status’).innerHTML = strNextTestName; if (strResult != ») { var oTable = document.getElementById(‘result_table’); var oRow = oTable.insertRow(1); // oRow.style.backgroundColor = ‘#FCC’; oRow.onmouseover = function() { this.className = ‘sc_hover’; }; oRow.onmouseout = function() { this.className = »; }; var oCell = oRow.insertCell(1); oCell.className = ‘sc_cell’; oCell.innerHTML = strCurrentTestName; oCell = oRow.insertCell(1); oCell.className = ‘sc_cell’; oCell.innerHTML = ‘<div class=»sc_link»><?=GetMessage(‘SC_MORE’)?></div>’ + strResult; var oDiv = oCell.firstChild; oDiv.id = strCurrentTestFunc; oDiv.title = strCurrentTestName; oDiv.onclick = function(){show_popup(this.title, ‘?help_id=’ + this.id + ‘&lang=<?=LANGUAGE_ID?>)}; } if (strNextRequest) <? if ($_GET[‘HTTP_HOST’]) { ?> BX.ajax.get(‘site_checker.php?HTTP_HOST=<?=urlencode($_GET[‘HTTP_HOST’])?>&SERVER_PORT=<?=urlencode($_GET[‘SERVER_PORT’])?>&HTTPS=<?=urlencode($_GET[‘HTTPS’])?>&test_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?> + strNextRequest, test_onload); <? } else { ?> BX.ajax.get(‘site_checker.php?HTTP_HOST=’ + window.location.hostname + ‘&SERVER_PORT=’ + window.location.port + ‘&HTTPS=’ + (window.location.protocol == ‘https:’ ? ‘on’ : ») + ‘&test_start=Y&lang=<?=LANGUAGE_ID?>&<?=bitrix_sessid_get()?> + strNextRequest, test_onload); <? } ?> else // Finish { set_start(0); bTestFinished = true; if (bSubmit) { if (window.tabControl) tabControl.SelectTab(‘edit5’); SubmitToSupport(); } } } } function fix_onload(result) { try { eval(result); fix_status = document.getElementById(‘fix_status’); if (test_percent < 100) fix_status.innerHTML = ‘<table width=»100%» class=»internal» style=»padding:20px;padding-top:0″><tr><td width=»40%»>’ + strNextTestName + ‘</td><td><div style=»text-align:center;font-weight:bold;background-color:#b9cbdf;padding:2px;width:’ + test_percent + ‘%»>’ + test_percent + ‘%</div></table>’; else fix_status.innerHTML = »; if (strResult != ») { var oTable = document.getElementById(‘fix_table’); var oRow = oTable.insertRow(1); var oCell = oRow.insertCell(1); oCell.className = ‘sc_cell’; oCell.style.width = ‘40%’; oCell.innerHTML = strCurrentTestName; oCell = oRow.insertCell(1); oCell.className = ‘sc_cell’; oCell.innerHTML = strResult; } if (strNextRequest) BX.ajax.get(‘site_checker.php?fix_mode=’ + fix_mode + ‘&test_start=Y&lang=<?=LANGUAGE_ID?>&charset=<?=LANG_CHARSET?>&<?=bitrix_sessid_get()?>&unique_id=<?=checker_get_unique_id()?> + strNextRequest, fix_onload); else // Finish fix_status.innerHTML = »; } catch(e) { var o; if (o = document.getElementById(‘fix_status’)) { o.innerHTML = result; alert(<?=GetMessageSC_TEST_FAIL«)?>); } } } </script> <br> <input type=button value<?=GetMessageSC_START_TEST_B«)?>» idtest_start» onclickset_start(1)» classadm-btn-green«> <input type=button value<?=GetMessageSC_STOP_TEST_B«)?>» disabled idtest_stop» onclickbSubmit=false;set_start(0)«> <div idprogress» stylevisibility:hidden;padding-top:4px;» width100%«> <div idstatus» stylefont-weight:bold;font-size:1.2em«></div> <table border0» cellspacing0» cellpadding2» width100%«> <tr> <td height20«> <div styleborder:1px solid #B9CBDF«> <div idindicator» styleheight:20px; width:0; background-color:#B9CBDF«></div> </div> </td> <td width=30>&nbsp;<span idpercent» stylefont-size:1.4em«>0%</span></td> </tr> </table> </div> <div idresult» stylepadding-top:10px«></div> </td> </tr> <?flush(); $tabControl->BeginNextTab();?> <tr> <td colspan2«><?echo GetMessageSC_SUBTITLE_DISK_DESC«);?></td> </tr> <tr> <td colspan2«> <script> function onFrameLoad(ob) { CloseWaitWindow(); var oDoc; 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 methodPOST» actionsite_checker.php» targetaccess_frame» onsubmitaccess_check_start(1)«> <input type=hidden name=access_check value=Y> <input type=hidden name=lang value<?=LANGUAGE_ID?>«> <?=bitrix_sessid_post();?> <label><input type=radio name=check_type value=full checked> <?=GetMessageSC_CHECK_FULL«)?></label><br> <label><input type=radio name=check_type value=upload> <?=GetMessageSC_CHECK_UPLOAD«)?></label><br> <label><input type=radio name=check_type value=kernel> <?=GetMessageSC_CHECK_KERNEL«)?></label><br> <? if (‘/bitrix’ != BX_PERSONAL_ROOT): ?> <label><input type=radio name=check_type value=cache> <?=GetMessageSC_CHECK_FOLDER«)?> <b><?=BX_PERSONAL_ROOT?></b></label><br> <? endif; ?> <br> <input type=submit value<?=GetMessageSC_CHECK_B«)?>» idaccess_submit«> <input type=button value<?=GetMessageSC_STOP_B«)?>» disabled idaccess_stop» onclickaccess_check_start(0)«> </form> <div width100%» idaccess_result«></div> <iframe nameaccess_frame» stylewidth:1px;height:1px;visibility:hidden» onloadonFrameLoad(this)«></iframe> </td> </tr> <? flush(); $tabControl->BeginNextTab(); if(!isset($strTicketError)) $strTicketError = «»; ?> <tr><td colspan2«><? if(isset($ticket_sent)) { if(!empty($aMsg)) { $e = new CAdminException($aMsg); $APPLICATION->ThrowException($e); if($e = $APPLICATION->GetException()) { $message = new CAdminMessage(GetMessageSC_ERROR«), $e); if($message) echo $message->Show(); } } if(strlen($strTicketError)>0 && !$message) CAdminMessage::ShowMessage($strTicketError); elseif(!$message) CAdminMessage::ShowNote(str_replace(«#EMAIL#«, «», GetMessageSC_TIK_SEND_SUCCESS«))); } ?></td> </tr> <script> function SubmitToSupport() { var frm = document.forms.fticket; if (frm.ticket_text.value == ») { alert(<?=GetMessageSC_NOT_FILLED«)?>); return; } // frm.submit_button.disabled = ‘disabled’; if (!bTestFinished && frm.ticket_test.checked) { alert(<?=GetMessageSC_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 methodPOST» action<?=SUPPORT_PAGE?>» namefticket«> <?echo bitrix_sessid_post();?> <input typehidden» namesend_ticket» valueY«> <input typehidden» namelicense_key» value<?=(LICENSE_KEY == «DEMO«? «DEMO» : md5(«BITRIX«.LICENSE_KEYLICENCE«))?>«> <input typehidden» nametest_file_name» value<?=$oTest->LogFile;?>«> <input typehidden» nametest_file_contents» value=»»> <input typehidden» nameticket_title» value<?=GetMessage(‘SC_RUS_L1’).‘ ‘.htmlspecialcharsbx($_SERVER[‘HTTP_HOST’])?>«> <input typehidden» nameBX_UTF» value<?=(defined(‘BX_UTF’) && BX_UTF==true)?‘Y’:‘N’?>«> <input typehidden» nametabControl_active_tab» valueedit5«> <tr> <td valigntop«><span classrequired«>*</span><?=GetMessageSC_TIK_DESCR«)?><br> <small><?=GetMessageSC_TIK_DESCR_DESCR«)?></small></td> <td valigntop«><textarea nameticket_text» rows6» cols60«><?= htmlspecialcharsbx($_REQUESTticket_text«])?></textarea></td> </tr> <tr> <td valigntop«><label forticket_test«><?=GetMessageSC_TIK_ADD_TEST«)?></label></td> <td valigntop«><input typecheckbox» idticket_test» nameticket_test» valueY» checked></td> </tr> <?if (strlen($_REQUESTlast_error_query«])>0):?> <tr> <td valigntop«><?=GetMessageSC_TIK_LAST_ERROR«)?></td> <td valigntop«> <?=GetMessageSC_TIK_LAST_ERROR_ADD«)?> <input typehidden» namelast_error_query» value<?= htmlspecialcharsbx($_REQUESTlast_error_query«])?>«> </td> </tr> <?endif;?> <tr> <td></td> <td> <input typebutton» namesubmit_button» onclickSubmitToSupport()» value<?=GetMessageSC_TIK_SEND_MESS«)?>«> </td> </tr> <tr> <td colspan=2> <? echo BeginNote(); echo GetMessageSC_SUPPORT_COMMENT«).‘ <a href=»‘.SUPPORT_PAGE.‘» target=_blank>’.SUPPORT_PAGE.‘</a>’; echo EndNote(); ?> </td> </tr> </form> <? //$tabControl->Buttons(); $tabControl -> End(); $tabControl->ShowWarningsfticket«, $message); // echo BeginNote(); // echo GetMessage(«SC_COMMENT»); // echo EndNote(); ?> <?require($_SERVERDOCUMENT_ROOT«].»/bitrix/modules/main/include/epilog_admin.php«); //////////////////////////////////////////////////////////////////////// ////////// FUNCTIONS /////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////// 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 null; if ($this->SkipPath == $path) unset($this->SkipPath); } if (is_dir($path)) { if (is_readable($path)) { if (!is_writable($path)) $this->arFail[] = $path; if ($dir = opendir($path)) { while(false !== $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 IsHttpResponseSuccess($res, $strRequest, &$strHeaders = », $bHideRequest = false) { $strRes = GetHttpResponse($res, $strRequest, $strHeaders); if (trim($strRes) == ‘SUCCESS’) return true; else { echo «n== Request ==n».($bHideRequest ? substr($strRequest, 0, strpos($strRequest, «rnrn»)) : $strRequest) . «n== Response ==n» . $strHeaders . «n== Body ==n» . $strRes . «n==========«; return false; } } function GetHttpResponse($res, $strRequest, &$strHeaders) { fputs($res, $strRequest); $strHeaders = «»; $bChunked = False; $Content_Length = false; while (!feof($res) && ($line = fgets($res, 4096)) && $line != «rn») { $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], array0«, «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 = StrToLower($line); $strChunkSize = «»; $i = 0; while ($i < StrLen($line) && in_array($line[$i], array0«, «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 CSiteCheckerTest { var $arTestVars; var $percent; var $last_function; var $strCurrentTestName; var $result; var $LogResourse; var $LogResult; function __construct($step = 0, $fix_mode = 0) { $this->step = intval($step); $this->test_percent = 0; $this->strError = »; $this->timeout = 10; // sec for one step $this->strResult = »; $this->fix_mode = intval($fix_mode); $this->host = $_REQUEST[‘HTTP_HOST’] ? $_REQUEST[‘HTTP_HOST’] : ‘localhost’; if (!$fix_mode) // no kernel { if (!preg_match(‘/^[a-z0-9.-]+$/i’, $this->host)) $this->host = CBXPunycode::ToASCII($this->host, ($err=»»)); } $this->ssl = $_REQUEST[‘HTTPS’] == ‘on’; $this->port = $_REQUEST[‘SERVER_PORT’] ? $_REQUEST[‘SERVER_PORT’] : ($this->ssl ? 443 : 80); $this->arTest = array( array(‘OpenLog’ => GetMessage(‘SC_T_LOG’)), /**/ array(‘check_php_modules’ =>GetMessage(‘SC_T_MODULES’)), array(‘check_php_settings’ =>GetMessage(‘SC_T_PHP’)), array(‘check_server_vars’ =>GetMessage(‘SC_T_SERVER’)), array(‘check_suhosin’ => GetMessage(‘SC_T_SUHOSIN’)), array(‘check_security’ => GetMessage(‘SC_T_APACHE’)), array(‘check_install_scripts’ => GetMessage(‘SC_T_INSTALL_SCRIPTS’)), array(‘check_mbstring’ =>GetMessage(‘SC_T_MBSTRING’)), array(‘check_backtrack_limit’ =>GetMessage(‘SC_T_BACKTRACK_LIMIT’)), array(‘check_pcre_recursion’ => GetMessage(‘SC_T_RECURSION’)), array(‘check_method_exists’ => GetMessage(‘SC_T_METHOD_EXISTS’)), array(‘check_sites’ =>GetMessage(‘SC_T_SITES’)), array(‘check_socket’ => GetMessage(‘SC_T_SOCK’)), array(‘check_dbconn’ => GetMessage(‘SC_T_DBCONN’)), array(‘check_upload’ => GetMessage(‘SC_T_UPLOAD’)), array(‘check_upload_big’ => GetMessage(‘SC_T_UPLOAD_BIG’)), array(‘check_upload_raw’ => GetMessage(‘SC_T_UPLOAD_RAW’)), array(‘check_post’ => GetMessage(‘SC_T_POST’)), 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_bx_crontab’ => GetMessage(‘SC_T_BX_CRONTAB’)), array(‘check_divider’ => GetMessage(‘SC_T_DELIMITER’)), array(‘check_precision’ => GetMessage(‘SC_T_PRECISION’)), array(‘check_clone’ => GetMessage(‘SC_T_CLONE’)), array(‘check_getimagesize’ => GetMessage(‘SC_T_GETIMAGESIZE’)), /**/ ); $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_status’ => GetMessage(‘SC_T_CHECK’)), array(‘check_mysql_connection_charset’ => GetMessage(‘SC_CONNECTION_CHARSET’)), array(‘check_mysql_db_charset’ => GetMessage(‘SC_DB_CHARSET’)), array(‘check_mysql_table_charset’ => GetMessage(‘SC_T_CHARSET’)), array(‘check_mysql_table_structure’ => GetMessage(‘SC_T_STRUCTURE’)), ); if ($this->fix_mode == 1) $this->arTest = array( array(‘check_mysql_table_status’ => GetMessage(‘SC_T_CHECK’)), ); elseif ($this->fix_mode == 2) $this->arTest = array( array(‘check_mysql_connection_charset’ => GetMessage(‘SC_CONNECTION_CHARSET’)), array(‘check_mysql_db_charset’ => GetMessage(‘SC_DB_CHARSET’)), array(‘check_mysql_table_charset’ => GetMessage(‘SC_T_CHARSET’)), ); elseif ($this->fix_mode == 3) $this->arTest = array( array(‘check_mysql_table_structure’ => GetMessage(‘SC_T_STRUCTURE’)), ); elseif (strtolower($GLOBALS[‘DB’]->type) == ‘mysql’) $this->arTest = array_merge($this->arTest, $this->arTestDB); // $this->arTest = array_merge(array(array(‘OpenLog’=>GetMessage(‘SC_T_LOG’))), $this->arTestDB); list($this->function, $this->strCurrentTestName) = each($this->arTest[$this->step]); $this->strNextTestName = $this->strCurrentTestName; $LICENSE_KEY = »; if (file_exists($file = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix’.‘/license_key.php’)) include($file); if ($LICENSE_KEY == ») $LICENSE_KEY = ‘DEMO’; $this->LogFile = ‘/bitrix’.‘/site_checker_’.md5(‘SITE_CHECKER’.$LICENSE_KEY).‘.log’; } function Start($failed = false) { if ($this->step == 0) $_SESSION[‘SITE_CHECKER_LOG’] = »; $this->test_percent = 100; // by default if ($failed) { $this->result = $this->Result(false, GetMessage(‘SC_TEST_FAIL’)); } else { ob_start(); $this->result = call_user_func(array($this,$this->function)); $this->strError = ob_get_clean(); } if (!$this->strResult) $this->Result($this->result); if ($this->function != ‘OpenLog’ && !$this->fix_mode) { // write to log if (@$this->OpenLog($continue = true)) { $text = date(‘Y-M-d H:i:s’) . ‘ ‘ . $this->strCurrentTestName . ‘ (‘ . $this->function . «): » . $this->LogResult . «n»; if ($this->test_percent < 100) $text .= $this->test_percent.‘% done’ . «n»; if ($this->strError) { $text .= strip_tags($this->strError).»n»; $_SESSION[‘SITE_CHECKER_LOG’] .= $text; } if ($this->test_percent >= 100) // test finished $text .= strip_tags($this->strResult).»n»; $text = htmlspecialchars_decode($text); fwrite($this->LogResourse, $text); } } $this->last_function = $this->function; $this->percent = floor(($this->step + $this->test_percent / 100) / count($this->arTest) * 100); if ($this->test_percent >= 100) // test finished { if ($this->step + 1 < count($this->arTest)) { $this->step++; $this->test_percent = 0; $this->arTestVars[‘last_value’] = »; list($this->function, $this->strNextTestName) = each($this->arTest[$this->step]); } else // finish { if (!$this->fix_mode) // if we have a kernel { COption::SetOptionString(‘main’, ‘site_checker_success’, $this->arTestVars[‘site_checker_success’]); CEventLog::Add(array( «SEVERITY» => «WARNING«, «AUDIT_TYPE_ID» => $this->arTestVars[‘site_checker_success’] == ‘Y’ ? ‘SITE_CHECKER_SUCCESS’ : ‘SITE_CHECKER_ERROR’, «MODULE_ID» => «main«, «ITEM_ID» => $_SERVER[‘DOCUMENT_ROOT’], «DESCRIPTION» => $_SESSION[‘SITE_CHECKER_LOG’], )); } } } elseif ($this->result === true) $this->strResult = »; // in case of temporary result at this step if ($this->result === false) $this->arTestVars[‘site_checker_success’] = ‘N’; } function Result($result, $text = ») { if ($result === true) { $this->LogResult = ‘Ok’; $color = ‘green’; } elseif ($result === null) { $this->LogResult = ‘Warning’; $color = ‘black’; } else { $this->LogResult = ‘Fail’; $color = ‘red’; } $this->strResult = ‘<span style=»color:’.$color.‘;font-weight:bold»>’.($text ? $text : ($result ? GetMessage(‘SC_TEST_SUCCESS’) : GetMessage(‘SC_ERROR’))).‘</span>’; return $result; } function OpenLog($continue = false) { if (!$this->LogFile) return false; $this->LogResourse = fopen($_SERVER[‘DOCUMENT_ROOT’].$this->LogFile, $continue ? ‘ab’ : ‘wb’); if ($continue) return $this->LogResourse; elseif ($this->LogResourse) { $this->arTestVars[‘site_checker_success’] = ‘Y’; return $this->Result(null, GetMessage(‘SC_LOG_OK’).‘ <a href=»?read_log=Y» target=»_blank»>’.GetMessage(‘SC_F_OPEN’).‘</a>’); } else return $this->Result(false,GetMessage(‘SC_CHECK_FILES’)); } function ConnectToHost($host = false, $port = false, $ssl = false) { if (!$host) { if ($this->arTestVars[‘check_socket_fail’]) return $this->Result(null, GetMessage(‘SC_SOCK_NA’)); $host = $this->host; $port = $this->port; $ssl = $this->ssl ? ‘ssl://’ : »; } if (!$res = fsockopen($ssl.$host, $port, $errno, $errstr, 5)) return $this->Result(false, «Socket error [$errno]: $errstr«); return $res; } ###### 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@bitrixsoft.com«, «Bitrix site checker«.($big ? CEvent::GetMailEOL() . «tmultiline subject» : «»), $body, ($big ? ‘BCC: noreply@bitrixsoft.com’.»rn» : »)); 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(true); } function check_mail_b_event() { global $DB; $res = $DB->QuerySELECT 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() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=socket_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; $retVal = false; $host = $this->host; $port = $this->port; $ssl = $this->ssl ? ‘ssl://’ : »; echo «Connection to $ssl$host:$port«; if ($res = $this->ConnectToHost()) $retVal = IsHttpResponseSuccess($res, $strRequest); if (!$retVal) $this->arTestVars[‘check_socket_fail’] = 1; return $retVal; } function check_dbconn() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=dbconn_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; $retVal = false; if ($res = $this->ConnectToHost()) return IsHttpResponseSuccess($res, $strRequest); return $retVal; } function check_upload($big = false, $raw = false) { if (($sp = ini_get(«upload_tmp_dir«))) { if (!file_exists($sp)) return $this->Result(false,GetMessage(‘SC_NO_TMP_FOLDER’).‘ <i>(‘.htmlspecialcharsbx($sp).‘)</i>’); elseif (!is_writable($sp)) return $this->Result(false,GetMessage(‘SC_TMP_FOLDER_PERMS’).‘ <i>(‘.htmlspecialcharsbx($sp).‘)</i>’); } $binaryData = »; for($i=40;$i<240;$i++) $binaryData .= chr($i); if ($big) $binaryData = str_repeat($binaryData, 21000); if ($raw) $POST = $binaryData; else { $boundary = ‘———‘.md5(checker_get_unique_id()); $POST = «$boundaryrn»; $POST.= ‘Content-Disposition: form-data; name=»test_file»; filename=»site_checker.bin’.»rn»; $POST.= ‘Content-Type: image/gif’.»rn»; $POST.= «rn»; $POST.= $binaryData.»rn»; $POST.= «$boundaryrn»; } $strRequest = «POST «.$_SERVER[‘PHP_SELF’].»?test_type=upload_test&unique_id=«.checker_get_unique_id().»&big=«.($big ? 1 : 0).»&raw=«.($raw ? 1 : 0).» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; if (!$raw) $strRequest.= «Content-Type: multipart/form-data; boundary=$boundaryrn»; $strRequest.= «Content-Length: «.(function_exists(‘mb_strlen’) ? mb_strlen($POST, ‘ISO-8859-1’) : strlen($POST)).»rn»; $strRequest.= «rn»; $strRequest.= $POST; if ($res = $this->ConnectToHost()) return IsHttpResponseSuccess($res, $strRequest, $strHeaders, true); return false; } function check_upload_big() { return $this->check_upload(true); } function check_upload_raw() { return $this->check_upload(false, true); } function check_post() { $POST = »; for($i=0;$i<201;$i++) $POST .= ‘i’.$i.‘=’.md5($i).‘&’; $strRequest = «POST «.$_SERVER[‘PHP_SELF’].»?test_type=post_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «Content-Length: «.(function_exists(‘mb_strlen’) ? mb_strlen($POST, ‘ISO-8859-1’) : strlen($POST)).»rn»; $strRequest.= «Content-Type: application/x-www-form-urlencodedrn»; $strRequest.= «rn»; $strRequest.= $POST; if ($res = $this->ConnectToHost()) return IsHttpResponseSuccess($res, $strRequest); return false; } function check_memory_limit() { $total_steps = 7; if (!$this->arTestVars[‘last_value’]) { $last_success = 0; $max = 16; $step = 1; } else { if (!CheckSerializedData($this->arTestVars[‘last_value’])) return false; list($last_success, $max, $step) = unserialize($this->arTestVars[‘last_value’]); } $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=memory_test&unique_id=«.checker_get_unique_id().»&max=«.($max1).» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; if (!$res = $this->ConnectToHost()) return false; if (IsHttpResponseSuccess($res, $strRequest)) { $last_success = $max; $max *= 2; } else $max = floor(($last_success + $max) / 2); if ($max < 16) return false; if ($step < $total_steps) { $this->test_percent = floor(100 / $total_steps * $step); $step++; $this->arTestVars[‘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->arTestVars[‘last_value’]) { $_SESSION[‘CHECKER_CHECK_SESSION’] = ‘SUCCESS’; $this->test_percent = 50; $this->arTestVars[‘last_value’] = ‘Y’; } else { if ($_SESSION[‘CHECKER_CHECK_SESSION’] != ‘SUCCESS’) return false; unset($_SESSION[‘CHECKER_CHECK_SESSION’]); } return true; } function check_session_ua() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=session_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; if ($this->arTestVars[‘last_value’]) // second step: put session id $strRequest.= «Cookie: «.$this->arTestVars[‘last_value’].»rn»; $strRequest.= «rn»; if (!$res = $this->ConnectToHost()) return false; if (!$this->arTestVars[‘last_value’]) // first step: read session id { $strRes = GetHttpResponse($res, $strRequest, $strHeaders); if (!preg_match(‘#Set-Cookie: (‘.session_name().‘=[a-z0-9-_]+?);#i’,$strHeaders,$regs)) { echo «n== Request ==n».$strRequest . «n== Response ==n» . $strHeaders . «n== Body ==n» . $strRes . «n==========«; return false; } $this->arTestVars[‘last_value’] = $regs[1]; $this->test_percent = 50; return true; } else return IsHttpResponseSuccess($res, $strRequest, $strHeaders); } function check_http_auth() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=auth_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «Authorization: Basic dGVzdF91c2VyOnRlc3RfcGFzc3dvcmQ=rn»; $strRequest.= «rn»; if ($res = $this->ConnectToHost()) return IsHttpResponseSuccess($res, $strRequest); return false; } function check_update() { $ServerIP = COption::GetOptionStringmain«, «update_site«, «www.bitrixsoft.com«); $ServerPort = 80; $proxyAddr = COption::GetOptionStringmain«, «update_site_proxy_addr«, «»); $proxyPort = COption::GetOptionStringmain«, «update_site_proxy_port«, «»); $proxyUserName = COption::GetOptionStringmain«, «update_site_proxy_user«, «»); $proxyPassword = COption::GetOptionStringmain«, «update_site_proxy_pass«, «»); $bUseProxy = !$this->arTestVars[‘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.0rn»; if (strlen($proxyUserName) > 0) $strRequest .= «Proxy-Authorization: Basic «.base64_encode($proxyUserName:«.$proxyPassword).»rn»; } else $strRequest .= «POST /bitrix/updates/«.$page HTTP/1.0rn»; $strRequest.= «User-Agent: BitrixSMUpdaterrn»; $strRequest.= «Accept: */*rn»; $strRequest.= «Host: «.$ServerIP.»rn»; $strRequest.= «Accept-Language: enrn»; $strRequest.= «Content-type: application/x-www-form-urlencodedrn»; $strRequest.= «Content-length: 7rnrn»; $strRequest.= «lang=en«; $strRequest.= «rn»; $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 { echo «n== Request ==n».$strRequest . «n== Response ==n» . $strHeaders . «n== Body ==n» . $strRes . «n==========«; 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 = $_SERVERDOCUMENT_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 = ‘/bitrix’.‘/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); $strRequest = «GET «.$path HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; if ($res = $this->ConnectToHost()) $retVal = IsHttpResponseSuccess($res, $strRequest); else $retVal = false; unlink($_SERVER[‘DOCUMENT_ROOT’].$path); return $retVal; } function check_suhosin() { if (in_array(‘suhosin’,get_loaded_extensions())) return $this->Result(null,GetMessage(‘SC_WARN_SUHOSIN’,array(‘#VAL#’ => ini_get(‘suhosin.simulation’) ? 1 : 0))); return true; } function check_security() { $strError = »; if (function_exists(‘apache_get_modules’)) { $arLoaded = apache_get_modules(); if (in_array(‘mod_security’, $arLoaded)) $strError .= GetMessage(‘SC_WARN_SECURITY’).»<br>n»; if (in_array(‘mod_dav’, $arLoaded) || in_array(‘mod_dav_fs’, $arLoaded)) $strError .= GetMessage(‘SC_WARN_DAV’).»<br>n»; } if ($strError) return $this->Result(null, $strError); return true; } function check_install_scripts() { $strError = »; foreach(array( ‘restore.php’, ‘bitrix_server_test.php’, ‘bitrixsetup.php’, ‘bitrix_install.php’, ‘bitrix_setup.php’, ‘bitrix6setup.php’, ‘bitrix7setup.php’, ‘bitrix8setup.php’, ) as $file) { if (file_exists($_SERVER[‘DOCUMENT_ROOT’].‘/’.$file)) $strError .= GetMessage(‘SC_FILE_EXISTS’).‘ ‘.$file.»n<br>«; } if ($strError) return $this->Result(false, $strError); 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_precision() { return 1234567891 == (string) doubleval(1234567891); } function check_clone() { $x = new CDatabase; $x->b = ‘FAIL’; $y = $x; $y->b = ‘SUCCESS’; return $x->b == ‘SUCCESS’; } function check_getimagesize() { $file = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules/fileman/install/components/bitrix/player/mediaplayer/player’; if (!file_exists($file)) return $this->Result(null, «File not found: «.$file); if (false === getimagesize($file)) return $this->Result(null, GetMessage(‘SC_SWF_WARN’)); return true; } function check_localredirect() { $strSERVER = »; foreach(array(‘SERVER_PORT’, ‘HTTPS’, ‘FCGI_ROLE’, ‘HTTP_HOST’, ‘SERVER_PROTOCOL’) as $var) $strSERVER .= ‘&’.$var.‘=’.urlencode($_SERVER[$var]); if (!$this->arTestVars[‘last_value’]) { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=redirect_test&unique_id=«.checker_get_unique_id().$strSERVER HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; if (!$res = $this->ConnectToHost()) return false; $strRes = GetHttpResponse($res, $strRequest, $strHeaders); if (preg_match(‘#Location: (.+)#’, $strHeaders, $regs)) { $url = trim($regs[1]); if (!$url) { echo «n== Request ==n».$strRequest . «n== Response ==n» . $strHeaders . «n== Body ==n» . $strRes . «n==========«; return false; } $this->arTestVars[‘last_value’] = $url; $this->test_percent = 50; return true; } echo «n== Request ==n».$strRequest . «n== Response ==n» . $strHeaders . «n== Body ==n» . $strRes . «n==========«; return false; } else { $url = $this->arTestVars[‘last_value’]; if (!$url) return false; $ar = parse_url($url); $host = $ar[‘host’]; $ssl = $ar[‘scheme’] == ‘https’ ? ‘ssl://’ : »; $port = intval($ar[‘port’]) ? intval($ar[‘port’]) : ($ssl ? 443 : 80); $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=redirect_test&unique_id=«.checker_get_unique_id().$strSERVER&done=Y HTTP/1.1rn»; $strRequest.= «Host: «.$host.»rn»; $strRequest.= «rn»; if ($res = $this->ConnectToHost($host, $port, $ssl)) return IsHttpResponseSuccess($res, $strRequest); return false; } } function check_mbstring() { $retVal = true; $bUtf = false; $rs = CSite::GetList($by,$order,array(‘ACTIVE’=>‘Y’)); while($f = $rs->Fetch()) if (strpos(strtolower($f[‘CHARSET’]),‘utf’)!==false) { $bUtf = true; break; } $overload = intval(ini_get(‘mbstring.func_overload’)); $encoding = strtolower(ini_get(‘mbstring.internal_encoding’)); if ($bUtf) { $text = GetMessage(‘SC_MB_UTF’); $retVal = ($overload == 2) && ($encoding == ‘utf8’ || $encoding == ‘utf-8’); if (!$retVal) $text .= ‘, ‘.GetMessage(‘SC_MB_CUR_SETTINGS’).‘<br>mbstring.func_overload=’.$overload.‘<br>mbstring.internal_encoding=’.$encoding. ‘<br>’.GetMessage(‘SC_MB_REQ_SETTINGS’).‘<br>mbstring.func_overload=2<br>mbstring.internal_encoding=utf-8’; if (!defined(‘BX_UTF’) || BX_UTF !== true) { $retVal = false; $text .= ‘<br>’.GetMessage(‘SC_BX_UTF’); $this->arTestVars[‘check_mbstring_fail’] = true; } } else { $text = GetMessage(‘SC_MB_NOT_UTF’); if ($overload == 2) { $ru = LANG_CHARSET == ‘windows-1251’; $mb_string_req = ‘<br>mbstring.internal_encoding=’.($ru ? ‘cp1251’ : ‘latin1’); if ($ru) $retVal = false !== strpos($encoding,‘1251’); else $retVal = false === strpos($encoding,‘utf’); } else { $mb_string_req = ‘<br>mbstring.func_overload=0’; $retVal = $overload == 0; } if (!$retVal) $text .= ‘, ‘.GetMessage(‘SC_MB_CUR_SETTINGS’).‘<br>mbstring.func_overload=’.$overload.‘<br>mbstring.internal_encoding=’.$encoding. ‘<br>’.GetMessage(‘SC_MB_REQ_SETTINGS’).$mb_string_req; if (defined(‘BX_UTF’)) { $retVal = false; $text .= ‘<br>’.GetMessage(‘SC_BX_UTF_DISABLE’); $this->arTestVars[‘check_mbstring_fail’] = true; } } if ($retVal) { $l = strlen(«xd0xa2»); if (!($retVal = $bUtf && $l == 1 || !$bUtf && $l == 2)) $text = GetMessage(‘SC_STRLEN_FAIL’); } return $this->Result($retVal, ($retVal ? GetMessage(‘SC_TEST_SUCCESS’).‘. ‘:»).$text); } function check_sites() { $strError = »; $bUtf = $bChar = $bFound = false; $arDocRoot = array(); $rs = CSite::GetList($by,$order,array(‘ACTIVE’=>‘Y’)); while($f = $rs->Fetch()) { $arDocRoot[] = trim($f[‘DOC_ROOT’]); $bFound = strpos(strtolower($f[‘CHARSET’]),‘utf’)!==false; $bUtf = $bUtf || $bFound; $bChar = $bChar || !$bFound; } if (count($arDocRoot) == 1) { if ($root = $arDocRoot[0]) $strError = GetMessage(‘SC_PATH_FAIL_SET’).‘ <i>’.htmlspecialcharsbx($root).‘</i><br>’; } else { foreach($arDocRoot as $root) { if ($root) { if (!is_readable($root.‘/bitrix’)) $strError .= GetMessage(‘SC_NO_ROOT_ACCESS’).‘ <i>’.htmlspecialcharsbx($root).‘/bitrix</i><br>’; } } } if ($bUtf && $bChar) $strError.= GetMessageSC_SITE_CHARSET_FAIL«); if ($strError) return $this->Result(false, $strError); return true; } function check_php_modules() { $arMods = array( ‘fsockopen’ => GetMessageSC_SOCKET_F«), ‘xml_parser_create’ => GetMessageSC_MOD_XML«), ‘preg_match’ => GetMessageSC_MOD_PERL_REG«), ‘imagettftext’ => «Free Type Text«, ‘gzcompress’ => «Zlib«, ‘imagecreatetruecolor’ => GetMessageSC_MOD_GD«), ‘imagecreatefromjpeg’ => GetMessageSC_MOD_GD_JPEG«) ); $strError = »; foreach($arMods as $func => $desc) { if (!function_exists($func)) $strError .= $desc<br>n»; } if (defined(‘BX_UTF’) && BX_UTF === true && !function_exists(‘mb_substr’)) $strError .= GetMessageSC_MOD_MBSTRING«).»<br>n»; if (!in_array(‘ssl’, stream_get_transports())) $strError .= GetMessage(‘ERR_NO_SSL’); if ($strError) return $this->Result(false,GetMessage(‘ERR_NO_MODS’) . «<br>n» . $strError); return true; } function check_php_settings() { $strError = »; $PHP_vercheck_min = ‘5.3.0’; if (version_compare($v = phpversion(), $PHP_vercheck_min, ‘<‘)) $strError = GetMessage(‘SC_VER_ERR’, array(‘#CUR#’ => $v, ‘#REQ#’ => $PHP_vercheck_min)).»<br>n»; $arRequiredParams = array( ‘safe_mode’ => 0, // ‘allow_call_time_pass_reference’ => 1, ‘file_uploads’ => 1, ‘session.cookie_httponly’ => 0, ‘wincache.chkinterval’ => 0, ‘session.auto_start’ => 0, ‘magic_quotes_runtime’ => 0, ‘magic_quotes_sybase’ => 0, ‘magic_quotes_gpc’ => 0, ‘arg_separator.output’ => ‘&’ ); foreach($arRequiredParams as $param => $val) { $cur = ini_get($param); if (strtolower($cur) == ‘on’) $cur = 1; elseif (strtolower($cur) == ‘off’) $cur = 0; if ($cur != $val) $strError .= GetMessage(‘SC_ERR_PHP_PARAM’, array(‘#PARAM#’ => $param, ‘#CUR#’ => $cur ? htmlspecialcharsbx($cur) : ‘off’, ‘#REQ#’ => $val ? ‘on’ : ‘off’)).»<br>n»; } if (($m = ini_get(‘max_input_vars’)) && $m < 3000) $strError .= GetMessage(‘ERR_MAX_INPUT_VARS’,array(‘#MIN#’ => 3000,‘#CURRENT#’ => $m)).»<br>n»; if (($vm = getenv(‘BITRIX_VA_VER’)) && version_compare($vm, ‘4.2.0’,‘<‘)) $strError .= GetMessage(‘ERR_OLD_VM’).»<br>n»; if ($strError) return $this->Result(false, $strError); return true; } function check_backtrack_limit() { $param = ‘pcre.backtrack_limit’; $cur = ini_get($param); ini_set($param,$cur + 1); $new = ini_get($param); return $new == $cur + 1; } function check_pcre_recursion() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=pcre_recursion_test&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; if ($res = $this->ConnectToHost()) { if (‘SUCCESS’ == $strRes = GetHttpResponse($res, $strRequest, $strHeaders)) return true; if ($strRes == ‘CLEAN’) return $this->Result(null, GetMessage(‘SC_PCRE_CLEAN’)); } return false; } function check_method_exists() { $strRequest = «GET «.$_SERVER[‘PHP_SELF’].»?test_type=method_exists&unique_id=«.checker_get_unique_id().» HTTP/1.1rn»; $strRequest.= «Host: «.$this->host.»rn»; $strRequest.= «rn»; if ($res = $this->ConnectToHost()) return IsHttpResponseSuccess($res, $strRequest); return false; } function check_server_vars() { $strError = »; $dir0 = realpath(str_replace(‘\’,‘/’,dirname(__FILE__))); $dir1 = realpath(str_replace(‘\’,‘/’,rtrim($_SERVER[‘DOCUMENT_ROOT’],‘\/’).‘/bitrix’).‘/modules/main/admin’); if (strpos($dir0,‘:’) == 1) $dir0 = ToLower($dir0); if (strpos($dir1,‘:’) == 1) $dir1 = ToLower($dir1); if ($dir0 != $dir1) $strError = GetMessage(‘SC_DOCROOT_FAIL’,array(‘#DIR0#’=>$dir0, ‘#DIR1#’=>$dir1)).»<br>n»; list($host, $port) = explode(‘:’,$_SERVER[‘HTTP_HOST’]); if ($host != ‘localhost’ && !preg_match(‘#^[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}$#’,$host)) { if (!preg_match(‘#^[a-z0-9-.]{2,192}.(xn--)?[a-z0-9]{2,63}$#i’, $host)) $strError .= GetMessageSC_TEST_DOMAIN_VALID«, array(‘#VAL#’ => htmlspecialcharsbx($_SERVER[‘HTTP_HOST’]))).»<br>n»; } if ($strError) return $this->Result(false, $strError); return true; } function check_bx_crontab() { return !defined(‘BX_CRONTAB’); } ############################## # MYSQL Tests follow ############################## function check_mysql_bug_version() { global $DB; $MySql_vercheck_min = «5.0.0«; $ver = $DB->GetVersion(); if (version_compare($ver,$MySql_vercheck_min,‘<‘)) return $this->Result(false, GetMessage(‘SC_MYSQL_ERR_VER’, array(‘#CUR#’ => $ver, ‘#REQ#’ => $MySql_vercheck_min))); 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() { global $DB; $res = $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() { global $DB; $s = time(); while($s == time()); $s++; $res = $DB->Query(‘SELECT NOW() AS A’); $f = $res->Fetch(); if (($diff = abs($s — strtotime($f[‘A’]))) == 0) return true; return $this->Result(false, GetMessage(‘SC_TIME_DIFF’, array(‘#VAL#’ => $diff))); } 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_status() { global $DB; $time = time(); $strError = »; $i = 0; $res = $DB->Query(‘SHOW TABLES’); $cnt = $res->SelectedRowsCount(); while($f = $res->Fetch()) { $i++; list($k, $table) = each($f); if ($this->arTestVars[‘last_value’]) { if ($this->arTestVars[‘last_value’] == $table) unset($this->arTestVars[‘last_value’]); continue; } // 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 (!$this->fix_mode) $res0 = $DB->Query(‘CHECK TABLE `’ . $table . ‘`’); else $res0 = $DB->Query(‘REPAIR TABLE `’ . $table . ‘`’); $f0 = $res0->Fetch(); if ($f0[‘Msg_type’] == ‘error’ || $f0[‘Msg_type’] == ‘warning’) $strError .= GetMessage(‘SC_TABLE_ERR’, array(‘#VAL#’ => $table)) . ‘ ‘ . $f0[‘Msg_text’] . «n<br>«; if (time()-$time >= $this->timeout) { $this->arTestVars[‘last_value’] = $table; $this->test_percent = floor($i / $cnt * 100); return true; } } if (!$strError) return true; if (!$this->fix_mode) { $this->arTestVars[‘check_table_status_fail’] = true; echo $strError; // to log return $this->Result(false, GetMessage(‘SC_TABLES_NEED_REPAIR’).fix_link(1)); } return $this->Result(false, $strError); } function check_mysql_connection_charset() { global $DB; $strError = »; if ($this->arTestVars[‘check_mbstring_fail’]) return $this->Result(null, GetMessage(‘SC_MBSTRING_NA’)); $res = $DB->Query(‘SHOW VARIABLES LIKE «character_set_connection»‘); $f = $res->Fetch(); $character_set_connection = $f[‘Value’]; $res = $DB->Query(‘SHOW VARIABLES LIKE «collation_connection»‘); $f = $res->Fetch(); $collation_connection = $f[‘Value’]; $res = $DB->Query(‘SHOW VARIABLES LIKE «character_set_results»‘); $f = $res->Fetch(); $character_set_results = $f[‘Value’]; $bAllIn1251 = true; // $res1 = CSite::GetList($by,$order,array(‘ACTIVE’=>’Y’)); $res1 = $DB->Query(‘SELECT * FROM b_lang WHERE active=»Y»‘); // for ‘no kernel mode’ while($f1 = $res1->Fetch()) $bAllIn1251 = $bAllIn1251 && trim(strtolower($f1[‘CHARSET’])) == ‘windows-1251’; if (defined(‘BX_UTF’) && BX_UTF === true) { if ($character_set_connection != ‘utf8’) $strError = GetMessageSC_CONNECTION_CHARSET_WRONG«, array(‘#VAL#’ => ‘utf8’, ‘#VAL1#’ => $character_set_connection)); elseif ($collation_connection != ‘utf8_unicode_ci’) $strError = GetMessageSC_CONNECTION_COLLATION_WRONG_UTF«, array(‘#VAL#’ => $collation_connection)); } else { if ($bAllIn1251 && $character_set_connection != ‘cp1251’) $strError = GetMessageSC_CONNECTION_CHARSET_WRONG«, array(‘#VAL#’ => ‘cp1251’, ‘#VAL1#’ => $character_set_connection)); elseif ($character_set_connection == ‘utf8’) $strError = GetMessageSC_CONNECTION_CHARSET_WRONG_NOT_UTF«, array(‘#VAL#’ => $character_set_connection)); } if (!$strError && $character_set_connection != $character_set_results) $strError = GetMessage(‘SC_CHARSET_CONN_VS_RES’,array(‘#CONN#’ => $character_set_connection, ‘#RES#’ => $character_set_results)); echo ‘character_set_connection=’.$character_set_connection.‘, collation_connection=’.$collation_connection.‘, character_set_results=’.$character_set_results; if (!$strError) return true; $this->arTestVars[‘check_connection_charset_fail’] = true; return $this->Result(false, $strError); } function check_mysql_db_charset() { global $DB; if ($this->arTestVars[‘check_mbstring_fail’]) return $this->Result(null, GetMessage(‘SC_MBSTRING_NA’)); elseif ($this->arTestVars[‘check_table_status_fail’]) return $this->Result(null, GetMessage(‘SC_TABLES_NEED_REPAIR’)); elseif ($this->arTestVars[‘check_connection_charset_fail’]) return $this->Result(null, GetMessage(‘SC_CONNECTION_CHARSET_NA’)); $strError = »; $res = $DB->Query(‘SHOW VARIABLES LIKE «character_set_connection»‘); $f = $res->Fetch(); $character_set_connection = $f[‘Value’]; $res = $DB->Query(‘SHOW VARIABLES LIKE «collation_connection»‘); $f = $res->Fetch(); $collation_connection = $f[‘Value’]; $res = $DB->Query(‘SHOW VARIABLES LIKE «character_set_database»‘); $f = $res->Fetch(); $character_set_database = $f[‘Value’]; $res = $DB->Query(‘SHOW VARIABLES LIKE «collation_database»‘); $f = $res->Fetch(); $collation_database = $f[‘Value’]; if ($this->fix_mode) { if ($DB->Query($sql = ‘ALTER DATABASE `’ . $DB->DBName. ‘` DEFAULT CHARACTER SET ‘ . $character_set_connection . ‘ COLLATE ‘ . $collation_connection, true)) $strError = »; else $strError .= $sql . ‘ [‘ . $DB->db_Error . ‘]’; } else { if ($character_set_connection != $character_set_database) $strError = GetMessage(‘SC_DATABASE_CHARSET_DIFF’, array(‘#VAL0#’ => $character_set_connection, ‘#VAL1#’ => $character_set_database)).fix_link(); elseif ($collation_database != $collation_connection) $strError = GetMessage(‘SC_DATABASE_COLLATION_DIFF’, array(‘#VAL0#’ => $collation_connection, ‘#VAL1#’ => $collation_database)).fix_link(); } echo ‘CHARSET=’.$character_set_database.‘, COLLATION=’.$collation_database; if (!$strError) return true; $this->arTestVars[‘db_charset_fail’] = true; return $this->Result(false, $strError); } function check_mysql_table_charset() { global $DB; $strError = »; if ($this->arTestVars[‘check_mbstring_fail’]) return $this->Result(null, GetMessage(‘SC_MBSTRING_NA’)); elseif ($this->arTestVars[‘check_table_status_fail’]) return $this->Result(null, GetMessage(‘SC_TABLES_NEED_REPAIR’)); elseif ($this->arTestVars[‘check_connection_charset_fail’]) return $this->Result(null, GetMessage(‘SC_CONNECTION_CHARSET_NA’)); elseif ($this->arTestVars[‘db_charset_fail’]) return $this->Result(null, GetMessage(‘SC_TABLE_CHECK_NA’)); $res = $DB->Query(‘SHOW VARIABLES LIKE «character_set_database»‘); $f = $res->Fetch(); $charset = trim($f[‘Value’]); $res = $DB->Query(‘SHOW VARIABLES LIKE «collation_database»‘); $f = $res->Fetch(); $collation = trim($f[‘Value’]); $time = time(); $i = 0; $res = $DB->Query(‘SHOW TABLES LIKE «b_%»‘); $cnt = $res->SelectedRowsCount(); $arExclusion = array( ‘b_search_content_stem’ => ‘STEM’, ‘b_search_content_freq’ => ‘STEM’, ‘b_search_stem’ => ‘STEM’, ‘b_search_tags’ => ‘NAME’ ); while($f = $res->Fetch()) { $i++; list($k, $table) = each($f); if ($this->arTestVars[‘last_value’]) { if ($this->arTestVars[‘last_value’] == $table) unset($this->arTestVars[‘last_value’]); continue; } $res0 = $DB->Query(‘SHOW CREATE TABLE `’ . $table . ‘`’); $f0 = $res0->Fetch(); if (preg_match(‘/DEFAULT CHARSET=([^ ]+)/i’, $f0[‘Create Table’], $regs)) { $t_charset = $regs[1]; if (preg_match(‘/COLLATE=([^ ]+)/i’, $f0[‘Create Table’], $regs)) $t_collation = $regs[1]; else { $res0 = $DB->Query(‘SHOW CHARSET LIKE «‘ . $t_charset . ‘»‘); $f0 = $res0->Fetch(); $t_collation = $f0[‘Default collation’]; } } else { $res0 = $DB->Query(‘SHOW TABLE STATUS LIKE «‘ . $table . ‘»‘); $f0 = $res0->Fetch(); if (!$t_collation = $f0[‘Collation’]) continue; $t_charset = getCharsetByCollation($t_collation); } if ($charset != $t_charset) { // table charset differs if (!$this->fix_mode) { $strError .= GetMessage(‘SC_DB_MISC_CHARSET’,array(‘#TABLE#’ => $table,‘#VAL1#’ => $t_charset,‘#VAL0#’=>$charset)) . «<br>n»; $this->arTestVars[‘iError’]++; } } elseif ($t_collation != $collation) { // table collation differs if (!$this->fix_mode) { $strError .= GetMessage(‘SC_COLLATE_WARN’,array(‘#TABLE#’=>$table,‘#VAL1#’=>$t_collation,‘#VAL0#’=>$collation)).»<br>n»; $this->arTestVars[‘iError’]++; $this->arTestVars[‘iErrorAutoFix’]++; } elseif (!$DB->Query($sql = ‘ALTER TABLE `’ . $table . ‘` COLLATE ‘ . $collation, true)) { $strError .= $sql . ‘ [‘ . $DB->db_Error . ‘]’; break; } } // fields check $arFix = array(); $res0 = $DB->QuerySHOW FULL COLUMNS FROM `» . $table . «`«); while($f0 = $res0->Fetch()) { $f_collation = $f0[‘Collation’]; if ($f_collation === NULL || $f_collation === «NULL«) continue; $f_charset = getCharsetByCollation($f_collation); if ($charset != $f_charset) { // field charset differs if (!$this->fix_mode) { $strError .= GetMessage(‘SC_TABLE_CHARSET_WARN’,array(‘#TABLE#’ => $table, ‘#VAL0#’ => $charset, ‘#VAL1#’ => $f_charset, ‘#FIELD#’ => $f0[‘Field’])) . «<br>n»; $this->arTestVars[‘iError’]++; } } elseif ($collation != $f_collation) { if ($arExclusion[$table] && strtoupper($f0[‘Field’]) == $arExclusion[$table]) continue; // field collation differs if (!$this->fix_mode) { $strError .= GetMessage(‘SC_FIELDS_COLLATE_WARN’,array(‘#TABLE#’ => $table, ‘#VAL0#’ => $collation, ‘#VAL1#’ => $f_collation, ‘#FIELD#’ => $f0[‘Field’])) . «<br>n»; $this->arTestVars[‘iError’]++; $this->arTestVars[‘iErrorAutoFix’]++; } else $arFix[] = ‘ MODIFY `’ . $f0[‘Field’] . ‘` ‘ . $f0[‘Type’] . ‘ COLLATE ‘ . $collation . ($f0[‘Null’] == ‘YES’ ? ‘ NULL’ : ‘ NOT NULL’) . ($f0[‘Default’] === NULL ? ($f0[‘Null’] == ‘YES’ ? ‘ DEFAULT NULL ‘ : ») : ‘ DEFAULT «‘ . $DB->ForSQL($f0[‘Default’]) . ‘» ‘); } } if ($this->fix_mode && count($arFix)) { if (!$DB->Query($sql = ‘ALTER TABLE `’.$table.‘` ‘.implode(«,n», $arFix), true)) { $strError .= $sql . ‘ [‘ . $DB->db_Error . ‘]’; break; } } if (time()-$time >= $this->timeout) { $this->arTestVars[‘last_value’] = $table; $this->test_percent = floor($i / $cnt * 100); return true; } } if (!$strError) return true; $this->arTestVars[‘table_charset_fail’] = true; if ($this->fix_mode) return $this->Result(false, $strError); else { echo $strError; // to log return $this->Result(false, GetMessage(‘SC_CHECK_TABLES_ERRORS’, array(‘#VAL#’ => intval($this->arTestVars[‘iError’]), ‘#VAL1#’ => intval($this->arTestVars[‘iErrorAutoFix’]))) . ($this->arTestVars[‘iErrorAutoFix’] > 0 ? fix_link() : »)); } } function check_mysql_table_structure() { global $DB; $strError = »; if ($this->arTestVars[‘table_charset_fail’]) return $this->Result(null, GetMessage(‘SC_TABLE_COLLATION_NA’)); $module = »; $cnt = $i = 0; if ($dir = opendir($path = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules’)) { while(false !== ($item = readdir($dir))) { if ($item == ‘.’ || $item == ‘..’) continue; $cnt++; if ($this->arTestVars[‘last_value’]) { $i++; if ($this->arTestVars[‘last_value’] == $item) unset($this->arTestVars[‘last_value’]); } elseif (!$module) $module = $item; } closedir($dir); } else return false; $file = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules/’.$module.‘/install/db/mysql/install.sql’; if (!file_exists($file)) $file = $_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/modules/’.$module.‘/install/mysql/install.sql’; if (file_exists($file)) // uses database… { $rs = $DB->Query(‘SELECT * FROM b_module WHERE id=»‘.$DB->ForSQL($module).‘»‘); if ($rs->Fetch()) // … and is installed { if (!$query = file_get_contents($file)) return false; $arTables = array(); $arQuery = $DB->ParseSQLBatch(str_replace(«r», «», $query)); foreach($arQuery as $sql) { if (preg_match(‘#^(CREATE TABLE )(IF NOT EXISTS)? ?`?([a-z0-9_]+)`?(.*);?$#mis’,$sql,$regs)) { $table = $regs[3]; if (preg_match(‘#^site_checker_#’, $table)) continue; $arTables[$table] = $sql; $tmp_table = ‘site_checker_’.$table; $DB->Query(‘DROP TABLE IF EXISTS `’.$tmp_table.‘`’); $DB->Query($regs[1].‘ `’.$tmp_table.‘`’.$regs[4]); } elseif (preg_match(‘#^(ALTER TABLE)( )?`?([a-z0-9_]+)`?(.*);?$#mis’,$sql,$regs)) { $table = $regs[3]; $tmp_table = ‘site_checker_’.$table; $DB->Query($regs[1].‘ `’.$tmp_table.‘`’.$regs[4]); } } foreach($arTables as $table => $sql) { $rs = $DB->Query(‘SHOW TABLES LIKE «‘.$table.‘»‘); if (!$rs->Fetch()) { if ($this->fix_mode) { if (!$DB->Query($sql)) return $this->Result(false, ‘Mysql Query Error: ‘.$sql.‘ [‘.$DB->db_Error.‘]’); } else { $strError .= GetMessage(‘SC_ERR_NO_TABLE’, array(‘#TABLE#’ => $table)).»<br>n»; $this->arTestVars[‘iError’]++; $this->arTestVars[‘iErrorAutoFix’]++; $this->arTestVars[‘cntNoTables’]++; } continue; } $tmp_table = ‘site_checker_’.$table; $arColumns = array(); $rs = $DB->Query(‘SHOW COLUMNS FROM `’.$table.‘`’); while($f = $rs->Fetch()) $arColumns[$f[‘Field’]] = $f; $rs = $DB->Query(‘SHOW COLUMNS FROM `’.$tmp_table.‘`’); while($f_tmp = $rs->Fetch()) { $tmp = TableFieldConstruct($f_tmp); if ($f = $arColumns[$f_tmp[‘Field’]]) { if (($cur = TableFieldConstruct($f)) != $tmp) { if ($this->fix_mode) { if (TableFieldCanBeAltered($f, $f_tmp)) { if (!$DB->Query($sql = ‘ALTER TABLE `’.$table.‘` MODIFY `’.$f_tmp[‘Field’].‘` ‘.$tmp, true)) return $this->Result(false, ‘Mysql Query Error: ‘.$sql.‘ [‘.$DB->db_Error.‘]’); } else $this->arTestVars[‘iErrorFix’]++; } else { $strError .= GetMessage(‘SC_ERR_FIELD_DIFFERS’, array(‘#TABLE#’ => $table, ‘#FIELD#’ => $f[‘Field’], ‘#CUR#’ => $cur, ‘#NEW#’ => $tmp)).»<br>n»; $this->arTestVars[‘iError’]++; if (TableFieldCanBeAltered($f, $f_tmp)) $this->arTestVars[‘iErrorAutoFix’]++; $this->arTestVars[‘cntDiffFields’]++; } } } else { if ($this->fix_mode) { if (!$DB->Query($sql = ‘ALTER TABLE `’.$table.‘` ADD `’.$f_tmp[‘Field’].‘` ‘.$tmp, true)) return $this->Result(false, ‘Mysql Query Error: ‘.$sql.‘ [‘.$DB->db_Error.‘]’); } else { $strError .= GetMessage(‘SC_ERR_NO_FIELD’, array(‘#TABLE#’ => $table, ‘#FIELD#’ => $f_tmp[‘Field’])).»<br>n»; $this->arTestVars[‘iError’]++; $this->arTestVars[‘iErrorAutoFix’]++; $this->arTestVars[‘cntNoFields’]++; } } } $arIndexes = array(); $rs = $DB->Query(‘SHOW INDEXES FROM `’.$table.‘`’); while($f = $rs->Fetch()) { $ix =& $arIndexes[$f[‘Key_name’]]; $column = $f[‘Column_name’].($f[‘Sub_part’] ? ‘(‘.$f[‘Sub_part’].‘)’ : »); if ($ix) $ix .= ‘,’.$column; else $ix = $column; } $arIndexes_tmp = array(); $rs = $DB->Query(‘SHOW INDEXES FROM `’.$tmp_table.‘`’); while($f = $rs->Fetch()) { $ix =& $arIndexes_tmp[$f[‘Key_name’]]; $column = $f[‘Column_name’].($f[‘Sub_part’] ? ‘(‘.$f[‘Sub_part’].‘)’ : »); if ($ix) $ix .= ‘,’.$column; else $ix = $column; } unset($ix); // unlink the reference foreach($arIndexes_tmp as $name => $ix) { if (!in_array($ix,$arIndexes)) { if ($this->fix_mode) { while($arIndexes[$name]) $name .= ‘_sc’; if (!$DB->Query($sql = ‘CREATE INDEX `’.$name.‘` ON `’.$table.‘` (‘.$ix.‘)’, true)) return $this->Result(false, ‘Mysql Query Error: ‘.$sql.‘ [‘.$DB->db_Error.‘]’); } else { $strError .= GetMessage(‘SC_ERR_NO_INDEX’, array(‘#TABLE#’ => $table, ‘#INDEX#’ => $name.‘ (‘.$ix.‘)’)).»<br>n»; $this->arTestVars[‘iError’]++; $this->arTestVars[‘iErrorAutoFix’]++; $this->arTestVars[‘cntNoIndexes’]++; } } } $DB->Query(‘DROP TABLE `’.$tmp_table.‘`’); } echo $strError; // to log } } if ($i < $cnt) // partial { $this->arTestVars[‘last_value’] = $module; $this->test_percent = floor($i / $cnt * 100); return true; } if ($this->fix_mode) { if ($this->arTestVars[‘iErrorFix’] > 0) return $this->Result(null, GetMessage(‘SC_CHECK_TABLES_STRUCT_ERRORS_FIX’, array( ‘#VAL#’ => intval($this->arTestVars[‘iErrorFix’]), ))); return true; } else { if ($this->arTestVars[‘iError’] > 0) return $this->Result(false, GetMessage(‘SC_CHECK_TABLES_STRUCT_ERRORS’, array( ‘#VAL#’ => intval($this->arTestVars[‘iError’]), ‘#VAL1#’ => intval($this->arTestVars[‘iErrorAutoFix’]), ‘#NO_TABLES#’ => intval($this->arTestVars[‘cntNoTables’]), ‘#NO_FIELDS#’ => intval($this->arTestVars[‘cntNoFields’]), ‘#DIFF_FIELDS#’ => intval($this->arTestVars[‘cntDiffFields’]), ‘#NO_INDEXES#’ => intval($this->arTestVars[‘cntNoIndexes’]), )).($this->arTestVars[‘iErrorAutoFix’] > 0 ? fix_link(3) : »)); return true; } } ############### } function checker_get_unique_id() { $LICENSE_KEY = »; @include($_SERVER[‘DOCUMENT_ROOT’].‘/bitrix/license_key.php’); if ($LICENSE_KEY == ») $LICENSE_KEY = ‘DEMO’; return md5($_SERVER[‘DOCUMENT_ROOT’].filemtime(__FILE__).$LICENSE_KEY); } function getCharsetByCollation($collation) { global $DB; static $CACHE; if (!$c = &$CACHE[$collation]) { $res0 = $DB->Query(‘SHOW COLLATION LIKE «‘ . $collation . ‘»‘); $f0 = $res0->Fetch(); $c = $f0[‘Charset’]; } return $c; } function InitPureDB() { if (!function_exists(‘SendError’)) { function SendError($str) { } } global $DB; /** * Defined in dbconn.php * @var $DBType * @var $DBDebug * @var $DBDebugToFile * @var $DBHost * @var $DBName * @var $DBLogin * @var $DBPassword */ require_once($_SERVERDOCUMENT_ROOT«].»/bitrix/php_interface/dbconn.php«); if(defined(‘BX_UTF’)) define(‘BX_UTF_PCRE_MODIFIER’, ‘u’); else define(‘BX_UTF_PCRE_MODIFIER’, »); require_once($_SERVERDOCUMENT_ROOT«].»/bitrix/modules/main/classes/«.$DBType/database.php«); $DB = new CDatabase; $DB->debug = $DBDebug; $DB->DebugToFile = $DBDebugToFile; if(!($DB->Connect($DBHost, $DBName, $DBLogin, $DBPassword)) || !($DB->DoConnect())) { if(file_exists(($fname = $_SERVERDOCUMENT_ROOT«].»/bitrix/php_interface/dbconn_error.php«))) include($fname); else include($_SERVERDOCUMENT_ROOT«].»/bitrix/modules/main/include/dbconn_error.php«); die(); } if (file_exists($after = $_SERVERDOCUMENT_ROOT«].»/bitrix/php_interface/after_connect.php«)) include_once($after); } function TableFieldConstruct($f0) { global $DB; return $f0[‘Type’].($f0[‘Null’] == ‘YES’ ? ‘ NULL’ : ‘ NOT NULL’).($f0[‘Default’] === NULL ? ($f0[‘Null’] == ‘YES’ ? ‘ DEFAULT NULL ‘ : ») : ‘ DEFAULT «‘ . $DB->ForSQL($f0[‘Default’]) . ‘» ‘); } function TableFieldCanBeAltered($f, $f_tmp) { if ($f[‘Type’] == $f_tmp[‘Type’] || defined(‘SITE_CHECKER_FORCE_REPAIR’) && SITE_CHECKER_FORCE_REPAIR === true) return true; if ( preg_match(‘#^([a-z]+)(([0-9]+))(.*)$#i’,$f[‘Type’],$regs) && preg_match(‘#^([a-z]+)(([0-9]+))(.*)$#i’,$f_tmp[‘Type’],$regs_tmp) && str_ireplace(‘varchar’,‘char’,$regs[1]) == str_ireplace(‘varchar’,‘char’,$regs_tmp[1]) && $regs[2] <= $regs_tmp[2] && $regs[3] == $regs_tmp[3] // signed || unsigned ) return true; return false; } function fix_link($mode = 2) { return ‘ <a href=»javascript:show_popup(» . GetMessage(‘SC_FIX_DATABASE’) . », ‘?fix_mode=’.$mode.», » . GetMessage(‘SC_FIX_DATABASE_CONFIRM’) . »)»>’ . GetMessage(‘SC_FIX’) . ‘</a>’; } ?>

Ошибки при проверке системы в Битрикс

Модули веб-сервера

Ошибка: Загружен модуль mod_dav/mod_dav_fs, WebDav не будет работать
Решение: Удалите файл /etc/httpd/conf.modules.d/00-dav.conf

Размер стека и pcre.recursion_limit

VDS хостинг

  1. В файле /etc/php.d/bitrixenv.ini изменим параметр:
  2. В скрипте запуска сервера HTTP Apache /etc/rc.d/init.d/httpd изменим функцию start(), добавив в нее одну строку ulimit -s unlimited
  3. В итоге должно получиться примерно следующее:

Виртуальный хостинг

Для виртуального хостинга в файле .htaccess

Режим работы MySQL

Вариант 1

  1. Подключиться к серверу под root
  2. Открыть один из файлов (у всех могут быть разные, варианты)
    • /etc/my.cnf
    • /etc/alternatives/my.cnf
    • /etc/bitrix-my.cnf
  3. Добавить строку в блоке # InnoDB parameters

Вариант 2

  1. В файл after_connect.php добавить:
  2. В файл after_connect_d7.php добавить:

Структура базы данных

Ошибка: В таблице b_search_content_stem поле STEM «varchar(50) NOT NULL» не соответствует описанию на диске «int(11) NOT NULL»
Решение: Удалить модуль поиска вместе с таблицами и Заново установить модуль поиска и переиндексировать сайт.

Ошибка: В таблице b_search_content_freq поле STEM «varchar(50) NOT NULL DEFAULT «» » не соответствует описанию на диске «int(11) NOT NULL DEFAULT «0» «
Решение: Удалить модуль поиска вместе с таблицами и Заново установить модуль поиска и переиндексировать сайт.

Ошибка: Структура базы данных: Ошибочный ответ сервера. Не удалось завершить тестирование.
Решение: В файле /bitrix/modules/main/install/mysql/install.sql найти строку:
и заменить на:

Ошибка: В таблице b_user_hit_auth поле TIMESTAMP_X «datetime NULL DEFAULT NULL » не соответствует описанию на диске «timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP»
Решение: Выполнить запрос в Настройки → Инструменты → SQL запрос:

Источник

Здравствуйте у меня проблема при проверки системы. Permission denied: BITRIX SESSID

ERROR не подскажете куда посмотреть? А вообще у меня проблема что сайт отдает форму авторизации вместо сайта. Аксес файл есть, вроде все норм

8 ответов

не так настроили многосайтовость или в корне сайта нет .access.php

значит косяк с многосайтом

в двух словах куда именно посмотреть, а то переносил ажмин который не знает битрикса но переносил с живого

чистите также куки, когда меняете.. а том может быть, что уже исправили, но сессия косячит

да про кукисы видел в инете, чистил

настройки сайтов первым делом dbcon в php_interface может там определяется сайт своим алгоритмом настройки хостинга, наличие симлинков с правильным владельцем

сейчас все провер, но насчет владельцая еще вчера на него думал, не подскажете какой он должен быть

Похожие вопросы

Добрый день Я как-то делал подарочные сертификаты на битриксе, были они сделаны таким образом, что каждый сертификат — это по сути отдельная сущность, ну типа сертификат на 50.

А как можно при помощи регулярного выражения заменить пробел перед цифрой на неразрывный?

Всем привет. Есть немного нетривиальная задачка, второй день ломаю голову. Есть инфоблок с подборками, в элементах которого указывается url страницы с отфильтрованными товар.

в плане? переиспользовать купон не получится

Друзья, как вызвать связанные товары по ID в catalog:section? Сейчас при поиске по сайту перекидывает на страницу с искомым товаром. После этого товара нужно вывести связанны.

Здравствуйте. Что означает @ и точка в ключе, когда делаем выборку?

народ, такой вопрос — можно ли с одного проекта дернуть модуль в другой?Или он к ключу привязывается?

ну всмысле я понимаю откуда и куда дергать модули, дальнейшие действия какие?

а кто нибудь может объяснить в чем прикол битрикса24?Судя по всему там тоже есть интернет магазин но с функционалом CRM?Он как то удобней обычного битрикса?Написан с 0 на друг.

Источник

Проверка системы (check_socket): Fail

Подскажите, пожалуйста, как решить проблему?

Журнал проверки системы
2020-Sep-09 23:23:14 Наличие необходимых модулей php (check_php_modules): Ok
Все необходимые модули установлены
2020-Sep-09 23:23:14 Обязательные параметры PHP (check_php_settings): Ok
Настройки правильные
2020-Sep-09 23:23:14 Модули веб-сервера (check_security): Ok
Конфликтов не выявлено
2020-Sep-09 23:23:14 Значения переменных сервера (check_server_vars): Ok
Корректные
2020-Sep-09 23:23:14 Сохранение сессии (check_session): Ok
50% done
2020-Sep-09 23:23:14 Сохранение сессии (check_session): Ok
Успешно
2020-Sep-09 23:23:14 Параметры настройки UTF (mbstring и константа BX_UTF) (check_mbstring): Ok
Правильные. Сайт работает в UTF кодировке
2020-Sep-09 23:23:14 Служебные скрипты в корне сайта (check_install_scripts): Ok
Отсутствуют
2020-Sep-09 23:23:14 Работа с сокетами (check_socket): Fail
Connection to ssl://bx24.мой домен.pro:443 Success
== Request ==
GET /bitrix/admin/site_checker.php?test_type=socket_test&unique_id=мой id HTTP/1.1
Host: bx.мой домен.pro

== Response ==
HTTP/1.1 200 OK
Server: nginx/1.16.1
Date: Wed, 09 Sep 2020 20:23:14 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 34
Connection: keep-alive
Vary: HTTPS
X-Powered-By: PHP/7.2.28
X-Content-Type-Options: nosniff
X-Frame-Options: SAMEORIGIN

== Body ==
Permission denied: UNIQUE ID ERROR
==========

Источник

check_bitrix_sessid

Параметры функции

Параметр Описание
varname Идентификатор сессии

Возвращаемое значение

Возвращает true, если верно условие $_REQUEST[$varname] == bitrix_sessid() , иначе false.

Примеры использования

Пользовательские комментарии

Мы будем рады, если разработчики добавят свои комментарии по практическому использованию методов системы.

Для этого нужно всего лишь авторизоваться на сайте

Но помните, что Пользовательские комментарии, несмотря на модерацию, не являются официальной документацией. Ответственность за их использование несет сам пользователь.

Также Пользовательские комментарии не являются местом для обсуждения функционала. По подобным вопросам обращайтесь на форумы.

Защита форм, ссылок «Удалить» и других действий, зависящих от прав доступа текущего пользователя

Представим, что на вашем сайте выводится компонент новостей, в котором есть возможность удалить новость. Ссылка на удаление выглядит таким образом:

Далее недоброжелатель помещает эту ссылку в форуме, например, в теге www.mysite.ru/news/detail.php?ID=123&delete=Y »/>. Зайдя на этот форум и будучи авторизованным на сайте www.mysite.ru , вы, ничего неподозревая, удалите новость c идентификатором 123. Т.о. даже несмотря на проверку прав доступа в компоненте, недображелатель сможет удалить новость на вашем сайте. Для защиты от таких атак следует дополнительно проверять идентификатор сессии текущего пользователя, передавая его в ссылке или в скрытом поле формы.
Для этого в продукте есть ряд функций в помощь:

string bitrix_sessid() — возвращает идентификатор сессии, предварительно обработанный функцией md5.
bool check_bitrix_sessid($varname=’sessid’) — возвращает true, если верно условие $_REQUEST[$varname] == bitrix_sessid(), иначе false.
string bitrix_sessid_get($varname=’sessid’) — возвращает строку вида $varname=идентификатор сессии
string bitrix_sessid_post($varname=’sessid’) — возвращает строку вида

Источник

Пользователь 1064429

Если возникает проблема с авторизацией и BITRIX SESSID ERROR

1. Если не используется многосайтовость, а поле «Доменное имя» очищено, то надо удалить куку с точкой в начале. Для этого впишите в любую строку файла dbconn.php следующий код:
setcookie(«PHPSESSID», «», 777, ‘/’, ‘.site.ru’);
где site.ru — имя вашего домена.

2. Если используется многосайтовость или не очищено поле «Доменное имя», то впишите код:
setcookie(«PHPSESSID», «», 777, ‘/’);
строго без имени домена.

Докукин Вячеслав написал:
Дублирование куки PHPSESSID

OnBeforeEventSend — замена данных для макроса в почтовом шаблоне

Что то я долго искал решение, а как оказалось проблема была в том что входные переменные нужно передавать по ссылке!

Если нужно подставить свое значение в макрос (к примеру #AUTHOR#) почтового шаблона, например компонента обратной связи bitrix:main.feedback
то делается это так:

AddEventHandler(‘main’, ‘OnBeforeEventSend’, «OnBeforeEventSendHandler»);
function OnBeforeEventSendHandler(&$arFields, &$arTemplate)
<
global $USER;

if($USER->IsAuthorized())
<
$arFields[«AUTHOR»] = ‘Юзер залогинен: ‘.$USER->GetID().’ (‘.$USER->GetLogin().’) ‘.$USER->GetFullName().’, поле формы: ‘.$arFields[«AUTHOR»];
>else <
$arFields[«AUTHOR»] = ‘Юзер не залогинен, поле формы: ‘.$arFields[«AUTHOR»];
>
>

//отладка отправляемых сообщений с сайта
if (!function_exists(‘custom_mail’))
<
function custom_mail($to, $subject, $body, $headers)
<
$f = fopen($_SERVER[«DOCUMENT_ROOT»] . «/__maillog.txt», «a+»);
fwrite($f, print_r(array(‘TO’ => $to, ‘SUBJECT’ => $subject, ‘BODY’ => $body, ‘HEADERS’ => $headers), 1) . «n========n»);
fclose($f);
return mail($to, $subject, $body, $headers);
>
>

AddEventHandler(‘main’, ‘OnBeforeEventAdd’, «OnBeforeEventAddHandler»);function OnBeforeEventAddHandler(&$event, &$lid, &$arFields, &$messageId, &$files, &$languageId)
<
global $USER;

if($USER->IsAuthorized())
<
$arFields[«AUTHOR»] = ‘Юзер залогинен: ‘.$USER->GetID().’ (‘.$USER->GetLogin().’) ‘.$USER->GetFullName().’, поле формы: ‘.$arFields[«AUTHOR»];
>else <
$arFields[«AUTHOR»] = ‘Юзер не залогинен, поле формы: ‘.$arFields[«AUTHOR»];
>

CEventLog::Add(array(
«SEVERITY» => ‘SECURITY’,
«AUDIT_TYPE_ID» => ‘FEEDBACK_FORM’,
«MODULE_ID» => ‘form’,
«ITEM_ID» => $messageId,
«DESCRIPTION» => ‘Замена данных в отсылаемом письме – ‘.$arFields[«AUTHOR»],
));
>

A cookie associated with a cross-site resource at

Сегодня заметил что сайт клиента в Google chrome Версия 79.0.3945.130 (Официальная сборка), (64 бит) работает не адекватно
— пункты меню не нажимаются
— формы не отправляются при клике на кнопку submit
— js события onchange для select не отрабатывают

в консоли ошибок нет, но было вот такое предупреждение:

Если у кого то такие же проблемы, то нужно зайти в настройки забив такой URL chrome://flags/ и поставить опцию

Cookie Deprecation messages => disabled

после этого все будет работать адекватно.

Сортировка товаров по наличию при вкл. опции «Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара)»

ПРОБЛЕМА:
При установке в настройках модуля торгового каталога, флага «Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара)»,
перестает работать настройка компонента каталога «Источник данных»-Товары, которых нет на складах: «показывать в конце» и «не отображать».

Поиски решения:
Поиски решения были начаты с самого компонента bitrix.catalog который собственно и выводить товары. По логике я ожидал найти в нем ту часть кода которая отвечала бы за выборку (какой то GetList допустим), и которую можно было бы изменить, полностью кастомизировав компонент вынеся его в пространство имен. Но не тут то было. Опять пресловутая «гибкость» сделала свое дело.

Ответ ТП Битрикс: ID 2669755
Выборка происходит в BitrixIblockComponentBase::getSeparateList.
Что касается сортировки в целом, то при включении настройки Разрешить покупку при отсутствии товара (включая разрешение отрицательного количества товара),
недоступных товаров нет в принципе и стандартная сортировка по доступности работать не будет.

РЕШЕНИЕ:
1) добавляем в ИБ товара св-во SORTAVAIL тип число, в него будет записываться сумма «CATALOG_QUANTITY» всех его ТП или в случае если их нет то значение из этого же поля товара (простой товар).
2) Пишем обработчик, на событие обновления элемента каталога «OnProductUpdate» (событие «OnAfterIBlockElementUpdate» не подходит!).
Который после изменения параметров товараего тп, получает товар и все его ТП, и в цикле суммирует все значения «CATALOG_QUANTITY» его ТП.
Если товар простой и у него нет ТП то берет его значение «CATALOG_QUANTITY» и также записывает в св-во SORTAVAIL товара

AddEventHandler(«catalog», «OnProductUpdate», array(«IBlockHandler», «DoOnProductUpdateHandler»));
class IBlockHandler
<
protected static $handlerDisallow = false;

/* проверяем, что обработчик уже запущен */
if (self::$handlerDisallow)
return;
/* взводим флаг запуска */
self::$handlerDisallow = true;

//Updating PRODUCT prop SORTAVAIL
if($arFields[‘IBLOCK_ID’]==IBLOCK_ID_PRODUCTS_OFFERS) < //offer
self::updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, $id);
>elseif ($arFields[‘IBLOCK_ID’]==IBLOCK_ID_PRODUCTS) < //product
self::updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, null, $id);
>

/* вновь разрешаем запускать обработчик */
self::$handlerDisallow = false;

/**
* Update product property SORTAVAIL sort
* @param null $product_id
*/
function updateProductSortAvail($iblock_id, $offer_id=null, $product_id=null)
<
if(CModule::IncludeModule(«iblock») && CModule::IncludeModule(«catalog»))
<
$quantity_summ = 0;

if(!$product_id)
<
$product = CCatalogSku::GetProductInfo($offer_id, $iblock_id);
BitrixMainDiagDebug::writeToFile($product);
$product_id = $product[‘ID’];
>

//If isset offers
if(CCatalogSKU::IsExistOffers($product_id)) <

BitrixMainDiagDebug::writeToFile(‘Product #’ .$product_id.’ isset offers!’);

//Get offers
$obOffersList = CIBlockElement::GetList(
array(),
array(
‘IBLOCK_ID’ => $iblock_id,
«PROPERTY_CML2_LINK» => $product_id,
//’CATALOG_AVAILABLE’ => ‘Y’
),
false,
false,
array(«ID», «CATALOG_QUANTITY»)
);

while ($arOffers = $obOffersList->Fetch()) <
BitrixMainDiagDebug::writeToFile(array(«OFFER_ID»=>$arOffers[‘ID’], «CATALOG_QUANTITY»=>$arOffers[‘CATALOG_QUANTITY’]));
$quantity_summ += $arOffers[‘CATALOG_QUANTITY’];
>

BitrixMainDiagDebug::writeToFile(‘Product #’ .$product_id.’ is not offers!’);

//Get product
$obProductsList = CIBlockElement::GetList(
array(),
array(
‘IBLOCK_ID’ => IBLOCK_ID_PRODUCTS,
«ID» => $product_id,
),
false,
false,
array(«ID», «CATALOG_QUANTITY»)
);

while ($arProduct = $obProductsList->Fetch()) <
BitrixMainDiagDebug::writeToFile(array(«PRODUCT_ID»=>$arProduct[‘ID’], «CATALOG_QUANTITY»=>$arProduct[‘CATALOG_QUANTITY’]));
$quantity_summ += $arProduct[‘CATALOG_QUANTITY’];
>
>

CIBlockElement::SetPropertyValuesEx($product_id, false, array(‘SORTAVAIL’ => $quantity_summ));
BitrixMainDiagDebug::writeToFile([‘PRODUCT_ID’=>$product_id, ‘SORTAVAIL’=> $quantity_summ]);

IBLOCK_ID_PRODUCTS,
‘ACTIVE’ => ‘Y’,
//’=PROPERTY_SORTAVAIL_VALUE’ => false
//’ID’ => 34419 //38774 //простой 34419
);

$obProducts = CIBlockElement::GetList(
array(),
$arFilter,
false,
array(«nTopCount»=>100),
array(«ID», «PROPERTY_SORTAVAIL»)
);
while ($arProduct = $obProducts->Fetch()) <
$product_id = $arProduct[‘ID’];
$IBlockHandler = new IBlockHandler;
$IBlockHandler->updateProductSortAvail(IBLOCK_ID_PRODUCTS_OFFERS, null, $product_id);
>
>
?>

ТП был задан вопрос для чего нас лишили такой необходимой возможности (в крайнем случае, а этот случай именно такой. ) изменять выборку так как нужно клиенту, с просьбой создать обращение в отдел разработки.

Кто что думает по этому поводу отпишитесь плз!

Источник

Понравилась статья? Поделить с друзьями:

Читайте также:

  • Выполнить мечту лексическая ошибка
  • Выполнить клятву лексическая ошибка
  • Выполните проверку жесткого диска на наличие ошибок
  • Выполнив работу качественно мне достойно заплатили исправить ошибки
  • Выполнение команды показать ошибки размещения позволяет

  • 0 0 голоса
    Рейтинг статьи
    Подписаться
    Уведомить о
    guest

    0 комментариев
    Старые
    Новые Популярные
    Межтекстовые Отзывы
    Посмотреть все комментарии