diff options
| author | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
|---|---|---|
| committer | Marcus Eibrink-Lunzenauer <lunzenauer@elan-ev.de> | 2024-06-18 13:18:06 +0000 |
| commit | 33fd1358507b4a5abb3dcebe78d407d0567717c1 (patch) | |
| tree | 6bd8f6959da4c3fc1b8907c0bbc28eb9e10d4a5a /lib/plugins/engine/PluginRepository.php | |
| parent | 42d46671c0309bddb71a91bbfdc5f2fa2e44384e (diff) | |
Deprecate `StudipAutoloader` and use composer's `autoload`
Closes #4282
Merge request studip/studip!3099
Diffstat (limited to 'lib/plugins/engine/PluginRepository.php')
| -rw-r--r-- | lib/plugins/engine/PluginRepository.php | 160 |
1 files changed, 160 insertions, 0 deletions
diff --git a/lib/plugins/engine/PluginRepository.php b/lib/plugins/engine/PluginRepository.php new file mode 100644 index 0000000..235e9bd --- /dev/null +++ b/lib/plugins/engine/PluginRepository.php @@ -0,0 +1,160 @@ +<?php + +/* + * PluginRepository.class.php - query plugin meta data + * + * Copyright (c) 2008 Elmar Ludwig + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of + * the License, or (at your option) any later version. + */ + +/** + * Class used to locate plugins available from a plugin repository. + */ +class PluginRepository +{ + /** + * list and meta data of available plugins + */ + private $plugins = []; + + /** + * Initialize a new PluginRepository and read meta data from + * the given URL or the default list of URLs (if $url is null). + */ + public function __construct($url = null) + { + if (isset($url)) { + $this->readMetadata($url); + } else { + foreach ($GLOBALS['PLUGIN_REPOSITORIES'] as $url) { + $this->readMetadata($url); + } + } + } + + /** + * Read plugin meta data from the given URL (using XML format). + * The structure of the XML is: + * + * <plugins> + * <plugin name="DummyPlugin" + * <release + * version="2.0" + * url="http://plugins.example.com/dummy-2.0.zip" + * studipMinVersion="1.4" + * studipMaxVersion="1.9"> + * </plugin> + * [...] + * </plugins> + * + * @param string $url plugin repository url + */ + public function readMetadata($url) + { + $cache = \Studip\Cache\Factory::getCache(); + $cache_key = 'plugin_metadata/'.$url; + $metadata = $cache->read($cache_key); + + if ($metadata === false) { + // Set small timeout for the rare case that the repository is not + // available + $context = get_default_http_stream_context($url); + stream_context_set_option($context, ['http' => [ + 'timeout' => 5, + ]]); + $metadata = @file_get_contents($url, false, $context); + + if ($metadata === false) { + throw new Exception(sprintf(_('Fehler beim Zugriff auf %s'), $url)); + } + + $cache->write($cache_key, $metadata, 3600); + } + + $xml = new SimpleXMLElement($metadata); + + if (!isset($xml->plugin)) { + $cache->expire($cache_key); + throw new Exception(_('Keine Plugin Meta-Daten gefunden')); + } + + foreach ($xml->plugin as $plugin) { + foreach ($plugin->release as $release) { + $min_version = trim($release['studipMinVersion']); + $max_version = trim($release['studipMaxVersion']); + + if (($min_version && StudipVersion::olderThan($min_version)) || + ($max_version && StudipVersion::newerThan($max_version))) { + // plugin is not compatible, so skip it + continue; + } + + $meta_data = [ + 'version' => (string) $release['version'], + 'url' => (string) $release['url'], + 'description' => (string) $plugin['description'], + 'plugin_url' => (string) $plugin['homepage'], + 'image' => (string) $plugin['image'], + 'score' => (float) $plugin['score'], + 'marketplace_url' => (string) $plugin['marketplace_url'], + ]; + + $this->registerPlugin((string) $plugin['name'], $meta_data); + } + } + } + + /** + * Register a new plugin in this repository. + * + * @param string $name plugin name + * @param array $meta_data plugin meta data + */ + protected function registerPlugin($name, $meta_data) + { + $old_data = $this->plugins[$name] ?? null; + + if (!isset($old_data) || + version_compare($meta_data['version'], $old_data['version']) > 0) { + $this->plugins[$name] = $meta_data; + } + } + + /** + * Get meta data for the plugin with the given name (if available). + * Always chooses the newest compatible version of the plugin. + * @param string $name name of the plgin + * @return array meta data for plugin (or null) + */ + public function getPlugin($name) + { + return $this->plugins[$name] ?? null; + } + + /** + * Get meta data for all plugins whose names contain the given + * string. You may omit the search string to get a list of all + * available plugins. Returns the newest compatible version of + * each plugin. + * @param string $search search string + * @return array array of meta data for matching plugins + */ + public function getPlugins($search = null) + { + $result = []; + + foreach ($this->plugins as $name => $data) { + if ($search === null || $search === '' || + is_int(mb_stripos($name, $search)) || + is_int(mb_stripos($data['description'], $search))) { + $result[$name] = $data; + } + } + + return $result; + } +} |
