View file cms-master/modules/user/controllers/user_admin.php

File size: 21.28Kb
<?php

/**
 * MobileCMS
 *
 * Open source content management system for mobile sites
 *
 * @author MobileCMS Team <[email protected]>
 * @copyright Copyright (c) 2011-2019, MobileCMS Team
 * @link https://mobilecms.pro Official site
 * @license MIT license
 */
defined('IN_SYSTEM') or die('<b>403<br />Запрет доступа!</b>');

/**
 * Контроллер управления пользователями
 */
class User_Admin_Controller extends Controller
{

    /**
     * Уровень пользовательского доступа
     */
    protected $access_level = 8;

    /**
     * Тема
     */
    protected $template_theme = 'admin';

    /**
     * Метод по умолчанию
     */
    public function action_index()
    {
        $this->action_list_users();
    }

    /**
     * Конфигурация модуля
     */
    public function action_config()
    {
        $_config = $this->config['user'];

        if (isset($_POST['submit'])) {
            main::is_demo();
            $_config = $_POST;

            main::config($_config, 'user', $this->db);

            a_notice('Настройки модуля успешно изменены!', a_url('user/admin/config'));
        }

        $this->tpl->assign(array(
            '_config' => $_config
        ));

        $this->tpl->display('config');
    }

    /**
     * Удаление пользователя
     */
    public function action_delete()
    {
        main::is_demo();
        # Получаем инфо о пользователе
        if (!$user_delete = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
            a_error("Пользователь не найден!");

        $user_delete_access = $this->access->get_level($user_delete['status']);

        if (ACCESS_LEVEL <= $user_delete_access)
            a_error("У вас нет прав на выполнение этой операции!");
        else {
            $this->db->query("DELETE FROM #__users WHERE user_id = " . intval($user_delete['user_id']));
            a_notice('Пользователь удален!', a_url('user/admin'));
        }
    }

    /**
     * Удаление пользователя
     */
    public function action_user_email()
    {
        main::is_demo();
        if (ACCESS_LEVEL < 10)
            a_error('У вас нет прав на выполнение этой операции!');

        # Получаем инфо о пользователе
        if (!$user_email = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
            a_error("Пользователь не найден!");

        if ($_POST['submit']) {
            if (empty($_POST['title']))
                $this->error .= 'Не введен заголовок<br />';
            if (empty($_POST['msg']))
                $this->error .= 'Не введено сообщение заголовок<br />';

            if (!$this->error) {
                a_import('libraries/email');
                $this->email = new Mail('utf-8');

                $this->email->From($this->config['system']['system_email']);
                $this->email->To($user_email['email']);

                $this->email->Subject(a_safe($_POST['title']));
                $this->email->Body(a_safe($_POST['msg']));

                $this->email->Send();

                a_notice('Сообщение успешно отправлено!', a_url('user/admin/list_users'));
            }
        }

        $this->tpl->assign(array(
            'error' => $this->error,
            'user_email' => $user_email,
        ));

        $this->tpl->display('user_email');
    }

    /**
     * Бан пользователя
     */
    public function action_ban()
    {
        # Получаем инфо о пользователе
        if (!$user_ban = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
            a_error("Пользователь не найден!");

        $user_ban_access = $this->access->get_level($user_ban['status']);

        if (ACCESS_LEVEL <= $user_ban_access)
            a_error("У вас нет прав на выполнение этой операции!");

        if (isset($_POST['submit'])) {
            main::is_demo();
            if (!is_numeric($_POST['hours'])) {
                $this->error .= 'Неверный формат времени - только целые числа.<br />';
            }
            if (empty($_POST['description'])) {
                $this->error .= 'Укажите причину бана.<br />';
            }

            if (!$this->error) {
                $this->db->query("INSERT INTO #__users_ban SET
		   			user_id = '" . intval($_GET['user_id']) . "',
		   			to_time = '" . ($_POST['hours'] * 3600 + time()) . "',
		   			description = '" . a_safe($_POST['description']) . "'
		   		");
                a_notice('Пользователь забанен.', a_url('user/admin'));
            }
        }

        if (isset($_POST['delete_ban'])) {
            main::is_demo();
            $this->db->query("DELETE FROM #__users_ban WHERE user_id = '" . intval($_GET['user_id']) . "'");
            a_notice('Пользователь разбанен.', a_url('user/admin'));
        }

        # Получаем информацию о текущем бане
        $this->ban = $this->db->get_row("SELECT * FROM #__users_ban WHERE user_id = '" . intval($_GET['user_id']) . "' AND status = 'enable'");

        if (!isset($_POST['submit']) || $this->error) {
            $this->tpl->assign(array(
                'error' => $this->error,
                'ban' => $this->ban,
                'username_ban' => $user_ban['username']
            ));

            $this->tpl->display('ban');
        }
    }

    /**
     * Редактирование пользователя
     */
    public function action_edit()
    {
        # Получаем инфо о пользователе
        if (!$user_edit = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
            a_error("Пользователь не найден!");

        $user_edit_access = $this->access->get_level($user_edit['status']);

        if (ACCESS_LEVEL <= $user_edit_access)
            a_error("У вас нет прав на выполнение этой операции!");

        if (isset($_POST['submit'])) {
            main::is_demo();
            if (!main::check_input($_POST['email'], 'MAIL')) {
                $this->error .= 'Неверный формат e-mail.<br />';
            }
            if ($_POST['status'] != 'admin' && $_POST['status'] != 'moder' && $_POST['status'] != 'user') {
                $this->error .= 'Укажите валидный статус!<br />';
            }
            if (ACCESS_LEVEL < 10 && $_POST['status'] != $user_edit['status']) {
                $this->error .= 'Только администратор может менять статусы пользователей!<br />';
            }

            if (!$this->error) {
                $this->db->query("UPDATE #__users SET
		 			email = '" . a_safe($_POST['email']) . "',
		 			status = '" . a_safe($_POST['status']) . "'
		 			WHERE user_id = '" . intval($_GET['user_id']) . "'
		 		");

                a_notice('Пользователь изменен!', a_url('user/admin'));
            }
        }
        if (!isset($_POST['submit']) || $this->error) {
            $this->tpl->assign(array(
                'error' => $this->error,
                'user_edit' => $user_edit
            ));

            $this->tpl->display('edit');
        }
    }

    /**
     * Вход в панель к пользователю
     */
    public function action_go_to_user_panel()
    {
        // Запрет для модераторов
        if (ACCESS_LEVEL < 10)
            a_error('У Вас нет прав для выполнения данного действия.');


        if (!$check_user = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
            a_error('Пользователь не найден!');

        if (!a_check_rights($check_user['user_id'], $check_user['status']))
            a_error('У вас нет прав на выполнение этого действия!');

        $_SESSION['check_user_id'] = intval($_GET['user_id']);

        header('Location: ' . a_url(MAIN_MENU));
    }

    /**
     * Листинг пользователей
     */
    public function action_list_users()
    {
        // Кол-во пользователей на страницу
        $this->per_page = 20;

        // Получение данных
        $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM #__users
			WHERE 1 = 1 AND user_id > 0 ";

        if (!empty($_GET['user_id']))
            $sql .= " AND user_id = " . intval($_GET['user_id']);
        else {
            if (!empty($_GET['username']))
                $sql .= " AND username LIKE '%" . a_safe($_GET['username']) . "%'";
            if (!empty($_GET['status']))
                $sql .= " AND status = '" . a_safe($_GET['status']) . "'";
        }

        if (str_safe($_GET['type']) == 'online')
            $sql .= " AND last_visit > UNIX_TIMESTAMP() - 600 ";

        $sql .= " ORDER BY user_id " . ($_GET['sort'] == 'desc' ? 'DESC' : 'ASC') . " LIMIT $this->start, $this->per_page";

        $users = $this->db->get_array($sql);
        $total = $this->db->get_one("SELECT FOUND_ROWS()");

        // Пагинация
        $pg_conf['base_url'] = a_url('user/admin/list_users', 'status=' . str_safe($_GET['status']) . '&amp;login=' . str_safe($_GET['username']) . '&amp;user_id=' . intval($_GET['user_id']) . '&amp;sort=' . str_safe($_GET['sort']) . '&amp;start=');
        $pg_conf['total_rows'] = $total;
        $pg_conf['per_page'] = $this->per_page;

        a_import('libraries/pagination');
        $pg = new CI_Pagination($pg_conf);

        $this->tpl->assign(array(
            'users' => $users,
            'total' => $total,
            'db' => $this->db,
            'start' => $this->start,
            'pagination' => $pg->create_links(),
            'action' => 'list'
        ));

        $this->tpl->display('list_users');
    }

    /**
     * Листинг гостей
     */
    public function action_list_guests()
    {
        // Кол-во пользователей на страницу
        $this->per_page = 20;

        // Получение данных
        $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM #__guests
			WHERE 1 = 1 AND last_time > UNIX_TIMESTAMP() - 180
		ORDER BY last_time DESC LIMIT $this->start, $this->per_page";

        $guests = $this->db->get_array($sql);
        $total = $this->db->get_one("SELECT FOUND_ROWS()");

        // Пагинация
        $pg_conf['base_url'] = a_url('user/admin/list_guests', 'start=');
        $pg_conf['total_rows'] = $total;
        $pg_conf['per_page'] = $this->per_page;

        a_import('libraries/pagination');
        $pg = new CI_Pagination($pg_conf);

        $this->tpl->assign(array(
            'guests' => $guests,
            'total' => $total,
            'db' => $this->db,
            'start' => $this->start,
            'pagination' => $pg->create_links()
        ));

        $this->tpl->display('list_guests');
    }

    /**
     * Бан по IP
     */
    public function action_ip_ban()
    {
        // Выполнение действий
        switch (str_safe($_GET['action'])) {
            case 'add':
                $title = 'Бан нового IP';
                $action = 'add';

                if (isset($_GET['guest_ip'])) {
                    main::is_demo();

                    if (ACCESS_LEVEL <= 8)
                        a_error('У вас нет прав на выполнение этой операции!');

                    if (empty($_GET['guest_ip']))
                        $this->error .= 'Не указан IP адрес, который нужно забанить<br />';

                    // Проверка IP регулярками
                    if (!empty($_GET['guest_ip']) AND ! main::check_input($_GET['guest_ip'], 'IP'))
                        $this->error .= 'Неверно указан IP адрес, формат правильного: ' . main::check_input('', 'IP', 'format') . '<br />';

                    if ($ip = $this->db->get_row("SELECT * FROM #__ip_ban WHERE ip = '" . str_safe($_GET['guest_ip']) . "'"))
                        a_notice('Указаный IP адрес уже забанен!', a_url('user/admin/ip_ban'));

                    // Баним
                    if (!$this->error) {
                        $this->db->query("INSERT INTO #__ip_ban SET
				 			ip = '" . a_safe($_GET['guest_ip']) . "'
						");

                        a_notice('IP адрес успешно забанен', a_url('user/admin/ip_ban'));
                    }
                }
                break;

            case 'edit':
                $title = 'Изменение IP адреса';
                $action = 'edit';

                if (isset($_GET['id'])) {
                    main::is_demo();

                    if (ACCESS_LEVEL <= 8)
                        a_error('У вас нет прав на выполнение этой операции!');

                    if (!$edit_ip = $this->db->get_row("SELECT * FROM #__ip_ban WHERE id = '" . str_safe($_GET['id']) . "'"))
                        a_error('Не найдена запись с указаным ID!<br />');

                    if (isset($_POST['guest_ip'])) {
                        if (empty($_POST['guest_ip']))
                            $this->error .= 'Не указан IP адрес, который нужно забанить<br />';

                        // Проверка IP регулярками
                        if (!empty($_POST['guest_ip']) AND ! main::check_input($_POST['guest_ip'], 'IP'))
                            $this->error .= 'Неверно указан IP адрес, формат правильного: ' . main::check_input('', 'IP', 'format') . '<br />';

                        if ($ip_edit = $this->db->get_row("SELECT * FROM #__ip_ban WHERE ip = '" . str_safe($_POST['guest_ip']) . "' AND id != $edit_ip[id]"))
                            a_notice('Указаный IP адрес уже забанен!', a_url('user/admin/ip_ban'));

                        // Баним
                        if (!$this->error) {
                            $this->db->query("UPDATE #__ip_ban SET
				 				ip = '" . a_safe($_POST['guest_ip']) . "'
							WHERE id = $edit_ip[id]
							");

                            a_notice('IP адрес успешно изменен', a_url('user/admin/ip_ban'));
                        }
                    }
                }
                break;

            case 'delete':
                main::is_demo();

                if (ACCESS_LEVEL <= 8)
                    a_error('У вас нет прав на выполнение этой операции!');

                if (empty($_GET['guest_ip']))
                    $this->error .= 'Не указан IP адрес, который нужно разбанить<br />';

                // Проверка IP регулярками
                if (!empty($_GET['guest_ip']) AND ! main::check_input($_GET['guest_ip'], 'IP'))
                    $this->error .= 'Неверно указан IP адрес, формат правильного: ' . main::check_input('', 'IP', 'format') . '<br />';

                if (!$ip_delete = $this->db->get_row("SELECT * FROM #__ip_ban WHERE ip = '" . str_safe($_GET['guest_ip']) . "'"))
                    a_error('Не найдена запись с указаным IP адресом!');

                if (!$this->error) {
                    $this->db->query("DELETE FROM #__ip_ban WHERE ip = '" . str_safe($_GET['guest_ip']) . "'");
                    a_notice('IP адрес ' . str_safe($_GET['guest_ip']) . ' успешно разбанен!', a_url('user/admin/ip_ban'));
                }
                break;

            case 'delete_all':
                main::is_demo();

                if (ACCESS_LEVEL <= 8)
                    a_error('У вас нет прав на выполнение этой операции!');

                $this->db->query("TRUNCATE TABLE #__ip_ban");
                a_notice('Все IP успешно разбанены!', a_url('user/admin/ip_ban'));
                break;

            default:
                $title = 'Список забаненых по IP';
                $action = 'list_ip';
                break;
        }

        // Кол-во IP на страницу
        $this->per_page = 20;

        // Получение данных
        $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM #__ip_ban
			WHERE 1 = 1 ";

        if (!empty($_GET['guest_ip']))
            $sql .= " AND ip LIKE '%" . a_safe($_GET['guest_ip']) . "%'";

        $sql .= " ORDER BY id " . ($_GET['sort'] == 'desc' ? 'DESC' : 'ASC') . " LIMIT $this->start, $this->per_page";

        $ip_bans = $this->db->get_array($sql);
        $total = $this->db->get_one("SELECT FOUND_ROWS()");

        // Пагинация
        $pg_conf['base_url'] = a_url('user/admin/ip_ban', 'start=');
        $pg_conf['total_rows'] = $total;
        $pg_conf['per_page'] = $this->per_page;

        a_import('libraries/pagination');
        $pg = new CI_Pagination($pg_conf);

        $this->tpl->assign(array(
            'edit_ip' => $edit_ip,
            'error' => $this->error,
            'title' => $title,
            'action' => $action,
            'ip_bans' => $ip_bans,
            'total' => $total,
            'db' => $this->db,
            'start' => $this->start,
            'pagination' => $pg->create_links()
        ));

        $this->tpl->display('ip_ban');
    }

    /**
     * Модерация пользователей
     */
    public function action_moderate()
    {
        // Модерация
        if ($_GET['user_id'] && $_GET['action']) {

            # Получаем инфо о пользователе
            if (!$user_moderate = $this->db->get_row("SELECT * FROM #__users WHERE user_id = '" . intval($_GET['user_id']) . "'"))
                a_error("Пользователь не найден!");

            switch ($_GET['action']) {
                case 'ok':
                    $this->db->query("UPDATE #__users SET
					account = 'active'
					WHERE
					user_id = '$user_moderate[user_id]'
				");

                    // Генерация и отправка письма
                    $msg = file_get_contents(ROOT . 'data_files/email_templates/reg_moderation.tpl');

                    $msg = str_replace('{SYSTEM_TITLE}', $this->config['system']['system_title'], $msg);
                    $msg = str_replace('{TEXT}', 'успешно прошел', $msg);

                    // Отправка пиьсма
                    main::send_mail($this->config['system']['system_email'], $user_moderate['email'], 'Модерация аккаунта на ' . $this->config['system']['system_title'], $msg);

                    a_notice('Пользователь успешно промодерирован', a_url('user/admin/moderate'));
                    break;

                case 'cancel':
                    $this->db->query("UPDATE #__users SET
					account = 'block'
					WHERE
					user_id = '$user_moderate[user_id]'
				");

                    // Генерация и отправка письма
                    $msg = file_get_contents(ROOT . 'data_files/email_templates/reg_moderation.tpl');

                    $msg = str_replace('{SYSTEM_TITLE}', $this->config['system']['system_title'], $msg);
                    $msg = str_replace('{TEXT}', 'не прошел', $msg);

                    // Отправка пиьсма
                    main::send_mail($this->config['system']['system_email'], $user_moderate['email'], 'Модерация аккаунта на ' . $this->config['system']['system_title'], $msg);

                    a_notice('Пользователь успешно заблокирован', a_url('user/admin/moderate'));
                    break;

                default:
                    a_error('Действие не выбрано');
                    break;
            }
        }

        // Кол-во пользователей на страницу
        $this->per_page = 20;

        // Получение данных
        $sql = "SELECT SQL_CALC_FOUND_ROWS * FROM #__users
			WHERE 1 = 1 AND account = 'moderate' AND pin_code = '' 
		ORDER BY reg_time DESC LIMIT $this->start, $this->per_page";

        $users = $this->db->get_array($sql);
        $total = $this->db->get_one("SELECT FOUND_ROWS()");

        // Пагинация
        $pg_conf['base_url'] = a_url('user/admin/list_moderate', 'start=');
        $pg_conf['total_rows'] = $total;
        $pg_conf['per_page'] = $this->per_page;

        a_import('libraries/pagination');
        $pg = new CI_Pagination($pg_conf);

        $this->tpl->assign(array(
            'users' => $users,
            'total' => $total,
            'db' => $this->db,
            'start' => $this->start,
            'pagination' => $pg->create_links()
        ));

        $this->tpl->display('list_moderate');
    }

}

?>