| Server IP : 54.36.91.62 / Your IP : 216.73.217.94 Web Server : Apache System : Linux webm013.cluster127.gra.hosting.ovh.net 5.15.206-ovh-vps-grsec-zfs-classid #1 SMP Fri May 15 02:41:25 UTC 2026 x86_64 User : coopiak ( 151928) PHP Version : 8.3.23 Disable Function : _dyuweyrj4,_dyuweyrj4r,dl MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /home/coopiak/amisdesseniors-fr/toulouse/libraries/kunena/src/Forum/Category/ |
Upload File : |
<?php
/**
* Kunena Component
*
* @package Kunena.Framework
* @subpackage Forum.Category
*
* @copyright Copyright (C) 2008 - @currentyear@ Kunena Team. All rights reserved.
* @license https://www.gnu.org/copyleft/gpl.html GNU/GPL
* @link https://www.kunena.org
**/
namespace Kunena\Forum\Libraries\Forum\Category;
\defined('_JEXEC') or die();
use Exception;
use InvalidArgumentException;
use Joomla\CMS\Factory;
use Joomla\CMS\Application\SiteApplication;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Uri\Uri;
use Joomla\Database\Exception\ExecutionFailureException;
use Joomla\Registry\Registry;
use Joomla\String\StringHelper;
use Kunena\Forum\Libraries\Access\KunenaAccess;
use Kunena\Forum\Libraries\Attachment\KunenaAttachmentHelper;
use Kunena\Forum\Libraries\Cache\KunenaCacheHelper;
use Kunena\Forum\Libraries\Database\KunenaDatabaseObject;
use Kunena\Forum\Libraries\Date\KunenaDate;
use Kunena\Forum\Libraries\Error\KunenaError;
use Kunena\Forum\Libraries\Exception\KunenaExceptionAuthorise;
use Kunena\Forum\Libraries\Factory\KunenaFactory;
use Kunena\Forum\Libraries\Forum\Category\User\KunenaCategoryUser;
use Kunena\Forum\Libraries\Forum\Category\User\KunenaCategoryUserHelper;
use Kunena\Forum\Libraries\Forum\KunenaForum;
use Kunena\Forum\Libraries\Forum\Message\KunenaMessage;
use Kunena\Forum\Libraries\Forum\Message\Thankyou\KunenaMessageThankyouHelper;
use Kunena\Forum\Libraries\Forum\Topic\KunenaTopic;
use Kunena\Forum\Libraries\Forum\Topic\KunenaTopicHelper;
use Kunena\Forum\Libraries\Html\KunenaParser;
use Kunena\Forum\Libraries\Profiler\KunenaProfiler;
use Kunena\Forum\Libraries\Route\KunenaRoute;
use Kunena\Forum\Libraries\User\KunenaBan;
use Kunena\Forum\Libraries\User\KunenaUser;
use Kunena\Forum\Libraries\User\KunenaUserHelper;
/**
* Class \Kunena\Forum\Libraries\Forum\Category\Category
*
* @property int $id
* @property int $parentid
* @property string $name
* @property string $alias
* @property string $icon
* @property int $icon_id
* @property int $locked
* @property string $accesstype
* @property int $access
* @property int $pubAccess
* @property int $pubRecurse
* @property int $adminAccess
* @property int $adminRecurse
* @property int $ordering
* @property integer $published
* @property string $channels
* @property int $checked_out
* @property string $checked_out_time
* @property int $review
* @property int $allowAnonymous
* @property int $postAnonymous
* @property int $hits
* @property string $description
* @property string $headerdesc
* @property string $topictemplate
* @property string $class_sfx
* @property int $allowPolls
* @property string $topicOrdering
* @property string $iconset
* @property int $numTopics
* @property int $numPosts
* @property int $last_topic_id
* @property int $last_post_id
* @property int $last_post_time
* @property string $params
* @property int $allowRatings
*
* @since Kunena 6.0
*/
class KunenaCategory extends KunenaDatabaseObject
{
/**
* @var array
* @since Kunena 6.0
*/
protected static $actions = [
'none' => [],
'read' => ['Read'],
'subscribe' => ['Read', 'CatSubscribe', 'NotBanned', 'NotSection'],
'moderate' => ['Read', 'NotBanned', 'Moderate'],
'admin' => ['NotBanned', 'Admin'],
'topic.read' => ['Read'],
'topic.create' => ['Read', 'GuestWrite', 'NotBanned', 'NotSection', 'Unlocked', 'Channel'],
'topic.reply' => ['Read', 'GuestWrite', 'NotBanned', 'NotSection', 'Unlocked'],
'topic.edit' => ['Read', 'NotBanned', 'Unlocked'],
'topic.move' => ['Read', 'NotBanned', 'Moderate', 'Channel'],
'topic.approve' => ['Read', 'NotBanned', 'Moderate'],
'topic.delete' => ['Read', 'NotBanned', 'Moderate'],
'topic.undelete' => ['Read', 'NotBanned', 'Moderate'],
'topic.permdelete' => ['Read', 'NotBanned', 'Moderate'],
'topic.favorite' => ['Read', 'NotBanned', 'Favorite'],
'topic.subscribe' => ['Read', 'NotBanned', 'Subscribe'],
'topic.sticky' => ['Read', 'NotBanned', 'Moderate'],
'topic.lock' => ['Read', 'NotBanned', 'Moderate'],
'topic.poll.read' => ['Read', 'Poll'],
'topic.poll.create' => ['Read', 'GuestWrite', 'NotBanned', 'Unlocked', 'Poll'],
'topic.poll.edit' => ['Read', 'NotBanned', 'Unlocked', 'Poll', 'Vote'],
'topic.poll.delete' => ['Read', 'NotBanned', 'Unlocked', 'Poll', 'Vote'],
'topic.poll.vote' => ['Read', 'NotBanned', 'Unlocked', 'Poll', 'Vote'],
'topic.post.read' => ['Read'],
'topic.post.reply' => ['Read', 'GuestWrite', 'NotBanned', 'NotSection', 'Unlocked'],
'topic.post.thankyou' => ['Read', 'NotBanned'], 'Unlocked',
'topic.post.unthankyou' => ['Read', 'NotBanned'], 'Unlocked',
'topic.post.edit' => ['Read', 'NotBanned', 'Unlocked'],
'topic.post.move' => ['Read', 'NotBanned', 'Moderate', 'Channel'],
'topic.post.approve' => ['Read', 'NotBanned', 'Moderate'],
'topic.post.delete' => ['Read', 'NotBanned', 'Unlocked'],
'topic.post.undelete' => ['Read', 'NotBanned', 'Moderate'],
'topic.post.permdelete' => ['Read', 'NotBanned', 'Admin'],
'topic.post.attachment.read' => ['Read'],
'topic.post.attachment.createimage' => ['Read', 'GuestWrite', 'NotBanned', 'Unlocked', 'Upload'],
'topic.post.attachment.createfile' => ['Read', 'GuestWrite', 'NotBanned', 'Unlocked', 'Upload'],
'topic.post.attachment.delete' => ['NotBanned'],
'topic.post.attachment.private' => ['NotBanned'],
// TODO: In the future we might want to restrict this: array('Read', 'NotBanned', 'Unlocked'),
];
/**
* @var integer
* @since Kunena 6.0
*/
public $id = null;
/**
* @var integer
* @since Kunena 6.0
*/
public $level = 0;
/**
* @var integer
* @since Kunena 6.0
*/
public $parentid;
/**
* @var integer
* @since Kunena 6.0
*/
public $published;
/**
* @var integer
* @since Kunena 6.0
*/
public $numTopics;
/**
* @var integer
* @since Kunena 6.0
*/
public $numPosts;
/**
* @var integer
* @since Kunena 6.0
*/
public $last_post_time;
/**
* @var boolean
* @since Kunena 6.0
*/
public $checked_out;
/**
* @var string
* @since Kunena 6.0
*/
public $name;
/**
* @var string
* @since Kunena 6.0
*/
public $alias;
/**
* @var string
* @since Kunena 6.0
*/
public $accessname;
/**
* @var string
* @since Kunena 6.0
*/
public $accesstype;
/**
* @var boolean
* @since Kunena 6.0
*/
public $locked;
/**
* @var boolean
* @since Kunena 6.0
*/
public $indent;
/**
* @var string
* @since Kunena 6.0
*/
public $icon;
/**
* @var int
* @since Kunena 6.0
*/
public $icon_id;
/**
* @var string
* @since Kunena 6.0
*/
public $class_sfx;
/**
* @var string
* @since Kunena 6.0
*/
public $access;
/**
* @var string
* @since Kunena 6.0
*/
public $review;
/**
* @var string
* @since Kunena 6.0
*/
public $allowPolls;
/**
* @var string
* @since Kunena 6.0
*/
public $allowAnonymous;
/**
* @var string
* @since Kunena 6.0
*/
public $postAnonymous;
/**
* @var string
* @since Kunena 6.0
*/
public $topicOrdering;
/**
* @var string
* @since Kunena 6.0
*/
public $allowRatings;
/**
* @var boolean|string|void
* @since version
*/
public $parent;
/**
* @var boolean|string|void
* @since version
*/
public $rssURL;
/**
* @var array
* @since version
*/
public $moderators;
/**
* @var string
* @since Kunena 6.4
*/
public $params;
/**
* @var string
* @since Kunena 6.4
*/
public $typeAlias;
/**
* @var string
* @since Kunena 6.4
*/
public $pubAccess;
/**
* @var string
* @since Kunena 6.4
*/
public $pubRecurse;
/**
* @var string
* @since Kunena 6.4
*/
public $adminAccess;
/**
* @var string
* @since Kunena 6.4
*/
public $adminRecurse;
/**
* @var string
* @since Kunena 6.4
*/
public $ordering;
/**
* @var string
* @since Kunena 6.4
*/
public $channels;
/**
* @var string
* @since Kunena 6.4
*/
public $checked_out_time;
/**
* @var string
* @since Kunena 6.4
*/
public $hits;
/**
* @var string
* @since Kunena 6.4
*/
public $description;
/**
* @var string
* @since Kunena 6.4
*/
public $headerdesc;
/**
* @var string
* @since Kunena 6.4
*/
public $iconset;
/**
* @var string
* @since Kunena 6.4
*/
public $last_topic_id;
/**
* @var string
* @since Kunena 6.4
*/
public $last_post_id;
/**
* @var string
* @since Kunena 6.4
*/
public $topictemplate;
/**
* @var array
* @since Kunena 6.0
*/
protected $authorised = [];
/**
* @var null
* @since Kunena 6.0
*/
protected $_aliases = null;
/**
* @var mixed|null
* @since Kunena 6.0
*/
protected $_alias = null;
/**
* @var false|array
* @since Kunena 6.0
*/
protected $_channels = false;
/**
* @var boolean
* @since Kunena 6.0
*/
protected $_topics = false;
/**
* @var boolean
* @since Kunena 6.0
*/
protected $_posts = false;
/**
* @var boolean
* @since Kunena 6.0
*/
protected $_lastcat = false;
/**
* @var array
* @since Kunena 6.0
*/
protected $_authcache = [];
/**
* @var array
* @since Kunena 6.0
*/
protected $_authfcache = [];
/**
* @var integer
* @since Kunena 6.0
*/
protected $_new = null;
/**
* @var string
* @since Kunena 6.0
*/
protected $_table = 'KunenaCategories';
/**
* @var integer
* @since Kunena 6.0
*/
protected $hold;
/**
* @var boolean
* @since Kunena 6.0
*/
protected $_noreOrder;
/**
* @param mixed|array $properties properties
*
* @since Kunena 6.0
* @throws Exception
*/
public function __construct($properties = null)
{
if (!empty($this->id)) {
$this->_exists = true;
} elseif ($properties !== null) {
$this->setProperties($properties);
}
$registry = new Registry();
if (!empty($this->params)) {
$registry->loadString($this->params);
}
$this->params = $registry;
if (!$this->_name) {
$this->_name = \get_class($this);
}
$this->_alias = $this->alias ?? '';
}
/**
* Returns the global \Kunena\Forum\Libraries\Forum\Category\Category object.
*
* @param null $identifier The category id to load.
* @param bool $reload Force reload from the database.
*
* @return KunenaCategory
*
* @since Kunena 6.0
* @throws Exception
*/
public static function getInstance($identifier = null, $reload = false): KunenaCategory
{
return KunenaCategoryHelper::get($identifier, $reload);
}
/**
* Returns list of children of this category.
*
* @param int $levels How many levels to search.
*
* @return array List of \Kunena\Forum\Libraries\Forum\Category\Category objects.
*
* @since Kunena 6.0
* @throws null
*/
public function getChildren($levels = 0): array
{
return KunenaCategoryHelper::getChildren($this->id, $levels);
}
/**
* Returns object containing user information from this category.
*
* @param mixed $user user
*
* @return KunenaCategoryUser
*
* @since Kunena 6.0
* @throws Exception
*/
public function getUserInfo($user = null): KunenaCategoryUser
{
return KunenaCategoryUserHelper::get($this->id, $user);
}
/**
* Subscribe / Unsubscribe user to this category.
*
* @param boolean $value True for subscribe, false for unsubscribe.
* @param mixed $user user
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function subscribe($value = true, $user = null): bool
{
$userCategory = KunenaCategoryUserHelper::get($this->id, $user);
$userCategory->subscribed = (int) $value;
if (!$userCategory->params) {
$userCategory->params = '';
}
try {
$userCategory->save();
} catch (Exception $e) {
KunenaError::displayDatabaseError($e);
}
return true;
}
/**
* Returns new topics count from this category for current user.
*
* @todo Currently new topics needs to be calculated manually, make it automatic.
*
* @param mixed $count Internal parameter to set new count.
*
* @return integer New topics count.
*
* @since Kunena 6.0
*/
public function getNewCount($count = null)
{
if ($count !== null) {
$this->_new = $count;
}
return $this->_new;
}
/**
* @return string
*
* @since Kunena 6.0
* @throws Exception
*/
public function getIcon(): string
{
return KunenaFactory::getTemplate()->getCategoryIcon($this);
}
/**
* @param mixed $category Fake category (or null).
* @param bool $xhtml True if URL needs to be escaped for XHTML.
*
* @return string
*
* @since Kunena 6.0
* @throws Exception
*/
public function getUrl($category = null, $xhtml = true)
{
$category = $category ? KunenaCategoryHelper::get($category) : $this;
return KunenaRoute::getCategoryUrl($category, $xhtml);
}
/**
* @param bool $xhtml xhtml
*
* @return boolean|null
*
* @since Kunena
* @throws null
* @throws Exception
*/
public function getNewTopicUrl($xhtml = true)
{
if (!$this->getNewTopicCategory()->exists()) {
return false;
}
$catid = $this->id ? "&catid={$this->id}" : '';
return KunenaRoute::_("index.php?option=com_kunena&view=topic&layout=create{$catid}", $xhtml);
}
/**
* @param mixed $user user
*
* @return KunenaCategory
*
* @since Kunena 6.0
* @throws null
*/
public function getNewTopicCategory($user = null): KunenaCategory
{
foreach ($this->getChannels() as $category) {
if ($category->isAuthorised('topic.create', $user)) {
return $category;
}
}
$categories = KunenaCategoryHelper::getChildren(\intval($this->id), -1, ['action' => 'topic.create']);
if ($categories) {
foreach ($categories as $category) {
if ($category->isAuthorised('topic.create', null)) {
return $category;
}
}
}
return new KunenaCategory();
}
/**
* @param string $action action
*
* @return KunenaCategory|KunenaCategory[]
*
* @since Kunena 6.0
* @throws null
* @throws Exception
*/
public function getChannels($action = 'read')
{
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->start('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
if ($this->_channels === false) {
$this->_channels = [];
$this->_channels['none'] = [];
if (empty($this->channels) || $this->channels == $this->id) {
// No channels defined
$this->_channels['none'][$this->id] = $this;
} else {
// Fetch all channels
$ids = array_flip(explode(',', $this->channels));
if (isset($ids[0]) || isset($ids['THIS'])) {
// Handle current category
$this->_channels['none'][$this->id] = $this;
}
if (!empty($ids)) {
// More category channels
$this->_channels['none'] += KunenaCategoryHelper::getCategories(array_keys($ids), null, 'none');
}
if (isset($ids['CHILDREN'])) {
// Children category channels
$this->_channels['none'] += KunenaCategoryHelper::getChildren($this->id, 1, [$action => 'none']);
}
}
}
if (!isset($this->_channels[$action])) {
$this->_channels[$action] = [];
foreach ($this->_channels['none'] as $channel) {
if (($channel->id == $this->id && $action == 'read') || $channel->isAuthorised($action, null, false)) {
$this->_channels[$action][$channel->id] = $channel;
}
}
}
KunenaProfiler::getInstance() ? KunenaProfiler::instance()->stop('function ' . __CLASS__ . '::' . __FUNCTION__ . '()') : null;
return $this->_channels[$action];
}
/**
* Get the table relevant properties. Override for your specific Object
*
* @return array Assocative array with the propertie values of table
*
* @since Kunena 6.4
*/
protected function getTableProperties(): array
{
$properties = [
'id' => $this->id,
'parentid' => $this->parentid,
'name' => $this->name,
'alias' => $this->alias,
'icon' => $this->icon,
'icon_id' => $this->icon_id,
'locked' => $this->locked,
'accesstype' => $this->accesstype,
'access' => $this->access,
'pubAccess' => $this->pubAccess,
'pubRecurse' => $this->pubRecurse,
'adminAccess' => $this->adminAccess,
'adminRecurse' => $this->adminRecurse,
'ordering' => $this->ordering,
'published' => $this->published,
'channels' => $this->channels,
'checked_out' => $this->checked_out,
'checked_out_time' => $this->checked_out_time,
'review' => $this->review,
'allowAnonymous' => $this->allowAnonymous,
'postAnonymous' => $this->postAnonymous,
'hits' => $this->hits,
'description' => $this->description,
'headerdesc' => $this->headerdesc,
'topictemplate' => $this->topictemplate,
'class_sfx' => $this->class_sfx,
'allowPolls' => $this->allowPolls,
'topicOrdering' => $this->topicOrdering,
'iconset' => $this->iconset,
'numTopics' => $this->numTopics,
'numPosts' => $this->numPosts,
'last_topic_id' => $this->last_topic_id,
'last_post_id' => $this->last_post_id,
'last_post_time' => $this->last_post_time,
'params' => $this->params,
'allowRatings' => $this->allowRatings
];
return $properties;
}
/**
* Returns true if user is authorised to do the action.
*
* @param string $action action
* @param KunenaUser|null $user user
*
* @return boolean
*
* @throws Exception
*@since Kunena 4.0
*/
public function isAuthorised($action = 'read', ?KunenaUser $user = null): bool
{
if (KunenaFactory::getConfig()->readOnly) {
// Special case to ignore authorisation.
if ($action != 'topic.read' && $action != 'read') {
return true;
}
}
return !$this->tryAuthorise($action, $user, false);
}
/**
* Throws an exception if user isn't authorised to do the action.
*
* @param string $action action
* @param KunenaUser|null $user user
* @param bool $throw throw
*
* @return KunenaExceptionAuthorise|boolean
*
* @throws Exception
*@since Kunena 4.0
*/
public function tryAuthorise($action = 'read', ?KunenaUser $user = null, $throw = true)
{
// Special case to ignore authorisation.
if ($action == 'none') {
return false;
}
// Load user if not given.
if ($user === null) {
$user = KunenaUserHelper::getMyself();
}
// Optimise read access check.
if ($action == 'read') {
$exception = $this->authoriseRead($user);
if ($throw && $exception) {
throw new $exception();
}
return $exception;
}
// Use local authentication cache to speed up the authentication calls.
if (empty($this->_authcache[$user->userid][$action])) {
// Unknown action - throw invalid argument exception.
if (!isset(self::$actions[$action])) {
throw new InvalidArgumentException(Text::sprintf('COM_KUNENA_LIB_AUTHORISE_INVALID_ACTION', $action), 500);
}
// Load custom authorisation from the plugins (except for admins and moderators).
if (!$user->isModerator($this) && !isset($this->authorised[$user->userid])) {
$this->authorised[$user->userid] = KunenaAccess::getInstance()->authoriseActions($this, $user->userid);
}
if (
isset($this->authorised[$user->userid][$action])
&& $this->authorised[$user->userid][$action] === false
) {
// Plugin forces authorisation to fail.
// TODO: allow plugin to customise the error.
$this->_authcache[$user->userid][$action] = new KunenaExceptionAuthorise(Text::_('COM_KUNENA_NO_ACCESS'), $user->userid ? 403 : 401);
} else {
// Do the authorisation.
$this->_authcache[$user->userid][$action] = null;
foreach (self::$actions[$action] as $function) {
if (!isset($this->_authfcache[$user->userid][$function])) {
$authFunction = 'authorise' . $function;
$this->_authfcache[$user->userid][$function] = $this->$authFunction($user);
}
$error = $this->_authfcache[$user->userid][$function];
if ($error) {
$this->_authcache[$user->userid][$action] = $error;
break;
}
}
}
}
$exception = $this->_authcache[$user->userid][$action];
// Throw or return the exception.
if ($throw && $exception) {
throw $exception;
}
return $exception;
}
/**
* @param KunenaUser $user user
*
* @return \Kunena\Forum\Libraries\Exception\KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseRead(KunenaUser $user)
{
static $catids = false;
if ($catids === false) {
$catids = KunenaAccess::getInstance()->getAllowedCategories($user);
}
// Checks if user can read category
if (!$this->exists()) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_NO_ACCESS'), 404);
}
if (empty($catids[$this->id])) {
if ($user->exists()) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_NO_ACCESS'), 403);
}
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_NO_ACCESS'), 401);
}
}
/**
* @param bool $children children
* @param bool $xhtml xhtml
*
* @return string
*
* @since Kunena 6.0
* @throws \Exception
*/
public function getMarkReadUrl($children = false, $xhtml = true): string
{
if (!KunenaUserHelper::getMyself()->exists()) {
return false;
}
$children = $children ? "&children=1" : '';
$catid = $this->id ? "&catid={$this->id}" : '';
$token = '&' . Session::getFormToken() . '=1';
return KunenaRoute::_("index.php?option=com_kunena&view=category&task=markread{$catid}{$children}{$token}", $xhtml);
}
/**
* Method which return the RSS feed URL for the actual category
*
* @param bool|string $xhtml xhtml
*
* @return boolean|void
*
* @since Kunena 6.0
* @throws null
* @throws Exception
*/
public function getRSSUrl($xhtml = true)
{
if (KunenaFactory::getConfig()->enableRss) {
$params = '&catid=' . (int) $this->id;
if (Factory::getContainer()->get(SiteApplication::class)->get('sef_suffix')) {
return KunenaRoute::_("/index.php?option=com_kunena&view=rss{$params}") . '?format=feed&type=rss';
} else {
return KunenaRoute::_("index.php?option=com_kunena&view=rss{$params}?format=feed&type=rss", $xhtml);
}
}
return;
}
/**
* @param mixed $category Fake category (or null).
* @param int|null $action Limitstart.
*
* @return Uri
*
* @since Kunena 6.0
* @throws Exception
*/
public function getUri($category = null, $action = null): Uri
{
if (!$category) {
$category = $this;
} else {
$category = KunenaCategoryHelper::get($category);
}
$uri = Uri::getInstance("index.php?option=com_kunena&view=category&catid={$category->id}");
if ((string) $action === (string) (int) $action) {
$uri->setVar('limitstart', $action);
}
return $uri;
}
/**
* @param string $field Field to be displayed.
*
* @return integer|string
*
* @since Kunena 6.0
* @throws Exception
*/
public function displayField(string $field)
{
switch ($field) {
case 'id':
return \intval($this->id);
case 'name':
return KunenaParser::parseText((string) $this->name, '', 'category_name');
case 'icon':
return KunenaParser::parseText((string) $this->name, '', 'category_icon');
case 'description':
return KunenaParser::parseBBCode((string) $this->$field, '', '', '', 'category_description');
case 'topictemplate':
return KunenaParser::parseBBCode((string) $this->$field, '', '', '', 'category_topictemplate');
case 'headerdesc':
return KunenaParser::parseBBCode((string) $this->$field, '', '', '', 'category_headerdesc');
}
return '';
}
/**
* @return $this
*
* @since Kunena 6.0
*/
public function getCategory(): KunenaCategory
{
return $this;
}
/**
* @return array|null Array of Kunena aliases.
*
* @since Kunena 6.0
*/
public function getAliases(): ?array
{
if (!isset($this->_aliases)) {
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select('*')
->from($db->quoteName('#__kunena_aliases'))
->where($db->quoteName('type') . ' = ' . $db->quote('catid'))
->andWhere($db->quoteName('item') . ' = ' . $db->quote($this->id));
$db->setQuery($query);
$this->_aliases = (array) $db->loadObjectList('alias');
}
return $this->_aliases;
}
/**
* @param string $alias alias
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function deleteAlias(string $alias): bool
{
// Do not delete valid alias.
if (StringHelper::strtolower($this->alias) == StringHelper::strtolower($alias)) {
return false;
}
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->delete()
->from($db->quoteName('#__kunena_aliases'))
->where($db->quoteName('type') . ' = ' . $db->quote('catid'))
->andWhere($db->quoteName('item') . ' = ' . $db->quote($this->id))
->andWhere($db->quoteName('alias') . ' = ' . $db->quote($alias));
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
return (bool) $db->getAffectedRows();
}
/**
* Get published state in text.
*
* @return string
*
* @since Kunena 4.0
*/
public function getState(): string
{
switch ($this->hold) {
case 0:
return 'published';
case 1:
return 'unapproved';
case 2:
case 3:
return 'deleted';
}
return 'unknown';
}
/**
* @return integer
*
* @since Kunena 6.0
* @throws Exception
*/
public function getTopics(): int
{
$this->buildInfo();
return $this->_topics;
}
/**
* @return void
*
* @since Kunena 6.0
* @throws Exception
*/
protected function buildInfo(): void
{
if ($this->_topics !== false) {
return;
}
$this->_topics = 0;
$this->_posts = 0;
$this->_lastcat = $this;
$categories[$this->id] = $this;
$categories += $this->getChannels();
$categories += KunenaCategoryHelper::getChildren($this->id);
foreach ($categories as $category) {
$category->buildInfo();
$lastCategory = $category->getLastCategory();
$this->_topics += $category->_topics ? $category->_topics : max($category->numTopics, 0);
$this->_posts += $category->_posts ? $category->_posts : max($category->numPosts, 0);
if ($lastCategory->last_post_time && $this->_lastcat->last_post_time < $lastCategory->last_post_time) {
$this->_lastcat = $lastCategory;
}
}
}
/**
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function getLastCategory()
{
$this->buildInfo();
return $this->_lastcat;
}
/**
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function getPosts(): bool
{
$this->buildInfo();
return $this->_posts;
}
/**
* @return integer
*
* @since Kunena 6.0
* @throws Exception
*/
public function getReplies(): int
{
$this->buildInfo();
return max($this->_posts - $this->_topics, 0);
}
/**
* @return KunenaTopic
*
* @since Kunena 6.0
* @throws Exception
*/
public function getLastTopic(): KunenaTopic
{
return KunenaTopicHelper::get($this->getLastCategory()->last_topic_id);
}
/**
* @param array|null $fields fields
* @param mixed $user user
* @param array|null $safefields safefields
*
* @return array
*
* @throws Exception
*@since Kunena 6.0
*/
public function newTopic(?array $fields = null, $user = null, ?array $safefields = null): array
{
$catid = isset($safefields['category_id']) ? $safefields['category_id'] : $this->getNewTopicCategory($user)->id;
$user = KunenaUserHelper::get($user);
$message = new KunenaMessage();
$message->catid = $catid;
$message->name = $user->getName('');
$message->userid = $user->userid;
$message->ip = !empty(KunenaUserHelper::getUserIp()) ? KunenaUserHelper::getUserIp() : '';
$message->hold = $this->review ? (int) !$this->isAuthorised('moderate', $user) : 0;
if ($safefields) {
$message->bind($safefields);
}
if ($fields) {
$message->bind($fields, ['name', 'email', 'subject', 'message'], true);
}
$topic = new KunenaTopic();
$topic->category_id = $catid;
$topic->hold = KunenaForum::TOPIC_CREATION;
$topic->rating = 0;
$topic->params = '';
if ($safefields) {
$topic->bind($safefields);
}
if ($fields) {
$topic->bind($fields, ['subject', 'icon_id'], true);
}
$message->setTopic($topic);
return [$topic, $message];
}
/**
* @return KunenaCategory
*
* @since Kunena 6.0
* @throws Exception
*/
public function getParent(): KunenaCategory
{
return KunenaCategoryHelper::get(\intval($this->parentid));
}
/**
* Get users, who can administrate this category.
*
* @param bool $includeGlobal include global
*
* @return array
*
* @since Kunena 6.0
* @throws Exception
*/
public function getAdmins($includeGlobal = true): array
{
$access = KunenaAccess::getInstance();
$userlist = [];
if (!empty($this->catid)) {
$userlist = $access->getAdmins($this->catid);
}
if ($includeGlobal) {
$userlist += $access->getAdmins();
}
return $userlist;
}
/**
* Get users, who can moderate this category.
*
* @param bool $includeGlobal include global
* @param bool $objects objects
*
* @return array
*
* @since Kunena 6.0
* @throws Exception
*/
public function getModerators($includeGlobal = true, $objects = true): array
{
$access = KunenaAccess::getInstance();
$userlist = [];
if (!empty($this->id)) {
$userlist += $access->getModerators($this->id);
}
if ($includeGlobal) {
$userlist += $access->getModerators();
}
if (empty($userlist)) {
return $userlist;
}
$userlist = array_keys($userlist);
return $objects ? KunenaUserHelper::loadUsers($userlist) : array_combine($userlist, $userlist);
}
/**
* Add moderator to this category.
*
* @example if ($category->isAuthorised('admin')) $category->addModerator($user);
*
* @param mixed $user user
*
* @return boolean
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function addModerator($user = null): bool
{
return $this->setModerator($user, true);
}
/**
* Add or remove moderator from this category.
*
* @example if ($category->isAuthorised('admin')) $category->setModerator($user, true);
*
* @param bool $value value
*
* @param mixed $user KunenaUser object
*
* @return boolean
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function setModerator($user = null, $value = false): bool
{
return KunenaAccess::getInstance()->setModerator($this, $user, $value);
}
/**
* Add multiple moderators to this category.
*
* @example if ($category->isAuthorised('admin')) $category->addModerators(array($user1, $user2, $user3));
*
* @param array $users users
*
* @return void
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function addModerators($users = []): void
{
if (empty($users)) {
return;
}
foreach ($users as $user) {
$user_inst = KunenaUserHelper::get($user);
$this->setModerator($user_inst, true);
}
}
/**
* Remove moderator from this category.
*
* @example if ($category->isAuthorised('admin')) $category->removeModerator($user);
*
* @param mixed $user user
*
* @return boolean
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function removeModerator($user = null): bool
{
return $this->setModerator($user, false);
}
/**
* @param bool $include include
*
* @param array|null $src src
*
* @param array|null $fields fields
*
* @return boolean True on success.
* @see KunenaDatabaseObject::bind()
*
* @since Kunena 6.0
*/
public function bind(?array $src = null, ?array $fields = null, $include = false): bool
{
if (isset($src['channels']) && \is_array($src['channels'])) {
$src['channels'] = implode(',', $src['channels']);
}
$result = parent::bind($src, $fields, $include);
if (!($this->params instanceof Registry)) {
$registry = new Registry();
if (\is_array($this->params)) {
$registry->loadArray($this->params);
} else {
$registry->loadString($this->params);
}
$this->params = $registry;
}
return $result;
}
/**
* @see KunenaDatabaseObject::load()
*
* @param null $id id
*
* @return boolean
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function load($id = null): bool
{
$exists = parent::load($id);
if (!$this->_saving) {
$this->_alias = $this->alias;
}
$registry = new Registry();
if ($this->params) {
$registry->loadString($this->params);
}
$this->params = $registry;
// Register category if it exists
if ($exists) {
KunenaCategoryHelper::register($this);
}
return $exists;
}
/**
* @see KunenaDatabaseObject::check()
* @return mixed
*
* @since Kunena 6.0
*
* @throws Exception
*/
public function check(): bool
{
$this->alias = trim($this->alias);
if (empty($this->alias)) {
$this->alias = $this->name;
}
if ($this->alias != $this->_alias) {
$this->alias = KunenaRoute::stringURLSafe($this->alias);
try {
$this->checkAlias($this->alias);
} catch (Exception $e) {
KunenaError::displayDatabaseError($e);
return false;
}
}
return true;
}
/**
* @param string $alias alias
*
* @return boolean|string
*
* @since Kunena 6.0
* @throws Exception
*/
public function checkAlias(string $alias)
{
// Check if category is already using the alias.
if ($this->_alias && $this->_alias == $alias) {
return true;
}
// Check if alias is valid in current configuration.
if (KunenaRoute::stringURLSafe($alias) != $alias) {
return false;
}
$item = KunenaRoute::resolveAlias($alias);
// Is alias free to be used?
if (!$item) {
return 'insert';
}
// Fail if alias is reserved or used by another category.
if (empty($item['catid']) || $item['catid'] != $this->id) {
return false;
}
return 'update';
}
/**
* Purge old topics from this category. Removes topics from the database.
*
* @param int $time time
* @param array $params params
* @param int $limit limit
*
* @return integer Number of purged topics.
*
* @since Kunena 6.0
* @throws Exception
*/
public function purge(int $time, $params = [], $limit = 1000): int
{
// FIXME: why time isn't used?
if (!$this->exists()) {
return 0;
}
$where = isset($params['where']) ? (string) $params['where'] : '';
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select($db->quoteName('id'))
->from($db->quoteName('#__kunena_topics', 'tt'))
->where($db->quoteName('tt.category_id') . ' = ' . $this->id . ' ' . $where)
->order($db->quoteName('tt.last_post_time') . ' ASC');
$query->setLimit($limit);
$db->setQuery($query);
try {
$ids = $db->loadColumn();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
if (empty($ids)) {
return 0;
}
$count = KunenaTopicHelper::delete($ids);
KunenaUserHelper::recount();
KunenaCategoryHelper::recount($this->id);
KunenaAttachmentHelper::cleanup();
return $count;
}
/**
* Trash old topics in this category. Changes topic state to deleted.
*
* @param int $time time
* @param array $params params
* @param int $limit limit
*
* @return integer Number of trashed topics.
*
* @since Kunena 6.0
* @throws Exception
*/
public function trash(int $time, $params = [], $limit = 1000): int
{
// FIXME: why time isn't used?
if (!$this->exists()) {
return 0;
}
$where = isset($params['where']) ? (string) $params['where'] : '';
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select($db->quoteName('id'))
->from($db->quoteName('#__kunena_topics', 'tt'))
->where($db->quoteName('tt.category_id') . ' = ' . $this->id . ' AND ' . $db->quoteName('tt.hold') . ' !=2 ' . $where)
->order($db->quoteName('tt.last_post_time') . ' ASC');
$query->setLimit($limit);
$db->setQuery($query);
try {
$ids = $db->loadColumn();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
if (empty($ids)) {
return 0;
}
$count = KunenaTopicHelper::trash($ids);
KunenaUserHelper::recount();
KunenaCategoryHelper::recount($this->id);
return $count;
}
/**
* Delete this category and all related information from the database.
*
* @return boolean True on success
*
* @since Kunena 6.0
* @throws Exception
*/
public function delete(): bool
{
if (!$this->exists()) {
return true;
}
if (!parent::delete()) {
return false;
}
$access = KunenaAccess::getInstance();
$access->clearCache();
$db = Factory::getContainer()->get('DatabaseDriver');
$queries[] = "DELETE FROM #__kunena_aliases WHERE type='catid' AND item={$db->quote($this->id)}";
// Delete user topics
$queries[] = "DELETE FROM #__kunena_user_topics WHERE category_id={$db->quote($this->id)}";
// Delete user categories
$queries[] = "DELETE FROM #__kunena_user_categories WHERE category_id={$db->quote($this->id)}";
// Delete user read
$queries[] = "DELETE FROM #__kunena_user_read WHERE category_id={$db->quote($this->id)}";
// Delete thank yous
$queries[] = "DELETE t FROM #__kunena_thankyou AS t INNER JOIN #__kunena_messages AS m ON m.id=t.postid WHERE m.catid={$db->quote($this->id)}";
// Delete poll users
$queries[] = "DELETE p FROM #__kunena_polls_users AS p INNER JOIN #__kunena_topics AS tt ON tt.poll_id=p.pollid WHERE tt.category_id={$db->quote($this->id)} AND tt.moved_id=0";
// Delete poll options
$queries[] = "DELETE p FROM #__kunena_polls_options AS p INNER JOIN #__kunena_topics AS tt ON tt.poll_id=p.pollid WHERE tt.category_id={$db->quote($this->id)} AND tt.moved_id=0";
// Delete polls
$queries[] = "DELETE p FROM #__kunena_polls AS p INNER JOIN #__kunena_topics AS tt ON tt.poll_id=p.id WHERE tt.category_id={$db->quote($this->id)} AND tt.moved_id=0";
// Delete messages
$queries[] = "DELETE m, t FROM #__kunena_messages AS m INNER JOIN #__kunena_messages_text AS t ON m.id=t.mesid WHERE m.catid={$db->quote($this->id)}";
// TODO: delete attachments
// Delete topics
$queries[] = "DELETE FROM #__kunena_topics WHERE category_id={$db->quote($this->id)}";
foreach ($queries as $query) {
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
}
KunenaUserHelper::recount();
KunenaMessageThankyouHelper::recount();
$this->id = null;
KunenaCategoryHelper::register($this);
return true;
}
/**
* Method to check out the \Kunena\Forum\Libraries\Forum\Category\Category object.
*
* @param integer $who who
*
* @return boolean True if checked out by somebody else.
*
* @since Kunena 1.6
*/
public function checkout(int $who): bool
{
if (!$this->_exists) {
return false;
}
// Create the user table object
$table = $this->getTable();
$table->bind($this->getTableProperties());
$table->exists($this->_exists);
$result = $table->checkout($who);
// Assuming all is well at this point lets bind the data
$params = $this->params;
$this->setProperties($table->getProperties());
$this->params = $params;
return $result;
}
/**
* Method to check in the \Kunena\Forum\Libraries\Forum\Category\Category object.
*
* @return boolean True on success.
*
* @since Kunena 1.6
*/
public function checkIn(): bool
{
if (!$this->_exists) {
return true;
}
// Create the user table object
$table = $this->getTable();
$table->bind($this->getTableProperties());
$table->exists($this->_exists);
$result = $table->checkIn();
// Assuming all is well at this point lets bind the data
$params = $this->params;
$this->setProperties($table->getProperties());
$this->params = $params;
//$options = ['defaultgroup' => 'com_kunena'];
//$cache = Factory::getContainer()->get(CacheControllerFactoryInterface::class)->createCacheController('output', $options);
// $cache->clean('categories');
return $result;
}
/**
* Method to check if an item is checked out.
*
* @param int $userid userid
*
* @return boolean
*
* @since Kunena 1.6
*/
public function isCheckedOut(int $userid): bool
{
if (!$this->_exists) {
return false;
}
// Create the user table object
$table = $this->getTable();
$table->bind($this->getTableProperties());
$table->exists($this->_exists);
return $table->isCheckedOut($userid);
}
/**
* @param KunenaTopic $topic topic
* @param int $topicdelta topicdelta
* @param int $postdelta postdelta
*
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function update(KunenaTopic $topic, $topicdelta = 0, $postdelta = 0): bool
{
if (!$topic->id) {
return false;
}
$update = false;
if ($topicdelta || $postdelta) {
// Update topic and post count
$this->numTopics += (int) $topicdelta;
$this->numPosts += (int) $postdelta;
$update = true;
}
if (
$topic->exists() && $topic->hold == 0 && $topic->moved_id == 0 && $topic->category_id == $this->id
&& ($this->last_post_time < $topic->last_post_time || ($this->last_post_time == $topic->last_post_time && $this->last_post_id <= $topic->last_post_id))
) {
// If topic has new post or last topic changed, we need to update cache
$this->last_topic_id = $topic->id;
$this->last_post_id = $topic->last_post_id;
$this->last_post_time = $topic->last_post_time;
$update = true;
} elseif ($this->last_topic_id == $topic->id) {
// If last topic/post got moved or deleted, we need to find last post
$db = Factory::getContainer()->get('DatabaseDriver');
$query = $db->createQuery();
$query->select('*')
->from($db->quoteName('#__kunena_topics'))
->where($db->quoteName('category_id') . ' = ' . $db->quote($this->id))
->andWhere($db->quoteName('hold') . ' = 0')
->andWhere($db->quoteName('moved_id') . ' = 0')
->order([$db->quoteName('moved_id') . ' DESC', $db->quoteName('last_post_id') . ' DESC']);
$query->setLimit(1);
$db->setQuery($query);
try {
$topic = $db->loadObject();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
}
if ($topic) {
$this->last_topic_id = $topic->id;
$this->last_post_id = $topic->last_post_id;
$this->last_post_time = $topic->last_post_time;
$update = true;
} else {
$this->numTopics = 0;
$this->numPosts = 0;
$this->last_topic_id = 0;
$this->last_post_id = 0;
$this->last_post_time = 0;
$update = true;
}
}
if (!$update) {
return true;
}
// TODO: remove this hack...
$this->_noreOrder = true;
return $this->save();
}
/**
* Get if the user has subscribed on this category.
*
* @param mixed $userid userid
*
* @return boolean
*
* @since Kunena 2.0
* @throws Exception
*/
public function getSubscribed($userid = null): bool
{
if (!$this->exists()) {
return false;
}
if (!$userid) {
return false;
}
$userCategory = KunenaCategoryUserHelper::get($this->id, $userid);
return (bool) $userCategory->subscribed;
}
/**
* @param int $count count
*
* @return string
*
* @since Kunena 5.0.13
*/
public function totalCount(int $count)
{
if ($count) {
if ($count > 1) {
return Text::plural('COM_KUNENA_X_TOPICS_MORE', $this->formatLargeNumber($count));
} else {
return Text::plural('COM_KUNENA_X_TOPICS_1', $count);
}
}
return Text::_('COM_KUNENA_X_TOPICS_0');
}
/**
* This function formats a number to n significant digits when above
* 10,000. Starting at 10,0000 the out put changes to 10k, starting
* at 1,000,000 the output switches to 1m. Both k and m are defined
* in the language file. The significant digits are used to limit the
* number of digits displayed when in 10k or 1m mode.
*
* @param int $number Number to be formated
* @param int $precision Significant digits for output
*
* @return string
*
* @since Kunena 6.0
*/
public function formatLargeNumber(int $number, $precision = 3)
{
// Do we need to reduce the number of significant digits?
if ($number >= 10000) {
// Round the number to n significant digits
$number = round($number, -1 * \intval((log10($number) + 1)) + $precision);
}
if ($number < 10000) {
$output = $number;
} elseif ($number >= 1000000) {
$output = $number / 1000000 . Text::_('COM_KUNENA_MILLION');
} else {
$output = $number / 1000 . Text::_('COM_KUNENA_THOUSAND');
}
return $output;
}
/**
* @see KunenaDatabaseObject::saveInternal()
* @return boolean
*
* @since Kunena 6.0
*
* @throws Exception
*/
protected function saveInternal()
{
// Reorder categories
$table = $this->getTable();
$table->bind($this->getTableProperties());
$table->exists($this->_exists);
// Update alias
$success = $this->addAlias($this->alias);
if ($success) {
$this->_alias = $this->alias;
}
// TODO: remove this hack...
if (!isset($this->_noreOrder)) {
$table->reOrder();
$this->ordering = $table->ordering;
unset($this->_noreOrder);
}
// Clear cache
$access = KunenaAccess::getInstance();
$access->clearCache();
KunenaCacheHelper::clear();
return true;
}
/**
* @param string $alias alias
*
* @return boolean|void
*
* @since Kunena 6.0
* @throws Exception
*/
public function addAlias(string $alias)
{
if (!$this->exists()) {
return false;
}
$alias = KunenaRoute::stringURLSafe($alias);
if (!$alias) {
$alias = $this->id;
}
$check = $this->checkAlias($alias);
// Cannot add alias?
if ($check === false) {
return false;
}
// Did alias change?
if ($check === true) {
return true;
}
$db = Factory::getContainer()->get('DatabaseDriver');
$query = "REPLACE INTO #__kunena_aliases (alias, type, item) VALUES ({$db->quote($alias)},'catid',{$db->quote($this->id)})";
$db->setQuery($query);
try {
$db->execute();
} catch (ExecutionFailureException $e) {
KunenaError::displayDatabaseError($e);
return false;
}
}
/**
* @param KunenaUser $user user
*
* @return \Kunena\Forum\Libraries\Exception\KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseNotBanned(KunenaUser $user)
{
$banned = $user->isBanned();
if ($banned) {
$banned = KunenaBan::getInstanceByUserid($user->userid, true);
if (!$banned->isLifetime()) {
return new KunenaExceptionAuthorise(Text::sprintf('COM_KUNENA_POST_ERROR_USER_BANNED_NOACCESS_EXPIRY', KunenaDate::getInstance($banned->expiration)->toKunena()), 403);
}
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_ERROR_USER_BANNED_NOACCESS'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseGuestWrite(KunenaUser $user)
{
// Check if user is guest and they can create or reply topics
if ($user->userid == 0 && !KunenaFactory::getConfig()->pubWrite) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_ERROR_ANONYMOUS_FORBITTEN'), 401);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseSubscribe(KunenaUser $user)
{
// Check if user is guest and they can create or reply topics
$config = KunenaFactory::getConfig();
if (!$config->allowSubscriptions || $config->topicSubscriptions == 'disabled') {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_SUBSCRIPTIONS'), 403);
}
if ($user->userid == 0) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_SUBSCRIPTIONS'), 401);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseCatSubscribe(KunenaUser $user)
{
// Check if user is guest and they can create or reply topics
$config = KunenaFactory::getConfig();
if (!$config->allowSubscriptions || $config->categorySubscriptions == 'disabled') {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_SUBSCRIPTIONS'), 403);
}
if ($user->userid == 0) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_SUBSCRIPTIONS'), 401);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseFavorite(KunenaUser $user)
{
// Check if user is guest and they can create or reply topics
if (!KunenaFactory::getConfig()->allowFavorites) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_FAVORITES'), 403);
}
if ($user->userid == 0) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_FAVORITES'), 401);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseNotSection(KunenaUser $user)
{
// Check if category is not a section
if ($this->isSection()) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_ERROR_IS_SECTION'), 403);
}
return;
}
/**
* @return boolean
*
* @since Kunena 6.0
* @throws Exception
*/
public function isSection(): bool
{
$this->buildInfo();
return $this->parentid == 0;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws null
* @throws Exception
*/
protected function authoriseChannel(KunenaUser $user)
{
// Check if category is alias
$channels = $this->getChannels('none');
if (!isset($channels[$this->id])) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_ERROR_IS_ALIAS'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseUnlocked(KunenaUser $user)
{
// Check that category is not locked or that user is a moderator
if ($this->locked && (!$user->userid || !$user->isModerator($this))) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_ERROR_CATEGORY_LOCKED'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseModerate(KunenaUser $user)
{
// Check that user is moderator
if (!$user->userid) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_NOT_MODERATOR'), 401);
}
if (!$user->isModerator($this)) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_NOT_MODERATOR'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseGlobalModerate(KunenaUser $user)
{
// Check that user is a global moderator
if (!$user->userid) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_NOT_GLOBAL_MODERATOR'), 401);
}
if (!$user->isModerator()) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POST_NOT_GLOBAL_MODERATOR'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseAdmin(KunenaUser $user)
{
// Check that user is admin
if (!$user->userid) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_MODERATION_ERROR_NOT_ADMIN'), 401);
}
if (!$user->isAdmin($this)) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_MODERATION_ERROR_NOT_ADMIN'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authorisePoll(KunenaUser $user)
{
// Check if polls are enabled at all
if (!KunenaFactory::getConfig()->pollEnabled) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_POLLS_DISABLED'), 403);
}
// Check if polls are not enabled in this category
if (!$this->allowPolls) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_POLLS_NOT_ALLOWED'), 403);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
*/
protected function authoriseVote(KunenaUser $user)
{
// Check if user is guest
if ($user->userid == 0) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_POLL_NOT_LOGGED'), 401);
}
return;
}
/**
* @param KunenaUser $user user
*
* @return KunenaExceptionAuthorise
*
* @since Kunena 6.0
* @throws Exception
*/
protected function authoriseUpload(KunenaUser $user)
{
// Check if attachments are allowed
if (KunenaAttachmentHelper::getExtensions($this, $user) === false) {
return new KunenaExceptionAuthorise(Text::_('COM_KUNENA_LIB_CATEGORY_AUTHORISE_FAILED_UPLOAD_NOT_ALLOWED'), 403);
}
return;
}
}