Example #1
0
    // pr($post);
    $f_check_comments = $post['f_check_comments'];
    // номера отмеченных
    // на всякий случай пройдемся по массиву и составим массив из ID
    $arr_ids = array();
    // список всех где ON
    foreach ($f_check_comments as $id_com => $val) {
        if ($val) {
            $arr_ids[] = $id_com;
        }
    }
    $CI->db->where_in('comments_id', $arr_ids);
    if ($CI->db->delete('comments')) {
        mso_flush_cache();
        // синхронизация количества комментариев у комюзеров
        mso_comuser_update_count_comment();
        echo '<div class="update">' . t('Удалено!') . '</div>';
    } else {
        echo '<div class="error">' . t('Ошибка удаления') . '</div>';
    }
}
?>
<h1><?php 
echo t('Комментарии');
?>
</h1>

<p class="info"><?php 
echo t('Последние комментарии');
?>
</p>
Example #2
0
function mso_get_new_comment($args = array())
{
    global $MSO;
    $args = mso_hook('mso_get_new_comment_args', $args);
    if ($post = mso_check_post(array('comments_session', 'comments_submit', 'comments_page_id', 'comments_content'))) {
        // mso_checkreferer(); // если нужно проверять на реферер
        $CI =& get_instance();
        // заголовок страницы
        if (!isset($args['page_title'])) {
            $args['page_title'] = '';
        }
        // стили
        if (!isset($args['css_ok'])) {
            $args['css_ok'] = 'comment-ok';
        }
        if (!isset($args['css_error'])) {
            $args['css_error'] = 'comment-error';
        }
        // разрешенные тэги
        if (!isset($args['tags'])) {
            $args['tags'] = '<p><blockquote><br><span><strong><strong><em><i><b><u><s><pre><code>';
        }
        // обрабатывать текст на xss-атаку
        if (!isset($args['xss_clean'])) {
            $args['xss_clean'] = true;
        }
        // если найдена xss-атака, то не публиковать комментарий
        if (!isset($args['xss_clean_die'])) {
            $args['xss_clean_die'] = false;
        }
        // запрещенные слова как имя автора
        if (!isset($args['noword'])) {
            $args['noword'] = array('.com', '.ru', '.net', '.org', '.info', '.ua', '.su', '.name', '/', 'www.', 'http', ':', '-', '"', '«', '»', '%', '<', '>', '&', '*', '+', '\'');
        }
        mso_hook('add_new_comment');
        if (!mso_checksession($post['comments_session'])) {
            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка сессии! Обновите страницу') . '</div>';
        }
        if (!$post['comments_page_id']) {
            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка!') . '</div>';
        }
        $comments_page_id = $post['comments_page_id'];
        $id = (int) $comments_page_id;
        if ((string) $comments_page_id != (string) $id) {
            $id = false;
        }
        // $comments_page_id не число
        if (!$id) {
            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка!') . '</div>';
        }
        // капчу проверим
        // если этот хук возвращает false, значит капча неверная
        if (!mso_hook('comments_new_captcha', true)) {
            // если определен хук на неверную капчу, отдаем его
            if (mso_hook_present('comments_new_captcha_error')) {
                return mso_hook('comments_new_captcha_error');
            } else {
                return '<div class="' . $args['css_error'] . '">' . tf('Ошибка! Неверно введены нижние символы!') . '</div>';
            }
        }
        // вычищаем от запрещенных тэгов
        if ($args['tags']) {
            $t = $post['comments_content'];
            $t = strip_tags($t, $args['tags']);
            // оставим только разрешенные тэги
            $post['comments_content'] = $t;
            // сохраним как текст комментария
        }
        // если указано рубить коммент при обнаруженной xss-атаке
        if ($args['xss_clean_die'] and mso_xss_clean($post['comments_content'], true, false) === true) {
            return '<div class="' . $args['css_error'] . '">' . tf('Обнаружена XSS-атака!') . '</div>';
        }
        if (!trim($post['comments_content'])) {
            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка, нет текста!') . '</div>';
        }
        // возможно есть текст, но только из одних html - не пускаем
        if (!trim(strip_tags(trim($post['comments_content'])))) {
            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка, нет полезного текста!') . '</div>';
        }
        // вычищаем текст от xss
        if ($args['xss_clean']) {
            $post['comments_content'] = mso_xss_clean($post['comments_content']);
            // проставим pre исправление ошибки CodeIgniter
            $post['comments_content'] = str_replace('&lt;/pre>', '</pre>', $post['comments_content']);
        }
        $comments_author_ip = $_SERVER['REMOTE_ADDR'];
        $comments_date = date('Y-m-d H:i:s');
        $comments_content = mso_hook('new_comments_content', $post['comments_content']);
        // есть дли родитель у комментария
        $comments_parent_id = isset($post['comments_parent_id']) ? $post['comments_parent_id'] : '0';
        // провека на спам - проверим через хук new_comments_check_spam
        $comments_check_spam = mso_hook('new_comments_check_spam', array('comments_content' => $comments_content, 'comments_date' => $comments_date, 'comments_author_ip' => $comments_author_ip, 'comments_page_id' => $comments_page_id, 'comments_server' => $_SERVER, 'comments_parent_id' => $comments_parent_id, 'comments_author' => isset($post['comments_author']) ? $post['comments_author'] : false, 'comments_email' => isset($post['comments_email']) ? $post['comments_email'] : false, 'comusers_email' => isset($post['comusers_email']) ? $post['comusers_email'] : false, 'comments_user_id' => isset($post['comments_user_id']) ? $post['comments_user_id'] : false, 'comments_comusers_nik' => isset($post['comments_comusers_nik']) ? $post['comments_comusers_nik'] : false, 'comments_comusers_url' => isset($post['comments_comusers_url']) ? $post['comments_comusers_url'] : false), false);
        // если есть спам, то возвращается что-то отличное от comments_content
        // если спама нет, то должно вернуться false
        // если есть подозрения, то возвращается массив с moderation (comments_approved)
        // если есть параметр check_spam=true, значит определен спам и он вообще не пускается
        // сообщение для вывода в парметре 'message'
        // разрешение антиспама moderation
        // -1 - не определено, 0 - можно разрешить, 1 - отдать на модерацию
        $moderation = -1;
        if ($comments_check_spam) {
            if (isset($comments_check_spam['check_spam']) and $comments_check_spam['check_spam'] == true) {
                if (isset($comments_check_spam['message']) and $comments_check_spam['message']) {
                    return '<div class="' . $args['css_error'] . '">' . $comments_check_spam['message'] . '</div>';
                } else {
                    return '<div class="' . $args['css_error'] . '">' . tf('Ваш комментарий определен как спам и удален.') . '</div>';
                }
            } else {
                // спам не определен, но возможно стоит moderation - принудительная модерация
                if (isset($comments_check_spam['moderation'])) {
                    $moderation = $comments_check_spam['moderation'];
                }
            }
        }
        // проверим есть ли уже такой комментарий
        // проверка по ip и тексту
        $CI->db->select('comments_id');
        $CI->db->where(array('comments_page_id' => $comments_page_id, 'comments_author_ip' => $comments_author_ip, 'comments_content' => $comments_content));
        $query = $CI->db->get('comments');
        if ($query->num_rows()) {
            return '<div class="' . $args['css_error'] . '">' . tf('Похоже, вы уже отправили этот комментарий...') . '</div>';
        }
        if (is_login()) {
            $comments_users_id = $MSO->data['session']['users_id'];
            $ins_data = array('comments_users_id' => $comments_users_id, 'comments_page_id' => $comments_page_id, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_parent_id' => $comments_parent_id, 'comments_approved' => 1);
            $res = $CI->db->insert('comments', $ins_data) ? '1' : '0';
            if ($res) {
                $id_comment_new = $CI->db->insert_id();
                mso_email_message_new_comment($id_comment_new, $ins_data, $args['page_title']);
                mso_flush_cache();
                $CI->db->cache_delete_all();
                mso_hook('new_comment');
                mso_redirect(mso_current_url() . '#comment-' . $id_comment_new);
            } else {
                return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>';
            }
        } else {
            if (isset($post['comments_reg'])) {
                if ($post['comments_reg'] == 'reg') {
                    // проверим есть ли разршение на комментарии от комюзеров
                    // для случаев подделки post-запроса
                    if (!mso_get_option('allow_comment_comusers', 'general', '1')) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Error allow_comment_comusers') . '</div>';
                    }
                    if (!isset($post['comments_email']) or !$post['comments_email']) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Нужно указать Email') . '</div>';
                    }
                    if (!isset($post['comments_password']) or !$post['comments_password']) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Нужно указать пароль') . '</div>';
                    }
                    $comments_email = mso_strip($post['comments_email']);
                    $comments_password = mso_strip($post['comments_password']);
                    if (!mso_valid_email($comments_email)) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Ошибочный Email') . '</div>';
                    }
                    // проверим время последнего комментария чтобы не очень часто
                    if (!mso_last_activity_comment()) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</div>';
                    }
                    // вначале нужно зарегистрировать comюзера - получить его id и только после этого добавить сам коммент
                    // но вначале есть смысл проверить есть ли такой ком-пользователь
                    $comusers_id = false;
                    $CI->db->select('comusers_id, comusers_password');
                    $CI->db->where('comusers_email', $comments_email);
                    $query = $CI->db->get('comusers');
                    if ($query->num_rows()) {
                        $row = $query->row_array(1);
                        // пароль не нужно шифровать mso_md5
                        if (isset($post['comments_password_md']) and $post['comments_password_md']) {
                            if ($row['comusers_password'] != $comments_password) {
                                // пароль неверный
                                return '<div class="' . $args['css_error'] . '">' . tf('Неверный пароль') . '</div>';
                            }
                        } else {
                            if ($row['comusers_password'] != mso_md5($comments_password)) {
                                // пароль неверный
                                return '<div class="' . $args['css_error'] . '">' . tf('Неверный пароль') . '</div>';
                            }
                        }
                        $comusers_id = $row['comusers_id'];
                        // получаем номер комюзера
                    } else {
                        // такого комюзера нет
                        $ins_data = array('comusers_email' => $comments_email, 'comusers_password' => mso_md5($comments_password));
                        // генерируем случайный ключ активации
                        $ins_data['comusers_activate_key'] = mso_md5(rand());
                        $ins_data['comusers_date_registr'] = date('Y-m-d H:i:s');
                        $ins_data['comusers_last_visit'] = date('Y-m-d H:i:s');
                        $ins_data['comusers_ip_register'] = $_SERVER['REMOTE_ADDR'];
                        $ins_data['comusers_notify'] = '1';
                        // сразу включаем подписку на уведомления
                        // если сразу отправлен адрес ссайта
                        if (isset($post['comments_comusers_url']) and $post['comments_comusers_url']) {
                            $comusers_url = htmlspecialchars(mso_xss_clean(strip_tags($post['comments_comusers_url'])));
                            if (strpos($comusers_url, 'http://') === false) {
                                $comusers_url = 'http://' . $comusers_url;
                            }
                            if ($comusers_url) {
                                $ins_data['comusers_url'] = $comusers_url;
                            }
                        }
                        // если сразу отправлен ник
                        if (isset($post['comments_comusers_nik']) and $post['comments_comusers_nik']) {
                            $ins_data['comusers_nik'] = htmlspecialchars(mso_xss_clean(strip_tags($post['comments_comusers_nik'])));
                        }
                        // Автоматическая активация новых комюзеров
                        // если активация стоит автоматом, то сразу её и прописываем
                        if (mso_get_option('comusers_activate_auto', 'general', '0')) {
                            $ins_data['comusers_activate_string'] = $ins_data['comusers_activate_key'];
                        }
                        $res = $CI->db->insert('comusers', $ins_data) ? '1' : '0';
                        if ($res) {
                            // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment
                            $CI->session->set_userdata('last_activity_comment', time());
                            $comusers_id = $CI->db->insert_id();
                            // номер добавленной записи
                            // нужно добавить опцию в мета «новые комментарии, где я участвую» subscribe_my_comments
                            // вначале грохаем если есть такой ключ
                            $CI->db->where('meta_table', 'comusers');
                            $CI->db->where('meta_id_obj', $comusers_id);
                            $CI->db->where('meta_key', 'subscribe_my_comments');
                            $CI->db->delete('meta');
                            // теперь добавляем как новый
                            $ins_data2 = array('meta_table' => 'comusers', 'meta_id_obj' => $comusers_id, 'meta_key' => 'subscribe_my_comments', 'meta_value' => '1');
                            $CI->db->insert('meta', $ins_data2);
                            // почему CodeIgniter не может так?
                            // INSERT INTO table SET column = 1, id=1 ON DUPLICATE KEY UPDATE column = 2
                            // отправляем ему уведомление с кодом активации
                            mso_email_message_new_comuser($comusers_id, $ins_data, mso_get_option('comusers_activate_auto', 'general', '0'));
                            mso_flush_cache();
                            $CI->db->cache_delete_all();
                        } else {
                            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка регистрации') . '</div>';
                        }
                    }
                    if ($comusers_id) {
                        // Модерация комюзеров 1 - модерировать
                        $comments_com_approved = mso_get_option('new_comment_comuser_moderate', 'general', 1);
                        // если включена модерация комюзеров
                        // и включена опция только первого комментария
                        // то получаем кол-во комментариев комюзера
                        if ($comments_com_approved and mso_get_option('new_comment_comuser_moderate_first_comment', 'general', 0)) {
                            $all_comusers = mso_comuser_update_count_comment();
                            // список комюзер => колво комментов
                            // есть такой комюзер и у него более 1 комментария
                            if (isset($all_comusers[$comusers_id]) and $all_comusers[$comusers_id] > 0) {
                                $comments_com_approved = 0;
                            }
                            // разрешаем публикацию
                        }
                        // но у нас в базе хранится значение наоборот - 1 разрешить 0 - запретить
                        $comments_com_approved = !$comments_com_approved;
                        if ($moderation == 1) {
                            $comments_com_approved = 0;
                        }
                        // антиспам определил, что нужно премодерировать
                        if ($comments_com_approved == 1) {
                            $comments_com_approved = mso_hook('new_comments_check_spam_comusers', array('comments_page_id' => $comments_page_id, 'comments_comusers_id' => $comusers_id, 'comments_com_approved' => $comments_com_approved), 1);
                        }
                        // комюзер добавлен или есть
                        // теперь сам коммент
                        $ins_data = array('comments_page_id' => $comments_page_id, 'comments_comusers_id' => $comusers_id, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_approved' => $comments_com_approved, 'comments_parent_id' => $comments_parent_id);
                        // проверим время последнего комментария чтобы не очень часто
                        if (!mso_last_activity_comment()) {
                            return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</div>';
                        }
                        $res = $CI->db->insert('comments', $ins_data) ? '1' : '0';
                        if ($res) {
                            // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment
                            $CI->session->set_userdata('last_activity_comment', time());
                            $id_comment_new = $CI->db->insert_id();
                            // посколько у нас идет редирект, то данные об отправленном комменте
                            // сохраняем в сессии номер комментария
                            if (isset($MSO->data['session'])) {
                                $CI->session->set_userdata(array('comments' => array($id_comment_new)));
                            }
                            mso_email_message_new_comment($id_comment_new, $ins_data, $args['page_title']);
                            mso_flush_cache();
                            $CI->db->cache_delete_all();
                            mso_hook('new_comment');
                            # если комюзер не залогинен, то сразу логиним его
                            $CI->db->select('comusers_id, comusers_password, comusers_email, 
									comusers_nik, comusers_url, comusers_avatar_url, comusers_last_visit');
                            $CI->db->where('comusers_email', $comments_email);
                            $CI->db->where('comusers_password', mso_md5($comments_password));
                            $query = $CI->db->get('comusers');
                            if ($query->num_rows()) {
                                $comuser_info = $query->row_array(1);
                                // вся инфа о комюзере
                                // сразу же обновим поле последнего входа
                                $CI->db->where('comusers_id', $comuser_info['comusers_id']);
                                $CI->db->update('comusers', array('comusers_last_visit' => date('Y-m-d H:i:s')));
                                $expire = time() + 60 * 60 * 24 * 30;
                                // 30 дней = 2592000 секунд
                                $name_cookies = 'maxsite_comuser';
                                $value = serialize($comuser_info);
                                # ставим куку и редиректимся автоматом
                                mso_add_to_cookie($name_cookies, $value, $expire, mso_current_url(true) . '#comment-' . $id_comment_new);
                                exit;
                            }
                            mso_redirect(mso_current_url() . '#comment-' . $id_comment_new);
                        } else {
                            return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>';
                        }
                    }
                } elseif ($post['comments_reg'] == 'noreg') {
                    // комментарий от анонима
                    // проверим есть ли разрешение на комментарии от анонимов
                    // для случаев подделки post-запроса
                    if (!mso_get_option('allow_comment_anonim', 'general', '1')) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Error allow_comment_anonim') . '</div>';
                    }
                    // проверим время последнего комментария чтобы не очень часто
                    if (!mso_last_activity_comment()) {
                        return '<div class="' . $args['css_error'] . '">' . tf('Слишком частые комментарии. Попробуйте позже.') . '</div>';
                    }
                    if (isset($post['comments_author'])) {
                        $comments_author_name = mso_strip($post['comments_author']);
                        $comments_author_name = str_replace($args['noword'], '', $comments_author_name);
                        $comments_author_name = htmlspecialchars(trim($comments_author_name));
                        if (!$comments_author_name) {
                            $comments_author_name = tf('Аноним');
                        }
                    } else {
                        $comments_author_name = 'Аноним';
                    }
                    // можно ли публиковать без модерации?
                    $comments_approved = mso_get_option('new_comment_anonim_moderate', 'general', 1);
                    // но у нас в базе хранится значение наоборот - 1 разрешить 0 - запретить
                    $comments_approved = !$comments_approved;
                    if ($moderation == 1) {
                        $comments_approved = 0;
                    }
                    // антиспам определил, что нужно премодерировать
                    $ins_data = array('comments_page_id' => $comments_page_id, 'comments_author_name' => $comments_author_name, 'comments_author_ip' => $comments_author_ip, 'comments_date' => $comments_date, 'comments_content' => $comments_content, 'comments_approved' => $comments_approved, 'comments_parent_id' => $comments_parent_id);
                    $res = $CI->db->insert('comments', $ins_data) ? '1' : '0';
                    if ($res) {
                        $id_comment_new = $CI->db->insert_id();
                        // сохраним в сессии время отправления комментария - используется в mso_last_activity_comment
                        $CI->session->set_userdata('last_activity_comment', time());
                        // посколько у нас идет редирект, то данные об отправленном комменте
                        // сохраняем в сессии номер комментария
                        if (isset($MSO->data['session'])) {
                            $CI->session->set_userdata(array('comments' => array($id_comment_new)));
                        }
                        mso_email_message_new_comment($id_comment_new, $ins_data, $args['page_title']);
                        mso_flush_cache();
                        $CI->db->cache_delete_all();
                        mso_hook('new_comment');
                        mso_redirect(mso_current_url() . '#comment-' . $id_comment_new);
                    } else {
                        return '<div class="' . $args['css_error'] . '">' . tf('Ошибка добавления комментария') . '</div>';
                    }
                }
            }
        }
    }
}