Server : LiteSpeed System : Linux server 3.10.0-1160.90.1.el7.x86_64 #1 SMP Thu May 4 15:21:22 UTC 2023 x86_64 User : alsaif ( 1057) PHP Version : 7.4.33 Disable Function : show_source,posix_kill,posix_mkfifo,posix_getpwuid,posix_setpgid,posix_setsid,posix_setuid,posix_setgid,posix_seteuid,posix_setegid,posix_uname Directory : /home/alsaif/public_html/libraries/regularlabs/src/ |
<?php
/**
* @package Regular Labs Library
* @version 23.9.3039
*
* @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
*/
namespace RegularLabs\Library;
defined('_JEXEC') or die;
use JDatabaseDriver;
use Joomla\CMS\Application\CMSApplication as JCMSApplication;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Form\Form as JForm;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Plugin\CMSPlugin as JCMSPlugin;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
use JRegistry;
use RegularLabs\Library\ParametersNew as Parameters;
/**
* Class Plugin
*
* @package RegularLabs\Library
*/
class SystemPlugin extends JCMSPlugin
{
public $_alias = '';
public $_can_disable_by_url = true;
public $_disable_on_components = false;
public $_enable_in_admin = false;
public $_enable_in_frontend = true;
public $_has_tags = false;
public $_is_admin = false;
public $_jversion = 3;
public $_lang_prefix = '';
public $_page_types = [];
public $_protected_formats = [];
public $_title = '';
protected $_doc_ready = false;
protected $_pass = null;
/**
* @var JCMSApplication
*/
protected $app;
/**
* @var JDatabaseDriver
*/
protected $db;
/**
* @param object &$subject The object to observe
* @param array $config An optional associative array of configuration settings.
* Recognized key values include 'name', 'group', 'params', 'language'
* (this list is not meant to be comprehensive).
*/
public function __construct(&$subject, $config = [])
{
if (isset($config['id']))
{
$this->_id = $config['id'];
}
parent::__construct($subject, $config);
$this->app = JFactory::getApplication();
$this->db = JFactory::getDbo();
$this->_is_admin = Document::isAdmin();
if (empty($this->_alias))
{
$this->_alias = $this->_name;
}
if (empty($this->_title))
{
$this->_title = strtoupper($this->_alias);
}
Language::load('plg_' . $this->_type . '_' . $this->_name);
}
/**
* @return void
*/
public function onAfterDispatch()
{
if ( ! $this->passChecks())
{
return;
}
$this->handleOnAfterDispatch();
$buffer = Document::getComponentBuffer();
$this->loadStylesAndScripts($buffer);
if ( ! $buffer)
{
return;
}
$this->changeDocumentBuffer($buffer);
Document::setComponentBuffer($buffer);
}
/**
* @return void
*/
public function onAfterInitialise()
{
if ( ! $this->passChecks())
{
return;
}
$this->handleOnAfterInitialise();
}
/**
* @return void
*/
public function onAfterRender()
{
if ( ! $this->passChecks())
{
return;
}
$this->handleOnAfterRender();
$html = $this->app->getBody();
if ($html == '')
{
return;
}
if ( ! $this->changeFinalHtmlOutput($html))
{
return;
}
$this->cleanFinalHtmlOutput($html);
$this->app->setBody($html);
}
/**
* @param string $buffer
* @param string $params
*
* @return void
*/
public function onAfterRenderModules(&$buffer, &$params)
{
if ( ! $this->passChecks())
{
return;
}
$this->handleOnAfterRenderModules($buffer, $params);
if (empty($buffer))
{
return;
}
$this->changeModulePositionOutput($buffer, $params);
}
/**
* @return void
*/
public function onAfterRoute()
{
$this->_doc_ready = true;
if ( ! $this->passChecks())
{
return;
}
$this->handleOnAfterRoute();
}
/**
* @return void
*/
public function onBeforeCompileHead(): void
{
if ( ! $this->passChecks())
{
return;
}
$this->handleOnBeforeCompileHead();
}
/**
* @param string $context The context of the content being passed to the plugin.
* @param mixed &$row An object with a "text" property
* @param mixed &$params Additional parameters. See {@see PlgContentContent()}.
* @param integer $page Optional page number. Unused. Defaults to zero.
*
* @return bool
*/
public function onContentPrepare($context, &$article, &$params, $page = 0)
{
if ( ! $this->passChecks())
{
return true;
}
$area = isset($article->created_by) ? 'article' : 'other';
$context = (($params instanceof JRegistry) && $params->get('rl_search')) ? 'com_search.' . $params->get('readmore_limit') : $context;
if ( ! $this->handleOnContentPrepare($area, $context, $article, $params, $page))
{
return false;
}
Article::process($article, $context, $this, 'processArticle', [$area, $context, $article, $page]);
return true;
}
/**
* @param JForm $form The form to be altered.
* @param mixed $data The associated data for the form.
*
* @return bool
*/
public function onContentPrepareForm(JForm $form, $data)
{
if ( ! $this->passChecks())
{
return true;
}
return $this->handleOnContentPrepareForm($form, $data);
}
/**
* @param string &$string
* @param string $area
* @param string $context The context of the content being passed to the plugin.
* @param mixed $article An object with a "text" property
* @param int $page Optional page number. Unused. Defaults to zero.
*
* @return void
*/
public function processArticle(&$string, $area = 'article', $context = '', $article = null, $page = 0)
{
}
/**
* @param string $buffer
*
* @return bool
*/
protected function changeDocumentBuffer(&$buffer)
{
return false;
}
/**
* @param string $html
*
* @return bool
*/
protected function changeFinalHtmlOutput(&$html)
{
return false;
}
/**
* @param string $buffer
* @param string $params
*
* @return void
*/
protected function changeModulePositionOutput(&$buffer, &$params)
{
}
/**
* @param string $html
*
* @return void
*/
protected function cleanFinalHtmlOutput(&$html)
{
}
protected function extraChecks()
{
$input = JFactory::getApplication()->input;
// Disable on Gridbox edit form: option=com_gridbox&view=gridbox
if ($input->get('option') == 'com_gridbox' && $input->get('view') == 'gridbox')
{
return false;
}
// Disable on SP PageBuilder edit form: option=com_sppagebuilder&view=form
if ($input->get('option') == 'com_sppagebuilder' && $input->get('view') == 'form')
{
return false;
}
return true;
}
/**
* @return void
*/
protected function handleFeedArticles()
{
if ( ! empty($this->_page_types)
&& ! in_array('feed', $this->_page_types)
)
{
return;
}
if ( ! Document::isFeed()
&& JFactory::getApplication()->input->get('option') != 'com_acymailing'
)
{
return;
}
if ( ! isset(Document::get()->items))
{
return;
}
$context = 'feed';
$items = Document::get()->items;
$params = null;
foreach ($items as $item)
{
$this->handleOnContentPrepare('article', $context, $item, $params);
}
}
/**
* @return void
*/
protected function handleOnAfterDispatch()
{
$this->handleFeedArticles();
}
/**
* @return void
*/
protected function handleOnAfterInitialise()
{
}
/**
* @return void
*
* Consider using changeFinalHtmlOutput instead
*/
protected function handleOnAfterRender()
{
}
/**
* @param string $buffer
* @param string $params
*
* @return void
*/
protected function handleOnAfterRenderModules(&$buffer, &$params)
{
}
/**
* @return void
*/
protected function handleOnAfterRoute()
{
}
/**
* @return void
*/
protected function handleOnBeforeCompileHead()
{
}
/**
* @param string $area
* @param string $context The context of the content being passed to the plugin.
* @param mixed $article An object with a "text" property
* @param mixed &$params Additional parameters. See {@see PlgContentContent()}.
* @param int $page Optional page number. Unused. Defaults to zero.
*
* @return bool
*/
protected function handleOnContentPrepare($area, $context, &$article, &$params, $page = 0)
{
return true;
}
/**
* @param JForm $form The form
* @param stdClass $data The data
*
* @return bool
*/
protected function handleOnContentPrepareForm(JForm $form, $data)
{
return true;
}
protected function init()
{
return;
}
/**
* @param string $buffer
*
* @return void
*/
protected function loadStylesAndScripts(&$buffer)
{
}
/**
* @return bool
*/
protected function passChecks()
{
if ( ! is_null($this->_pass))
{
return $this->_pass;
}
$this->setPass(false);
if ( ! $this->isFrameworkEnabled())
{
return false;
}
if ($this->_doc_ready && ! $this->passPageTypes())
{
return false;
}
// allow in frontend?
if ( ! $this->_enable_in_frontend
&& ! $this->_is_admin
)
{
return false;
}
$params = Parameters::getPlugin($this->_name);
// allow in admin?
if ( ! $this->_enable_in_admin
&& $this->_is_admin
&& ( ! isset($params->enable_admin) || ! $params->enable_admin)
)
{
return false;
}
// disabled by url?
if (
$this->_can_disable_by_url
&& Protect::isDisabledByUrl($this->_alias)
)
{
return false;
}
// disabled by component?
if (
$this->_disable_on_components
&& Protect::isRestrictedComponent($params->disabled_components ?? [], 'component')
)
{
return false;
}
// restricted page?
if (Protect::isRestrictedPage($this->_has_tags, $this->_protected_formats))
{
return false;
}
if ( ! $this->extraChecks())
{
return false;
}
$this->setPass(true);
return true;
}
protected function passPageTypes()
{
if (empty($this->_page_types))
{
return true;
}
if (in_array('*', $this->_page_types))
{
return true;
}
if (empty(JFactory::$document))
{
return true;
}
if (Document::isFeed())
{
return in_array('feed', $this->_page_types);
}
if (Document::isPDF())
{
return in_array('pdf', $this->_page_types);
}
$page_type = Document::get()->getType();
if (in_array($page_type, $this->_page_types))
{
return true;
}
return false;
}
/**
* Place an error in the message queue
*/
protected function throwError($error)
{
$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
// Return if page is not an admin page or the admin login page
if (
! JFactory::getApplication()->isClient('administrator')
|| $user->get('guest')
)
{
return;
}
// load the admin language file
JFactory::getLanguage()->load('plg_' . $this->_type . '_' . $this->_name, JPATH_PLUGINS . '/' . $this->_type . '/' . $this->_name);
$text = JText::sprintf($this->_lang_prefix . '_' . $error, JText::_($this->_title));
$text = JText::_($text) . ' ' . JText::sprintf($this->_lang_prefix . '_EXTENSION_CAN_NOT_FUNCTION', JText::_($this->_title));
// Check if message is not already in queue
$messagequeue = JFactory::getApplication()->getMessageQueue();
foreach ($messagequeue as $message)
{
if ($message['message'] == $text)
{
return;
}
}
JFactory::getApplication()->enqueueMessage($text, 'error');
}
/**
* Check if the Regular Labs Library is enabled
*
* @return bool
*/
private function isFrameworkEnabled()
{
if ( ! defined('REGULAR_LABS_LIBRARY_ENABLED'))
{
$this->setIsFrameworkEnabled();
}
if ( ! REGULAR_LABS_LIBRARY_ENABLED)
{
$this->throwError('REGULAR_LABS_LIBRARY_NOT_ENABLED');
}
return REGULAR_LABS_LIBRARY_ENABLED;
}
/**
* Set the define with whether the Regular Labs Library is enabled
*/
private function setIsFrameworkEnabled()
{
if ( ! JPluginHelper::isEnabled('system', 'regularlabs'))
{
$this->throwError('REGULAR_LABS_LIBRARY_NOT_ENABLED');
define('REGULAR_LABS_LIBRARY_ENABLED', false);
return;
}
define('REGULAR_LABS_LIBRARY_ENABLED', true);
}
/**
* @param bool $pass
*
* @return void
*/
private function setPass($pass)
{
if ( ! $this->_doc_ready)
{
return;
}
$this->_pass = (bool) $pass;
}
}