Source for file install.php

Documentation is available at install.php

  1. <?php
  2. /**
  3.  * @package     Joomla.Administrator
  4.  * @subpackage  com_installer
  5.  *
  6.  * @copyright   Copyright (C) 2005 - 2013 Open Source Matters, Inc. All rights reserved.
  7.  * @license     GNU General Public License version 2 or later; see LICENSE.txt
  8.  */
  9.  
  10. defined('_JEXEC'or die;
  11.  
  12. /**
  13.  * Extension Manager Install Model
  14.  *
  15.  * @package     Joomla.Administrator
  16.  * @subpackage  com_installer
  17.  * @since       1.5
  18.  */
  19. {
  20.     /**
  21.      * @var object JTable object
  22.      */
  23.     protected $_table = null;
  24.  
  25.     /**
  26.      * @var object JTable object
  27.      */
  28.     protected $_url = null;
  29.  
  30.     /**
  31.      * Model context string.
  32.      *
  33.      * @var        string 
  34.      */
  35.     protected $_context = 'com_installer.install';
  36.  
  37.     /**
  38.      * Method to auto-populate the model state.
  39.      *
  40.      * Note. Calling getState in this method will result in recursion.
  41.      *
  42.      * @return  void 
  43.      *
  44.      * @since   1.6
  45.      */
  46.     protected function populateState()
  47.     {
  48.         $app JFactory::getApplication('administrator');
  49.  
  50.         $this->setState('message'$app->getUserState('com_installer.message'));
  51.         $this->setState('extension_message'$app->getUserState('com_installer.extension_message'));
  52.         $app->setUserState('com_installer.message''');
  53.         $app->setUserState('com_installer.extension_message''');
  54.  
  55.         // Recall the 'Install from Directory' path.
  56.         $path $app->getUserStateFromRequest($this->_context . '.install_directory''install_directory'$app->getCfg('tmp_path'));
  57.         $this->setState('install.directory'$path);
  58.         parent::populateState();
  59.     }
  60.  
  61.     /**
  62.      * Install an extension from either folder, url or upload.
  63.      *
  64.      * @return  boolean result of install
  65.      *
  66.      * @since   1.5
  67.      */
  68.     public function install()
  69.     {
  70.         $this->setState('action''install');
  71.  
  72.         // Set FTP credentials, if given.
  73.         JClientHelper::setCredentialsFromRequest('ftp');
  74.         $app JFactory::getApplication();
  75.  
  76.         // Load installer plugins for assistance if required:
  77.         JPluginHelper::importPlugin('installer');
  78.         $dispatcher JEventDispatcher::getInstance();
  79.  
  80.         $package null;
  81.  
  82.         // This event allows an input pre-treatment, a custom pre-packing or custom installation (e.g. from a JSON description)
  83.         $results $dispatcher->trigger('onInstallerBeforeInstallation'array($this&$package));
  84.  
  85.         if (in_array(true$resultstrue))
  86.         {
  87.             return true;
  88.         }
  89.         elseif (in_array(false$resultstrue))
  90.         {
  91.             return false;
  92.         }
  93.  
  94.         $installType $app->input->getWord('installtype');
  95.  
  96.         if ($package === null)
  97.         {
  98.             switch ($installType)
  99.             {
  100.                 case 'folder':
  101.                     // Remember the 'Install from Directory' path.
  102.                     $app->getUserStateFromRequest($this->_context . '.install_directory''install_directory');
  103.                     $package $this->_getPackageFromFolder();
  104.                     break;
  105.  
  106.                 case 'upload':
  107.                     $package $this->_getPackageFromUpload();
  108.                     break;
  109.  
  110.                 case 'url':
  111.                     $package $this->_getPackageFromUrl();
  112.                     break;
  113.  
  114.                 default:
  115.                     $app->setUserState('com_installer.message'JText::_('COM_INSTALLER_NO_INSTALL_TYPE_FOUND'));
  116.  
  117.                     return false;
  118.                     break;
  119.             }
  120.         }
  121.  
  122.         // This event allows a custom installation of the package or a customization of the package:
  123.         $results $dispatcher->trigger('onInstallerBeforeInstaller'array($this&$package));
  124.  
  125.         if (in_array(true$resultstrue))
  126.         {
  127.             return true;
  128.         }
  129.         elseif (in_array(false$resultstrue))
  130.         {
  131.             if (in_array($installTypearray('upload''url')))
  132.             {
  133.                 JInstallerHelper::cleanupInstall($package['packagefile']$package['extractdir']);
  134.             }
  135.  
  136.             return false;
  137.         }
  138.  
  139.         // Was the package unpacked?
  140.         if (!$package || !$package['type'])
  141.         {
  142.             if (in_array($installTypearray('upload''url')))
  143.             {
  144.                 JInstallerHelper::cleanupInstall($package['packagefile']$package['extractdir']);
  145.             }
  146.  
  147.             $app->setUserState('com_installer.message'JText::_('COM_INSTALLER_UNABLE_TO_FIND_INSTALL_PACKAGE'));
  148.             return false;
  149.         }
  150.  
  151.         // Get an installer instance
  152.         $installer JInstaller::getInstance();
  153.  
  154.         // Install the package
  155.         if (!$installer->install($package['dir']))
  156.         {
  157.             // There was an error installing the package
  158.             $msg JText::sprintf('COM_INSTALLER_INSTALL_ERROR'JText::_('COM_INSTALLER_TYPE_TYPE_' strtoupper($package['type'])));
  159.             $result false;
  160.         }
  161.         else
  162.         {
  163.             // Package installed sucessfully
  164.             $msg JText::sprintf('COM_INSTALLER_INSTALL_SUCCESS'JText::_('COM_INSTALLER_TYPE_TYPE_' strtoupper($package['type'])));
  165.             $result true;
  166.         }
  167.  
  168.         // This event allows a custom a post-flight:
  169.         $dispatcher->trigger('onInstallerAfterInstaller'array($this&$package$installer&$result&$msg));
  170.  
  171.         // Set some model state values
  172.         $app    JFactory::getApplication();
  173.         $app->enqueueMessage($msg);
  174.         $this->setState('name'$installer->get('name'));
  175.         $this->setState('result'$result);
  176.         $app->setUserState('com_installer.message'$installer->message);
  177.         $app->setUserState('com_installer.extension_message'$installer->get('extension_message'));
  178.         $app->setUserState('com_installer.redirect_url'$installer->get('redirect_url'));
  179.  
  180.         // Cleanup the install files
  181.         if (!is_file($package['packagefile']))
  182.         {
  183.             $config JFactory::getConfig();
  184.             $package['packagefile'$config->get('tmp_path''/' $package['packagefile'];
  185.         }
  186.  
  187.         JInstallerHelper::cleanupInstall($package['packagefile']$package['extractdir']);
  188.  
  189.         return $result;
  190.     }
  191.  
  192.     /**
  193.      * Works out an installation package from a HTTP upload
  194.      *
  195.      * @return package definition or false on failure
  196.      */
  197.     protected function _getPackageFromUpload()
  198.     {
  199.         // Get the uploaded file information
  200.         $userfile JRequest::getVar('install_package'null'files''array');
  201.  
  202.         // Make sure that file uploads are enabled in php
  203.         if (!(bool) ini_get('file_uploads'))
  204.         {
  205.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLFILE'));
  206.             return false;
  207.         }
  208.  
  209.         // Make sure that zlib is loaded so that the package can be unpacked
  210.         if (!extension_loaded('zlib'))
  211.         {
  212.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLZLIB'));
  213.             return false;
  214.         }
  215.  
  216.         // If there is no uploaded file, we have a problem...
  217.         if (!is_array($userfile))
  218.         {
  219.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_NO_FILE_SELECTED'));
  220.             return false;
  221.         }
  222.  
  223.         // Check if there was a problem uploading the file.
  224.         if ($userfile['error'|| $userfile['size'1)
  225.         {
  226.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_WARNINSTALLUPLOADERROR'));
  227.             return false;
  228.         }
  229.  
  230.         // Build the appropriate paths
  231.         $config        JFactory::getConfig();
  232.         $tmp_dest    $config->get('tmp_path''/' $userfile['name'];
  233.         $tmp_src    $userfile['tmp_name'];
  234.  
  235.         // Move uploaded file
  236.         jimport('joomla.filesystem.file');
  237.         JFile::upload($tmp_src$tmp_dest);
  238.  
  239.         // Unpack the downloaded package file
  240.         $package JInstallerHelper::unpack($tmp_desttrue);
  241.  
  242.         return $package;
  243.     }
  244.  
  245.     /**
  246.      * Install an extension from a directory
  247.      *
  248.      * @return  array  Package details or false on failure
  249.      *
  250.      * @since   1.5
  251.      */
  252.     protected function _getPackageFromFolder()
  253.     {
  254.         $input JFactory::getApplication()->input;
  255.  
  256.         // Get the path to the package to install
  257.         $p_dir $input->getString('install_directory');
  258.         $p_dir JPath::clean($p_dir);
  259.  
  260.         // Did you give us a valid directory?
  261.         if (!is_dir($p_dir))
  262.         {
  263.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_PLEASE_ENTER_A_PACKAGE_DIRECTORY'));
  264.             return false;
  265.         }
  266.  
  267.         // Detect the package type
  268.         $type JInstallerHelper::detectType($p_dir);
  269.  
  270.         // Did you give us a valid package?
  271.         if (!$type)
  272.         {
  273.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_PATH_DOES_NOT_HAVE_A_VALID_PACKAGE'));
  274.         }
  275.  
  276.         $package['packagefile'null;
  277.         $package['extractdir'null;
  278.         $package['dir'$p_dir;
  279.         $package['type'$type;
  280.  
  281.         return $package;
  282.     }
  283.  
  284.     /**
  285.      * Install an extension from a URL
  286.      *
  287.      * @return  Package details or false on failure
  288.      *
  289.      * @since   1.5
  290.      */
  291.     protected function _getPackageFromUrl()
  292.     {
  293.         $input JFactory::getApplication()->input;
  294.  
  295.         // Get the URL of the package to install
  296.         $url $input->getString('install_url');
  297.  
  298.         // Did you give us a URL?
  299.         if (!$url)
  300.         {
  301.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL'));
  302.             return false;
  303.         }
  304.  
  305.         // Handle updater XML file case:
  306.         if (preg_match('/\.xml\s*$/'$url))
  307.         {
  308.             jimport('joomla.updater.update');
  309.             $update new JUpdate;
  310.             $update->loadFromXML($url);
  311.             $package_url trim($update->get('downloadurl'false)->_data);
  312.             if ($package_url)
  313.             {
  314.                 $url $package_url;
  315.             }
  316.             unset($update);
  317.         }
  318.  
  319.         // Download the package at the URL given
  320.         $p_file JInstallerHelper::downloadPackage($url);
  321.  
  322.         // Was the package downloaded?
  323.         if (!$p_file)
  324.         {
  325.             JError::raiseWarning(''JText::_('COM_INSTALLER_MSG_INSTALL_INVALID_URL'));
  326.             return false;
  327.         }
  328.  
  329.         $config   JFactory::getConfig();
  330.         $tmp_dest $config->get('tmp_path');
  331.  
  332.         // Unpack the downloaded package file
  333.         $package JInstallerHelper::unpack($tmp_dest '/' $p_filetrue);
  334.  
  335.         return $package;
  336.     }
  337. }

Documentation generated on Tue, 19 Nov 2013 15:05:38 +0100 by phpDocumentor 1.4.3