Файл: install/index.php
Строк: 391
<?php
    $start = microtime(true);
    $btn_clickable = true;
    define('H', $_SERVER['DOCUMENT_ROOT'] . '/');
    if (file_exists(H . 'engine/files/data/settings.ini')){
        // exit('Движок уже установлен');
    }
    function show_error($err)
    {
        if (is_array($err)){
            foreach ($err as $value){
                echo '<div class="err">' . $value . '</div>';
            }
        }
        else{
            echo '<div class="err">' . $err . '</div>';
        }
    }
    function save_settings($set)
    {
        include_once H . 'engine/classes/Ini.php';
        $ini = new ini(H . 'engine/files/data/settings.ini');
        foreach ($set as $key => $value){
            $ini->write($key, '"' . $value . '"');
        }
        return $ini->updateFile();
    }
    // рекурсивное удаление папки
    function delete_dir($dir)
    {
        if (is_dir($dir)){
            $od = opendir($dir);
            while ($rd = readdir($od)) {
                if ($rd == '.' || $rd == '..'){
                    continue;
                }
                if (is_dir("$dir/$rd")){
                    @chmod("$dir/$rd", 0777);
                    delete_dir("$dir/$rd");
                }
                else{
                    @chmod("$dir/$rd", 0777);
                    @unlink("$dir/$rd");
                }
            }
            closedir($od);
            @chmod("$dir", 0777);
            return @rmdir("$dir");
        }
        else{
            @chmod("$dir", 0777);
            @unlink("$dir");
        }
    }
    ob_start();
    session_start();
    header("Content-type: text/html");
?>
<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="ru">
<head>
    <title>Установка</title>
    <link rel="stylesheet" href="/style/themes/default/style.css" type="text/css"/>
    <link rel="icon" type="image/png" href="/favicon.ico"/>
</head>
<body>
<div class="title">
    Установка SecWind
</div>
<div class="news">
<?php
    if (!isset($_SESSION['install_step']) || $_SESSION['install_step'] < 0 && $_SESSION['install_step'] > 7){
        $_SESSION['install_step'] = 0;
    }
//if (isset($_GET['step']))
    //$_SESSION['install_step']++;
    $_SESSION['install_step'] = isset($_GET['step']) ? ($_GET['step'] > 7 ? 7 : $_GET['step']) :$_SESSION['install_step'];
    switch ($_SESSION['install_step'])
    {
    case 0:
        ?>
        <img src="/style/sw.png" style="float:left;padding-right: 5px;"/>
            Уставнока SecWind<br/>
        <br/>
        Автор: Patsifist <br/>
        <hr/>
        Спасибо за модули:
        <ul>
            <li>Screamer - Библиотека</li>
            <li>FlySelf - Загруз центр</li>
            <li>seg0ro - Форум</li>
            <li>FoXxs - Дневники</li>
        </ul>
        <hr/>
        Спасибо за переводы:
        <ul>
            <li>no0k - Украинский, английский</li>
            <li>Bek-Z - Казахский</li>
        </ul>
        <?php
        break;
    case 1:
        $last_version = @json_decode(file_get_contents('http://secwind.ru/?act=get_last_version'), true);
        $my_version = parse_ini_file(H . 'engine/files/data/for_settings.ini');
        if (empty($last_version) || (function_exists('json_last_error') && json_last_error())){
            echo 'Возможно вы не используете последнюю версию<br />';
        }
        else{
            echo (version_compare($last_version['last_version'],
                                  $my_version['version']) == 0 ? 'У вас установлена последняя версия' : 'Последняя: <a href="' . $last_version['link_update'] . '">' . $last_version['last_version'] . ' ' . $last_version['status'] . '</a>') . '<br />
                Дата выхода: ' . date('H:i, j F', $last_version['time_release']) . '<br />
                Список изменений в версии ' . $last_version['last_version'] . ': <br /> ' . nl2br($last_version['changelog']) . '<hr />';
        }
        echo file_get_contents(H . 'engine/files/data/agreement.txt');
        break;
    case 2:
        include H . 'engine/includes/testing.php';
        include H . 'engine/includes/chmod_test.php';
        if (isset($err)){
            show_error($err);
            $btn_clickable = false;
        }
        break;
    case 3:
        $btn_clickable = false;
        if (isset($_POST['host'], $_POST['user'], $_POST['pass'], $_POST['db'])){
            $db = @mysqli_connect($_POST['host'], $_POST['user'], $_POST['pass'], $_POST['db']);
            if (!$db){
                $err = 'Невозможно подключиться к серверу ' . htmlspecialchars(mysqli_connect_error());
            }
            else{
                $_SESSION['db'] = $_POST['db'];
                $_SESSION['host'] = $_POST['host'];
                $_SESSION['user'] = $_POST['user'];
                $_SESSION['pass'] = $_POST['pass'];
                mysqli_query($db, 'SET names utf8');
                mysqli_multi_query($db, file_get_contents(H . 'engine/files/data/table.sql'));
                echo '<div class="msg">Подключение к базе данных успешно выполнено</div>';
                $btn_clickable = true;
            }
        }
        if (isset($err)){
            show_error($err);
        }
        ?>
        <form method="post" <?= $btn_clickable ? 'style="display:none"' : '' ?>>
            Хост:<br/>
            <input name="host"
                   value="<?= $_SERVER['REMOTE_ADDR'] == '127.0.0.1' ? 'localhost' : $_SERVER['SERVER_NAME'] ?>"
                   type="text"/><br/>
            Пользователь:<br/>
            <input name="user" value="root" type="text"/><br/>
            Пароль:<br/>
            <input name="pass" value="" type="text"/><br/>
            Имя базы:<br/>
            <input name="db" value="<?= $_SERVER['SERVER_NAME'] ?>" type="text"/><br/>
            <input type="submit" value="Соединить с базой"/>
        </form>
        <?php
        break;
    case 4:
    $btn_clickable = false;
    $db = mysqli_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['pass'], $_SESSION['db']);
    mysqli_query($db, 'SET names utf8');
    if (isset($_POST['reg']))
    {
    if (empty($_POST['nick'])){
        $err[] = 'Введите ник';
    }
    elseif (!preg_match("#^([A-zА-я0-9-_ ])+$#ui", $_POST['nick'])){
        $err[] = 'В нике присутствуют запрещенные символы';
    }
    else{
        $nickLen = mb_strlen($_POST['nick']);
        if ($nickLen < 3){
            $err[] = 'Ник короче 3-х символов';
        }
        elseif ($nickLen > 16){
            $err[] = 'Ник длиннее 16-ти символов';
        }
        elseif (@mysqli_num_rows(mysqli_query($db,
                                              "SELECT COUNT(*) FROM `user` WHERE `nick` = '" . mysqli_real_escape_string($db,
                                                                                                                         $_POST['nick']) . "' LIMIT 1")) > 1
        ){
            $err[] = 'Выбранный ник уже занят другим пользователем';
        }
        else{
            $nick = $_POST['nick'];
        }
    }
    if (empty($_POST['password'])){
        $err[] = 'Введите пароль';
    }
    else{
        $pass_Len = mb_strlen($_POST['password']);
        if ($pass_Len < 6){
            $err[] = 'Пароль короче 6-ти символов';
        }
        elseif ($pass_Len > 16){
            $err[] = 'Пароль длиннее 16-ти символов';
        }
        elseif (empty($_POST['password_retry'])){
            $err[] = 'Введите подтверждение пароля';
        }
        elseif ($_POST['password'] !== $_POST['password_retry']){
            $err[] = 'Пароли не совпадают';
        }
        else{
            $password = $_POST['password'];
        }
    }
    $pol = $_POST['pol'] == 0 ? 0 : 1;
    if (!isset($err))
    {
    $status = mysqli_fetch_assoc(mysqli_query($db, 'SHOW TABLE STATUS LIKE "user"'));
    $password = md5($status['Auto_increment'] . $password);
    mysqli_query($db, "
                INSERT INTO `user`
                (`nick`, `pass`, `date_reg`, `date_aut`, `date_last`, `pol`, `group_access`, `balls`) VALUES
                ('" . $nick . "', '" . $password . "', '" . time() . "', '" . time() . "', '" . time() . "', '" . $pol . "', '10', '82366622244044')");
    echo mysqli_error($db);
    $user = mysqli_fetch_assoc(mysqli_query($db, "SELECT `id` FROM `user` WHERE `nick` = '$nick' LIMIT 1"));
    $_SESSION['user_id'] = $user['id'];
    setcookie('user_id', $user['id'], time() + 60 * 60 * 24 * 365, '/');
    setcookie('pass', $password, time() + 60 * 60 * 24 * 365, '/');
    echo '<div class="msg">Регистрация администратора прошла успешно</div>';
    if (isset($msg)){
        echo '<div class="msg">' . $value . '</div>';
    }
?>
<h3>После установки обязательно удалите папку /install/<h3/>
    <?
        $btn_clickable = true;
        }
        if (isset($err)){
            foreach ($err as $err){
                echo '<div class="err">' . $err . '</div>';
            }
            ?>
            <form>
                <input value="Повторить" type="submit"/>
            </form>
        <?
        }
        }
        else{
            ?>
            <form method='post'>
                Логин (3-16 символов):<br/>
                <input type='text' name='nick' value="admin" maxlength="16"/><br/>
                Пароль (6-16 символов):<br/>
                <input type='password' name='password' maxlength='16'/><br/>
                Подтверждение пароля:<br/>
                <input type='password' name='password_retry' maxlength='16'/><br/>
                Ваш пол:<br/>
                <select name='pol'>
                    <option value='1' selected='selected'>Мужской</option>
                    <option value='0'>Женский</option>
                </select><br/>
                * Все поля обязательны к заполнению<br/>
                <input type='submit' name='reg' value='Регистрация'/><br/>
            </form>
        <?
        }
        break;
        case 5:
            
            if (isset($_POST['ok'])){
                if (empty($_POST['modules'])){
                    show_error('Не выбраны модули для установки');
                }
                else{
                    $_SESSION['modules'] = $_POST['modules'];
                    $_SESSION['modules_list'] = count($_POST['modules']);
                    $_SESSION['modules_installed'] = 0;
                    echo '<div class="msg">Нажмите далее для установки модулей</div>';
                }
            }
            else{
                save_settings(array_merge(
                              parse_ini_file(H . 'engine/files/data/for_settings.ini'),
                              array(
                                  'title' => ucfirst($_SERVER['HTTP_HOST']),
                                  'mysql_host' => $_SESSION['host'],
                                  'mysql_user' => $_SESSION['user'],
                                  'mysql_pass' => $_SESSION['pass'],
                                  'mysql_db_name' => $_SESSION['db'])));
            
            $config = array('date_create' => time(), 'author_info' => array('name' => 'Patsifist', 'icq' => 1314191, 'email' => 'Tadochi@spaces.ru'), 'support' => 'SecWind.ru');
            file_put_contents(H . 'engine/files/data/secwind.db', serialize($config));
            unlink(H . 'engine/files/data/for_settings.ini');
            unlink(H . 'engine/files/data/table.sql');
                $modules = opendir(H . 'engine/files/modules/configs/');
                $btn_clickable = false;
                echo '<div class="menu_razd">Выберите модуль, который хотели бы установить</div><form method="post">';
                while ($modul = readdir($modules)) {
                    if ($modul == '.' || $modul == '..'){
                        continue;
                    }
                    $name = pathinfo($modul, PATHINFO_FILENAME);
                    $module = array_map('htmlspecialchars',
                                        parse_ini_file(H . 'engine/files/modules/configs/' . $name . '.app'));
                    echo '
                <div class="link"><label>
                <input type="checkbox" name="modules[]" value="' . $name . '"/> ' . (!empty($module['module_runame']) ? $module['module_runame'] : $module['module_name']) . '' . (!empty($module['module_version']) ? '<span class="status" style="float:right;font-size:smaller">' . $module['module_version'] . '</span>' : '') . (!empty($module['module_desc']) ? '<br />' . nl2br($module['module_desc']) : '') . '</label></div>';
                }
                echo '<input type="submit" name="ok" value="Выбрать"/></form>';
            }
            break;
        case 6:
            $btn_clickable = false;
            if (isset($_POST['answer'])){
                if ($_POST['answer'] == 'Принять'){
                    $module_file = $_POST['module'];
                    $module = array_map('htmlspecialchars',
                                        parse_ini_file(H . 'engine/files/modules/configs/' . $module_file . '.app'));
                    $db = mysqli_connect($_SESSION['host'], $_SESSION['user'], $_SESSION['pass'], $_SESSION['db']);
                    mysqli_query($db, 'SET names utf8');
                    $dir_install = empty($module['dir_install']) ? H : H . $module['dir_install'] . '/';
                    $dir_pre_install = empty($module['dir_install']) ? H . 'engine/files/tmp/' : H . 'engine/files/tmp/' . $module['dir_install'] . '/';
                    $ftp_dir_ins = str_replace(H, '', $dir_install);
                    $ftp_dir_pre = str_replace(H, '', $dir_pre_install);
                    if (!is_dir($dir_install) && !mkdir($dir_install))
                    {
                        show_error('Возникла проблема с папкой для установки');
                    }
                    else
                    {
                        include_once H . 'engine/classes/Pclzip.php';
                        $zip = new Pclzip(H . 'engine/files/modules/archives/' .$module_file . '.zip');
                        
                        foreach ($zip->listContent() as $item)
                        {
                            if ($item['folder'] == 0)
                            {
                                continue;
                            }
                            if (!is_dir(H . $item['filename']))
                            mkdir(H . $item['filename'], 0777);// var_dump($item);
                        }
                        
                        $zip->extract(PCLZIP_OPT_SUBSTITUE_FILE, H);
                        show_error('Модуль "'.$module['module_name'].'" установлен');
                        if (!empty($module['file_sql'])){
                            mysqli_multi_query($db, file_get_contents($dir_install . $module['file_sql']));
                            show_error('Сделаны запросы из файла ' . $module['file_sql']);
                            unlink($dir_install . $module['file_sql']);
                        }
                        if (!empty($module['dir_chmod'])){
                            $dirs = explode(' ', $module['dir_chmod']);
                            foreach ($dirs as $dir){
                                chmod(H . $dir, 0777);
                            }
                            show_error('Выставлены права доступа 777 на необходимые папки');
                        }
                        mysqli_query($db, "INSERT INTO `modules` SET
                    `name` = '" . mysqli_real_escape_string($db, $module['module_name']) . "',
                    `ru_name` = '" . (!empty($module['module_runame']) ? mysqli_real_escape_string($db, $module['module_runame']) : '') . "',
                    `desc` = '" . (!empty($module['module_desc']) ? mysqli_real_escape_string($db, $module['module_desc']) : '') . "',
                    `version` = '" . (!empty($module['module_version']) && is_numeric($module['module_version']) ? $module['module_version'] : '') . "',
                    `uninstaller` = '" . (!empty($module['file_uninstaller']) ? mysqli_real_escape_string($db, $module['file_uninstaller']) : '') . "',
                    `author_name` = '" . mysqli_real_escape_string($db, $module['author_name']) . "',
                    `author_e-mail` = '" . (!empty($module['author_e-mail']) ?mysqli_real_escape_string($db, $module['author_e-mail']) : '') . "',
                    `author_icq` = '" . (!empty($module['author_icq']) ? intval($module['author_icq']) : '') . "',
                    `author_wmid` = '" . (!empty($module['author_wmid']) ? intval($module['author_wmid']) : '') . "'");
                        //unlink(H . 'engine/files/modules/configs/' .$module_file . '.app');
                        //unlink(H . 'engine/files/modules/archives/' . $module_file . '.zip');
                        /*if (file_exists(H . 'style/icons/modules/' .$module['module_name'] . '.png'))
                        {
                            Rename(H . 'style/icons/modules/' . $module['module_name'] . '.png',
                                   H . 'style/icons/modules/' . $module['module_name'] . '.png');
                        }*/
                    }
                }
                if (!$_SESSION['modules'])
                {
                    $btn_clickable = true;
                    echo '<div class="menu_razd">Установка закончена, нажмите "Далее" для завершения</div>';
                }
                else
                {
                    echo '<a class="link" href="?">Установить следующий модуль</a>';
                }
            }
            else{
                if (!empty($_SESSION['modules']))
                {
                    $module_file = array_shift($_SESSION['modules']);
                    $module = array_map('htmlspecialchars', parse_ini_file(H . 'engine/files/modules/configs/' . $module_file . '.app'));
                    echo '<div class="post">
                            <img src="/style/icons/modules/' . (file_exists(H . 'style/icons/modules/' . $module['module_name'] . '.png') ? $module['module_name'] : '0') . '.png"/> ' . (!empty($module['module_runame']) ? $module['module_runame'] . ' (' . $module['module_name'] . ')' : $module['module_name']) . '<br />
                            <span class="status">Автор:</span> ' . $module['author_name'] . '<br />' . (!empty($module['module_version']) ? '<span class="status">Версия:</span> ' . $module['module_version'] . '<br />' : '') . (!empty($module['module_desc']) ? nl2br($module['module_desc']) . '<br />' : '') . '<textarea>' . (!empty($module['agreement']) ? $module['agreement'] : 'Устанавливая модуль "' . $module['module_name'] . '", Вы принимаете условия использования модуля.') . '</textarea><br />' . '<form method="post">
                                <input type="hidden" name="module" value="' . $module_file . '"/>
                                <input type="submit" name="answer" value="Отказаться"/>
                                 <input type="submit" name="answer" value="Принять"/>
                            </form>
                            </div>';
                }
                else
                {
                    $btn_clickable = true;
                    show_error('Этап пропущен. Вы не выбрали ни одного модуля, Вы можете установить модули в люое время, через админку');
                }
            }
            break;
            case 7:
                mkdir(H.'engine/files/tmp/', 0777);
                mkdir(H.'engine/files/backup/files/',0777);
                mkdir(H.'engine/files/backup/mysql/',0777);
                mkdir(H.'engine/files/users/cache/',0777);
                if ($_SERVER['SERVER_ADDR'] != '127.0.0.1'){
                delete_dir(H . 'install/');
                }
                header('Location: /');
                exit;
            break;
        }
    ?>
    <form>
        <input name='step' value='<?= $_SESSION['install_step'] + 1 ?>' type='hidden'/>
        <input value='Далее' type='submit'<?= !$btn_clickable ? ' style="display:none"' : '' ?>/>
    </form>
</div>
<!-- Div "main_menu" -->
<div class='foot'>
    Генерация: <?= round(microtime(1) - $start, 4) ?> сек<br/>
</div>
</body>
</html>