File manager - Edit - /home/ferretapmx/public_html/com_actionlogs.zip
Back
PK � �\O g@ config.xmlnu �[��� <?xml version="1.0" encoding="UTF-8"?> <config addfieldprefix="Joomla\Component\Actionlogs\Administrator\Field"> <help key="User_Actions_Log:_Options"/> <inlinehelp button="show"/> <fieldset name="actionlogs" label="COM_ACTIONLOGS_OPTIONS"> <field name="ip_logging" type="radio" label="COM_ACTIONLOGS_IP_LOGGING_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="csv_delimiter" type="list" label="COM_ACTIONLOGS_CSV_DELIMITER_LABEL" default="," validate="options" > <option value=",">COM_ACTIONLOGS_COMMA</option> <option value=";">COM_ACTIONLOGS_SEMICOLON</option> </field> <field name="loggable_extensions" type="logtype" label="COM_ACTIONLOGS_LOG_EXTENSIONS_LABEL" multiple="true" layout="joomla.form.field.list-fancy-select" default="com_banners,com_cache,com_categories,com_checkin,com_config,com_contact,com_content,com_fields,com_guidedtours,com_installer,com_media,com_menus,com_messages,com_modules,com_newsfeeds,com_plugins,com_redirect,com_scheduler,com_tags,com_templates,com_users" /> <field name="loggable_api" type="radio" label="COM_ACTIONLOGS_API_LOGGING_LABEL" layout="joomla.form.field.radio.switcher" default="0" filter="integer" > <option value="0">JNO</option> <option value="1">JYES</option> </field> <field name="loggable_verbs" type="list" label="COM_ACTIONLOGS_LOG_VERBS_LABEL" multiple="true" showon="loggable_api:1" default="GET" validate="options" layout="joomla.form.field.list-fancy-select" > <option value="GET">COM_ACTIONLOGS_FIELD_VALUE_GET</option> <option value="POST">COM_ACTIONLOGS_FIELD_VALUE_POST</option> <option value="DELETE">COM_ACTIONLOGS_FIELD_VALUE_DELETE</option> <option value="PUT">COM_ACTIONLOGS_FIELD_VALUE_PUT</option> <option value="PATCH">COM_ACTIONLOGS_FIELD_VALUE_PATCH</option> </field> <field name="date_relative" type="radio" label="COM_ACTIONLOGS_DATE_RELATIVE_LABEL" layout="joomla.form.field.radio.switcher" default="1" filter="integer" > <option value="0">JHIDE</option> <option value="1">JSHOW</option> </field> </fieldset> </config> PK � �\_}` actionlogs.xmlnu �[��� <?xml version="1.0" encoding="UTF-8"?> <extension type="component" method="upgrade"> <name>com_actionlogs</name> <author>Joomla! Project</author> <creationDate>2018-05</creationDate> <copyright>(C) 2018 Open Source Matters, Inc.</copyright> <license>GNU General Public License version 2 or later; see LICENSE.txt</license> <authorEmail>admin@joomla.org</authorEmail> <authorUrl>www.joomla.org</authorUrl> <version>3.9.0</version> <description>COM_ACTIONLOGS_XML_DESCRIPTION</description> <namespace path="src">Joomla\Component\Actionlogs</namespace> <administration> <menu>COM_ACTIONLOGS</menu> <files folder="admin"> <file>actionlogs.xml</file> <file>config.xml</file> <folder>forms</folder> <folder>services</folder> <folder>src</folder> <folder>tmpl</folder> </files> <languages folder="admin"> <language tag="en-GB">language/en-GB/com_actionlogs.ini</language> <language tag="en-GB">language/en-GB/com_actionlogs.sys.ini</language> </languages> </administration> </extension> PK � �\4��- �- src/Helper/ActionlogsHelper.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Helper; use Joomla\CMS\Date\Date; use Joomla\CMS\Factory; use Joomla\CMS\Language\Text; use Joomla\CMS\Object\CMSObject; use Joomla\CMS\Router\Route; use Joomla\Filesystem\Path; use Joomla\String\StringHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Actionlogs component helper. * * @since 3.9.0 */ class ActionlogsHelper { /** * Array of characters starting a formula * * @var array * * @since 3.9.7 */ private static $characters = ['=', '+', '-', '@']; /** * Method to convert logs objects array to an iterable type for use with a CSV export * * @param array|\Traversable $data The logs data objects to be exported * * @return \Generator * * @since 3.9.0 * * @throws \InvalidArgumentException */ public static function getCsvData($data): \Generator { if (!is_iterable($data)) { throw new \InvalidArgumentException( \sprintf( '%s() requires an array or object implementing the Traversable interface, a %s was given.', __METHOD__, \is_object($data) ? \get_class($data) : \gettype($data) ) ); } $disabledText = Text::_('COM_ACTIONLOGS_DISABLED'); // Header row yield ['Id', 'Action', 'Extension', 'Date', 'Name', 'IP Address']; foreach ($data as $log) { $extension = strtok($log->extension, '.'); static::loadTranslationFiles($extension); yield [ 'id' => $log->id, 'message' => self::escapeCsvFormula(strip_tags(static::getHumanReadableLogMessage($log, false))), 'extension' => self::escapeCsvFormula(Text::_($extension)), 'date' => (new Date($log->log_date, new \DateTimeZone('UTC')))->format('Y-m-d H:i:s T'), 'name' => self::escapeCsvFormula($log->name), 'ip_address' => self::escapeCsvFormula($log->ip_address === 'COM_ACTIONLOGS_DISABLED' ? $disabledText : $log->ip_address), ]; } } /** * Load the translation files for an extension * * @param string $extension Extension name * * @return void * * @since 3.9.0 */ public static function loadTranslationFiles($extension) { static $cache = []; $extension = strtolower($extension); if (isset($cache[$extension])) { return; } $lang = Factory::getLanguage(); $source = ''; switch (substr($extension, 0, 3)) { case 'com': default: $source = JPATH_ADMINISTRATOR . '/components/' . $extension; break; case 'lib': $source = JPATH_LIBRARIES . '/' . substr($extension, 4); break; case 'mod': $source = JPATH_SITE . '/modules/' . $extension; break; case 'plg': $parts = explode('_', $extension, 3); if (\count($parts) > 2) { $source = JPATH_PLUGINS . '/' . $parts[1] . '/' . $parts[2]; } break; case 'pkg': $source = JPATH_SITE; break; case 'tpl': $source = JPATH_BASE . '/templates/' . substr($extension, 4); break; } $lang->load($extension, JPATH_ADMINISTRATOR) || $lang->load($extension, $source); if (!$lang->hasKey(strtoupper($extension))) { $lang->load($extension . '.sys', JPATH_ADMINISTRATOR) || $lang->load($extension . '.sys', $source); } $cache[$extension] = true; } /** * Get parameters to be * * @param string $context The context of the content * * @return mixed An object contains content type parameters, or null if not found * * @since 3.9.0 * * @deprecated 4.3 will be removed in 6.0 * Use the action log config model instead * Example: Factory::getApplication()->bootComponent('actionlogs')->getMVCFactory() * ->createModel('ActionlogConfig', 'Administrator')->getLogContentTypeParams($context); */ public static function getLogContentTypeParams($context) { return Factory::getApplication()->bootComponent('actionlogs')->getMVCFactory() ->createModel('ActionlogConfig', 'Administrator')->getLogContentTypeParams($context); } /** * Get human readable log message for a User Action Log * * @param \stdClass $log A User Action log message record * @param boolean $generateLinks Flag to disable link generation when creating a message * * @return string * * @since 3.9.0 */ public static function getHumanReadableLogMessage($log, $generateLinks = true) { static::loadActionLogPluginsLanguage(); static $links = []; $message = Text::_($log->message_language_key); $messageData = json_decode($log->message, true); // Special handling for translation extension name if (isset($messageData['extension_name'])) { static::loadTranslationFiles($messageData['extension_name']); $messageData['extension_name'] = Text::_($messageData['extension_name']); } // Translating application if (isset($messageData['app'])) { $messageData['app'] = Text::_($messageData['app']); } // Translating type if (isset($messageData['type'])) { $messageData['type'] = Text::_($messageData['type']); } // Remove links from the message template, if we should not generate links. if (!$generateLinks) { $message = preg_replace('/<a href=["\'].+?["\']>/', '', $message); $message = str_replace('</a>', '', $message); } $linkMode = Factory::getApplication()->get('force_ssl', 0) >= 1 ? Route::TLS_FORCE : Route::TLS_IGNORE; foreach ($messageData as $key => $value) { // Escape any markup in the values to prevent XSS attacks $value = $value !== null ? htmlspecialchars($value, ENT_QUOTES, 'UTF-8') : ''; // Convert relative url to absolute url so that it is clickable in action logs notification email if ($generateLinks && StringHelper::strpos($value, 'index.php?') === 0) { if (!isset($links[$value])) { $links[$value] = Route::link('administrator', $value, false, $linkMode, true); } $value = $links[$value]; } $message = str_replace('{' . $key . '}', $value, $message); } return $message; } /** * Get link to an item of given content type * * @param string $component * @param string $contentType * @param integer $id * @param string $urlVar * @param CMSObject $object * * @return string Link to the content item * * @since 3.9.0 */ public static function getContentTypeLink($component, $contentType, $id, $urlVar = 'id', $object = null) { // Try to find the component helper. $eName = str_replace('com_', '', $component); $file = Path::clean(JPATH_ADMINISTRATOR . '/components/' . $component . '/helpers/' . $eName . '.php'); if (file_exists($file)) { $prefix = ucfirst(str_replace('com_', '', $component)); $cName = $prefix . 'Helper'; \JLoader::register($cName, $file); if (class_exists($cName) && \is_callable([$cName, 'getContentTypeLink'])) { return $cName::getContentTypeLink($contentType, $id, $object); } } if (empty($urlVar)) { $urlVar = 'id'; } // Return default link to avoid having to implement getContentTypeLink in most of our components return 'index.php?option=' . $component . '&task=' . $contentType . '.edit&' . $urlVar . '=' . $id; } /** * Load both enabled and disabled actionlog plugins language file. * * It is used to make sure actions log is displayed properly instead of only language items displayed when a plugin is disabled. * * @return void * * @since 3.9.0 */ public static function loadActionLogPluginsLanguage() { static $loaded; if ($loaded) { return; } $loaded = true; $lang = Factory::getLanguage(); $db = Factory::getDbo(); // Get all (both enabled and disabled) actionlog plugins $query = $db->getQuery(true) ->select( $db->quoteName( [ 'folder', 'element', 'params', 'extension_id', ], [ 'type', 'name', 'params', 'id', ] ) ) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('type') . ' = ' . $db->quote('plugin')) ->where($db->quoteName('folder') . ' = ' . $db->quote('actionlog')) ->whereIn($db->quoteName('state'), [0, 1]) ->order($db->quoteName('ordering')); $db->setQuery($query); try { $rows = $db->loadObjectList(); } catch (\RuntimeException) { $rows = []; } if (empty($rows)) { return; } foreach ($rows as $row) { $name = $row->name; $type = $row->type; $extension = 'Plg_' . $type . '_' . $name; $extension = strtolower($extension); // If language already loaded, don't load it again. if ($lang->getPaths($extension)) { continue; } $lang->load($extension, JPATH_ADMINISTRATOR) || $lang->load($extension, JPATH_PLUGINS . '/' . $type . '/' . $name); } // Load plg_system_actionlogs too $lang->load('plg_system_actionlogs', JPATH_ADMINISTRATOR); // Load plg_system_privacyconsent too $lang->load('plg_system_privacyconsent', JPATH_ADMINISTRATOR); // Load plg_user_terms too $lang->load('plg_user_terms', JPATH_ADMINISTRATOR); // Load com_privacy too. $lang->load('com_privacy', JPATH_ADMINISTRATOR); } /** * Escapes potential characters that start a formula in a CSV value to prevent injection attacks * * @param mixed $value csv field value * * @return mixed * * @since 3.9.7 */ protected static function escapeCsvFormula($value) { if ($value == '') { return $value; } if (\in_array($value[0], self::$characters, true)) { $value = ' ' . $value; } return $value; } } 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 � �\G �� � src/Dispatcher/Dispatcher.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2023 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Dispatcher; use Joomla\CMS\Access\Exception\NotAllowed; use Joomla\CMS\Dispatcher\ComponentDispatcher; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * ComponentDispatcher class for com_actionlogs * * @since 4.2.7 */ class Dispatcher extends ComponentDispatcher { /** * Method to check component access permission * * @return void * * @since 4.2.7 */ protected function checkAccess() { $user = $this->app->getIdentity(); // Access check if (!$user->authorise('core.admin')) { throw new NotAllowed($this->app->getLanguage()->_('JERROR_ALERTNOAUTHOR'), 403); } } } PK � �\�Sʉ� � src/Dispatcher/.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 � �\�w�[. . src/Field/LogtypeField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Form\Field\ListField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\Component\Actionlogs\Administrator\Helper\ActionlogsHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Field to load a list of all extensions that have logged actions * * @since 3.9.0 */ class LogtypeField extends ListField { /** * The form field type. * * @var string * @since 3.9.0 */ protected $type = 'LogType'; /** * Method to get the field options. * * @return array The field option objects. * * @since 3.9.0 */ public function getOptions() { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName('extension')) ->from($db->quoteName('#__action_logs_extensions')); $extensions = $db->setQuery($query)->loadColumn(); $options = []; foreach ($extensions as $extension) { ActionlogsHelper::loadTranslationFiles($extension); $extensionName = Text::_($extension); $options[ApplicationHelper::stringURLSafe($extensionName) . '_' . $extension] = HTMLHelper::_('select.option', $extension, $extensionName); } ksort($options); return array_merge(parent::getOptions(), array_values($options)); } } PK � �\�]'�V V src/Field/ExtensionField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Form\Field\ListField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\Component\Actionlogs\Administrator\Helper\ActionlogsHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Field to load a list of all extensions that have logged actions * * @since 3.9.0 */ class ExtensionField extends ListField { /** * The form field type. * * @var string * @since 3.9.0 */ protected $type = 'extension'; /** * Method to get the options to populate list * * @return array The field option objects. * * @since 3.9.0 */ public function getOptions() { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select('DISTINCT ' . $db->quoteName('extension')) ->from($db->quoteName('#__action_logs')) ->order($db->quoteName('extension')); $db->setQuery($query); $context = $db->loadColumn(); $options = []; if (\count($context) > 0) { foreach ($context as $item) { $extensions[] = strtok($item, '.'); } $extensions = array_unique($extensions); foreach ($extensions as $extension) { ActionlogsHelper::loadTranslationFiles($extension); $options[] = HTMLHelper::_('select.option', $extension, Text::_($extension)); } } return array_merge(parent::getOptions(), $options); } } PK � �\�Bi�� � src/Field/LogsdaterangeField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Factory; use Joomla\CMS\Form\Field\PredefinedlistField; use Joomla\CMS\Form\Form; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Field to show a list of range dates to sort with * * @since 3.9.0 */ class LogsdaterangeField extends PredefinedlistField { /** * The form field type. * * @var string * @since 3.9.0 */ protected $type = 'logsdaterange'; /** * Available options * * @var array * @since 3.9.0 */ protected $predefinedOptions = [ 'today' => 'COM_ACTIONLOGS_OPTION_RANGE_TODAY', 'past_week' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_WEEK', 'past_1month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_1MONTH', 'past_3month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_3MONTH', 'past_6month' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_6MONTH', 'past_year' => 'COM_ACTIONLOGS_OPTION_RANGE_PAST_YEAR', ]; /** * Method to instantiate the form field object. * * @param Form $form The form to attach to the form field object. * * @since 3.9.0 */ public function __construct($form = null) { parent::__construct($form); // Load the required language $lang = Factory::getLanguage(); $lang->load('com_actionlogs', JPATH_ADMINISTRATOR); } } PK � �\��$� � src/Field/UserlogtypeField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2022 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Application\ApplicationHelper; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Factory; use Joomla\CMS\Form\Field\ListField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\Component\Actionlogs\Administrator\Helper\ActionlogsHelper; use Joomla\Database\ParameterType; /** * Field to load a list of all users that have logged actions * * @since 5.1.0 */ class UserlogtypeField extends ListField { /** * The form field type. * * @var string * @since 5.1.0 */ protected $type = 'UserLogType'; /** * Method to get the field options. * * @return array The field option objects. * * @since 5.1.0 */ public function getOptions() { $db = $this->getDatabase(); $user = Factory::getApplication()->getIdentity(); $query = $db->getQuery(true) ->select($db->quoteName('extensions')) ->from($db->quoteName('#__action_logs_users')) ->where($db->quoteName('user_id') . ' = :userid') ->bind(':userid', $user->id, ParameterType::INTEGER); $extensions = $db->setQuery($query)->loadColumn(); $userExt = []; $params = ComponentHelper::getParams('com_actionlogs'); $globalExt = $params->get('loggable_extensions', []); if (!empty($extensions)) { $userExt = substr($extensions[0], 2); $userExt = substr($userExt, 0, -2); $userExt = explode('","', $userExt); } $common = array_merge($globalExt, array_intersect($globalExt, $userExt)); $options = []; foreach ($common as $extension) { ActionlogsHelper::loadTranslationFiles($extension); $extensionName = Text::_($extension); $options[ApplicationHelper::stringURLSafe($extensionName) . '_' . $extension] = HTMLHelper::_('select.option', $extension, $extensionName); } ksort($options); return array_merge(parent::getOptions(), array_values($options)); } } PK � �\�N� � src/Field/LogcreatorField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Form\Field\ListField; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Field to load a list of all users that have logged actions * * @since 3.9.0 * * @deprecated 5.3 will be removed in 7.0 without replacement */ class LogcreatorField extends ListField { /** * Cached array of the category items. * * @var array * @since 3.9.0 */ protected static $options = []; /** * The form field type. * * @var string * @since 3.9.0 */ protected $type = 'LogCreator'; /** * Method to get the options to populate list * * @return array The field option objects. * * @since 3.9.0 */ protected function getOptions() { // Accepted modifiers $hash = md5($this->element); if (!isset(static::$options[$hash])) { static::$options[$hash] = parent::getOptions(); $db = $this->getDatabase(); // Construct the query $query = $db->getQuery(true) ->select($db->quoteName('u.id', 'value')) ->select($db->quoteName('u.username', 'text')) ->from($db->quoteName('#__users', 'u')) ->join('INNER', $db->quoteName('#__action_logs', 'c') . ' ON ' . $db->quoteName('c.user_id') . ' = ' . $db->quoteName('u.id')) ->group($db->quoteName('u.id')) ->group($db->quoteName('u.username')) ->order($db->quoteName('u.username')); // Setup the query $db->setQuery($query); // Return the result if ($options = $db->loadObjectList()) { static::$options[$hash] = array_merge(static::$options[$hash], $options); } } return static::$options[$hash]; } } PK � �\ޡ�� � src/Field/PlugininfoField.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Field; use Joomla\CMS\Form\FormField; use Joomla\CMS\HTML\HTMLHelper; use Joomla\CMS\Language\Text; use Joomla\CMS\Router\Route; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Information field. * * @since 3.9.2 */ class PlugininfoField extends FormField { /** * The form field type. * * @var string * @since 3.9.2 */ protected $type = 'PluginInfo'; /** * Method to get the field input markup. * * @return string The field input markup. * * @since 3.9.2 */ protected function getInput() { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select($db->quoteName('extension_id')) ->from($db->quoteName('#__extensions')) ->where($db->quoteName('folder') . ' = ' . $db->quote('actionlog')) ->where($db->quoteName('element') . ' = ' . $db->quote('joomla')); $db->setQuery($query); $result = (int) $db->loadResult(); $link = HTMLHelper::_( 'link', Route::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $result), Text::_('PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED'), ['class' => 'alert-link'] ); return '<div class="alert alert-info">' . '<span class="icon-info-circle" aria-hidden="true"></span><span class="visually-hidden">' . Text::_('INFO') . '</span>' . Text::sprintf('PLG_SYSTEM_ACTIONLOGS_JOOMLA_ACTIONLOG_DISABLED_REDIRECT', $link) . '</div>'; } } PK � �\�Sʉ� � src/Field/.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 � �\H��(j. j. src/Model/ActionlogsModel.phpnu �[��� <?php /** * @package Joomla.Administrator * @subpackage com_actionlogs * * @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org> * @license GNU General Public License version 2 or later; see LICENSE.txt */ namespace Joomla\Component\Actionlogs\Administrator\Model; use Joomla\CMS\Component\ComponentHelper; use Joomla\CMS\Date\Date; use Joomla\CMS\Event\ActionLog\AfterLogPurgeEvent; use Joomla\CMS\Factory; use Joomla\CMS\Form\Form; use Joomla\CMS\Language\Text; use Joomla\CMS\MVC\Factory\MVCFactoryInterface; use Joomla\CMS\MVC\Model\ListModel; use Joomla\Database\DatabaseIterator; use Joomla\Database\ParameterType; use Joomla\Database\QueryInterface; use Joomla\Utilities\ArrayHelper; // phpcs:disable PSR1.Files.SideEffects \defined('_JEXEC') or die; // phpcs:enable PSR1.Files.SideEffects /** * Methods supporting a list of article records. * * @since 3.9.0 */ class ActionlogsModel extends ListModel { /** * Constructor. * * @param array $config An optional associative array of configuration settings. * @param ?MVCFactoryInterface $factory The factory. * * @since 3.9.0 * * @throws \Exception */ public function __construct($config = [], ?MVCFactoryInterface $factory = null) { if (empty($config['filter_fields'])) { $config['filter_fields'] = [ 'a.id', 'id', 'a.extension', 'extension', 'a.user_id', 'user', 'a.message', 'message', 'a.log_date', 'log_date', 'a.ip_address', 'ip_address', 'dateRange', ]; } parent::__construct($config, $factory); } /** * Method to auto-populate the model state. * * @param string $ordering An optional ordering field. * @param string $direction An optional direction (asc|desc). * * @return void * * @since 3.9.0 * * @throws \Exception */ protected function populateState($ordering = 'a.id', $direction = 'desc') { parent::populateState($ordering, $direction); } /** * Build an SQL query to load the list data. * * @return QueryInterface * * @since 3.9.0 * * @throws \Exception */ protected function getListQuery() { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select('a.*') ->select($db->quoteName('u.name')) ->from($db->quoteName('#__action_logs', 'a')) ->join('LEFT', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('a.user_id') . ' = ' . $db->quoteName('u.id')); // Get ordering $fullorderCol = $this->state->get('list.fullordering', 'a.id DESC'); // Apply ordering if (!empty($fullorderCol)) { $query->order($db->escape($fullorderCol)); } // Get filter by user $user = $this->getState('filter.user'); // Apply filter by user if (!empty($user)) { $user = (int) $user; $query->where($db->quoteName('a.user_id') . ' = :userid') ->bind(':userid', $user, ParameterType::INTEGER); } // Get filter by extension $extension = $this->getState('filter.extension'); // Apply filter by extension if (!empty($extension)) { $extension .= '%'; $query->where($db->quoteName('a.extension') . ' LIKE :extension') ->bind(':extension', $extension); } // Get filter by date range $dateRange = $this->getState('filter.dateRange'); // Apply filter by date range if (!empty($dateRange)) { $date = $this->buildDateRange($dateRange); // If the chosen range is not more than a year ago if ($date['dNow'] !== false && $date['dStart'] !== false) { $dStart = $date['dStart']->format('Y-m-d H:i:s'); $dNow = $date['dNow']->format('Y-m-d H:i:s'); $query->where( $db->quoteName('a.log_date') . ' BETWEEN :dstart AND :dnow' ); $query->bind(':dstart', $dStart); $query->bind(':dnow', $dNow); } } // Filter the items over the search string if set. $search = $this->getState('filter.search'); if (!empty($search)) { if (stripos($search, 'id:') === 0) { $ids = (int) substr($search, 3); $query->where($db->quoteName('a.id') . ' = :id') ->bind(':id', $ids, ParameterType::INTEGER); } elseif (stripos($search, 'item_id:') === 0) { $ids = (int) substr($search, 8); $query->where($db->quoteName('a.item_id') . ' = :itemid') ->bind(':itemid', $ids, ParameterType::INTEGER); } else { $search = '%' . $search . '%'; $query->where($db->quoteName('a.message') . ' LIKE :message') ->bind(':message', $search); } } return $query; } /** * Construct the date range to filter on. * * @param string $range The textual range to construct the filter for. * * @return array The date range to filter on. * * @since 3.9.0 * * @throws \Exception */ private function buildDateRange($range) { // Get UTC for now. $dNow = new Date(); $dStart = clone $dNow; switch ($range) { case 'past_week': $dStart->modify('-7 day'); break; case 'past_1month': $dStart->modify('-1 month'); break; case 'past_3month': $dStart->modify('-3 month'); break; case 'past_6month': $dStart->modify('-6 month'); break; case 'past_year': $dStart->modify('-1 year'); break; case 'today': // Ranges that need to align with local 'days' need special treatment. $offset = Factory::getApplication()->get('offset'); // Reset the start time to be the beginning of today, local time. $dStart = new Date('now', $offset); $dStart->setTime(0, 0, 0); // Now change the timezone back to UTC. $tz = new \DateTimeZone('GMT'); $dStart->setTimezone($tz); break; } return ['dNow' => $dNow, 'dStart' => $dStart]; } /** * Get all log entries for an item * * @param string $extension The extension the item belongs to * @param integer $itemId The item ID * * @return array * * @since 3.9.0 */ public function getLogsForItem($extension, $itemId) { $itemId = (int) $itemId; $db = $this->getDatabase(); $query = $db->getQuery(true) ->select('a.*') ->select($db->quoteName('u.name')) ->from($db->quoteName('#__action_logs', 'a')) ->join('INNER', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('a.user_id') . ' = ' . $db->quoteName('u.id')) ->where($db->quoteName('a.extension') . ' = :extension') ->where($db->quoteName('a.item_id') . ' = :itemid') ->bind(':extension', $extension) ->bind(':itemid', $itemId, ParameterType::INTEGER); // Get ordering $fullorderCol = $this->getState('list.fullordering', 'a.id DESC'); // Apply ordering if (!empty($fullorderCol)) { $query->order($db->escape($fullorderCol)); } $db->setQuery($query); return $db->loadObjectList(); } /** * Get logs data into Table object * * @param integer[]|null $pks An optional array of log record IDs to load * * @return array All logs in the table * * @since 3.9.0 */ public function getLogsData($pks = null) { $db = $this->getDatabase(); $query = $this->getLogDataQuery($pks); $db->setQuery($query); return $db->loadObjectList(); } /** * Get logs data as a database iterator * * @param integer[]|null $pks An optional array of log record IDs to load * * @return DatabaseIterator * * @since 3.9.0 */ public function getLogDataAsIterator($pks = null) { $db = $this->getDatabase(); $query = $this->getLogDataQuery($pks); $db->setQuery($query); return $db->getIterator(); } /** * Get the query for loading logs data * * @param integer[]|null $pks An optional array of log record IDs to load * * @return QueryInterface * * @since 3.9.0 */ private function getLogDataQuery($pks = null) { $db = $this->getDatabase(); $query = $db->getQuery(true) ->select('a.*') ->select($db->quoteName('u.name')) ->from($db->quoteName('#__action_logs', 'a')) ->join('INNER', $db->quoteName('#__users', 'u') . ' ON ' . $db->quoteName('a.user_id') . ' = ' . $db->quoteName('u.id')); if (\is_array($pks) && \count($pks) > 0) { $pks = ArrayHelper::toInteger($pks); $query->whereIn($db->quoteName('a.id'), $pks); } return $query; } /** * Delete logs * * @param array $pks Primary keys of logs * * @return boolean * * @since 3.9.0 */ public function delete(&$pks) { $keys = ArrayHelper::toInteger($pks); $db = $this->getDatabase(); $query = $db->getQuery(true) ->delete($db->quoteName('#__action_logs')) ->whereIn($db->quoteName('id'), $keys); $db->setQuery($query); try { $db->execute(); } catch (\RuntimeException $e) { $this->setError($e->getMessage()); return false; } $this->getDispatcher()->dispatch('onAfterLogPurge', new AfterLogPurgeEvent('onAfterLogPurge')); return true; } /** * Removes all of logs from the table. * * @return boolean result of operation * * @since 3.9.0 */ public function purge() { try { $this->getDatabase()->truncateTable('#__action_logs'); } catch (\Exception) { return false; } $this->getDispatcher()->dispatch('onAfterLogPurge', new AfterLogPurgeEvent('onAfterLogPurge')); return true; } /** * Get the filter form * * @param array $data data * @param boolean $loadData load current data * * @return Form|boolean The Form object or false on error * * @since 3.9.0 */ public function getFilterForm($data = [], $loadData = true) { $form = parent::getFilterForm($data, $loadData); $params = ComponentHelper::getParams('com_actionlogs'); $ipLogging = (bool) $params->get('ip_logging', 0); // Add ip sort options to sort dropdown if ($form && $ipLogging) { /* @var \Joomla\CMS\Form\Field\ListField $field */ $field = $form->getField('fullordering', 'list'); $field->addOption(Text::_('COM_ACTIONLOGS_IP_ADDRESS_ASC'), ['value' => 'a.ip_address ASC']); $field->addOption(Text::_('COM_ACTIONLOGS_IP_ADDRESS_DESC'), ['value' => 'a.ip_address DESC']); } return $form; } } PK � �\\��" "