%PDF- %PDF-
Direktori : /home1/lightco1/www/lightingrepublic.com.au/administrator/components/com_extman/install/ |
Current File : //home1/lightco1/www/lightingrepublic.com.au/administrator/components/com_extman/install/helper.php |
<?php /** * @package EXTman * @copyright Copyright (C) 2011 - 2013 Timble CVBA. (http://www.timble.net) * @license GNU GPLv3 <http://www.gnu.org/licenses/gpl.html> * @link http://www.joomlatools.com */ class ComExtmanInstallerHelper { public function getVersion() { return version_compare(JVERSION, '1.6', '<') ? '1.5' : '2.5'; } public function getServerErrors() { $errors = array(); if(!class_exists('mysqli')) { $errors[] = JText::_("We're sorry but your server isn't configured with the MySQLi database driver. Please contact your host and ask them to enable MySQLi for your server."); } if(version_compare(phpversion(), '5.2', '<')) { $errors[] = sprintf(JText::_("EXTman requires PHP 5.2 or later. Your server is running PHP %s."), phpversion()); } if(version_compare(JFactory::getDBO()->getVersion(), '5.0.41', '<')) { $errors[] = sprintf(JText::_("EXTman requires MySQL 5.0.41 or later. Your server is running MySQL %s."), JFactory::getDBO()->getVersion()); } if (class_exists('Koowa') && (!method_exists('Koowa', 'getInstance') || version_compare(Koowa::getInstance()->getVersion(), '12', '<'))) { $errors[] = sprintf(JText::_("Your site has an older version of our library already installed. Installation is aborting to prevent creating conflicts with other extensions.")); } //Some hosts that specialize on Joomla are known to lock permissions to the libraries folder if(!is_writable(JPATH_LIBRARIES)) { $errors[] = sprintf(JText::_("The <em title=\"%s\">libraries</em> folder needs to be writable in order for EXTman to install correctly."), JPATH_LIBRARIES); } if (count($errors) === 0 && $this->checkDatabaseType() === false) { $string = $this->getVersion() === '1.5' ? 'mysqli' : 'MySQLi'; $link = JRoute::_('index.php?option=com_config'); $errors[] = "In order to use Joomlatools extensions, your database type in Global Configuration should be set to <strong>$string</strong>. Please go to <a href=\"$link\">Global Configuration</a> and in the 'Server' tab change your Database Type to <strong>$string</strong>."; } return $errors; } public function checkDatabaseType() { $result = true; if(JFactory::getApplication()->getCfg('dbtype') === 'mysql') { $result = $this->setDatabaseType(); if ($result) { JFactory::getApplication()->enqueueMessage("Your database type has been converted to 'mysqli'."); } } return $result; } public function setDatabaseType() { $path = JPATH_CONFIGURATION.'/configuration.php'; $result = false; // Set FTP credentials, if given jimport('joomla.client.helper'); $ftp = JClientHelper::getCredentials('ftp'); jimport('joomla.filesystem.path'); if ($ftp['enabled'] || (JPath::isOwner($path) && JPath::setPermissions($path, '0644'))) { $search = JFile::read($path); $replaced = str_replace('$dbtype = \'mysql\';', '$dbtype = \'mysqli\';', $search); $result = JFile::write($path, $replaced); if (!$ftp['enabled'] && JPath::isOwner($path)) { JPath::setPermissions($path, '0444'); } } return $result; } public function installFramework() { $source = $this->installer->getPath('source').'/framework'; $framework = $this->manifest->framework; foreach ($framework->folder as $folder) { $from = isset($folder['src']) ? $folder['src'] : $folder; $folder = str_replace('site/', '', (string)$folder); JFolder::copy($source.$from, JPATH_ROOT.$folder, false, true); } foreach ($framework->file as $file) { $folder = JPATH_ROOT.dirname($file); if(!JFolder::exists($folder)) { JFolder::create($folder); } JFile::copy($source.$file, JPATH_ROOT.$file); } if ($this->getVersion() === '1.5') { $id = $this->getExtensionId(array( 'type' => 'plugin', 'element' => 'mtupgrade', 'folder' => 'system', )); $db = JFactory::getDBO(); $db->setQuery('SELECT published FROM #__plugins WHERE id = '.(int) $id); if (!$db->loadResult()) { $db->setQuery('UPDATE #__plugins SET published = 1 WHERE id = '.(int) $id); $db->query(); JFactory::getApplication()->enqueueMessage("Mootools Upgrade plugin has been enabled."); } } } /** * Can't use JPluginHelper here since there is no way * of clearing the cached list of plugins. * * @return PlgSystemKoowa Instantiated plugin object */ public function bootFramework() { if (class_exists('Koowa')) { return true; } $db = JFactory::getDbo(); $table = $this->getVersion() === '2.5' ? '#__extensions' : '#__plugins'; $db->setQuery("SELECT folder AS type, element AS name, params FROM $table WHERE folder = 'system' AND element = 'koowa'" ); $plugin = $db->loadObject(); $legacypath = JPATH_PLUGINS.'/'.$plugin->type.'/'.$plugin->name.'.php'; $path = JPATH_PLUGINS.'/'.$plugin->type.'/'.$plugin->name.'/'.$plugin->name.'.php'; $loaded = false; foreach (array($legacypath, $path) as $p) { if (file_exists($p)) { $loaded = true; require_once $p; break; } } if ($loaded === false) { return false; } $dispatcher = JDispatcher::getInstance(); $className = 'plg' . $plugin->type . $plugin->name; if (class_exists($className)) { // Constructor does all the work in the plugin $class = new $className($dispatcher, (array) ($plugin)); } return class_exists('Koowa'); } public function storeUUID($uuid = false) { if($uuid === false) { return false; } if($this->_isLocal()) { return false; } $db = JFactory::getDbo(); $params = JComponentHelper::getParams('com_extman'); $params->set('joomlatools_user_id', $uuid); if($this->getVersion() === '1.5') { $db->setQuery("SELECT `id` FROM #__components WHERE `link`='option=com_extman' AND `option`='com_extman'"); $componentId = (int) $db->loadResult(); $registry = new JRegistry(); $registry->loadArray($params->toArray()); $value = $registry->toString(); $query = "UPDATE #__components SET params = ".$db->Quote($value)." WHERE `id` = ". $componentId; } else { $componentId = JComponentHelper::getComponent('com_extman')->id; $query = "UPDATE #__extensions SET params = ".$db->quote($params->toString())." WHERE `extension_id` = ". (int) $componentId; } $db->setQuery($query); $db->query(); return true; } public function getUUID() { $file = $this->installer->getPath('source').'/install/.subscription'; if(JFile::exists($file)) { $uuid = trim(JFile::read($file)); return $uuid; } return false; } public function installExtensions() { $source = $this->installer->getPath('source'); foreach ($this->manifest->extensions->extension as $extension) { $path = $source.'/'.(string)$extension; $this->installExtension($extension, $path); } } public function installExtension($extension, $path) { $installer = new JInstaller(); $installer->install($path); if ((string)$extension['type'] === 'plugin') { $db = JFactory::getDBO(); $id = $this->getExtensionId($extension); if ($this->getVersion() === '2.5') { $query = 'UPDATE #__extensions SET enabled = 1 WHERE extension_id = '.$id; } else { $query = 'UPDATE #__plugins SET published = 1 WHERE id = '.$id; } $db->setQuery($query); $db->query(); } if ((string)$extension['protected'] === 'true') { $this->setCoreExtension($extension, true); } } public function setCoreExtension($extension, $value = true) { $value = (int) $value; $type = (string)$extension['type']; $id = (int) $this->getExtensionId($extension); $db = JFactory::getDBO(); if ($this->getVersion() === '2.5') { $query = "UPDATE #__extensions SET protected = {$value} WHERE extension_id = {$id} LIMIT 1"; } else { $query = "UPDATE #__{$type}s SET iscore = {$value} WHERE id = {$id} LIMIT 1"; } $db->setQuery($query); return $db->query(); } public function uninstallExtensions() { foreach ($this->manifest->extensions->extension as $extension) { if ((string)$extension['protected'] === 'true') { $this->setCoreExtension($extension, false); } $this->uninstallExtension($extension); } } public function uninstallExtension($extension) { $type = (string)$extension['type']; $cid = (int) $extension['client_id']; $id = $this->getExtensionId($extension); $installer = new JInstaller(); $result = $installer->uninstall($type, $id, $cid); } public function getExtensionId($extension) { $type = (string)$extension['type']; $element = (string)$extension['element']; $folder = isset($extension['folder']) ? (string) $extension['folder'] : ''; $cid = isset($extension['client_id']) ? (int) $extension['client_id'] : 0; if ($type == 'component') { $cid = 1; } if ($type == 'component' && substr($element, 0, 4) !== 'com_') { $element = 'com_'.$element; } elseif ($type == 'module' && substr($element, 0, 4) !== 'mod_') { $element = 'mod_'.$element; } $db = JFactory::getDBO(); if ($this->getVersion() === '2.5') { $query = "SELECT extension_id FROM #__extensions WHERE type = '$type' AND element = '$element' AND folder = '$folder' AND client_id = '$cid' LIMIT 1 "; } else { $query = "SELECT id FROM #__{$type}s"; if ($type == 'component') { $query .= " WHERE `option` = '{$element}'"; } else if ($type == 'module') { $query .= " WHERE module = '{$element}' AND client_id = '{$cid}'"; } else if ($type == 'plugin') { $query .= " WHERE element = '{$element}' AND folder = '{$folder}'"; } $query .= "LIMIT 1"; } $db->setQuery($query); return $db->loadResult(); } public function uninstallFramework() { $framework = $this->manifest->framework; foreach ($framework->folder as $folder) { if(JFolder::exists(JPATH_ROOT.$folder)) JFolder::delete(JPATH_ROOT.$folder); } // Delete framework files, like the koowa plugin, and the default plugin foreach ($framework->file as $file) { if(JFile::exists(JPATH_ROOT.$file)) JFile::delete(JPATH_ROOT.$file); } } /** * Tests a list of DB privileges against the current application DB connection. * * @param array $privileges An array containing the privileges to be checked. * * @return array True An array containing the privileges that didn't pass the test, i.e. not granted. */ public function checkDatabasePrivileges($privileges) { $privileges = (array) $privileges; $db = JFactory::getDBO(); $query = 'SELECT @@SQL_MODE'; $db->setQuery($query); $sql_mode = $db->loadResult($query); $db_name = JFactory::getApplication()->getCfg('db'); // Quote and escape DB name. if (strtolower($sql_mode) == 'ansi_quotes') { // Double quotes as delimiters. $db_name = '"' . str_replace('"', '""', $db_name) . '"'; } else { $db_name = '`' . str_replace('`', '``', $db_name) . '`'; } // Properly escape DB name. $db_name = str_replace('_', '\_', $db_name); $query = 'SHOW GRANTS'; $db->setQuery($query); if (version_compare(JVERSION, '1.6', '<')) { $grants = $db->loadResultArray(); } else { $grants = $db->loadColumn(); } $granted = array(); foreach ($privileges as $privilege) { foreach ($grants as $grant) { $regex = '/(grant\s+|,\s*)' . $privilege . '(\s*,|\s+on)/i'; if (stripos($grant, 'ALL PRIVILEGES') || preg_match($regex, $grant)) { // Check tables $tables = substr($grant, stripos($grant, ' ON ') + 4); $tables = substr($tables, 0, stripos($tables, ' TO')); $tables = trim($tables); if (in_array($tables, array('*.*', $db_name . '.*'))) { $granted[] = $privilege; } } } } return array_diff($privileges, $granted); } protected function _isLocal() { $isLocal = false; $ip = @$_SERVER['REMOTE_ADDR']; if(!empty($ip)) { $isLoopback = preg_match('/^localhost$|^127(?:\.[0-9]+){0,2}\.[0-9]+$|^(?:0*\:)*?:?0*1$/', $ip) ? true : false; if(!$isLoopback) { $result = filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE); $isLocal = $result === false ? true : false; } else $isLocal = true; } return $isLocal; } }