Your IP : 216.73.216.190


Current Path : /proc/1908984/root/proc/2603263/cwd/
Upload File :
Current File : //proc/1908984/root/proc/2603263/cwd/Extension.php.tar

home/digilove/public_html/libraries/regularlabs/src/Extension.php000064400000041467152345502460021355 0ustar00<?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.php000064400000011525152352026740020372 0ustar00<?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.php000064400000006525152355250360020717 0ustar00<?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.php000064400000006666152376731050020731 0ustar00<?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.php000064400000047624152412654530024050 0ustar00<?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;
	}
}