Вход Регистрация
Файл: sys/inc/classes/Install.php
Строк: 238
<?php 

class Install
{
    private 
$config; 
    private 
$errors; 
    private 
$messages; 

    public function 
__construct() 
    {
        
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);
    }

    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";
        if (
function_exists('mcrypt_module_open')) {
            
$td = mcrypt_module_open('rijndael-256', '', 'ofb', '');
            
$salt_cookie_user = base64_encode(mcrypt_create_iv(mcrypt_enc_get_iv_size($td), MCRYPT_DEV_RANDOM));
            
$str .= "define( 'SALT_COOKIE_USER', '" . $salt_cookie_user . "' );rnn";
        } else {
            
$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_aut'] = time(); 
            
$user['date_last'] = time(); 
            
$user['pol'] = 1; 

            if (!
preg_match('/^([A-zА-я0-9-_]+)$/ui', $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 (
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;                 
                }
            }
        }
    }

    public function 
get_value($key, $value) 
    {
        return 
$value; 
    }

    public function 
setup() 
    {
        
$step = 1; 

        
// Права на запись в корневой каталог
        
if (!is_writable(ROOTPATH)) {
            
$this->errors[] = __('Корневой каталог сайта не доступен для записи'); 
        }

        
// Подключена ли база данных 
        
if ($this->is_database()) {
            
$step = 2; 
        }

        
// Регистрация администратора
        
if (defined('DB_CONNECT')) {
            if (
$this->is_administrator()) {
                
$step = 3; 
            }
        }

        if (
$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($step); 

            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($step = 1) 
    {
        
$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' => '', 
            ), 
            array(
                
'title' => __('E-Mail администратора'), 
                
'key' => 'user_email', 
                
'type' => 'text', 
                
'value' => 'localhost', 
            ), 
            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[$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>'
;
    }
}
Онлайн: 2
Реклама