Exemple #1
0
	public function onInstallerViewAfterLastTab()
	{
		if ($this->params->get('tab_position', 0)) {
			$this->getChanges();
		}
		$ishathor = $this->isHathor() ? 1 : 0;
		$installfrom = $this->getInstallFrom();
		$installfromon = $installfrom ? 1 : 0;

		$document = JFactory::getDocument();
		$ver = new JVersion;
		$min = JFactory::getConfig()->get('debug') ? '' : '.min';

		$installer = new JInstaller();
		$manifest = $installer->isManifest(JPATH_PLUGINS . DIRECTORY_SEPARATOR . 'installer' . DIRECTORY_SEPARATOR . 'webinstaller' . DIRECTORY_SEPARATOR . 'webinstaller.xml');

		$apps_base_url = addslashes($this->appsBaseUrl);
		$apps_installat_url = base64_encode(JURI::current(true) . '?option=com_installer&view=install');
		$apps_installfrom_url = addslashes($installfrom);
		$apps_product = base64_encode($ver->PRODUCT);
		$apps_release = base64_encode($ver->RELEASE);
		$apps_dev_level = base64_encode($ver->DEV_LEVEL);
		$btntxt = JText::_('COM_INSTALLER_MSG_INSTALL_ENTER_A_URL', true);
		$pv = base64_encode($manifest->version);
		$updatestr1 = JText::_('COM_INSTALLER_WEBINSTALLER_INSTALL_UPDATE_AVAILABLE', true);
		$obsoletestr = JText::_('COM_INSTALLER_WEBINSTALLER_INSTALL_OBSOLETE', true);
		$updatestr2 = JText::_('JLIB_INSTALLER_UPDATE', true);

		$javascript = <<<END
apps_base_url = '$apps_base_url';
apps_installat_url = '$apps_installat_url';
apps_installfrom_url = '$apps_installfrom_url';
apps_product = '$apps_product';
apps_release = '$apps_release';
apps_dev_level = '$apps_dev_level';
apps_is_hathor = $ishathor;
apps_installfromon = $installfromon;
apps_btntxt = '$btntxt';
apps_pv = '$pv';
apps_updateavail1 = '$updatestr1';
apps_updateavail2 = '$updatestr2';
apps_obsolete = '$obsoletestr';

jQuery(document).ready(function() {
	if (apps_installfromon)
	{
		jQuery('#myTabTabs a[href="#web"]').click();
	}
	var link = jQuery('#myTabTabs a[href="#web"]').get(0);
	var eventpoint = jQuery(link).closest('li');
	if (apps_is_hathor)
	{
		jQuery('#mywebinstaller').show();
		link = jQuery('#mywebinstaller a');
		eventpoint = link;
	}

	jQuery(eventpoint).click(function (event){
		if (!Joomla.apps.loaded) {
			Joomla.apps.initialize();
		}
	});
	
	if (apps_installfrom_url != '') {
		var tag = 'li';
		if (apps_is_hathor)
		{
			tag = 'a';
		}
		jQuery(link).closest(tag).click();
	}

	if (!apps_is_hathor)
	{
		if(typeof jQuery('#myTabTabs a[href="'+localStorage.getItem('tab-href')+'"]').prop('tagName') == 'undefined' ||
			localStorage.getItem('tab-href') == null ||
			localStorage.getItem('tab-href') == 'undefined' ||
			!localStorage.getItem('tab-href')) {
			window.localStorage.setItem('tab-href', jQuery('#myTabTabs a').get(0).href.replace(/^.+?#/, '#'));
		}
	
		if (apps_installfrom_url == '' && localStorage.getItem('tab-href') == '#web')
		{
			jQuery('#myTabTabs li').each(function(index, value){
				value.removeClass('active');
			});
			jQuery(eventpoint).addClass('active');
			window.localStorage.setItem('tab-href', jQuery(eventpoint).children('a').attr('href'));
			if (jQuery(eventpoint).children('a').attr('href') == '#web')
			{
				jQuery(eventpoint).click();
			}
		}
	}
});

		
END;

		$document->addScriptDeclaration($javascript);
		$document->addScript(JURI::root() . 'plugins/installer/webinstaller/js/client' . $min . '.js?jversion=' . JVERSION);
		$document->addStyleSheet(JURI::root() . 'plugins/installer/webinstaller/css/client' . $min . '.css?jversion=' . JVERSION);
	}
Exemple #2
0
 /**
  * Rebuild update sites tables.
  *
  * @return  void
  *
  * @since   3.6
  *
  * @throws  Exception on ACL error
  */
 public function rebuild()
 {
     if (!JFactory::getUser()->authorise('core.admin', 'com_installer')) {
         throw new Exception(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_NOT_PERMITTED'), 403);
     }
     $db = JFactory::getDbo();
     $app = JFactory::getApplication();
     // Check if Joomla Extension plugin is enabled.
     if (!JPluginHelper::isEnabled('extension', 'joomla')) {
         $query = $db->getQuery(true)->select($db->quoteName('extension_id'))->from($db->quoteName('#__extensions'))->where($db->quoteName('type') . ' = ' . $db->quote('plugin'))->where($db->quoteName('element') . ' = ' . $db->quote('joomla'))->where($db->quoteName('folder') . ' = ' . $db->quote('extension'));
         $db->setQuery($query);
         $pluginId = (int) $db->loadResult();
         $link = JRoute::_('index.php?option=com_plugins&task=plugin.edit&extension_id=' . $pluginId);
         $app->enqueueMessage(JText::sprintf('COM_INSTALLER_MSG_UPDATESITES_REBUILD_EXTENSION_PLUGIN_NOT_ENABLED', $link), 'error');
         return;
     }
     $clients = array(JPATH_SITE, JPATH_ADMINISTRATOR);
     $extensionGroupFolders = array('components', 'modules', 'plugins', 'templates', 'language', 'manifests');
     $pathsToSearch = array();
     // Identifies which folders to search for manifest files.
     foreach ($clients as $clientPath) {
         foreach ($extensionGroupFolders as $extensionGroupFolderName) {
             // Components, modules, plugins, templates, languages and manifest (files, libraries, etc)
             if ($extensionGroupFolderName != 'plugins') {
                 foreach (glob($clientPath . '/' . $extensionGroupFolderName . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath) {
                     array_push($pathsToSearch, $extensionFolderPath);
                 }
             } else {
                 foreach (glob($clientPath . '/' . $extensionGroupFolderName . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $pluginGroupFolderPath) {
                     foreach (glob($pluginGroupFolderPath . '/*', GLOB_NOSORT | GLOB_ONLYDIR) as $extensionFolderPath) {
                         array_push($pathsToSearch, $extensionFolderPath);
                     }
                 }
             }
         }
     }
     // Gets Joomla core update sites Ids.
     $joomlaUpdateSitesIds = implode(', ', $this->getJoomlaUpdateSitesIds(0));
     // Delete from all tables (except joomla core update sites).
     $query = $db->getQuery(true)->delete($db->quoteName('#__update_sites'))->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
     $db->setQuery($query);
     $db->execute();
     $query = $db->getQuery(true)->delete($db->quoteName('#__update_sites_extensions'))->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
     $db->setQuery($query);
     $db->execute();
     $query = $db->getQuery(true)->delete($db->quoteName('#__updates'))->where($db->quoteName('update_site_id') . ' NOT IN (' . $joomlaUpdateSitesIds . ')');
     $db->setQuery($query);
     $db->execute();
     $count = 0;
     // Gets Joomla core extension Ids.
     $joomlaCoreExtensionIds = implode(', ', $this->getJoomlaUpdateSitesIds(1));
     // Search for updateservers in manifest files inside the folders to search.
     foreach ($pathsToSearch as $extensionFolderPath) {
         $tmpInstaller = new JInstaller();
         $tmpInstaller->setPath('source', $extensionFolderPath);
         // Main folder manifests (higher priority)
         $parentXmlfiles = JFolder::files($tmpInstaller->getPath('source'), '.xml$', false, true);
         // Search for children manifests (lower priority)
         $allXmlFiles = JFolder::files($tmpInstaller->getPath('source'), '.xml$', 1, true);
         // Create an unique array of files ordered by priority
         $xmlfiles = array_unique(array_merge($parentXmlfiles, $allXmlFiles));
         if (!empty($xmlfiles)) {
             foreach ($xmlfiles as $file) {
                 // Is it a valid Joomla installation manifest file?
                 $manifest = $tmpInstaller->isManifest($file);
                 if (!is_null($manifest)) {
                     // Search if the extension exists in the extensions table. Excluding joomla core extensions (id < 10000) and discovered extensions.
                     $query = $db->getQuery(true)->select($db->quoteName('extension_id'))->from($db->quoteName('#__extensions'))->where($db->quoteName('name') . ' = ' . $db->quote($manifest->name))->where($db->quoteName('type') . ' = ' . $db->quote($manifest['type']))->where($db->quoteName('extension_id') . ' NOT IN (' . $joomlaCoreExtensionIds . ')')->where($db->quoteName('state') . ' != -1');
                     $db->setQuery($query);
                     $eid = (int) $db->loadResult();
                     if ($eid && $manifest->updateservers) {
                         // Set the manifest object and path
                         $tmpInstaller->manifest = $manifest;
                         $tmpInstaller->setPath('manifest', $file);
                         // Load the extension plugin (if not loaded yet).
                         JPluginHelper::importPlugin('extension', 'joomla');
                         // Fire the onExtensionAfterUpdate
                         JFactory::getApplication()->triggerEvent('onExtensionAfterUpdate', array('installer' => $tmpInstaller, 'eid' => $eid));
                         $count++;
                     }
                 }
             }
         }
     }
     if ($count > 0) {
         $app->enqueueMessage(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_SUCCESS'), 'message');
     } else {
         $app->enqueueMessage(JText::_('COM_INSTALLER_MSG_UPDATESITES_REBUILD_MESSAGE'), 'message');
     }
 }
 function getComponentManifestFile($com)
 {
     $short_element = str_replace('com_', '', $com);
     $manifestPath = JPATH_ADMINISTRATOR . '/components/' . $com . '/' . 'manifest.xml';
     $shortElementManifestPath = JPATH_ADMINISTRATOR . '/components/' . $com . '/' . $short_element . '.xml';
     if (JFile::exists($manifestPath)) {
         $file = $manifestPath;
     }
     if (JFile::exists($shortElementManifestPath)) {
         $file = $shortElementManifestPath;
     }
     if (empty($file)) {
         return false;
     }
     $installer = new JInstaller();
     if (version_compare(JVERSION, '1.6.0', 'ge')) {
         // Joomla! 1.6+ code here
         $manifest = $installer->isManifest($file);
     } else {
         // Joomla! 1.5 code here
         $manifest = $installer->_isManifest($file);
     }
     return $manifest;
 }
 /**
  * Tests the isManifest method
  *
  * @since   3.1
  *
  * @return  void
  */
 public function testIsManifest()
 {
     $this->assertThat($this->object->isManifest(__DIR__ . '/data/pkg_joomla.xml'), $this->isInstanceOf('SimpleXmlElement'), 'Ensure JInstaller::isManifest properly tests a valid manifest file');
 }
 function install()
 {
     $extDir = JPATH_ROOT . '/components/com_sef/sef_ext';
     $db = $this->parent->getDBO();
     $this->manifest =& $this->parent->getManifest();
     $xml = $this->manifest;
     $name = (string) $xml->name;
     $name = JFilterInput::getInstance()->clean($name, 'string');
     $this->set('name', $name);
     $description = (string) $xml->description;
     if (is_a($description, 'JSimpleXMLElement')) {
         $this->parent->set('message', JText::_($description));
     } else {
         $this->parent->set('message', '');
     }
     if (count($xml->files->children())) {
         foreach ($xml->files->children() as $file) {
             if ((string) $file->attributes()->sef_ext) {
                 $element = (string) $file->attributes()->sef_ext;
                 if (substr($element, 0, 13) != 'ext_joomsef4_') {
                     $element = 'ext_joomsef4_' . $element;
                 }
                 $this->set('element', $element);
                 break;
             }
         }
     }
     if (!empty($element)) {
         $this->parent->setPath('extension_root', $extDir);
     } else {
         $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEFEXT_INSTALL_NO_FILE', JText::_('JLIB_INSTALLER_' . $this->route)));
         return false;
     }
     $this->route = 'install';
     $query = "SELECT extension_id, state, params \n";
     $query .= "FROM #__extensions \n";
     $query .= "WHERE type=" . $db->quote('sef_ext') . " \n";
     $query .= "AND element=" . $db->quote($element);
     $db->setQuery($query);
     $ext_o = $db->loadObject();
     if (!is_null($ext_o)) {
         $id = $ext_o->extension_id;
     } else {
         $id = null;
     }
     if (file_exists($this->parent->getPath('extension_root')) && (!$this->parent->isOverwrite() || $this->parent->isUpgrade())) {
         if ($this->parent->isUpgrade() || ($this->parent->manifestClass && method_exists($this->parent->manifestClass, 'update') || is_a($xml->update, 'SimpleXMLElement'))) {
             $this->parent->setOverwrite(true);
             $this->parent->setUpgrade(true);
             if ($id && $ext_o->state != -2) {
                 $this->route = 'update';
             }
         } else {
             if (!$this->parent->isOverwrite()) {
                 $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEFEXT_INSTALL_DIRECTORY', JText::_('JLIB_INSTALLER_' . $this->route), $this->parent->getPath('extension_root')));
             }
         }
     }
     if ((string) $xml->scriptfile) {
         $script = (string) $xml->scriptfile;
         $script_file = $this->parent->getPath('source') . '/' . $script;
         if (is_file($script_file)) {
             include_once $script_file;
             $class = $element . 'InstallerScript';
             if (class_exists($class)) {
                 $this->parent->manifestClass = new $class($this);
                 $this->set('manifest_script', $script);
             }
         }
     }
     ob_start();
     ob_implicit_flush(false);
     if ($this->parent->manifestClass && method_exists($this->parent->manifestClass, 'preflight')) {
         if ($this->parent->manifestClass->preflight($this->route, $this) === false) {
             $this->parent->abort(JText::_('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_CUSTOM_INSTALL_FAILURE'));
             return false;
         }
     }
     $msg = ob_get_contents();
     ob_end_clean();
     if (!file_exists($this->parent->getPath('extension_root'))) {
         if (JFolder::create($this->parent->getPath('extension_root'))) {
             $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_CREATE_DIRECTORY', $this->parent->getPath('extension_root')));
             return false;
         }
     }
     $this->old_files = null;
     if ($this->route == 'update') {
         $old = null;
         $tmp = new JInstaller();
         $option = str_replace('ext_joomsef4_', 'com_', $this->get('element'));
         $tmp_manifest = $tmp->isManifest($this->parent->getPath('extension_root') . '/' . $option . '.xml');
         if ($tmp_manifest) {
             $this->old_files = $tmp_manifest->files;
         }
     }
     if (!$this->parent->parseFiles($xml->files, -1, $this->old_files)) {
         $this->parent->abort();
         return false;
     }
     if ($this->get('manifest_script')) {
         $path['src'] = $this->parent->getPath('source') . '/' . $this->get('manifest_script');
         $path['dest'] = $this->parent->getPath('extension_root') . '/' . $this->get('manifest_script');
         if (!file_exists($path['desc'])) {
             if (!$this->parent->copyFiles(array($path))) {
                 $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_MANIFEST', JText::_('JLIB_INSTALLER_' . $this->route)));
                 return false;
             }
         }
     }
     JTable::addIncludePath(JPATH_LIBRARIES . '/joomla/database/table');
     $row = JTable::getInstance('extension');
     if ($id && $ext_o->state != -2) {
         $row->load($id);
         $row->name = $this->get('name');
         $row->manifest_cache = $this->parent->generateManifestCache();
         $row->store();
     } else {
         if (is_object($ext_o) && $ext_o->state == -2) {
             $row->extension_id = $id;
         }
         $row->name = $this->get('name');
         $row->type = 'sef_ext';
         $row->element = $element;
         $row->enabled = 1;
         $row->protected = 0;
         $row->access = 1;
         $row->client_id = 0;
         $row->state = 0;
         if (!is_object($ext_o) || $ext_o->state != -2) {
             if (isset($this->manifest->install->defaultParams)) {
                 $row->params = SEFTools::getDefaultParams($this->manifest->install->defaultParams);
             }
             if (isset($this->manifest->install->defaultFilters)) {
                 $row->custom_data = SEFTools::getDefaultFilters($this->manifest->install->defaultFilters);
             }
         }
         $row->system_data = '';
         $row->manifest_cache = $this->parent->generateManifestCache();
         if (!$row->store()) {
             $this->parent->abort(Jtext::sprintf('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_ROLLBACK', JText::_('JLIB_INSTALLER_' . $this->route), $db->stderr(true)));
             return false;
         }
         $this->parent->pushStep(array('type' => 'extension', 'id' => $row->extension_id));
         $id = $row->extension_id;
     }
     if ($this->route == 'install') {
         $utfresult = $this->parent->parseSQLFiles($this->manifest->install->sql);
         if ($utfresult === false) {
             // Install failed, rollback changes
             $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_SQL_ERROR', JText::_('JLIB_INSTALLER_' . $this->route), $db->stderr(true)));
             return false;
         }
         if ($this->manifest->update) {
             $this->parent->setSchemaVersion($this->manifest->update->schemas, $row->extension_id);
         } else {
             $query = "SELECT COUNT(*) FROM #__schemas \n";
             $query .= "WHERE extension_id=" . $row->extension_id;
             $db->setQuery($query);
             $cnt = $db->loadResult();
             if ($cnt == 0) {
                 $query = "INSERT INTO #__schemas \n";
                 $query .= "SET extension_id=" . $row->extension_id . ", version_id=" . $db->quote((string) $xml->version);
             } else {
                 $query = "UPDATE #__schemas \n";
                 $query .= "SET version_id=" . $db->quote((string) $xml->version) . " \n";
                 $query .= "WHERE extension_id=" . $row->extension_id . " \n";
             }
             $db->setQuery($query);
             $db->query();
         }
     } else {
         if ($this->manifest->update) {
             if (isset($this->manifest->update->schemas)) {
                 $result = $this->parent->parseSchemaUpdates($this->manifest->update->schemas, $row->extension_id);
                 if ($result === false) {
                     $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEF_UPDATE_SQL_ERROR', JText::_('JLIB_INSTALLER_' . $this->route), $db->stderr(true)));
                     return false;
                 }
             }
         } else {
             $query = "SELECT COUNT(*) FROM #__schemas \n";
             $query .= "WHERE extension_id=" . $row->extension_id;
             $db->setQuery($query);
             $cnt = $db->loadResult();
             if ($cnt == 0) {
                 $query = "INSERT INTO #__schemas \n";
                 $query .= "SET extension_id=" . $row->extension_id . ", version_id=" . $db->quote((string) $xml->version);
             } else {
                 $query = "UPDATE #__schemas \n";
                 $query .= "SET version_id=" . $db->quote((string) $xml->version) . " \n";
                 $query .= "WHERE extension_id=" . $row->extension_id . " \n";
             }
             $db->setQuery($query);
             $db->query();
         }
     }
     // Remove any pending updates in Joomla update cache
     $update = JTable::getInstance('update');
     $uid = $update->find(array('element' => $element, 'type' => 'sef_ext', 'client_id' => '', 'folder' => ''));
     if ($uid) {
         $update->delete($uid);
     }
     ob_start();
     ob_implicit_flush(false);
     if ($this->parent->manifestClass && method_exists($this->parent->manifestClass, $this->route)) {
         if ($this->parent->manifestClass->{$this->route}($this) === false) {
             $this->parent->abort(JText::_('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_CUSTOM_INSTALL_FAILURE'));
             return false;
         }
     }
     $msg .= ob_get_contents();
     ob_end_clean();
     if (!$this->parent->copyManifest(-1)) {
         $this->parent->abort(JText::sprintf('COM_SEF_INSTALLER_ABORT_SEF_INSTALL_COPY_SETUP', JText::_('JLIB_INSTALLER_' . $this->route)));
         return false;
     }
     ob_start();
     ob_implicit_flush(false);
     if ($this->parent->manifestClass && method_exists($this->parent->manifestClass, 'postflight')) {
         $this->parent->manifestClass->postflight($this->route, $this);
     }
     $msg .= ob_get_contents();
     ob_end_clean();
     if ($msg != '') {
         $this->parent->set('extension_message', $msg);
     }
     // Remove already created URLs for this extension from database
     // 25.4.2012: Only remove automatic URLs that are not locked!
     $component = str_replace('ext_joomsef4_', 'com_', $element);
     $query = "DELETE FROM `#__sefurls` WHERE (`origurl` LIKE '%option={$component}&%' OR `origurl` LIKE '%option={$component}') AND `dateadd` = '0000-00-00' AND `locked` = 0";
     $db->setQuery($query);
     if (!$db->query()) {
         $this->parent->abort(JText::_('COM_SEF_SEF_EXTENSION') . ' ' . JText::_('COM_SEF_INSTALL') . ': ' . JText::_('COM_SEF_ERROR_SQL') . " " . $db->stderr(true));
         return false;
     }
     return $id;
 }