shell bypass 403
<?php
/**
* @package Joomla.Administrator
* @subpackage mod_privacy_dashboard
*
* @copyright (C) 2025 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\Module\PrivacyDashboard\Administrator\Dispatcher;
use Joomla\CMS\Dispatcher\AbstractModuleDispatcher;
use Joomla\CMS\Helper\HelperFactoryAwareInterface;
use Joomla\CMS\Helper\HelperFactoryAwareTrait;
use Joomla\CMS\Helper\ModuleHelper;
use Joomla\CMS\Layout\LayoutHelper;
// phpcs:disable PSR1.Files.SideEffects
\defined('_JEXEC') or die;
// phpcs:enable PSR1.Files.SideEffects
/**
* Dispatcher class for mod_privacy_dashboard
*
* @since 5.4.0
*/
class Dispatcher extends AbstractModuleDispatcher implements HelperFactoryAwareInterface
{
use HelperFactoryAwareTrait;
/**
* Runs the dispatcher.
*
* @return void
*
* @since 5.4.0
*/
public function dispatch()
{
$app = $this->getApplication();
// Only super user can view this data
if (!$app->getIdentity()->authorise('core.admin')) {
return;
}
$displayData = $this->getLayoutData();
// Stop when display data is false
if ($displayData === false) {
return;
}
// Boot component to ensure HTML helpers are loaded
$app->bootComponent('com_privacy');
// Load the privacy component language file.
$lang = $app->getLanguage();
$lang->load('com_privacy', JPATH_ADMINISTRATOR)
|| $lang->load('com_privacy', JPATH_ADMINISTRATOR . '/components/com_privacy');
$this->loadLanguage();
// Execute the layout without the module context
$loader = static function (array $displayData) {
// If $displayData doesn't exist in extracted data, unset the variable.
if (!\array_key_exists('displayData', $displayData)) {
extract($displayData);
unset($displayData);
} else {
extract($displayData);
}
/**
* Extracted variables
* -----------------
* @var \stdClass $module
* @var Registry $params
*/
if (\count($list)) {
require ModuleHelper::getLayoutPath('mod_privacy_dashboard', $params->get('layout', 'default'));
} else {
echo LayoutHelper::render('joomla.content.emptystate_module', [
'textPrefix' => 'COM_PRIVACY_REQUESTS',
'icon' => 'icon-lock',
]);
}
};
$loader($displayData);
}
/**
* Returns the layout data.
*
* @return array
*
* @since 5.4.0
*/
protected function getLayoutData()
{
$data = parent::getLayoutData();
$data['list'] = $this->getHelperFactory()->getHelper('PrivacyDashboardHelper')->getPrivacyRequests();
return $data;
}
}