Файл: sys/inc/classes/Install.php
Строк: 237
<?php 
class Install
{
    private $config; 
    private $errors; 
    private $messages; 
    private $step; 
    public function __construct() 
    {
        $step = 1; 
        // Права на запись в корневой каталог
        if (!is_writable(ROOTPATH)) {
            $this->errors[] = __('Корневой каталог сайта не доступен для записи'); 
        }
        // Подключена ли база данных 
        if ($this->is_database()) {
            $step = 2; 
        }
        // Регистрация администратора
        if (defined('DB_CONNECT')) {
            if ($this->is_administrator()) {
                $step = 3; 
            }
        }
        $this->step = $step; 
        add_event('ds_install_setup', array($this, 'setup')); 
    }
    public function errors() {
        if (!empty($this->errors) && is_array($this->errors)) {
            foreach($this->errors AS $error) {
                echo '<div class="alert alert-error">' . $error . '</div>';
            }
        }
    }
    public function messages() {
        if (!empty($this->messages) && is_array($this->messages)) {
            foreach($this->messages AS $message) {
                echo '<div class="alert alert-success">' . $message . '</div>';
            }
        }
    }
    public function check_sql_install() 
    {
        $path_sql = ROOTPATH . '/sys/upgrade/db_install'; 
        if (!is_dir($path_sql)) {
            $this->errors[] = __('Папка с SQL файлами не найдена!'); 
            return false; 
        }
        $q = db::query('SHOW TABLES');
        while ($tables = $q->fetch_assoc()) {
            $table = array_values($tables); 
            $_ver_table[$table[0]] = 1;
        }
        $opdirtables = opendir($path_sql);
        $k_sql = 0; 
        $ok_sql = 0; 
        
        while ($filetables = readdir($opdirtables))
        {
            if (preg_match('#.sql$#i',$filetables)) {
                $table_name = preg_replace('#.sql$#i', null, $filetables);
                $sql = SQLParser::getQueriesFromFile($path_sql . '/' . $filetables);
                $continue = false; 
                if (isset($_ver_table[$table_name])) {
                    $continue = true; 
                }
                for ($i = 0; $i < count($sql); $i++)
                {
                    $k_sql++; 
                    if ($continue === false && db::query($sql[$i])) {
                        $ok_sql++; 
                    }
                }
            }
        }
        $this->messages[] = __('Выполнено %s из %s запросов', $ok_sql, $k_sql); 
        closedir($opdirtables);
        /**
        * Удаление файлов обновлений
        */ 
        $dirupdate = ROOTPATH . '/sys/upgrade/update'; 
        if (is_dir($dirupdate)) {
            $updiropen = opendir($dirupdate);
            while ($filebase = readdir($updiropen)) {
                if (preg_match('/update-([0-9]+)_to_([0-9]+).php$/m', $filebase)) {
                    unlink($dirupdate . '/' . $filebase); 
                }
            }
        }
        closedir($updiropen);
    }
    public function get_data_config() 
    {
        $str = "<?phpnn"; 
        $str .= "/*rn* MySQL параметрыrn*/rnn";
        $str .= "/* Имя пользователя базы данных */rn";
        $str .= "define( 'DB_USER', '" . $this->config['dbuser'] . "' );rnn";
        $str .= "/* Имя базы данных */rn";
        $str .= "define( 'DB_NAME', '" . $this->config['dbname'] . "' );rnn";
        $str .= "/* Пароль пользователя базы данных */rn";
        $str .= "define( 'DB_PASSWORD', '" . $this->config['dbpass'] . "' );rnn";
        $str .= "/* Сервер базы данных */rn";
        $str .= "define( 'DB_HOST', '" . $this->config['dbhost'] . "' );rnn";
        $str .= "n/*@#salt#n* Уникальные ключи аутентификацииn*n* Чтобы аннулировать Cookie пользователей, просто измените эти значения!n* Это заставит пользователей пройти авторизацию заново, под своим логином и паролем n*/rnnn";
        $str .= "/* Соль для шифрования Cookie авторизации */rn";
        $str .= "define( 'SALT_COOKIE_USER', '" . base64_encode(passgen()) . "' );rnn";
        $str .= "/* Соль для шифрования полей форм */rn";
        $str .= "define( 'SALT_FORMS_FIELDS', '" . base64_encode(passgen()) . "' );rnn";
        $str .= "/*#salt#@*/"; 
        $str = use_filters('get_data_config', $str); 
        return $str; 
    }
    public function is_database() 
    {
        // Если конфиг создан значит база подключена
        if ( defined('DB_CONNECT') ) {
            return true; 
        }
        if (isset($_POST['step']) && $_POST['step'] == 'database') {
            $this->config = array(
                'dbhost' => $_POST['dbhost'], 
                'dbuser' => $_POST['dbuser'], 
                'dbpass' => $_POST['dbpass'], 
                'dbname' => $_POST['dbname'], 
            ); 
            if (empty($this->config['dbhost'])) $this->config['dbhost'] = 'localhost';
            if (empty($this->config['dbuser'])) $this->errors[] = __('Не указан пользователь базы данных'); 
            if (empty($this->config['dbname'])) $this->errors[] = __('Не указано имя базы данных'); 
            if (!empty($this->errors)) {
                return false; 
            }
            ob_start(); 
            db::connect($this->config['dbhost'], $this->config['dbuser'], $this->config['dbpass'], $this->config['dbname']); 
            if (mysqli_connect_errno()) {
                $this->errors[] = __('Не удалось подключиться к базе данных') . "<br />" . mysqli_connect_error(); 
            } else {
                $this->check_sql_install();
                if (!file_put_contents(ROOTPATH.'/config.php', $this->get_data_config())) {
                    $this->errors[] = __('Не удалось создать конфигурационный файл'); 
                    return false; 
                } else {
                    $set = get_settings();  
                    save_settings($set, $type = 'autoload'); 
                }
                return true;
            }
            ob_clean(); 
        }
        return false; 
    }
    public function is_administrator() 
    {
        $user_admin = db::count("SELECT COUNT(*) FROM user WHERE level = 4 AND group_access = 15"); 
        if ($user_admin) {
            return true; 
        }
        if (isset($_POST['step']) && $_POST['step'] == 'user') {
            $user = array(); 
            $user['nick'] = trim($_POST['user_login']); 
            $user['pass'] = shif(trim($_POST['user_password'])); 
            $user['email'] = trim($_POST['user_email']); 
            $user['level'] = 4; 
            $user['group_access'] = 15; 
            $user['date_reg'] = time(); 
            $user['date_last'] = time(); 
            $user['pol'] = 1; 
            if (!validate_login($user['nick'])) {
                $this->errors[] = __('В нике присутствуют запрещенные символы'); 
            } elseif (db::count("SELECT COUNT(*) FROM `user` WHERE `nick` = '" . my_esc($user['nick']) . "' LIMIT 1")) {
                $this->errors[] = __('Выбранный ник уже занят другим пользователем'); 
            } elseif (strlen2($user['nick']) < 2) {
                $this->errors[] = __('Ник короче 2-х символов');
            } elseif (strlen2($user['nick']) > 32) {
                $this->errors[] = __('Ник длиннее 32-ти символов');
            } elseif (preg_match("/([a-z]+)/ui", $user['nick']) && preg_match("/([а-я]+)/ui", $user['nick'])) {
                $this->errors[] = __('Разрешается использовать символы только русского или только английского алфавита');
            }
            if (!validate_email($user['email'])) {
                $this->errors[] = __('E-Mail указан не верно');
            }
            
            if (strlen2($_POST['user_password']) < 6) {
                $this->errors[] = __('Пароль короче 6-ти символов');
            } elseif (strlen2($_POST['user_password']) > 20) {
                $this->errors[] = __('Пароль длиннее 20-ти символов');
            } elseif ($_POST['user_password'] !== $_POST['user_confirm']) {
                $this->errors[] = __('Пароли не совпадают');
            }
            if (empty($this->errors)) {
                db::insert('user', $user); 
                $user['id'] = db::insert_id(); 
                if (!empty($user['id'])) {
                    $_SESSION['id_user'] = $user['id'];
                    setcookie('id_user', $user['id'], time() + 60 * 60 * 24 * 365);
                    setcookie('pass', cookie_encrypt(trim($_POST['user_password']), $user['id']), time() + 60 * 60 * 24 * 365);    
                    return true;                 
                } else {
                    $this->errors[] = __('Не удалось создать учетную запись администратора');
                }
            }
        }
        return false; 
    }
    public function get_value($key, $value) 
    {
        return $value; 
    }
    public function setup() 
    {
        if ($this->step == 3) {
            echo '<div class="wrap-installed">'; 
            echo '<div class="cms-installed">';
            echo __('Установка завершена!');
            echo '</div>';
            echo '<a class="btn-installed" href="' . get_site_url('/') . '">' . __('Перейти на сайт') . '</a>';
            echo '</div>'; 
        }
        else {
            echo '<form action="?" method="POST">';
            $form = $this->get_form(); 
            if (isset($form['title'])) {
                echo '<div class="title">' . $form['title'] . '</div>';
            }
            $this->messages(); 
            $this->errors(); 
            if (!empty($form['items'])) {
                echo '<div class="form-group">';
                foreach($form['items'] AS $input)
                {
                    if (!isset($input['type']))
                        $input['type'] = 'text';  
                    if (!isset($input['value']))
                        $input['value'] = '';  
                    $input['value'] = $this->get_value($input['key'], $input['value']);  
                    if (isset($input['title']) && $input['title']) {
                        echo '<div class="form-title">'  .$input['title'] . '</div>'; 
                    }
                    if (preg_match('/^(text|hidden|password|email|tel)$/', $input['type'])) {
                        echo '<div class="form-input form-type-' . $input['type'] . '"><input type="'  .$input['type'] . '" name="'  . $input['key'] . '" value="' . $input['value'] . '" /></div>'; 
                    }
                    if (isset($input['description']) && $input['description']) {
                        echo '<div class="form-description">'  .$input['description'] . '</div>'; 
                    }
                }
                
                echo '<div class="form-buttons"><button class="btn btn-next" type="submit">' . $form['submit'] . '</button></div>';
                echo '</div>';             
            }
            echo '</form>';            
        }
    }
    public function get_form() 
    {
        $inputs[1]['title'] = __('Заполните информацию о подключении к базе данных, если у вас возникли трудности на этом этапе, обратитесь к вашему хостинг-провайдеру.'); 
        $inputs[1]['submit'] = __('Продолжить'); 
        $inputs[1]['items'] = array(
            array(
                'title' => __('Имя базы данных'), 
                'key' => 'dbname', 
                'description' => __('Укажите название базы данных'), 
            ), 
            array(
                'title' => __('Имя пользователя'), 
                'key' => 'dbuser', 
            ), 
            array(
                'title' => __('Пароль'), 
                'key' => 'dbpass', 
                'type' => 'password', 
            ), 
            array(
                'title' => __('Сервер базы данных'), 
                'key' => 'dbhost', 
                'value' => 'localhost', 
            ), 
            array(
                'key' => 'step', 
                'type' => 'hidden', 
                'value' => 'database', 
            ), 
        ); 
        $inputs[2]['title'] = __('Регистрация администратора'); 
        $inputs[2]['submit'] = __('Зарегистрироваться'); 
        $inputs[2]['items'] = array(
            array(
                'title' => __('Логин'), 
                'key' => 'user_login', 
                'type' => 'text', 
                'value' => 'Admin', 
            ), 
            array(
                'title' => __('E-Mail администратора'), 
                'key' => 'user_email', 
                'type' => 'text', 
                'value' => '', 
            ), 
            array(
                'title' => __('Пароль'), 
                'key' => 'user_password', 
                'type' => 'password', 
                'value' => '', 
            ), 
            array(
                'title' => __('Подтвердите пароль'), 
                'key' => 'user_confirm', 
                'type' => 'password', 
                'value' => '', 
            ), 
            array(
                'key' => 'step', 
                'type' => 'hidden', 
                'value' => 'user', 
            ), 
        ); 
        return $inputs[$this->step]; 
    }
    public function get_header() 
    {
        /*echo '<?xml version="1.0" encoding="utf-8"?>';*/
        echo '<!DOCTYPE html>
            <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
            <head>    
            <meta charset="UTF-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <meta name="viewport" content="width=device-width, initial-scale=1">
            <title>' . __('Установка CMS-Social') . '</title>
            <link rel="stylesheet" href="' . get_site_url('/sys/static/css/install.css') . '" type="text/css" />
            <link rel="shortcut icon" href="' . get_site_url('/sys/static/images/favicon.ico') . '" />
            <script id="jquery" type="text/javascript" src="https://code.jquery.com/jquery-1.12.4.js"></script>
            </head><body><div class="document">'; 
        echo '<div class="logo"><a href="https://cms-social.ru" target="_blank"><img src="' . get_site_url('/sys/static/images/logo.png') . '" alt="Logo" /></a></div>';
    }
    public function get_footer() 
    { 
        echo '</div><footer>
            ' . __('Генерация страницы: %sсек.', get_page_gen($per = 3)) . '
            </footer></body></html>';
    }
}