Вход Регистрация
Файл: library/XenForo/ControllerAdmin/User.php
Строк: 1247
<?php

/**
 * Controller for handling the users section and actions on users in the
 * admin control panel.
 *
 * @package XenForo_Users
 */
class XenForo_ControllerAdmin_User extends XenForo_ControllerAdmin_Abstract
{
    protected function 
_preDispatch($action)
    {
        switch (
strtolower($action))
        {
            case 
'index':
            case 
'searchname':
                break;

            default:
                
$this->assertAdminPermission('user');
        }
    }

    
/**
     * Section splash page.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIndex()
    {
        
/*
         * Fetch:
         *
         * Total members
         * Members awaiting approval
         * Administrators
         * Moderators
         * Banned members
         *
         * Banned IPs
         * Banned emails
         */

        
$userModel = $this->_getUserModel();
        
$banningModel = $this->getModelFromCache('XenForo_Model_Banning');

        
$visitor = XenForo_Visitor::getInstance();

        
$boardTotals = $this->getModelFromCache('XenForo_Model_DataRegistry')->get('boardTotals');
        if (!
$boardTotals)
        {
            
$boardTotals = $this->getModelFromCache('XenForo_Model_Counters')->rebuildBoardTotalsCounter();
        }

        
$viewParams = array(
            
'canManageUsers' => $visitor->hasAdminPermission('user'),
            
'canManageBans' => $visitor->hasAdminPermission('ban'),
            
'canManageUserGroups' => $visitor->hasAdminPermission('userGroup'),
            
'canManageTrophies' => $visitor->hasAdminPermission('trophy'),
            
'canManageUserUpgrades' => $visitor->hasAdminPermission('userUpgrade'),

            
'users' => array(
                
'total' => $boardTotals['users'],
                
'awaitingApproval' => $userModel->countUsers(array('user_state' => 'moderated')),
                
'admins' => $this->getModelFromCache('XenForo_Model_Admin')->countAdmins(),
                
'moderators' => $this->getModelFromCache('XenForo_Model_Moderator')->countModerators(),
                
'banned' => $banningModel->countBannedUsers()
            ),
            
'bannedIps' => $banningModel->countBannedIps(),
            
'bannedEmails' => $banningModel->countBannedEmails(),
        );

        return 
$this->responseView('XenForo_ViewAdmin_User_Splash', 'user_splash', $viewParams);
    }

    protected function 
_filterUserSearchCriteria(array $criteria)
    {
        return 
$this->_getCriteriaHelper()->filterUserSearchCriteria($criteria);
    }

    protected function 
_prepareUserSearchCriteria(array $criteria)
    {
        return 
$this->_getCriteriaHelper()->prepareUserSearchCriteria($criteria);
    }

    
/**
     * Shows a list of users.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionList()
    {
        
$criteria = $this->_input->filterSingle('criteria', XenForo_Input::JSON_ARRAY);
        
$criteria = $this->_filterUserSearchCriteria($criteria);

        
$filter = $this->_input->filterSingle('_filter', XenForo_Input::ARRAY_SIMPLE);
        if (
$filter && isset($filter['value']))
        {
            
$criteria['username2'] = array($filter['value'], empty($filter['prefix']) ? 'lr' : 'r');
            
$filterView = true;
        }
        else
        {
            
$filterView = false;
        }

        
$order = $this->_input->filterSingle('order', XenForo_Input::STRING);
        
$direction = $this->_input->filterSingle('direction', XenForo_Input::STRING);

        
$page = $this->_input->filterSingle('page', XenForo_Input::UINT);
        
$usersPerPage = 20;

        
$showingAll = $this->_input->filterSingle('all', XenForo_Input::UINT);
        if (
$showingAll)
        {
            
$page = 1;
            
$usersPerPage = 5000;
        }

        
$fetchOptions = array(
            
'perPage' => $usersPerPage,
            
'page' => $page,

            
'order' => $order,
            
'direction' => $direction
        
);

        
$userModel = $this->_getUserModel();

        
$criteriaPrepared = $this->_prepareUserSearchCriteria($criteria);

        
$totalUsers = $userModel->countUsers($criteriaPrepared);
        if (!
$totalUsers)
        {
            return 
$this->responseError(new XenForo_Phrase('no_users_matched_specified_criteria'));
        }

        
$users = $userModel->getUsers($criteriaPrepared, $fetchOptions);

        if (
$totalUsers == 1 && ($user = reset($users)) && !$filterView)
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('users/edit', $user)
            );
        }

        
// TODO: show more structured info: username, email, last activity, messages?

        
$viewParams = array(
            
'users' => $users,
            
'totalUsers' => $totalUsers,
            
'showingAll' => $showingAll,
            
'showAll' => (!$showingAll && $totalUsers <= 5000),

            
'linkParams' => array('criteria' => $criteria, 'order' => $order, 'direction' => $direction),
            
'page' => $page,
            
'usersPerPage' => $usersPerPage,

            
'filterView' => $filterView,
            
'filterMore' => ($filterView && $totalUsers > $usersPerPage)
        );

        return 
$this->responseView('XenForo_ViewAdmin_User_List', 'user_list', $viewParams);
    }

    
/**
     * Search for users form.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSearch()
    {
        
$viewParams = array(
            
'lastUser' => $this->_getUserModel()->getUserById($this->_input->filterSingle('last_user_id', XenForo_Input::UINT)),
        );

        
$criteriaHelper = $this->_getCriteriaHelper();
        
$viewParams += $criteriaHelper->getDataForUserSearchForm();
        
$viewParams['criteria'] = $criteriaHelper->getDefaultUserSearchCriteria();

        return 
$this->responseView('XenForo_ViewAdmin_User_Search', 'user_search', $viewParams);
    }

    public function 
actionBatchUpdate()
    {
        if (
$this->isConfirmedPost())
        {
            
$criteria = $this->_input->filterSingle('criteria', XenForo_Input::JSON_ARRAY);
            
$criteria = $this->_filterUserSearchCriteria($criteria);
            
$criteriaPrepared = $this->_prepareUserSearchCriteria($criteria);

            
$userModel = $this->_getUserModel();

            
$userIds = $this->_input->filterSingle('user_ids', XenForo_Input::JSON_ARRAY);

            
$totalUsers = $userIds ? count($userIds) : $userModel->countUsers($criteriaPrepared);
            if (!
$totalUsers)
            {
                return 
$this->responseError(new XenForo_Phrase('no_users_matched_specified_criteria'));
            }

            
$actions = $this->_input->filterSingle('actions', XenForo_Input::ARRAY_SIMPLE);

            if (
$this->_input->filterSingle('confirmUpdate', XenForo_Input::UINT) && $actions)
            {
                
$defer = array(
                    
'actions' => $actions,
                    
'total' => $totalUsers
                
);

                if (
$userIds)
                {
                    
$defer['userIds'] = $userIds;
                }
                else if (
$totalUsers > 10000)
                {
                    
$defer['criteria'] = $criteriaPrepared;
                }
                else
                {
                    
$defer['userIds'] = $userModel->getUserIds($criteriaPrepared);
                }

                
XenForo_Application::defer('UserAction', $defer, null, true);

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildAdminLink('tools/run-deferred', null, array(
                        
'redirect' => XenForo_Link::buildAdminLink('users/batch-update', null, array('success' => 1))
                    ))
                );
            }
            else
            {
                return 
$this->responseView('XenForo_ViewAdmin_User_BatchUpdateConfirm', 'user_batch_update_confirm', array(
                    
'criteria' => $criteria,
                    
'userIds' => $userIds,
                    
'totalUsers' => $totalUsers,
                    
'linkParams' => array('criteria' => $criteria, 'order' => 'username', 'direction' => 'asc'),
                    
'userGroups' => $this->_getUserGroupModel()->getAllUserGroupTitles(),
                ));
            }
        }
        else
        {
            
$viewParams = array(
                
'success' => $this->_input->filterSingle('success', XenForo_Input::UINT)
            );

            
$criteriaHelper = $this->_getCriteriaHelper();
            
$viewParams += $criteriaHelper->getDataForUserSearchForm();
            
$viewParams['criteria'] = $criteriaHelper->getDefaultUserSearchCriteria();

            return 
$this->responseView('XenForo_ViewAdmin_User_BatchUpdateSearch', 'user_batch_update_search', $viewParams);
        }
    }

    
/**
     * Searches for a user by the left-most prefix of a name (for auto-complete(.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSearchName()
    {
        
$q = ltrim($this->_input->filterSingle('q', XenForo_Input::STRING, array('noTrim' => true)));

        if (
$q !== '')
        {
            
$users = $this->_getUserModel()->getUsers(
                array(
'username' => array($q , 'r')),
                array(
'limit' => 10)
            );
        }
        else
        {
            
$users = array();
        }

        
$viewParams = array(
            
'users' => $users
        
);

        return 
$this->responseView(
            
'XenForo_ViewAdmin_User_SearchName',
            
'',
            
$viewParams
        
);
    }

    protected function 
_getUserAddEditResponse(array $user)
    {
        
$userModel = $this->_getUserModel();

        if (
$user['user_id'])
        {
            
$user['is_super_admin'] = $this->_getUserModel()->isUserSuperAdmin($user);
        }
        else
        {
            
$user['is_super_admin'] = false;
        }

        
$fieldModel = $this->_getFieldModel();
        
$customFields = $fieldModel->prepareUserFields($fieldModel->getUserFields(
            array(),
            array(
'valueUserId' => $user['user_id'])
        ), 
true);

        
$viewParams = array(
            
'user' => $user,
            
'timeZones'    => XenForo_Helper_TimeZone::getTimeZones(),
            
'userGroups' => $this->_getUserGroupModel()->getAllUserGroupTitles(),
            
'customFieldsGrouped' => $fieldModel->groupUserFields($customFields),
            
'styles' => $this->getModelFromCache('XenForo_Model_Style')->getStylesForOptionsTag($user['style_id']),
            
'languages' => $this->getModelFromCache('XenForo_Model_Language')->getLanguagesForOptionsTag($user['language_id']),
            
'lastHash' => $this->getLastHash($user['user_id'])
        );

        return 
$this->responseView('XenForo_ViewAdmin_User_Edit', 'user_edit', $viewParams);
    }

    
/**
     * Form to add a user.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAdd()
    {
        
$user = array(
            
'user_id' => 0,
            
'timezone' => XenForo_Application::get('options')->guestTimeZone,
            
'user_group_id' => XenForo_Model_User::$defaultRegisteredGroupId,
            
'style_id' => 0,
            
'language_id' => XenForo_Application::get('options')->defaultLanguageId,
            
'user_state' => 'valid',
            
'enable_rte' => 1,
            
'enable_flash_uploader' => 1,
            
'message_count' => 0,
            
'like_count' => 0,
            
'trophy_points' => 0
        
);
        
$user = array_merge($user, XenForo_Application::get('options')->registrationDefaults);

        return 
$this->_getUserAddEditResponse($user);
    }

    
/**
     * Form to edit an existing user.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEdit()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$this->getHelper('Admin')->checkSuperAdminEdit($user);

        return 
$this->_getUserAddEditResponse($user);
    }

    
/**
     * Validate a single field
     *
     * @return XenForo_ControllerResponse_View|XenForo_ControllerResponse_Error
     */
    
public function actionValidateField()
    {
        
$this->_assertPostOnly();

        
$field = $this->_getFieldValidationInputParams();
        
$existingKey = $this->_input->filterSingle('user_id', XenForo_Input::UINT);

        if (
preg_match('/^custom_field_([a-zA-Z0-9_]+)$/', $field['name'], $match))
        {
            
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
            if (
$existingKey)
            {
                
$writer->setExistingData($existingKey);
            }
            
$writer->setOption(XenForo_DataWriter_User::OPTION_ADMIN_EDIT, true);

            
$writer->setCustomFields(array($match[1] => $field['value']));

            if (
$errors = $writer->getErrors())
            {
                return 
$this->responseError($errors);
            }

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
'',
                new 
XenForo_Phrase('redirect_field_validated', array('name' => $field['name'], 'value' => $field['value']))
            );
        }
        else
        {
            
// handle normal fields
            
return $this->_validateField(
                
'XenForo_DataWriter_User',
                array(
'existingDataKey' => $existingKey),
                array(
XenForo_DataWriter_User::OPTION_ADMIN_EDIT => true)
            );
        }
    }

    
/**
     * Inserts a new user or updates an existing one.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionSave()
    {
        
$this->_assertPostOnly();

        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);

        if (
$userId)
        {
            
$user = $this->_getUserOrError($userId);
            
$this->getHelper('Admin')->checkSuperAdminEdit($user);

            if (
$this->_getUserModel()->isUserSuperAdmin($user))
            {
                
$visitorPassword = $this->_input->filterSingle('visitor_password', XenForo_Input::STRING);
                
$this->getHelper('Admin')->assertVisitorPasswordCorrect($visitorPassword);
            }
        }

        
$userInput = $this->_input->filter(array(

            
// essentials
            
'username'               => XenForo_Input::STRING,
            
'email'                  => XenForo_Input::STRING,

            
'user_group_id'          => XenForo_Input::UINT,
            
'user_state'             => XenForo_Input::STRING,
            
'is_discouraged'         => XenForo_Input::UINT,
            
'is_staff'               => XenForo_Input::UINT,

            
// personal details
            
'gender'                 => XenForo_Input::STRING,
            
'dob_day'                => XenForo_Input::UINT,
            
'dob_month'              => XenForo_Input::UINT,
            
'dob_year'               => XenForo_Input::UINT,
            
'location'               => XenForo_Input::STRING,
            
'occupation'             => XenForo_Input::STRING,

            
// profile info
            
'custom_title'           => XenForo_Input::STRING,
            
'homepage'               => XenForo_Input::STRING,
            
'about'                  => XenForo_Input::STRING,
            
'signature'              => XenForo_Input::STRING,

            
'message_count'          => XenForo_Input::UINT,
            
'like_count'             => XenForo_Input::UINT,
            
'trophy_points'          => XenForo_Input::UINT,

            
// preferences
            
'style_id'               => XenForo_Input::UINT,
            
'language_id'            => XenForo_Input::UINT,
            
'timezone'               => XenForo_Input::STRING,
            
'content_show_signature' => XenForo_Input::UINT,
            
'enable_rte'             => XenForo_Input::UINT,
            
'enable_flash_uploader'  => XenForo_Input::UINT,
            
'email_on_conversation'  => XenForo_Input::UINT,
            
'default_watch_state'    => XenForo_Input::STRING,

            
// privacy
            
'visible'                 => XenForo_Input::UINT,
            
'receive_admin_email'     => XenForo_Input::UINT,
            
'show_dob_date'           => XenForo_Input::UINT,
            
'show_dob_year'           => XenForo_Input::UINT,
            
'allow_view_profile'      => XenForo_Input::STRING,
            
'allow_post_profile'      => XenForo_Input::STRING,
            
'allow_send_personal_conversation' => XenForo_Input::STRING,
            
'allow_view_identities'   => XenForo_Input::STRING,
            
'allow_receive_news_feed' => XenForo_Input::STRING,
        ));

        
$secondaryGroupIds = $this->_input->filterSingle('secondary_group_ids', XenForo_Input::UINT, array('array' => true));

        
$userInput['about'] = XenForo_Helper_String::autoLinkBbCode($userInput['about']);

        if (
$this->_input->filterSingle('clear_status', XenForo_Input::UINT))
        {
            
//TODO: clear status
        
}

        
/* @var $writer XenForo_DataWriter_User */
        
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User');
        if (
$userId)
        {
            
$writer->setExistingData($userId);
        }
        
$writer->setOption(XenForo_DataWriter_User::OPTION_ADMIN_EDIT, true);

        
$writer->bulkSet($userInput);
        
$writer->setSecondaryGroups($secondaryGroupIds);

        
$password = $this->_input->filterSingle('password', XenForo_Input::STRING);
        if (
$password !== '')
        {
            
$writer->setPassword($password, false, null, true);
        }

        
$customFields = $this->_input->filterSingle('custom_fields', XenForo_Input::ARRAY_SIMPLE);
        
$customFieldsShown = $this->_input->filterSingle('custom_fields_shown', XenForo_Input::STRING, array('array' => true));
        
$writer->setCustomFields($customFields, $customFieldsShown);

        
$writer->save();

        
$userId = $writer->get('user_id');

        
// TODO: redirect to previous search if possible?

        
return $this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildAdminLink('users/search', null, array('last_user_id' => $userId)) . $this->getLastHash($userId)
        );
    }

    
/**
     * Displays a form to edit a user's avatar.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAvatar()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$this->getHelper('Admin')->checkSuperAdminEdit($user);

        
$viewParams = array(
            
'user' => $user,
        );

        return 
$this->responseView('XenForo_ViewAdmin_User_Avatar', 'user_avatar', $viewParams);
    }

    
/**
     * Updates a user's avatar.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionAvatarUpload()
    {
        
$this->_assertPostOnly();

        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$this->getHelper('Admin')->checkSuperAdminEdit($user);

        
$avatars = XenForo_Upload::getUploadedFiles('avatar');
        
$avatar = reset($avatars);

        
/* @var $avatarModel XenForo_Model_Avatar */
        
$avatarModel = $this->getModelFromCache('XenForo_Model_Avatar');

        if (
$avatar)
        {
            
$avatarModel->uploadAvatar($avatar, $user['user_id'], false);
        }
        else if (
$this->_input->filterSingle('delete', XenForo_Input::UINT))
        {
            
$avatarModel->deleteAvatar($user['user_id']);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildAdminLink('users/edit', $user)
        );
    }

    
/**
     * Deletes the specified user.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionDelete()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$writer = XenForo_DataWriter::create('XenForo_DataWriter_User', XenForo_DataWriter::ERROR_EXCEPTION);
        
$writer->setExistingData($user);
        
$writer->preDelete();

        
$this->getHelper('Admin')->checkSuperAdminEdit($user);

        if (
$this->isConfirmedPost())
        {
            if (
$this->_getUserModel()->isUserSuperAdmin($user))
            {
                
$visitorPassword = $this->_input->filterSingle('visitor_password', XenForo_Input::STRING);
                
$this->getHelper('Admin')->assertVisitorPasswordCorrect($visitorPassword);
            }

            return 
$this->_deleteData(
                
'XenForo_DataWriter_User', 'user_id',
                
XenForo_Link::buildAdminLink('users')
            );
        }
        else 
// show confirmation dialog
        
{
            
$user['is_super_admin'] = $this->_getUserModel()->isUserSuperAdmin($user);

            
$viewParams = array(
                
'user' => $user
            
);

            return 
$this->responseView('XenForo_ViewAdmin_User_Delete',
                
'user_delete', $viewParams
            
);
        }
    }

    public function 
actionMerge()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        if (
$user['is_admin'] || $user['is_moderator'])
        {
            return 
$this->responseNoPermission();
        }

        if (
$this->isConfirmedPost())
        {
            
$mergeUserName = $this->_input->filterSingle('username', XenForo_Input::STRING);
            
$mergeUser = $this->_getUserModel()->getUserByName($mergeUserName);
            if (
$mergeUser)
            {
                
$this->_getUserModel()->mergeUsers($mergeUser, $user);

                return 
$this->responseRedirect(
                    
XenForo_ControllerResponse_Redirect::SUCCESS,
                    
XenForo_Link::buildAdminLink('users/edit', $mergeUser)
                );
            }
        }

        return 
$this->responseView('XenForo_ViewAdmin_User_Merge', 'user_merge', array(
            
'user' => $user
        
));
    }

    public function 
actionDeleteConversations()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        if (
$user['is_admin'] || $user['is_moderator'])
        {
            return 
$this->responseNoPermission();
        }

        if (
$this->isConfirmedPost())
        {
            
/** @var $conversationModel XenForo_Model_Conversation */
            
$conversationModel = $this->getModelFromCache('XenForo_Model_Conversation');
            
$conversationModel->deleteConversationsStartedByUser($user['user_id']);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('users/edit', $user)
            );
        }

        return 
$this->responseView('XenForo_ViewAdmin_User_ConversationDelete', 'user_conversation_delete', array(
            
'user' => $user
        
));
    }

    public function 
actionRevertMessageEdit()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$options = XenForo_Application::getOptions();

        if (
$this->_getUserModel()->isUserSuperAdmin($user) || !$options->editHistory['enabled'])
        {
            return 
$this->responseNoPermission();
        }

        if (
$this->isConfirmedPost())
        {
            
$input = $this->_input->filter(array(
                
'cutoff_value' => XenForo_Input::UINT,
                
'cutoff_unit' => XenForo_Input::STRING
            
));
            
$cutOff = strtotime('-' . $input['cutoff_value'] . ' ' . $input['cutoff_unit']);
            if (
$options->editHistory['length'])
            {
                
$cutOff = max($cutOff, XenForo_Application::$time - $options->editHistory['length'] * 86400);
            }

            
$cutOff = max(0, $cutOff);

            
$defer = array('userId' => $user['user_id'], 'cutOff' => $cutOff);
            
XenForo_Application::defer('UserRevertMessageEdit', $defer, null, true);

            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('users/edit', $user)
            );
        }

        return 
$this->responseView('XenForo_ViewAdmin_User_RevertMessageEdit', 'user_revert_message_edit', array(
            
'user' => $user
        
));
    }

    
/**
     * Shows a list of moderated users and allows them to be managed.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionModerated()
    {
        
$users = $this->_getUserModel()->getUsers(array(
            
'user_state' => 'moderated'
        
), array('limit' => 100));

        
$class = XenForo_Application::resolveDynamicClass('XenForo_Session');
        
/** @var $publicSession XenForo_Session */
        
$publicSession = new $class();
        
$publicSession->start();
        if (
$publicSession->get('user_id') == XenForo_Visitor::getUserId())
        {
            
$sessionCounts = $publicSession->get('userModerationCounts');
            if (!
is_array($sessionCounts) || $sessionCounts['total'] != count($users))
            {
                
$publicSession->remove('userModerationCounts');
                
$publicSession->save();

                
$this->getModelFromCache('XenForo_Model_User')->rebuildUserModerationQueueCache();
            }
        }

        if (!
$users)
        {
            return 
$this->responseMessage(new XenForo_Phrase('no_users_awaiting_approval'));
        }

        
/** @var XenForo_Model_SpamPrevention $spamPreventionModel */
        
$spamPreventionModel = $this->getModelFromCache('XenForo_Model_SpamPrevention');

        
$spamLogs = $spamPreventionModel->getSpamTriggerLogsByContentIds('user', array_keys($users));
        
$spamLogs = $spamPreventionModel->prepareSpamTriggerLogs($spamLogs);

        foreach (
$users AS &$user)
        {
            
$ips = $this->_getUserModel()->getRegistrationIps($user['user_id']);
            
$user['ip'] = $ips ? reset($ips) : false;
            
$user['ipHost'] = $user['ip'] ? XenForo_Model_Ip::getHost($user['ip']) : false;

            if (isset(
$spamLogs[$user['user_id']]))
            {
                
$user['spamDetails'] = $spamLogs[$user['user_id']]['detailsPrintable'];
            }
            else
            {
                
$user['spamDetails'] = false;
            }
        }

        
$viewParams = array(
            
'users' => $users
        
);

        return 
$this->responseView('XenForo_ViewAdmin_User_Moderated', 'user_moderated', $viewParams);
    }

    
/**
     * Processes moderated users.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionModeratedUpdate()
    {
        
$this->_assertPostOnly();

        
$usersInput = $this->_input->filterSingle('users', XenForo_Input::ARRAY_SIMPLE);
        
$users = $this->_getUserModel()->getUsersByIds(array_keys($usersInput));

        foreach (
$users AS $user)
        {
            if (!isset(
$usersInput[$user['user_id']]))
            {
                continue;
            }

            
$userControl = $usersInput[$user['user_id']];
            if (empty(
$userControl['action']) || $userControl['action'] == 'none')
            {
                continue;
            }

            
$notify = (!empty($userControl['notify']) ? true : false);
            
$rejectionReason = (!empty($userControl['reject_reason']) ? $userControl['reject_reason'] : '');

            
$this->getModelFromCache('XenForo_Model_UserConfirmation')->processUserModeration(
                
$user, $userControl['action'], $notify, $rejectionReason
            
);
        }

        return 
$this->responseRedirect(
            
XenForo_ControllerResponse_Redirect::SUCCESS,
            
XenForo_Link::buildAdminLink('users/moderated')
        );
    }

    
/**
     * Displays the form to setup the email, or to confirm sending of it.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEmail()
    {
        if (
$this->isConfirmedPost())
        {
            
$criteria = $this->_input->filterSingle('criteria', XenForo_Input::JSON_ARRAY);
            
$criteria = $this->_filterUserSearchCriteria($criteria);
            
$criteriaPrepared = $this->_prepareUserSearchCriteria($criteria);

            if (
$this->_input->filterSingle('list_only', XenForo_Input::UINT))
            {
                
$users = $this->_getUserModel()->getUsers($criteriaPrepared);
                if (!
$users)
                {
                    return 
$this->responseError(new XenForo_Phrase('no_users_matched_specified_criteria'));
                }

                
$viewParams = array(
                    
'users' => $users
                
);

                return 
$this->responseView('XenForo_ViewAdmin_User_EmailList', 'user_email_list', $viewParams);
            }

            
$email = $this->_input->filter(array(
                
'from_name' => XenForo_Input::STRING,
                
'from_email' => XenForo_Input::STRING,

                
'email_title' => XenForo_Input::STRING,
                
'email_format' => XenForo_Input::STRING,
                
'email_body' => XenForo_Input::STRING
            
));

            if (!
$email['from_name'] || !$email['from_email'] || !$email['email_title'] || !$email['email_body'])
            {
                return 
$this->responseError(new XenForo_Phrase('please_complete_required_fields'));
            }

            
$total = $this->_getUserModel()->countUsers($criteriaPrepared);
            if (!
$total)
            {
                return 
$this->responseError(new XenForo_Phrase('no_users_matched_specified_criteria'));
            }

            
$viewParams = array(
                
'test' => $this->_input->filterSingle('test', XenForo_Input::STRING),
                
'total' => $total,
                
'criteria' => $criteria,
                
'email' => $email
            
);

            return 
$this->responseView('XenForo_ViewAdmin_User_EmailConfirm', 'user_email_confirm', $viewParams);
        }
        else
        {
            
$viewParams = array(
                
'sent' => $this->_input->filterSingle('sent', XenForo_Input::UINT),
                
'failed' => $this->_input->filterSingle('failed', XenForo_Input::UINT)
            );

            
$criteriaHelper = $this->_getCriteriaHelper();
            
$viewParams += $criteriaHelper->getDataForUserSearchForm();
            
$viewParams['criteria'] = $criteriaHelper->getDefaultUserSearchCriteria();
            
$viewParams['criteria']['user_state'] = array('valid' => true);
            
$viewParams['criteria']['is_banned'] = array(0 => true);


            return 
$this->responseView('XenForo_ViewAdmin_User_Email', 'user_email', $viewParams);
        }
    }

    
/**
     * Sends the specified email.
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionEmailSend()
    {
        
$this->_assertPostOnly();

        
$criteria = $this->_input->filterSingle('criteria', XenForo_Input::JSON_ARRAY);
        
$criteria = $this->_filterUserSearchCriteria($criteria);
        
$criteriaPrepared = $this->_prepareUserSearchCriteria($criteria);

        
$email = $this->_input->filter(array(
            
'from_name' => XenForo_Input::STRING,
            
'from_email' => XenForo_Input::STRING,

            
'email_title' => XenForo_Input::STRING,
            
'email_format' => XenForo_Input::STRING,
            
'email_body' => XenForo_Input::STRING
        
));

        
$total = $this->_input->filterSingle('total', XenForo_Input::UINT);
        
$failed = $this->_input->filterSingle('failed', XenForo_Input::UINT);

        
$transport = XenForo_Mail::getTransport();

        if (
$this->_input->filterSingle('test', XenForo_Input::STRING))
        {
            
$this->_sendEmail(XenForo_Visitor::getInstance()->toArray(), $email, $transport);

            return 
$this->responseReroute(__CLASS__, 'email');
        }

        
$page = max(1, $this->_input->filterSingle('page', XenForo_Input::UINT));
        
$perPage = 30;

        
$users = $this->_getUserModel()->getUsers($criteriaPrepared, array(
            
'page' => $page,
            
'perPage' => $perPage
        
));
        if (!
$users)
        {
            return 
$this->responseRedirect(
                
XenForo_ControllerResponse_Redirect::SUCCESS,
                
XenForo_Link::buildAdminLink('users/email', false, array(
                    
'sent' => $total,
                    
'failed' => $failed
                
))
            );
        }
        else
        {
            foreach (
$users AS $user)
            {
                if (!
$this->_sendEmail($user, $email, $transport))
                {
                    
$failed++;
                }
            }

            
$viewParams = array(
                
'total' => $total,
                
'failed' => $failed,
                
'completed' => ($page - 1) * $perPage + count($users),
                
'nextPage' => $page + 1,

                
'criteria' => $criteria,
                
'email' => $email
            
);
            return 
$this->responseView('XenForo_ViewAdmin_User_Email_Send', 'user_email_send', $viewParams);
        }
    }

    protected function 
_sendEmail(array $user, array $email, Zend_Mail_Transport_Abstract $transport)
    {
        if (!
$user['email'])
        {
            return 
false;
        }

        if (!
XenForo_Application::get('config')->enableMail)
        {
            return 
true;
        }

        
XenForo_Db::ping();

        
$mailObj = new Zend_Mail('utf-8');
        
$mailObj->setSubject($email['email_title'])
            ->
addTo($user['email'], $user['username'])
            ->
setFrom($email['from_email'], $email['from_name']);

        
$options = XenForo_Application::get('options');
        
$bounceEmailAddress = $options->bounceEmailAddress;
        if (!
$bounceEmailAddress)
        {
            
$bounceEmailAddress = $options->defaultEmailAddress;
        }
        
$mailObj->setReturnPath($bounceEmailAddress);

        if (
$email['email_format'] == 'html')
        {
            
$replacements = array(
                
'{name}' => htmlspecialchars($user['username']),
                
'{email}' => htmlspecialchars($user['email']),
                
'{id}' => $user['user_id']
            );
            
$email['email_body'] = strtr($email['email_body'], $replacements);

            
$text = trim(
                
htmlspecialchars_decode(strip_tags($email['email_body']))
            );

            
$mailObj->setBodyHtml($email['email_body'])
                ->
setBodyText($text);
        }
        else
        {
            
$replacements = array(
                
'{name}' => $user['username'],
                
'{email}' => $user['email'],
                
'{id}' => $user['user_id']
            );
            
$email['email_body'] = strtr($email['email_body'], $replacements);

            
$mailObj->setBodyText($email['email_body']);
        }

        if (!
$mailObj->getMessageId())
        {
            
$mailObj->setMessageId();
        }

        try
        {
            
$mailObj->send($transport);
        }
        catch (
Exception $e)
        {
            
XenForo_Error::logException($e, false, "Email to $user[email] failed: ");
            return 
false;
        }

        return 
true;
    }

    
/**
     * Lists all IPs logged for the specified user
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionUserIps()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        if (
$ips = $this->_getIpModel()->getIpsByUserId($userId))
        {
            
$viewParams = array(
                
'user' => $user,
                
'ips' => $ips
            
);

            return 
$this->responseView('XenForo_ViewAdmin_User_UserIps', 'user_ips', $viewParams);
        }
        else
        {
            return 
$this->responseMessage(new XenForo_Phrase('no_ip_logs_for_requested_user'));
        }
    }

    public function 
actionChangeLog()
    {
        
$userId = $this->_input->filterSingle('user_id', XenForo_Input::UINT);
        
$user = $this->_getUserOrError($userId);

        
$page = $this->_input->filterSingle('page', XenForo_Input::UINT);
        
$perPage = 20;

        
$conditions = array('user_id' => $userId);

        
/** @var XenForo_Model_UserChangeLog $userChangeModel */
        
$userChangeModel = $this->getModelFromCache('XenForo_Model_UserChangeLog');

        
$logs = $userChangeModel->getChangeLogs($conditions, array(
            
'page' => $page,
            
'perPage' => $perPage
        
));

        
$viewParams = array(
            
'logs' => $logs,
            
'user' => $user,

            
'page' => $page,
            
'perPage' => $perPage,
            
'total' => $userChangeModel->countChangeLogs($conditions),
        );

        return 
$this->responseView('XenForo_ViewAdmin_User_ChangeLog_User', 'user_change_log_user', $viewParams);
    }

    
/**
     * Lists all users logged from the specified IP
     *
     * @return XenForo_ControllerResponse_Abstract
     */
    
public function actionIpUsers()
    {
        
$ip = $this->_input->filterSingle('ip', XenForo_Input::STRING);

        
$fetchOptions = array(
            
'join' => XenForo_Model_User::FETCH_USER_PROFILE
        
);

        
$ipDetails = XenForo_Helper_Ip::parseIpRangeString($ip);
        if (!
$ipDetails)
        {
            return 
$this->responseMessage(new XenForo_Phrase('please_enter_valid_ip_or_ip_range'));
        }
        else if (
$ipDetails['isRange'])
        {
            
$users = $this->_getUserModel()->getUsersByIpRange(
                
$ipDetails['startRange'], $ipDetails['endRange'], $fetchOptions
            
);
        }
        else
        {
            
$users = $this->_getUserModel()->getUsersByIp(
                
$ip, $fetchOptions
            
);
        }

        if (
$users)
        {
            
$viewParams = array(
                
'users' => $users,
                
'ip' => $ip,
                
'ipPrintable' => $ipDetails['printable']
            );

            return 
$this->responseView('XenForo_ViewAdmin_Users_IpUsers', 'ip_users', $viewParams);
        }
        else
        {
            return 
$this->responseMessage(new XenForo_Phrase('no_users_logged_at_ip'));
        }
    }

    
/**
     * Gets the specified user or throws an exception.
     *
     * @param string $id
     *
     * @return array
     */
    
protected function _getUserOrError($id)
    {
        
$userModel = $this->_getUserModel();

        return 
$this->getRecordOrError(
            
$id, $userModel, 'getFullUserById',
            
'requested_user_not_found'
        
);
    }

    
/**
     * @return XenForo_Model_User
     */
    
protected function _getUserModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_User');
    }

    
/**
     * @return XenForo_Model_UserField
     */
    
protected function _getFieldModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_UserField');
    }

    
/**
     * @return XenForo_Model_UserGroup
     */
    
protected function _getUserGroupModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_UserGroup');
    }

    
/**
     * @return XenForo_Model_Ip
     */
    
protected function _getIpModel()
    {
        return 
$this->getModelFromCache('XenForo_Model_Ip');
    }

    
/**
     * @return XenForo_ControllerHelper_UserCriteria
     */
    
protected function _getCriteriaHelper()
    {
        return 
$this->getHelper('UserCriteria');
    }
}
Онлайн: 2
Реклама