Exemple #1
0
function mod_invite($mod, $cfg) {
    global $_LANG;

    $errors      = false;
    $is_redirect = false; // в модуле нельзя использовать cmsCore::redirectBack(), используем костыли ;)

    if (cmsCore::inRequest('send_invite_email')) {
        $is_redirect = true;

        $username = cmsCore::request('username', 'str', '');
        $email    = cmsCore::request('friend_email', 'email', '');

        if (!$username && !cmsCore::c('user')->id) {
            cmsCore::addSessionMessage($_LANG['ERR_NEED_NAME'], 'error'); $errors = true;
        }
        
        if (cmsCore::c('user')->id) {
            $username = cmsCore::c('user')->nickname;
        }

        if (!$email) {
            cmsCore::addSessionMessage($_LANG['ERR_NEED_MAIL'], 'error'); $errors = true;
        }

        if (!$errors) {
            if (!cmsUser::checkCsrfToken()) {
                cmsCore::error404();
            }

            $letter = cmsCore::getLanguageTextFile('mail_invite');
            $letter = str_replace('{sitename}', cmsConfig::getConfig('sitename'), $letter);
            $letter = str_replace('{site_url}', HOST, $letter);
            $letter = str_replace('{username}', $username, $letter);

            cmsCore::mailText($email, sprintf($_LANG['INVITE_SUBJECT'], $username), $letter);
            cmsCore::addSessionMessage($_LANG['INVITE_SENDED'], 'success');
        }
    }

    cmsPage::initTemplate('modules', $cfg['tpl'])->
        assign('user_id', cmsCore::c('user')->id)->
        assign('is_redirect', $is_redirect)->
        display();

    return true;
}
Exemple #2
0
 public function sendActivationNotice($send_pass, $user_id)
 {
     global $_LANG;
     $user = cmsUser::getShortUserData($user_id);
     if (!$user_id) {
         return false;
     }
     $user['password'] = $send_pass;
     $code = md5($user['email'] . uniqid() . '-' . microtime());
     $codelink = HOST . '/activate/' . $code;
     $sql = "INSERT cms_users_activate (pubdate, user_id, code)\r\n                VALUES (NOW(), '{$user['id']}', '{$code}')";
     $this->inDB->query($sql);
     $letter = cmsCore::getLanguageTextFile('activation');
     foreach ($user as $key => $value) {
         $letter = str_replace('{' . $key . '}', $value, $letter);
     }
     $letter = str_replace('{sitename}', cmsConfig::getConfig('sitename'), $letter);
     $letter = str_replace('{codelink}', $codelink, $letter);
     return cmsCore::mailText($user['email'], $_LANG['ACTIVATION_ACCOUNT'] . ' - ' . cmsConfig::getConfig('sitename'), $letter);
 }
Exemple #3
0
function users()
{
    header('X-Frame-Options: DENY');
    $inCore = cmsCore::getInstance();
    $inPage = cmsPage::getInstance();
    $inDB = cmsDatabase::getInstance();
    $inUser = cmsUser::getInstance();
    global $_LANG;
    $model = new cms_model_users();
    // id пользователя
    $id = cmsCore::request('id', 'int', 0);
    // логин пользователя
    $login = cmsCore::strClear(urldecode(cmsCore::request('login', 'html', '')));
    $do = $inCore->do;
    $page = cmsCore::request('page', 'int', 1);
    $pagetitle = $inCore->getComponentTitle();
    if ($model->config['sw_search'] != 2) {
        $inPage->addPathway($pagetitle, '/users');
    }
    $inPage->setTitle($pagetitle);
    $inPage->setDescription($pagetitle);
    // js только авторизованным
    if ($inUser->id) {
        $inPage->addHeadJS('components/users/js/profile.js');
        $inPage->addHeadJsLang(array('CONFIRM_CLEAN_CAT', 'CHOOSE_RECIPIENT', 'SEND_TO_USER', 'FRIENDSHIP_OFFER', 'STOP_FRIENDLY', 'REALY_STOP_FRIENDLY', 'ENTER_STATUS', 'HAVE_JUST'));
    }
    //============================================================================//
    //========================= Список пользователей  ============================//
    //============================================================================//
    if ($do == 'view') {
        // если запрещен просмотр всех пользователей, 404
        if ($model->config['sw_search'] == 2) {
            cmsCore::error404();
        }
        //очищаем поисковые запросы если пришли со другой страницы
        if (!strstr(cmsCore::getBackURL(), '/users')) {
            cmsUser::sessionClearAll();
        }
        $stext = array();
        // Возможные входные переменные
        $name = cmsCore::getSearchVar('name');
        $city = cmsCore::getSearchVar('city');
        $hobby = cmsCore::getSearchVar('hobby');
        $gender = cmsCore::getSearchVar('gender');
        $orderby = cmsCore::request('orderby', array('karma', 'rating', 'regdate'), 'regdate');
        $orderto = cmsCore::request('orderto', array('asc', 'desc'), 'desc');
        $age_to = (int) cmsCore::getSearchVar('ageto', 'all');
        $age_fr = (int) cmsCore::getSearchVar('agefrom', 'all');
        $group_id = cmsCore::request('group_id', 'int', 0);
        // Флаг о показе только онлайн пользователей
        if (cmsCore::inRequest('online')) {
            cmsUser::sessionPut('usr_online', (bool) cmsCore::request('online', 'int'));
            $page = 1;
        }
        $only_online = cmsUser::sessionGet('usr_online');
        if ($only_online) {
            $stext[] = $_LANG['SHOWING_ONLY_ONLINE'];
        }
        ///////////////////////////////////////
        //////////Условия выборки//////////////
        ///////////////////////////////////////
        // группа
        if ($group_id) {
            $model->whereUserGroupIs($group_id);
            $link['group'] = '/users/group/' . $group_id;
            $_LANG['GROUP_SEARCH_NAME'] = cmsUser::getGroupTitle($group_id);
        }
        // Добавляем в выборку имя, если оно есть
        if ($name) {
            $model->whereNameIs($name);
            $stext[] = $_LANG['NAME'] . " — " . htmlspecialchars(stripslashes($name));
        }
        // Добавляем в выборку город, если он есть
        if ($city) {
            $model->whereCityIs($city);
            $stext[] = $_LANG['CITY'] . " — " . htmlspecialchars(stripslashes($city));
        }
        // Добавляем в выборку хобби, если есть
        if ($hobby) {
            $model->whereHobbyIs($hobby);
            $stext[] = $_LANG['HOBBY'] . " — " . htmlspecialchars(stripslashes($hobby));
        }
        // Добавляем в выборку пол, если есть
        if ($gender) {
            $model->whereGenderIs($gender);
            if ($gender == 'm') {
                $stext[] = $_LANG['MALE'];
            } else {
                $stext[] = $_LANG['FEMALE'];
            }
        }
        // Добавляем в выборку возраст, более
        if ($age_fr) {
            $model->whereAgeFrom($age_fr);
            $stext[] = $_LANG['NOT_YOUNG'] . " {$age_fr} " . $_LANG['YEARS'];
        }
        // Добавляем в выборку возраст, менее
        if ($age_to) {
            $model->whereAgeTo($age_to);
            $stext[] = $_LANG['NOT_OLD'] . " {$age_fr} " . $_LANG['YEARS'];
        }
        // Считаем общее количество согласно выборки
        $total = $model->getUsersCount($only_online);
        if ($total) {
            //устанавливаем сортировку
            $inDB->orderBy($orderby, $orderto);
            //устанавливаем номер текущей страницы и кол-во пользователей на странице
            $inDB->limitPage($page, $model->config['users_perpage']);
            // Загружаем пользователей согласно выборки
            $users = $model->getUsers($only_online);
        } else {
            $inDB->resetConditions();
        }
        $link['latest'] = '/users';
        $link['positive'] = '/users/positive.html';
        $link['rating'] = '/users/rating.html';
        if ($orderby == 'regdate') {
            $link['selected'] = 'latest';
        }
        if ($orderby == 'karma') {
            $link['selected'] = 'positive';
        }
        if ($orderby == 'rating') {
            $link['selected'] = 'rating';
        }
        $pagebar_link = '/users/' . $link['selected'] . '%page%.html';
        if ($group_id) {
            $link['selected'] = 'group';
            $pagebar_link = '/users/' . $link['selected'] . '/' . $group_id . '-%page%';
        }
        cmsPage::initTemplate('components', 'com_users_view')->assign('stext', $stext)->assign('orderby', $orderby)->assign('orderto', $orderto)->assign('users', $users)->assign('total', $total)->assign('only_online', $only_online)->assign('gender', $gender)->assign('name', stripslashes($name))->assign('city', stripslashes($city))->assign('hobby', stripslashes($hobby))->assign('age_to', $age_to)->assign('age_fr', $age_fr)->assign('cfg', $model->config)->assign('link', $link)->assign('pagebar', cmsPage::getPagebar($total, $page, $model->config['users_perpage'], $pagebar_link))->display('com_users_view.tpl');
    }
    //============================================================================//
    //======================= Редактирование профиля  ============================//
    //============================================================================//
    if ($do == 'editprofile') {
        // неавторизованным, не владельцам и не админам тут делать нечего
        if (!$inUser->id || $inUser->id != $id && !$inUser->is_admin) {
            cmsCore::error404();
        }
        $usr = $model->getUser($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $opt = cmsCore::request('opt', 'str', 'edit');
        // главного админа может редактировать только он сам
        if ($id == 1 && $inUser->id != $id) {
            cmsCore::error404();
        }
        // показываем форму
        if ($opt == 'edit') {
            $inPage->setTitle($_LANG['CONFIG_PROFILE'] . ' - ' . $usr['nickname']);
            $inPage->addPathway($usr['nickname'], cmsUser::getProfileURL($usr['login']));
            $inPage->addPathway($_LANG['CONFIG_PROFILE']);
            $private_forms = array();
            if (isset($model->config['privforms'])) {
                if (is_array($model->config['privforms'])) {
                    foreach ($model->config['privforms'] as $form_id) {
                        $private_forms = array_merge($private_forms, cmsForm::getFieldsHtml($form_id, $usr['formsdata']));
                    }
                }
            }
            cmsPage::initTemplate('components', 'com_users_edit_profile')->assign('opt', $opt)->assign('usr', $usr)->assign('private_forms', $private_forms)->assign('cfg_forum', $inCore->loadComponentConfig('forum'))->assign('cfg', $model->config)->display('com_users_edit_profile.tpl');
            return;
        }
        // Если сохраняем профиль
        if ($opt == 'save') {
            if (!cmsUser::checkCsrfToken()) {
                cmsCore::error404();
            }
            $errors = false;
            $users['nickname'] = cmsCore::request('nickname', 'str');
            if (mb_strlen($users['nickname']) < 2) {
                cmsCore::addSessionMessage($_LANG['SHORT_NICKNAME'], 'error');
                $errors = true;
            }
            cmsCore::loadModel('registration');
            $modreg = new cms_model_registration();
            if (!$inUser->is_admin) {
                if ($modreg->getBadNickname($users['nickname'])) {
                    cmsCore::addSessionMessage($_LANG['ERR_NICK_EXISTS'], 'error');
                    $errors = true;
                }
            }
            $profiles['gender'] = cmsCore::request('gender', 'str');
            $profiles['city'] = cmsCore::request('city', 'str');
            if (mb_strlen($profiles['city']) > 50) {
                cmsCore::addSessionMessage($_LANG['LONG_CITY_NAME'], 'error');
                $errors = true;
            }
            $users['email'] = cmsCore::request('email', 'email');
            if (!$users['email']) {
                cmsCore::addSessionMessage($_LANG['REALY_ADRESS_EMAIL'], 'error');
                $errors = true;
            }
            if ($usr['email'] != $users['email']) {
                $is_set_email = $inDB->get_field('cms_users', "email='{$users['email']}'", 'id');
                if ($is_set_email) {
                    cmsCore::addSessionMessage($_LANG['ADRESS_EMAIL_IS_BUSY'], 'error');
                    $errors = true;
                } else {
                    // формируем токен
                    $token = md5($usr['email'] . uniqid() . microtime());
                    $inDB->insert('cms_users_activate', array('user_id' => $inUser->id, 'pubdate' => date("Y-m-d H:i:s"), 'code' => $token));
                    $codelink = HOST . '/users/change_email/' . $token . '/' . $users['email'];
                    // по старому адресу высылаем письмо с подтверждением
                    $letter = cmsCore::getLanguageTextFile('change_email');
                    $letter = str_replace(array('{nickname}', '{codelink}'), array($inUser->nickname, $codelink), $letter);
                    cmsCore::mailText($usr['email'], '', $letter);
                    cmsCore::addSessionMessage(sprintf($_LANG['YOU_CHANGE_EMAIL'], $usr['email']), 'info');
                    // email не меняем
                    $users['email'] = $usr['email'];
                }
            }
            $profiles['showphone'] = cmsCore::request('showphone', 'int', 0);
            $profiles['showmail'] = cmsCore::request('showmail', 'int');
            $profiles['email_newmsg'] = cmsCore::request('email_newmsg', 'int');
            $profiles['showbirth'] = cmsCore::request('showbirth', 'int');
            $profiles['description'] = cmsCore::request('description', 'str', '');
            $users['birthdate'] = (int) $_REQUEST['birthdate']['year'] . '-' . (int) $_REQUEST['birthdate']['month'] . '-' . (int) $_REQUEST['birthdate']['day'];
            $profiles['signature'] = $inDB->escape_string(cmsCore::badTagClear(cmsCore::request('signature', 'html', '')));
            $profiles['signature_html'] = $inDB->escape_string(cmsCore::parseSmiles(cmsCore::request('signature', 'html', ''), true));
            $profiles['allow_who'] = cmsCore::request('allow_who', 'str');
            if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['allow_who'])) {
                $errors = true;
            }
            $users['icq'] = cmsCore::request('icq', 'str', '');
            $profiles['showicq'] = cmsCore::request('showicq', 'int');
            $profiles['cm_subscribe'] = cmsCore::request('cm_subscribe', 'str');
            if (!preg_match('/^([a-zA-Z]+)$/ui', $profiles['cm_subscribe'])) {
                $errors = true;
            }
            $users['phone'] = cmsCore::request('phone', 'int', 0);
            // получаем данные форм
            $profiles['formsdata'] = '';
            if (isset($model->config['privforms'])) {
                if (is_array($model->config['privforms'])) {
                    foreach ($model->config['privforms'] as $form_id) {
                        $form_input = cmsForm::getFieldsInputValues($form_id);
                        $profiles['formsdata'] .= $inDB->escape_string(cmsCore::arrayToYaml($form_input['values']));
                        // Проверяем значения формы
                        foreach ($form_input['errors'] as $field_error) {
                            if ($field_error) {
                                cmsCore::addSessionMessage($field_error, 'error');
                                $errors = true;
                            }
                        }
                    }
                }
            }
            if ($errors) {
                cmsCore::redirectBack();
            }
            $inDB->update('cms_user_profiles', cmsCore::callEvent('UPDATE_USER_PROFILES', array_merge(array('id' => $usr['pid'], 'user_id' => $usr['id']), $profiles)), $usr['pid']);
            $inDB->update('cms_users', cmsCore::callEvent('UPDATE_USER_USERS', array_merge(array('id' => $usr['id']), $users)), $usr['id']);
            cmsCore::addSessionMessage($_LANG['PROFILE_SAVED'], 'info');
            cmsCore::redirect(cmsUser::getProfileURL($usr['login']));
        }
        if ($opt == 'changepass') {
            $errors = false;
            $oldpass = cmsCore::request('oldpass', 'str');
            $newpass = cmsCore::request('newpass', 'str');
            $newpass2 = cmsCore::request('newpass2', 'str');
            if ($inUser->password != md5($oldpass)) {
                cmsCore::addSessionMessage($_LANG['OLD_PASS_WRONG'], 'error');
                $errors = true;
            }
            if ($newpass != $newpass2) {
                cmsCore::addSessionMessage($_LANG['WRONG_PASS'], 'error');
                $errors = true;
            }
            if ($oldpass && $newpass && $newpass2 && mb_strlen($newpass) < 6) {
                cmsCore::addSessionMessage($_LANG['PASS_SHORT'], 'error');
                $errors = true;
            }
            if ($errors) {
                cmsCore::redirectBack();
            }
            cmsCore::callEvent('UPDATE_USER_PASSWORD', array('user_id' => $usr['id'], 'oldpass' => $oldpass, 'newpass' => $newpass));
            $sql = "UPDATE cms_users SET password='******' WHERE id = '{$id}' AND password='******'";
            $inDB->query($sql);
            cmsCore::addSessionMessage($_LANG['PASS_CHANGED'], 'info');
            cmsCore::redirect(cmsUser::getProfileURL($inUser->login));
        }
    }
    //============================================================================//
    //============================= Просмотр профиля  ============================//
    //============================================================================//
    if ($do == 'profile') {
        $inPage->addHeadJsLang(array('NEW_POST_ON_WALL', 'CONFIRM_DEL_POST_ON_WALL'));
        // если просмотр профиля гостям запрещен
        if (!$inUser->id && !$model->config['sw_guest']) {
            cmsUser::goToLogin();
        }
        if (is_numeric($login)) {
            cmsCore::error404();
        }
        $usr = $model->getUser($login);
        if (!$usr) {
            cmsCore::error404();
        }
        $myprofile = $inUser->id == $usr['id'];
        $inPage->setTitle($usr['nickname']);
        $inPage->addPathway($usr['nickname']);
        // просмотр профиля запрещен
        if (!cmsUser::checkUserContentAccess($usr['allow_who'], $usr['id'])) {
            cmsPage::initTemplate('components', 'com_users_not_allow')->assign('is_auth', $inUser->id)->assign('usr', $usr)->display('com_users_not_allow.tpl');
            return;
        }
        // Профиль удален
        if ($usr['is_deleted']) {
            cmsPage::initTemplate('components', 'com_users_deleted.tpl')->assign('usr', $usr)->assign('is_admin', $inUser->is_admin)->assign('others_active', $inDB->rows_count('cms_users', "login='******'login']}' AND is_deleted=0", 1))->display('com_users_deleted.tpl');
            return;
        }
        // Данные о друзьях
        $usr['friends_total'] = cmsUser::getFriendsCount($usr['id']);
        $usr['friends'] = cmsUser::getFriends($usr['id']);
        // очищать сессию друзей если в своем профиле и количество друзей из базы не совпадает с количеством друзей в сессии
        if ($myprofile && sizeof($usr['friends']) != $usr['friends_total']) {
            cmsUser::clearSessionFriends();
        }
        // обрезаем список
        $usr['friends'] = array_slice($usr['friends'], 0, 6);
        // выясняем друзья ли мы с текущим пользователем
        $usr['isfriend'] = !$myprofile ? cmsUser::isFriend($usr['id']) : false;
        // награды пользователя
        $usr['awards'] = $model->config['sw_awards'] ? $model->getUserAwards($usr['id']) : false;
        // стена
        if ($model->config['sw_wall']) {
            $inDB->limitPage(1, $model->config['wall_perpage']);
            $usr['wall_html'] = cmsUser::getUserWall($usr['id'], 'users', $myprofile, $inUser->is_admin);
        }
        // можно ли пользователю изменять карму
        $usr['can_change_karma'] = $model->isUserCanChangeKarma($usr['id']) && $inUser->id;
        // Фотоальбомы пользователя
        if ($model->config['sw_photo']) {
            $usr['albums'] = $model->getPhotoAlbums($usr['id'], $usr['isfriend'], !$inCore->isComponentEnable('photos'));
            $usr['albums_total'] = sizeof($usr['albums']);
            $usr['albums_show'] = 6;
            if ($usr['albums_total'] > $usr['albums_show']) {
                array_splice($usr['albums'], $usr['albums_show']);
            }
        }
        $usr['board_count'] = $model->config['sw_board'] ? $inDB->rows_count('cms_board_items', "user_id='{$usr['id']}' AND published=1") : 0;
        $usr['comments_count'] = $model->config['sw_comm'] ? $inDB->rows_count('cms_comments', "user_id='{$usr['id']}' AND published=1") : 0;
        $usr['forum_count'] = $model->config['sw_forum'] ? $inDB->rows_count('cms_forum_posts', "user_id = '{$usr['id']}'") : 0;
        $usr['files_count'] = $model->config['sw_files'] ? $inDB->rows_count('cms_user_files', "user_id = '{$usr['id']}'") : 0;
        $cfg_reg = $inCore->loadComponentConfig('registration');
        $usr['invites_count'] = $inUser->id && $myprofile && $cfg_reg['reg_type'] == 'invite' ? $model->getUserInvitesCount($inUser->id) : 0;
        $usr['blog'] = $model->config['sw_blogs'] ? $inDB->get_fields('cms_blogs', "user_id = '{$usr['id']}' AND owner = 'user'", 'title, seolink') : false;
        $usr['form_fields'] = array();
        if (is_array($model->config['privforms'])) {
            foreach ($model->config['privforms'] as $form_id) {
                $usr['form_fields'] = array_merge($usr['form_fields'], cmsForm::getFieldsValues($form_id, $usr['formsdata']));
            }
        }
        if ($usr['city']) {
            cmsCore::loadModel('geo');
            $geo = new cms_model_geo();
            $city_parents = $geo->getCityParents($usr['city']);
            if ($city_parents) {
                $usr['country'] = $city_parents['country_name'];
            }
        }
        $plugins = $model->getPluginsOutput($usr);
        cmsPage::initTemplate('components', 'com_users_profile.tpl')->assign('usr', $usr)->assign('plugins', $plugins)->assign('cfg', $model->config)->assign('myprofile', $myprofile)->assign('cfg_forum', $inCore->loadComponentConfig('forum'))->assign('is_admin', $inUser->is_admin)->assign('is_auth', $inUser->id)->display('com_users_profile.tpl');
    }
    //============================================================================//
    //============================= Список сообщений  ============================//
    //============================================================================//
    if ($do == 'messages') {
        if (!$model->config['sw_msg']) {
            cmsCore::error404();
        }
        if (!$inUser->id || $inUser->id != $id && !$inUser->is_admin) {
            cmsUser::goToLogin();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $inPage->setTitle($_LANG['MY_MESS']);
        $inPage->addPathway($usr['nickname'], cmsUser::getProfileURL($usr['login']));
        $inPage->addPathway($_LANG['MY_MESS'], '/users/' . $id . '/messages.html');
        include 'components/users/messages.php';
    }
    //============================================================================//
    //=========================== Отправка сообщения  ============================//
    //============================================================================//
    if ($do == 'sendmessage') {
        if (!$model->config['sw_msg']) {
            cmsCore::halt();
        }
        if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
            cmsCore::halt();
        }
        if (!$inUser->id || $inUser->id == $id && !cmsCore::inRequest('massmail') && !cmsCore::request('send_to_group', 'int', 0)) {
            cmsCore::halt();
        }
        if (!cmsCore::inRequest('gosend')) {
            $replyid = cmsCore::request('replyid', 'int', 0);
            if ($replyid) {
                $msg = $model->getReplyMessage($replyid, $inUser->id);
                if (!$msg) {
                    cmsCore::halt();
                }
            }
            $inPage->setRequestIsAjax();
            cmsPage::initTemplate('components', 'com_users_messages_add')->assign('msg', isset($msg) ? $msg : array())->assign('is_reply_user', $replyid)->assign('id', $id)->assign('bbcodetoolbar', cmsPage::getBBCodeToolbar('message'))->assign('smilestoolbar', cmsPage::getSmilesPanel('message'))->assign('groups', $inUser->is_admin ? cmsUser::getGroups(true) : array())->assign('friends', cmsUser::getFriends($inUser->id))->assign('id_admin', $inUser->is_admin)->display('com_users_messages_add.tpl');
            cmsCore::jsonOutput(array('error' => false, 'html' => ob_get_clean()));
        }
        if (cmsCore::inRequest('gosend')) {
            // Кому отправляем
            $usr = cmsUser::getShortUserData($id);
            if (!$usr) {
                cmsCore::halt();
            }
            $message = cmsCore::parseSmiles(cmsCore::request('message', 'html', ''), true);
            if (mb_strlen($message) < 2) {
                cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_SEND_MESS']));
            }
            if (!cmsUser::checkCsrfToken()) {
                cmsCore::error404();
            }
            $output = cmsCore::callEvent('USER_SEND_MESSEDGE', array('text' => $message, 'to_id' => $id));
            $message = $output['text'];
            $id = $output['to_id'];
            $send_to_group = cmsCore::request('send_to_group', 'int', 0);
            $group_id = cmsCore::request('group_id', 'int', 0);
            //
            // Обычная отправка (1 получатель)
            //
            if (!cmsCore::inRequest('massmail') && !$send_to_group) {
                //отправляем сообщение
                $msg_id = cmsUser::sendMessage($inUser->id, $id, $message);
                // отправляем уведомление на email если нужно
                $model->sendNotificationByEmail($id, $inUser->id, $msg_id);
                cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['SEND_MESS_OK']));
            }
            //
            // далее идут массовые рассылки, доступные только админам
            //
            if (!$inUser->is_admin) {
                cmsCore::halt();
            }
            // отправить всем: получаем список всех пользователей
            if (cmsCore::inRequest('massmail')) {
                $userlist = cmsUser::getAllUsers();
                // проверяем что есть кому отправлять
                if (!$userlist) {
                    cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['ERR_SEND_MESS']));
                }
                $count = array();
                // отправляем всем по списку
                foreach ($userlist as $usr) {
                    $count[] = cmsUser::sendMessage(USER_MASSMAIL, $usr['id'], $message);
                }
                cmsCore::jsonOutput(array('error' => false, 'text' => sprintf($_LANG['SEND_MESS_ALL_OK'], sizeof($count))));
            }
            // отправить группе: получаем список членов группы
            if ($send_to_group) {
                $count = cmsUser::sendMessageToGroup(USER_MASSMAIL, $group_id, $message);
                $success_msg = sprintf($_LANG['SEND_MESS_GROUP_OK'], $count, cmsUser::getGroupTitle($group_id));
                cmsCore::jsonOutput(array('error' => false, 'text' => $success_msg));
            }
        }
    }
    //============================================================================//
    //============================= Удаление сообщения  ==========================//
    //============================================================================//
    if ($do == 'delmessage') {
        if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
            cmsCore::halt();
        }
        if (!$model->config['sw_msg']) {
            cmsCore::halt();
        }
        if (!$inUser->id) {
            cmsCore::halt();
        }
        $msg = $inDB->get_fields('cms_user_msg', "id='{$id}'", '*');
        if (!$msg) {
            cmsCore::halt();
        }
        $can_delete = $inUser->id == $msg['to_id'] || $inUser->id == $msg['from_id'] ? true : false;
        if (!$can_delete && !$inUser->is_admin) {
            cmsCore::halt();
        }
        // Сообщения с from_id < 0
        if ($msg['from_id'] < 0) {
            $inDB->query("DELETE FROM cms_user_msg WHERE id = '{$id}' LIMIT 1");
            $info_text = $_LANG['MESS_NOTICE_DEL_OK'];
        }
        // мне сообщение от пользователя
        if ($msg['to_id'] == $inUser->id && $msg['from_id'] > 0) {
            $inDB->query("UPDATE cms_user_msg SET to_del=1 WHERE id='{$id}'");
            $info_text = $_LANG['MESS_DEL_OK'];
        }
        // от меня сообщение
        if ($msg['from_id'] == $inUser->id && !$msg['is_new']) {
            $inDB->query("UPDATE cms_user_msg SET from_del=1 WHERE id='{$id}'");
            $info_text = $_LANG['MESS_DEL_OK'];
        }
        // отзываем сообщение
        if ($msg['from_id'] == $inUser->id && $msg['is_new']) {
            $inDB->query("DELETE FROM cms_user_msg WHERE id = '{$id}' LIMIT 1");
            $info_text = $_LANG['MESS_BACK_OK'];
        }
        // удаляем сообщения, которые удалены с двух сторон
        $inDB->query("DELETE FROM cms_user_msg WHERE to_del=1 AND from_del=1");
        cmsCore::jsonOutput(array('error' => false, 'text' => $info_text));
    }
    //============================================================================//
    //=========================== Удаление сообщений  ============================//
    //============================================================================//
    if ($do == 'delmessages') {
        if (!$model->config['sw_msg']) {
            cmsCore::error404();
        }
        if ($inUser->id != $id && !$inUser->is_admin) {
            cmsCore::error404();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $opt = cmsCore::request('opt', 'str', 'in');
        if ($opt == 'notices') {
            $inDB->query("DELETE FROM cms_user_msg WHERE to_id = '{$id}' AND from_id < 0");
        } else {
            $del_flag = $opt == 'in' ? 'to_del' : 'from_del';
            $id_flag = $opt == 'in' ? 'to_id' : 'from_id';
            $inDB->query("UPDATE cms_user_msg SET {$del_flag}=1 WHERE {$id_flag}='{$id}'");
            $inDB->query("DELETE FROM cms_user_msg WHERE to_del=1 AND from_del=1");
        }
        cmsCore::addSessionMessage($_LANG['MESS_ALL_DEL_OK'], 'info');
        cmsCore::redirectBack();
    }
    //============================================================================//
    //============================= Загрузка аватара  ============================//
    //============================================================================//
    if ($do == 'avatar') {
        if (!$inUser->id || $inUser->id && $inUser->id != $id) {
            cmsCore::error404();
        }
        $inPage->setTitle($_LANG['LOAD_AVATAR']);
        $inPage->addPathway($inUser->nickname, cmsUser::getProfileURL($inUser->login));
        $inPage->addPathway($_LANG['LOAD_AVATAR']);
        if (cmsCore::inRequest('upload')) {
            cmsCore::loadClass('upload_photo');
            $inUploadPhoto = cmsUploadPhoto::getInstance();
            // Выставляем конфигурационные параметры
            $inUploadPhoto->upload_dir = PATH . '/images/';
            $inUploadPhoto->dir_medium = 'users/avatars/';
            $inUploadPhoto->dir_small = 'users/avatars/small/';
            $inUploadPhoto->small_size_w = $model->config['smallw'];
            $inUploadPhoto->medium_size_w = $model->config['medw'];
            $inUploadPhoto->medium_size_h = $model->config['medh'];
            $inUploadPhoto->is_watermark = false;
            $inUploadPhoto->input_name = 'picture';
            $file = $inUploadPhoto->uploadPhoto($inUser->orig_imageurl);
            if (!$file) {
                cmsCore::addSessionMessage('<strong>' . $_LANG['ERROR'] . ':</strong> ' . cmsCore::uploadError() . '!', 'error');
                cmsCore::redirect('/users/' . $id . '/avatar.html');
            }
            $sql = "UPDATE cms_user_profiles SET imageurl = '{$file['filename']}' WHERE user_id = '{$id}' LIMIT 1";
            $inDB->query($sql);
            // очищаем предыдущую запись о смене аватара
            cmsActions::removeObjectLog('add_avatar', $id);
            // выводим сообщение в ленту
            cmsActions::log('add_avatar', array('object' => '', 'object_url' => '', 'object_id' => $id, 'target' => '', 'target_url' => '', 'description' => '<a href="' . cmsUser::getProfileURL($inUser->login) . '" class="act_usr_ava">
								   <img border="0" src="/images/users/avatars/small/' . $file['filename'] . '">
								</a>'));
            cmsCore::redirect(cmsUser::getProfileURL($inUser->login));
        } else {
            cmsPage::initTemplate('components', 'com_users_avatar_upload')->assign('id', $id)->display('com_users_avatar_upload.tpl');
        }
    }
    //============================================================================//
    //============================= Библиотека аватаров  =========================//
    //============================================================================//
    if ($do == 'select_avatar') {
        if (!$inUser->id || $inUser->id && $inUser->id != $id) {
            cmsCore::error404();
        }
        $avatars_dir = PATH . "/images/users/avatars/library";
        $avatars_dir_rel = "/images/users/avatars/library";
        $avatars_dir_handle = opendir($avatars_dir);
        $avatars = array();
        while ($nextfile = readdir($avatars_dir_handle)) {
            if ($nextfile != '.' && $nextfile != '..' && (mb_strstr($nextfile, '.gif') || mb_strstr($nextfile, '.jpg') || mb_strstr($nextfile, '.jpeg') || mb_strstr($nextfile, '.png'))) {
                $avatars[] = $nextfile;
            }
        }
        closedir($avatars_dir_handle);
        if (!cmsCore::inRequest('set_avatar')) {
            $inPage->setTitle($_LANG['SELECT_AVATAR']);
            $inPage->addPathway($inUser->nickname, cmsUser::getProfileURL($inUser->login));
            $inPage->addPathway($_LANG['SELECT_AVATAR']);
            $perpage = 20;
            $total = sizeof($avatars);
            $avatars = array_slice($avatars, ($page - 1) * $perpage, $perpage);
            cmsPage::initTemplate('components', 'com_users_avatars')->assign('userid', $id)->assign('avatars', $avatars)->assign('avatars_dir', $avatars_dir_rel)->assign('page', $page)->assign('perpage', $perpage)->assign('pagebar', cmsPage::getPagebar($total, $page, $perpage, '/users/%user_id%/select-avatar-%page%.html', array('user_id' => $id)))->display('com_users_avatars.tpl');
        } else {
            $avatar_id = cmsCore::request('avatar_id', 'int', 0);
            $file = $avatars[$avatar_id];
            if (file_exists($avatars_dir . '/' . $file)) {
                $uploaddir = PATH . '/images/users/avatars/';
                $realfile = $file;
                $filename = md5($realfile . '-' . $id . '-' . time()) . '.jpg';
                $uploadfile = $avatars_dir . '/' . $realfile;
                $uploadavatar = $uploaddir . $filename;
                $uploadthumb = $uploaddir . 'small/' . $filename;
                if ($inUser->orig_imageurl && $inUser->orig_imageurl != 'nopic.jpg') {
                    @unlink(PATH . '/images/users/avatars/' . $inUser->orig_imageurl);
                    @unlink(PATH . '/images/users/avatars/small/' . $inUser->orig_imageurl);
                }
                cmsCore::includeGraphics();
                copy($uploadfile, $uploadavatar);
                @img_resize($uploadfile, $uploadthumb, $model->config['smallw'], $model->config['smallw']);
                $sql = "UPDATE cms_user_profiles SET imageurl = '{$filename}' WHERE user_id = '{$id}' LIMIT 1";
                $inDB->query($sql);
                // очищаем предыдущую запись о смене аватара
                cmsActions::removeObjectLog('add_avatar', $id);
                // выводим сообщение в ленту
                cmsActions::log('add_avatar', array('object' => '', 'object_url' => '', 'object_id' => $id, 'target' => '', 'target_url' => '', 'description' => '<a href="' . cmsUser::getProfileURL($inUser->login) . '" class="act_usr_ava">
										<img border="0" src="/images/users/avatars/small/' . $filename . '">
									</a>'));
            }
            cmsCore::redirect(cmsUser::getProfileURL($inUser->login));
        }
    }
    //============================================================================//
    //======================== Работа с фотографиями  ============================//
    //============================================================================//
    if ($do == 'photos') {
        if (!$model->config['sw_photo']) {
            cmsCore::error404();
        }
        $pdo = cmsCore::request('pdo', 'str', '');
        include 'components/users/photos.php';
    }
    //============================================================================//
    //============================= Друзья пользователя  =========================//
    //============================================================================//
    if ($do == 'friendlist') {
        if (!$inUser->id) {
            cmsUser::goToLogin();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $perpage = 10;
        $inPage->addPathway($usr['nickname'], cmsUser::getProfileURL($usr['login']));
        $inPage->addPathway($_LANG['FRIENDS']);
        $inPage->setTitle($_LANG['FRIENDS']);
        // все друзья
        $friends = cmsUser::getFriends($usr['id']);
        // их общее количество
        $total = count($friends);
        // получаем только нужных на странице
        $friends = array_slice($friends, ($page - 1) * $perpage, $perpage);
        cmsPage::initTemplate('components', 'com_users_friends')->assign('friends', $friends)->assign('usr', $usr)->assign('myprofile', $id == $inUser->id)->assign('total', $total)->assign('pagebar', cmsPage::getPagebar($total, $page, $perpage, 'javascript:centerLink(\'/users/' . $id . '/friendlist%page%.html\')'))->display('com_users_friends.tpl');
    }
    //============================================================================//
    //============================= Запрос на дружбу  ============================//
    //============================================================================//
    if ($do == 'addfriend') {
        if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
            cmsCore::halt();
        }
        if (!$inUser->id || $inUser->id == $id) {
            cmsCore::halt();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::halt();
        }
        cmsUser::clearSessionFriends();
        if (cmsUser::isFriend($id)) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['YOU_ARE_BE_FRIENDS']));
        }
        // проверяем был ли ранее запрос на дружбу
        // если был, то делаем accept запросу
        $is_need_accept_id = cmsUser::getFriendFieldId($id, 0, 'to_me');
        if ($is_need_accept_id) {
            $inDB->query("UPDATE cms_user_friends SET is_accepted = 1 WHERE id = '{$is_need_accept_id}'");
            //регистрируем событие
            cmsActions::log('add_friend', array('object' => $inUser->nickname, 'user_id' => $usr['id'], 'object_url' => cmsUser::getProfileURL($inUser->login), 'object_id' => $is_need_accept_id, 'target' => '', 'target_url' => '', 'target_id' => 0, 'description' => ''));
            cmsCore::callEvent('USER_ACCEPT_FRIEND', $id);
            cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['ADD_FRIEND_OK'] . $usr['nickname']));
        }
        // Если пользователь пытается добавиться в друзья к
        // пользователю, к которому уже отправил запрос
        if (cmsUser::getFriendFieldId($id, 0, 'from_me')) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ADD_TO_FRIEND_SEND_ERR']));
        }
        // Мы вообще не друзья с пользователем, создаем запрос
        cmsUser::addFriend($id);
        cmsUser::sendMessage(USER_UPDATER, $id, sprintf($_LANG['RECEIVED_F_O'], cmsUser::getProfileLink($inUser->login, $inUser->nickname), '<a class="ajaxlink" href="javascript:void(0)" onclick="users.acceptFriend(' . $inUser->id . ', this);return false;">' . $_LANG['ACCEPT'] . '</a>', '<a class="ajaxlink" href="javascript:void(0)" onclick="users.rejectFriend(' . $inUser->id . ', this);return false;">' . $_LANG['REJECT'] . '</a>'));
        cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['ADD_TO_FRIEND_SEND']));
    }
    //============================================================================//
    //============================= Прекращение дружбы  ==========================//
    //============================================================================//
    if ($do == 'delfriend') {
        if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
            cmsCore::halt();
        }
        if (!$inUser->id || $inUser->id == $id) {
            cmsCore::halt();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        if (cmsUser::getFriendFieldId($id)) {
            $is_accepted_friend = cmsUser::isFriend($id);
            if (cmsUser::deleteFriend($id)) {
                // Если подтвержденный друг
                if ($is_accepted_friend) {
                    cmsCore::jsonOutput(array('error' => false, 'text' => $usr['nickname'] . $_LANG['DEL_FRIEND']));
                } else {
                    cmsCore::jsonOutput(array('error' => false, 'text' => $_LANG['REJECT_FRIEND'] . $usr['nickname']));
                }
            } else {
                cmsCore::halt();
            }
        } else {
            cmsCore::halt();
        }
    }
    //============================================================================//
    //============================= История кармы  ===============================//
    //============================================================================//
    if ($do == 'karma') {
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $inPage->setTitle($_LANG['KARMA_HISTORY']);
        $inPage->addPathway($usr['nickname'], cmsUser::getProfileURL($usr['login']));
        $inPage->addPathway($_LANG['KARMA_HISTORY']);
        cmsPage::initTemplate('components', 'com_users_karma')->assign('karma', $model->getUserKarma($usr['id']))->assign('usr', $usr)->display('com_users_karma.tpl');
    }
    //============================================================================//
    //============================= Изменение кармы  =============================//
    //============================================================================//
    if ($do == 'votekarma') {
        if ($_SERVER['HTTP_X_REQUESTED_WITH'] != 'XMLHttpRequest') {
            cmsCore::halt();
        }
        if (!$inUser->id) {
            cmsCore::halt();
        }
        $points = cmsCore::request('sign', 'str', 'plus') == 'plus' ? 1 : -1;
        $to = cmsCore::request('to', 'int', 0);
        $user = cmsUser::getShortUserData($to);
        if (!$user) {
            cmsCore::halt();
        }
        if (!$model->isUserCanChangeKarma($to)) {
            cmsCore::halt();
        }
        cmsCore::halt(cmsUser::changeKarmaUser($to, $points));
    }
    //============================================================================//
    //======================= Наградить пользователя  ============================//
    //============================================================================//
    if ($do == 'giveaward') {
        if (!$inUser->is_admin) {
            cmsCore::error404();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $inPage->setTitle($_LANG['AWARD_USER']);
        $inPage->addPathway($usr['nickname'], cmsUser::getProfileURL($usr['login']));
        $inPage->addPathway($_LANG['AWARD']);
        if (!cmsCore::inRequest('gosend')) {
            cmsPage::initTemplate('components', 'com_users_awards_give')->assign('usr', $usr)->assign('awardslist', cmsUser::getAwardsImages())->display('com_users_awards_give.tpl');
        } else {
            $award['title'] = cmsCore::request('title', 'str', $_LANG['AWRD']);
            $award['description'] = cmsCore::request('description', 'str', '');
            $award['imageurl'] = cmsCore::request('imageurl', 'str', '');
            $award['from_id'] = $inUser->id;
            $award['id'] = 0;
            cmsUser::giveAward($award, $id);
            cmsCore::redirect(cmsUser::getProfileURL($usr['login']));
        }
    }
    //============================================================================//
    //============================= Удаление награды  ============================//
    //============================================================================//
    if ($do == 'delaward') {
        $aw = $inDB->get_fields('cms_user_awards', "id = '{$id}'", '*');
        if (!$aw) {
            cmsCore::error404();
        }
        if (!$inUser->id || $inUser->id != $aw['user_id'] && !$inUser->is_admin) {
            cmsCore::error404();
        }
        $inDB->delete('cms_user_awards', "id = '{$id}'", 1);
        cmsActions::removeObjectLog('add_award', $id);
        cmsCore::redirectBack();
    }
    //============================================================================//
    //============================= Награды на сайте  ============================//
    //============================================================================//
    if ($do == 'awardslist') {
        $inPage->setTitle($_LANG['SITE_AWARDS']);
        $inPage->addPathway($_LANG['SITE_AWARDS']);
        $awards = cmsUser::getAutoAwards();
        if (!$awards) {
            cmsCore::error404();
        }
        foreach ($awards as $aw) {
            //Перебираем все награды и ищем пользователей с текущей наградой
            $sql = "SELECT u.id as id, u.nickname as nickname, u.login as login, IFNULL(p.gender, 'm') as gender\r\n                 FROM cms_user_awards aw\r\n                 LEFT JOIN cms_users u ON u.id = aw.user_id\r\n                 LEFT JOIN cms_user_profiles p ON p.user_id = u.id\r\n                 WHERE aw.award_id = '{$aw['id']}'";
            $rs = $inDB->query($sql);
            $aw['uhtml'] = '';
            if ($inDB->num_rows($rs)) {
                while ($user = $inDB->fetch_assoc($rs)) {
                    $aw['uhtml'] .= cmsUser::getGenderLink($user['id'], $user['nickname'], $user['gender'], $user['login']) . ', ';
                }
                $aw['uhtml'] = rtrim($aw['uhtml'], ', ');
            } else {
                $aw['uhtml'] = $_LANG['NOT_USERS_WITH_THIS_AWARD'];
            }
            $aws[] = $aw;
        }
        cmsPage::initTemplate('components', 'com_users_awards_site')->assign('aws', $aws)->display('com_users_awards_site.tpl');
    }
    //============================================================================//
    //============================= Удаление профиля  ============================//
    //============================================================================//
    if ($do == 'delprofile') {
        // неавторизованным тут делать нечего
        if (!$inUser->id) {
            cmsCore::error404();
        }
        // есть ли удаляемый профиль
        $data = cmsUser::getShortUserData($id);
        if (!$data) {
            cmsCore::error404();
        }
        // владелец профиля или админ
        if ($inUser->is_admin) {
            // могут ли администраторы удалять профиль
            if (!cmsUser::isAdminCan('admin/users', cmsUser::getAdminAccess())) {
                cmsCore::error404();
            }
            // администратор сам себя не удалит
            if ($inUser->id == $data['id']) {
                cmsCore::error404();
            }
        } else {
            // удаляем только свой профиль
            if ($inUser->id != $data['id']) {
                cmsCore::error404();
            }
        }
        if (isset($_POST['csrf_token'])) {
            if (!cmsUser::checkCsrfToken()) {
                cmsCore::error404();
            }
            $model->deleteUser($id);
            if (!$inUser->is_admin) {
                session_destroy();
                cmsCore::redirect('/logout');
            } else {
                cmsCore::addSessionMessage($_LANG['DELETING_PROFILE_OK'], 'info');
                cmsCore::redirect('/users');
            }
        } else {
            $inPage->setTitle($_LANG['DELETING_PROFILE']);
            $inPage->addPathway($data['nickname'], $inUser->getProfileURL($data['login']));
            $inPage->addPathway($_LANG['DELETING_PROFILE']);
            $confirm['title'] = $_LANG['DELETING_PROFILE'];
            $confirm['text'] = '<p>' . $_LANG['REALLY_DEL_PROFILE'] . '</p>';
            $confirm['action'] = '/users/' . $id . '/delprofile.html';
            $confirm['yes_button'] = array();
            $confirm['yes_button']['type'] = 'submit';
            cmsPage::initTemplate('components', 'action_confirm.tpl')->assign('confirm', $confirm)->display('action_confirm.tpl');
        }
    }
    //============================================================================//
    //============================ Восстановить профиль  =========================//
    //============================================================================//
    if ($do == 'restoreprofile') {
        if (!$inUser->is_admin) {
            cmsCore::error404();
        }
        $usr = cmsUser::getShortUserData($id);
        if (!$usr) {
            cmsCore::error404();
        }
        $inDB->query("UPDATE cms_users SET is_deleted = 0 WHERE id = '{$id}'");
        cmsCore::redirectBack();
    }
    //============================================================================//
    //============================= Файлы пользователей  =========================//
    //============================================================================//
    if ($do == 'files') {
        if (!$model->config['sw_files']) {
            cmsCore::error404();
        }
        $fdo = cmsCore::request('fdo', 'str', '');
        include 'components/users/files.php';
    }
    //============================================================================//
    //================================  Инвайты  =================================//
    //============================================================================//
    if ($do == 'invites') {
        $reg_cfg = $inCore->loadComponentConfig('registration');
        if ($reg_cfg['reg_type'] != 'invite') {
            cmsCore::error404();
        }
        $invites_count = $model->getUserInvitesCount($inUser->id);
        if (!$invites_count) {
            cmsCore::error404();
        }
        if (!cmsCore::inRequest('send_invite')) {
            $inPage->addPathway($inUser->nickname, cmsUser::getProfileURL($inUser->login));
            $inPage->addPathway($_LANG['MY_INVITES']);
            cmsPage::initTemplate('components', 'com_users_invites')->assign('invites_count', $invites_count)->display('com_users_invites.tpl');
            return;
        }
        if (cmsCore::inRequest('send_invite')) {
            if (!cmsUser::checkCsrfToken()) {
                cmsCore::error404();
            }
            $invite_email = cmsCore::request('invite_email', 'email', '');
            if (!$invite_email) {
                cmsCore::redirectBack();
            }
            if ($model->sendInvite($inUser->id, $invite_email)) {
                cmsCore::addSessionMessage(sprintf($_LANG['INVITE_SENDED'], $invite_email), 'success');
            } else {
                cmsCore::addSessionMessage($_LANG['INVITE_ERROR'], 'error');
            }
            cmsCore::redirect(cmsUser::getProfileURL($inUser->login));
        }
    }
    if ($do == 'change_email') {
        if (!$inUser->id) {
            cmsUser::goToLogin();
        }
        $email = cmsCore::request('email', 'email', '');
        $token = cmsCore::request('token', 'str', '');
        // не занят ли email
        $is_email = $inDB->get_field('cms_users', "email='{$email}'", 'id');
        if ($is_email || !$email || !$token) {
            cmsCore::error404();
        }
        // проверяем токен
        $valid_id = $inDB->get_field('cms_users_activate', "code='{$token}' AND user_id = '{$inUser->id}'", 'id');
        if (!$valid_id) {
            cmsCore::error404();
        }
        $inDB->delete('cms_users_activate', "id = '{$valid_id}'");
        // Сохраняем новый email
        $inDB->update('cms_users', array('email' => $email), $inUser->id);
        cmsCore::addSessionMessage($_LANG['NEW_EMAIL_SAVED'], 'success');
        cmsCore::redirect(cmsUser::getProfileURL($inUser->login));
    }
    ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
Exemple #4
0
function comments($target = '', $target_id = 0, $labels = array())
{
    $inCore = cmsCore::getInstance();
    $inPage = cmsPage::getInstance();
    $inDB = cmsDatabase::getInstance();
    $inUser = cmsUser::getInstance();
    cmsCore::loadModel('comments');
    $model = new cms_model_comments($labels);
    // Проверяем включени ли компонент
    if (!$inCore->isComponentEnable('comments')) {
        return false;
    }
    // Инициализируем права доступа для группы текущего пользователя
    $model->initAccess();
    global $_LANG;
    $do = $inCore->do;
    $page = cmsCore::request('page', 'int', 1);
    $id = cmsCore::request('id', 'int', 0);
    $login = cmsCore::strClear(urldecode(cmsCore::request('login', 'html', '')));
    $inPage->addHeadJS('components/comments/js/comments.js');
    $inPage->addHeadJsLang(array('EDIT_COMMENT', 'CONFIRM_DEL_COMMENT', 'COMMENT_IN_LINK'));
    //========================================================================================================================//
    //========================================================================================================================//
    if ($do == 'view' && !$target && !$target_id) {
        if (!$login) {
            $myprofile = false;
            $page_title = $inCore->getComponentTitle();
            $inPage->addHead('<link rel="alternate" type="application/rss+xml" title="' . $_LANG['COMMENTS'] . '" href="' . HOST . '/rss/comments/all/feed.rss">');
        } else {
            // проверяем что пользователь есть
            $user = cmsUser::getShortUserData($login);
            if (!$user) {
                cmsCore::error404();
            }
            // Мои комментарии
            $myprofile = $inUser->id == $user['id'];
            $page_title = $_LANG['COMMENTS'] . ' - ' . $user['nickname'];
            $inPage->addPathway($user['nickname'], cmsUser::getProfileURL($user['login']));
            // Добавляем условие в выборку
            $model->whereUserIs($user['id']);
        }
        $inPage->setTitle($page_title);
        $inPage->addPathway($page_title);
        $inPage->setDescription($model->config['meta_desc'] ? $model->config['meta_desc'] : $page_title);
        $inPage->setKeywords($model->config['meta_keys'] ? $model->config['meta_keys'] : $page_title);
        // флаг модератора
        $is_moder = $inUser->is_admin || $model->is_can_moderate;
        // Не админам только открытые комментарии
        if (!($is_moder || $myprofile)) {
            $model->whereIsShow();
        }
        // Общее количество комментариев
        $total = $model->getCommentsCount(!($is_moder || $myprofile));
        // Сортировка и разбивка на страницы
        $inDB->orderBy('c.pubdate', 'DESC');
        $inDB->limitPage($page, $model->config['perpage']);
        // Сами комментарии
        $comments = $total ? $model->getComments(!($is_moder || $myprofile)) : array();
        $inDB->resetConditions();
        if (!$comments && $page > 1) {
            cmsCore::error404();
        }
        // пагинация
        if (!$login) {
            $pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], '/comments/page-%page%');
        } else {
            $pagebar = cmsPage::getPagebar($total, $page, $model->config['perpage'], 'javascript:centerLink(\'/comments/by_user_' . $user['login'] . '/page-%page%\')');
        }
        // Отдаем в шаблон
        cmsPage::initTemplate('components', 'com_comments_list_all')->assign('comments_count', $total)->assign('comments', $comments)->assign('pagebar', $pagebar)->assign('is_user', $inUser->id)->assign('page_title', $page_title)->assign('cfg', $model->config)->assign('is_admin', $is_moder)->display('com_comments_list_all.tpl');
    }
    //========================================================================================================================//
    //========================================================================================================================//
    if (!in_array($do, array('add', 'edit', 'delete')) && $target && $target_id) {
        if (!$model->config['cmm_ajax']) {
            $model->whereTargetIs($target, $target_id);
            $inDB->orderBy('c.pubdate', 'ASC');
            $comments = cmsCore::callEvent('BEFORE_SHOW_COMMENTS', $model->getComments(!($inUser->is_admin || $model->is_can_moderate), true));
            $total = count($comments);
            ob_start();
            cmsPage::initTemplate('components', 'com_comments_list')->assign('comments_count', $total)->assign('comments', $comments)->assign('user_can_moderate', $model->is_can_moderate)->assign('user_can_delete', $model->is_can_delete)->assign('user_can_add', $model->is_can_add)->assign('is_admin', $inUser->is_admin)->assign('is_user', $inUser->id)->assign('cfg', $model->config)->assign('labels', $model->labels)->assign('target', $target)->assign('target_id', $target_id)->display('com_comments_list.tpl');
            $html = ob_get_clean();
        } else {
            $model->whereTargetIs($target, $target_id);
            $total = $model->getCommentsCount(!($inUser->is_admin || $model->is_can_moderate));
            $inDB->resetConditions();
        }
        cmsPage::initTemplate('components', 'com_comments_view')->assign('comments_count', $total)->assign('target', $target)->assign('target_id', $target_id)->assign('is_admin', $inUser->is_admin)->assign('labels', $model->labels)->assign('is_user', $inUser->id)->assign('cfg', $model->config)->assign('user_can_add', $model->is_can_add)->assign('html', isset($html) ? $html : '')->assign('add_comment_js', "addComment('" . $target . "', '" . $target_id . "', 0)")->assign('user_subscribed', cmsUser::isSubscribed($inUser->id, $target, $target_id))->display('com_comments_view.tpl');
    }
    //========================================================================================================================//
    //========================================================================================================================//
    // Добавление комментария, форма добавления в addform.php
    if ($do == 'add') {
        // Только аякс
        if (!cmsCore::isAjax()) {
            cmsCore::error404();
        }
        // Очищаем буфер
        ob_end_clean();
        // Добавлять могут только админы и те, кому разрешено в настройках группы
        if (!$model->is_can_add && !$inUser->is_admin) {
            cmsCore::error404();
        }
        // Входные данные
        $comment['guestname'] = cmsCore::request('guestname', 'str', '');
        $comment['user_id'] = $inUser->id;
        if ($model->is_can_bbcode) {
            $content = cmsCore::request('content', 'html', '');
            $comment['content_bbcode'] = $inDB->escape_string($content);
            $content = cmsCore::parseSmiles($content, true);
            $comment['content'] = $inDB->escape_string($content);
        } else {
            $comment['content'] = cmsCore::request('content', 'str', '');
            $comment['content_bbcode'] = $comment['content'];
            $comment['content'] = str_replace(array('\\r', '\\n'), '<br>', $comment['content']);
        }
        $comment['parent_id'] = cmsCore::request('parent_id', 'int', 0);
        $comment['target'] = cmsCore::request('target', 'str', '');
        $comment['target_id'] = cmsCore::request('target_id', 'int', 0);
        $comment['ip'] = cmsCore::strClear($_SERVER['REMOTE_ADDR']);
        // Проверяем правильность/наличие входных парамеров
        // цель комментария
        if (!$comment['target'] || !$comment['target_id']) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET']));
        }
        // Имя гостя отсутствует
        if (!$comment['guestname'] && !$inUser->id) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_USER_NAME']));
        }
        // Текст комментраия отсутствует
        if (!$comment['content']) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_COMMENT_TEXT']));
        }
        // проверяем каптчу
        $need_captcha = $model->config['regcap'] ? true : ($inUser->id ? false : true);
        if ($need_captcha && !cmsPage::checkCaptchaCode()) {
            cmsCore::jsonOutput(array('error' => true, 'is_captcha' => true, 'text' => $_LANG['ERR_CAPTCHA']));
        }
        // получаем массив со ссылкой и заголовком цели комментария
        // для этого:
        //  1. узнаем ответственный компонент из cms_comment_targets
        $target = $inDB->get_fields('cms_comment_targets', "target='{$comment['target']}'", '*');
        if (!$target) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #1'));
        }
        //  2. подключим модель этого компонента
        if (cmsCore::loadModel($target['component'])) {
            $model_class = 'cms_model_' . $target['component'];
            if (class_exists($model_class)) {
                $target_model = new $model_class();
            }
        }
        if (!isset($target_model)) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #2'));
        }
        //  3. запросим массив $target_data[link, title] у метода getCommentTarget модели
        $target_data = $target_model->getCommentTarget($comment['target'], $comment['target_id']);
        if (!$target_data) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #3'));
        }
        $comment['target_title'] = $target_data['title'];
        $comment['target_link'] = $target_data['link'];
        // 4. Узнаем видимость комментария в модели $target_model
        if (method_exists($target_model, 'getVisibility')) {
            $comment['is_hidden'] = $target_model->getVisibility($comment['target'], $comment['target_id']);
        } else {
            $comment['is_hidden'] = 0;
        }
        // публикация согласно настроек
        $comment['published'] = $inUser->is_admin || $model->is_can_moderate || $model->is_add_published ? 1 : 0;
        // Проверяем токен перед самым добавлением комментария
        if (!cmsUser::checkCsrfToken()) {
            cmsCore::error404();
        }
        // 5. добавляем комментарий в базу
        $comment_id = $model->addComment($comment);
        // 6. Пересчитываем количество комментариев у цели если нужно
        if (method_exists($target_model, 'updateCommentsCount')) {
            $target_model->updateCommentsCount($comment['target'], $comment['target_id']);
        }
        if (!$comment['is_hidden'] && $comment['published']) {
            //регистрируем событие
            $content_short = strip_tags($comment['content']);
            cmsActions::log('add_comment', array('object' => $_LANG['COMMENT'], 'object_url' => $comment['target_link'] . '#c' . $comment_id, 'object_id' => $comment_id, 'target' => $comment['target_title'], 'target_url' => $comment['target_link'], 'target_id' => $comment['target_id'], 'description' => mb_strlen($content_short) > 140 ? mb_substr($content_short, 0, 140) : $content_short));
        }
        ////////////////////////////////////////////////////////////////
        ///////////////// Операции по уведомлениям /////////////////////
        $inConf = cmsConfig::getInstance();
        $from_nick = $inUser->id ? $inUser->nickname : $comment['guestname'];
        $targetlink = HOST . $comment['target_link'] . '#c' . $comment_id;
        //получаем ID и e-mail автора
        $author = $inUser->id ? $model->getTargetAuthor($target['target_table'], $comment['target_id']) : '';
        //подписываем пользователя на обновления, если нужно
        if ($inUser->id && cmsCore::inRequest('subscribe')) {
            cmsUser::subscribe($inUser->id, $comment['target'], $comment['target_id']);
        }
        if ($comment['published']) {
            //рассылаем уведомления о новом комменте
            cmsUser::sendUpdateNotify($comment['target'], $comment['target_id'], array('link' => $comment['target_link'] . '#c' . $comment_id, 'title' => stripslashes($comment['target_title']), 'letter_file' => 'newcomment', 'author' => $inUser->id ? $inUser->nickname : $comment['guestname']));
            //проверяем и выдаем награду если нужно
            cmsUser::checkAwards($inUser->id);
        }
        //отправляем админу уведомление о комментарии на e-mail, если нужно
        if ($model->config['email']) {
            $mailmsg = str_replace(array('{sitename}', '{date}', '{from}', '{subjtitle}', '{targetlink}', '{content}'), array($inConf->sitename, date('d/m/Y (H:i)'), $from_nick, stripslashes($comment['target_title']), $targetlink, strip_tags($comment['content'])), cmsCore::getLanguageTextFile('newcomment_admin'));
            $inCore->mailText($model->config['email'], '', $mailmsg);
        }
        //отправляем автору уведомление на e-mail
        if ($author && $comment['published']) {
            if ($model->isAuthorNeedMail($author['id']) && $inUser->id != $author['id']) {
                $letter = cmsCore::getLanguageTextFile('newpostcomment');
                $letter = str_replace('{sitename}', $inConf->sitename, $letter);
                $letter = str_replace('{subj}', $target['subj'], $letter);
                $letter = str_replace('{subjtitle}', stripslashes($comment['target_title']), $letter);
                $letter = str_replace('{targetlink}', $targetlink, $letter);
                $letter = str_replace('{date}', date('d/m/Y H:i:s'), $letter);
                $letter = str_replace('{from}', $from_nick, $letter);
                $inCore->mailText($author['email'], '', $letter);
            }
        }
        if (!$comment['published']) {
            $message = str_replace(array('%user%', '%targetlink%'), array($from_nick, $targetlink), $_LANG['COMM_PREMODER_ADMIN_TEXT']);
            cmsUser::sendMessage(USER_UPDATER, 1, $message);
        }
        cmsCore::jsonOutput(array('error' => false, 'target' => $comment['target'], 'target_id' => $comment['target_id'], 'is_premod' => $comment['published'] ? 0 : $_LANG['COMM_PREMODER_TEXT'], 'comment_id' => $comment_id));
    }
    //========================================================================================================================//
    //========================================================================================================================//
    if ($do == 'edit') {
        if (!cmsCore::isAjax()) {
            cmsCore::error404();
        }
        $comment = $model->getComment(cmsCore::request('comment_id', 'int', 0));
        if (!$comment) {
            die;
        }
        // редактировать могут авторы (если время редактирования есть)
        // модераторы и администраторы
        if (!$model->is_can_moderate && !$inUser->is_admin && !($inUser->id == $comment['user_id'] && $comment['is_editable'])) {
            cmsCore::error404();
        }
        if ($model->is_can_bbcode) {
            $content = cmsCore::request('content', 'html', '');
            $com_new['content_bbcode'] = $inDB->escape_string($content);
            $com_new['content'] = $inDB->escape_string(cmsCore::parseSmiles($content, true));
        } else {
            $com_new['content'] = cmsCore::request('content', 'str', '');
            $com_new['content_bbcode'] = $com_new['content'];
            $com_new['content'] = str_replace(array('\\r', '\\n'), '<br>', $com_new['content']);
        }
        // Текст комментраия отсутствует
        if (!$com_new['content']) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_COMMENT_TEXT']));
        }
        if (!cmsUser::checkCsrfToken()) {
            cmsCore::error404();
        }
        //Если ошибок не было,
        //обновляем комментарий в базе
        $model->updateComment($comment['id'], $com_new);
        // Обновляем в ленте активности
        $content_short = mb_substr(strip_tags($com_new['content']), 0, 140);
        cmsActions::updateLog('add_comment', array('description' => $content_short), $comment['id']);
        $com_new['content'] = stripslashes(str_replace(array('\\r', '\\n'), ' ', $com_new['content']));
        $com_new = cmsCore::callEvent('GET_COMMENT', $com_new);
        cmsCore::jsonOutput(array('error' => false, 'text' => $com_new['content'], 'comment_id' => $comment['id']));
    }
    //========================================================================================================================//
    //========================================================================================================================//
    if ($do == 'delete') {
        if (!cmsCore::isAjax()) {
            cmsCore::error404();
        }
        $comment = $model->getComment($id);
        if (!$comment) {
            cmsCore::error404();
        }
        if (!$inUser->id && !($model->is_can_delete && $inUser->id == $comment['user_id']) && !$model->is_can_moderate && !$inUser->is_admin) {
            cmsCore::error404();
        }
        //узнаем ответственный компонент из cms_comment_targets
        $target = $inDB->get_fields('cms_comment_targets', "target='{$comment['target']}'", '*');
        if (!$target) {
            cmsCore::jsonOutput(array('error' => true, 'text' => $_LANG['ERR_UNKNOWN_TARGET'] . ' #1'));
        }
        if (!cmsUser::checkCsrfToken()) {
            cmsCore::error404();
        }
        $model->deleteComment($id);
        //подключим модель этого компонента
        if (cmsCore::loadModel($target['component'])) {
            $model_class = 'cms_model_' . $target['component'];
            if (class_exists($model_class)) {
                $target_model = new $model_class();
                // Пересчитываем количество комментариев у цели если нужно
                if (method_exists($target_model, 'updateCommentsCount')) {
                    $target_model->updateCommentsCount($comment['target'], $comment['target_id']);
                }
            }
        }
        cmsCore::jsonOutput(array('error' => false, 'target' => $comment['target'], 'target_id' => $comment['target_id']));
    }
}
Exemple #5
0
 public function sendEmail($to, $letter, $data = array())
 {
     if (is_array($to)) {
         if (empty($to['email'])) {
             return false;
         }
         if (empty($to['name'])) {
             $to['name'] = false;
         }
     } else {
         if (empty($to)) {
             return false;
         }
         $to = array('email' => $to, 'name' => false);
     }
     if (is_array($letter)) {
         if (empty($letter['text'])) {
             $letter['text'] = cmsCore::getLanguageTextFile("letters/{$letter['name']}");
         }
     } else {
         $letter = array('text' => cmsCore::getLanguageTextFile("letters/{$letter}"));
     }
     if (!$letter['text']) {
         return false;
     }
     $config = cmsConfig::getInstance();
     $data = array_merge(array('site' => $config->sitename, 'date' => html_date(time()), 'time' => html_time(time())), $data);
     $letter['text'] = string_replace_keys_values($letter['text'], $data);
     $mailer = new cmsMailer();
     $mailer->addTo($to['email'], $to['name']);
     $letter['text'] = $mailer->parseSubject($letter['text']);
     $letter['text'] = $mailer->parseAttachments($letter['text']);
     $mailer->setBodyHTML(nl2br($letter['text']));
     $result = $mailer->send();
     $mailer->clearTo()->clearAttachments();
     return $result;
 }
Exemple #6
0
 /**
  * Рассылает личные уведомления для подписанных на что-либо пользователей
  * @param string $target Назначение
  * @param int $target_id ID назначения
  * @param array $item Массив того, о чем уведомляем - ключи: array('link','title','author', 'letter_file');
  * @return bool
  */
 public static function sendUpdateNotify($target, $target_id, $item = array())
 {
     if (!$item) {
         return false;
     }
     global $_LANG;
     $inUser = self::getInstance();
     $inDB = cmsDatabase::getInstance();
     //получаем список подписанных пользователей
     $sql = "SELECT u.id, u.email, p.cm_subscribe as subscribe_type\n                FROM cms_subscribe s\n                INNER JOIN cms_users u ON u.id = s.user_id\n                INNER JOIN cms_user_profiles p ON p.user_id = u.id\n                WHERE s.target = '{$target}' AND s.target_id = '{$target_id}'";
     $r = $inDB->query($sql);
     if (!$inDB->num_rows($r)) {
         return false;
     }
     $letter = cmsCore::getLanguageTextFile($item['letter_file']);
     if (!$letter) {
         return false;
     }
     while ($user = $inDB->fetch_assoc($r)) {
         if ($user['id'] == $inUser->id) {
             continue;
         }
         if ($user['subscribe_type'] == 'priv' || $user['subscribe_type'] == 'both') {
             $message = $_LANG['WAS_UPDATED'] . ' <a href="' . $item['link'] . '">' . $item['title'] . '</a>';
             self::sendMessage(USER_UPDATER, $user['id'], $message);
         }
         if ($user['subscribe_type'] == 'mail' || $user['subscribe_type'] == 'both') {
             $user_letter = str_replace('{sitename}', cmsConfig::getConfig('sitename'), $letter);
             $user_letter = str_replace('{answerlink}', HOST . $item['link'], $user_letter);
             $user_letter = str_replace('{pagetitle}', $item['title'], $user_letter);
             $user_letter = str_replace('{date}', date('d/m/Y H:i:s'), $user_letter);
             $user_letter = str_replace('{author}', $item['author'], $user_letter);
             cmsCore::mailText($user['email'], '', $user_letter);
             unset($user_letter);
         }
     }
     return true;
 }
Exemple #7
0
    public function sendNotificationByEmail($to_id=0, $from_id=0, $msg_id=0) {

		if(!$from_id || !$to_id || !$msg_id) { return false; }

		$inUser = cmsUser::getInstance();
		$inCore = cmsCore::getInstance();
		$inConf = cmsConfig::getInstance();

		global $_LANG;

		//проверяем подписку на уведомления
		$needmail = $this->inDB->get_field('cms_user_profiles', "user_id='{$to_id}'", 'email_newmsg');

		//если подписан и не онлайн, отправляем уведомление на email
		if (!$inUser->isOnline($to_id) && $needmail){

			$postdate   = date('d/m/Y H:i:s');
			$to_email   = $this->inDB->get_field('cms_users', "id='{$to_id}'", 'email');
			$from_nick  = $inUser->nickname;
			$answerlink = HOST.'/users/'.$to_id.'/messages.html';

			$letter = cmsCore::getLanguageTextFile('newmessage');
			$letter = str_replace('{sitename}', $inConf->sitename, $letter);
			$letter = str_replace('{answerlink}', $answerlink, $letter);
			$letter = str_replace('{date}', $postdate, $letter);
			$letter = str_replace('{from}', $from_nick, $letter);
			$inCore->mailText($to_email, $_LANG['YOU_HAVE_NEW_MESS'].'! - '.$inConf->sitename, $letter);

			return true;
		}

        return false;

    }
Exemple #8
0
 public function sendClubsEmail($to_id = 0, $from_id = 1, $msg_id = 1)
 {
     $inUser = cmsUser::getInstance();
     $inCore = cmsCore::getInstance();
     $inConf = cmsConfig::getInstance();
     global $_LANG;
     if ($to_id) {
         $postdate = date('d/m/Y H:i:s');
         $to_email = $this->inDB->get_field('cms_users', "id='{$to_id}'", 'email');
         $from_nick = $inUser->nickname;
         $answerlink = HOST . '/users/' . $to_id . '/messages.html';
         $letter = cmsCore::getLanguageTextFile('newmessage');
         $letter = str_replace('{sitename}', $inConf->sitename, $letter);
         $letter = str_replace('{answerlink}', $answerlink, $letter);
         $letter = str_replace('{date}', $postdate, $letter);
         $letter = str_replace('{from}', $from_nick, $letter);
         $inCore->mailText($to_email, 'Новий учасник в спільноті! - ' . $inConf->sitename, $letter);
         return true;
     }
     return false;
 }