You've already forked joomla_test
							
							
		
			
	
	
		
			292 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			292 lines
		
	
	
		
			6.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * @package     Joomla.Libraries
							 | 
						||
| 
								 | 
							
								 * @subpackage  Installer
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
							 | 
						||
| 
								 | 
							
								 * @license     GNU General Public License version 2 or later; see LICENSE
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								defined('JPATH_PLATFORM') or die;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								jimport('joomla.filesystem.file');
							 | 
						||
| 
								 | 
							
								jimport('joomla.filesystem.folder');
							 | 
						||
| 
								 | 
							
								jimport('joomla.filesystem.path');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Installer helper class
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * @package     Joomla.Libraries
							 | 
						||
| 
								 | 
							
								 * @subpackage  Installer
							 | 
						||
| 
								 | 
							
								 * @since       3.1
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								abstract class JInstallerHelper
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Downloads a package
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $url     URL of file to download
							 | 
						||
| 
								 | 
							
									 * @param   string  $target  Download target filename [optional]
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  mixed  Path to downloaded package or boolean false on failure
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function downloadPackage($url, $target = false)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$config = JFactory::getConfig();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Capture PHP errors
							 | 
						||
| 
								 | 
							
										$track_errors = ini_get('track_errors');
							 | 
						||
| 
								 | 
							
										ini_set('track_errors', true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Set user agent
							 | 
						||
| 
								 | 
							
										$version = new JVersion;
							 | 
						||
| 
								 | 
							
										ini_set('user_agent', $version->getUserAgent('Installer'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										$http = JHttpFactory::getHttp();
							 | 
						||
| 
								 | 
							
										$response = $http->get($url);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (302 == $response->code && isset($response->headers['Location']))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return self::downloadPackage($response->headers['Location']);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										elseif (200 != $response->code)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											JLog::add(JText::_('JLIB_INSTALLER_ERROR_DOWNLOAD_SERVER_CONNECT'), JLog::WARNING, 'jerror');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (isset($response->headers['Content-Disposition']))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$contentfilename = explode("\"", $response->headers['Content-Disposition']);
							 | 
						||
| 
								 | 
							
											$target = $contentfilename[1];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Set the target path if not given
							 | 
						||
| 
								 | 
							
										if (!$target)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$target = $config->get('tmp_path') . '/' . self::getFilenameFromURL($url);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$target = $config->get('tmp_path') . '/' . basename($target);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Write buffer to file
							 | 
						||
| 
								 | 
							
										JFile::write($target, $response->body);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Restore error tracking to what it was before
							 | 
						||
| 
								 | 
							
										ini_set('track_errors', $track_errors);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Bump the max execution time because not using built in php zip libs are slow
							 | 
						||
| 
								 | 
							
										@set_time_limit(ini_get('max_execution_time'));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Return the name of the downloaded package
							 | 
						||
| 
								 | 
							
										return basename($target);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Unpacks a file and verifies it as a Joomla element package
							 | 
						||
| 
								 | 
							
									 * Supports .gz .tar .tar.gz and .zip
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $p_filename  The uploaded package filename or install directory
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  mixed  Array on success or boolean false on failure
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function unpack($p_filename)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										// Path to the archive
							 | 
						||
| 
								 | 
							
										$archivename = $p_filename;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Temporary folder to extract the archive into
							 | 
						||
| 
								 | 
							
										$tmpdir = uniqid('install_');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Clean the paths to use for archive extraction
							 | 
						||
| 
								 | 
							
										$extractdir = JPath::clean(dirname($p_filename) . '/' . $tmpdir);
							 | 
						||
| 
								 | 
							
										$archivename = JPath::clean($archivename);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Do the unpacking of the archive
							 | 
						||
| 
								 | 
							
										try
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											JArchive::extract($archivename, $extractdir);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										catch (Exception $e)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Let's set the extraction directory and package file in the result array so we can
							 | 
						||
| 
								 | 
							
										 * cleanup everything properly later on.
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										$retval['extractdir'] = $extractdir;
							 | 
						||
| 
								 | 
							
										$retval['packagefile'] = $archivename;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Try to find the correct install directory.  In case the package is inside a
							 | 
						||
| 
								 | 
							
										 * subdirectory detect this and set the install directory to the correct path.
							 | 
						||
| 
								 | 
							
										 *
							 | 
						||
| 
								 | 
							
										 * List all the items in the installation directory.  If there is only one, and
							 | 
						||
| 
								 | 
							
										 * it is a folder, then we will set that folder to be the installation folder.
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										$dirList = array_merge(JFolder::files($extractdir, ''), JFolder::folders($extractdir, ''));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (count($dirList) == 1)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											if (JFolder::exists($extractdir . '/' . $dirList[0]))
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												$extractdir = JPath::clean($extractdir . '/' . $dirList[0]);
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * We have found the install directory so lets set it and then move on
							 | 
						||
| 
								 | 
							
										 * to detecting the extension type.
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										$retval['dir'] = $extractdir;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										/*
							 | 
						||
| 
								 | 
							
										 * Get the extension type and return the directory/type array on success or
							 | 
						||
| 
								 | 
							
										 * false on fail.
							 | 
						||
| 
								 | 
							
										 */
							 | 
						||
| 
								 | 
							
										$retval['type'] = self::detectType($extractdir);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if ($retval['type'])
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return $retval;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										else
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Method to detect the extension type from a package directory
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $p_dir  Path to package directory
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  mixed  Extension type string or boolean false on fail
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function detectType($p_dir)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										// Search the install dir for an XML file
							 | 
						||
| 
								 | 
							
										$files = JFolder::files($p_dir, '\.xml$', 1, true);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										if (!count($files))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											JLog::add(JText::_('JLIB_INSTALLER_ERROR_NOTFINDXMLSETUPFILE'), JLog::WARNING, 'jerror');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return false;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										foreach ($files as $file)
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$xml = simplexml_load_file($file);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if (!$xml)
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												continue;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											if ($xml->getName() != 'extension')
							 | 
						||
| 
								 | 
							
											{
							 | 
						||
| 
								 | 
							
												unset($xml);
							 | 
						||
| 
								 | 
							
												continue;
							 | 
						||
| 
								 | 
							
											}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											$type = (string) $xml->attributes()->type;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											// Free up memory
							 | 
						||
| 
								 | 
							
											unset($xml);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return $type;
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										JLog::add(JText::_('JLIB_INSTALLER_ERROR_NOTFINDJOOMLAXMLSETUPFILE'), JLog::WARNING, 'jerror');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Free up memory.
							 | 
						||
| 
								 | 
							
										unset($xml);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return false;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Gets a file name out of a url
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $url  URL to get name from
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  mixed   String filename or boolean false if failed
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function getFilenameFromURL($url)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										if (is_string($url))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											$parts = explode('/', $url);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
											return $parts[count($parts) - 1];
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										return false;
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Clean up temporary uploaded package and unpacked extension
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $package    Path to the uploaded package file
							 | 
						||
| 
								 | 
							
									 * @param   string  $resultdir  Path to the unpacked extension
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  boolean  True on success
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function cleanupInstall($package, $resultdir)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										$config = JFactory::getConfig();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Does the unpacked extension directory exist?
							 | 
						||
| 
								 | 
							
										if (is_dir($resultdir))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											JFolder::delete($resultdir);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										// Is the package file a valid file?
							 | 
						||
| 
								 | 
							
										if (is_file($package))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											JFile::delete($package);
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
										elseif (is_file(JPath::clean($config->get('tmp_path') . '/' . $package)))
							 | 
						||
| 
								 | 
							
										{
							 | 
						||
| 
								 | 
							
											// It might also be just a base filename
							 | 
						||
| 
								 | 
							
											JFile::delete(JPath::clean($config->get('tmp_path') . '/' . $package));
							 | 
						||
| 
								 | 
							
										}
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
									/**
							 | 
						||
| 
								 | 
							
									 * Splits contents of a sql file into array of discreet queries.
							 | 
						||
| 
								 | 
							
									 * Queries need to be delimited with end of statement marker ';'
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @param   string  $query  The SQL statement.
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @return  array  Array of queries
							 | 
						||
| 
								 | 
							
									 *
							 | 
						||
| 
								 | 
							
									 * @since   3.1
							 | 
						||
| 
								 | 
							
									 * @deprecated  13.3  Use JDatabaseDriver::splitSql() directly
							 | 
						||
| 
								 | 
							
									 * @codeCoverageIgnore
							 | 
						||
| 
								 | 
							
									 */
							 | 
						||
| 
								 | 
							
									public static function splitSql($query)
							 | 
						||
| 
								 | 
							
									{
							 | 
						||
| 
								 | 
							
										JLog::add('JInstallerHelper::splitSql() is deprecated. Use JDatabaseDriver::splitSql() instead.', JLog::WARNING, 'deprecated');
							 | 
						||
| 
								 | 
							
										$db = JFactory::getDbo();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
										return $db->splitSql($query);
							 | 
						||
| 
								 | 
							
									}
							 | 
						||
| 
								 | 
							
								}
							 |