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;
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\User\User;
use RuntimeException;
trait ControllerCustomACLTrait
{
protected function onBeforeExecute(&$task)
{
$this->akeebaBackupACLCheck($this->getName(), $this->task);
}
/**
* Checks if the currently logged in user has the required ACL privileges to access the current view. If not, a
* RuntimeException is thrown.
*
* @return void
*/
protected function akeebaBackupACLCheck($view, $task)
{
// Akeeba Backup-specific ACL checks. All views not listed here are limited by the akeeba.configure privilege.
$viewACLMap = [
'controlpanel' => 'core.manage',
'backup' => 'akeebabackup.backup',
'manage' => 'core.manage',
'manage.download' => 'akeebabackup.download',
'manage.remove' => 'akeebabackup.download',
'manage.deletefiles' => 'akeebabackup.download',
'manage.showcomment' => 'akeebabackup.backup',
'manage.save' => 'akeebabackup.download',
'manage.restore' => 'akeebabackup.configure',
'manage.cancel' => 'akeebabackup.backup',
'upload' => 'akeebabackup.backup',
'remotefiles' => 'akeebabackup.download',
'transfer' => 'akeebabackup.download',
];
$view = strtolower($view ?? 'controlpanel');
$task = strtolower($task ?? 'main');
// Default
$privilege = 'akeebabackup.configure';
// Just the view was found
if (array_key_exists($view, $viewACLMap))
{
$privilege = $viewACLMap[$view];
}
// The view AND task was found
if (array_key_exists($view . '.' . $task, $viewACLMap))
{
$privilege = $viewACLMap[$view . '.' . $task];
}
// If an empty privilege is defined do not perform any ACL checks
if (empty($privilege))
{
return;
}
$user = Factory::getApplication()->getIdentity() ?? (new User());
if (!$user->authorise($privilege, 'com_akeebabackup'))
{
throw new RuntimeException(Text::_('JERROR_ALERTNOAUTHOR'), 403);
}
}
}