Normalizes the values from the \ElggManifestParser object.
This requires an \ElggPluginManifestParser class implementation
as $this->parser.
To add new parser versions, name them \ElggPluginManifestParserXX
where XX is the version specified in the top-level
tag's XML namespace.
/** * @return string */ private function getLicense() { /* Apache-2.0 BSD-2-Clause BSD-3-Clause BSD-4-Clause GPL-2.0 GPL-2.0+ GPL-3.0 GPL-3.0+ LGPL-2.1 LGPL-2.1+ LGPL-3.0 LGPL-3.0+ MIT */ $replacements = array('GNU Public License version 2' => 'GPL-2.0', 'GNU General Public License version 2' => 'GPL-2.0', 'MIT (X11)' => 'MIT'); $license = $this->manifest->getLicense(); if (isset($replacements[$license])) { return $replacements[$license]; } return $license; }
/** * Load and parse a plugin manifest from a plugin XML file. * * @example plugins/manifest.xml Example 1.8-style manifest file. * * @deprecated 1.8 Use ElggPlugin->getManifest() * * @param string $plugin Plugin name. * @return array of values */ function load_plugin_manifest($plugin) { elgg_deprecated_notice('load_plugin_manifest() is deprecated by ElggPlugin->getManifest()', 1.8); $xml_file = elgg_get_plugins_path() . "{$plugin}/manifest.xml"; try { $manifest = new ElggPluginManifest($xml_file, $plugin); } catch (Exception $e) { return false; } return $manifest->getManifest(); }
} if ($action) { $url = elgg_http_add_url_query_elements($actions_base . $action, array('plugin_guids[]' => $plugin->guid)); $options['href'] = $url; } $action_button = elgg_view('output/url', $options); // Display categories and make category classes $categories = $plugin->getManifest()->getCategories(); $categories_html = ''; if ($categories) { $base_url = elgg_get_site_url() . "admin/plugins?category="; foreach ($categories as $category) { $css_class = preg_replace('/[^a-z0-9-]/i', '-', $category); $classes[] = "elgg-plugin-category-{$css_class}"; $url = $base_url . urlencode($category); $friendly_category = htmlspecialchars(ElggPluginManifest::getFriendlyCategory($category)); $categories_html .= "<li class=\"elgg-plugin-category prm\"><a href=\"{$url}\">{$friendly_category}</a></li>"; } } $screenshots_html = ''; $screenshots = $plugin->getManifest()->getScreenshots(); if ($screenshots) { $base_url = elgg_get_plugins_path() . $plugin->getID() . '/'; foreach ($screenshots as $screenshot) { $desc = elgg_echo($screenshot['description']); $alt = htmlentities($desc, ENT_QUOTES, 'UTF-8'); $screenshot_img = elgg_view('output/img', array('src' => "admin_plugin_screenshot/{$plugin->getID()}/thumbnail/{$screenshot['path']}", 'alt' => $alt)); $screenshot_link = elgg_view('output/url', array('href' => "admin_plugin_screenshot/{$plugin->getID()}/full/{$screenshot['path']}", 'text' => $screenshot_img, 'class' => 'elgg-lightbox')); $screenshots_html .= "<li class=\"elgg-plugin-screenshot prm ptm\">{$screenshot_link}</li>"; } }
// @todo this could be cached somewhere after have the manifest loaded $categories = array(); foreach ($installed_plugins as $id => $plugin) { if (!$plugin->isValid()) { if ($plugin->isActive()) { // force disable and warn elgg_add_admin_notice('invalid_and_deactivated_' . $plugin->getID(), elgg_echo('ElggPlugin:InvalidAndDeactivated', array($plugin->getId()))); $plugin->deactivate(); } continue; } $plugin_categories = $plugin->getManifest()->getCategories(); if (isset($plugin_categories)) { foreach ($plugin_categories as $category) { if (!array_key_exists($category, $categories)) { $categories[$category] = ElggPluginManifest::getFriendlyCategory($category); } } } } asort($categories); // we want bundled/nonbundled pulled to be at the top of the list unset($categories['bundled']); unset($categories['nonbundled']); $common_categories = ['all' => elgg_echo('admin:plugins:category:all'), 'active' => elgg_echo('admin:plugins:category:active'), 'inactive' => elgg_echo('admin:plugins:category:inactive'), 'bundled' => elgg_echo('admin:plugins:category:bundled'), 'nonbundled' => elgg_echo('admin:plugins:category:nonbundled')]; $categories = array_merge($common_categories, $categories); $category_form = elgg_view("admin/plugins/filter", ['category' => "all", 'category_options' => $categories]); $activate_all = elgg_view('output/url', ['href' => 'action/admin/plugins/activate_all', 'text' => elgg_echo('admin:plugins:activate_all'), 'class' => 'elgg-button elgg-button-submit', 'confirm' => true]); $deactivate_all = elgg_view('output/url', ['href' => 'action/admin/plugins/deactivate_all', 'text' => elgg_echo('admin:plugins:deactivate_all'), 'class' => 'elgg-button elgg-button-submit', 'confirm' => true]); $buttons = elgg_format_element('div', ['class' => 'float-alt'], $activate_all . $deactivate_all); echo elgg_format_element('div', ['class' => 'mbm'], $buttons . $category_form);
/** * Sets the hash that is used to uniquely identify this plugin */ public function setHash() { $archiveName = $this->getFilenameOnFilestore(); $zip = new ZipArchive(); $result = $zip->open($archiveName); if ($result !== true) { return false; } for ($i = 0; $i < $zip->numFiles; $i++) { $filename = $zip->getNameIndex($i); if (stripos($filename, 'manifest.xml') !== false) { $manifest = $zip->getFromIndex($i); $id = substr($filename, 0, strpos($filename, '/')); break; } } $zip->close(); if (!isset($manifest)) { return false; } try { $manifest = new ElggPluginManifest($manifest); $author = $manifest->getAuthor(); $version = $manifest->getVersion(); $this->hash = md5($id . $version . $author); } catch (Exception $e) { // skip invalid manifests } }
$info[elgg_echo('admin:plugins:label:author')] = elgg_view('output/text', array('value' => $plugin->getManifest()->getAuthor())); $url = $plugin->getManifest()->getWebsite(); if ($url) { $info[elgg_echo('admin:plugins:label:website')] = elgg_view('output/url', array('href' => $plugin->getManifest()->getWebsite(), 'text' => $plugin->getManifest()->getWebsite(), 'is_trusted' => true)); } $info[elgg_echo('admin:plugins:label:copyright')] = elgg_view('output/text', array('value' => $plugin->getManifest()->getCopyright())); $info[elgg_echo('admin:plugins:label:licence')] = elgg_view('output/text', array('value' => $plugin->getManifest()->getLicense())); $site_path = elgg_get_root_path(); $path = $plugin->getPath(); if (0 === strpos($path, $site_path)) { $path = substr($path, strlen($site_path)); } $info[elgg_echo('admin:plugins:label:location')] = htmlspecialchars($path); $categories = (array) $plugin->getManifest()->getCategories(); array_walk($categories, function (&$value) { $value = htmlspecialchars(ElggPluginManifest::getFriendlyCategory($value)); }); $info[elgg_echo('admin:plugins:label:categories')] = implode(', ', $categories); // assemble table $rows = ''; foreach ($info as $name => $value) { if (trim($value) === '') { continue; } $rows .= "<tr><th>{$name}</th><td>{$value}</td></tr>"; } $info_html = elgg_format_element('table', ['class' => 'elgg-table'], $rows); $extra_info = elgg_echo("admin:plugins:info:" . $plugin->getID()); if ($extra_info !== "admin:plugins:info:" . $plugin->getID()) { $info_html .= "<div class='mtm'>" . $extra_info . "</div>"; }
function guessName($release, &$type) { $filestorePath = $release->getFilenameOnFilestore(); $filename = $release->originalfilename; // var_dump($filename, $filestorePath); $extension = strtolower(pathinfo($filename, PATHINFO_EXTENSION)); if ($extension == 'gz') { if (strtolower(pathinfo(substr($filename, 0, strlen($filename) - 3), PATHINFO_EXTENSION)) == 'tar') { $extension = 'tar.gz'; } } if (!in_array($extension, array('zip', 'tar.gz'))) { // var_dump('BAD ext: ' . $extension); return false; } $resultId = false; $resultDir = false; /* * guess package name */ if ($extension == 'zip') { $type = 'zip'; $zip = new ZipArchive(); if ($errorCode = $zip->open($filestorePath)) { $manifestsCnt = 0; $dirname = null; for ($i = 0; $i < $zip->numFiles; $i++) { $stat = $zip->statIndex($i); if (basename($stat['name']) == 'manifest.xml') { $dirname = trim(pathinfo($stat['name'], PATHINFO_DIRNAME), '/\\'); if (!empty($dirname) && $dirname !== '.' && strpos($dirname, '/') === false && strpos($dirname, '\\') === false) { $resultDir = $dirname; if (preg_match('#^([^\\-]+)\\-(.+)\\-([0-9a-fA-F]{7}|master)$#', $resultDir, $matches)) { $resultDir = $matches[2]; } elseif (strpos($resultDir, '-' . $release->version) === strlen($resultDir) - strlen('-' . $release->version)) { // cut away version appended by git $resultDir = substr($resultDir, 0, strlen($resultDir) - strlen('-' . $release->version)); } $manifestsCnt++; $stream = $zip->getStream($stat['name']); if (is_resource($stream)) { $content = stream_get_contents($stream); try { $manifest = new ElggPluginManifest($content); $manifestArr = $manifest->getManifest(); if (isset($manifestArr['id'])) { $resultId = $manifestArr['id']; } } catch (Exception $e) { } } } } } if ($manifestsCnt == 1) { if ($resultId) { return $resultId; } else { return $resultDir; } } else { return false; //no manifests or too many manifests in proper nesting } } else { var_dump('ERROR:', $errorCode); return false; // cant open archive } } else { // tar.gz $type = 'tar'; try { $tar = new PharData($filestorePath); } catch (UnexpectedValueException $e) { return false; } $tarIterator = new RecursiveIteratorIterator($tar); $prefix = 'phar://' . $filestorePath . '/'; $manifestsCnt = 0; $dirname = null; $tarIterator->rewind(); /** * @var $file PharFileInfo */ // foreach ($tarIterator as $key => $file) { while ($tarIterator->valid()) { try { $file = $tarIterator->current(); } catch (RuntimeException $e) { $tarIterator->next(); continue; } $path = substr($file->getPathname(), strlen($prefix)); if ($file->getFilename() == 'manifest.xml') { $dirname = trim(pathinfo($path, PATHINFO_DIRNAME), '/\\'); if (!empty($dirname) && $dirname !== '.' && strpos($dirname, '/') === false && strpos($dirname, '\\') === false) { $resultDir = $dirname; if (preg_match('#^([^\\-]+)\\-(.+)\\-([0-9a-fA-F]{7}|master)$#', $resultDir, $matches)) { $resultDir = $matches[2]; } elseif (strpos($resultDir, '-' . $release->version) === strlen($resultDir) - strlen('-' . $release->version)) { // cut away version appended by git $resultDir = substr($resultDir, 0, strlen($resultDir) - strlen('-' . $release->version)); } $manifestsCnt++; $content = $file->getContent(); try { $manifest = new ElggPluginManifest($content); $manifestArr = $manifest->getManifest(); if (isset($manifestArr['id'])) { $resultId = $manifestArr['id']; } } catch (Exception $e) { } } } $tarIterator->next(); } if ($manifestsCnt == 1) { if ($resultId) { return $resultId; } else { return $resultDir; } } else { return false; //no manifests or too many manifests in proper nesting } return false; } }