|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* AVE.cms
|
|
|
|
*
|
|
|
|
* @package AVE.cms
|
|
|
|
* @version 3.x
|
|
|
|
* @filesource
|
|
|
|
* @copyright © 2007-2018 AVE.cms, http://www.ave-cms.ru
|
|
|
|
*
|
|
|
|
* @license GPL v.2
|
|
|
|
*/
|
|
|
|
|
|
|
|
@date_default_timezone_set('Europe/Moscow');
|
|
|
|
|
|
|
|
if (! defined('BASE_DIR'))
|
|
|
|
exit;
|
|
|
|
|
|
|
|
//-- Подключаем файл настроек
|
|
|
|
require_once (BASE_DIR . '/inc/config.php');
|
|
|
|
|
|
|
|
if (PHP_DEBUGGING_FILE && ! defined('ACP'))
|
|
|
|
include_once BASE_DIR . '/inc/errors.php';
|
|
|
|
|
|
|
|
//-- Удаление глобальных массивов
|
|
|
|
function unsetGlobals()
|
|
|
|
{
|
|
|
|
if (! ini_get('register_globals'))
|
|
|
|
return;
|
|
|
|
|
|
|
|
$allowed = array(
|
|
|
|
'_ENV' => 1,
|
|
|
|
'_GET' => 1,
|
|
|
|
'_POST' => 1,
|
|
|
|
'_COOKIE' => 1,
|
|
|
|
'_FILES' => 1,
|
|
|
|
'_SERVER' => 1,
|
|
|
|
'_REQUEST' => 1,
|
|
|
|
'GLOBALS' => 1
|
|
|
|
);
|
|
|
|
|
|
|
|
foreach ($GLOBALS as $key => $value)
|
|
|
|
{
|
|
|
|
if (! isset($allowed[$key]))
|
|
|
|
unset($GLOBALS[$key]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
unsetGlobals();
|
|
|
|
|
|
|
|
if (isset($HTTP_POST_VARS))
|
|
|
|
{
|
|
|
|
$_GET = $HTTP_GET_VARS;
|
|
|
|
$_POST = $HTTP_POST_VARS;
|
|
|
|
$_REQUEST = array_merge($_POST, $_GET);
|
|
|
|
$_COOKIE = $HTTP_COOKIE_VARS;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Слешевание (для глобальных массивов)
|
|
|
|
* рекурсивно обрабатывает вложенные массивы
|
|
|
|
*
|
|
|
|
* @param array $array обрабатываемый массив
|
|
|
|
* @return array обработанный массив
|
|
|
|
*/
|
|
|
|
function add_slashes($array = array())
|
|
|
|
{
|
|
|
|
@reset($array);
|
|
|
|
|
|
|
|
foreach ($array AS $_k => $_v)
|
|
|
|
{
|
|
|
|
if (is_string($_v))
|
|
|
|
$array[$_k] = addslashes($_v);
|
|
|
|
elseif (is_array($_v))
|
|
|
|
$array[$_k] = add_slashes($_v);
|
|
|
|
}
|
|
|
|
|
|
|
|
return $array;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
if (! get_magic_quotes_gpc())
|
|
|
|
{
|
|
|
|
$_GET = add_slashes($_GET);
|
|
|
|
$_POST = add_slashes($_POST);
|
|
|
|
$_REQUEST = array_merge($_POST, $_GET);
|
|
|
|
$_COOKIE = add_slashes($_COOKIE);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function isSSL()
|
|
|
|
{
|
|
|
|
if (isset($_SERVER['HTTPS']))
|
|
|
|
{
|
|
|
|
if ('on' == strtolower($_SERVER['HTTPS']))
|
|
|
|
return true;
|
|
|
|
|
|
|
|
if ('1' == $_SERVER['HTTPS'])
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
elseif (isset($_SERVER['SERVER_PORT']) && ('443' == $_SERVER['SERVER_PORT']))
|
|
|
|
{
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function setHost()
|
|
|
|
{
|
|
|
|
if (isset($_SERVER['HTTP_HOST']))
|
|
|
|
{
|
|
|
|
// Все символы $_SERVER['HTTP_HOST'] приводим к строчным и проверяем
|
|
|
|
// на наличие запрещённых символов в соответствии с RFC 952 и RFC 2181.
|
|
|
|
$_SERVER['HTTP_HOST'] = strtolower($_SERVER['HTTP_HOST']);
|
|
|
|
|
|
|
|
if (! preg_match('/^\[?(?:[a-z0-9-:\]_]+\.?)+$/', $_SERVER['HTTP_HOST']))
|
|
|
|
{
|
|
|
|
// $_SERVER['HTTP_HOST'] не соответствует спецификациям.
|
|
|
|
// Возможно попытка взлома, даём отлуп статусом 400.
|
|
|
|
header('HTTP/1.1 400 Bad Request');
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
$_SERVER['HTTP_HOST'] = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
$ssl = isSSL();
|
|
|
|
$schema = ($ssl) ? 'https://' : 'http://';
|
|
|
|
$host = str_replace(':' . $_SERVER['SERVER_PORT'], '', $_SERVER['HTTP_HOST']);
|
|
|
|
$port = ($_SERVER['SERVER_PORT'] == '80' || $_SERVER['SERVER_PORT'] == '443' || $ssl)
|
|
|
|
? ''
|
|
|
|
: ':' . $_SERVER['SERVER_PORT'];
|
|
|
|
|
|
|
|
define('HOST', $schema . $host . $port);
|
|
|
|
|
|
|
|
$abs_path = dirname((!strstr($_SERVER['PHP_SELF'], $_SERVER['SCRIPT_NAME']) && (@php_sapi_name() == 'cgi'))
|
|
|
|
? $_SERVER['PHP_SELF']
|
|
|
|
: $_SERVER['SCRIPT_NAME']);
|
|
|
|
|
|
|
|
if (defined('ACP'))
|
|
|
|
$abs_path = dirname($abs_path);
|
|
|
|
|
|
|
|
define('ABS_PATH', rtrim(str_replace("\\", "/", $abs_path), '/') . '/');
|
|
|
|
}
|
|
|
|
|
|
|
|
setHost();
|
|
|
|
|
|
|
|
set_include_path (get_include_path() . '/' . BASE_DIR . '/lib');
|
|
|
|
|
|
|
|
ini_set ('arg_separator.output', '&');
|
|
|
|
ini_set ('session.cache_limiter', 'none');
|
|
|
|
ini_set ('session.cookie_lifetime', 60*60*24*14);
|
|
|
|
ini_set ('session.gc_maxlifetime', 60*24);
|
|
|
|
ini_set ('session.use_cookies', 1);
|
|
|
|
ini_set ('session.use_only_cookies', 1);
|
|
|
|
ini_set ('session.use_trans_sid', 0);
|
|
|
|
ini_set ('url_rewriter.tags', '');
|
|
|
|
|
|
|
|
if (SESSION_SAVE_HANDLER == 'memcached')
|
|
|
|
{
|
|
|
|
ini_set ('session.lazy_write', 0);
|
|
|
|
ini_set ('session.save_handler', 'memcached');
|
|
|
|
ini_set ('session.save_path', MEMCACHED_SERVER.':'.MEMCACHED_PORT . '?persistent=1&weight=1&timeout=1&retry_interval=15');
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Переключение для нормальной работы с русскими буквами в некоторых функциях
|
|
|
|
mb_internal_encoding("UTF-8");
|
|
|
|
|
|
|
|
//-- Вкл/Выкл отображения ошибок php
|
|
|
|
if (! PHP_DEBUGGING_FILE)
|
|
|
|
{
|
|
|
|
if (! PHP_DEBUGGING)
|
|
|
|
{
|
|
|
|
error_reporting(E_ERROR);
|
|
|
|
ini_set('display_errors', 7);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
error_reporting(E_ALL);
|
|
|
|
ini_set('display_errors', 1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Debug Class
|
|
|
|
require (BASE_DIR . '/class/class.debug.php');
|
|
|
|
$Debug = new Debug;
|
|
|
|
|
|
|
|
//-- Hooks Class
|
|
|
|
require (BASE_DIR . '/class/class.hooks.php');
|
|
|
|
$Hooks = new Hooks;
|
|
|
|
|
|
|
|
//-- Подкючаем необходимые файлы функций
|
|
|
|
require_once (BASE_DIR . '/functions/func.breadcrumbs.php'); // Хлебные крошки
|
|
|
|
require_once (BASE_DIR . '/functions/func.common.php'); // Основные функции
|
|
|
|
require_once (BASE_DIR . '/functions/func.locale.php'); // Языковые функции
|
|
|
|
require_once (BASE_DIR . '/functions/func.documents.php'); // Функции по работе с документами
|
|
|
|
require_once (BASE_DIR . '/functions/func.fields.php'); // Функции по работе с полями
|
|
|
|
require_once (BASE_DIR . '/functions/func.helpers.php'); // Второстепенные функции
|
|
|
|
require_once (BASE_DIR . '/functions/func.hidden.php'); // Парс тега [hide]
|
|
|
|
require_once (BASE_DIR . '/functions/func.login.php'); // Авторизация пользователей
|
|
|
|
require_once (BASE_DIR . '/functions/func.logs.php'); // Системные сообщения
|
|
|
|
require_once (BASE_DIR . '/functions/func.mail.php'); // Отправка писем
|
|
|
|
require_once (BASE_DIR . '/functions/func.navigation.php'); // Функции по работе с меню навигации
|
|
|
|
require_once (BASE_DIR . '/functions/func.pagination.php'); // Постраничная навигация
|
|
|
|
require_once (BASE_DIR . '/functions/func.parserequest.php'); // Функции по работе с запросами
|
|
|
|
require_once (BASE_DIR . '/functions/func.block.php'); // Функции по работе с визуальными блоками
|
|
|
|
require_once (BASE_DIR . '/functions/func.sysblock.php'); // Функции по работе с системными блоками
|
|
|
|
require_once (BASE_DIR . '/functions/func.thumbnails.php'); // Функции по работе с превьюшками изображений
|
|
|
|
require_once (BASE_DIR . '/functions/func.users.php'); // Функции по работе с пользователями
|
|
|
|
require_once (BASE_DIR . '/functions/func.watermarks.php'); // Функции по работе с водными знаками
|
|
|
|
|
|
|
|
//-- Создание папок и файлов
|
|
|
|
foreach (array(ATTACH_DIR, 'cache', 'backup', 'logs', 'session', 'update') as $dir)
|
|
|
|
write_htaccess_deny(BASE_DIR . '/tmp/' . $dir);
|
|
|
|
|
|
|
|
foreach (array('combine', 'module', 'redactor', 'smarty', 'sql', 'tpl') as $dir)
|
|
|
|
write_htaccess_deny(BASE_DIR . '/tmp/cache/' . $dir);
|
|
|
|
|
|
|
|
//-- Шаблоны
|
|
|
|
write_htaccess_deny(BASE_DIR . '/templates/' . DEFAULT_THEME_FOLDER . '/include/');
|
|
|
|
|
|
|
|
global $AVE_DB;
|
|
|
|
|
|
|
|
//-- Класс для работы с MySQL (Global $AVE_DB)
|
|
|
|
require_once (BASE_DIR . '/class/class.database.php');
|
|
|
|
|
|
|
|
//-- Если не существует объекта по работе с БД
|
|
|
|
if (! isset($AVE_DB))
|
|
|
|
{
|
|
|
|
//-- Подключаем конфигурационный файл с параметрами подключения
|
|
|
|
require_once (BASE_DIR . '/config/db.config.php');
|
|
|
|
|
|
|
|
//-- Если параметры не указаны, прерываем работу
|
|
|
|
if (! isset($config))
|
|
|
|
exit;
|
|
|
|
|
|
|
|
//-- Если константа префикса таблиц не задана, принудительно определяем ее на основании параметров в файле db.config.php
|
|
|
|
if (! defined('PREFIX'))
|
|
|
|
define('PREFIX', $config['dbpref']);
|
|
|
|
|
|
|
|
//-- Создаем объект для работы с БД
|
|
|
|
try {
|
|
|
|
$AVE_DB = AVE_DB::getInstance($config)
|
|
|
|
//-- Назначаем кодировку
|
|
|
|
->setCharset('utf8')
|
|
|
|
//-- Назначаем БД
|
|
|
|
->setDatabaseName($config['dbname']);
|
|
|
|
}
|
|
|
|
catch (AVE_DB_Exception $e)
|
|
|
|
{
|
|
|
|
ob_start();
|
|
|
|
header('HTTP/1.1 503 Service Temporarily Unavailable');
|
|
|
|
header('Status: 503 Service Temporarily Unavailable');
|
|
|
|
header('Retry-After: 3600');
|
|
|
|
header('X-Powered-By:');
|
|
|
|
echo $e->getMessage();
|
|
|
|
die;
|
|
|
|
}
|
|
|
|
|
|
|
|
unset ($config);
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Устанавливаем обновления системы
|
|
|
|
if ($AVE_DB)
|
|
|
|
{
|
|
|
|
$updaters = (glob(BASE_DIR . '/tmp/update/*.update.php'));
|
|
|
|
|
|
|
|
if ($updaters)
|
|
|
|
{
|
|
|
|
sort ($updaters);
|
|
|
|
|
|
|
|
foreach ($updaters as $ufile)
|
|
|
|
{
|
|
|
|
@eval(' ?'.'>' . @file_get_contents($ufile) . '<?'.'php ');
|
|
|
|
|
|
|
|
if ($ufile != BASE_DIR . '/tmp/update/debug.update.php')
|
|
|
|
{
|
|
|
|
@unlink($ufile);
|
|
|
|
@reportLog('Установил обновления (' . $ufile . ')');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
set_cookie_domain();
|
|
|
|
|
|
|
|
//-- Работа с сессиями
|
|
|
|
if (! SESSION_SAVE_HANDLER || SESSION_SAVE_HANDLER == 'files')
|
|
|
|
{
|
|
|
|
//-- Класс для работы с сессиями
|
|
|
|
require (BASE_DIR . '/class/class.session.files.php');
|
|
|
|
$ses_class = new AVE_Session();
|
|
|
|
}
|
|
|
|
//-- Работа с сессиями
|
|
|
|
else if (SESSION_SAVE_HANDLER == 'memcached')
|
|
|
|
{
|
|
|
|
//-- Класс для работы с сессиями
|
|
|
|
require (BASE_DIR . '/class/class.session.memcached.php');
|
|
|
|
$ses_class = new AVE_Session_Memcached();
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
//-- Класс для работы с сессиями
|
|
|
|
require (BASE_DIR . '/class/class.session.php');
|
|
|
|
$ses_class = new AVE_Session_DB();
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Изменяем save_handler, используем функции класса
|
|
|
|
session_set_save_handler (
|
|
|
|
array(&$ses_class, '_open'),
|
|
|
|
array(&$ses_class, '_close'),
|
|
|
|
array(&$ses_class, '_read'),
|
|
|
|
array(&$ses_class, '_write'),
|
|
|
|
array(&$ses_class, '_destroy'),
|
|
|
|
array(&$ses_class, '_gc')
|
|
|
|
);
|
|
|
|
|
|
|
|
//-- Страт сессии
|
|
|
|
if (session_status() !== PHP_SESSION_ACTIVE)
|
|
|
|
session_start();
|
|
|
|
|
|
|
|
if (isset($HTTP_SESSION_VARS))
|
|
|
|
$_SESSION = $HTTP_SESSION_VARS;
|
|
|
|
|
|
|
|
|
|
|
|
//-- Logout
|
|
|
|
if (isset($_REQUEST['action']) && $_REQUEST['action'] == 'logout')
|
|
|
|
{
|
|
|
|
user_logout();
|
|
|
|
|
|
|
|
header('Location:' . get_referer_link());
|
|
|
|
exit;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-- Если нет авторизации
|
|
|
|
if (! defined('ACPL') && ! auth_sessions())
|
|
|
|
{
|
|
|
|
if (! auth_cookie())
|
|
|
|
{
|
|
|
|
//-- Чистим данные авторизации в сессии
|
|
|
|
unset($_SESSION['user_id'], $_SESSION['user_pass']);
|
|
|
|
|
|
|
|
//-- Считаем пользователя Гостем
|
|
|
|
$_SESSION['user_group'] = 2;
|
|
|
|
$_SESSION['user_name'] = get_username();
|
|
|
|
|
|
|
|
define('UID', 0);
|
|
|
|
define('UGROUP', 2);
|
|
|
|
define('UNAME', $_SESSION['user_name']);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//-- Запоминаем время последнего визита пользователя
|
|
|
|
if (! empty($_SESSION['user_id']))
|
|
|
|
{
|
|
|
|
$AVE_DB->Query("
|
|
|
|
UPDATE
|
|
|
|
" . PREFIX . "_users
|
|
|
|
SET
|
|
|
|
last_visit = '" . time() . "'
|
|
|
|
WHERE
|
|
|
|
Id = '" . intval($_SESSION['user_id']) . "'
|
|
|
|
");
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Запоминаем язык браузера
|
|
|
|
$browlang = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
|
|
|
|
$browlang = explode('-', $browlang);
|
|
|
|
$browlang = $browlang[0];
|
|
|
|
|
|
|
|
$_SESSION['accept_langs'] = array();
|
|
|
|
|
|
|
|
$sql = $AVE_DB->Query("
|
|
|
|
SELECT
|
|
|
|
# LANGS
|
|
|
|
*
|
|
|
|
FROM
|
|
|
|
" . PREFIX . "_settings_lang
|
|
|
|
WHERE
|
|
|
|
lang_status = '1'
|
|
|
|
ORDER BY
|
|
|
|
lang_default ASC
|
|
|
|
", -1, 'langs', true, '.langs');
|
|
|
|
|
|
|
|
while ($row = $sql->FetchRow())
|
|
|
|
{
|
|
|
|
if (trim($row->lang_key) > '')
|
|
|
|
{
|
|
|
|
$_SESSION['accept_langs'][trim($row->lang_key)] = trim($row->lang_alias_pref);
|
|
|
|
|
|
|
|
if (! @defined('DEFAULT_LANGUAGE') && $row->lang_default == 1)
|
|
|
|
define('DEFAULT_LANGUAGE', trim($row->lang_key));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//-- Язык пользователя
|
|
|
|
$_SESSION['user_language'] = (! empty($_SESSION['user_language'])
|
|
|
|
? $_SESSION['user_language']
|
|
|
|
:(isset($_SESSION['accept_langs'][$browlang])
|
|
|
|
? $browlang
|
|
|
|
: DEFAULT_LANGUAGE));
|
|
|
|
|
|
|
|
define('DATE_FORMAT', get_settings('date_format'));
|
|
|
|
define('TIME_FORMAT', get_settings('time_format'));
|
|
|
|
define('PAGE_NOT_FOUND_ID', (int)get_settings('page_not_found_id'));
|
|
|
|
|
|
|
|
//-- Вывод данных документа без общего шаблона
|
|
|
|
if (isset($_REQUEST['onlycontent']) && 1 == $_REQUEST['onlycontent'])
|
|
|
|
define('ONLYCONTENT', 1);
|
|
|
|
|
|
|
|
//-- Язык системы
|
|
|
|
set_locale();
|
|
|
|
|
|
|
|
//-- Класс Шаблонов SMARTY
|
|
|
|
require (BASE_DIR . '/class/class.template.php');
|
|
|
|
|
|
|
|
//-- Класс пагинации
|
|
|
|
require (BASE_DIR . '/class/class.paginations.php');
|
|
|
|
|
|
|
|
// Класс UTM
|
|
|
|
require (BASE_DIR . '/class/class.utm.php');
|
|
|
|
$AVE_Utm = new UTMCookie;
|
|
|
|
|
|
|
|
$AVE_Utm->save_parameters();
|
|
|
|
|
|
|
|
//-- Класс Модулей
|
|
|
|
require (BASE_DIR . '/class/class.modules.php');
|
|
|
|
$AVE_Module = new AVE_Module;
|
|
|
|
?>
|