/** * Функция добавления ссылки: */ public static function CreateLink($params) { $cache = KVS::getInstance(); $id = $cache->incr(__CLASS__, null, 'nextId'); if (!ControlModel::CheckLinkfilter($params['link']) && ($category = self::CheckCategory($params['link'])) !== false) { $params['description'] = TexyHelper::typo($params['description']); $record = array('id' => $id, 'link' => preg_replace('/(#.*)$/i', '', $params['link']), 'description' => $params['description'], 'category' => $category, 'board' => $category['board'], 'clicks' => 0, 'visitors' => array($_SERVER['REMOTE_ADDR'])); $cache->set(__CLASS__, 'links', $id, serialize($record)); $cache->expire(__CLASS__, 'links', $id, 60 * 60 * 24); // expire after 24 hours $cache->listAdd(__CLASS__, null, 'links', $id); $cache->set(__CLASS__, null, 'lastUpdate', time()); EventModel::getInstance()->Broadcast('add_online_link', $record); return true; } return false; }
/add_comment/" method="post" id="comment_form"> <input type="text" name="email" value="" class="g-hidden" /> <input type="hidden" name="post_id" value="<?php echo $post['id']; ?> " /> <input type="hidden" name="homeboard" value="anonymous" /> <div class="b-comment-form"> <strong>Комментировать:</strong> <span class="b-comment-form_b-helplink"> <a href="/help/markup/" target="_blank">Правила разметки</a> </span> <div> <?php if (ControlModel::isCommentCaptcha()) { ?> <div class="b-comment-form_b-captcha"> <input type="hidden" name="captcha_key" value="<?php echo $this->getParameter('captcha_key'); ?> " /> <input type="text" name="captcha" value=""<?php if (array_key_exists('captcha', $form_errors)) { ?> class="g-input-error"<?php } ?> /> <img src="http://<?php echo TemplateHelper::getSiteUrl();
?> /ico/homeboards/<?php echo $data[0]; ?> " class="b-homeboard-form_icon" /> </a> <?php } ?> </div> </span> </div> </div> <?php if (ControlModel::isPostHandApproving()) { ?> <div class="b-blog-form_b-info">Премодерация: ваше сообщение может быть одобрено только модератором.</div> <?php } ?> <div class="b-blog-form_b-actions"> <input type="submit" value="Отправить" /> <input type="button" value="Предпросмотр" disabled="disabled" id="blog_form_preview_button" /> </div> <div class="b-blog-form_b-form" id="blog_form_last_posts" style="display:none"> <div class="b-blog-form_b-form_b-field"> <h2>Новые сообщения:</h2> <p>С момента начала написания нового поста, были добавлены нижеперечисленные записи. Пожалуйста, избегайте повторяющихся тем сообщений.</p>
/ico/tick.png" width="16" height="16" alt="" /></a> <a href="#" id="mod_rateable" title="Оцениваема"><img src="http://<?php echo TemplateHelper::getSiteUrl(); ?> /ico/rate_on.png" width="16" height="16" alt="" /></a> <a href="#" id="mod_closed" title="Закрыта"><img src="http://<?php echo TemplateHelper::getSiteUrl(); ?> /ico/block.png" width="16" height="16" alt="" /></a> <a href="#" id="mod_remove" title="Удалить"><img src="http://<?php echo TemplateHelper::getSiteUrl(); ?> /ico/remove.gif" width="16" height="16" alt="" /></a> </div> <?php if ($message = ControlModel::isGlobalMessage()) { ?> <div class="b-global-message-panel"> <div class="l-wrap"> <img src="http://<?php echo TemplateHelper::getSiteUrl(); ?> /ico/warning.png" width="16" height="16" alt="" /> <?php echo $message; ?> </div> </div> <?php } ?> <div class="l-wrap">
/** * Действие удаление ссылки из ротатора: */ public function removeOnlineLinkAjaxAction(Application $application) { if (!Session::getInstance()->isAdminSession()) { return false; } $link = Blog_BlogOnlineModel::GetLink($_GET['id']); if ($link) { Blog_BlogOnlineModel::RemoveLink($_GET['id']); ControlModel::logModEvent(date("d-m-Y H:i:s") . ' ' . $_SESSION['auth']['name'] . '<br /> удалил ссылку ' . $link['link'] . '<br /><em>' . strip_tags($link['description']) . '</em>'); JabberBot::send('-=$ /me (модлог) ' . $_SESSION['auth']['name'] . ' удалил ссылку ' . $link['link'] . ': ' . strip_tags($link['description'])); } return true; }
/** * Добавление новой ссылки (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()); }
/** * Проверка на модераторство: */ public function isModerator($key) { $moderators = ControlModel::GetModerators(); foreach ($moderators as $mod) { if ($mod['key'] === $key) { $_SESSION['auth'] = $mod; return true; } } return false; }
/** * Действие добавления комментария (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()); }
function KCAPTCHA() { $config = Config::getInstance(); $captcha_config = $config['captcha']; $length = ControlModel::getCaptchaLength(); extract($captcha_config); $fonts = array(); $fontsdir_absolute = dirname(__FILE__) . '/' . $fontsdir; if ($handle = opendir($fontsdir_absolute)) { while (false !== ($file = readdir($handle))) { if (preg_match('/\\.png$/i', $file)) { $fonts[] = $fontsdir_absolute . '/' . $file; } } closedir($handle); } $alphabet_length = strlen($alphabet); do { // generating random keystring while (true) { $this->keystring = ''; for ($i = 0; $i < $length; $i++) { $this->keystring .= $allowed_symbols[mt_rand(0, strlen($allowed_symbols) - 1)]; } if (!preg_match('/cp|cb|ck|c6|c9|rn|rm|mm|co|do|cl|db|qp|qb|dp|ww/', $this->keystring)) { break; } } $font_file = $fonts[mt_rand(0, count($fonts) - 1)]; $font = imagecreatefrompng($font_file); imagealphablending($font, true); $fontfile_width = imagesx($font); $fontfile_height = imagesy($font) - 1; $font_metrics = array(); $symbol = 0; $reading_symbol = false; // loading font for ($i = 0; $i < $fontfile_width && $symbol < $alphabet_length; $i++) { $transparent = imagecolorat($font, $i, 0) >> 24 == 127; if (!$reading_symbol && !$transparent) { $font_metrics[$alphabet[$symbol]] = array('start' => $i); $reading_symbol = true; continue; } if ($reading_symbol && $transparent) { $font_metrics[$alphabet[$symbol]]['end'] = $i; $reading_symbol = false; $symbol++; continue; } } $img = imagecreatetruecolor($width, $height); imagealphablending($img, true); $white = imagecolorallocate($img, 255, 255, 255); $black = imagecolorallocate($img, 0, 0, 0); imagefilledrectangle($img, 0, 0, $width - 1, $height - 1, $white); // draw text $x = 1; for ($i = 0; $i < $length; $i++) { $m = $font_metrics[$this->keystring[$i]]; $y = mt_rand(-$fluctuation_amplitude, $fluctuation_amplitude) + ($height - $fontfile_height) / 2 + 2; if ($no_spaces) { $shift = 0; if ($i > 0) { $shift = 10000; for ($sy = 7; $sy < $fontfile_height - 20; $sy += 1) { for ($sx = $m['start'] - 1; $sx < $m['end']; $sx += 1) { $rgb = imagecolorat($font, $sx, $sy); $opacity = $rgb >> 24; if ($opacity < 127) { $left = $sx - $m['start'] + $x; $py = $sy + $y; if ($py > $height) { break; } for ($px = min($left, $width - 1); $px > $left - 12 && $px >= 0; $px -= 1) { $color = imagecolorat($img, $px, $py) & 0xff; if ($color + $opacity < 190) { if ($shift > $left - $px) { $shift = $left - $px; } break; } } break; } } } if ($shift == 10000) { $shift = mt_rand(4, 6); } } } else { $shift = 1; } imagecopy($img, $font, $x - $shift, $y, $m['start'], 1, $m['end'] - $m['start'], $fontfile_height); $x += $m['end'] - $m['start'] - $shift; } } while ($x >= $width - 10); // while not fit in canvas $center = $x / 2; // credits. To remove, see configuration file $img2 = imagecreatetruecolor($width, $height + ($show_credits ? 12 : 0)); $foreground = imagecolorallocate($img2, $foreground_color[0], $foreground_color[1], $foreground_color[2]); $background = imagecolorallocate($img2, $background_color[0], $background_color[1], $background_color[2]); imagefilledrectangle($img2, 0, 0, $width - 1, $height - 1, $background); imagefilledrectangle($img2, 0, $height, $width - 1, $height + 12, $foreground); $credits = empty($credits) ? $_SERVER['HTTP_HOST'] : $credits; imagestring($img2, 2, $width / 2 - imagefontwidth(2) * strlen($credits) / 2, $height - 2, $credits, $background); // periods $rand1 = mt_rand(750000, 1200000) / 10000000; $rand2 = mt_rand(750000, 1200000) / 10000000; $rand3 = mt_rand(750000, 1200000) / 10000000; $rand4 = mt_rand(750000, 1200000) / 10000000; // phases $rand5 = mt_rand(0, 31415926) / 10000000; $rand6 = mt_rand(0, 31415926) / 10000000; $rand7 = mt_rand(0, 31415926) / 10000000; $rand8 = mt_rand(0, 31415926) / 10000000; // amplitudes $rand9 = mt_rand(330, 420) / 110; $rand10 = mt_rand(330, 450) / 110; //wave distortion for ($x = 0; $x < $width; $x++) { for ($y = 0; $y < $height; $y++) { $sx = $x + (sin($x * $rand1 + $rand5) + sin($y * $rand3 + $rand6)) * $rand9 - $width / 2 + $center + 1; $sy = $y + (sin($x * $rand2 + $rand7) + sin($y * $rand4 + $rand8)) * $rand10; if ($sx < 0 || $sy < 0 || $sx >= $width - 1 || $sy >= $height - 1) { continue; } else { $color = imagecolorat($img, $sx, $sy) & 0xff; $color_x = imagecolorat($img, $sx + 1, $sy) & 0xff; $color_y = imagecolorat($img, $sx, $sy + 1) & 0xff; $color_xy = imagecolorat($img, $sx + 1, $sy + 1) & 0xff; } if ($color == 255 && $color_x == 255 && $color_y == 255 && $color_xy == 255) { continue; } else { if ($color == 0 && $color_x == 0 && $color_y == 0 && $color_xy == 0) { $newred = $foreground_color[0]; $newgreen = $foreground_color[1]; $newblue = $foreground_color[2]; } else { $frsx = $sx - floor($sx); $frsy = $sy - floor($sy); $frsx1 = 1 - $frsx; $frsy1 = 1 - $frsy; $newcolor = $color * $frsx1 * $frsy1 + $color_x * $frsx * $frsy1 + $color_y * $frsx1 * $frsy + $color_xy * $frsx * $frsy; if ($newcolor > 255) { $newcolor = 255; } $newcolor = $newcolor / 255; $newcolor0 = 1 - $newcolor; $newred = $newcolor0 * $foreground_color[0] + $newcolor * $background_color[0]; $newgreen = $newcolor0 * $foreground_color[1] + $newcolor * $background_color[1]; $newblue = $newcolor0 * $foreground_color[2] + $newcolor * $background_color[2]; } } imagesetpixel($img2, $x, $y, imagecolorallocate($img2, $newred, $newgreen, $newblue)); } } header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Cache-Control: no-store, no-cache, must-revalidate'); header('Cache-Control: post-check=0, pre-check=0', FALSE); header('Pragma: no-cache'); if (function_exists("imagejpeg")) { header("Content-Type: image/jpeg"); imagejpeg($img2, null, $jpeg_quality); } else { if (function_exists("imagegif")) { header("Content-Type: image/gif"); imagegif($img2); } else { if (function_exists("imagepng")) { header("Content-Type: image/x-png"); imagepng($img2); } } } }
/** * Удаление поста (ajax): */ public function removeAjaxAction(Application $application) { $board = new Board_BoardModel($_GET['board']); $session = Session::getInstance(); if ($board->existsPost($_GET['id'])) { $post = $board->getPost($_GET['id']); if (!empty($post['password']) && $post['password'] == $_GET['password']) { if ($board->existsThread($_GET['id'])) { $board->removeThread($_GET['id']); } else { $board->removePost($_GET['id']); } return true; } if ($session->isAdminSession()) { if (@$_GET['delall'] == true) { $board->removePostsByAuthor($_GET['id']); return true; } else { if ($board->existsThread($_GET['id'])) { $board->removeThread($_GET['id']); } else { $board->removePost($_GET['id']); } if ($board->getId() != 'alone') { ControlModel::logModEvent(date("d-m-Y H:i:s") . ' ' . $_SESSION['auth']['name'] . '<br /> удалил пост №' . $_GET['id'] . ' в разделе ' . $_GET['board']); } } } return false; } return true; }
/** * Управление ссылками: */ public function blogLogAction(Application $application, Template $template) { $template->setParameter('menu', 'posts'); $template->setParameter('submenu', 'log'); $log = ControlModel::getLogModEvent(); $this['log'] = '<p>' . implode("</p><p>", array_reverse($log)) . '</p>'; return true; }