get(PDO::class); /** @var Johncms\Api\UserInterface $systemUser */ $systemUser = $container->get(Johncms\Api\UserInterface::class); /** @var Johncms\Api\ToolsInterface $tools */ $tools = $container->get(Johncms\Api\ToolsInterface::class); /** @var Johncms\Api\EnvironmentInterface $env */ $env = $container->get(Johncms\Api\EnvironmentInterface::class); /** @var Johncms\Api\BbcodeInterface $bbcode */ $bbcode = $container->get(Johncms\Api\BbcodeInterface::class); /** @var Johncms\Api\ConfigInterface $config */ $config = $container->get(Johncms\Api\ConfigInterface::class); /** @var Zend\I18n\Translator\Translator $translator */ $translator = $container->get(Zend\I18n\Translator\Translator::class); $translator->addTranslationFilePattern('gettext', __DIR__ . '/locale', '/%s/default.mo'); if (isset($_SESSION['ref'])) { unset($_SESSION['ref']); } // Проверяем права доступа в Админ-Клуб if (isset($_SESSION['ga']) && $systemUser->rights < 1 && !in_array($systemUser->id, $guestAccess)) { unset($_SESSION['ga']); } // Задаем заголовки страницы $textl = isset($_SESSION['ga']) ? _t('Admin Club') : _t('Guestbook'); require('../system/head.php'); // Если гостевая закрыта, выводим сообщение и закрываем доступ (кроме Админов) if (!$config->mod_guest && $systemUser->rights < 7) { echo '

' . _t('Guestbook is closed') . '

'; require('../system/end.php'); exit; } switch ($act) { case 'delpost': // Удаление отдельного поста if ($systemUser->rights >= 6 && $id) { if (isset($_GET['yes'])) { $db->exec('DELETE FROM `guest` WHERE `id` = ' . $id); header("Location: index.php"); } else { echo '
' . _t('Guestbook') . ' | ' . _t('Delete message') . '
' . '

' . _t('Do you really want to delete?') . '?
' . '' . _t('Delete') . ' | ' . '' . _t('Cancel') . '

'; } } break; case 'say': // Добавление нового поста $admset = isset($_SESSION['ga']) ? 1 : 0; // Задаем куда вставляем, в Админ клуб (1), или в Гастивуху (0) // Принимаем и обрабатываем данные $name = isset($_POST['name']) ? mb_substr(trim($_POST['name']), 0, 20) : ''; $msg = isset($_POST['msg']) ? mb_substr(trim($_POST['msg']), 0, 5000) : ''; $trans = isset($_POST['msgtrans']) ? 1 : 0; $code = isset($_POST['code']) ? trim($_POST['code']) : ''; $from = $systemUser->isValid() ? $systemUser->name : $name; // Проверяем на ошибки $error = []; $flood = false; if (!isset($_POST['token']) || !isset($_SESSION['token']) || $_POST['token'] != $_SESSION['token']) { $error[] = _t('Wrong data'); } if (!$systemUser->isValid() && empty($name)) { $error[] = _t('You have not entered a name'); } if (empty($msg)) { $error[] = _t('You have not entered the message'); } if ($systemUser->ban['1'] || $systemUser->ban['13']) { $error[] = _t('Access forbidden'); } // CAPTCHA для гостей if (!$systemUser->isValid() && (empty($code) || mb_strlen($code) < 4 || $code != $_SESSION['code'])) { $error[] = _t('The security code is not correct'); } unset($_SESSION['code']); if ($systemUser->isValid()) { // Антифлуд для зарегистрированных пользователей $flood = $tools->antiflood(); } else { // Антифлуд для гостей $req = $db->query("SELECT `time` FROM `guest` WHERE `ip` = '" . $env->getIp() . "' AND `browser` = " . $db->quote($env->getUserAgent()) . " AND `time` > '" . (time() - 60) . "'"); if ($req->rowCount()) { $res = $req->fetch(); $flood = 60 - (time() - $res['time']); } } if ($flood) { $error = sprintf(_t('You cannot add the message so often. Please, wait %d seconds.'), $flood); } if (!$error) { // Проверка на одинаковые сообщения $req = $db->query("SELECT * FROM `guest` WHERE `user_id` = '" . $systemUser->id . "' ORDER BY `time` DESC"); $res = $req->fetch(); if ($res['text'] == $msg) { header("location: index.php"); exit; } } if (!$error) { // Вставляем сообщение в базу $db->prepare("INSERT INTO `guest` SET `adm` = ?, `time` = ?, `user_id` = ?, `name` = ?, `text` = ?, `ip` = ?, `browser` = ?, `otvet` = '' ")->execute([ $admset, time(), $systemUser->id, $from, $msg, $env->getIp(), $env->getUserAgent(), ]); // Фиксируем время последнего поста (антиспам) if ($systemUser->isValid()) { $postguest = $systemUser->postguest + 1; $db->exec("UPDATE `users` SET `postguest` = '$postguest', `lastpost` = '" . time() . "' WHERE `id` = " . $systemUser->id); } header('location: index.php'); } else { echo $tools->displayError($error, '' . _t('Back') . ''); } break; case 'otvet': // Добавление "ответа Админа" if ($systemUser->rights >= 6 && $id) { if (isset($_POST['submit']) && isset($_POST['token']) && isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'] ) { $reply = isset($_POST['otv']) ? mb_substr(trim($_POST['otv']), 0, 5000) : ''; $db->exec("UPDATE `guest` SET `admin` = '" . $systemUser->name . "', `otvet` = " . $db->quote($reply) . ", `otime` = '" . time() . "' WHERE `id` = '$id' "); header("location: index.php"); } else { echo '
' . _t('Guestbook') . ' | ' . _t('Reply') . '
'; $req = $db->query("SELECT * FROM `guest` WHERE `id` = '$id'"); $res = $req->fetch(); $token = mt_rand(1000, 100000); $_SESSION['token'] = $token; echo '' . '
' . _t('Back') . '
'; } } break; case 'edit': // Редактирование поста if ($systemUser->rights >= 6 && $id) { if (isset($_POST['submit']) && isset($_POST['token']) && isset($_SESSION['token']) && $_POST['token'] == $_SESSION['token'] ) { $res = $db->query("SELECT `edit_count` FROM `guest` WHERE `id`='$id'")->fetch(); $edit_count = $res['edit_count'] + 1; $msg = isset($_POST['msg']) ? mb_substr(trim($_POST['msg']), 0, 5000) : ''; $db->prepare(' UPDATE `guest` SET `text` = ?, `edit_who` = ?, `edit_time` = ?, `edit_count` = ? WHERE `id` = ? ')->execute([ $msg, $systemUser->name, time(), $edit_count, $id, ]); header("location: index.php"); } else { $token = mt_rand(1000, 100000); $_SESSION['token'] = $token; $res = $db->query("SELECT * FROM `guest` WHERE `id` = '$id'")->fetch(); $text = htmlentities($res['text'], ENT_QUOTES, 'UTF-8'); echo '
' . _t('Guestbook') . ' | ' . _t('Edit') . '
' . '
' . '
' . '

' . _t('Author') . ': ' . $res['name'] . '

'; echo $bbcode->buttons('form', 'msg'); echo '

' . '

' . '' . '
' . '
' . _t('Back') . '
'; } } break; case 'clean': // Очистка Гостевой if ($systemUser->rights >= 7) { if (isset($_POST['submit'])) { // Проводим очистку Гостевой, согласно заданным параметрам $adm = isset($_SESSION['ga']) ? 1 : 0; $cl = isset($_POST['cl']) ? intval($_POST['cl']) : ''; switch ($cl) { case '1': // Чистим сообщения, старше 1 дня $db->exec("DELETE FROM `guest` WHERE `adm`='$adm' AND `time` < '" . (time() - 86400) . "'"); echo '

' . _t('All messages older than 1 day were deleted') . '

'; break; case '2': // Проводим полную очистку $db->exec("DELETE FROM `guest` WHERE `adm`='$adm'"); echo '

' . _t('Full clearing is finished') . '

'; break; default : // Чистим сообщения, старше 1 недели $db->exec("DELETE FROM `guest` WHERE `adm`='$adm' AND `time`<='" . (time() - 604800) . "';"); echo '

' . _t('All messages older than 1 week were deleted') . '

'; } $db->query("OPTIMIZE TABLE `guest`"); echo '

' . _t('Guestbook') . '

'; } else { // Запрос параметров очистки echo '
' . _t('Guestbook') . ' | ' . _t('Clear') . '
' . '' . '
' . _t('Cancel') . '
'; } } break; case 'ga': // Переключение режима работы Гостевая / Админ-клуб if ($systemUser->rights >= 1 || in_array($systemUser->id, $guestAccess)) { if (isset($_GET['do']) && $_GET['do'] == 'set') { $_SESSION['ga'] = 1; } else { unset($_SESSION['ga']); } } default: // Отображаем Гостевую, или Админ клуб if (!$config->mod_guest) { echo '
' . _t('The guestbook is closed') . '
'; } echo '
' . _t('Guestbook') . '
'; if ($systemUser->rights > 0 || in_array($systemUser->id, $guestAccess)) { $menu = [ isset($_SESSION['ga']) ? '' . _t('Guestbook') . '' : '' . _t('Guestbook') . '', isset($_SESSION['ga']) ? '' . _t('Admin Club') . '' : '' . _t('Admin Club') . '', $systemUser->rights >= 7 ? '' . _t('Clear') . '' : '', ]; echo '
' . implode(' | ', array_filter($menu)) . '
'; } // Форма ввода нового сообщения if (($systemUser->isValid() || $config->mod_guest == 2) && !isset($systemUser->ban['1']) && !isset($systemUser->ban['13'])) { $token = mt_rand(1000, 100000); $_SESSION['token'] = $token; echo '
'; if (!$systemUser->isValid()) { echo _t('Name') . ' (max 25):

'; } echo '' . _t('Message') . ' (max 5000):
'; echo $bbcode->buttons('form', 'msg'); echo '
'; if (!$systemUser->isValid()) { // CAPTCHA для гостей echo '' . _t('Symbols on the picture') . '
' . ' ' . _t('Symbols on the picture') . '
'; } echo '' . '
'; } else { echo '
' . _t('For registered users only') . '
'; } $total = $db->query("SELECT COUNT(*) FROM `guest` WHERE `adm`='" . (isset($_SESSION['ga']) ? 1 : 0) . "'")->fetchColumn(); echo '
' . _t('Comments') . '
'; if ($total > $kmess) { echo '
' . $tools->displayPagination('index.php?', $start, $total, $kmess) . '
'; } if ($total) { if (isset($_SESSION['ga']) && ($systemUser->rights >= 1 || in_array($systemUser->id, $guestAccess))) { // Запрос для Админ клуба echo '
АДМИН-КЛУБ
'; $req = $db->query("SELECT `guest`.*, `guest`.`id` AS `gid`, `users`.`rights`, `users`.`lastdate`, `users`.`sex`, `users`.`status`, `users`.`datereg`, `users`.`id` FROM `guest` LEFT JOIN `users` ON `guest`.`user_id` = `users`.`id` WHERE `guest`.`adm`='1' ORDER BY `time` DESC LIMIT " . $start . "," . $kmess); } else { // Запрос для обычной Гастивухи $req = $db->query("SELECT `guest`.*, `guest`.`id` AS `gid`, `users`.`rights`, `users`.`lastdate`, `users`.`sex`, `users`.`status`, `users`.`datereg`, `users`.`id` FROM `guest` LEFT JOIN `users` ON `guest`.`user_id` = `users`.`id` WHERE `guest`.`adm`='0' ORDER BY `time` DESC LIMIT " . $start . "," . $kmess); } for ($i = 0; $res = $req->fetch(); ++$i) { $text = ''; echo $i % 2 ? '
' : '
'; if (!$res['id']) { // Запрос по гостям $res_g = $db->query("SELECT `lastdate` FROM `cms_sessions` WHERE `session_id` = '" . md5($res['ip'] . $res['browser']) . "' LIMIT 1")->fetch(); $res['lastdate'] = $res_g['lastdate']; } // Время создания поста $text = ' (' . $tools->displayDate($res['time']) . ')'; echo ''; if ($res['user_id']) { // Для зарегистрированных показываем ссылки и смайлы $post = $tools->checkout($res['text'], 1, 1); $post = $tools->smilies($post, $res['rights'] >= 1 ? 1 : 0); } else { // Для гостей обрабатываем имя и фильтруем ссылки $res['name'] = $tools->checkout($res['name']); $post = $tools->checkout($res['text'], 0, 2); $post = preg_replace('~\\[url=(https?://.+?)\\](.+?)\\[/url\\]|(https?://(www.)?[0-9a-z\.-]+\.[0-9a-z]{2,6}[0-9a-zA-Z/\?\.\~&_=/%-:#]*)~', '###', $post); $replace = [ '.ru' => '***', '.com' => '***', '.biz' => '***', '.cn' => '***', '.in' => '***', '.net' => '***', '.org' => '***', '.info' => '***', '.mobi' => '***', '.wen' => '***', '.kmx' => '***', '.h2m' => '***', ]; $post = strtr($post, $replace); } if ($res['edit_count']) { // Если пост редактировался, показываем кем и когда $post .= '
Изм. ' . $res['edit_who'] . ' (' . $tools->displayDate($res['edit_time']) . ') [' . $res['edit_count'] . ']'; } if (!empty($res['otvet'])) { // Ответ Администрации $otvet = $tools->checkout($res['otvet'], 1, 1); $otvet = $tools->smilies($otvet, 1); $post .= '
' . $res['admin'] . ': (' . $tools->displayDate($res['otime']) . ')
' . $otvet . '
'; } if ($systemUser->rights >= 6) { $subtext = '' . _t('Reply') . '' . ($systemUser->rights >= $res['rights'] ? ' | ' . _t('Edit') . ' | ' . _t('Delete') . '' : ''); } else { $subtext = ''; } $arg = [ 'header' => $text, 'body' => $post, 'sub' => $subtext, ]; echo $tools->displayUser($res, $arg); echo '
'; } } else { echo ''; } echo '
' . _t('Total') . ': ' . $total . '
'; if ($total > $kmess) { echo '
' . $tools->displayPagination('index.php?', $start, $total, $kmess) . '
' . '

' . '

'; } break; } require('../system/end.php');