| Current Path : /proc/1908984/root/proc/2603263/cwd/ |
| Current File : //proc/1908984/root/proc/2603263/cwd/Extension.php.tar |
home/digilove/public_html/libraries/regularlabs/src/Extension.php 0000644 00000041467 15234550246 0021355 0 ustar 00 <?php
/**
* @package Regular Labs Library
* @version 23.7.24631
*
* @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 Joomla\CMS\Component\ComponentHelper as JComponentHelper;
use Joomla\CMS\Factory as JFactory;
use Joomla\CMS\Filesystem\Folder as JFolder;
use Joomla\CMS\Helper\ModuleHelper as JModuleHelper;
use Joomla\CMS\Installer\Installer as JInstaller;
use Joomla\CMS\Language\Text as JText;
use Joomla\CMS\Plugin\PluginHelper as JPluginHelper;
jimport('joomla.filesystem.file');
jimport('joomla.filesystem.folder');
/**
* Class Extension
* @package RegularLabs\Library
*/
class Extension
{
/**
* Check if all extension types of a given extension are installed
*
* @param string $extension
* @param array $types
*
* @return bool
*/
public static function areInstalled($extension, $types = ['plugin'])
{
foreach ($types as $type)
{
$folder = 'system';
if (is_array($type))
{
[$type, $folder] = $type;
}
if ( ! self::isInstalled($extension, $type, $folder))
{
return false;
}
}
return true;
}
public static function disable($alias, $type = 'plugin', $folder = 'system')
{
$element = self::getElementByAlias($alias);
switch ($type)
{
case 'module':
$element = 'mod_' . $element;
break;
case 'component':
$element = 'com_' . $element;
break;
default:
break;
}
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->update($db->quoteName('#__extensions'))
->set($db->quoteName('enabled') . ' = 0')
->where($db->quoteName('element') . ' = ' . $db->quote($element))
->where($db->quoteName('type') . ' = ' . $db->quote($type));
if ($type == 'plugin')
{
$query->where($db->quoteName('folder') . ' = ' . $db->quote($folder));
}
$db->setQuery($query);
$db->execute();
}
/**
* Return an alias and element name based on the given extension name
*
* @param string $name
*
* @return array
*/
public static function getAliasAndElement(&$name)
{
$name = self::getNameByAlias($name);
$alias = self::getAliasByName($name);
$element = self::getElementByAlias($alias);
return [$alias, $element];
}
/**
* Return an alias based on the given extension name
*
* @param string $name
*
* @return string
*/
public static function getAliasByName($name)
{
$alias = RegEx::replace('[^a-z0-9]', '', strtolower($name));
switch ($alias)
{
case 'advancedmodules':
return 'advancedmodulemanager';
case 'advancedtemplates':
return 'advancedtemplatemanager';
case 'nonumbermanager':
return 'nonumberextensionmanager';
case 'what-nothing':
return 'whatnothing';
default:
return $alias;
}
}
public static function getById($id)
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select($db->quoteName(['extension_id', 'manifest_cache']))
->from($db->quoteName('#__extensions'))
->where($db->quoteName('extension_id') . ' = ' . (int) $id);
$db->setQuery($query);
return $db->loadObject();
}
/**
* Return an element name based on the given extension alias
*
* @param string $alias
*
* @return string
*/
public static function getElementByAlias($alias)
{
$alias = self::getAliasByName($alias);
switch ($alias)
{
case 'advancedmodulemanager':
return 'advancedmodules';
case 'advancedtemplatemanager':
return 'advancedtemplates';
case 'nonumberextensionmanager':
return 'nonumbermanager';
default:
return $alias;
}
}
/**
* Return the name based on the given extension alias
*
* @param string $alias
*
* @return string
*/
public static function getNameByAlias($alias)
{
// Alias is a language string
if (strpos($alias, ' ') === false && strtoupper($alias) == $alias)
{
return JText::_($alias);
}
// Alias has a space and/or capitals, so is already a name
if (strpos($alias, ' ') !== false || $alias !== strtolower($alias))
{
return $alias;
}
return JText::_(self::getXMLValue('name', $alias));
}
/**
* Get the full path to the extension folder
*
* @param string $extension
* @param string $basePath
* @param string $check_folder
*
* @return string
*/
public static function getPath($extension = 'plg_system_regularlabs', $basePath = JPATH_ADMINISTRATOR, $check_folder = '')
{
$basePath = $basePath ?: JPATH_SITE;
if ( ! in_array($basePath, [JPATH_ADMINISTRATOR, JPATH_SITE]))
{
return $basePath;
}
$extension = str_replace('.sys', '', $extension);
switch (true)
{
case (strpos($extension, 'mod_') === 0):
$path = 'modules/' . $extension;
break;
case (strpos($extension, 'plg_') === 0):
[$prefix, $folder, $name] = explode('_', $extension, 3);
$path = 'plugins/' . $folder . '/' . $name;
break;
case (strpos($extension, 'com_') === 0):
default:
$path = 'components/' . $extension;
break;
}
$check_folder = $check_folder ? '/' . $check_folder : '';
if (is_dir($basePath . '/' . $path . $check_folder))
{
return $basePath . '/' . $path;
}
if (is_dir(JPATH_ADMINISTRATOR . '/' . $path . $check_folder))
{
return JPATH_ADMINISTRATOR . '/' . $path;
}
if (is_dir(JPATH_SITE . '/' . $path . $check_folder))
{
return JPATH_SITE . '/' . $path;
}
return $basePath;
}
/**
* Return an extensions main xml array
*
* @param string $alias
* @param string $type
* @param string $folder
*
* @return array|bool
*/
public static function getXML($alias, $type = '', $folder = '')
{
if ( ! $file = self::getXMLFile($alias, $type, $folder))
{
return false;
}
return JInstaller::parseXMLInstallFile($file);
}
/**
* Return an extensions main xml file name (including path)
*
* @param string $alias
* @param string $type
* @param string $folder
*
* @return string
*/
public static function getXMLFile($alias, $type = '', $folder = '')
{
$element = self::getElementByAlias($alias);
$files = [];
// Components
if (empty($type) || $type == 'component')
{
$files[] = JPATH_ADMINISTRATOR . '/components/com_' . $element . '/' . $element . '.xml';
$files[] = JPATH_SITE . '/components/com_' . $element . '/' . $element . '.xml';
$files[] = JPATH_ADMINISTRATOR . '/components/com_' . $element . '/com_' . $element . '.xml';
$files[] = JPATH_SITE . '/components/com_' . $element . '/com_' . $element . '.xml';
}
// Plugins
if (empty($type) || $type == 'plugin')
{
if ( ! empty($folder))
{
$files[] = JPATH_PLUGINS . '/' . $folder . '/' . $element . '/' . $element . '.xml';
}
// System Plugins
$files[] = JPATH_PLUGINS . '/system/' . $element . '/' . $element . '.xml';
// Editor Button Plugins
$files[] = JPATH_PLUGINS . '/editors-xtd/' . $element . '/' . $element . '.xml';
// Field Plugins
$field_name = RegEx::replace('field$', '', $element);
$files[] = JPATH_PLUGINS . '/fields/' . $field_name . '/' . $field_name . '.xml';
}
// Modules
if (empty($type) || $type == 'module')
{
$files[] = JPATH_ADMINISTRATOR . '/modules/mod_' . $element . '/' . $element . '.xml';
$files[] = JPATH_SITE . '/modules/mod_' . $element . '/' . $element . '.xml';
$files[] = JPATH_ADMINISTRATOR . '/modules/mod_' . $element . '/mod_' . $element . '.xml';
$files[] = JPATH_SITE . '/modules/mod_' . $element . '/mod_' . $element . '.xml';
}
foreach ($files as $file)
{
if ( ! file_exists($file))
{
continue;
}
return $file;
}
return '';
}
/**
* Return a value from an extensions main xml file based on the given key
*
* @param string $key
* @param string $alias
* @param string $type
* @param string $folder
*
* @return string
*/
public static function getXMLValue($key, $alias, $type = '', $folder = '')
{
if ( ! $xml = self::getXML($alias, $type, $folder))
{
return '';
}
if ( ! isset($xml[$key]))
{
return '';
}
return $xml[$key] ?? '';
}
public static function isAuthorised($require_core_auth = true)
{
$user = JFactory::getApplication()->getIdentity() ?: JFactory::getUser();
if ($user->get('guest'))
{
return false;
}
if ( ! $require_core_auth)
{
return true;
}
if (
! $user->authorise('core.edit', 'com_content')
&& ! $user->authorise('core.edit.own', 'com_content')
&& ! $user->authorise('core.create', 'com_content')
)
{
return false;
}
return true;
}
/**
* Check if the Regular Labs Library is enabled
*
* @return bool
*/
public static function isEnabled($extension, $type = 'component', $folder = 'system')
{
$extension = strtolower($extension);
if ( ! self::isInstalled($extension, $type, $folder))
{
return false;
}
switch ($type)
{
case 'component':
return JComponentHelper::isEnabled($extension);
case 'plugin':
return JPluginHelper::isEnabled($folder, $extension);
case 'module':
return JModuleHelper::isEnabled($extension);
default:
return false;
}
}
public static function isEnabledInArea($params)
{
if ( ! isset($params->enable_frontend))
{
return true;
}
// Only allow in frontend
if ($params->enable_frontend == 2 && Document::isClient('administrator'))
{
return false;
}
// Do not allow in frontend
if ( ! $params->enable_frontend && Document::isClient('site'))
{
return false;
}
return true;
}
public static function isEnabledInComponent($params)
{
if ( ! isset($params->disabled_components))
{
return true;
}
return ! Protect::isRestrictedComponent($params->disabled_components);
}
/**
* Check if the Regular Labs Library is enabled
*
* @return bool
*/
public static function isFrameworkEnabled()
{
return JPluginHelper::isEnabled('system', 'regularlabs');
}
/**
* Check if the given extension is installed
*
* @param string $extension
* @param string $type
* @param string $folder
*
* @return bool
*/
public static function isInstalled($extension, $type = 'component', $folder = 'system')
{
$extension = strtolower($extension);
switch ($type)
{
case 'component':
if (file_exists(JPATH_ADMINISTRATOR . '/components/com_' . $extension . '/' . $extension . '.php')
|| file_exists(JPATH_ADMINISTRATOR . '/components/com_' . $extension . '/admin.' . $extension . '.php')
|| file_exists(JPATH_SITE . '/components/com_' . $extension . '/' . $extension . '.php')
)
{
if ($extension == 'cookieconfirm' && file_exists(JPATH_ADMINISTRATOR . '/components/com_cookieconfirm/version.php'))
{
// Only Cookie Confirm 2.0.0.rc1 and above is supported, because
// previous versions don't have isCookiesAllowed()
require_once JPATH_ADMINISTRATOR . '/components/com_cookieconfirm/version.php';
if (version_compare(COOKIECONFIRM_VERSION, '2.2.0.rc1', '<'))
{
return false;
}
}
return true;
}
break;
case 'plugin':
return file_exists(JPATH_PLUGINS . '/' . $folder . '/' . $extension . '/' . $extension . '.php');
case 'module':
return (file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/' . $extension . '.php')
|| file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
|| file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/' . $extension . '.php')
|| file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
);
case 'library':
return JFolder::exists(JPATH_LIBRARIES . '/' . $extension);
default:
return false;
}
}
public static function orderPluginFirst($name, $folder = 'system')
{
$db = JFactory::getDbo();
$query = $db->getQuery(true)
->select(['e.ordering'])
->from($db->quoteName('#__extensions', 'e'))
->where('e.type = ' . $db->quote('plugin'))
->where('e.folder = ' . $db->quote($folder))
->where('e.element = ' . $db->quote($name));
$db->setQuery($query);
$current_ordering = $db->loadResult();
if ($current_ordering == '')
{
return;
}
$query = $db->getQuery(true)
->select('e.ordering')
->from($db->quoteName('#__extensions', 'e'))
->where('e.type = ' . $db->quote('plugin'))
->where('e.folder = ' . $db->quote($folder))
->where('e.manifest_cache LIKE ' . $db->quote('%"author":"Regular Labs%'))
->where('e.element != ' . $db->quote($name))
->order('e.ordering ASC');
$db->setQuery($query);
$min_ordering = $db->loadResult();
if ($min_ordering == '')
{
return;
}
if ($current_ordering < $min_ordering)
{
return;
}
if ($min_ordering < 1 || $current_ordering == $min_ordering)
{
$new_ordering = max($min_ordering, 1);
$query = $db->getQuery(true)
->update($db->quoteName('#__extensions'))
->set($db->quoteName('ordering') . ' = ' . $new_ordering)
->where($db->quoteName('ordering') . ' = ' . $min_ordering)
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote($folder))
->where($db->quoteName('element') . ' != ' . $db->quote($name))
->where($db->quoteName('manifest_cache') . ' LIKE ' . $db->quote('%"author":"Regular Labs%'));
$db->setQuery($query);
$db->execute();
$min_ordering = $new_ordering;
}
if ($current_ordering == $min_ordering)
{
return;
}
$new_ordering = $min_ordering - 1;
$query = $db->getQuery(true)
->update($db->quoteName('#__extensions'))
->set($db->quoteName('ordering') . ' = ' . $new_ordering)
->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))
->where($db->quoteName('folder') . ' = ' . $db->quote($folder))
->where($db->quoteName('element') . ' = ' . $db->quote($name));
$db->setQuery($query);
$db->execute();
}
}
home/digilove/public_html/110/libraries/src/Table/Extension.php 0000644 00000011525 15235202674 0020372 0 ustar 00 <?php
/**
* Joomla! Content Management System
*
* @copyright (C) 2008 Open Source Matters, Inc. <https://www.joomla.org>
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace Joomla\CMS\Table;
defined('JPATH_PLATFORM') or die;
use Joomla\Registry\Registry;
use Joomla\Utilities\ArrayHelper;
/**
* Extension table
*
* @since 1.7.0
*/
class Extension extends Table
{
/**
* Constructor
*
* @param \JDatabaseDriver $db Database driver object.
*
* @since 1.7.0
*/
public function __construct($db)
{
parent::__construct('#__extensions', 'extension_id', $db);
// Set the alias since the column is called enabled
$this->setColumnAlias('published', 'enabled');
}
/**
* Overloaded check function
*
* @return boolean True if the object is ok
*
* @see Table::check()
* @since 1.7.0
*/
public function check()
{
// Check for valid name
if (trim($this->name) == '' || trim($this->element) == '')
{
$this->setError(\JText::_('JLIB_DATABASE_ERROR_MUSTCONTAIN_A_TITLE_EXTENSION'));
return false;
}
if (!$this->extension_id)
{
if (!$this->custom_data)
{
$this->custom_data = '';
}
if (!$this->system_data)
{
$this->system_data = '';
}
}
return true;
}
/**
* Overloaded bind function
*
* @param array $array Named array
* @param mixed $ignore An optional array or space separated list of properties
* to ignore while binding.
*
* @return mixed Null if operation was satisfactory, otherwise returns an error
*
* @see Table::bind()
* @since 1.7.0
*/
public function bind($array, $ignore = '')
{
if (isset($array['params']) && is_array($array['params']))
{
$registry = new Registry($array['params']);
$array['params'] = (string) $registry;
}
if (isset($array['control']) && is_array($array['control']))
{
$registry = new Registry($array['control']);
$array['control'] = (string) $registry;
}
return parent::bind($array, $ignore);
}
/**
* Method to create and execute a SELECT WHERE query.
*
* @param array $options Array of options
*
* @return string The database query result
*
* @since 1.7.0
*/
public function find($options = array())
{
// Get the \JDatabaseQuery object
$query = $this->_db->getQuery(true);
foreach ($options as $col => $val)
{
$query->where($col . ' = ' . $this->_db->quote($val));
}
$query->select($this->_db->quoteName('extension_id'))
->from($this->_db->quoteName('#__extensions'));
$this->_db->setQuery($query);
return $this->_db->loadResult();
}
/**
* Method to set the publishing state for a row or list of rows in the database
* table. The method respects checked out rows by other users and will attempt
* to checkin rows that it can after adjustments are made.
*
* @param mixed $pks An optional array of primary key values to update. If not
* set the instance property value is used.
* @param integer $state The publishing state. eg. [0 = unpublished, 1 = published]
* @param integer $userId The user id of the user performing the operation.
*
* @return boolean True on success.
*
* @since 1.7.0
*/
public function publish($pks = null, $state = 1, $userId = 0)
{
$k = $this->_tbl_key;
// Sanitize input.
$pks = ArrayHelper::toInteger($pks);
$userId = (int) $userId;
$state = (int) $state;
// If there are no primary keys set check to see if the instance key is set.
if (empty($pks))
{
if ($this->$k)
{
$pks = array($this->$k);
}
// Nothing to set publishing state on, return false.
else
{
$this->setError(\JText::_('JLIB_DATABASE_ERROR_NO_ROWS_SELECTED'));
return false;
}
}
// Build the WHERE clause for the primary keys.
$where = $k . '=' . implode(' OR ' . $k . '=', $pks);
// Determine if there is checkin support for the table.
if (!property_exists($this, 'checked_out') || !property_exists($this, 'checked_out_time'))
{
$checkin = '';
}
else
{
$checkin = ' AND (checked_out = 0 OR checked_out = ' . (int) $userId . ')';
}
// Update the publishing state for rows with the given primary keys.
$query = $this->_db->getQuery(true)
->update($this->_db->quoteName($this->_tbl))
->set($this->_db->quoteName('enabled') . ' = ' . (int) $state)
->where('(' . $where . ')' . $checkin);
$this->_db->setQuery($query);
$this->_db->execute();
// If checkin is supported and all rows were adjusted, check them in.
if ($checkin && (count($pks) == $this->_db->getAffectedRows()))
{
// Checkin the rows.
foreach ($pks as $pk)
{
$this->checkin($pk);
}
}
// If the Table instance value is in the list of primary keys that were set, set the instance.
if (in_array($this->$k, $pks))
{
$this->enabled = $state;
}
$this->setError('');
return true;
}
}
home/digilove/public_html/110/libraries/fof30/Update/Extension.php 0000644 00000006525 15235525036 0020717 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2019 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU GPL version 2 or later
*/
namespace FOF30\Update;
use FOF30\Container\Container;
use FOF30\Download\Download;
use Exception;
use SimpleXMLElement;
defined('_JEXEC') or die;
/**
* A helper class to read and parse "extension" update XML files over the web
*/
class Extension
{
/**
* Reads an "extension" XML update source and returns all listed update entries.
*
* If you have a "collection" XML update source you should do something like this:
* $collection = new F0FUtilsUpdateCollection();
* $extensionUpdateURL = $collection->getExtensionUpdateSource($url, 'component', 'com_foobar', JVERSION);
* $extension = new F0FUtilsUpdateExtension();
* $updates = $extension->getUpdatesFromExtension($extensionUpdateURL);
*
* @param string $url The extension XML update source URL to read from
*
* @return array An array of update entries
*/
public function getUpdatesFromExtension($url)
{
// Initialise
$ret = array();
// Get and parse the XML source
$container = Container::getInstance('com_FOOBAR');
$downloader = new Download($container);
$xmlSource = $downloader->getFromURL($url);
try
{
$xml = new SimpleXMLElement($xmlSource, LIBXML_NONET);
}
catch(Exception $e)
{
return $ret;
}
// Sanity check
if (($xml->getName() != 'updates'))
{
unset($xml);
return $ret;
}
// Let's populate the list of updates
/** @var SimpleXMLElement $update */
foreach ($xml->children() as $update)
{
// Sanity check
if ($update->getName() != 'update')
{
continue;
}
$entry = array(
'infourl' => array('title' => '', 'url' => ''),
'downloads' => array(),
'tags' => array(),
'targetplatform' => array(),
);
$properties = get_object_vars($update);
foreach ($properties as $nodeName => $nodeContent)
{
switch ($nodeName)
{
default:
$entry[$nodeName] = $nodeContent;
break;
case 'infourl':
case 'downloads':
case 'tags':
case 'targetplatform':
break;
}
}
$infourlNode = $update->xpath('infourl');
$entry['infourl']['title'] = (string)$infourlNode[0]['title'];
$entry['infourl']['url'] = (string)$infourlNode[0];
$downloadNodes = $update->xpath('downloads/downloadurl');
foreach ($downloadNodes as $downloadNode)
{
$entry['downloads'][] = array(
'type' => (string)$downloadNode['type'],
'format' => (string)$downloadNode['format'],
'url' => (string)$downloadNode,
);
}
$tagNodes = $update->xpath('tags/tag');
foreach ($tagNodes as $tagNode)
{
$entry['tags'][] = (string)$tagNode;
}
/** @var SimpleXMLElement[] $targetPlatformNode */
$targetPlatformNode = $update->xpath('targetplatform');
$entry['targetplatform']['name'] = (string)$targetPlatformNode[0]['name'];
$entry['targetplatform']['version'] = (string)$targetPlatformNode[0]['version'];
$client = $targetPlatformNode[0]->xpath('client');
$entry['targetplatform']['client'] = (is_array($client) && count($client)) ? (string)$client[0] : '';
$folder = $targetPlatformNode[0]->xpath('folder');
$entry['targetplatform']['folder'] = is_array($folder) && count($folder) ? (string)$folder[0] : '';
$ret[] = $entry;
}
unset($xml);
return $ret;
}
}
home/digilove/public_html/110/libraries/fof40/Update/Extension.php 0000644 00000006666 15237673105 0020731 0 ustar 00 <?php
/**
* @package FOF
* @copyright Copyright (c)2010-2022 Nicholas K. Dionysopoulos / Akeeba Ltd
* @license GNU General Public License version 3, or later
*/
namespace FOF40\Update;
defined('_JEXEC') || die;
use Exception;
use FOF40\Container\Container;
use FOF40\Download\Download;
use SimpleXMLElement;
/**
* A helper class to read and parse "extension" update XML files over the web
*/
class Extension
{
/**
* Reads an "extension" XML update source and returns all listed update entries.
*
* If you have a "collection" XML update source you should do something like this:
* $collection = new \FOF40\Update\Collection();
* $extensionUpdateURL = $collection->getExtensionUpdateSource($url, 'component', 'com_foobar', JVERSION);
* $extension = new \FOF40\Update\Extension();
* $updates = $extension->getUpdatesFromExtension($extensionUpdateURL);
*
* @param string $url The extension XML update source URL to read from
*
* @return array An array of update entries
*/
public function getUpdatesFromExtension(string $url): array
{
// Initialise
$ret = [];
// Get and parse the XML source
$container = Container::getInstance('com_FOOBAR');
$downloader = new Download($container);
$xmlSource = $downloader->getFromURL($url);
try
{
$xml = new SimpleXMLElement($xmlSource, LIBXML_NONET);
}
catch (Exception $e)
{
return $ret;
}
// Sanity check
if (($xml->getName() != 'updates'))
{
unset($xml);
return $ret;
}
// Let's populate the list of updates
/** @var SimpleXMLElement $update */
foreach ($xml->children() as $update)
{
// Sanity check
if ($update->getName() != 'update')
{
continue;
}
$entry = [
'infourl' => ['title' => '', 'url' => ''],
'downloads' => [],
'tags' => [],
'targetplatform' => [],
];
$properties = get_object_vars($update);
foreach ($properties as $nodeName => $nodeContent)
{
switch ($nodeName)
{
default:
$entry[$nodeName] = $nodeContent;
break;
case 'infourl':
case 'downloads':
case 'tags':
case 'targetplatform':
break;
}
}
$infourlNode = $update->xpath('infourl');
$entry['infourl']['title'] = (string) $infourlNode[0]['title'];
$entry['infourl']['url'] = (string) $infourlNode[0];
$downloadNodes = $update->xpath('downloads/downloadurl');
foreach ($downloadNodes as $downloadNode)
{
$entry['downloads'][] = [
'type' => (string) $downloadNode['type'],
'format' => (string) $downloadNode['format'],
'url' => (string) $downloadNode,
];
}
$tagNodes = $update->xpath('tags/tag');
foreach ($tagNodes as $tagNode)
{
$entry['tags'][] = (string) $tagNode;
}
/** @var SimpleXMLElement[] $targetPlatformNode */
$targetPlatformNode = $update->xpath('targetplatform');
$entry['targetplatform']['name'] = (string) $targetPlatformNode[0]['name'];
$entry['targetplatform']['version'] = (string) $targetPlatformNode[0]['version'];
$client = $targetPlatformNode[0]->xpath('client');
$entry['targetplatform']['client'] = (is_array($client) && count($client)) ? (string) $client[0] : '';
$folder = $targetPlatformNode[0]->xpath('folder');
$entry['targetplatform']['folder'] = is_array($folder) && count($folder) ? (string) $folder[0] : '';
$ret[] = $entry;
}
unset($xml);
return $ret;
}
}
home/digilove/public_html/plugins/system/nrframework/NRFramework/Extension.php 0000644 00000047624 15241265453 0024050 0 ustar 00 <?php
/**
* @author Tassos Marinos <info@tassos.gr>
* @link https://www.tassos.gr
* @copyright Copyright © 2024 Tassos All Rights Reserved
* @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> or later
*/
namespace NRFramework;
use NRFramework\Cache;
use Joomla\Registry\Registry;
use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Http\HttpFactory;
defined( '_JEXEC' ) or die( 'Restricted access' );
class Extension
{
/**
* Indicates the base url of Tassos.gr Joomla Extensions
*
* @var string
*/
public static $product_base_url = 'https://www.tassos.gr/joomla-extensions';
/**
* Array including already loaded extensions
*
* @var array
*/
public static $cache = [];
/**
* Get extension ID
*
* @param string $element The extension element name
* @param string $type The extension type: component, plugin, library e.t.c
* @param mixed $folder The plugin folder: system, content e.t.c
*
* @return mixed False on failure, Integer on success
*/
public static function getID($element, $type = 'component', $folder = null)
{
if (!$extension = self::get($element, $type, $folder))
{
return false;
}
return (int) $extension['extension_id'];
}
public static function getModuleByID($module_id = null)
{
if (!$module_id)
{
return;
}
$hash = 'get_module_by_id_' . $module_id;
// Render modal once
if ($module_data = Cache::get($hash))
{
return $module_data;
}
// Let's call the database
$db = Factory::getDBO();
$query = $db->getQuery(true)
->select('*')
->from($db->quoteName('#__modules'))
->where($db->quoteName('id') . ' = ' . $module_id);
$db->setQuery($query);
$module_data = $db->loadAssoc();
Cache::set($hash, $module_data);
return $module_data;
}
/**
* Get extension data by ID
*
* @param string $extension_id The extension primary key
*
* @return void
*/
public static function getByID($extension_id)
{
// Check if element is already cached
if (isset(self::$cache[$extension_id]))
{
return self::$cache[$extension_id];
}
// Let's call the database
$db = Factory::getDBO();
$query = $db->getQuery(true)
->select('*')
->from($db->quoteName('#__extensions'))
->where($db->quoteName('extension_id') . ' = ' . $extension_id);
$db->setQuery($query);
return self::$cache[$extension_id] = $db->loadAssoc();
}
/**
* Get extension information from database
*
* @param string $element The extension element name
* @param string $type The extension type: component, plugin, library e.t.c
* @param mixed $folder The plugin folder: system, content e.t.c
*
* @return array
*/
public static function get($element, $type = 'component', $folder = null)
{
// Check if element is already cached
$hash = md5($element . '_' . $type . '_' . $folder);
if (isset(self::$cache[$hash]))
{
return self::$cache[$hash];
}
// Let's call the database
$db = Factory::getDBO();
switch ($type)
{
case 'component':
$element = 'com_' . str_replace('com_', '', $element);
break;
case 'module':
$element = 'mod_' . str_replace('mod_', '', $element);
break;
}
$query = $db->getQuery(true)
->select('*')
->from($db->quoteName('#__extensions'))
->where($db->quoteName('element') . ' = ' . $db->quote($element))
->where($db->quoteName('type') . ' = ' . $db->quote($type));
if (!is_null($folder))
{
$query->where($db->quoteName('folder') . ' = ' . $db->quote($folder));
}
$db->setQuery($query);
return self::$cache[$hash] = $db->loadAssoc();
}
/**
* Get framework plugin data
*
* @return array
*/
public static function getFramework()
{
return self::get('nrframework', 'plugin', 'system');
}
/**
* Helper method to check if a plugin is enabled
*
* @param string $element The extension element name
* @param string $type The extension type: component, plugin, library e.t.c
*
* @return boolean
*/
public static function pluginIsEnabled($element, $folder = 'system')
{
return self::isEnabled($element, 'plugin', $folder);
}
/**
* Update an extension's params.
*
* @param string $name The extension name
* @param string $type The extension type
* @param string $element The extension element
* @param array $params The new params
*
* @return bool
*/
public static function updateExtensionParams($name = '', $type = '', $element = '', $params = [])
{
if (empty($name) || empty($type) || empty($element) || empty($params))
{
return false;
}
// Update params
$db = Factory::getDBO();
// Update params
$query = $db->getQuery(true)
->update('#__extensions')
->set($db->quoteName('params') . ' = ' . $db->quote(json_encode($params)))
->where($db->quoteName('name') . ' = ' . $db->quote($name))
->where($db->quoteName('type') . ' = ' . $db->quote($type))
->where($db->quoteName('element') . ' = ' . $db->quote($element));
$db->setQuery($query);
$db->execute();
return true;
}
/**
* Helper method to check if a component is enabled
*
* @param string $element The component element name
*
* @return boolean
*/
public static function componentIsEnabled($element)
{
return self::isEnabled($element);
}
/**
* Checks if an extension is enabled
*
* @param string $element The extension element name
* @param string $type The extension type: component, plugin, library e.t.c
* @param mixed $folder The plugin folder: system, content e.t.c
*
* @return boolean
*/
public static function isEnabled($element, $type = 'component', $folder = 'system')
{
switch ($type)
{
case 'component':
if (!$extension = self::get($element))
{
return false;
}
return (bool) $extension['enabled'];
break;
case 'plugin':
if (!$extension = self::get($element, $type = 'plugin', $folder))
{
return false;
}
return (bool) $extension['enabled'];
break;
}
}
/**
* Checks if an extension is installed
*
* @param string $extension The extension element name
* @param string $type The extension's type
* @param string $folder Plugin folder
*
* @return boolean Returns true if extension is installed
*/
public static function isInstalled($extension, $type = 'component', $folder = 'system')
{
$db = Factory::getDbo();
switch ($type)
{
case 'component':
$extension_data = self::get('com_' . str_replace('com_', '', $extension));
return isset($extension_data['extension_id']);
break;
case 'plugin':
return file_exists(JPATH_PLUGINS . '/' . $folder . '/' . $extension . '/' . $extension . '.php');
case 'module':
return (file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/' . $extension . '.php')
|| file_exists(JPATH_ADMINISTRATOR . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
|| file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/' . $extension . '.php')
|| file_exists(JPATH_SITE . '/modules/mod_' . $extension . '/mod_' . $extension . '.php')
);
case 'library':
return is_dir(JPATH_LIBRARIES . '/' . $extension);
}
return false;
}
/**
* Discover extension's name based on the query string
*
* @param boolean $translate If set to yes, the name will be returned translated
*
* @return string
*/
public static function getExtensionNameByRequest($translate = false)
{
$input = Factory::getApplication()->input;
$option = $input->get('option');
$name = '';
switch ($option)
{
case 'com_modules':
$name = 'com_smilepack';
break;
case 'com_fields':
$name = 'plg_system_acf';
break;
case 'com_plugins':
$plugin = self::getByID($input->get('extension_id'));
if (is_array($plugin))
{
$name = $plugin['name'];
}
break;
default:
$name = $option;
break;
}
if ($translate)
{
$name = explode(' - ', Text::_($name));
return end($name);
}
return $name;
}
/**
* Returns Tassos.gr extension checkout URL
*
* @param string $name The extension's element name
* @param bool $append_utm Set whether to append the UTM parameters
*
* @return string
*/
public static function getTassosExtensionUpgradeURL($name = null, $append_utm = true)
{
$name = is_null($name) ? strtolower(self::getExtensionNameByRequest()) : $name;
$suffix = $append_utm ? '?utm_source=Joomla&utm_medium=upgradebutton&utm_campaign=freeversion' : '';
return self::$product_base_url . '/' . self::getProductAlias($name) . '/upgrade-to-pro' . $suffix;
}
public static function getProductAlias($extension)
{
$extension = is_null($extension) ? self::getExtensionNameByRequest() : $extension;
switch ($extension)
{
case 'com_gsd': case 'plg_system_gsd': return 'google-structured-data';
case 'com_rstbox': return 'engagebox';
case 'com_convertforms': return 'convert-forms';
case 'com_smilepack': return 'smile-pack';
case 'plg_system_tweetme': return 'tweetme';
case 'plg_system_acf': return 'advanced-custom-fields';
}
}
public static function getExtensionName($extension_element = null)
{
if (!$extension_element)
{
return;
}
// Load extension's language file
Functions::loadLanguage($extension_element);
// Remove plugin folder prefix from plugins
return str_replace('System -', '', Text::_($extension_element));
}
public static function getProductURL($extension)
{
return self::$product_base_url . '/' . self::getProductAlias($extension);
}
public static function getPath($element)
{
$parts = explode('_', $element);
switch ($parts[0])
{
case 'com':
return JPATH_ADMINISTRATOR . '/components/' . $element;
case 'plg':
return JPATH_SITE . '/plugins/' . $parts[1] . '/' . $parts[2];
}
}
public static function getVersion($extension, $include_type = false)
{
$xml = self::getXML($extension);
if (!$xml || !isset($xml->version))
{
return;
}
$version = (string) $xml->version;
// If enabled, it returns EngageBox Pro
if ($include_type)
{
$isPro = self::isPro($extension);
$version_type = $isPro ? 'Pro' : 'Free';
$version .= ' ' . $version_type;
}
return $version;
}
public static function elementToAlias($element)
{
$parts = explode('_', $element);
return end($parts);
}
public static function getXML($element)
{
if (!$path = self::getPath($element))
{
return;
}
$extension_alias = self::elementToAlias($element);
$xml = $path . '/' . $extension_alias . '.xml';
return simplexml_load_file($xml);
}
/**
* Returns a URL where we can check for extension updates.
*
* @param strong $extension
*
* @return mixed Null of fail, String on success
*/
public static function getUpdateServer($extension)
{
$xml = self::getXML($extension);
if (!$xml || !isset($xml->updateservers))
{
return;
}
$updateserver = trim($xml->updateservers->server);
// Remove unwanted string added by Free / Pro versions
$pp = strpos($updateserver, '@');
if ($pp !== false)
{
$updateserver = substr($updateserver, 0, $pp);
}
return $updateserver;
}
/**
* Get the latest extension version from the remote update server
*
* @param string $extension
*
* @return mixed Null on failure, String on success
*/
public static function getLatestVersion($extension)
{
// Get the extension's update server URL
if (!$updateserver = self::getUpdateServer($extension))
{
return;
}
// Call the Update Server and make sure the response is valid
$response = HttpFactory::getHttp()->get($updateserver);
if ($response->code != 200 || strpos($response->body, '<updates>') === false)
{
return;
}
$body = new \SimpleXMLElement($response->body);
$version = (string) $body->update[0]->version;
return $version;
}
/**
* Check if we have the Pro version of the extension
*
* @param string $element
*
* @return bool
*/
public static function isPro($element)
{
if (!$path = self::getPath($element))
{
return false;
}
$versionFile = $path . '/version.php';
// If version file does not exist we assume a PRO version
if (!file_exists($versionFile))
{
return true;
}
require $versionFile;
// If the NR_PRO variable is not set we're probably under development mode. Assume a Pro version.
if (!isset($NR_PRO))
{
return true;
}
return (bool) $NR_PRO;
}
/**
* Checks whether an extension is outdated.
*
* @param string $extension
* @param int $days_old
*
* @return bool
*/
public static function isOutdated($extension, $days_old = 120)
{
$versionFile = Functions::getExtensionPath($extension) . "/version.php";
if (!file_exists($versionFile))
{
return false;
}
require $versionFile;
if (!isset($RELEASE_DATE))
{
return false;
}
if (!$then = strtotime($RELEASE_DATE))
{
return false;
}
$days_old = (int) $days_old;
$now = time();
$diff = $now - $then;
$days_diff = round($diff / (60 * 60 * 24));
if ($days_diff <= $days_old)
{
return false;
}
return true;
}
/**
* Checks whether the geolocation plugin needs an update.
*
* @return bool
*/
public static function geoPluginNeedsUpdate()
{
// Check if TGeoIP plugin is enabled
if (!self::pluginIsEnabled('tgeoip'))
{
return false;
}
$plugin_path = JPATH_PLUGINS . '/system/tgeoip/';
// Load plugin language (Needed by Joomla 4)
Factory::getLanguage()->load('plg_system_tgeoip', $plugin_path);
// Load TGeoIP classes
@include_once $plugin_path . 'vendor/autoload.php';
@include_once $plugin_path . 'helper/tgeoip.php';
if (!class_exists('TGeoIP'))
{
return false;
}
// Check if database needs update.
$geo = new \TGeoIP();
if (!$geo->needsUpdate())
{
return false;
}
// Database is too old and needs an update! Let's inform user.
return true;
}
/**
* Returns the extension's JED URL.
*
* @param string $xml_folder
*
* @return string
*/
public static function getExtensionJEDURL($xml_folder = null)
{
if (empty($xml_folder))
{
return;
}
$url = 'https://extensions.joomla.org/extensions/extension/';
switch ($xml_folder) {
case 'com_smilepack':
$url .= 'smile-pack';
break;
case 'com_rstbox':
$url .= 'style-a-design/popups-a-iframes/engage-box';
break;
case 'com_convertforms':
$url .= 'contacts-and-feedback/forms/convert-forms';
break;
case 'plg_system_acf':
$url .= 'authoring-a-content/content-construction/advanced-custom-fields';
break;
case 'plg_system_gsd':
$url .= 'search-a-indexing/web-search/google-structured-data';
break;
case 'tm_mailchimpuserautoadd':
$url .= 'marketing/mailing-a-newsletter-bridges/user-auto-add-to-mailchimp-for-joomla';
break;
case 'tweetme':
$url .= 'social-web/social-share/tweetme';
break;
case 'mod_webhotelier':
$url .= 'vertical-markets/booking-a-reservations/webhotelier-booking-form';
break;
}
return $url;
}
/**
* Returns the installation date of an extension given its extension element.
*
* @param string $element
*
* @return string
*/
public static function getInstallationDate($element = null)
{
$alias = self::getExtensionDataFileAlias($element);
$path = self::getExtensionsDataFilePath();
// If file does not exist, abort
if (!file_exists($path))
{
return;
}
// If file exists, retrieve its contents
$content = file_get_contents($path);
// Decode it
if (!$content = json_decode($content, true))
{
return;
}
// If no installation date exists, abort
if (!isset($content[$alias]))
{
return;
}
// Ensure install date exists
if (!isset($content[$alias]['install_date']))
{
return;
}
return $content[$alias]['install_date'];
}
/**
* Sets the installation date of an extension.
*
* @param string $element
* @param string $install_date
*
* @return bool
*/
public static function setInstallationDate($element = null, $install_date = null)
{
$alias = self::getExtensionDataFileAlias($element);
$path = self::getExtensionsDataFilePath();
// If file does not exist, abort
if (!file_exists($path))
{
\NRFramework\File::createDirs(dirname($path));
file_put_contents($path, json_encode([
$alias => [
'install_date' => $install_date
]
]));
return;
}
// If file exists, retrieve its contents
$content = file_get_contents($path);
// Decode it
$content = json_decode($content, true);
if (!isset($content[$alias]))
{
$content[$alias]['install_date'] = $install_date;
}
else
{
foreach ($content as $key => &$value)
{
if ($key !== $alias)
{
continue;
}
if (isset($value['install_date']))
{
return false;
}
$value['install_date'] = $install_date;
}
}
file_put_contents($path, json_encode($content));
}
/**
* Returns all extensions file details.
*
* @return array
*/
public static function getExtensionsFileDetails()
{
$file = self::getExtensionsDataFilePath();
if (!file_exists($file))
{
return [];
}
if (!$data = file_get_contents($file))
{
return [];
}
if (!$data = json_decode($data, true))
{
return [];
}
return $data;
}
/**
* Returns an extension's alias used to find an extensions data within the extensions.json data file.
*
* @param string $element
*
* @return string
*/
public static function getExtensionDataFileAlias($element)
{
$element = str_replace('com_', '', $element);
switch ($element) {
case 'rstbox':
$element = 'engagebox';
break;
case 'smilepack':
$element = 'smile-pack';
break;
}
return $element;
}
/**
* The file path that stores all extensions data.
*
* @return string
*/
public static function getExtensionsDataFilePath()
{
return JPATH_SITE . '/media/plg_system_nrframework/data/extensions.json';
}
/**
* Returns all extensions details.
*
* @return array
*/
public static function getExtensionsDetails()
{
return [
'smilepack' => [
'extension' => 'com_smilepack',
'type' => 'component'
],
'engagebox' => [
'extension' => 'com_rstbox',
'type' => 'component'
],
'gsd' => [
'extension' => 'com_gsd',
'type' => 'component'
],
'acf' => [
'extension' => 'acf',
'type' => 'plugin'
],
'convertforms' => [
'extension' => 'com_convertforms',
'type' => 'component'
]
];
}
/**
* Returns the number of tassos.gr installed extensions.
*
* @return int
*/
public static function getTotalInstalledExtensions()
{
$installed = 0;
foreach (self::getExtensionsDetails() as $key => $value)
{
if (!self::isInstalled($value['extension'], $value['type']))
{
continue;
}
$installed++;
}
return $installed;
}
/**
* Returns the number of users active subscription plans.
*
* @param array $license_data
*
* @return int
*/
public static function getUserTotalPaidPlans($license_data = [])
{
if (!$license_data)
{
return 0;
}
$count = 0;
foreach ($license_data as $key => $value)
{
if (!isset($value['active']))
{
continue;
}
if (!$value['active'])
{
continue;
}
$count++;
}
return $count;
}
}