You've already forked joomla_test
							
							
		
			
	
	
		
			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; | ||
|  | 	} | ||
|  | } |