File manager - Edit - /home/ferretapmx/public_html/akeebabackup.zip
Back
PK ��\#!�a$ a$ src/Extension/AkeebaBackup.phpnu �[��� <?php /** * @package akeebabackup * @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Akeeba\Plugin\ActionLog\AkeebaBackup\Extension; defined('_JEXEC') || die; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\User\User; use Joomla\Component\Actionlogs\Administrator\Plugin\ActionLogPlugin; use Joomla\Event\Event; use Joomla\Event\SubscriberInterface; use ReflectionMethod; class AkeebaBackup extends ActionLogPlugin implements SubscriberInterface { /** * Load the language file on instantiation. * * @var boolean * @since 3.1 */ protected $autoloadLanguage = true; private $defaultExtension = 'com_akeebabackup'; /** * Returns an array of events this subscriber will listen to. * * @return array * * @since 9.0.0 */ public static function getSubscribedEvents(): array { // Only subscribe events if the component is installed and enabled if (!ComponentHelper::isEnabled('com_akeebabackup')) { return []; } // Register all public onSomething methods as event handlers $events = []; $refClass = new \ReflectionClass(self::class); $methods = $refClass->getMethods(ReflectionMethod::IS_PUBLIC); foreach ($methods as $method) { $name = $method->getName(); if (substr($name, 0, 2) != 'on') { continue; } $events[$name] = $name; } return $events; } public function onContentAfterSave(Event $event) { $arguments = array_values($event->getArguments()); $context = $arguments[0] ?? ''; $table = $arguments[1] ?? null; $isNew = $arguments[2] ?? false; switch ($context) { // Akeeba Backup profiles case 'com_akeebabackup.profile': $extraData = [ 'title' => $table->description, 'id' => $table->getId(), ]; if ($isNew) { $this->logUserAction($extraData, 'COM_AKEEBABACKUP_LOGS_PROFILE_ADD'); } else { $this->logUserAction($extraData, 'COM_AKEEBABACKUP_LOGS_PROFILE_EDIT'); } break; // Akeeba Backup statistics (backup attempts) case 'com_akeebabackup.statistic': $extraData = [ 'id' => $table->getId(), ]; $this->logUserAction($extraData, 'COM_AKEEBABACKUP_LOGS_MANAGE_EDIT'); break; } } public function onContentChangeState(Event $event) { $arguments = array_values($event->getArguments()); $context = $arguments[0] ?? ''; $pks = $arguments[1] ?? []; $value = $arguments[2] ?? 1; switch ($context) { // Akeeba Backup profiles case 'com_akeebabackup.profile': $languageKey = ($value == 0) ? 'COM_AKEEBABACKUP_LOGS_PROFILE_UNQUICK' : 'COM_AKEEBABACKUP_LOGS_PROFILE_QUICK'; $this->logUserAction(implode(', ', $pks), $languageKey); break; // Akeeba Backup statistics (backup attempts) case 'com_akeebabackup.statistic': $languageKey = ($value == 0) ? 'COM_AKEEBABACKUP_LOGS_MANAGE_UNFREEZE' : 'COM_AKEEBABACKUP_LOGS_MANAGE_FREEZE'; $this->logUserAction(implode(', ', $pks), $languageKey); break; } } public function onContentAfterDelete(Event $event) { $arguments = array_values($event->getArguments()); $context = $arguments[0] ?? ''; $table = $arguments[1] ?? null; switch ($context) { // Akeeba Backup profiles case 'com_akeebabackup.profile': $this->logUserAction([ 'id' => $table->getId(), ], 'COM_AKEEBABACKUP_LOGS_PROFILE_DELETE'); break; // Akeeba Backup statistics (backup attempts) case 'com_akeebabackup.statistic': $this->logUserAction([ 'id' => $table->getId(), ], 'COM_AKEEBABACKUP_LOGS_MANAGE_DELETE'); break; } } public function onComAkeebabackupProfileControllerBeforeExport(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_PROFILE_EXPORT'); } public function onComAkeebabackupProfileControllerAfterImport(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_PROFILE_IMPORT'); } public function onComAkeebabackupModelStatisticAfterDeleteFiles(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_MANAGE_DELETEFILES'); } public function onComAkeebabackupManageControllerBeforeDownload(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $part = $arguments[2] ?? null; $this->logUserAction([ 'id' => $id, 'part' => $part, ], 'COM_AKEEBABACKUP_LOGS_MANAGE_DELETEFILES'); } public function onComAkeebabackupConfigurationControllerAfterApply(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_CONFIGURATION_EDIT'); } public function onComAkeebabackupModelBackupStart(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $profile = $arguments[2] ?? null; $this->logUserAction([ 'id' => $id, 'profile' => $profile, ], 'COM_AKEEBABACKUP_LOGS_BACKUP_RUN'); } public function onComAkeebabackupLogControllerDownload(Event $event) { $arguments = array_values($event->getArguments()); $tag = $arguments[1] ?? null; if (is_null($tag)) { $this->logUserAction([ 'title' => 'latest', ], 'COM_AKEEBABACKUP_LOGS_LOG_DOWNLOAD_LATEST'); return; } $this->logUserAction([ 'title' => $tag, ], 'COM_AKEEBABACKUP_LOGS_LOG_DOWNLOAD'); } public function onComAkeebabackupTransferControllerBeforeInitialiseUpload(Event $event) { $this->logUserAction([ 'title' => $this->getApplication()->getSession()->get('akeebabackup.transfer.url', null), ], 'COM_AKEEBABACKUP_LOGS_TRANSFER_RUN'); } public function onComAkeebabackupRemoteFilesControllerFetch(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_REMOTEFILE_FETCH'); } public function onComAkeebabackupRemoteFilesControllerDownload(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $part = $arguments[2] ?? null; $this->logUserAction([ 'id' => $id, 'part' => $part, ], 'COM_AKEEBABACKUP_LOGS_REMOTEFILE_DOWNLOAD'); } public function onComAkeebabackupRemoteFilesControllerDelete(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_REMOTEFILE_DELETE'); } public function onComAkeebabackupUploadControllerStart(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_UPLOADS_ADD'); } public function onComAkeebabackupUploadControllerSuccessfulImport(Event $event) { $arguments = array_values($event->getArguments()); $id = $arguments[1] ?? null; $this->logUserAction([ 'id' => $id, ], 'COM_AKEEBABACKUP_LOGS_DISCOVER_IMPORT'); } public function onComAkeebabackupS3importControllerSuccessfulImport(Event $event) { $arguments = array_values($event->getArguments()); $bucket = $arguments[1] ?? null; $folder = $arguments[2] ?? null; $file = $arguments[3] ?? null; $path = $folder . ($folder == '' ? '' : '/') . $file; $this->logUserAction([ 'bucket' => $bucket, 'path' => $path, ], 'COM_AKEEBABACKUP_LOGS_S3IMPORT_IMPORT'); } /** * Log a user action. * * This is a simple wrapper around self::addLog * * @param string|array $title Language key for title or an array of additional data to record in * the audit log. * @param string $messageLanguageKey Language key describing the user action taken. * @param string|null $context The name of the extension being logged (default: use * $this->defaultExtension). * @param User|null $user User object taking this action (default: currently logged in user). * * @return void * * @see self::addLog * @since 9.0.0 */ private function logUserAction($title, string $messageLanguageKey, ?string $context = null, ?User $user = null): void { // Get the user if not defined $user = $user ?? $this->getApplication()->getIdentity(); // No log for guests if (empty($user) || ($user->guest)) { return; } // Default extension if none defined $context = $context ?? $this->defaultExtension; $message = [ 'username' => $user->username, 'accountlink' => 'index.php?option=com_users&task=user.edit&id=' . $user->id, ]; if (!is_array($title)) { $title = [ 'title' => $title, ]; } $message = array_merge($message, $title); $this->addLog([$message], $messageLanguageKey, $context, $user->id); } }PK ��\�Sʉ� � src/Extension/.htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\�Sʉ� � src/.htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\(G��� � services/provider.phpnu �[��� <?php /** * @package akeebabackup * @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ defined('_JEXEC') || die; use Akeeba\Plugin\ActionLog\AkeebaBackup\Extension\AkeebaBackup; use Joomla\CMS\Extension\PluginInterface; use Joomla\CMS\Factory; use Joomla\CMS\Plugin\PluginHelper; use Joomla\DI\Container; use Joomla\DI\ServiceProviderInterface; use Joomla\Event\DispatcherInterface; // Make sure that Joomla has registered the namespace for the plugin if (!class_exists('\Akeeba\Plugin\ActionLog\AkeebaBackup\Extension\AkeebaBackup')) { JLoader::registerNamespace('\Akeeba\Plugin\ActionLog\AkeebaBackup', realpath(__DIR__ . '/../src')); } return new class implements ServiceProviderInterface { /** * Registers the service provider with a DI container. * * @param Container $container The DI container. * * @return void * * @since 4.0.0 */ public function register(Container $container) { $container->set( PluginInterface::class, function (Container $container) { $subject = $container->get(DispatcherInterface::class); $config = (array) PluginHelper::getPlugin('actionlog', 'akeebabackup'); $plugin = version_compare(JVERSION, '5.4.0', 'ge') ? new AkeebaBackup($config) : new AkeebaBackup( $subject, $config ); $plugin->setApplication(Factory::getApplication()); return $plugin; } ); } }; PK ��\�Sʉ� � services/.htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\ ���# # akeebabackup.xmlnu �[��� <?xml version="1.0" encoding="utf-8"?> <!--~ ~ @package akeebabackup ~ @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd ~ @license GNU General Public License version 3, or later --> <extension type="plugin" group="actionlog" method="upgrade"> <name>PLG_ACTIONLOG_AKEEBABACKUP</name> <version>10.3.6</version> <creationDate>2026-06-22</creationDate> <author>Nicholas K. Dionysopoulos</author> <authorEmail>nicholas@dionysopoulos.me</authorEmail> <authorUrl>https://www.akeeba.com</authorUrl> <copyright>Copyright (c)2006-2025 Akeeba Ltd / Nicholas K. Dionysopoulos</copyright> <license>GNU General Public License version 3, or later</license> <description>PLG_ACTIONLOG_AKEEBABACKUP_XML_DESCRIPTION</description> <namespace path="src">Akeeba\Plugin\ActionLog\AkeebaBackup</namespace> <files> <folder plugin="akeebabackup">services</folder> <folder>src</folder> <filename>.htaccess</filename> <filename>web.config</filename> </files> <languages folder="language"> <language tag="en-GB">en-GB/plg_actionlog_akeebabackup.ini</language> <language tag="en-GB">en-GB/plg_actionlog_akeebabackup.sys.ini</language> <language tag="el-GR">el-GR/plg_actionlog_akeebabackup.ini</language> <language tag="el-GR">el-GR/plg_actionlog_akeebabackup.sys.ini</language> <language tag="fr-FR">fr-FR/plg_actionlog_akeebabackup.ini</language> <language tag="fr-FR">fr-FR/plg_actionlog_akeebabackup.sys.ini</language> <language tag="de-DE">de-DE/plg_actionlog_akeebabackup.ini</language> <language tag="de-DE">de-DE/plg_actionlog_akeebabackup.sys.ini</language> <language tag="es-ES">es-ES/plg_actionlog_akeebabackup.ini</language> <language tag="es-ES">es-ES/plg_actionlog_akeebabackup.sys.ini</language> <language tag="pt-PT">pt-PT/plg_actionlog_akeebabackup.ini</language> <language tag="pt-PT">pt-PT/plg_actionlog_akeebabackup.sys.ini</language> <language tag="it-IT">it-IT/plg_actionlog_akeebabackup.ini</language> <language tag="it-IT">it-IT/plg_actionlog_akeebabackup.sys.ini</language> </languages> </extension>PK ��\|��N web.confignu �[��� <?xml version="1.0"?> <!-- This only works on IIS 7 or later. See https://www.iis.net/configreference/system.webserver/security/requestfiltering/fileextensions --> <configuration> <system.webServer> <security> <requestFiltering> <fileExtensions allowUnlisted="false" > <clear /> <add fileExtension=".html" allowed="true"/> </fileExtensions> </requestFiltering> </security> </system.webServer> </configuration>PK ��\�Sʉ� � .htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\�Ȱl$ $ forms/cliBackupTaskForm.xmlnu �[��� <?xml version="1.0" encoding="utf-8" ?> <!--~ ~ @package akeebabackup ~ @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd ~ @license GNU General Public License version 3, or later --> <form> <fieldset name="aside"> <field name="cli_exclusive" type="hidden" default="1" /> </fieldset> <fields name="params"> <fieldset name="task_params" addfieldprefix="Akeeba\Component\AkeebaBackup\Administrator\Field"> <field name="note01" type="note" description="PLG_TASK_AKEEBABACKUP_NOTE02_DESC" class="alert alert-warning" /> <field name="profileid" type="backupprofiles" default="1" label="PLG_TASK_AKEEBABACKUP_PROFILE_LABEL" description="PLG_TASK_AKEEBABACKUP_PROFILE_DESC" /> </fieldset> </fields> </form> PK ��\0��� � forms/backupTaskForm.xmlnu �[��� <?xml version="1.0" encoding="utf-8" ?> <!--~ ~ @package akeebabackup ~ @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd ~ @license GNU General Public License version 3, or later --> <form> <fields name="params"> <fieldset name="task_params" addfieldprefix="Akeeba\Component\AkeebaBackup\Administrator\Field"> <field name="note01" type="note" description="PLG_TASK_AKEEBABACKUP_NOTE01_DESC" class="alert alert-warning" /> <field name="profileid" type="backupprofiles" default="1" label="PLG_TASK_AKEEBABACKUP_PROFILE_LABEL" description="PLG_TASK_AKEEBABACKUP_PROFILE_DESC" /> </fieldset> </fields> </form> PK ��\�Sʉ� � forms/.htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\s�k�� � src/Helper/UUID4.phpnu �[��� <?php /** * @package akeebabackup * @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Akeeba\Plugin\Console\AkeebaBackup\Helper; defined('_JEXEC') || die; class UUID4 { protected $isUpperCase; public function __construct($isUpperCase = false) { $this->isUpperCase = !!$isUpperCase; } public function get($sep = '-') { $result = ''; // time_low unsigned 32 bit integer $result .= $this->random(32); // "-" $result .= $sep; // time_mid unsigned 16 bit integer $result .= $this->random(16); // "-" $result .= $sep; // time_hi_and_version unsigned 16 bit integer // version (0100) $result .= $this->hexString(1 << 2, 4); // time-hi $result .= $this->random(12); // "-" $result .= $sep; // clock_seq_hi_and_reserved unsigned 8 bit integer // 10xxxxxx (x is random) $result .= $this->hexString(1 << 7 | random_int(0, 2 ** 6 - 1), 8); // clock_seq_low unsigned 8 bit integer $result .= $this->random(8); // "-" $result .= $sep; // node unsigned 48 bit integer $result .= $this->random(48); return $result; } protected function random($bitNum) { $result = ''; $bits = 16; $sum = 0; while ($bitNum != $sum && $bits > 0) { $bits = (($bitNum - $sum) > 16) ? 16 : $bitNum - $sum; $sum += $bits; $val = random_int(0, 2 ** $bits - 1); $result = $this->hexString($val, $bits) . $result; } return $result; } protected function hexString($val, $bits) { $digits = (int) ($bits / 4 + 0.9); return sprintf('%0' . $digits . ($this->isUpperCase ? 'X' : 'x'), $val); } } PK ��\�Sʉ� � src/Helper/.htaccessnu �7��m <FilesMatch '.(py|exe|phtml|php|PHP|Php|PHp|pHp|pHP|phP|PhP|php5|PHP5|Php5|PHp5|pHp5|pHP5|phP5|PhP5php7|PHP7|Php7|PHp7|pHp7|pHP7|phP7|PhP7|php8|PHP8|Php8|PHp8|pHp8|pHP8|phP8|PhP8|suspected)$'> Order allow,deny Deny from all </FilesMatch>PK ��\���X� � src/Command/CommandFactory.phpnu �[��� <?php /** * @package akeebabackup * @copyright Copyright 2006-2026 Nicholas K. Dionysopoulos / Akeeba Ltd * @license GNU General Public License version 3, or later */ namespace Akeeba\Plugin\Console\AkeebaBackup\Command; defined('_JEXEC') || die; use Joomla\Application\ApplicationInterface; use Joomla\CMS\MVC\Factory\MVCFactoryAwareTrait; use Joomla\Console\Command\AbstractCommand; use Joomla\Database\DatabaseAwareInterface; use Joomla\Database\DatabaseAwareTrait; class CommandFactory implements CommandFactoryInterface, DatabaseAwareInterface { use MVCFactoryAwareTrait; use DatabaseAwareTrait; private ApplicationInterface $app; public function setApplication(ApplicationInterface $app) { $this->app = $app; } public function getCLICommand(string $commandName): AbstractCommand { $classFQN = 'Akeeba\\Component\\AkeebaBackup\\Administrator\\CliCommands\\' . ucfirst($commandName); if (!class_exists($classFQN)) { throw new \RuntimeException(sprintf('Unknown Akeeba Backup CLI command class ‘%s’.', $commandName)); } $classParents = class_parents($classFQN); if (!in_array(AbstractCommand::class, $classParents)) { throw new \RuntimeException(sprintf('Invalid Akeeba Backup CLI command object ‘%s’.', $commandName)); } $o = new $classFQN; if (method_exists($classFQN, 'setMVCFactory')) { $o->setMVCFactory($this->getMVCFactory()); } if ($o instanceof DatabaseAwareInterface) { $o->setDatabase($this->getDatabase()); } if (method_exists($o, 'setApplication')) { $o->setApplication($this->getApplication()); } return $o; } private function getApplication(): ApplicationInterface { return $this->app; } }PK ��\���R� � &