236 lines
5.9 KiB
PHP
236 lines
5.9 KiB
PHP
|
|
<?php
|
||
|
|
/**
|
||
|
|
* @version $Id: install.php 14401 2010-01-26 14:10:00Z louis $
|
||
|
|
* @package Joomla
|
||
|
|
* @subpackage Menus
|
||
|
|
* @copyright Copyright (C) 2005 - 2010 Open Source Matters. All rights reserved.
|
||
|
|
* @license GNU/GPL, see LICENSE.php
|
||
|
|
* Joomla! is free software. This version may have been modified pursuant to the
|
||
|
|
* GNU General Public License, and as distributed it includes or is derivative
|
||
|
|
* of works licensed under the GNU General Public License or other free or open
|
||
|
|
* source software licenses. See COPYRIGHT.php for copyright notices and
|
||
|
|
* details.
|
||
|
|
*/
|
||
|
|
|
||
|
|
// Check to ensure this file is included in Joomla!
|
||
|
|
defined('_JEXEC') or die( 'Restricted access' );
|
||
|
|
|
||
|
|
jimport( 'joomla.application.component.model' );
|
||
|
|
jimport( 'joomla.installer.installer' );
|
||
|
|
jimport('joomla.installer.helper');
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Extension Manager Install Model
|
||
|
|
*
|
||
|
|
* @package Joomla
|
||
|
|
* @subpackage Installer
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
class InstallerModelInstall extends JModel
|
||
|
|
{
|
||
|
|
/** @var object JTable object */
|
||
|
|
var $_table = null;
|
||
|
|
|
||
|
|
/** @var object JTable object */
|
||
|
|
var $_url = null;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Overridden constructor
|
||
|
|
* @access protected
|
||
|
|
*/
|
||
|
|
function __construct()
|
||
|
|
{
|
||
|
|
parent::__construct();
|
||
|
|
|
||
|
|
}
|
||
|
|
|
||
|
|
function install()
|
||
|
|
{
|
||
|
|
global $mainframe;
|
||
|
|
|
||
|
|
$this->setState('action', 'install');
|
||
|
|
|
||
|
|
switch(JRequest::getWord('installtype'))
|
||
|
|
{
|
||
|
|
case 'folder':
|
||
|
|
$package = $this->_getPackageFromFolder();
|
||
|
|
break;
|
||
|
|
|
||
|
|
case 'upload':
|
||
|
|
$package = $this->_getPackageFromUpload();
|
||
|
|
break;
|
||
|
|
|
||
|
|
case 'url':
|
||
|
|
$package = $this->_getPackageFromUrl();
|
||
|
|
break;
|
||
|
|
|
||
|
|
default:
|
||
|
|
$this->setState('message', 'No Install Type Found');
|
||
|
|
return false;
|
||
|
|
break;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Was the package unpacked?
|
||
|
|
if (!$package) {
|
||
|
|
$this->setState('message', 'Unable to find install package');
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Get a database connector
|
||
|
|
//$db = & JFactory::getDBO();
|
||
|
|
|
||
|
|
// 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('INSTALLEXT', JText::_($package['type']), JText::_('Error'));
|
||
|
|
$result = false;
|
||
|
|
} else {
|
||
|
|
// Package installed sucessfully
|
||
|
|
$msg = JText::sprintf('INSTALLEXT', JText::_($package['type']), JText::_('Success'));
|
||
|
|
$result = true;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Set some model state values
|
||
|
|
$mainframe->enqueueMessage($msg);
|
||
|
|
$this->setState('name', $installer->get('name'));
|
||
|
|
$this->setState('result', $result);
|
||
|
|
$this->setState('message', $installer->message);
|
||
|
|
$this->setState('extension.message', $installer->get('extension.message'));
|
||
|
|
|
||
|
|
// Cleanup the install files
|
||
|
|
if (!is_file($package['packagefile'])) {
|
||
|
|
$config =& JFactory::getConfig();
|
||
|
|
$package['packagefile'] = $config->getValue('config.tmp_path').DS.$package['packagefile'];
|
||
|
|
}
|
||
|
|
|
||
|
|
JInstallerHelper::cleanupInstall($package['packagefile'], $package['extractdir']);
|
||
|
|
|
||
|
|
return $result;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* @param string The class name for the installer
|
||
|
|
*/
|
||
|
|
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('SOME_ERROR_CODE', JText::_('WARNINSTALLFILE'));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Make sure that zlib is loaded so that the package can be unpacked
|
||
|
|
if (!extension_loaded('zlib')) {
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE', JText::_('WARNINSTALLZLIB'));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// If there is no uploaded file, we have a problem...
|
||
|
|
if (!is_array($userfile) ) {
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE', JText::_('No file selected'));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Check if there was a problem uploading the file.
|
||
|
|
if ( $userfile['error'] || $userfile['size'] < 1 )
|
||
|
|
{
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE', JText::_('WARNINSTALLUPLOADERROR'));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
// Build the appropriate paths
|
||
|
|
$config =& JFactory::getConfig();
|
||
|
|
$tmp_dest = $config->getValue('config.tmp_path').DS.$userfile['name'];
|
||
|
|
$tmp_src = $userfile['tmp_name'];
|
||
|
|
|
||
|
|
// Move uploaded file
|
||
|
|
jimport('joomla.filesystem.file');
|
||
|
|
$uploaded = JFile::upload($tmp_src, $tmp_dest);
|
||
|
|
|
||
|
|
// Unpack the downloaded package file
|
||
|
|
$package = JInstallerHelper::unpack($tmp_dest);
|
||
|
|
|
||
|
|
return $package;
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Install an extension from a directory
|
||
|
|
*
|
||
|
|
* @static
|
||
|
|
* @return boolean True on success
|
||
|
|
* @since 1.0
|
||
|
|
*/
|
||
|
|
function _getPackageFromFolder()
|
||
|
|
{
|
||
|
|
// Get the path to the package to install
|
||
|
|
$p_dir = JRequest::getString('install_directory');
|
||
|
|
$p_dir = JPath::clean( $p_dir );
|
||
|
|
|
||
|
|
// Did you give us a valid directory?
|
||
|
|
if (!is_dir($p_dir)) {
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE', JText::_('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('SOME_ERROR_CODE', JText::_('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
|
||
|
|
*
|
||
|
|
* @static
|
||
|
|
* @return boolean True on success
|
||
|
|
* @since 1.5
|
||
|
|
*/
|
||
|
|
function _getPackageFromUrl()
|
||
|
|
{
|
||
|
|
// Get a database connector
|
||
|
|
$db = & JFactory::getDBO();
|
||
|
|
|
||
|
|
// Get the URL of the package to install
|
||
|
|
$url = JRequest::getString('install_url');
|
||
|
|
|
||
|
|
// Did you give us a URL?
|
||
|
|
if (!$url) {
|
||
|
|
JError::raiseWarning('SOME_ERROR_CODE', JText::_('Please 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('SOME_ERROR_CODE', JText::_('Invalid URL'));
|
||
|
|
return false;
|
||
|
|
}
|
||
|
|
|
||
|
|
$config =& JFactory::getConfig();
|
||
|
|
$tmp_dest = $config->getValue('config.tmp_path');
|
||
|
|
|
||
|
|
// Unpack the downloaded package file
|
||
|
|
$package = JInstallerHelper::unpack($tmp_dest.DS.$p_file);
|
||
|
|
|
||
|
|
return $package;
|
||
|
|
}
|
||
|
|
}
|