diff options
author | Thomas Steur <thomas.steur@gmail.com> | 2014-01-09 07:41:17 +0400 |
---|---|---|
committer | Thomas Steur <thomas.steur@gmail.com> | 2014-01-09 07:41:17 +0400 |
commit | b671c49014e2793a758cd4aa99fda82bd0f5dab1 (patch) | |
tree | fb6b9e40471b0575549cf3e4a636ddf9258b2999 /plugins/CorePluginsAdmin | |
parent | 8f6a07bba0d945dc87c2836c76d0ec25154c059d (diff) |
refs #4183 verify require definition when uploading a plugin zip file or when installing/updating a plugin
Diffstat (limited to 'plugins/CorePluginsAdmin')
-rw-r--r-- | plugins/CorePluginsAdmin/Marketplace.php | 37 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/PluginDependency.php | 67 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/PluginInstaller.php | 66 | ||||
-rw-r--r-- | plugins/CorePluginsAdmin/templates/macros.twig | 6 |
4 files changed, 127 insertions, 49 deletions
diff --git a/plugins/CorePluginsAdmin/Marketplace.php b/plugins/CorePluginsAdmin/Marketplace.php index 09b30a15c4..a008f24aae 100644 --- a/plugins/CorePluginsAdmin/Marketplace.php +++ b/plugins/CorePluginsAdmin/Marketplace.php @@ -184,42 +184,9 @@ class Marketplace $requires = $latestVersion['requires']; - foreach ($requires as $name => $requiredVersion) { - $currentVersion = $this->getCurrentVersion($name); - $comparison = '>='; - - if (preg_match('{^(<>|!=|>=?|<=?|==?)\s*(.*)}', $requiredVersion, $matches)) { - $requiredVersion = $matches[2]; - $comparison = $matches[1]; - } - - if (false === version_compare($currentVersion, $requiredVersion, $comparison)) { - $plugin['missingRequirements'][] = array( - 'requirement' => (strtolower($name) === 'php') ? 'PHP' : ucfirst($name), - 'actualVersion' => $currentVersion, - 'requiredVersion' => $comparison . $requiredVersion - ); - } - } + $dependency = new PluginDependency(); + $plugin['missingRequirements'] = $dependency->getMissingDependencies($requires); return $plugin; } - - private function getCurrentVersion($name) - { - switch (strtolower($name)) { - case 'piwik': - return Version::VERSION; - case 'php': - return PHP_VERSION; - default: - try { - $plugin = \Piwik\Plugin\Manager::getInstance()->loadPlugin(ucfirst($name)); - - if (!empty($plugin)) { - return $plugin->getVersion(); - } - } catch (\Exception $e) {} - } - } } diff --git a/plugins/CorePluginsAdmin/PluginDependency.php b/plugins/CorePluginsAdmin/PluginDependency.php new file mode 100644 index 0000000000..94a4826b51 --- /dev/null +++ b/plugins/CorePluginsAdmin/PluginDependency.php @@ -0,0 +1,67 @@ +<?php +/** + * Piwik - Open source web analytics + * + * @link http://piwik.org + * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later + * + * @category Piwik_Plugins + * @package CorePluginsAdmin + */ +namespace Piwik\Plugins\CorePluginsAdmin; +use Piwik\Version; + +/** + * + * @package CorePluginsAdmin + */ +class PluginDependency +{ + + public function getMissingDependencies($requires) + { + $missingRequirements = array(); + + if (empty($requires)) { + return $missingRequirements; + } + + foreach ($requires as $name => $requiredVersion) { + $currentVersion = $this->getCurrentVersion($name); + $comparison = '>='; + + if (preg_match('{^(<>|!=|>=?|<=?|==?)\s*(.*)}', $requiredVersion, $matches)) { + $requiredVersion = $matches[2]; + $comparison = $matches[1]; + } + + if (false === version_compare($currentVersion, $requiredVersion, $comparison)) { + $missingRequirements[] = array( + 'requirement' => $name, + 'actualVersion' => $currentVersion, + 'requiredVersion' => $comparison . $requiredVersion + ); + } + } + + return $missingRequirements; + } + + private function getCurrentVersion($name) + { + switch (strtolower($name)) { + case 'piwik': + return Version::VERSION; + case 'php': + return PHP_VERSION; + default: + try { + $plugin = \Piwik\Plugin\Manager::getInstance()->loadPlugin(ucfirst($name)); + + if (!empty($plugin)) { + return $plugin->getVersion(); + } + } catch (\Exception $e) {} + } + } +} diff --git a/plugins/CorePluginsAdmin/PluginInstaller.php b/plugins/CorePluginsAdmin/PluginInstaller.php index 70cb27de76..284f2bdd52 100644 --- a/plugins/CorePluginsAdmin/PluginInstaller.php +++ b/plugins/CorePluginsAdmin/PluginInstaller.php @@ -40,12 +40,23 @@ class PluginInstaller $tmpPluginZip = SettingsPiwik::rewriteTmpPathWithHostname($tmpPluginZip); $tmpPluginFolder = SettingsPiwik::rewriteTmpPathWithHostname($tmpPluginFolder); - $this->makeSureFoldersAreWritable(); - $this->makeSurePluginNameIsValid(); - $this->downloadPluginFromMarketplace($tmpPluginZip); - $this->extractPluginFiles($tmpPluginZip, $tmpPluginFolder); - $this->makeSurePluginJsonExists($tmpPluginFolder); - $this->copyPluginToDestination($tmpPluginFolder); + try { + $this->makeSureFoldersAreWritable(); + $this->makeSurePluginNameIsValid(); + $this->downloadPluginFromMarketplace($tmpPluginZip); + $this->extractPluginFiles($tmpPluginZip, $tmpPluginFolder); + $this->makeSurePluginJsonExists($tmpPluginFolder); + $metadata = $this->getPluginMetadataIfValid($tmpPluginFolder); + $this->makeSureThereAreNoMissingRequirements($metadata); + $this->copyPluginToDestination($tmpPluginFolder); + + } catch (\Exception $e) { + + $this->removeFileIfExists($tmpPluginZip); + $this->removeFolderIfExists($tmpPluginFolder); + + throw $e; + } $this->removeFileIfExists($tmpPluginZip); $this->removeFolderIfExists($tmpPluginFolder); @@ -56,16 +67,27 @@ class PluginInstaller $tmpPluginFolder = PIWIK_USER_PATH . self::PATH_TO_DOWNLOAD . $this->pluginName; $tmpPluginFolder = SettingsPiwik::rewriteTmpPathWithHostname($tmpPluginFolder); - $this->makeSureFoldersAreWritable(); - $this->extractPluginFiles($pathToZip, $tmpPluginFolder); + try { + $this->makeSureFoldersAreWritable(); + $this->extractPluginFiles($pathToZip, $tmpPluginFolder); + + $this->makeSurePluginJsonExists($tmpPluginFolder); + $metadata = $this->getPluginMetadataIfValid($tmpPluginFolder); + $this->makeSureThereAreNoMissingRequirements($metadata); + + $this->pluginName = $metadata->name; - $this->makeSurePluginJsonExists($tmpPluginFolder); - $metadata = $this->getPluginMetadataIfValid($tmpPluginFolder); + $this->fixPluginFolderIfNeeded($tmpPluginFolder); + $this->copyPluginToDestination($tmpPluginFolder); + + } catch (\Exception $e) { - $this->pluginName = $metadata->name; + $this->removeFileIfExists($pathToZip); + $this->removeFolderIfExists($tmpPluginFolder); + + throw $e; + } - $this->fixPluginFolderIfNeeded($tmpPluginFolder); - $this->copyPluginToDestination($tmpPluginFolder); $this->removeFileIfExists($pathToZip); $this->removeFolderIfExists($tmpPluginFolder); @@ -128,6 +150,24 @@ class PluginInstaller } } + private function makeSureThereAreNoMissingRequirements($metadata) + { + $requires = (array) $metadata->require; + + $dependency = new PluginDependency(); + $missingDependencies = $dependency->getMissingDependencies($requires); + + if (!empty($missingDependencies)) { + $message = ''; + foreach ($missingDependencies as $dep) { + $params = array(ucfirst($dep['requirement']), $dep['actualVersion'], $dep['requiredVersion']); + $message .= Piwik::translate('CorePluginsAdmin_MissingRequirementsNotice', $params); + } + + throw new PluginInstallerException($message); + } + } + private function getPluginMetadataIfValid($tmpPluginFolder) { $pluginJsonPath = $this->getPathToPluginJson($tmpPluginFolder); diff --git a/plugins/CorePluginsAdmin/templates/macros.twig b/plugins/CorePluginsAdmin/templates/macros.twig index 97ac766481..71f10d4609 100644 --- a/plugins/CorePluginsAdmin/templates/macros.twig +++ b/plugins/CorePluginsAdmin/templates/macros.twig @@ -97,7 +97,11 @@ {% if plugin.missingRequirements and 0 < plugin.missingRequirements|length %} {% for req in plugin.missingRequirements -%} <p class="missingRequirementsNotice"> - {{ 'CorePluginsAdmin_MissingRequirementsNotice'|translate(req.requirement, req.actualVersion, req.requiredVersion) }} + {% set requirement = req.requirement|capitalize %} + {% if 'Php' == requirement %} + {% set requirement = 'PHP' %} + {% endif %} + {{ 'CorePluginsAdmin_MissingRequirementsNotice'|translate(requirement, req.actualVersion, req.requiredVersion) }} </p> {%- endfor %} {% endif %} |