| Current Path : /var/www/html/administrator/components/com_kunena/src/Controller/ |
| Current File : /var/www/html/administrator/components/com_kunena/src/Controller/UsersController.php |
<?php
/**
* Kunena Component
*
* @package Kunena.Administrator
* @subpackage Controllers
*
* @copyright Copyright (C) 2008 - 2026 Kunena Team. All rights reserved.
* @license https://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link https://www.kunena.org
**/
namespace Kunena\Forum\Administrator\Controller;
\defined('_JEXEC') or die();
use Exception;
use Joomla\CMS\Date\Date;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Router\Route;
use Joomla\CMS\Session\Session;
use Joomla\CMS\User\UserFactoryInterface;
use Joomla\Utilities\ArrayHelper;
use Kunena\Forum\Libraries\Access\KunenaAccess;
use Kunena\Forum\Libraries\Controller\KunenaController;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategory;
use Kunena\Forum\Libraries\Forum\Category\KunenaCategoryHelper;
use Kunena\Forum\Libraries\Forum\KunenaForum;
use Kunena\Forum\Libraries\Forum\Message\KunenaMessageHelper;
use Kunena\Forum\Libraries\Route\KunenaRoute;
use Kunena\Forum\Libraries\User\KunenaBan;
use Kunena\Forum\Libraries\User\KunenaUser;
use Kunena\Forum\Libraries\User\KunenaUserHelper;
/**
* Kunena Users Controller
*
* @since Kunena 2.0
*/
class UsersController extends KunenaController
{
/**
* @var string The prefix to use with controller messages.
* @since 1.6
*/
protected $textPrefix = 'COM_KUNENA_USERS';
/**
* @var null|string
* @since Kunena 6.0
*/
protected $baseurl = null;
/**
* Constructor.
*
* @param array $config An optional associative array of configuration settings.
*
* @throws Exception
* @since Kunena 2.0
*
* @see KunenaController
*/
public function __construct($config = array())
{
parent::__construct($config);
$this->baseurl = 'administrator/index.php?option=com_kunena&view=users';
}
/**
* Proxy for getModel.
*
* @param string $name The model name. Optional.
* @param string $prefix The class prefix. Optional.
* @param array $config Configuration array for model. Optional.
*
* @return object The model.
*
* @since 1.6
*/
public function getModel($name = 'User', $prefix = 'Administrator', $config = ['ignore_request' => true]): object
{
return parent::getModel($name, $prefix, $config);
}
/**
* Edit the user
*
* @return boolean|void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function edit()
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return false;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return false;
}
$this->app->setUserState('kunena.user.userid', $userid);
$this->setRedirect(Route::_("index.php?option=com_kunena&view=user&layout=edit&userid={$userid}", false));
}
/**
* Trash menu
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function trashusermessages(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
if ($cid) {
foreach ($cid as $id) {
list($total, $messages) = KunenaMessageHelper::getLatestMessages(false, 0, 0, ['starttime' => '-1', 'user' => $id]);
foreach ($messages as $mes) {
$mes->publish(KunenaForum::DELETED);
}
}
} else {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$this->app->enqueueMessage(Text::_('COM_KUNENA_A_USERMES_TRASHED_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Move
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function move(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
if (empty($cid)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$this->app->setUserState('kunena.usermove.userids', $cid);
$this->setRedirect(Route::_("index.php?option=com_kunena&view=user&layout=move", false));
}
/**
* Logout the user
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function logout(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$id = array_shift($cid);
if ($id <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$options = ['clientid' => 0];
$this->app->logout((int) $id, $options);
$this->app->enqueueMessage(Text::_('COM_KUNENA_A_USER_LOGOUT_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Remove the user
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function remove(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
if (empty($cid)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$users = KunenaUserHelper::loadUsers($cid);
$my = $this->app->getIdentity();
$usernames = [];
foreach ($users as $user) {
if ($my->id == $user->userid) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USER_ERROR_CANNOT_DELETE_YOURSELF'), 'error');
continue;
}
$instance = Factory::getContainer(UserFactoryInterface::class)->get(UserFactoryInterface::class)->loadUserById($user->userid);
if ($instance->authorise('core.admin')) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USER_ERROR_CANNOT_DELETE_ADMINS'), 'error');
continue;
}
$result = $user->delete();
if (!$result) {
$this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_KUNENA_USER_TABLE_FAILED', $user->userid), 'error');
continue;
}
// Delete the user too from Joomla!
$jresult = $instance->delete();
if (!$jresult) {
$this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_JOOMLA_USER_TABLE_FAILED', $user->userid), 'error');
continue;
}
$usernames[] = $user->username;
}
if (!empty($usernames)) {
$this->app->enqueueMessage(Text::sprintf('COM_KUNENA_USER_DELETE_DONE_SUCCESSFULLY', implode(', ', $usernames)), 'success');
}
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Ban
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function ban(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$ban = KunenaBan::getInstanceByUserid($userid, true);
if (!$ban->id) {
$ban->ban($userid);
} else {
$now = new Date();
$ban->setExpiration($now);
}
$message = Text::_('COM_KUNENA_USER_BANNED_DONE');
try {
$ban->save();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
}
$this->app->enqueueMessage($message, 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Unban
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function unban(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$ban = KunenaBan::getInstanceByUserid($userid, true);
if (!$ban->id) {
$ban->ban($userid);
} else {
$now = new Date();
$ban->setExpiration($now);
}
$message = Text::_('COM_KUNENA_USER_UNBAN_DONE');
try {
$ban->save();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
}
$this->app->enqueueMessage($message, 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Set an user as global moderator, works only if you are an admin
*
* @return void
*
* @throws null
* @since Kunena 5.1
*/
public function moderate(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$modCatids = $this->input->get('catid', [], 'array');
$modCatids = ArrayHelper::toInteger($modCatids);
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$user = KunenaUserHelper::get($userid);
$this->setModerate($user, $modCatids);
$this->app->enqueueMessage(Text::_('COM_KUNENA_USER_MODERATE_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Set moderator rights on the user given
*
* @param KunenaUser $user user
* @param array $modCatids modCatids
*
* @return boolean
*
* @throws Exception
* @since Kunena 5.1
*/
protected function setModerate(KunenaUser $user, array $modCatids): bool
{
// Update moderator rights
$categories = KunenaCategoryHelper::getCategories(false, false, 'admin');
foreach ($categories as $category) {
$category->setModerator($user, \in_array($category->id, $modCatids, true));
}
// Global moderator is a special case
if (KunenaUserHelper::getMyself()->isAdmin()) {
KunenaAccess::getInstance()->setModerator((object) [], $user, \in_array(0, $modCatids, true));
}
return true;
}
/**
* Unmoderate
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 5.1
*/
public function unmoderate(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$user = KunenaUserHelper::get($userid);
$category = null;
if ($category instanceof KunenaCategory) {
$category = $category->id;
}
$category = \intval($category);
$userCategory = KunenaUserHelper::get($category, $user);
if ($userCategory->role == 1) {
$userCategory->role = false;
if (!$userCategory->params) {
$userCategory->params = '';
}
$success = $userCategory->save();
// Clear role cache
KunenaAccess::getInstance()->clearCache();
// Change user moderator status
$moderator = KunenaAccess::getInstance()->getModeratorStatus($user);
if ($user->moderator != !empty($moderator)) {
$user->moderator = \intval(!empty($moderator));
try {
$success = $user->save();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
}
}
}
$message = Text::_('COM_KUNENA_USER_UNMODERATE_DONE');
if ($success) {
$this->app->enqueueMessage($message, 'success');
}
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Block
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function block()
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$ban = KunenaBan::getInstanceByUserid($userid, true);
if (!$ban->id) {
$ban->ban($userid, null, 1);
} else {
$now = new Date();
$ban->setExpiration($now);
}
$message = Text::_('COM_KUNENA_USER_BLOCKED_DONE');
try {
$ban->save();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
}
$this->app->enqueueMessage($message, 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Unblock
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function unblock(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$userid = array_shift($cid);
if ($userid <= 0) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_PROFILE_NO_USER'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$ban = KunenaBan::getInstanceByUserid($userid, true);
if (!$ban->id) {
$ban->ban($userid, null, 1);
} else {
$now = new Date();
$ban->setExpiration($now);
}
$message = Text::_('COM_KUNENA_USER_UNBLOCK_DONE');
try {
$ban->save();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
}
$this->app->enqueueMessage($message, 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Batch Moderators
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 2.0
*/
public function batchmoderators(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
$catids = $this->input->get('catid', [], 'array');
$catids = ArrayHelper::toInteger($catids, []);
if (empty($cid)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_USERS_SELECTED'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
if (empty($catids)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_CATEGORIES_SELECTED'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
// Update moderator rights
$categories = KunenaCategoryHelper::getCategories(false, false, 'admin');
$users = KunenaUserHelper::loadUsers($cid);
foreach ($users as $user) {
foreach ($categories as $category) {
if (\in_array($category->id, $catids)) {
$category->setModerator($user, true);
}
}
// Global moderator is a special case
if ($this->me->isAdmin() && \in_array(0, $catids)) {
KunenaAccess::getInstance()->setModerator(0, $user, true);
}
}
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_SET_MODERATORS_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Method to just redirect to main manager in case of use of cancel button
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 4.0
*/
public function cancel(): void
{
$this->app->redirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Remove categories subscriptions for the users selected
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 6.0
*/
public function removecatsubscriptions(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
if (!empty($cid)) {
foreach ($cid as $userid) {
$query = $this->db->createQuery();
$query->update($this->db->quoteName('#__kunena_user_categories'))
->set($this->db->quoteName('subscribed') . ' = 0')
->where($this->db->quoteName('user_id') . ' = ' . $userid);
$this->db->setQuery($query);
try {
$this->db->execute();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
return;
}
}
}
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_REMOVE_CAT_SUBSCRIPTIONS_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Remove topics subscriptions for the users selected
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 6.0
*/
public function removetopicsubscriptions(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$cid = $this->input->get('cid', [], 'array');
$cid = ArrayHelper::toInteger($cid, []);
if (!empty($cid)) {
foreach ($cid as $userid) {
$query = $this->db->createQuery();
$query->update($this->db->quoteName('#__kunena_user_topics'))
->set($this->db->quoteName('subscribed') . ' = 0')
->where($this->db->quoteName('user_id') . ' = ' . $userid);
$this->db->setQuery($query);
try {
$this->db->execute();
} catch (Exception $e) {
$this->app->enqueueMessage($e->getMessage(), 'error');
return;
}
}
}
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_REMOVE_TOPIC_SUBSCRIPTIONS_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
/**
* Subscribe users to categories selected
*
* @return void
*
* @throws Exception
* @throws null
* @since Kunena 6.0
*/
public function subscribeuserstocategories(): void
{
if (!Session::checkToken()) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_ERROR_TOKEN'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$userids = $this->input->get('cid', [], 'array');
$userids = ArrayHelper::toInteger($userids);
$catids = $this->input->get('catid', [], 'array');
$catids = ArrayHelper::toInteger($catids);
if (empty($userids)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_USERS_SELECTED'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
if (empty($catids)) {
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_BATCH_NO_CATEGORIES_SELECTED'), 'error');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
return;
}
$categories = KunenaCategoryHelper::getCategories($catids);
foreach ($userids as $userid) {
foreach ($categories as $category) {
$category->subscribe(true, $userid);
}
}
$this->app->enqueueMessage(Text::_('COM_KUNENA_USERS_ADD_CATEGORIES_SUBSCRIPTIONS_DONE'), 'success');
$this->setRedirect(KunenaRoute::_($this->baseurl, false));
}
}