Your IP : 216.73.216.240


Current Path : /home/juvelize/www/administrator/components/com_ffgate/liveupdate/classes/
Upload File :
Current File : /home/juvelize/www/administrator/components/com_ffgate/liveupdate/classes/xmlslurp.php

<?php
/**
 * @package   LiveUpdate
 * @copyright Copyright (c)2010-2012 Nicholas K. Dionysopoulos / AkeebaBackup.com
 * @license   GNU LGPLv3 or later <http://www.gnu.org/copyleft/lesser.html>
 */

defined('_JEXEC') or die();

class LiveUpdateXMLSlurp extends JObject
{
	private $_info = array();

	public function getInfo($extensionName, $xmlName)
	{
		if (!array_key_exists($extensionName, $this->_info))
		{
			$this->_info[$extensionName] = $this->fetchInfo($extensionName, $xmlName);
		}

		return $this->_info[$extensionName];
	}

	/**
	 * Gets the version information of an extension by reading its XML file
	 *
	 * @param string $extensionName The name of the extension, e.g. com_foobar, mod_foobar, plg_foobar or tpl_foobar.
	 * @param string $xmlName       The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function fetchInfo($extensionName, $xmlName)
	{
		$type = strtolower(substr($extensionName, 0, 3));
		switch ($type)
		{
			case 'com':
				return $this->getComponentData($extensionName, $xmlName);
				break;
			case 'mod':
				return $this->getModuleData($extensionName, $xmlName);
				break;
			case 'plg':
				return $this->getPluginData($extensionName, $xmlName);
				break;
			case 'tpl':
				return $this->getTemplateData($extensionName, $xmlName);
				break;
			case 'pkg':
				return $this->getPackageData($extensionName, $xmlName);
				break;
			case 'lib':
				return $this->getPackageData($extensionName, $xmlName);
				break;
			default:
				if (strtolower(substr($extensionName, 0, 4)) == 'file')
				{
					return $this->getPackageData($extensionName, $xmlName);
				}
				else
				{
					return array('version' => '', 'date' => '');
				}
		}
	}

	/**
	 * Gets the version information of a component by reading its XML file
	 *
	 * @param string $extensionName The name of the extension, e.g. com_foobar
	 * @param string $xmlName       The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getComponentData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$path = JPATH_ADMINISTRATOR . '/components/' . $extensionName;
		$altExtensionName = substr($extensionName, 4);

		jimport('joomla.filesystem.file');
		if (JFile::exists("$path/$xmlName"))
		{
			$filename = "$path/$xmlName";
		}
		elseif (JFile::exists("$path/$extensionName.xml"))
		{
			$filename = "$path/$extensionName.xml";
		}
		elseif (JFile::exists("$path/$altExtensionName.xml"))
		{
			$filename = "$path/$altExtensionName.xml";
		}
		elseif (JFile::exists("$path/manifest.xml"))
		{
			$filename = "$path/manifest.xml";
		}
		else
		{
			$filename = $this->searchForManifest($path);
			if ($filename === false) $filename = null;
		}

		if (empty($filename))
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try
		{
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		}
		catch (Exception $e)
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install')
		{
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a module by reading its XML file
	 *
	 * @param string $extensionName The name of the extension, e.g. mod_foobar
	 * @param string $xmlName       The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getModuleData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName, 4);

		jimport('joomla.filesystem.folder');
		jimport('joomla.filesystem.file');
		$path = JPATH_SITE . '/modules/' . $extensionName;
		if (!JFolder::exists($path))
		{
			$path = JPATH_ADMINISTRATOR . '/modules/' . $extensionName;
		}
		if (!JFolder::exists($path))
		{
			// Joomla! 1.5
			// 1. Check front-end
			$path = JPATH_ADMINISTRATOR . '/modules';
			$filename = "$path/$xmlName";
			if (!JFile::exists($filename))
			{
				$filename = "$path/$extensionName.xml";
			}
			if (!JFile::exists($filename))
			{
				$filename = "$path/$altExtensionName.xml";
			}
			// 2. Check front-end
			if (!JFile::exists($filename))
			{
				$path = JPATH_SITE . '/modules';
				$filename = "$path/$xmlName";
				if (!JFile::exists($filename))
				{
					$filename = "$path/$extensionName.xml";
				}
				if (!JFile::exists($filename))
				{
					$filename = "$path/$altExtensionName.xml";
				}
				if (!JFile::exists($filename))
				{
					return array('version' => '', 'date' => '');
				}
			}
		}
		else
		{
			// Joomla! 1.6
			$filename = "$path/$xmlName";
			if (!JFile::exists($filename))
			{
				$filename = "$path/$extensionName.xml";
			}
			if (!JFile::exists($filename))
			{
				$filename = "$path/$altExtensionName.xml";
			}
			if (!JFile::exists($filename))
			{
				return array('version' => '', 'date' => '');
			}
		}

		if (empty($filename))
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try
		{
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		}
		catch (Exception $e)
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install')
		{
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a plugin by reading its XML file
	 *
	 * @param string $extensionName The name of the plugin, e.g. plg_foobar
	 * @param string $xmlName       The name of the XML manifest filename. If empty uses $extensionName.xml
	 */
	private function getPluginData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName, 4);

		jimport('joomla.filesystem.folder');
		jimport('joomla.filesystem.file');

		$base = JPATH_PLUGINS;

		// Get a list of directories
		$stack = JFolder::folders($base, '.', true, true);
		foreach ($stack as $path)
		{
			$filename = "$path/$xmlName";
			if (JFile::exists($filename)) break;
			$filename = "$path/$extensionName.xml";
			if (JFile::exists($filename)) break;
			$filename = "$path/$altExtensionName.xml";
			if (JFile::exists($filename)) break;
		}

		if (!JFile::exists($filename))
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try
		{
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		}
		catch (Exception $e)
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install')
		{
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Gets the version information of a template by reading its XML file
	 *
	 * @param string $extensionName The name of the template, e.g. tpl_foobar
	 * @param string $xmlName       The name of the XML manifest filename. If empty uses $extensionName.xml or templateDetails.xml
	 */
	private function getTemplateData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName, 4);

		jimport('joomla.filesystem.folder');
		jimport('joomla.filesystem.file');

		// First look for administrator templates
		$path = JPATH_THEMES . '/' . $altExtensionName;
		if (!JFolder::exists($path))
		{
			// Then look for front-end templates
			$path = JPATH_SITE . '/templates/' . $altExtensionName;
			if (!JFolder::exists($path)) return array('version' => '', 'date' => '');
		}

		$filename = "$path/$xmlName";
		if (!JFile::exists($filename))
		{
			$filename = "$path/templateDetails.xml";
		}
		if (!JFile::exists($filename))
		{
			$filename = "$path/$extensionName.xml";
		}
		if (!JFile::exists($filename))
		{
			$filename = "$path/$altExtensionName.xml";
		}
		if (!JFile::exists($filename))
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try
		{
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		}
		catch (Exception $e)
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension' && $xml->getName() != 'install')
		{
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * This method parses the manifest information of package, library and file
	 * extensions. All of those extensions do not store their manifests in the
	 * extension's directory, but in administrator/manifests. Kudos to @mbabker
	 * for sharing this method!
	 *
	 * @param string $extensionName
	 * @param string $xmlName
	 *
	 * @return type
	 */
	private function getPackageData($extensionName, $xmlName)
	{
		$extensionName = strtolower($extensionName);
		$altExtensionName = substr($extensionName, 4);

		jimport('joomla.filesystem.folder');
		jimport('joomla.filesystem.file');
		$path = JPATH_ADMINISTRATOR . '/manifests/packages';

		$filename = "$path/$xmlName";
		if (!JFile::exists($filename))
		{
			$filename = "$path/$extensionName.xml";
		}
		if (!JFile::exists($filename))
		{
			$filename = "$path/$altExtensionName.xml";
		}
		if (!JFile::exists($filename))
		{
			return array('version' => '', 'date' => '');
		}

		if (empty($filename))
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		try
		{
			$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
		}
		catch (Exception $e)
		{
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		// Need to check for extension (since 1.6) and install (supported through 2.5)
		if ($xml->getName() != 'extension')
		{
			unset($xml);
			return array('version' => '', 'date' => '', 'xmlfile' => '');
		}

		$data['version'] = $xml->version ? (string) $xml->version : '';
		$data['date'] = $xml->creationDate ? (string) $xml->creationDate : '';
		$data['xmlfile'] = $filename;

		return $data;
	}

	/**
	 * Scans a directory for XML manifest files. The first XML file to be a
	 * manifest wins.
	 *
	 * @var $path string The path to look into
	 *
	 * @return string|bool The full path to a manifest file or false if not found
	 */
	private function searchForManifest($path)
	{
		jimport('joomla.filesystem.folder');
		$files = JFolder::files($path, '\.xml$', false, true);
		if (!empty($files)) foreach ($files as $filename)
		{
			try
			{
				$xml = new SimpleXMLElement($filename, LIBXML_NONET, true);
			}
			catch (Exception $e)
			{
				continue;
			}

			// Check for extension (since 1.6) and install (supported through 2.5)
			if (($xml->getName() != 'extension' && $xml->getName() != 'install')) continue;
			unset($xml);
			return $filename;
		}

		return false;
	}
}