277 lines
7.1 KiB
PHP
277 lines
7.1 KiB
PHP
<?php
|
|
/**
|
|
* @package Joomla.Administrator
|
|
* @subpackage com_installer
|
|
*
|
|
* @copyright Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
|
|
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
|
*/
|
|
|
|
defined('_JEXEC') or die;
|
|
|
|
/**
|
|
* Extension Manager Install Model
|
|
*
|
|
* @package Joomla.Administrator
|
|
* @subpackage com_installer
|
|
* @since 1.5
|
|
*/
|
|
class InstallerModelInstall extends JModelLegacy
|
|
{
|
|
/**
|
|
* @var object JTable object
|
|
*/
|
|
protected $_table = null;
|
|
|
|
/**
|
|
* @var object JTable object
|
|
*/
|
|
protected $_url = null;
|
|
|
|
/**
|
|
* Model context string.
|
|
*
|
|
* @var string
|
|
*/
|
|
protected $_context = 'com_installer.install';
|
|
|
|
/**
|
|
* Method to auto-populate the model state.
|
|
*
|
|
* Note. Calling getState in this method will result in recursion.
|
|
*
|
|
* @return void
|
|
*
|
|
* @since 1.6
|
|
*/
|
|
protected function populateState()
|
|
{
|
|
$app = JFactory::getApplication('administrator');
|
|
|
|
$this->setState('message', $app->getUserState('com_installer.message'));
|
|
$this->setState('extension_message', $app->getUserState('com_installer.extension_message'));
|
|
$app->setUserState('com_installer.message', '');
|
|
$app->setUserState('com_installer.extension_message', '');
|
|
|
|
// Recall the 'Install from Directory' path.
|
|
$path = $app->getUserStateFromRequest($this->_context . '.install_directory', 'install_directory', $app->getCfg('tmp_path'));
|
|
$this->setState('install.directory', $path);
|
|
parent::populateState();
|
|
}
|
|
|
|
/**
|
|
* Install an extension from either folder, url or upload.
|
|
*
|
|
* @return boolean result of install
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
public function install()
|
|
{
|
|
$this->setState('action', 'install');
|
|
|
|
// Set FTP credentials, if given.
|
|
JClientHelper::setCredentialsFromRequest('ftp');
|
|
$app = JFactory::getApplication();
|
|
|
|
switch ($app->input->getWord('installtype'))
|
|
{
|
|
case 'folder':
|
|
// Remember the 'Install from Directory' path.
|
|
$app->getUserStateFromRequest($this->_context . '.install_directory', 'install_directory');
|
|
$package = $this->_getPackageFromFolder();
|
|
break;
|
|
|
|
case 'upload':
|
|
$package = $this->_getPackageFromUpload();
|
|
break;
|
|
|
|
case 'url':
|
|
$package = $this->_getPackageFromUrl();
|
|
break;
|
|
|
|
default:
|
|
$app->setUserState('com_installer.message', JText::_('COM_INSTALLER_NO_INSTALL_TYPE_FOUND'));
|
|
return false;
|
|
break;
|
|
}
|
|
|
|
// Was the package unpacked?
|
|
if (!$package)
|
|
{
|
|
$app->setUserState('com_installer.message', JText::_('COM_INSTALLER_UNABLE_TO_FIND_INSTALL_PACKAGE'));
|
|
return false;
|
|
}
|
|
|
|
// Get an installer instance
|
|
$installer = JInstaller::getInstance();
|
|
|
|
// Install the package
|
|
if (!$installer->install($package['dir']))
|
|
{
|
|
// There was an error installing the package
|
|
$msg = JText::sprintf('COM_INSTALLER_INSTALL_ERROR', JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type'])));
|
|
$result = false;
|
|
}
|
|
else
|
|
{
|
|
// Package installed sucessfully
|
|
$msg = JText::sprintf('COM_INSTALLER_INSTALL_SUCCESS', JText::_('COM_INSTALLER_TYPE_TYPE_' . strtoupper($package['type'])));
|
|
$result = true;
|
|
}
|
|
|
|
// Set some model state values
|
|
$app = JFactory::getApplication();
|
|
$app->enqueueMessage($msg);
|
|
$this->setState('name', $installer->get('name'));
|
|
$this->setState('result', $result);
|
|
$app->setUserState('com_installer.message', $installer->message);
|
|
$app->setUserState('com_installer.extension_message', $installer->get('extension_message'));
|
|
$app->setUserState('com_installer.redirect_url', $installer->get('redirect_url'));
|
|
|
|
// Cleanup the install files
|
|
if (!is_file($package['packagefile']))
|
|
{
|
|
$config = JFactory::getConfig();
|
|
$package['packagefile'] = $config->get('tmp_path') . '/' . $package['packagefile'];
|
|
}
|
|
|
|
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
|
|
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* Works out an installation package from a HTTP upload
|
|
*
|
|
* @return package definition or false on failure
|
|
*/
|
|
protected function _getPackageFromUpload()
|
|
{
|
|
// Get the uploaded file information
|
|
$userfile = JRequest::getVar('install_package', null, 'files', 'array');
|
|
|
|
// Make sure that file uploads are enabled in php
|
|
if (!(bool) ini_get('file_uploads'))
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE'));
|
|
return false;
|
|
}
|
|
|
|
// Make sure that zlib is loaded so that the package can be unpacked
|
|
if (!extension_loaded('zlib'))
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB'));
|
|
return false;
|
|
}
|
|
|
|
// If there is no uploaded file, we have a problem...
|
|
if (!is_array($userfile))
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED'));
|
|
return false;
|
|
}
|
|
|
|
// Check if there was a problem uploading the file.
|
|
if ($userfile['error'] || $userfile['size'] < 1)
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'));
|
|
return false;
|
|
}
|
|
|
|
// Build the appropriate paths
|
|
$config = JFactory::getConfig();
|
|
$tmp_dest = $config->get('tmp_path') . '/' . $userfile['name'];
|
|
$tmp_src = $userfile['tmp_name'];
|
|
|
|
// Move uploaded file
|
|
jimport('joomla.filesystem.file');
|
|
JFile::upload($tmp_src, $tmp_dest);
|
|
|
|
// Unpack the downloaded package file
|
|
$package = JInstallerHelper::unpack($tmp_dest);
|
|
|
|
return $package;
|
|
}
|
|
|
|
/**
|
|
* Install an extension from a directory
|
|
*
|
|
* @return array Package details or false on failure
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
protected function _getPackageFromFolder()
|
|
{
|
|
$input = JFactory::getApplication()->input;
|
|
|
|
// Get the path to the package to install
|
|
$p_dir = $input->getString('install_directory');
|
|
$p_dir = JPath::clean($p_dir);
|
|
|
|
// Did you give us a valid directory?
|
|
if (!is_dir($p_dir))
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY'));
|
|
return false;
|
|
}
|
|
|
|
// Detect the package type
|
|
$type = JInstallerHelper::detectType($p_dir);
|
|
|
|
// Did you give us a valid package?
|
|
if (!$type)
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'));
|
|
return false;
|
|
}
|
|
|
|
$package['packagefile'] = null;
|
|
$package['extractdir'] = null;
|
|
$package['dir'] = $p_dir;
|
|
$package['type'] = $type;
|
|
|
|
return $package;
|
|
}
|
|
|
|
/**
|
|
* Install an extension from a URL
|
|
*
|
|
* @return Package details or false on failure
|
|
*
|
|
* @since 1.5
|
|
*/
|
|
protected function _getPackageFromUrl()
|
|
{
|
|
$input = JFactory::getApplication()->input;
|
|
|
|
// Get the URL of the package to install
|
|
$url = $input->getString('install_url');
|
|
|
|
// Did you give us a URL?
|
|
if (!$url)
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL'));
|
|
return false;
|
|
}
|
|
|
|
// Download the package at the URL given
|
|
$p_file = JInstallerHelper::downloadPackage($url);
|
|
|
|
// Was the package downloaded?
|
|
if (!$p_file)
|
|
{
|
|
JError::raiseWarning('', JText::_('COM_INSTALLER_MSG_INSTALL_INVALID_URL'));
|
|
return false;
|
|
}
|
|
|
|
$config = JFactory::getConfig();
|
|
$tmp_dest = $config->get('tmp_path');
|
|
|
|
// Unpack the downloaded package file
|
|
$package = JInstallerHelper::unpack($tmp_dest . '/' . $p_file);
|
|
|
|
return $package;
|
|
}
|
|
}
|