shell bypass 403
<?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2025 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
namespace Akeeba\Component\AkeebaBackup\Administrator\Mixin;
// Protect from unauthorized access
defined('_JEXEC') || die();
use Akeeba\Engine\Factory;
/**
* Trait for handling Akeeba Engine exclusion filters in models
*/
trait ModelExclusionFilterTrait
{
protected $knownFilterTypes = [];
/**
* Modifies a filter
*
* @param string $type Filter type
* @param string $root The filter's root
* @param mixed $node The filter node to modify
* @param string $action The action to take: set, remove, toggle, swap
* @param string $oldNode Only for swap: The old node which will be swapped with $node
*
* @return array Array with keys success and newstate
*/
protected function applyExclusionFilter($type, $root, $node, $action = 'set', $oldNode = '')
{
$ret = [
'success' => false,
'newstate' => false,
];
$filter = Factory::getFilterObject($type);
$newState = null;
switch ($action)
{
case 'set':
$ret['success'] = $filter->set($root, $node);
break;
case 'remove':
$ret['success'] = $filter->remove($root, $node);
break;
case 'toggle':
$ret['success'] = $filter->toggle($root, $node, $newState);
break;
case 'swap':
$ret['success'] = true;
if (empty($node))
{
$ret['success'] = false;
}
if ($ret['success'] && !empty($oldNode))
{
$ret = $this->applyExclusionFilter($type, $root, $oldNode, 'remove');
}
if ($ret['success'])
{
$ret = $this->applyExclusionFilter($type, $root, $node, 'set');
}
break;
}
$ret['newstate'] = $newState;
if (is_null($newState))
{
$ret['newstate'] = $ret['success'];
}
if ($ret['success'])
{
$filters = Factory::getFilters();
$filters->save();
}
return $ret;
}
/**
* Retrieves the filters as an array. Used for the tabular filter editor.
*
* @param string $root The root node to search filters on
*
* @return array A collection of hash arrays containing node and type for each filtered element
*/
protected function &getTabularFilters($root)
{
// A reference to the global Akeeba Engine filter object
$filters = Factory::getFilters();
// Initialize the return array
$ret = [];
foreach ($this->knownFilterTypes as $type)
{
$rawFilterData = $filters->getFilterData($type);
if (array_key_exists($root, $rawFilterData))
{
if (!empty($rawFilterData[$root]))
{
foreach ($rawFilterData[$root] as $node)
{
$ret[] = [
'node' => substr($node, 0), // Make sure we get a COPY, not a reference to the original data
'type' => $type,
];
}
}
}
}
return $ret;
}
/**
* Resets the filters
*
* @param string $root Root directory
*
* @return void
*/
protected function resetAllFilters($root)
{
// Get a reference to the global Filters object
$filters = Factory::getFilters();
foreach ($this->knownFilterTypes as $filterName)
{
$filter = Factory::getFilterObject($filterName);
$filter->reset($root);
}
$filters->save();
}
}