File: /var/www/vhosts/pgkdistribution.com.au/citisolar.com.au/libraries/joomla/installer/helper.php
<?php
/**
* @package Joomla.Platform
* @subpackage Installer
*
* @copyright Copyright (C) 2005 - 2012 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.archive');
jimport('joomla.filesystem.path');
/**
* Installer helper class
*
* @package Joomla.Platform
* @subpackage Installer
* @since 11.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 11.1
*/
public static function downloadPackage($url, $target = false)
{
$config = JFactory::getConfig();
// Capture PHP errors
$php_errormsg = 'Error Unknown';
$track_errors = ini_get('track_errors');
ini_set('track_errors', true);
// Set user agent
$version = new JVersion;
ini_set('user_agent', $version->getUserAgent('Installer'));
// Open the remote server socket for reading
$inputHandle = @ fopen($url, "r");
$error = strstr($php_errormsg, 'failed to open stream:');
if (!$inputHandle)
{
JError::raiseWarning(42, JText::sprintf('JLIB_INSTALLER_ERROR_DOWNLOAD_SERVER_CONNECT', $error));
return false;
}
$meta_data = stream_get_meta_data($inputHandle);
foreach ($meta_data['wrapper_data'] as $wrapper_data)
{
if (substr($wrapper_data, 0, strlen("Content-Disposition")) == "Content-Disposition")
{
$contentfilename = explode("\"", $wrapper_data);
$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);
}
// Initialise contents buffer
$contents = null;
while (!feof($inputHandle))
{
$contents .= fread($inputHandle, 4096);
if ($contents === false)
{
JError::raiseWarning(44, JText::sprintf('JLIB_INSTALLER_ERROR_FAILED_READING_NETWORK_RESOURCES', $php_errormsg));
return false;
}
}
// Write buffer to file
JFile::write($target, $contents);
// Close file pointer resource
fclose($inputHandle);
// 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 array Two elements: extractdir and packagefile
*
* @since 11.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
$result = JArchive::extract($archivename, $extractdir);
if ($result === false)
{
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.
*/
if ($retval['type'] = self::detectType($extractdir))
{
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 11.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))
{
JError::raiseWarning(1, JText::_('JLIB_INSTALLER_ERROR_NOTFINDXMLSETUPFILE'));
return false;
}
foreach ($files as $file)
{
if (!$xml = JFactory::getXML($file))
{
continue;
}
if ($xml->getName() != 'install' && $xml->getName() != 'extension')
{
unset($xml);
continue;
}
$type = (string) $xml->attributes()->type;
// Free up memory
unset($xml);
return $type;
}
JError::raiseWarning(1, JText::_('JLIB_INSTALLER_ERROR_NOTFINDJOOMLAXMLSETUPFILE'));
// 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 11.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 11.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 $sql The SQL statement.
*
* @return array Array of queries
*
* @since 11.1
*/
public static function splitSql($sql)
{
$db = JFactory::getDbo();
return $db->splitSql($sql);
}
}