shell bypass 403
<?php /** * @package akeebabackup * @copyright Copyright (c)2006-2024 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Akeeba\Component\AkeebaBackup\Administrator\Service; use Akeeba\Component\AkeebaBackup\Administrator\Mixin\RunPluginsTrait; use Exception; use Joomla\CMS\Application\CMSApplicationInterface; use Joomla\CMS\Cache\CacheControllerFactoryInterface; use Throwable; class CacheCleaner { use RunPluginsTrait; protected $app; protected $cacheControllerFactory; public function __construct(CMSApplicationInterface $app, CacheControllerFactoryInterface $cacheControllerFactory) { $this->app = $app; $this->cacheControllerFactory = $cacheControllerFactory; } /** * Clean a cache group * * @param string $group The cache to clean, e.g. com_content * @param int $client_id The application ID for which the cache will be cleaned * @param object $app The current CMS application. DO NOT TYPEHINT MORE SPECIFICALLY! * * @return array Cache controller options, including cleaning result * @throws Exception */ public function clearGroup(string $group): array { $options = [ 'defaultgroup' => $group, 'cachebase' => $this->app->get('cache_path', JPATH_CACHE), 'result' => true, ]; try { $this->cacheControllerFactory ->createCacheController('callback', $options) ->cache ->clean(); } catch (Throwable $e) { $options['result'] = false; } return $options; } /** * Clears the specified cache groups. * * @param array $clearGroups Which cache groups to clear. Usually this is com_yourcomponent to clear * your component's cache. * @param array $cacheClients Which cache clients to clear. 0 is the back-end, 1 is the front-end. If you * do not specify anything, both cache clients will be cleared. * @param string|null $event An event to run upon trying to clear the cache. Empty string to disable. If * NULL and the group is "com_content" I will trigger onContentCleanCache. * * @return void * @throws Exception */ public function clearGroups(array $clearGroups, ?string $event = null): void { // Early return on nonsensical input if (empty($clearGroups)) { return; } // Loop all groups to clean foreach ($clearGroups as $group) { // Groups must be non-empty strings if (empty($group) || !is_string($group)) { continue; } $options = $this->clearGroup($group); // Do not call any events if I failed to clean the cache using the core Joomla API if (!($options['result'] ?? false)) { return; } /** * If you're cleaning com_content, and you have passed no event name I will use onContentCleanCache. */ if ($group === 'com_content') { $cacheCleaningEvent = $event ?: 'onContentCleanCache'; } /** * Call Joomla's cache cleaning plugin event (e.g. onContentCleanCache) as well. * * @see BaseDatabaseModel::cleanCache() */ if (empty($cacheCleaningEvent)) { continue; } $this->triggerPluginEvent($cacheCleaningEvent, $options); } } }