diff --git a/administrator/components/com_installer/models/extension.php b/administrator/components/com_installer/models/extension.php index 26979bbd0e2f5..a6726fe68664d 100644 --- a/administrator/components/com_installer/models/extension.php +++ b/administrator/components/com_installer/models/extension.php @@ -182,8 +182,15 @@ protected function translate(&$items) $lang->load("$extension.sys", JPATH_SITE, null, false, true); break; case 'library': - $extension = 'lib_' . $item->element; - $lang->load("$extension.sys", JPATH_SITE, null, false, true); + $parts = explode('/', $item->element); + $vendor = (isset($parts[1]) ? $parts[0] : null); + $extension = 'lib_' . ($vendor ? implode('_', $parts) : $item->element); + + if (!$lang->load("$extension.sys", $path, null, false, true)) + { + $source = $path . '/libraries/' . ($vendor ? $vendor . '/' . $parts[1] : $item->element); + $lang->load("$extension.sys", $source, null, false, true); + } break; case 'module': $extension = $item->element; diff --git a/libraries/src/Installer/Adapter/LibraryAdapter.php b/libraries/src/Installer/Adapter/LibraryAdapter.php index f08d2f2caa5d0..80248a04637a7 100644 --- a/libraries/src/Installer/Adapter/LibraryAdapter.php +++ b/libraries/src/Installer/Adapter/LibraryAdapter.php @@ -106,7 +106,15 @@ protected function finaliseInstall() { $manifest = array(); $manifest['src'] = $this->parent->getPath('manifest'); - $manifest['dest'] = JPATH_MANIFESTS . '/libraries/' . basename($this->parent->getPath('manifest')); + $manifest['dest'] = JPATH_MANIFESTS . '/libraries/' . $this->element . '.xml'; + + $destFolder = dirname($manifest['dest']); + + if (!is_dir($destFolder) && !@mkdir($destFolder)) + { + // Install failed, rollback changes + throw new \RuntimeException(\JText::_('JLIB_INSTALLER_ABORT_LIB_INSTALL_COPY_SETUP')); + } if (!$this->parent->copyFiles(array($manifest), true)) { @@ -150,8 +158,7 @@ public function getElement($element = null) { if (!$element) { - $manifestPath = \JPath::clean($this->parent->getPath('manifest')); - $element = preg_replace('/\.xml/', '', basename($manifestPath)); + $element = (string) $this->getManifest()->libraryname; } return $element; @@ -175,7 +182,7 @@ public function loadLanguage($path = null) $this->parent->setPath('source', JPATH_PLATFORM . '/' . $this->getElement()); } - $extension = 'lib_' . $this->getElement(); + $extension = 'lib_' . str_replace('/', '_', $this->getElement()); $librarypath = (string) $this->getManifest()->libraryname; $source = $path ?: JPATH_PLATFORM . '/' . $librarypath; @@ -457,6 +464,15 @@ public function uninstall($id) $this->parent->removeFiles($xml->media); $this->parent->removeFiles($xml->languages); + $elementParts = explode('/', $row->element); + + // Delete empty vendor folders + if (2 === count($elementParts)) + { + @rmdir(JPATH_MANIFESTS . '/libraries/' . $elementParts[0]); + @rmdir(JPATH_PLATFORM . '/' . $elementParts[0]); + } + $row->delete($row->extension_id); unset($row); @@ -473,20 +489,29 @@ public function uninstall($id) public function discover() { $results = array(); - $file_list = \JFolder::files(JPATH_MANIFESTS . '/libraries', '\.xml$'); - foreach ($file_list as $file) + + $mainFolder = JPATH_MANIFESTS . '/libraries'; + $folder = new \RecursiveDirectoryIterator($mainFolder); + $iterator = new \RegexIterator( + new \RecursiveIteratorIterator($folder), + '/\.xml$/i', + \RecursiveRegexIterator::GET_MATCH + ); + + foreach ($iterator as $file => $pattern) { - $manifest_details = Installer::parseXMLInstallFile(JPATH_MANIFESTS . '/libraries/' . $file); - $file = \JFile::stripExt($file); + $element = str_replace(array($mainFolder . DIRECTORY_SEPARATOR, '.xml'), '', $file); + $manifestCache = Installer::parseXMLInstallFile($file); + $extension = Table::getInstance('extension'); $extension->set('type', 'library'); $extension->set('client_id', 0); - $extension->set('element', $file); + $extension->set('element', $element); $extension->set('folder', ''); - $extension->set('name', $file); + $extension->set('name', $element); $extension->set('state', -1); - $extension->set('manifest_cache', json_encode($manifest_details)); + $extension->set('manifest_cache', json_encode($manifestCache)); $extension->set('params', '{}'); $results[] = $extension; }