Exemplo n.º 1
0
 /**
  * Действие "поделиться ссылкой" через букмарклет:
  */
 public function shareLinkAction(Application $application, Template $template)
 {
     $kvs = KVS::getInstance();
     $validator = new ValidatorHelper($_GET);
     $validator->assertExists('title', '');
     $validator->assertLength('title', 70, '');
     $validator->assertExists('link', '');
     $validator->assertRegexp('link', ValidatorHelper::URL_REGEXP, '');
     $validator->assertLength('description', 128, '');
     if ($validator->isValid()) {
         $key = md5(strtolower($_GET['link']));
         $ip = md5($_SERVER['REMOTE_ADDR']);
         $counter = $kvs->get(__CLASS__, 'shared_links_ip', $ip);
         if (!$kvs->exists(__CLASS__, 'shared_links', $key) && !$kvs->exists(__CLASS__, 'shared_links_ban', $ip)) {
             if ($kvs->exists(__CLASS__, 'shared_links_ip', $ip)) {
                 if ($counter > 5) {
                     $kvs->set(__CLASS__, 'shared_links_ban', $ip, true);
                     $kvs->expire(__CLASS__, 'shared_links_ban', $ip, 5 * 60);
                 } else {
                     $lifetime = $kvs->lifetime(__CLASS__, 'shared_links_ip', $ip);
                     $kvs->set(__CLASS__, 'shared_links_ip', $ip, ++$counter);
                     $kvs->expire(__CLASS__, 'shared_links_ip', $ip, $lifetime);
                 }
             } else {
                 $kvs->set(__CLASS__, 'shared_links_ip', $ip, 1);
                 $kvs->expire(__CLASS__, 'shared_links_ip', $ip, 60);
             }
             JabberBot::send('-=% /me Отправлена ссылка: ' . $_GET['link'] . ' (' . $_GET['title'] . ')' . "\n" . (!empty($_GET['description']) ? 'С описанием: ' . $_GET['description'] : ''));
             $kvs->set(__CLASS__, 'shared_links', $key, true);
             $kvs->expire(__CLASS__, 'shared_links', $key, 60 * 60);
             $template->headerOk();
             $template->headerContentTypeWOCharset('image/png');
             readfile(WEB_DIR . '/ico/tick.png');
             exit;
         }
     }
     $template->headerBadRequest();
     exit;
 }
Exemplo n.º 2
0
 /**
  * Добавление новой ссылки (ajax):
  */
 public function addAjaxAction(Application $application)
 {
     if (ControlModel::isLiveCaptcha()) {
         return array('isValid' => 'captcha');
     }
     ControlModel::checkContent($_POST['description']);
     $validator = new ValidatorHelper($_POST);
     $validator->assertExists('link', 'Не введена ссылка');
     $validator->assertRegexp('link', ValidatorHelper::URL_REGEXP, 'Ссылка введена неверно');
     if ($validator->fieldValid('link')) {
         $validator->assertTrue('link', Blog_BlogOnlineModel::CheckCategory($_POST['link']) !== false, 'Данная ссылка не может участвовать в ленте');
     }
     if ($validator->fieldValid('link')) {
         $validator->assertTrue('link', Blog_BlogOnlineModel::CheckLinkPosted($_POST['link']) != true, 'Ссылка уже участвует в ленте');
     }
     $validator->assertTrue('timeout', ControlModel::getLiveInterval() == 0, 'Таймаут ' . TemplateHelper::ending(ControlModel::getLiveInterval(), 'секунда', 'секунды', 'секунд'));
     $validator->assertTrue('link', !ControlModel::CheckLinkfilter($params['link']), 'Запрещенная ссылка');
     $validator->assertExists('description', 'Не введено описание');
     $validator->assertLength('description', 100, 'Описание длиннее 100 символов');
     if ($validator->isValid()) {
         Blog_BlogOnlineModel::CreateLink($_POST);
         return true;
     }
     return array('isValid' => $validator->isValid(), 'validationResults' => $validator->getValidationResults());
 }
Exemplo n.º 3
0
 /**
  * Действие добавления комментария (ajax):
  */
 public function addCommentAjaxAction(Application $application)
 {
     $session = Session::getInstance();
     if ($session->isJustCreated()) {
         return false;
     }
     $validator = new ValidatorHelper($_POST);
     $validator->assertExists('text', 'Не введен текст комментария');
     $validator->assertExists('post_id', 'Не указан идентификатор поста');
     $validator->assertLength('text', 2048, 'Текст комментария слишком длинный');
     $validator->assertNotExists('email', 'Заполнено лишнее поле');
     $text_test = ControlModel::checkContent($_POST['text']);
     if (ControlModel::isCommentCaptcha()) {
         return array('captcha' => true);
     }
     $validator->assertTrue('text', $text_test, 'Запрещенное слово из вордфильтра');
     $validator->assertTrue('timeout', ControlModel::getPostCommentInterval() == 0, 'Таймаут ' . TemplateHelper::ending(ControlModel::getPostCommentInterval(), 'секунда', 'секунды', 'секунд'));
     if ($validator->isValid()) {
         $id = Blog_BlogCommentsModel::CreateComment($_POST, true);
         $session->activeSet('last_visit_post_' . $_POST['post_id'], time());
     }
     return array('isValid' => $validator->isValid(), 'validationResults' => $validator->getValidationResults());
 }
Exemplo n.º 4
0
    /**
     * Операции с чатом (ajax):
     */
    public function chatAjaxAction(Application $application)
    {
        $session = Session::getInstance();
        if ($_SERVER['REQUEST_METHOD'] == 'GET') {
            switch (@$_GET['command']) {
                case 'enter':
                    return Chat_ChatModel::TestChatChannel($_GET['id']);
                case 'ping':
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    return true;
                case 'welcome':
                    $room = Chat_ChatRoomsModel::GetRoom($_GET['id']);
                    $info = Chat_ChatRoomsModel::GetInfo($_GET['id']);
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    return array('title' => $room['title'], 'description' => $room['description'], 'info' => $info);
            }
        } else {
            switch (@$_POST['command']) {
                case 'checkpassword':
                    return Chat_ChatModel::TestChatChannel($_GET['id'], $_POST['password']);
                case 'message':
                    if (($room = Chat_ChatRoomsModel::GetRoom($_GET['id'])) == false) {
                        return array('error' => true, 'errors' => 'Комнаты чата больше не существует.');
                    }
                    if (strpos($_POST['message'], '/') === 0) {
                        switch (true) {
                            case strpos($_POST['message'], '/help') === 0:
                                return array('error' => true, 'errors' => '
                                    <p> 
						                Доступные команды:
						            </p> 
						            <dl> 
							            <dt>Изменение названия комнаты:</dt> 
							            <dd> 
								            <p>/change_title <em>пароль_управления</em> <em>новое название</em></p> 
							            </dd> 
							            <dt>Изменение описания комнаты:</dt> 
							            <dd> 
								            <p>/change_description <em>пароль_управления</em> <em>новое описание</em></p> 
							            </dd> 
							            <dt>Изменение информационного сообщения:</dt> 
							            <dd> 
								            <p>/set_info <em>пароль_управления</em> <em>сообщение</em></p> 
							            </dd> 
							            <dt>«Девойс» (лишение права голоса):</dt> 
							            <dd> 
								            <p>/devoice <em>пароль_управления</em> <em>номер сообщения</em></p> 
							            </dd> 
							            <dt>«Энвойс» (разблокировка):</dt> 
							            <dd> 
								            <p>/envoice <em>пароль_управления</em> <em>хеш (выводится при девойсе)</em></p> 
							            </dd> 
							            <dt>Очистка блокировок:</dt> 
							            <dd> 
								            <p>/envoice <em>пароль_управления</em></p> 
							            </dd> 
							            <dt>Блокировка слова:</dt> 
							            <dd> 
								            <p>/blockword <em>пароль_управления</em> <em>слово или фраза</em></p> 
							            </dd> 
							            <dt>Просмотр блокированых слов:</dt> 
							            <dd> 
								            <p>/ls_blockwords <em>пароль_управления</em></p> 
							            </dd> 
							            <dt>Разблокировка слова:</dt> 
							            <dd> 
								            <p>/rm_blockword <em>пароль_управления</em> <em>номер_слова (из списка слов)</em></p> 
							            </dd> 
							            <dt>Статус публичности:</dt> 
							            <dd> 
								            <p>/set_public <em>пароль_управления</em> 0/1<em>(0 - скрытая, 1 - публичная)</em></p> 
							            </dd>
							            <dt>Удаление комнаты:</dt> 
							            <dd> 
								            <p>/remove_room <em>пароль_управления</em></p> 
							            </dd> 
					                </dl> 
					        ');
                            case strpos($_POST['message'], '/get_controlword') === 0:
                                if ($session->isAdminSession()) {
                                    return array('error' => true, 'errors' => 'Пароль управления: ' . $room['controlword']);
                                }
                                return array('error' => true, 'errors' => 'Неверная команда.');
                            case strpos($_POST['message'], '/devoice') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $message_id = preg_replace("/[^0-9]/", '', array_shift($parts));
                                $key = Chat_ChatModel::deVoice($_GET['id'], $message_id);
                                if ($key !== false) {
                                    Chat_ChatModel::AddInfoMessage($_GET['id'], 'Автор сообщения >>' . $message_id . ' (' . $key . ') был лишен голоса.', $room['password']);
                                } else {
                                    return array('error' => true, 'errors' => 'Сообщение слишком старое.');
                                }
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/envoice') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $key = array_shift($parts);
                                if ($key) {
                                    Chat_ChatModel::enVoice($_GET['id'], $key);
                                } else {
                                    Chat_ChatModel::clearVoice($_GET['id']);
                                }
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/set_alias') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $alias = $parts[0];
                                if (!preg_match('/^[0-9A-z\\-]{4,20}$/i', $alias)) {
                                    return array('error' => true, 'errors' => 'Запрещенные символы в алиасе.');
                                }
                                if (Chat_ChatRoomsModel::SetAlias($_GET['id'], $alias)) {
                                    Chat_ChatRoomsModel::EditRoom($_GET['id'], array('alias' => $alias));
                                    Chat_ChatModel::AddInfoMessage($_GET['id'], 'Установлен новый алиас, теперь комната доступна по адресу http://' . TemplateHelper::getSiteUrl() . '/chat/' . $alias . '/');
                                    return array('error' => false, 'id' => -1);
                                }
                                return array('error' => true, 'errors' => 'Не удалось установить алиас (возможно он уже занят?).');
                            case strpos($_POST['message'], '/remove_alias') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                Chat_ChatRoomsModel::RemoveAlias($room['alias']);
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('alias' => null));
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/blockword') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $blocked = implode(' ', $parts);
                                Chat_ChatModel::blockWord($_GET['id'], $blocked);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/ls_blockwords') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $result = array();
                                foreach (Chat_ChatModel::getBlockList($_GET['id']) as $num => $value) {
                                    $result[] = $num . ': ' . $value;
                                }
                                return array('error' => true, 'errors' => sizeof($result) ? 'Запрещенные слова:<br />' . implode('<br />', $result) : 'Нет слов в блокировке.');
                            case strpos($_POST['message'], '/rm_blockword') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $blocked = array_shift($parts);
                                Chat_ChatModel::unblockWord($_GET['id'], $blocked);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/change_title') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $title = implode(' ', $parts);
                                if (mb_strlen($title, 'UTF-8') > 25) {
                                    return array('error' => true, 'errors' => 'Слишком длинное название.');
                                }
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('title' => $title));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Название комнаты изменено с «' . $room['title'] . '» на «' . $title . '»', $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/change_description') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $description = implode(' ', $parts);
                                if (mb_strlen($description, 'UTF-8') > 75) {
                                    return array('error' => true, 'errors' => 'Слишком длинное описание.');
                                }
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('description' => $description));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Описание комнаты изменено с «' . $room['description'] . '» на «' . $description . '»', $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/a') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                $symbol = array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $message = '<span style="color:orange">' . $symbol . '</span> ' . implode(' ', $parts);
                                $id = Chat_ChatModel::AddMessage($_GET['id'], $message, $_POST['password']);
                                return array('error' => false, 'id' => $id);
                            case strpos($_POST['message'], '/set_info') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $info = implode(' ', $parts);
                                if (mb_strlen($info, 'UTF-8') > 612) {
                                    return array('error' => true, 'errors' => 'Слишком длинное информационное сообщение.');
                                }
                                $info = Chat_ChatRoomsModel::SetInfo($_GET['id'], $info);
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Новое информационное сообщение:' . $info, $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/set_public') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                $state = array_shift($parts);
                                Chat_ChatRoomsModel::EditRoom($_GET['id'], array('public' => (bool) $state));
                                Chat_ChatModel::AddInfoMessage($_GET['id'], 'Изменен статус комнаты: ' . ((bool) $state ? 'Публичная' : 'Приватная'), $room['password']);
                                return array('error' => false, 'id' => -1);
                            case strpos($_POST['message'], '/remove_room') === 0:
                                $parts = explode(' ', $_POST['message']);
                                array_shift($parts);
                                if ($room['controlword'] !== array_shift($parts)) {
                                    return array('error' => true, 'errors' => 'Неверный пароль управления.');
                                }
                                Chat_ChatModel::AddErrorMessage($_GET['id'], 'Комната была удалена.', $room['password']);
                                Chat_ChatRoomsModel::RemoveRoom($_GET['id']);
                                return array('error' => false, 'id' => -1);
                            default:
                                return array('error' => true, 'errors' => 'Неверная команда.');
                        }
                    }
                    $validator = new ValidatorHelper($_POST);
                    $validator->assertExists('message', 'Не введено сообщение');
                    $validator->assertLength('message', 1024, 'Сообщение слишком длинное');
                    EventModel::getInstance()->Broadcast('view_chat', $_GET['id']);
                    if ($validator->isValid()) {
                        if (!Chat_ChatModel::hasVoice($_GET['id'], $_SERVER['REMOTE_ADDR'])) {
                            return array('error' => true, 'errors' => 'Вам запрещено отправлять сообщения в этот чат.');
                        }
                        $blocked_words = Chat_ChatModel::getBlockList($_GET['id']);
                        $messagefilter = htmlspecialchars_decode(strtr($_POST['message'], array('*' => '', '_' => '', '=' => '', '-' => '')));
                        foreach ($blocked_words as $word) {
                            if (preg_match('~' . str_replace('~', '\\~', $word) . '~ui', $messagefilter) == true) {
                                return array('error' => true, 'errors' => 'Запрещенное слово из вордфильтра.');
                            }
                        }
                        similar_text(trim($session->persistenceGet('last_chat_text', '')), trim($_POST['message']), $percent);
                        if ($percent < 90) {
                            Chat_ChatRoomsModel::TouchRoom($_GET['id']);
                            $session->persistenceSet('last_chat_text', $_POST['message']);
                            $id = Chat_ChatModel::AddMessage($_GET['id'], $_POST['message'], $_POST['password']);
                            return array('error' => false, 'id' => $id);
                        }
                        return array('error' => true, 'errors' => 'Флуд контроль, сообщение проигнорировано.');
                    } else {
                        return array('error' => true, 'errors' => implode(', ', $validator->getValidationResults()));
                    }
            }
        }
    }
Exemplo n.º 5
0
 /**
  * Создание поста (форма ajax):
  */
 public function createPostAjaxFormAction(Application $application, Template $template)
 {
     $board = new Board_BoardModel($_GET['board']);
     $session = Session::getInstance();
     if ($session->isJustCreated()) {
         return false;
     }
     if ($_SERVER['REQUEST_METHOD'] == 'POST') {
         $validator = new ValidatorHelper($_POST);
         if (!array_key_exists('upload', $_FILES) || $_FILES['upload']['error'] == 4) {
             $validator->assertExists('text', $_GET['board'] != 'int' ? 'Не введен текст' : 'Please enter the message');
         }
         $validator->assertLength('text', 2048, $_GET['board'] != 'int' ? 'Текст слишком длинный' : 'Post\'s text is too long');
         $validator->assertNotExists('email', $_GET['board'] != 'int' ? 'Заполнено лишнее поле' : 'Spam omitted');
         $validator->assertTrue('timeout', ControlModel::getBoardPostInterval() == 0, $_GET['board'] != 'int' ? 'Таймаут ' . TemplateHelper::ending(ControlModel::getBoardPostInterval(), 'секунда', 'секунды', 'секунд') : ControlModel::getBoardPostInterval() . ' seconds timeout');
         if ($validator->fieldValid('timeout')) {
             ControlModel::checkBoardPost($_POST['text']);
         }
         if (ControlModel::isCommentCaptcha()) {
             $validator->assertLengthMore('captcha', 1, $_GET['board'] != 'int' ? 'Не введена капча' : 'Please enter the Captcha code');
             if ($validator->fieldValid('captcha')) {
                 $validator->assertEqual('captcha', $session->instantGet('captcha_board_comment', false), $_GET['board'] != 'int' ? 'Капча введена неверно' : 'Captcha code is incorrect');
             }
         }
         $validator->assertTrue('text', ControlModel::checkSpam($_POST['text']), $_GET['board'] != 'int' ? 'Ваше сообщение определено, как спам' : 'Spam message was detected');
         $validator->assertTrue('upload', Board_UploadModel::checkUpload(), $_GET['board'] != 'int' ? 'Ошибка загрузки изображения' : 'File upload error');
         $session->instantSet('captcha_board_comment', true);
         if ($validator->isValid()) {
             $id = $board->createPost($_POST['parent_id'], $_POST);
             $session->persistenceSet('captcha_mode', false);
             $session->persistenceSet('captcha_mode_length', @$settings['captcha_length']);
             $template->renderJSONP('comment_callback', array('sucess' => true, 'id' => $id));
             return false;
         }
         $template->renderJSONP('comment_callback', array('success' => false, 'errors' => $validator->getValidationResults()));
     }
     return false;
 }