diff --git a/administrator/components/com_joomlaupdate/controllers/compatibility.php b/administrator/components/com_joomlaupdate/controllers/compatibility.php new file mode 100644 index 0000000000000..78f29de2049d6 --- /dev/null +++ b/administrator/components/com_joomlaupdate/controllers/compatibility.php @@ -0,0 +1,66 @@ +input; + + // Set the default view name and format from the Request. + $vName = $input->getCmd('view', 'compatibility'); + $vFormat = $document->getType(); + $lName = $input->getCmd('layout', 'default'); + $extension = $input->getCmd('extension'); + + //check if extension are not empty + if (is_null($extension)) { + $app->redirect('index.php?option=com_joomlaupdate', 'COM_JOOMLAUPDATE_COMPATIBILITY_EMPTY_EXTENSION_VALUE'); + } + + // Get and render the view. + if ($view = $this->getView($vName, $vFormat)) { + // Get the model for the view. + $model = $this->getModel($vName); + + //validate if extension exists + if (!$model->extensionExists($extension)) { + $app->redirect('index.php?option=com_joomlaupdate', 'COM_JOOMLAUPDATE_COMPATIBILITY_INVALID_EXTENSION_VALUE', 'warning'); + } + // Push the model into the view (as default). + $view->setModel($model, true); + + $view->display(); + } + + return $this; + } +} \ No newline at end of file diff --git a/administrator/components/com_joomlaupdate/helpers/manifest.php b/administrator/components/com_joomlaupdate/helpers/manifest.php new file mode 100644 index 0000000000000..799851d5fa969 --- /dev/null +++ b/administrator/components/com_joomlaupdate/helpers/manifest.php @@ -0,0 +1,118 @@ + null, + 'manifest_filename' => null + ); + + // Guess the manifest path and name + switch($extension->type){ + case 'component': + // A "component" type extension. We'll have to look for its manifest. + $return['package_folder'] = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $extension->element); + break; + + case 'file': + // A "file" type extension. Its manifest is strictly named and in a predictable path. + $return['package_folder'] = JPath::clean(JPATH_MANIFESTS . '/files'); + $return['manifest_filename'] = $extension->element . '.xml'; + break; + + case 'language': + if ($extension->client_id == 0) + { + // A site language + $base_path = JPATH_SITE; + } + else + { + // An administrator language + $base_path = JPATH_ADMINISTRATOR; + } + $return['package_folder'] = JPath::clean($base_path . '/language/' . $extension->element); + // A "language" type extension. Its manifest is strictly named and in a predictable path. + $return['manifest_filename'] = $extension->element . '.xml'; + break; + + case 'library': + // A "library" type extension. Its manifest is strictly named and in a predictable path. + $return['package_folder'] = JPATH_MANIFESTS . '/libraries/' . $extension->element; + $return['manifest_filename'] = $extension->element . '.xml'; + break; + + case 'module': + // A "module" type extension. We'll have to look for its manifest. + if ($extension->client_id == 0) + { + // A site language + $base_path = JPATH_SITE; + } + else + { + // An administrator language + $base_path = JPATH_ADMINISTRATOR; + } + $return['package_folder'] = JPath::clean($base_path . '/modules/' . $extension->element); + break; + + case 'package': + // A "package" type extension. Its manifest is strictly named and in a predictable path. + $return['package_folder'] = JPATH_MANIFESTS . '/packages/' . $extension->element; + $return['manifest_filename'] = $extension->element . '.xml'; + break; + + case 'plugin': + // A "plugin" type extension. We'll have to look for its manifest. + $return['package_folder'] = JPath::clean(JPATH_SITE . '/plugins/' . $extension->folder . '/' . $extension->element); + break; + + case 'template': + // A "tempalte" type extension. We'll have to look for its manifest. + if ($extension->client_id == 0) + { + // A site language + $base_path = JPATH_SITE; + } + else + { + // An administrator language + $base_path = JPATH_ADMINISTRATOR; + } + $return['package_folder'] = JPath::clean($base_path . '/templates/' . $extension->element); + break; + } + + return $return; + } + + +} diff --git a/administrator/components/com_joomlaupdate/joomlaupdate.php b/administrator/components/com_joomlaupdate/joomlaupdate.php index f52a8df82ef96..2463453e48e0b 100644 --- a/administrator/components/com_joomlaupdate/joomlaupdate.php +++ b/administrator/components/com_joomlaupdate/joomlaupdate.php @@ -14,6 +14,9 @@ return JError::raiseWarning(404, JText::_('JERROR_ALERTNOAUTHOR')); } +// Register manifest helper +JLoader::register('ManifestHelper', JPATH_COMPONENT.'/helpers/manifest.php'); + $controller = JControllerLegacy::getInstance('Joomlaupdate'); $controller->execute(JRequest::getCmd('task')); $controller->redirect(); diff --git a/administrator/components/com_joomlaupdate/models/compatibility.php b/administrator/components/com_joomlaupdate/models/compatibility.php index 3aa6a337e6bf7..46724f88d2616 100644 --- a/administrator/components/com_joomlaupdate/models/compatibility.php +++ b/administrator/components/com_joomlaupdate/models/compatibility.php @@ -18,6 +18,21 @@ */ class JoomlaupdateModelCompatibility extends JModelLegacy { + /** + * Method to filter 3rd party extensions by the compatibility versions + * + * @param string $extension The extension identifier. + * + * @return Boolean True if extension is loaded other else false + * @since 2.5.10 + */ + public function extensionExists($extension) + { + $value = JTable::getInstance('extension'); + $value->load( $value->find(array('element' => $extension)) ); + return $value->extension_id != 0 ? true : false ; + } + /** * Method to filter 3rd party extensions by the compatibility versions * @@ -31,22 +46,10 @@ public function checkCompatibility() $input = JFactory::getApplication()->input; $extension = $input->getCmd('extension'); $joomla_version = $input->getCmd('jversion',JVERSION); - - if (is_null($extension)) { - die('redirect'); - //redirect - } - + $value = JTable::getInstance('extension'); $value->load( $value->find(array('element' => $extension)) ); - - // If empty, return the current value - if ($value->extension_id == 0) - { - die('redirect'); - //redirect - } - + //return variable $items_compatible = array( ); @@ -54,157 +57,69 @@ public function checkCompatibility() //import installer class for finding manifest xml file jimport('joomla.installer.installer'); $installer = JInstaller::getInstance(); - - // Initialise the manifest sniffer code - $package_folder = null; - $manifest_filename = null; - - // Guess the manifest path and name - switch($value->type){ - case 'component': - // A "component" type extension. We'll have to look for its manifest. - $package_folder = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $value->element); - break; - - case 'file': - // A "file" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPath::clean(JPATH_MANIFESTS . '/files'); - $manifest_filename = $value->element . '.xml'; - break; - - case 'language': - // A "language" type extension. Its manifest is strictly named and in a predictable path. - $manifest_filename = $value->element . '.xml'; - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/language/' . $value->element); - - break; - case 'library': - // A "library" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPATH_MANIFESTS . '/libraries/' . $value->element; - $manifest_filename = $value->element . '.xml'; - break; + $findManifes = ManifestHelper::getPackageFolder($value); + $package_folder = $findManifes['package_folder']; + $manifest_filename = $findManifes['manifest_filename']; - case 'module': - // A "module" type extension. We'll have to look for its manifest. - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/modules/' . $value->element); - break; + // Set up the installer's source path + $installer->setPath('source', $package_folder); - case 'package': - // A "package" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPATH_MANIFESTS . '/packages/' . $value->element; - $manifest_filename = $value->element . '.xml'; - break; + // Load the extension's manifest + $manifest = null; + if (!is_null($manifest_filename)) { + // We already have a manifest path. Let's try to load it. + $manifest = $installer->isManifest($package_folder . '/' . $manifest_filename); + } else { + // We don't have a manifest path. Let's try to find one. + if ($installer->findManifest() !== false) { + $manifest = $installer->getManifest(); + } + } - case 'plugin': - // A "plugin" type extension. We'll have to look for its manifest. - $package_folder = JPath::clean(JPATH_SITE . '/plugins/' . $value->folder . '/' . $value->element); - break; + if (!is_object($manifest)) { + // This extension's manifest is missing or corrupt + $items_compatible['na'][] = $value->element; + continue; + } - case 'template': - // A "tempalte" type extension. We'll have to look for its manifest. - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/templates/' . $value->element); - break; - } - - // Set up the installer's source path - $installer->setPath('source', $package_folder); + // Check inside manifest xml for compatibility tags + $compatiblity = new JCompatibility($manifest->compatibilities); + $element = $manifest->compatibilities; - // Load the extension's manifest - $manifest = null; - if (!is_null($manifest_filename)) - { - // We already have a manifest path. Let's try to load it. - $manifest = $installer->isManifest($package_folder . '/' . $manifest_filename); - - } - else - { - // We don't have a manifest path. Let's try to find one. - if ($installer->findManifest() !== false) + if ($element) { + foreach ($element->children() as $compatible) { + $compatible_found = false; + $with = $compatible['with']; + switch ($with) { - $manifest = $installer->getManifest(); + case 'joomla': + $current_version = $joomla_version; + $compatible_found = $compatiblity->check($current_version, $with); + break; + case 'php': + $current_version = PHP_VERSION; + $compatible_found = $compatiblity->check($current_version, $with); + break; + default: + $extensionInfo = JTable::getInstance('extension'); + $extensionInfo->load( $extensionInfo->find(array('element' => (string)$with)) ); + $extensionParams = new JRegistry($extensionInfo->manifest_cache); + $current_version = $extensionParams->get('version'); + $compatible_found = $compatiblity->check($current_version, $with); + break; } - } - - if (!is_object($manifest)) - { - // This extension's manifest is missing or corrupt - $items_compatible['na'][] = $value->element; - continue; - } - - // Check inside manifest xml for compatibility tags - $compatiblity = new JCompatibility($manifest->compatibilities); - $element = $manifest->compatibilities; - - if ($element) - { - foreach ($element->children() as $compatible) - { - $compatible_found = false; - $with = $compatible['with']; - switch ($with) - { - case 'joomla': - $current_version = $joomla_version; - $compatible_found = $compatiblity->check($current_version, $with); - break; - case 'php': - $current_version = PHP_VERSION; - $compatible_found = $compatiblity->check($current_version, $with); - break; - default: - $extensionInfo = JTable::getInstance('extension'); - $extensionInfo->load( $extensionInfo->find(array('element' => (string)$with)) ); - $extensionParams = new JRegistry($extensionInfo->manifest_cache); - $current_version = $extensionParams->get('version'); - $compatible_found = $compatiblity->check($current_version, $with); - break; - } - - if (!$compatible_found) - { - $item = new stdclass; - $item->name = (string)$with; - $item->version = $current_version; - $item->min_compatible_version = (string)$compatible->include->versions['from']; - $item->max_compatible_version = (string)$compatible->include->versions['to']; - $items_compatible[] = $item; - } + if (!$compatible_found) { + $item = new stdclass; + $item->name = (string)$with; + $item->version = $current_version; + $item->min_compatible_version = (string)$compatible->include->versions['from']; + $item->max_compatible_version = (string)$compatible->include->versions['to']; + $items_compatible[] = $item; } } + } return $items_compatible; } diff --git a/administrator/components/com_joomlaupdate/models/default.php b/administrator/components/com_joomlaupdate/models/default.php index fc57663b43e2b..355acc212858a 100644 --- a/administrator/components/com_joomlaupdate/models/default.php +++ b/administrator/components/com_joomlaupdate/models/default.php @@ -941,86 +941,9 @@ private function checkCompatibility($items, $latest_version) foreach ($items as $field => $value) { // Initialise the manifest sniffer code - $package_folder = null; - $manifest_filename = null; - - // Guess the manifest path and name - switch($value->type){ - case 'component': - // A "component" type extension. We'll have to look for its manifest. - $package_folder = JPath::clean(JPATH_ADMINISTRATOR . '/components/' . $value->element); - break; - - case 'file': - // A "file" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPath::clean(JPATH_MANIFESTS . '/files'); - $manifest_filename = $value->element . '.xml'; - break; - - case 'language': - // A "language" type extension. Its manifest is strictly named and in a predictable path. - $manifest_filename = $value->element . '.xml'; - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/language/' . $value->element); - - break; - - case 'library': - // A "library" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPATH_MANIFESTS . '/libraries/' . $value->element; - $manifest_filename = $value->element . '.xml'; - break; - - case 'module': - // A "module" type extension. We'll have to look for its manifest. - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/modules/' . $value->element); - break; - - case 'package': - // A "package" type extension. Its manifest is strictly named and in a predictable path. - $package_folder = JPATH_MANIFESTS . '/packages/' . $value->element; - $manifest_filename = $value->element . '.xml'; - break; - - case 'plugin': - // A "plugin" type extension. We'll have to look for its manifest. - $package_folder = JPath::clean(JPATH_SITE . '/plugins/' . $value->folder . '/' . $value->element); - break; - - case 'template': - // A "tempalte" type extension. We'll have to look for its manifest. - if ($value->client_id == 0) - { - // A site language - $base_path = JPATH_SITE; - } - else - { - // An administrator language - $base_path = JPATH_ADMINISTRATOR; - } - $package_folder = JPath::clean($base_path . '/templates/' . $value->element); - break; - } + $findManifes = ManifestHelper::getPackageFolder($value); + $package_folder = $findManifes['package_folder']; + $manifest_filename = $findManifes['manifest_filename']; // Set up the installer's source path $installer->setPath('source', $package_folder); diff --git a/administrator/components/com_joomlaupdate/views/default/tmpl/default.php b/administrator/components/com_joomlaupdate/views/default/tmpl/default.php index b5d1fb2f75b96..6f41fd1065c03 100644 --- a/administrator/components/com_joomlaupdate/views/default/tmpl/default.php +++ b/administrator/components/com_joomlaupdate/views/default/tmpl/default.php @@ -319,7 +319,7 @@ extensions['not_compatible'] as $extension){ ?> - name; ?> + name; ?> diff --git a/administrator/language/en-GB/en-GB.com_joomlaupdate.ini b/administrator/language/en-GB/en-GB.com_joomlaupdate.ini index 50977aa194253..5a7ab726d92dd 100644 --- a/administrator/language/en-GB/en-GB.com_joomlaupdate.ini +++ b/administrator/language/en-GB/en-GB.com_joomlaupdate.ini @@ -85,4 +85,6 @@ COM_JOOMLAUPDATE_NOT_COMPATIBLE="Not Compatible" COM_JOOMLAUPDATE_NA="Missing Compatibility Tag" COM_JOOMLAUPDATE_ENABLE_UPDATE="Enable the update" COM_JOOMLAUPDATE_DONT_HAVE_3RD_EXTENSIONS_FOR_CHECK="There are currently no custom extension installed." +COM_JOOMLAUPDATE_COMPATIBILITY_EMPTY_EXTENSION_VALUE="Can't check compatibility, extension are not defined." +COM_JOOMLAUPDATE_COMPATIBILITY_INVALID_EXTENSION_VALUE="Can't load extension for check compatibility." COM_JOOMLAUPDATE_UPDATE_WARNING_MSG="Some custom extensions are not compatible or they are missing a compatibility tag.
We strongly urge you NOT to update until all extensions are compatible with Joomla! %s"