/**
 * Подключает группу системных плагинов.
 * @param  $group группа
 * @param string $function подгруппа(если есть)
 * @param bool $return возвратить имена файлов плагинов вместо их автоматического подключения
 * @param bool $return_full возвращать вместо имен файлов массив с полной информацией по плагинам
 * @return array
 */
function SystemPluginsIncludeGroup($group, $function = '', $return = false, $return_full = false)
{
    global $config;
    $result = array();
    // Поиск плагинов
    $group_dir = System::config('sys_plug_dir') . $group;
    if (!is_dir($group_dir)) {
        return array();
    }
    $plugins = GetFolders($group_dir . '/');
    // Подготавливаем результат
    foreach ($plugins as $plugin) {
        if ($function != '') {
            $plugin_name = RealPath2($group_dir . '/' . $plugin . '/' . $function) . '/';
        } else {
            $plugin_name = RealPath2($group_dir . '/' . $plugin) . '/';
        }
        global $include_plugin_path;
        // эта переменная будет доступна из плагина
        $include_plugin_path = $plugin_name;
        if ($return) {
            $result[] = $include_plugin_path;
        } else {
            include $include_plugin_path . 'index.php';
        }
    }
    return $result;
}
/**
 * Добавляет строку таблицы для выбора и загрузки изображения
 * @param $Title
 * @param $LoadTitle
 * @param $FileName
 * @param $Dir
 * @param string $Name
 * @param string $LoadName
 * @param string $FormName
 * @return void
 */
function AdminImageControl($Title, $LoadTitle, $FileName, $Dir, $Name = 'image', $LoadName = 'up_image', $FormName = 'edit_form')
{
    $max_file_size = ini_get('upload_max_filesize');
    $images_data = array();
    $Dir = RealPath2($Dir) . '/';
    $images = array();
    $images = GetFiles($Dir, false, true, '.gif.png.jpeg.jpg');
    $images[-1] = 'no_image/no_image.png';
    System::admin()->DataAdd($images_data, $images[-1], 'Нет картинки', $FileName == '');
    $selindex = -1;
    for ($i = 0, $c = count($images) - 1; $i < $c; $i++) {
        if ($FileName == $images[$i]) {
            $sel = true;
            $selindex = $i;
        } else {
            $sel = false;
        }
        System::admin()->DataAdd($images_data, $images[$i], $images[$i], $sel);
    }
    $select = System::admin()->Select($Name, $images_data, false, 'onchange="document.' . $FormName . '.iconview.src=\'' . $Dir . '\'+document.' . $FormName . '.' . $Name . '.value;"');
    $ctrl = <<<HTML
<table cellspacing="0" cellpadding="0" border="0" width="100%">
\t<tr>
\t\t<td valign="top" style="border-bottom:none;">{$select}</td>
\t</tr>
\t<tr>
\t\t<td style="border-bottom:none; padding-top: 5px;" width="100%" align="left"><img height="80" id="iconview" src="{$Dir}{$images[$selindex]}"></td>
\t</tr>
</table>
HTML;
    System::admin()->FormRow($Title, $ctrl);
    System::admin()->FormRow($LoadTitle, System::admin()->FFile($LoadName) . '<br /><small>Формат изображений только *.jpg,*.jpeg,*.gif,*.png</small><br /><small>Максимальный размер файла: ' . $max_file_size . '</small>');
}
/**
 * Парсер смайликов.
 * @param  $text
 * @return void
 */
function SmiliesReplace(&$text)
{
    static $codes = null;
    if (!isset($codes)) {
        $codes = array();
        $smilies_dir = System::config('general/smilies_dir');
        $smilies = System::database()->Select('smilies');
        // Пусть отключенные смайлики тоже парсятся
        foreach ($smilies as $smile) {
            $sub_codes = explode(',', $smile['code']);
            $smile_file = SafeDB($smile['file'], 255, str);
            if ($smile['desc'] != '') {
                $title = SafeDB($smile['desc'], 255, str);
            } else {
                $title = SafeDB(GetFileName($smile_file, true), 255, str);
            }
            foreach ($sub_codes as $code) {
                $code = trim($code);
                if ($code != '') {
                    $codes[$code] = '<img src="' . RealPath2($smilies_dir . $smile_file) . '" title="' . $title . '">';
                }
            }
        }
    }
    $text = strtr($text, $codes);
}
 public function Page($page = '')
 {
     global $config;
     if ($page != '' && file_exists($config['s_mod_dir'] . RealPath2($page) . '/index.php')) {
         include $config['s_mod_dir'] . RealPath2($page) . '/index.php';
     } else {
         include $config['s_mod_dir'] . 'main/index.php';
     }
     $this->SEcho();
 }
/**
 * Подключение библиотеки из папки lib. Принимает произвольное количество параметров или массив.
 * @param $FileName1 Имя папки библиотеки в папке Lib (base/lib/ по умолчанию), функция подключает lib.php файл)
 * @param string $FileName2
 * @param string $FileName3
 * @return void
 */
function UseLib($FileName1, $FileName2 = '', $FileName3 = '')
{
    $args = func_get_args();
    if (is_array($args[0])) {
        $args = $args[0];
    }
    foreach ($args as $path) {
        include_once RealPath2(System::config('lib_dir') . $path . '/lib.php');
    }
}
 /**
  * Выводит данные каталога.
  * @param type $cat_id
  */
 public function ShowCats($cat_id)
 {
     $vars = array();
     $cats = $this->GetChildTree($cat_id);
     $c = count($cats);
     if ($c > 0) {
         System::site()->AddTemplatedBox('', $this->catTemplate);
         System::site()->AddBlock('cats', true, true, 'cat');
         for ($i = 0; $i < $c; $i++) {
             $id = SafeDB($cats[$i]['id'], 11, int);
             $vars['url'] = Ufu('index.php?name=' . $this->moduleName . '&' . $this->id_par_name . '=' . $id, $this->moduleName . '/{' . $this->id_par_name . '}/');
             $vars['title2'] = SafeDB($cats[$i]['title'], 255, str);
             $vars['title'] = '<a href="' . $vars['url'] . '">' . $vars['title2'] . '</a>';
             if (file_exists($cats[$i]['icon'])) {
                 $vars['icon_url'] = SafeDB(RealPath2($cats[$i]['icon']), 255, str);
             } else {
                 $vars['icon_url'] = 'images/cat.gif';
             }
             $vars['icon'] = '<img border="0" src="' . $vars['icon_url'] . '" />';
             $vars['description'] = $cats[$i]['description'];
             $counters = $this->GetCountersRecursive($id);
             $vars['count'] = $counters['files'];
             $vars['cat_count'] = $counters['cats'];
             // Выодим подкатегории
             $childs = '';
             $sub = '';
             if (isset($cats[$i][TREE_CHILD_ID])) {
                 for ($j = 0, $k = count($cats[$i][TREE_CHILD_ID]); $j < $k; $j++) {
                     $child_id = SafeDB($cats[$i][TREE_CHILD_ID][$j]['id'], 11, int);
                     $child_counters = $this->GetCountersRecursive($child_id);
                     $link = Ufu('index.php?name=' . $this->moduleName . '&' . $this->id_par_name . '=' . $child_id, $this->moduleName . '/{' . $this->id_par_name . '}/');
                     $sub .= '<a href="' . $link . '">' . $cats[$i][TREE_CHILD_ID][$j]['title'] . '</a>' . '&nbsp;(' . $child_counters['files'] . '), ';
                 }
                 $childs .= substr($sub, 0, -2) . '.';
             }
             $vars['childs_cats'] = $childs;
             System::site()->AddSubBlock('cats', true, $vars);
         }
         if ($cat_id == 0 && function_exists($this->NumItems)) {
             $text = '<br>' . $this->NumItemsCaption . call_user_func($this->NumItems);
         } else {
             $text = '';
         }
         System::site()->AddBlock('cat_caption', true, false, '', '', $text);
     } elseif ($cat_id == 0) {
         System::site()->AddTextBox('', '<p align="center">Категорий пока нет.</p>');
     }
 }
/**
 * ‘ункци¤ автоматически подключает скрипты из папки script к странице. ѕринимает произвольное количество параметров или массив.
 * @param $FileName1 »м¤ папки скрипта в папке со скриптами (через ? можно передавать параметры как в URL, они запишутс¤ в локальную переменную $params)
 *                   ƒва одинаковых FileName с одинаковыми параметрами не выполн¤ютс¤.
 * @param string $FileName2
 * @param string $FileName3
 * @return mixed
 */
function UseScript($FileName1, $FileName2 = '', $FileName3 = '')
{
    static $included = array();
    static $static_data = array();
    // ѕеременна¤ дл¤ сохранени¤ состо¤ний скриптов, если они подключаютс¤ несколько раз
    $return = false;
    $args = func_get_args();
    if (is_array($args[0])) {
        $args = $args[0];
    }
    if (count($args) == 1) {
        $return = true;
    }
    foreach ($args as $path) {
        $params = array();
        if (is_int(strpos($path, '?'))) {
            $p = explode('?', $path, 2);
            $script = $p[0];
            parse_str($p[1], $params);
        } else {
            $script = $path;
        }
        if (isset($included[$path])) {
            continue;
        }
        $file = RealPath2('scripts/' . $script . '/script.php');
        if (is_file($file)) {
            $included[$path] = true;
            if ($return) {
                return include $file;
            } else {
                include $file;
            }
        } else {
            // TODO: WARNING
            return false;
        }
    }
}
/**
 * Генерирует миниатюру и кэширует её. Возвращает имя файла миниатюры.
 * @param      $FileName   Исходный файл изображения.
 * @param int  $MaxWidth   Максимальная ширина миниатюры.
 * @param int  $MaxHeight  Максимальная высота миниатюры.
 * @param bool $Streech    Растягивать ли картинку если заданные размеры больше исходных
 * @param null $SaveFormat Формат сохранения миниатюры (jpeg, png, gif, wbmp).
 * @return mixed
 */
function GetThumb($FileName, $MaxWidth = 0, $MaxHeight = 0, $Streech = false, $SaveFormat = null)
{
    if ($FileName == '') {
        return 'images/no_image.png';
    } elseif (substr($FileName, 0, 7) == 'http://') {
        return $FileName;
    }
    $FileName = RealPath2($FileName);
    if (isset($SaveFormat)) {
        $ext = '.' . $SaveFormat;
    } else {
        $ext = GetFileExt($FileName);
    }
    $tmb_path = System::config('general/tmb_path');
    if (!is_dir($tmb_path)) {
        MkDirRecursive($tmb_path);
    }
    $tmb_file = $tmb_path . md5($FileName) . '_' . $MaxWidth . 'x' . $MaxHeight . ($Streech ? '_streech' : '') . $ext;
    if (!is_file($tmb_file)) {
        CreateThumb($FileName, $tmb_file, $MaxWidth, $MaxHeight, $Streech, $SaveFormat);
    }
    return $tmb_file;
}
function AdminUserDeleteAvatar()
{
    if (isset($_GET['personal'])) {
        $dir = System::config('general/personal_avatars_dir');
        $personal = true;
    } else {
        $dir = System::config('general/avatars_dir');
        $personal = false;
    }
    $avatar = SafeEnv($_GET['filename'], 250, str);
    $filename = RealPath2($dir . $avatar);
    if (file_exists($filename) && is_file($filename)) {
        unlink($filename);
    }
    if ($personal) {
        System::database()->Update('users', "`a_personal`='0',`avatar`=''", "`a_personal`='1' and `avatar`='{$avatar}'");
    }
    Audit('Пользователи: Удаление аватара "' . $filename . '"');
    GO(ADMIN_FILE . '?exe=user&a=avatars');
}
/**
 * Вывод смайликов в шаблон.
 */
function ForumSmiliesRender()
{
    System::site()->AddBlock('smilies', true, true, 'smile');
    if (System::cache()->HasCache('forum', 'ForumSmilies')) {
        $smilies = System::cache()->Get('forum', 'ForumSmilies');
    } else {
        $smilies = System::database()->Select('smilies', "`enabled`='1'");
        System::cache()->Write('forum', 'ForumSmilies', $smilies, Day2Sec);
    }
    foreach ($smilies as $smile) {
        $smile['file'] = RealPath2(System::config('general/smilies_dir') . $smile['file']);
        $smile['code'] = SafeDB($smile['code'], 255, str);
        $sub_codes = explode(',', $smile['code']);
        $smile['code'] = $sub_codes[0];
        System::site()->AddSubBlock('smilies', true, $smile);
    }
}
function AdminCacheClean()
{
    System::cache()->Clear(RealPath2($_GET['group']));
    Audit('Управление кэшем: Очистка группы "' . $_GET['group'] . '"');
    AdminCacheMain();
}
function IndexUserInfo()
{
    if (isset($_GET['user'])) {
        $user_id = SafeEnv($_GET['user'], 11, int);
    } elseif (System::user()->Auth) {
        $user_id = System::user()->Get('u_id');
    } else {
        System::site()->Login();
        return;
    }
    $usr = GetUserInfo($user_id);
    if ($usr !== false) {
        System::site()->SetTitle('Информация о пользователе ' . SafeDB($usr['name'], 50, str));
        System::site()->AddTemplatedBox('', 'module/user_info.html');
        System::site()->AddBlock('userinfo', true, false, 'user');
        $vars['user_id'] = SafeDB($usr['id'], 11, int);
        $vars['name'] = SafeDB($usr['name'], 50, str);
        $vars['true_name'] = SafeDB($usr['truename'], 250, str);
        $vars['avatar'] = RealPath2(SafeDB($usr['avatar_file'], 255, str));
        $vars['rankimage'] = RealPath2(SafeDB($usr['rank_image'], 255, str));
        $vars['rank'] = SafeDB($usr['rank_name'], 255, str);
        $vars['age'] = SafeDB($usr['age'], 11, str);
        $vars['city'] = SafeDB($usr['city'], 100, str);
        if ($usr['hideemail'] == '1') {
            $vars['email'] = 'Скрывается';
        } else {
            $vars['email'] = SafeDB($usr['email'], 50, str);
        }
        $vars['icq'] = SafeDB($usr['icq'], 15, str);
        $vars['site'] = Url(SafeDB($usr['url'], 250, str));
        $vars['site_url'] = UrlRender(SafeDB($usr['url'], 250, str));
        $vars['about'] = SafeDB($usr['about'], 0, str);
        $vars['regdate'] = TimeRender($usr['regdate'], false);
        $vars['lastdate'] = TimeRender($usr['lastvisit']);
        $vars['counter'] = SafeDB($usr['visits'], 11, int);
        if ($usr['online']) {
            $vars['online'] = 'Сейчас на сайте.';
        } else {
            $vars['online'] = '';
        }
        System::site()->BreadCrumbAdd('Личные данные "' . $vars['name'] . '"');
        System::site()->Blocks['userinfo']['vars'] = $vars;
    } else {
        System::site()->AddTextBox('Ошибка', '<p align="center">Пользователь не найден.<p>');
    }
}
function AddDetailDownload(&$down)
{
    $id = SafeDB($down['id'], 11, int);
    $cat_id = SafeDB($down['category'], 11, int);
    $func = IndexDownloadsFunc($id);
    $vars = array();
    $vars['category_url'] = Ufu("index.php?name=downloads&cat={$cat_id}", 'downloads/{cat}/');
    $vars['category_title'] = IndexDownloadsGetTree()->IdCats[$down['category']]['title'];
    $vars['category'] = '<a href="' . $vars['category_url'] . '">' . $vars['category_title'] . '</a>';
    $vars['file_link'] = "index.php?name=downloads&op=download&file={$id}";
    // Если сделать ЧПУ ссылку, то появляется проблема с относительным адресом файла
    if (AccessIsResolved($down['view'])) {
        $vars['access'] = true;
        $url = '<a href="' . $vars['file_link'] . '" target="_blank">Скачать файл</a>';
    } else {
        $vars['access'] = false;
        $url = 'Файл только для зарегистрированных пользователей.';
    }
    $vars['not_access'] = !$vars['access'];
    $vars['url'] = $url;
    $vars['file_title'] = SafeDB($down['title'], 255, str) . (System::user()->isAdmin() ? $func : '');
    $vars['description'] = SafeDB($down['description'], 0, str, false, false);
    $vars['author'] = SafeDB($down['author'], 200, str);
    $vars['homepage'] = SafeDB($down['author_site'], 250, str);
    $vars['homepage_url'] = UrlRender(SafeDB($down['author_site'], 250, str));
    $vars['mail'] = SafeDB($down['author_email'], 50, str);
    $vars['date'] = TimeRender($down['public']);
    $vars['hits'] = SafeDB($down['hits'], 11, int);
    $vars['version'] = SafeDB($down['file_version'], 250, str);
    $vars['size'] = FormatFileSize(SafeDB($down['size'], 11, real), SafeDB($down['size_type'], 1, str));
    $vars['filetype'] = IndexDownloadsGetFileType(SafeDB($down['url'], 250, str));
    $vars['addvote_url'] = "index.php?name=downloads&op=addvote&file={$id}";
    System::site()->DataAdd($vdata, '0', 'Ваша оценка');
    System::site()->DataAdd($vdata, '1', 'Очень плохо');
    System::site()->DataAdd($vdata, '2', 'Плохо');
    System::site()->DataAdd($vdata, '3', 'Средне');
    System::site()->DataAdd($vdata, '4', 'Хорошо');
    System::site()->DataAdd($vdata, '5', 'Отлично');
    $vars['votes'] = System::site()->Select('vote', $vdata);
    $vars['addvotesubm'] = System::site()->Submit('Оценить файл');
    $vars['allow_votes'] = SafeDB($down['allow_votes'], 1, bool);
    if ($down['image'] != '') {
        $vars['image'] = RealPath2(System::config('downloads/images_dir') . SafeDB($down['image'], 255, str));
        $vars['thumb_image'] = RealPath2(System::config('downloads/images_dir') . 'thumbs/' . SafeDB($down['image'], 255, str));
    } else {
        $vars['image'] = false;
    }
    //Выводим rating
    $vars['rating_num_votes'] = SafeDB($down['votes_amount'], 11, int);
    $vars['rating_image'] = GetRatingImage(SafeDB($down['votes_amount'], 11, int), SafeDB($down['votes'], 11, int));
    $rating = $vars['rating_image'];
    if ($rating == '' && SafeDB($down['allow_votes'], 1, bool)) {
        // allow_rating
        $rating = 'Нет оценки';
    } elseif (SafeDB($down['allow_votes'], 1, bool)) {
        $rating = '<img src="' . $rating . '" /> (Оценок: ' . SafeDB($down['votes_amount'], 11, int) . ')';
    } else {
        $rating = ' - ';
    }
    $vars['rating'] = $rating;
    //
    if (!SafeDB($down['allow_comments'], 1, bool)) {
        // allow coments
        $vars['comments'] = ' - ';
    } else {
        $vars['comments'] = SafeDB($down['comments_counter'], 11, int);
    }
    System::site()->AddBlock('download', true, false, 'dl');
    System::site()->Blocks['download']['vars'] = $vars;
}
function AdminUpdateApply()
{
    global $updates_folder, $autoupdate_to;
    // Распаковываем архив, показываем сообщение, что обновление прошло успешно.
    $update_file = RealPath2($updates_folder . $_GET['file']);
    if (!is_file($update_file)) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл обновления не найден.');
        return;
    }
    $zip = new ZipArchive();
    $zip->open($update_file);
    $metadata = JsonDecode($zip->getFromName('metadata'));
    if (!isset($metadata) || !isset($metadata['product']) || $metadata['product'] != CMS_UPDATE_PRODUCT || !isset($metadata['type']) || $metadata['type'] != 'update' || !isset($metadata['from_version']) || $metadata['from_version'] != CMS_VERSION || !isset($metadata['to_version']) || !isset($metadata['changelog'])) {
        System::admin()->AddCenterBox('Ошибка');
        System::admin()->HighlightError('Файл не является файлом обновления или не подходит к вашей версии системы.');
        return;
    }
    $errors = array();
    $numFiles = $zip->numFiles;
    for ($i = 0; $i < $numFiles; $i++) {
        $fn = $zip->getNameIndex($i);
        if ($fn == 'metadata') {
            continue;
        }
        if (substr($fn, -1) != '/') {
            // Файл
            $content = $zip->getFromIndex($i);
            if (is_file($fn)) {
                $r = file_put_contents($fn, $content);
                if ($r === false) {
                    $errors[] = 'Не удалось обновить файл ' . $r;
                }
            } else {
                $r = file_put_contents($fn, $content);
                if ($r !== false) {
                    chmod($fn, 0666);
                } else {
                    $errors[] = 'Не удалось создать файл ' . $r;
                }
            }
        } else {
            // Папка
            if (!is_dir($fn)) {
                $r = MkDirRecursive($fn);
                if ($r === false) {
                    $errors[] = 'Не удалось создать папку ' . $r;
                }
            }
        }
    }
    $zip->close();
    if (count($errors) == 0) {
        // Автообновление
        $autoupdate_to = $metadata['to_version'];
        Audit('Обновление системы: Запуск обновления системы до версии ' . $autoupdate_to);
        include 'config/autoupdate.php';
        // Очистка кэша
        System::cache()->ClearAll();
        System::admin()->AddCenterBox('Обновление системы');
        System::admin()->Highlight('Обновление прошло успешно, система обновлена до версии ' . SafeDB($metadata['to_version'], 20, str) . '.');
        Audit('Обновление системы: Успешное завершение обновления, система была обновлена до версии "' . $autoupdate_to . '"');
    } else {
        System::admin()->AddCenterBox('При обновлении произошли ошибки');
        System::admin()->HighlightError(implode("<br>\n", $errors));
    }
}
function RenderArticle(&$art)
{
    $vars = array();
    $art_id = SafeDB($art['id'], 11, int);
    $cat_id = SafeDB($art['cat_id'], 11, int);
    $func = IndexArticlesFunc($art_id);
    $vars['title'] = SafeDB($art['title'], 250, str) . (System::user()->isAdmin() ? $func : '');
    $vars['cat'] = IndexArticlesGetTree()->IdCats[$cat_id]['title'];
    $vars['catlink'] = Ufu("index.php?name=articles&cat={$cat_id}", 'articles/{cat}/');
    if ($art['image'] != '') {
        $vars['image'] = RealPath2(System::config('articles/images_dir') . SafeDB($art['image'], 255, str));
        $vars['thumb_image'] = RealPath2(System::config('articles/images_dir') . 'thumbs/' . SafeDB($art['image'], 255, str));
    } else {
        $vars['image'] = false;
    }
    if ($art['auto_br_desc'] == '1') {
        $vars['description'] = nl2br(SafeDB($art['description'], 0, str, false, false, false));
    } else {
        $vars['description'] = SafeDB($art['description'], 0, str, false, false, false);
    }
    $vars['lauthor'] = 'Автор';
    $vars['author'] = SafeDB($art['author'], 200, str);
    $vars['lemail'] = 'E-mail';
    $vars['email'] = SafeDB($art['email'], 50, str);
    $vars['lurl'] = 'Источник';
    $vars['site'] = SafeDB($art['www'], 250, str);
    $vars['site_url'] = UrlRender(SafeDB($art['www'], 250, str));
    $vars['lpublic'] = 'Опубликована';
    $vars['public'] = TimeRender(SafeDB($art['public'], 11, int), false);
    $vars['link2'] = Ufu("index.php?name=articles&op=read&art={$art_id}&cat={$cat_id}", 'articles/{cat}/{art}/');
    $vars['link'] = '<a href="' . $vars['link2'] . '">Читать...</a>';
    $vars['lhits'] = 'Просмотров';
    $vars['hits'] = SafeDB($art['hits'], 11, int);
    $vars['lcomments'] = 'Комментарий';
    $vars['comments'] = SafeDB($art['comments_counter'], 11, int);
    //Выводим rating
    $rating = GetRatingImage(SafeDB($art['num_votes'], 11, int), SafeDB($art['all_votes'], 11, int));
    $vars['rating_image'] = $rating;
    $vars['alloy_rating'] = SafeDB($art['allow_votes'], 1, bool);
    $vars['disable_rating'] = !$vars['alloy_rating'];
    $vars['lrating'] = 'Оценка';
    $vars['rating_num_votes'] = SafeDB($art['num_votes'], 11, int);
    //
    $vars['form'] = SafeDB($art['form'], 11, int);
    $vars['product_id'] = SafeDB($art['product_id'], 255, str);
    $vars['form_url'] = false;
    if ($vars['form'] != 0 && $vars['product_id'] != '') {
        $vars['form_url'] = 'index.php?name=forms&form=' . $vars['form'] . '&f_product_id=' . rawurlencode($vars['product_id']);
    }
    System::site()->AddSubBlock('articles', true, $vars);
}
 public function DelFolder($path)
 {
     $result = array();
     if (RealPath2($path) == '') {
         $result['error'] = 'Нельзя удалить корневую папку!';
         return JsonEncode($result);
     }
     $path = RealPath2(DIR_FILES . '/' . $path);
     if (!is_dir($path)) {
         $result['error'] = 'Папка не существует';
         return JsonEncode($result);
     }
     if (RmDirRecursive($path)) {
         $result['ok'] = true;
     } else {
         $result['error'] = 'Ошибка при удалении папки';
     }
     return JsonEncode($result);
 }
/**
 * Подключает группу плагинов
 * @param $group группа
 * @param string $function подгруппа
 * @param bool $return возвратить пути к папкам плагинов вместо автоматического подкочения
 * @return array
 */
function IncludePluginsGroup($group, $function = '', $return = false)
{
    global $config, $db, $user;
    // В поддержку старых плагинов
    global $include_plugin_path;
    // эта переменная будет доступна из плагина
    $plugins = PluginsGetInstalled();
    $plug_dir = System::config('plug_dir');
    $result = array();
    foreach ($plugins as $plugin) {
        if ($group == $plugin['group'] && ($function == '' || $function == $plugin['function'])) {
            $include_plugin_path = RealPath2($plug_dir . $group . '/' . $plugin['name']) . '/';
            if ($return) {
                $result[] = $include_plugin_path;
            } else {
                include $include_plugin_path . 'index.php';
            }
        }
    }
    return $result;
}
function AdminDownloadsDeleteFile()
{
    if (!System::user()->CheckAccess2('downloads', 'edit_files')) {
        System::admin()->AccessDenied();
    }
    if (IsAjax() || isset($_GET['ok']) && SafeEnv($_GET['ok'], 1, int) == '1') {
        $id = SafeEnv($_GET['id'], 11, int);
        $r = System::database()->Select('downloads', "`id`='{$id}'");
        AdminDownloadsGetTree()->CalcFileCounter(SafeDB($r[0]['category'], 11, int), false);
        if (is_file(RealPath2($r[0]['url']))) {
            unlink(RealPath2($r[0]['url']));
        }
        System::database()->Delete('downloads', "`id`='{$id}'");
        System::database()->Delete('downloads_comments', "`object_id`='{$id}'");
        Audit('Архив файлов: Удаление файла "' . $r['title'] . '"');
        GoRefererUrl($_REQUEST['back']);
    } else {
        System::admin()->AddCenterBox('Удаление файла');
        System::database()->Select('downloads', "`id`='" . SafeEnv($_REQUEST['id'], 11, int) . "'");
        $file = System::database()->FetchRow();
        $id = SafeDB($_REQUEST['id'], 11, int);
        $back = SafeDB($_REQUEST['back'], 255, str);
        System::admin()->HighlightConfirmNoAjax('Удалить файл "' . SafeDB($file['title'], 255, str) . '"?', ADMIN_FILE . '?exe=downloads&a=deletefile&id=' . $id . '&ok=1&back=' . $back);
    }
}
/**
 * Сохраняет данные формы сгенерированной фукцией AdminUserEditor
 *
 * @param  $back_link
 * @param string $a
 * @param int $id
 * @param bool $IsAdmin
 * @return void
 */
function AdminUserEditSave($back_link, $a = 'insert', $id = 0, $IsAdmin = false)
{
    $SystemAdmin = System::user()->isSuperUser();
    $edit = $a == 'update';
    $editProfile = $edit && !$SystemAdmin && $id == System::user()->Get('u_id');
    // Администратор редактирует свой профиль
    $editStatus = false;
    // Разрешено редактирование статуса
    $editType = false;
    // Разрешено редактировать тип пользователя
    // Загружаем данные пользователя из БД
    if ($edit) {
        $user = System::database()->SelectOne('users', "`id`='{$id}'" . ($IsAdmin ? " and `type`='1'" : " and `type`='2'"));
        if (!$user) {
            AddTextBox('Ошибка', '<p align="center">Пользователь не найден, либо у вас не достаточно прав для редактирования администраторов.</p>');
            return;
        }
    }
    // Устанавливаем ограничения доступа
    if ($IsAdmin) {
        // Редактируем администратора
        if ($SystemAdmin) {
            // Только системные администраторы могут редактировать статус и тип администраторов
            if (!$edit) {
                $editStatus = true;
            } elseif (!(groupIsSystem(SafeEnv($user['access'], 11, int)) && GetSystemAdminsCount() <= 1)) {
                // Если он не системный или системных больше 1
                $editStatus = true;
            }
            $editType = $editStatus;
        }
    } else {
        // Если пользователь
        $editStatus = true;
        // Все администраторы с доступом могут редактировать статус пользователя
        $editType = $SystemAdmin;
        // Только системные администраторы могут создавать администраторов
    }
    // Обрабатываем данные
    $errors = array();
    // Логин
    if (isset($_POST['login']) && CheckLogin($_POST['login'], $errors, !$edit)) {
        $login = SafeEnv($_POST['login'], 30, str);
    } else {
        $login = '';
    }
    // Пароль
    $pass = '';
    if (!$edit || $_POST['pass'] != '') {
        $pass_generate_message = '';
        if (isset($_POST['pass']) && CheckPass($_POST['pass'], $errors)) {
            $pass = SafeEnv($_POST['pass'], 30, str);
            if (!isset($_POST['rpass']) || SafeEnv($_POST['rpass'], 30, str) != $pass) {
                $errors[] = 'Пароли не совпадают.';
            }
        } else {
            $pass = '';
        }
        if (isset($_POST['pass']) && $_POST['pass'] == '') {
            srand(time());
            $pass = GenBPass(rand(System::config('user/pass_min_length'), 15));
            $pass_generate_message = '<br />Так как вы не указали пароль, он был сгенерирован автоматически и выслан на указанный E-mail пользователя.';
        }
        $pass2 = md5($pass);
    }
    // e-mail
    if (isset($_POST['email']) && $_POST['email'] != '') {
        if (!CheckEmail($_POST['email'])) {
            $errors[] = 'Не правильный формат E-mail. Он должен быть вида: <b>domain@host.ru</b> .';
        }
        $email = SafeEnv($_POST['email'], 50, str, true);
    } else {
        $email = '';
        $errors[] = 'Вы не ввели E-mail.';
    }
    // Скрыть e-mail
    if (isset($_POST['hideemail'])) {
        $hide_email = '1';
    } else {
        $hide_email = '0';
    }
    // Имя пользователя на сайте
    if (isset($_POST['nikname']) && CheckNikname($_POST['nikname'], $errors, !$edit)) {
        $nik_name = SafeEnv($_POST['nikname'], 50, str, true);
    } else {
        $nik_name = '';
    }
    // Полное имя
    if (isset($_POST['realname'])) {
        $real_name = SafeEnv($_POST['realname'], 250, str, true);
    } else {
        $real_name = '';
    }
    // Возраст
    if (isset($_POST['age'])) {
        if ($_POST['age'] == '' || is_numeric($_POST['age'])) {
            $age = SafeEnv($_POST['age'], 3, int);
        } else {
            $errors[] = 'Ваш возраст должен быть числом!';
        }
    } else {
        $age = '';
    }
    // Домашняя страница
    if (isset($_POST['homepage'])) {
        if ($_POST['homepage'] != '' && substr($_POST['homepage'], 0, 7) == 'http://') {
            $_POST['homepage'] = substr($_POST['homepage'], 7);
        }
        $homepage = SafeEnv($_POST['homepage'], 250, str, true);
    } else {
        $homepage = '';
    }
    // Номер ICQ
    if (isset($_POST['icq'])) {
        if ($_POST['icq'] == '' || is_numeric($_POST['icq'])) {
            $icq = SafeEnv($_POST['icq'], 15, str, true);
        } else {
            $errors[] = 'Номер ICQ должен содержать только числа!';
        }
    } else {
        $icq = '';
    }
    // Город
    if (isset($_POST['city'])) {
        $city = SafeEnv($_POST['city'], 100, str, true);
    } else {
        $city = '';
    }
    // Часовой пояс
    if (isset($_POST['gmt'])) {
        $gmt = SafeEnv($_POST['gmt'], 255, str);
    } else {
        $gmt = System::config('general/default_timezone');
    }
    // О себе
    if (isset($_POST['about'])) {
        $about = SafeEnv($_POST['about'], System::config('user/about_max_length'), str, true);
    } else {
        $about = '';
    }
    // Подписка на новости
    if (isset($_POST['snews'])) {
        $server_news = '1';
    } else {
        $server_news = '0';
    }
    //Обрабатываем аватар
    $updateAvatar = true;
    if (isset($_POST['avatar'])) {
        if (System::config('user/avatar_transfer') == '1' && isset($_FILES['upavatar']) && file_exists($_FILES['upavatar']['tmp_name'])) {
            if ($edit) {
                $avatar = $user['avatar'];
                $a_personal = $user['a_personal'];
            } else {
                $avatar = '';
                $a_personal = '0';
            }
            UserLoadAvatar($errors, $avatar, $a_personal, $avatar, $a_personal, $edit);
        } elseif ($_POST['avatar'] == '') {
            $updateAvatar = false;
        } elseif (file_exists(RealPath2(System::config('general/avatars_dir') . $_POST['avatar']))) {
            if ($edit) {
                if ($user['a_personal'] == '1') {
                    UnlinkUserAvatarFiles($user['avatar']);
                }
            }
            $a_personal = '0';
            $avatar = $_POST['avatar'];
        } else {
            $avatar = '';
            $a_personal = '0';
        }
    } else {
        $avatar = '';
        $a_personal = '0';
    }
    $SendActivation = false;
    if ($edit) {
        $active = SafeEnv($user['active'], 11, int);
        $code = SafeEnv($user['activate'], 11, int);
    } else {
        $active = '1';
        $code = '';
    }
    if ($editStatus) {
        $activate = $_POST['activate'];
        $lastactivate = 'manual';
        if ($active == '0' && $code != '') {
            $lastactivate = 'mail';
        } elseif ($active == '1' && $code == '') {
            $lastactivate = 'auto';
        }
        if ($activate != $lastactivate) {
            switch ($activate) {
                case 'manual':
                    $active = '0';
                    $code = '';
                    $SendActivation = false;
                    break;
                case 'auto':
                    $active = '1';
                    $code = '';
                    $SendActivation = false;
                    break;
                case 'mail':
                    $active = '0';
                    $code = GenRandomString(8, 'qwertyuiopasdfghjklzxcvbnm');
                    $SendActivation = true;
                    break;
            }
        }
    }
    if ($edit) {
        $access = SafeEnv($user['type'], 11, int);
        $user_type = SafeEnv($user['access'], 11, int);
    } else {
        $access = '2';
        $user_type = '-1';
    }
    if ($editType && $_POST['status'] != 'member') {
        $access = '1';
        $user_type = SafeEnv($_POST['status'], 11, int);
    }
    $reg_date = time();
    $last_visit = time();
    $ip = getip();
    $points = 0;
    $visits = 0;
    if ($SendActivation) {
        UserSendActivationMail($nik_name, $email, $login, $pass, $code, $reg_date);
    } elseif (!$edit) {
        UserSendEndRegMail($email, $nik_name, $login, $pass, $reg_date);
    }
    if (!$edit) {
        $values = Values('', $login, $pass2, $nik_name, $real_name, $age, $email, $hide_email, $city, $icq, $homepage, $gmt, $avatar, $about, $server_news, $reg_date, $last_visit, $ip, $points, $visits, $active, $code, $access, $user_type, $a_personal, serialize(array()));
        System::database()->Insert('users', $values);
    } else {
        $set = "`login`='{$login}',`email`='{$email}',`hideemail`='{$hide_email}',`name`='{$nik_name}'," . "`truename`='{$real_name}',`age`='{$age}',`url`='{$homepage}',`icq`='{$icq}',`city`='{$city}'," . "`timezone`='{$gmt}'" . ($updateAvatar == true ? ",`avatar`='{$avatar}',`a_personal`='{$a_personal}'" : '') . "," . "`about`='{$about}',`servernews`='{$server_news}'" . ($pass != '' ? ",`pass`='{$pass2}'" : '') . ",`type`='{$access}'," . "`access`='{$user_type}',`active`='{$active}',`activate`='{$code}'";
        System::database()->Update('users', $set, "`id`='" . $id . "'");
        System::user()->UpdateMemberSession();
        UpdateUserComments($id, $id, $nik_name, $email, $hide_email, $homepage);
    }
    if (count($errors) > 0) {
        $text = 'Аккаунт сохранен, но имели место следующие ошибки:<br /><ul>';
        foreach ($errors as $error) {
            $text .= '<li>' . $error;
        }
        $text .= '</ul>';
        AddTextBox('Внимание', $text);
    } else {
        // Очищаем кэш пользователей
        System::cache()->Delete(system_cache, 'users');
        if (!$editProfile) {
            GO(ADMIN_FILE . '?exe=' . $back_link);
        } else {
            System::admin()->AddCenterBox('Редактирование профиля');
            System::admin()->Highlight('Ваш профиль сохранён, обновите страницу.');
        }
    }
}
<?php

/*
 * LinkorCMS 1.4
 * © 2012 LinkorCMS Development Group
 */
if (!defined('VALID_RUN')) {
    header("HTTP/1.1 404 Not Found");
    exit;
}
$type = SafeDB($_GET['mod'], 255, str);
$type = RealPath2($type);
$type = PLUG_DIR . 'plugins/' . $type . '/connector.php';
if (!is_file($type) || !file_exists($type)) {
    echo 'Тип не зарегистрирован (' . $type . ')';
    return;
}
//Подключаем коннектор
require $type;
 /**
  * Выводит форму добавления или редактирования комментария.
  * @param bool        $Edit              Метод редактирования
  * @param string      $PostFormBlockName Имя блока для вывода формы
  */
 public function RenderForm($Edit = false, $PostFormBlockName = 'postsform')
 {
     if ($this->DisableComments) {
         System::site()->AddBlock($PostFormBlockName, false, false, 'form', $this->PostFormTemplate);
         return;
     } else {
         System::site()->AddBlock($PostFormBlockName, true, false, 'form', $this->PostFormTemplate);
     }
     if ($Edit && isset($_GET['post_id'])) {
         $post_id = SafeEnv($_GET['post_id'], 11, int);
     } elseif ($Edit && !isset($_GET['post_id'])) {
         ErrorHandler(USER_ERROR, 'Posts::PostForm(): post_id не инициализирована.', __FILE__);
         return;
     }
     if (!$Edit && !$this->AlloyComments) {
         $this->Alert($PostFormBlockName, 'Обсуждение закрыто');
         return;
     }
     if (!$Edit && !System::user()->Auth && !$this->GuestPost) {
         // Гость
         $this->Alert($PostFormBlockName, 'Гости не могут добавлять комментарии, войдите или зарегистрируйтесь.');
         return;
     }
     System::site()->AddVars('template', array('lang_posts_username' => 'Имя', 'lang_posts_useremail' => 'E-mail', 'lang_posts_hideemail' => 'Скрыть E-mail', 'lang_posts_userhomepage' => 'Сайт', 'lang_posts_posttitle' => 'Заголовок', 'lang_posts_postmessage' => 'Сообщение', 'lang_posts_cancel' => 'Отмена', 'lang_posts_canceltitle' => 'Вернуться к теме без сохранения изменений'));
     $back = '';
     if (!$Edit) {
         $back = '&back=' . SaveRefererUrl();
     }
     $vars = array();
     if ($Edit) {
         System::database()->Select($this->PostsTable, "`id`='{$post_id}'");
         $post = System::database()->FetchRow();
         if (System::user()->Auth) {
             $access = System::user()->Get('u_id') == $post['user_id'] || System::user()->isAdmin();
         } else {
             $access = $post['user_id'] == '0' && $post['user_ip'] == getip();
         }
         if (!$access) {
             $this->Alert($PostFormBlockName, 'У вас не достаточно прав!');
             return;
         }
         $vars['form_title'] = 'Редактирование сообщения';
         $vars['form_action'] = $this->PostFormAction . "&post_id={$post_id}" . $back;
         $vars['post_message'] = HtmlChars($post['post_message']);
         $vars['edit'] = true;
         System::site()->SetVar('template', 'lang_posts_submit', 'Сохранить');
         System::site()->SetVar('template', 'lang_posts_submittitle', 'Сохранить изменения и вернуться');
         $vars['visibility'] = 'visible';
     } else {
         $vars['form_title'] = 'Добавить комментарий';
         $vars['form_action'] = $this->PostFormAction . $back;
         $vars['post_title'] = '';
         $vars['post_message'] = '';
         $vars['edit'] = false;
         System::site()->SetVar('template', 'lang_posts_submit', 'Добавить');
         System::site()->SetVar('template', 'lang_posts_submittitle', 'Добавить новое сообщение');
         $vars['visibility'] = 'hidden';
     }
     $vars['add'] = !$vars['edit'];
     $vars['add_guest'] = (System::user()->AccessLevel() == 3 || System::user()->AccessLevel() == 4) && $vars['add'];
     $vars['show_kaptcha'] = $vars['add_guest'] || !System::user()->isAdmin() && $this->ShowKaptchaForMembers;
     $vars['kaptcha_url'] = 'index.php?name=plugins&amp;p=antibot';
     $vars['kaptcha_width'] = '120';
     $vars['kaptcha_height'] = '40';
     // Подключаем BBCode редактор
     IncludePluginsGroup('bbcode_editors');
     // Смайлики для формы
     $smilies = System::database()->Select('smilies', "`enabled`='1'");
     $vars['is_smilies'] = System::database()->NumRows() != 0;
     if ($vars['is_smilies']) {
         System::site()->AddBlock('smilies', true, true, 'smile');
         foreach ($smilies as $smile) {
             $smile['file'] = RealPath2(System::config('general/smilies_dir') . $smile['file']);
             $sub_codes = explode(',', SafeDB($smile['code'], 255, str));
             $smile['code'] = $sub_codes[0];
             System::site()->AddSubBlock('smilies', true, $smile);
         }
     } else {
         System::site()->AddBlock('smilies', true, false, 'smile', '', 'Смайликов пока нет.');
     }
     System::site()->Blocks[$PostFormBlockName]['vars'] = $vars;
 }
function AdminFormsDeletePost()
{
    $file_save_dir = 'uploads/forms';
    if (!isset($_GET['pid']) || !isset($_GET['id'])) {
        GO(ADMIN_FILE . '?exe=forms');
    }
    $post_id = SafeEnv($_GET['pid'], 11, int);
    $form_id = SafeEnv($_GET['id'], 11, int);
    System::database()->Select('forms_data', "`id`='{$post_id}'");
    $forms_data = System::database()->FetchRow();
    /*
     * Обновляем счетчики ответов для формы.
     */
    System::database()->Select('forms', "`id`='{$form_id}'");
    $form = System::database()->FetchRow();
    if ($forms_data['moderated'] == '1') {
        $value1 = (int) $form['new_answ'];
    } else {
        $value1 = (int) $form['new_answ'] - 1;
    }
    $value2 = (int) $form['answ'] - 1;
    System::database()->Update('forms', "`new_answ`='{$value1}',`answ`='{$value2}'", "`id`='{$form_id}'");
    /*
     * Удаляем прикрепленные файлы.
     */
    $data_rows = unserialize($forms_data['data']);
    foreach ($data_rows as $row) {
        if ($row[2] == 'file') {
            unlink(RealPath2($file_save_dir . '/' . $row[1]));
        }
    }
    /*
     * Удаление записи.
     */
    System::database()->Delete('forms_data', "`id`='{$post_id}'");
    Audit('Web-формы: Удаление данных формы "' . $form['hname'] . '"');
    GO(ADMIN_FILE . '?exe=forms' . (isset($_GET['new']) ? '&a=newposts&id=' . SafeEnv($_GET['id'], 11, int) : '&a=posts&id=' . SafeEnv($_GET['id'], 11, int)));
}
function LoadImage($PostName, $Dir, $ThumbsDir, $MaxWidth, $MaxHeight, $Default, &$Error, $CreateThumbs = true, $OriginalOptimization = false, $OriginalMaxWidth = 800, $OriginalMaxHeight = 600)
{
    $Error = false;
    if ($Default == 'no_image/no_image.png') {
        $Default = '';
    }
    $Dir = RealPath2($Dir);
    $ThumbsDir = RealPath2($ThumbsDir);
    $alloy_mime = array('image/gif', 'image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'application/octet-stream');
    $alloy_exts = array('.gif', '.jpg', '.jpeg', '.png');
    if (isset($_FILES[$PostName]) && is_file($_FILES[$PostName]['tmp_name'])) {
        if (in_array($_FILES[$PostName]['type'], $alloy_mime) && in_array(strtolower(GetFileExt($_FILES[$PostName]['name'])), $alloy_exts)) {
            $file_name = Translit4Url($_FILES[$PostName]['name']);
            if (!is_dir($Dir)) {
                mkdir($Dir, 0777);
            }
            $ext = GetFileExt($file_name);
            $name = GetFileName($file_name, true);
            $i = 1;
            while (is_file($Dir . '/' . $file_name)) {
                $i++;
                $file_name = $name . '_' . $i . $ext;
            }
            $FileName = $Dir . '/' . $file_name;
            $ThumbFileName = $ThumbsDir . '/' . $file_name;
            if (!$OriginalOptimization) {
                copy($_FILES[$PostName]['tmp_name'], $FileName);
            } else {
                CreateThumb($_FILES[$PostName]['tmp_name'], $FileName, $OriginalMaxWidth, $OriginalMaxHeight);
            }
            if ($CreateThumbs) {
                if (!is_dir($ThumbsDir)) {
                    mkdir($ThumbsDir, 0777);
                }
                CreateThumb($FileName, $ThumbFileName, $MaxWidth, $MaxHeight);
            }
            $result = $file_name;
        } else {
            $Error = true;
            return RealPath2(SafeEnv($Default, 255, str));
        }
    } else {
        $result = RealPath2(SafeEnv($Default, 255, str));
    }
    return $result;
}
 /**
  * Выводит все блоки, зарегистрированные в базе данных
  */
 public function ViewBlocks()
 {
     global $site, $db, $user, $config, $userAccess, $userAuth;
     // для совместимости, НЕ УДАЛЯТЬ
     $blocks = System::database()->Select('blocks', GetWhereByAccess('view', "`enabled`='1'"), null, 'place');
     foreach ($blocks as $block) {
         $block_config = $block['config'];
         $area = SafeDB($block['position'], 1, str);
         $title = SafeDB($block['title'], 255, str);
         $enabled = SafeDB($block['enabled'], 1, int);
         $modified = SafeDB($block['modified'], 11, int);
         $cache = SafeDB($block['cache'], 0, str, false, false);
         $vars = array();
         $tempvars = array();
         $childs = array();
         if ($enabled && VisibilityConditionsCheck($block['showin'], $block['showin_uri'])) {
             include RealPath2(System::config('blocks_dir') . $block['type']) . '/index.php';
             // => $vars
             $this->AddUserBlock($area, $vars, $tempvars, $childs, SafeDB(RealPath2($block['template']), 255, str));
         }
     }
 }
define('MOD_ICON', is_file(MOD_DIR . 'icon.png') ? MOD_DIR . 'icon.png' : 'images/application.png');
$module = System::database()->SelectOne('modules', "`enabled`='1' and `folder`='" . SafeEnv($ModuleName, 255, str) . "'");
if ($module === false) {
    Error404();
}
// Проверка на доступ
if (!AccessIsResolved($module['view'], System::user()->AccessLevel()) || $module['system'] == '1' && !System::user()->isSuperUser()) {
    Header('HTTP/1.1 403 Forbidden');
    System::site()->InitPage();
    System::site()->AddTextBox('Ошибка', '<p align="center">Доступ запрещен.</p>');
    System::site()->TEcho();
    exit;
}
define('MOD_NAME', SafeDB($module['folder'], 255, str));
define('MOD_TITLE', SafeDB($module['name'], 255, str));
define('MOD_THEME', RealPath2(SafeDB($module['theme'], 255, str)));
// Инициализация модуля
$valid_init = file_exists(MOD_INIT);
if ($valid_init) {
    include MOD_INIT;
    if (function_exists('mod_initialization')) {
        mod_initialization();
    }
}
if (!$system['no_templates']) {
    // Шаблонизатор
    System::site()->InitPage();
}
if (!$system['no_messages']) {
    // Сообщения
    include_once System::config('inc_dir') . 'messages.inc.php';
<?php

/*
 * LinkorCMS 1.4
 * © 2012 LinkorCMS Development Group
 */
// Восстановление БД из резервной копии
$name = RealPath2(System::config('backup_dir') . $_GET['name']);
if (isset($_GET['table'])) {
    $table = $_GET['table'];
    System::admin()->AddCenterBox('Восстановление таблицы "' . $table . '"');
    $table = System::database()->Prefix() . $table;
} else {
    $table = '';
    System::admin()->AddCenterBox('Восстановление базы данных');
}
$restore_r = System::database()->RestoreBackupFile($name, $table);
if ($restore_r == 3) {
    System::admin()->HighlightError('Ошибка. Неверный формат файла, либо это бекап другого типа Базы данных.');
} elseif ($restore_r == 2) {
    System::admin()->Highlight('Произошли ошибки при восстановлении некоторых таблиц.');
} else {
    if ($table == '') {
        System::admin()->Highlight('База данных успешно восстановлена из резервной копии.');
        Audit('Управление БД: База данных восстановлена из резервной копии "' . $name . '"');
    } else {
        System::admin()->Highlight('Таблица "' . $table . '" успешно восстановлена из резервной копии.');
        Audit('Управление БД: Таблица "' . $table . '" восстановлена из резервной копии "' . $name . '"');
    }
}
function AdminSmiliesDeleteFile()
{
    global $smilies_dir, $mod;
    $name = $_GET['name'];
    unlink(RealPath2($smilies_dir . $name));
    Audit('Смайлики: Удаление файла смайлика ' . $smilies_dir . $name);
    GO($mod . '&a=auto');
}
function AdminExtensionsUninstall()
{
    global $db, $config, $user;
    // Для старых модулей
    $ext_type = $_GET['type'];
    $folder = $_GET['name'];
    if (isset($_GET['group'])) {
        $group = $_GET['group'];
    }
    switch ($ext_type) {
        case EXT_MODULE:
            $mod_path = RealPath2(System::config('mod_dir') . $folder);
            $info = ExtLoadInfo($mod_path);
            if (isset($_POST['ok']) || isset($info['1.3'])) {
                $uninstall = $mod_path . '/uninstall.php';
                if (file_exists($uninstall)) {
                    $delete_tables = isset($_POST['delete_tables']);
                    // Могут быть использованы в uninstall.php
                    $delete_files = isset($_POST['delete_files']);
                    include $uninstall;
                    System::cache()->Clear('config');
                    if (isset($info['1.3'])) {
                        // Удаляем пункт меню
                        $folder = SafeEnv($folder, 255, str);
                        AdminMenuDeleteModule($folder);
                    }
                }
                Audit('Расширения: Удаление модуля "' . $folder . '"');
                GO(ADMIN_FILE . '?exe=extensions#tabs-1');
            } else {
                $folder = SafeEnv($folder, 255, str);
                System::database()->Select('modules', "`folder`='{$folder}'");
                if (System::database()->NumRows() == 0) {
                    AddTextBox('Ошибка', 'Модуль не установлен.');
                    return;
                }
                $mod = System::database()->FetchRow();
                $name = SafeDB($mod['name'], 255, str);
                $text = '';
                $text .= '<form method="post">';
                $text .= '<div style="padding: 10px 0 10px 25px;">';
                $text .= '<div style="padding-bottom: 10px">';
                $text .= '<label><input type="checkbox" name="delete_tables">&nbsp;Удалить таблицы БД</label><br>';
                $text .= '<label><input type="checkbox" name="delete_files">&nbsp;Удалить файлы модуля</label>';
                $text .= '</div>';
                $text .= System::admin()->Hidden('ok', '1');
                $text .= '<div>' . System::admin()->Button('Отмена', 'onclick="history.go(-1)"') . System::admin()->Submit('Удалить') . '</div>';
                $text .= '</div></form>';
                AddTextBox('Удаление модуля "' . $name . '"', $text);
            }
            break;
        case EXT_BLOCK:
            $mod_path = RealPath2(System::config('blocks_dir') . $folder);
            if (isset($_POST['ok'])) {
                $uninstall = $mod_path . '/uninstall.php';
                if (file_exists($uninstall)) {
                    $delete_tables = isset($_POST['delete_tables']);
                    $delete_files = isset($_POST['delete_files']);
                    include $uninstall;
                    System::cache()->Clear('config');
                }
                Audit('Удаление блока "' . $folder . '"');
                GO(ADMIN_FILE . '?exe=extensions#tabs-2');
            } else {
                $folder = SafeEnv($folder, 255, str);
                System::database()->Select('block_types', "`folder`='{$folder}'");
                if (System::database()->NumRows() == 0) {
                    AddTextBox('Ошибка', 'Блок не установлен.');
                    return;
                }
                $mod = System::database()->FetchRow();
                $name = SafeDB($mod['name'], 255, str);
                $text = '';
                $text .= '<form method="post">';
                $text .= '<div style="padding: 10px 0 10px 25px;">';
                $text .= '<div style="padding-bottom: 10px">';
                $text .= '<label><input type="checkbox" name="delete_tables">&nbsp;Удалить таблицы БД</label><br>';
                $text .= '<label><input type="checkbox" name="delete_files">&nbsp;Удалить файлы</label>';
                $text .= '</div>';
                $text .= System::admin()->Hidden('ok', '1');
                $text .= '<div>' . System::admin()->Button('Отмена', 'onclick="history.go(-1)"') . System::admin()->Submit('Удалить') . '</div>';
                $text .= '</div></form>';
                AddTextBox('Удаление блока "' . $name . '"', $text);
            }
            break;
        case EXT_PLUGIN:
            if (isset($_GET['group'])) {
                $group = $_GET['group'] . '/';
                $groupenv = SafeEnv($_GET['group'], 255, str);
            } else {
                $group = '';
                $groupenv = '';
            }
            $mod_path = RealPath2(System::config('plug_dir') . $group . $folder);
            $info = ExtLoadInfo($mod_path);
            if (isset($_POST['ok']) || isset($info['1.3'])) {
                $uninstall = $mod_path . '/uninstall.php';
                if (file_exists($uninstall)) {
                    $delete_tables = isset($_POST['delete_tables']);
                    $delete_files = isset($_POST['delete_files']);
                    include $uninstall;
                    System::cache()->Clear('config');
                    // FIXME: plugin config
                }
                if (isset($info['1.3'])) {
                    $folder = SafeEnv($folder, 255, str);
                    System::database()->Delete('plugins', "`name`='{$folder}' and `group`='{$groupenv}'");
                }
                PluginsClearCache();
                Audit('Расширения: Удаление плагина "' . $folder . '"');
                GO(ADMIN_FILE . '?exe=extensions#tabs-3');
            } else {
                $folder = SafeEnv($folder, 255, str);
                System::database()->Select('plugins', "`name`='{$folder}' and `group`='{$groupenv}'");
                if (System::database()->NumRows() == 0) {
                    AddTextBox('Ошибка', 'Плагин не установлен.');
                    return;
                }
                $mod = System::database()->FetchRow();
                $name = SafeDB($info['name'], 255, str);
                $text = '';
                $text .= '<form method="post">';
                $text .= '<div style="padding: 10px 0 10px 25px;">';
                $text .= '<div style="padding-bottom: 10px">';
                $text .= '<label><input type="checkbox" name="delete_tables">&nbsp;Удалить таблицы БД</label><br>';
                $text .= '<label><input type="checkbox" name="delete_files">&nbsp;Удалить файлы</label>';
                $text .= '</div>';
                $text .= System::admin()->Hidden('ok', '1');
                $text .= '<div>' . System::admin()->Button('Отмена', 'onclick="history.go(-1)"') . System::admin()->Submit('Удалить') . '</div>';
                $text .= '</div></form>';
                AddTextBox('Удаление плагина "' . $name . '"', $text);
            }
            break;
        case EXT_TEMPLATE:
            $mod_path = RealPath2(System::config('tpl_dir') . $folder);
            if (isset($_POST['ok'])) {
                ExtRemoveTemplate($folder, isset($_POST['delete_files']));
                Audit('Расширения: Удаление шаблона "' . $folder . '"');
                GO(ADMIN_FILE . '?exe=extensions#tabs-4');
            } else {
                $info = ExtLoadInfo($mod_path);
                if ($info === false) {
                    $info = array('name' => $folder, 'description' => '', 'author' => '', 'site' => '', 'version' => '1.0', 'admin' => false);
                }
                $name = SafeDB($info['name'], 255, str);
                $text = '';
                $text .= '<form method="post">';
                $text .= '<div style="padding: 10px 0 10px 25px;">';
                $text .= '<div style="padding-bottom: 10px">';
                $text .= '<label><input type="checkbox" name="delete_files">&nbsp;Удалить файлы</label>';
                $text .= '</div>';
                $text .= System::admin()->Hidden('ok', '1');
                $text .= '<div>' . System::admin()->Button('Отмена', 'onclick="history.go(-1)"') . System::admin()->Submit('Удалить') . '</div>';
                $text .= '</div></form>';
                AddTextBox('Удаление шаблона "' . $name . '"', $text);
            }
            break;
    }
}
                $pcache_name = 'plugins_auto_main';
            } elseif (defined('ADMIN_SCRIPT')) {
                $pcache_name = 'plugins_auto_admin';
            }
            if (System::cache()->HasCache(system_cache, $pcache_name)) {
                $plugins = System::cache()->Get(system_cache, $pcache_name);
            } else {
                if (defined('MAIN_SCRIPT')) {
                    $q = "(`type`='1' or `type`='3') and `enabled`='1'";
                } elseif (defined('ADMIN_SCRIPT')) {
                    $q = "(`type`='1' or `type`='2') and `enabled`='1'";
                }
                $plugins = System::database()->Select('plugins', $q);
                System::cache()->Write(system_cache, $pcache_name, $plugins);
            }
            foreach ($plugins as $plugin) {
                $PluginName = RealPath2($config['plug_dir'] . $plugin['name'] . '/index.php');
                if (is_file($PluginName)) {
                    include $PluginName;
                } else {
                    ExtRemovePlugin($plugin['group'], $plugin['name']);
                }
            }
        }
    }
} elseif (!defined('SETUP_SCRIPT') && !defined('DEV_SCRIPT')) {
    // Система не установлена
    Header("Location: setup.php");
    exit;
}
define('INIT_CORE_END', microtime(true));