| Current Path : /proc/self/root/tmp/ |
| Current File : //proc/self/root/tmp/phpUx1HJF |
<?php
/**
* @package akeebabackup
* @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
defined('_JEXEC') || die;
// Old PHP version detected. EJECT! EJECT! EJECT!
if (!version_compare(PHP_VERSION, '7.2.0', '>='))
{
return;
}
// Make sure Akeeba Backup is installed
if (!file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba'))
{
return;
}
use Akeeba\Backup\Admin\Model\Statistics;
use Akeeba\Engine\Factory;
use Akeeba\Engine\Platform;
use FOF40\Container\Container;
use FOF40\Date\Date;
use FOF40\JoomlaAbstraction\CacheCleaner;
use Joomla\CMS\Component\ComponentHelper;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
use Joomla\CMS\Uri\Uri;
// Deactivate self
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__extensions'))
->set($db->qn('enabled') . ' = ' . $db->q('0'))
->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
$db->setQuery($query);
$db->execute();
// Load FOF if not already loaded
if (!defined('FOF40_INCLUDED') && !@include_once(JPATH_LIBRARIES . '/fof40/include.php'))
{
return;
}
CacheCleaner::clearPluginsCache();
// Timezone fix; avoids errors printed out by PHP 5.3.3+ (thanks Yannick!)
if (function_exists('date_default_timezone_get') && function_exists('date_default_timezone_set'))
{
if (function_exists('error_reporting'))
{
$oldLevel = error_reporting(0);
}
$serverTimezone = @date_default_timezone_get();
if (empty($serverTimezone) || !is_string($serverTimezone))
{
$serverTimezone = 'UTC';
}
if (function_exists('error_reporting'))
{
error_reporting($oldLevel);
}
@date_default_timezone_set($serverTimezone);
}
/*
* Hopefully, if we are still here, the site is running on at least PHP5. This means that
* including the Akeeba Backup factory class will not throw a White Screen of Death, locking
* the administrator out of the back-end.
*/
// Make sure Akeeba Backup is installed, or quit
$akeeba_installed = @file_exists(JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php');
if (!$akeeba_installed)
{
return;
}
// Make sure Akeeba Backup is enabled
if (!ComponentHelper::isEnabled('com_akeeba'))
{
return;
}
// Joomla! 1.6 or later - check ACLs (and not display when the site is bricked,
// hopefully resulting in no stupid emails from users who think that somehow
// Akeeba Backup crashed their site). It also not displays the button to people
// who are not authorised to take backups - which makes perfect sense!
$continueLoadingIcon = true;
$user = JFactory::getUser();
if (!$user->authorise('akeeba.backup', 'com_akeeba'))
{
$continueLoadingIcon = false;
}
// Do we really, REALLY have Akeeba Engine?
if ($continueLoadingIcon)
{
if (!defined('AKEEBAENGINE'))
{
define('AKEEBAENGINE', 1); // Required for accessing Akeeba Engine's factory class
}
try
{
@include_once JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupEngine/Factory.php';
if (!class_exists('\Akeeba\Engine\Factory', false))
{
$continueLoadingIcon = false;
}
}
catch (Exception $e)
{
$continueLoadingIcon = false;
}
}
// Enable self if we have to bail out
if (!$continueLoadingIcon)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__extensions'))
->set($db->qn('enabled') . ' = ' . $db->q('1'))
->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
$db->setQuery($query);
$db->execute();
CacheCleaner::clearPluginsCache();
return;
}
unset($continueLoadingIcon);
/**
* Akeeba Backup Notification plugin
*/
class plgQuickiconAkeebabackup extends CMSPlugin
{
/**
* Constructor
*
* @param object $subject The object to observe
* @param array $config An array that holds the plugin configuration
*
* @since 2.5
*/
public function __construct(&$subject, $config)
{
/**
* I know that this piece of code cannot possibly be executed since I have already returned BEFORE declaring
* the class when eAccelerator is detected. However, eAccelerator is being dumb. It will return above BUT it
* will also declare the class EVEN THOUGH according to how PHP works this part of the code should be
* unreachable o_O Therefore I have to define this constant and exit the constructor when we have already
* determined that this class MUST NOT be defined.
*/
if (defined('AKEEBA_EACCELERATOR_IS_SO_BORKED_IT_DOES_NOT_EVEN_RETURN'))
{
return;
}
parent::__construct($subject, $config);
$this->loadLanguage();
}
/**
* This method is called when the Quick Icons module is constructing its set
* of icons. You can return an array which defines a single icon and it will
* be rendered right after the stock Quick Icons.
*
* @param string $context The calling context
*
* @return array|null A list of icon definition associative arrays, consisting of the
* keys link, image, text and access.
*
* @throws Exception
*/
public function onGetIcons($context)
{
$container = Container::getInstance('com_akeeba');
$user = $container->platform->getUser();
$j4WarningJavascript = false;
if (!$user->authorise('akeeba.backup', 'com_akeeba'))
{
return null;
}
/**
* The context in which quickicons appear. There's a reason this is hardcoded now.
*
* Joomla 3. This is always mod_quickicon. Grouping is defined by the 'group' key of the returned array. This is
* the sane way I personally wrote this feature when I contributed it to Joomla! 1.7. The whole point of the
* 'context' was that you could have **extension specific** quick icon plugins. Think about how JCE shows icons
* in its control panel. The incoming context determines which plugins to load, the returned group key
* determines how the icons are grouped in the context.
*
* Joomla 4. The context defines the quick icon grouping. The 'group' key of the returned array is ignored. All
* quick icon plugins which respond to the 'mod_quickicon' context are shown in the "Third party" backend
* module. This is a nonsensical change.
*
* Unfortunately, this means that I have to remove the user-defined context option. The reason is that Joomla
* renders plugin options based on a static XML file which is common for J3 and J4. However, the context has a
* different meaning and requires a different setting for J3 and J4. I have to take the flexibility away from
* the user and force a default context in J4 which puts our icon in Update Checks.
*
* Yes, I know that the Update Checks module is, at the very least, mislabeled. There are of course the updates
* to Joomla and extensions but also privacy requests and overrides, the latter two not being updates in any
* conceivable form and in any possible universe. Since this backend module is supposed to have everything I am
* going to throw my backup check in there. At least my plugin shows "backup up-to-date" or "update needed"
* which actually makes it FAR MORE RELEVANT in an "updates" area on the page than the friggin' privacy
* requests!
*/
$configuredContext = version_compare(JVERSION, '3.999.999', 'gt') ? 'update_quickicon' : 'mod_quickicon';
/**/
if (
$context != $configuredContext
|| !JFactory::getUser()->authorise('core.manage', 'com_installer')
)
{
return null;
}
/**/
// Necessary defines for Akeeba Engine
if (!defined('AKEEBAENGINE'))
{
define('AKEEBAENGINE', 1);
define('AKEEBAROOT', $container->backEndPath . '/BackupEngine');
define('ALICEROOT', $container->backEndPath . '/AliceEngine');
// Make sure we have a profile set throughout the component's lifetime
$profile_id = $container->platform->getSessionVar('profile', null, 'akeeba');
if (is_null($profile_id))
{
$container->platform->setSessionVar('profile', 1, 'akeeba');
}
// Load Akeeba Engine
require_once $container->backEndPath . '/BackupEngine/Factory.php';
}
Platform::addPlatform('joomla3x', JPATH_ADMINISTRATOR . '/components/com_akeeba/BackupPlatform/Joomla3x');
$url = Uri::base();
$url = rtrim($url, '/');
$profileId = (int) $this->params->get('profileid', 1);
$token = $container->platform->getToken(true);
if ($profileId <= 0)
{
$profileId = 1;
}
$isJoomla4 = version_compare(JVERSION, '3.999.999', 'gt');
$ret = [
'link' => 'index.php?option=com_akeeba&view=Backup&autostart=1&returnurl=' . base64_encode($url) . '&profileid=' . $profileId . "&$token=1",
'image' => 'akeeba-black',
'text' => Text::_('PLG_QUICKICON_AKEEBABACKUP_OK'),
'id' => 'plg_quickicon_akeebabackup',
'group' => 'MOD_QUICKICON_MAINTENANCE',
];
if ($isJoomla4)
{
$ret['image'] = 'fa fa-akeeba-black';
}
if ($this->params->get('enablewarning', 0) == 0)
{
// Process warnings
$warning = false;
$aeconfig = Factory::getConfiguration();
Platform::getInstance()->load_configuration(1);
// Get latest non-SRP backup ID
$filters = [
[
'field' => 'tag',
'operand' => '<>',
'value' => 'restorepoint',
],
];
$ordering = [
'by' => 'backupstart',
'order' => 'DESC',
];
/** @var Statistics $model */
$model = $container->factory->model('Statistics')->tmpInstance();
$list = $model->getStatisticsListWithMeta(false, $filters, $ordering);
if (!empty($list))
{
$record = (object) array_shift($list);
}
else
{
$record = null;
}
// Process "failed backup" warnings, if specified
if ($this->params->get('warnfailed', 0) == 0)
{
if (!is_null($record))
{
$warning = (($record->status == 'fail') || ($record->status == 'run'));
}
}
// Process "stale backup" warnings, if specified
if (is_null($record))
{
$warning = true;
}
else
{
$maxperiod = $this->params->get('maxbackupperiod', 24);
$lastBackupRaw = $record->backupstart;
$lastBackupObject = new Date($lastBackupRaw);
$lastBackup = $lastBackupObject->toUnix();
$maxBackup = time() - $maxperiod * 3600;
if (!$warning)
{
$warning = ($lastBackup < $maxBackup);
}
}
if ($warning)
{
$ret['image'] = 'akeeba-red';
$ret['text'] = Text::_('PLG_QUICKICON_AKEEBABACKUP_BACKUPREQUIRED');
if ($isJoomla4)
{
/**
* Joomla! 4 is dumb. Quickicons cannot have a class. However, Joomla! itself uses a class on the icon
* container to tell users when the update status is OK or there are updates required. Therefore we will
* have to use some Javascript to achieve the same result. Grrrr...
*/
$j4WarningJavascript = true;
$ret['image'] = 'fa fa-akeeba-red';
}
else
{
$ret['text'] = '<span class="badge badge-important">' . $ret['text'] . '</span>';
}
}
}
$inlineCSS = <<< CSS
@font-face
{
font-family: "Akeeba Products for Quickicons";
font-style: normal;
font-weight: normal;
src: url("../media/com_akeeba/fonts/akeeba/Akeeba-Products.woff") format("woff");
}
[class*=fa-akeeba-]:before
{
display: inline-block;
font-family: 'Akeeba Products for Quickicons';
font-style: normal;
font-weight: normal;
line-height: 1;
-webkit-font-smoothing: antialiased;
position: relative;
-moz-osx-font-smoothing: grayscale;
}
span.fa-akeeba-black:before,
div.fa-akeeba-black:before
{
color: var(--success);
background: transparent;
}
span.fa-akeeba-red:before,
div.fa-akeeba-red:before
{
color: var(--danger);
background: transparent;
}
span[class*=fa-akeeba]:before,
div[class*=fa-akeeba]:before
{
content: 'B';
}
.icon-akeeba-black {
background-image: url("../media/com_akeeba/icons/akeebabackup-16-black.png");
width: 16px;
height: 16px;
}
.icon-akeeba-red {
background-image: url("../media/com_akeeba/icons/akeebabackup-16-red.png");
width: 16px;
height: 16px;
}
.quick-icons .nav-list [class^="icon-akeeba-"], .quick-icons .nav-list [class*=" icon-akeeba-"] {
margin-right: 7px;
}
.quick-icons .nav-list [class^="icon-akeeba-red"], .quick-icons .nav-list [class*=" icon-akeeba-red"] {
margin-bottom: -4px;
}
CSS;
JFactory::getApplication()->getDocument()->addStyleDeclaration($inlineCSS);
if ($isJoomla4)
{
$myClass = $j4WarningJavascript ? 'danger' : 'success';
$inlineJS = <<< JS
// ; Defense against third party broken Javascript
document.addEventListener('DOMContentLoaded', function() {
document.getElementById('plg_quickicon_akeebabackup').className = 'pulse $myClass';
});
JS;
JFactory::getApplication()->getDocument()->addScriptDeclaration($inlineJS);
}
// Re-enable self
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->qn('#__extensions'))
->set($db->qn('enabled') . ' = ' . $db->q('1'))
->where($db->qn('element') . ' = ' . $db->q('akeebabackup'))
->where($db->qn('folder') . ' = ' . $db->q('quickicon'));
$db->setQuery($query);
$db->execute();
CacheCleaner::clearPluginsCache();
return [$ret];
}
}
<?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="2.5" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_akeebabackup</name>
<author>Nicholas K. Dionysopoulos</author>
<authorEmail>nicholas@akeeba.com</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_QUICKICON_AKEEBABACKUP_XML_DESCRIPTION</description>
<files>
<filename plugin="akeebabackup">akeebabackup.php</filename>
<filename>index.html</filename>
<filename>.htaccess</filename>
<filename>web.config</filename>
</files>
<languages folder="language">
<language tag="en-GB">en-GB/en-GB.plg_quickicon_akeebabackup.ini</language>
<language tag="en-GB">en-GB/en-GB.plg_quickicon_akeebabackup.sys.ini</language>
</languages>
<config addfieldpath="/administrator/components/com_akeeba/fields">
<fields name="params">
<fieldset name="basic">
<field name="enablewarning"
type="fancyradio"
label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNINGS"
description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNINGS"
default="1"
class="btn-group btn-group-yesno"
>
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="warnfailed"
type="fancyradio"
label="PLG_QUICKICON_AKEEBABACKUP_LBL_WARNFAILED"
description="PLG_QUICKICON_AKEEBABACKUP_DESC_WARNFAILED"
default="1"
class="btn-group btn-group-yesno"
showon="enablewarning:1"
>
<option value="0">JNO</option>
<option value="1">JYES</option>
</field>
<field name="maxbackupperiod"
type="number"
label="PLG_QUICKICON_AKEEBABACKUP_LBL_PERIOD"
description="PLG_QUICKICON_AKEEBABACKUP_DESC_PERIOD"
min="1"
max="87600"
step="1"
default="24"/>
<field name="profileid"
type="backupprofiles"
default="1"
label="PLG_QUICKICON_AKEEBABACKUP_PROFILE_LABEL"
class="advancedSelect"
description="PLG_QUICKICON_AKEEBABACKUP_PROFILE_DESC"
/>
</fieldset>
</fields>
</config>
<scriptfile>script.php</scriptfile>
</extension><!--~
~ @package akeebabackup
~ @copyright Copyright (c)2006-2023 Nicholas K. Dionysopoulos / Akeeba Ltd
~ @license GNU General Public License version 3, or later
-->
<html><head><title></title></head><body></body></html><?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 plgQuickiconAkeebabackupInstallerScript 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
/**
* @package Joomla.Plugin
* @subpackage Quickicon.eos310
*
* @copyright (C) 2021 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\HTML\HTMLHelper;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Plugin\CMSPlugin;
/**
* Joomla! end of support notification plugin
*
* @since 3.10.0
*/
class PlgQuickiconEos310 extends CMSPlugin
{
/**
* The EOS date for 3.10
*
* @var string
* @since 3.10.0
*/
const EOS_DATE = '2023-08-17';
/**
* Application object
*
* @var CMSApplication
* @since 3.10.0
*/
protected $app;
/**
* Database object
*
* @var DatabaseDriver
* @since 3.10.0
*/
protected $db;
/**
* Load the language file on instantiation.
*
* @var boolean
* @since 3.10.0
*/
protected $autoloadLanguage = true;
/**
* Holding the current valid message to be shown
*
* @var boolean
* @since 3.10.0
*/
private $currentMessage = false;
/**
* Constructor.
*
* @param object &$subject The object to observe.
* @param array $config An optional associative array of configuration settings.
*
* @since 3.10.0
*/
public function __construct(&$subject, $config)
{
parent::__construct($subject, $config);
$diff = Factory::getDate()->diff(Factory::getDate(static::EOS_DATE));
$monthsUntilEOS = floor($diff->days / 30.417);
$this->currentMessage = $this->getMessageInfo($monthsUntilEOS, $diff->invert);
}
/**
* Check and show the the alert and quickicon message
*
* @param string $context The calling context
*
* @return array|void A list of icon definition associative arrays, consisting of the
* keys link, image, text and access, or void.
*
* @since 3.10.0
*/
public function onGetIcons($context)
{
if (!$this->shouldDisplayMessage())
{
return;
}
// No messages yet
if (!$this->currentMessage)
{
return;
}
// Show this only when not snoozed
if ($this->params->get('last_snoozed_id', 0) < $this->currentMessage['id'])
{
// Load the snooze scripts.
HTMLHelper::_('jquery.framework');
HTMLHelper::_('script', 'plg_quickicon_eos310/snooze.js', array('version' => 'auto', 'relative' => true));
// Build the message to be displayed in the cpanel
$messageText = Text::sprintf(
$this->currentMessage['messageText'],
HTMLHelper::_('date', static::EOS_DATE, Text::_('DATE_FORMAT_LC3')),
$this->currentMessage['messageLink']
);
if ($this->currentMessage['snoozable'])
{
$messageText .=
'<p><button class="btn btn-warning eosnotify-snooze-btn" type="button">' .
Text::_('PLG_QUICKICON_EOS310_SNOOZE_BUTTON') .
'</button></p>';
}
$this->app->enqueueMessage(
$messageText,
$this->currentMessage['messageType']
);
}
// The message as quickicon
$messageTextQuickIcon = Text::sprintf(
$this->currentMessage['quickiconText'],
HTMLHelper::_(
'date',
static::EOS_DATE,
Text::_('DATE_FORMAT_LC3')
)
);
// The message as quickicon
return array(array(
'link' => $this->currentMessage['messageLink'],
'target' => '_blank',
'rel' => 'noopener noreferrer',
'image' => $this->currentMessage['image'],
'text' => $messageTextQuickIcon,
'id' => 'plg_quickicon_eos310',
'group' => $this->currentMessage['groupText'],
));
}
/**
* User hit the snooze button
*
* @return void
*
* @since 3.10.0
*
* @throws JAccessExceptionNotallowed If user is not allowed.
*/
public function onAjaxSnoozeEOS()
{
// No messages yet so nothing to snooze
if (!$this->currentMessage)
{
return;
}
if (!$this->isAllowedUser() || !$this->isAjaxRequest())
{
throw new JAccessExceptionNotallowed(Text::_('JGLOBAL_AUTH_ACCESS_DENIED'), 403);
}
// Make sure only snoozable messages can be snoozed
if ($this->currentMessage['snoozable'])
{
$this->params->set('last_snoozed_id', $this->currentMessage['id']);
$this->saveParams();
}
}
/**
* Return the texts to be displayed based on the time until we reach EOS
*
* @param integer $monthsUntilEOS The months until we reach EOS
* @param integer $inverted Have we surpassed the EOS date
*
* @return array|bool An array with the message to be displayed or false
*
* @since 3.10.0
*/
private function getMessageInfo($monthsUntilEOS, $inverted)
{
// The EOS date has passed - Support has ended
if ($inverted === 1)
{
return array(
'id' => 5,
'messageText' => 'PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED',
'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_ERROR_SUPPORT_ENDED_SHORT',
'messageType' => 'error',
'image' => 'minus-circle',
'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
'groupText' => 'PLG_QUICKICON_EOS310_GROUPNAME_EOS',
'snoozable' => false,
);
}
// The security support is ending in 6 months
if ($monthsUntilEOS < 6)
{
return array(
'id' => 4,
'messageText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING',
'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SUPPORT_ENDING_SHORT',
'messageType' => 'warning',
'image' => 'warning-circle',
'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
'groupText' => 'PLG_QUICKICON_EOS310_GROUPNAME_WARNING',
'snoozable' => true,
);
}
// We are in security only mode now, 12 month to go from now on
if ($monthsUntilEOS < 12)
{
return array(
'id' => 3,
'messageText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY',
'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_WARNING_SECURITY_ONLY_SHORT',
'messageType' => 'warning',
'image' => 'warning-circle',
'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Planning_for_Mini-Migration_-_Joomla_3.10.x_to_4.x',
'groupText' => 'PLG_QUICKICON_EOS310_GROUPNAME_WARNING',
'snoozable' => true,
);
}
// We still have 16 month to go, lets remind our users about the pre upgrade checker
if ($monthsUntilEOS < 16)
{
return array(
'id' => 2,
'messageText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_02',
'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_02_SHORT',
'messageType' => 'info',
'image' => 'info-circle',
'messageLink' => 'https://docs.joomla.org/Special:MyLanguage/Pre-Update_Check',
'groupText' => 'PLG_QUICKICON_EOS310_GROUPNAME_INFO',
'snoozable' => true,
);
}
// Lets start our messages 2 month after the initial release, still 22 month to go
if ($monthsUntilEOS < 22)
{
return array(
'id' => 1,
'messageText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_01',
'quickiconText' => 'PLG_QUICKICON_EOS310_MESSAGE_INFO_01_SHORT',
'messageType' => 'info',
'image' => 'info-circle',
'messageLink' => 'https://www.joomla.org/4/#features',
'groupText' => 'PLG_QUICKICON_EOS310_GROUPNAME_INFO',
'snoozable' => true,
);
}
return false;
}
/**
* Determines if the message and quickicon should be displayed
*
* @return boolean
*
* @since 3.10.0
*/
private function shouldDisplayMessage()
{
// Only on admin app
if (!$this->app->isClient('administrator'))
{
return false;
}
// Only if authenticated
if (Factory::getUser()->guest)
{
return false;
}
// Only on HTML documents
if ($this->app->getDocument()->getType() !== 'html')
{
return false;
}
// Only on full page requests
if ($this->app->input->getCmd('tmpl', 'index') === 'component')
{
return false;
}
// Only to com_cpanel
if ($this->app->input->get('option') !== 'com_cpanel')
{
return false;
}
// Don't show anything in 4.0
if (version_compare(JVERSION, '4.0', '>='))
{
return false;
}
return true;
}
/**
* Check valid AJAX request
*
* @return boolean
*
* @since 3.10.0
*/
private function isAjaxRequest()
{
return strtolower($this->app->input->server->get('HTTP_X_REQUESTED_WITH', '')) === 'xmlhttprequest';
}
/**
* Check if current user is allowed to send the data
*
* @return boolean
*
* @since 3.10.0
*/
private function isAllowedUser()
{
return Factory::getUser()->authorise('core.login.admin');
}
/**
* Save the plugin parameters
*
* @return boolean
*
* @since 3.10.0
*/
private function saveParams()
{
$query = $this->db->getQuery(true)
->update($this->db->quoteName('#__extensions'))
->set($this->db->quoteName('params') . ' = ' . $this->db->quote($this->params->toString('JSON')))
->where($this->db->quoteName('type') . ' = ' . $this->db->quote('plugin'))
->where($this->db->quoteName('folder') . ' = ' . $this->db->quote('quickicon'))
->where($this->db->quoteName('element') . ' = ' . $this->db->quote('eos310'));
try
{
// Lock the tables to prevent multiple plugin executions causing a race condition
$this->db->lockTable('#__extensions');
}
catch (Exception $e)
{
// If we can't lock the tables it's too risky to continue execution
return false;
}
try
{
// Update the plugin parameters
$result = $this->db->setQuery($query)->execute();
$this->clearCacheGroups(array('com_plugins'), array(0, 1));
}
catch (Exception $exc)
{
// If we failed to execute
$this->db->unlockTables();
$result = false;
}
try
{
// Unlock the tables after writing
$this->db->unlockTables();
}
catch (Exception $e)
{
// If we can't lock the tables assume we have somehow failed
$result = false;
}
return $result;
}
/**
* Clears cache groups. We use it to clear the plugins cache after we update the last run timestamp.
*
* @param array $clearGroups The cache groups to clean
* @param array $cacheClients The cache clients (site, admin) to clean
*
* @return void
*
* @since 3.10.0
*/
private function clearCacheGroups(array $clearGroups, array $cacheClients = array(0, 1))
{
foreach ($clearGroups as $group)
{
foreach ($cacheClients as $client_id)
{
try
{
$options = array(
'defaultgroup' => $group,
'cachebase' => $client_id ? JPATH_ADMINISTRATOR . '/cache' : $this->app->get('cache_path', JPATH_SITE . '/cache')
);
$cache = JCache::getInstance('callback', $options);
$cache->clean();
}
catch (Exception $e)
{
// Ignore it
}
}
}
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.10" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_eos310</name>
<author>Joomla! Project</author>
<creationDate>June 2021</creationDate>
<copyright>(C) 2021 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.10.0</version>
<description>PLG_QUICKICON_EOS310_XML_DESCRIPTION</description>
<files>
<filename plugin="eos310">eos310.php</filename>
</files>
<languages>
<language tag="en-GB">en-GB.plg_quickicon_eos310.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_eos310.sys.ini</language>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
<field
name="last_snoozed_id"
type="hidden"
/>
</fieldset>
</fields>
</config>
</extension>
<?php
/**
* @package Joomla.Plugin
* @subpackage Quickicon.Extensionupdate
*
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
/**
* Joomla! update notification plugin
*
* @since 2.5
*/
class PlgQuickiconExtensionupdate extends JPlugin
{
/**
* Load the language file on instantiation.
*
* @var boolean
* @since 3.1
*/
protected $autoloadLanguage = true;
/**
* Returns an icon definition for an icon which looks for extensions updates
* via AJAX and displays a notification when such updates are found.
*
* @param string $context The calling context
*
* @return array A list of icon definition associative arrays, consisting of the
* keys link, image, text and access.
*
* @since 2.5
*/
public function onGetIcons($context)
{
if ($context !== $this->params->get('context', 'mod_quickicon') || !JFactory::getUser()->authorise('core.manage', 'com_installer'))
{
return;
}
JHtml::_('jquery.framework');
$token = JSession::getFormToken() . '=' . 1;
$url = JUri::base() . 'index.php?option=com_installer&view=update&task=update.find&' . $token;
$ajax_url = JUri::base() . 'index.php?option=com_installer&view=update&task=update.ajax&' . $token;
$script = array();
$script[] = 'var plg_quickicon_extensionupdate_url = \'' . $url . '\';';
$script[] = 'var plg_quickicon_extensionupdate_ajax_url = \'' . $ajax_url . '\';';
$script[] = 'var plg_quickicon_extensionupdate_text = {'
. '"UPTODATE" : "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPTODATE', true) . '",'
. '"UPDATEFOUND": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND', true) . '",'
. '"UPDATEFOUND_MESSAGE": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_MESSAGE', true) . '",'
. '"UPDATEFOUND_BUTTON": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_UPDATEFOUND_BUTTON', true) . '",'
. '"ERROR": "' . JText::_('PLG_QUICKICON_EXTENSIONUPDATE_ERROR', true) . '",'
. '};';
JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
JHtml::_('script', 'plg_quickicon_extensionupdate/extensionupdatecheck.js', array('version' => 'auto', 'relative' => true));
return array(
array(
'link' => 'index.php?option=com_installer&view=update&task=update.find&' . $token,
'image' => 'asterisk',
'icon' => 'header/icon-48-extension.png',
'text' => JText::_('PLG_QUICKICON_EXTENSIONUPDATE_CHECKING'),
'id' => 'plg_quickicon_extensionupdate',
'group' => 'MOD_QUICKICON_MAINTENANCE'
)
);
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_extensionupdate</name>
<author>Joomla! Project</author>
<creationDate>August 2011</creationDate>
<copyright>(C) 2011 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.0.0</version>
<description>PLG_QUICKICON_EXTENSIONUPDATE_XML_DESCRIPTION</description>
<files>
<filename plugin="extensionupdate">extensionupdate.php</filename>
</files>
<languages>
<language tag="en-GB">en-GB.plg_quickicon_extensionupdate.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_extensionupdate.sys.ini</language>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
<field
name="context"
type="text"
label="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_LABEL"
description="PLG_QUICKICON_EXTENSIONUPDATE_GROUP_DESC"
default="mod_quickicon"
/>
</fieldset>
</fields>
</config>
</extension>
<!DOCTYPE html><title></title>
<?php
/**
* @copyright Copyright (c) 2009-2021 Ryan Demmer. All rights reserved
* @license GNU/GPL 2 or later - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
* JCE is free software. This version may have been modified pursuant
* to the GNU General Public License, and as distributed it includes or
* is derivative of works licensed under the GNU General Public License or
* other free or open source software licenses
*/
defined('_JEXEC') or die;
/**
* JCE File Browser Quick Icon plugin.
*
* @since 2.1
*/
class plgQuickiconJce extends JPlugin
{
public function __construct(&$subject, $config)
{
parent::__construct($subject, $config);
$app = JFactory::getApplication();
// only in Admin and only if the component is enabled
if ($app->getClientId() !== 1 || JComponentHelper::getComponent('com_jce', true)->enabled === false) {
return;
}
$this->loadLanguage();
}
public function onGetIcons($context)
{
if ($context != $this->params->get('context', 'mod_quickicon')) {
return;
}
$user = JFactory::getUser();
if (!$user->authorise('jce.browser', 'com_jce')) {
return;
}
$language = JFactory::getLanguage();
$language->load('com_jce', JPATH_ADMINISTRATOR);
return array(array(
'link' => 'index.php?option=com_jce&view=browser',
'image' => 'picture fas fa-image',
'access' => array('jce.browser', 'com_jce'),
'text' => JText::_('PLG_QUICKICON_JCE_TITLE'),
'id' => 'plg_quickicon_jce',
));
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.8" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_jce</name>
<version>2.9.21</version>
<creationDate>30-03-2022</creationDate>
<author>Ryan Demmer</author>
<authorEmail>info@joomlacontenteditor.net</authorEmail>
<authorUrl>http://www.joomlacontenteditor.net</authorUrl>
<copyright>Copyright (C) 2006 - 2022 Ryan Demmer. All rights reserved</copyright>
<license>GNU/GPL Version 2 or later - http://www.gnu.org/licenses/gpl-2.0.html</license>
<description>PLG_QUICKICON_JCE_XML_DESCRIPTION</description>
<files folder="plugins/quickicon/jce">
<filename plugin="jce">jce.php</filename>
</files>
<languages folder="administrator/language/en-GB">
<language tag="en-GB">en-GB.plg_quickicon_jce.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_jce.sys.ini</language>
</languages>
</extension>
<!DOCTYPE html><title></title>
<?php
/**
* @package Joomla.Plugin
* @subpackage Quickicon.Joomlaupdate
*
* @copyright (C) 2011 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
/**
* Joomla! update notification plugin
*
* @since 2.5
*/
class PlgQuickiconJoomlaupdate extends JPlugin
{
/**
* Load the language file on instantiation.
*
* @var boolean
* @since 3.1
*/
protected $autoloadLanguage = true;
/**
* This method is called when the Quick Icons module is constructing its set
* of icons. You can return an array which defines a single icon and it will
* be rendered right after the stock Quick Icons.
*
* @param string $context The calling context
*
* @return array A list of icon definition associative arrays, consisting of the
* keys link, image, text and access.
*
* @since 2.5
*/
public function onGetIcons($context)
{
if ($context !== $this->params->get('context', 'mod_quickicon') || !JFactory::getUser()->authorise('core.manage', 'com_joomlaupdate'))
{
return;
}
JHtml::_('jquery.framework');
$currentTemplate = JFactory::getApplication()->getTemplate();
$url = JUri::base() . 'index.php?option=com_joomlaupdate';
$ajaxUrl = JUri::base() . 'index.php?option=com_joomlaupdate&task=update.ajax&' . JSession::getFormToken() . '=1';
$script = array();
$script[] = 'var plg_quickicon_joomlaupdate_url = \'' . $url . '\';';
$script[] = 'var plg_quickicon_joomlaupdate_ajax_url = \'' . $ajaxUrl . '\';';
$script[] = 'var plg_quickicon_jupdatecheck_jversion = \'' . JVERSION . '\'';
$script[] = 'var plg_quickicon_joomlaupdate_text = {'
. '"UPTODATE" : "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPTODATE', true) . '",'
. '"UPDATEFOUND": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND', true) . '",'
. '"UPDATEFOUND_MESSAGE": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_MESSAGE', true) . '",'
. '"UPDATEFOUND_BUTTON": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_UPDATEFOUND_BUTTON', true) . '",'
. '"ERROR": "' . JText::_('PLG_QUICKICON_JOOMLAUPDATE_ERROR', true) . '",'
. '};';
$script[] = 'var plg_quickicon_joomlaupdate_img = {'
. '"UPTODATE" : "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-jupdate-uptodate.png",'
. '"UPDATEFOUND": "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-jupdate-updatefound.png",'
. '"ERROR": "' . JUri::base(true) . '/templates/' . $currentTemplate . '/images/header/icon-48-deny.png",'
. '};';
JFactory::getDocument()->addScriptDeclaration(implode("\n", $script));
JHtml::_('script', 'plg_quickicon_joomlaupdate/jupdatecheck.js', array('version' => 'auto', 'relative' => true));
return array(
array(
'link' => 'index.php?option=com_joomlaupdate',
'image' => 'joomla',
'icon' => 'header/icon-48-download.png',
'text' => JText::_('PLG_QUICKICON_JOOMLAUPDATE_CHECKING'),
'id' => 'plg_quickicon_joomlaupdate',
'group' => 'MOD_QUICKICON_MAINTENANCE'
)
);
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.1" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_joomlaupdate</name>
<author>Joomla! Project</author>
<creationDate>August 2011</creationDate>
<copyright>(C) 2011 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.0.0</version>
<description>PLG_QUICKICON_JOOMLAUPDATE_XML_DESCRIPTION</description>
<files>
<filename plugin="joomlaupdate">joomlaupdate.php</filename>
</files>
<languages>
<language tag="en-GB">en-GB.plg_quickicon_joomlaupdate.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_joomlaupdate.sys.ini</language>
</languages>
<config>
<fields name="params">
<fieldset name="basic">
<field
name="context"
type="text"
label="PLG_QUICKICON_JOOMLAUPDATE_GROUP_LABEL"
description="PLG_QUICKICON_JOOMLAUPDATE_GROUP_DESC"
default="mod_quickicon"
/>
</fieldset>
</fields>
</config>
</extension>
<?php
/**
* @package Joomla.Plugin
* @subpackage Quickicon.phpversioncheck
*
* @copyright (C) 2016 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
/**
* Plugin to check the PHP version and display a warning about its support status
*
* @since 3.7.0
*/
class PlgQuickiconPhpVersionCheck extends JPlugin
{
/**
* Constant representing the active PHP version being fully supported
*
* @var integer
* @since 3.7.0
*/
const PHP_SUPPORTED = 0;
/**
* Constant representing the active PHP version receiving security support only
*
* @var integer
* @since 3.7.0
*/
const PHP_SECURITY_ONLY = 1;
/**
* Constant representing the active PHP version being unsupported
*
* @var integer
* @since 3.7.0
*/
const PHP_UNSUPPORTED = 2;
/**
* Application object.
*
* @var JApplicationCms
* @since 3.7.0
*/
protected $app;
/**
* Load plugin language files automatically
*
* @var boolean
* @since 3.7.0
*/
protected $autoloadLanguage = true;
/**
* Check the PHP version after the admin component has been dispatched.
*
* @param string $context The calling context
*
* @return void
*
* @since 3.7.0
*/
public function onGetIcons($context)
{
if (!$this->shouldDisplayMessage())
{
return;
}
$supportStatus = $this->getPhpSupport();
if ($supportStatus['status'] !== self::PHP_SUPPORTED)
{
// Enqueue the notification message; set a warning if receiving security support or "error" if unsupported
switch ($supportStatus['status'])
{
case self::PHP_SECURITY_ONLY:
$this->app->enqueueMessage($supportStatus['message'], 'warning');
break;
case self::PHP_UNSUPPORTED:
$this->app->enqueueMessage($supportStatus['message'], 'error');
break;
}
}
}
/**
* Gets PHP support status.
*
* @return array Array of PHP support data
*
* @since 3.7.0
* @note The dates used in this method should correspond to the dates given on PHP.net
* @link https://www.php.net/supported-versions.php
* @link https://www.php.net/eol.php
*/
private function getPhpSupport()
{
$phpSupportData = array(
'5.3' => array(
'security' => '2013-07-11',
'eos' => '2014-08-14',
),
'5.4' => array(
'security' => '2014-09-14',
'eos' => '2015-09-14',
),
'5.5' => array(
'security' => '2015-07-10',
'eos' => '2016-07-21',
),
'5.6' => array(
'security' => '2017-01-19',
'eos' => '2018-12-31',
),
'7.0' => array(
'security' => '2017-12-03',
'eos' => '2018-12-03',
),
'7.1' => array(
'security' => '2018-12-01',
'eos' => '2019-12-01',
),
'7.2' => array(
'security' => '2019-11-30',
'eos' => '2020-11-30',
),
'7.3' => array(
'security' => '2020-12-06',
'eos' => '2021-12-06',
),
'7.4' => array(
'security' => '2021-11-28',
'eos' => '2022-11-28',
),
'8.0' => array(
'security' => '2022-11-26',
'eos' => '2023-11-26',
),
'8.1' => array(
'security' => '2023-11-25',
'eos' => '2024-11-25',
),
);
// Fill our return array with default values
$supportStatus = array(
'status' => self::PHP_SUPPORTED,
'message' => null,
);
// Check the PHP version's support status using the minor version
$activePhpVersion = PHP_MAJOR_VERSION . '.' . PHP_MINOR_VERSION;
// Do we have the PHP version's data?
if (isset($phpSupportData[$activePhpVersion]))
{
// First check if the version has reached end of support
$today = new JDate;
$phpEndOfSupport = new JDate($phpSupportData[$activePhpVersion]['eos']);
if ($phpNotSupported = $today > $phpEndOfSupport)
{
/*
* Find the oldest PHP version still supported that is newer than the current version,
* this is our recommendation for users on unsupported platforms
*/
foreach ($phpSupportData as $version => $versionData)
{
$versionEndOfSupport = new JDate($versionData['eos']);
if (version_compare($version, $activePhpVersion, 'ge') && ($today < $versionEndOfSupport))
{
$supportStatus['status'] = self::PHP_UNSUPPORTED;
$supportStatus['message'] = JText::sprintf(
'PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED',
PHP_VERSION,
$version,
$versionEndOfSupport->format(JText::_('DATE_FORMAT_LC4'))
);
return $supportStatus;
}
}
// PHP version is not supported and we don't know of any supported versions.
$supportStatus['status'] = self::PHP_UNSUPPORTED;
$supportStatus['message'] = JText::sprintf('PLG_QUICKICON_PHPVERSIONCHECK_UNSUPPORTED_JOOMLA_OUTDATED', PHP_VERSION);
return $supportStatus;
}
// If the version is still supported, check if it has reached eol minus 3 month
$securityWarningDate = clone $phpEndOfSupport;
$securityWarningDate->sub(new DateInterval('P3M'));
if (!$phpNotSupported && $today > $securityWarningDate)
{
$supportStatus['status'] = self::PHP_SECURITY_ONLY;
$supportStatus['message'] = JText::sprintf(
'PLG_QUICKICON_PHPVERSIONCHECK_SECURITY_ONLY', PHP_VERSION, $phpEndOfSupport->format(JText::_('DATE_FORMAT_LC4'))
);
}
}
return $supportStatus;
}
/**
* Determines if the message should be displayed
*
* @return boolean
*
* @since 3.7.0
*/
private function shouldDisplayMessage()
{
// Only on admin app
if (!$this->app->isClient('administrator'))
{
return false;
}
// Only if authenticated
if (JFactory::getUser()->guest)
{
return false;
}
// Only on HTML documents
if ($this->app->getDocument()->getType() !== 'html')
{
return false;
}
// Only on full page requests
if ($this->app->input->getCmd('tmpl', 'index') === 'component')
{
return false;
}
// Only to com_cpanel
if ($this->app->input->get('option') !== 'com_cpanel')
{
return false;
}
return true;
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.7" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_phpversioncheck</name>
<author>Joomla! Project</author>
<creationDate>August 2016</creationDate>
<copyright>(C) 2016 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.7.0</version>
<description>PLG_QUICKICON_PHPVERSIONCHECK_XML_DESCRIPTION</description>
<files>
<filename plugin="phpversioncheck">phpversioncheck.php</filename>
</files>
<languages>
<language tag="en-GB">en-GB.plg_quickicon_phpversioncheck.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_phpversioncheck.sys.ini</language>
</languages>
</extension>
<?php
/**
* @package Joomla.Plugin
* @subpackage Quickicon.privacycheck
*
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Session\Session;
use Joomla\CMS\Uri\Uri;
/**
* Plugin to check privacy requests older than 14 days
*
* @since 3.9.0
*/
class PlgQuickiconPrivacyCheck extends JPlugin
{
/**
* Load plugin language files automatically
*
* @var boolean
* @since 3.9.0
*/
protected $autoloadLanguage = true;
/**
* Check privacy requests older than 14 days.
*
* @param string $context The calling context
*
* @return array A list of icon definition associative arrays
*
* @since 3.9.0
*/
public function onGetIcons($context)
{
if ($context !== $this->params->get('context', 'mod_quickicon') || !Factory::getUser()->authorise('core.admin'))
{
return;
}
JHtml::_('jquery.framework');
$token = Session::getFormToken() . '=' . 1;
$privacy = 'index.php?option=com_privacy';
$options = array(
'plg_quickicon_privacycheck_url' => Uri::base() . $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC',
'plg_quickicon_privacycheck_ajax_url' => Uri::base() . $privacy . '&task=getNumberUrgentRequests&' . $token,
'plg_quickicon_privacycheck_text' => array(
"NOREQUEST" => Text::_('PLG_QUICKICON_PRIVACYCHECK_NOREQUEST'),
"REQUESTFOUND" => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND'),
"REQUESTFOUND_MESSAGE" => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_MESSAGE'),
"REQUESTFOUND_BUTTON" => Text::_('PLG_QUICKICON_PRIVACYCHECK_REQUESTFOUND_BUTTON'),
"ERROR" => Text::_('PLG_QUICKICON_PRIVACYCHECK_ERROR'),
)
);
Factory::getDocument()->addScriptOptions('js-privacy-check', $options);
JHtml::_('script', 'plg_quickicon_privacycheck/privacycheck.js', array('version' => 'auto', 'relative' => true));
return array(
array(
'link' => $privacy . '&view=requests&filter[status]=1&list[fullordering]=a.requested_at ASC',
'image' => 'users',
'icon' => 'header/icon-48-user.png',
'text' => Text::_('PLG_QUICKICON_PRIVACYCHECK_CHECKING'),
'id' => 'plg_quickicon_privacycheck',
'group' => 'MOD_QUICKICON_USERS'
)
);
}
}
<?xml version="1.0" encoding="utf-8"?>
<extension version="3.9" type="plugin" group="quickicon" method="upgrade">
<name>plg_quickicon_privacycheck</name>
<author>Joomla! Project</author>
<creationDate>June 2018</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>PLG_QUICKICON_PRIVACYCHECK_XML_DESCRIPTION</description>
<files>
<filename plugin="privacycheck">privacycheck.php</filename>
</files>
<languages>
<language tag="en-GB">en-GB.plg_quickicon_privacycheck.ini</language>
<language tag="en-GB">en-GB.plg_quickicon_privacycheck.sys.ini</language>
</languages>
</extension>
<!DOCTYPE html><title></title>