Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/matomo-org/matomo.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Steur <thomas.steur@gmail.com>2014-01-09 07:41:17 +0400
committerThomas Steur <thomas.steur@gmail.com>2014-01-09 07:41:17 +0400
commitb671c49014e2793a758cd4aa99fda82bd0f5dab1 (patch)
treefb6b9e40471b0575549cf3e4a636ddf9258b2999 /plugins/CorePluginsAdmin
parent8f6a07bba0d945dc87c2836c76d0ec25154c059d (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.php37
-rw-r--r--plugins/CorePluginsAdmin/PluginDependency.php67
-rw-r--r--plugins/CorePluginsAdmin/PluginInstaller.php66
-rw-r--r--plugins/CorePluginsAdmin/templates/macros.twig6
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 %}