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 <tsteur@users.noreply.github.com>2016-11-15 04:03:59 +0300
committerMatthieu Aubry <mattab@users.noreply.github.com>2016-11-15 04:03:59 +0300
commit587cc39e0362719332d410b7a4d5ddcc68788eeb (patch)
treec982c369cdda542c3a4de08be11c893e5364838c /plugins/Marketplace/UpdateCommunication.php
parent64314b26dbc6619d535002bdb79b9e55d1fc87db (diff)
Update Marketplace to work with new API (#10799)
* starting to port marketplace to piwik 3 * updating tests * fix translation key * fix various issues * use material select * fix plugin upload * deprecate license_homepage plugin metadata and link to a LICENSE[.md|.txt] file if found (#10756) * deprecate license_homepage plugin metadata, and link to a LICENSE[.md|.txt] file if found * Make license view HTML only without menu * fix tests and update * fix some links did not work * we need to show warnings even when plugin is installed, not only when activated. otherwise it is not clear why something is not downloadable * fix install was not working * improved responsiveness of marketplace * fix more tests * fix search was shown when only a few plugins are there * fix ui tests * fix some translations * fix tests and remove duplicated test
Diffstat (limited to 'plugins/Marketplace/UpdateCommunication.php')
-rw-r--r--plugins/Marketplace/UpdateCommunication.php208
1 files changed, 208 insertions, 0 deletions
diff --git a/plugins/Marketplace/UpdateCommunication.php b/plugins/Marketplace/UpdateCommunication.php
new file mode 100644
index 0000000000..efebfa899b
--- /dev/null
+++ b/plugins/Marketplace/UpdateCommunication.php
@@ -0,0 +1,208 @@
+<?php
+/**
+ * Piwik - free/libre analytics platform
+ *
+ * @link http://piwik.org
+ * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
+ *
+ */
+namespace Piwik\Plugins\Marketplace;
+
+use Piwik\Config;
+use Piwik\Container\StaticContainer;
+use Piwik\Mail;
+use Piwik\Option;
+use Piwik\Piwik;
+use Piwik\Plugins\CoreUpdater\SystemSettings;
+use Piwik\Plugins\UsersManager\API as UsersManagerApi;
+use Piwik\SettingsPiwik;
+
+/**
+ * Class to check and notify users via email if there are plugin updates available.
+ */
+class UpdateCommunication
+{
+ /**
+ * @var SystemSettings
+ */
+ private $updaterSettings;
+
+ public function __construct(SystemSettings $settings)
+ {
+ $this->updaterSettings = $settings;
+ }
+
+ /**
+ * Checks whether plugin update notification is enabled or not. If the marketplace is disabled or if update
+ * communication is disabled in general, it will return false as well.
+ *
+ * @return bool
+ */
+ public function isEnabled()
+ {
+ if (!self::canBeEnabled()) {
+ return false;
+ }
+
+ return $this->updaterSettings->sendPluginUpdateEmail->getValue();
+ }
+
+ /**
+ * Checks whether a plugin update notification can be enabled or not. It cannot be enabled if for instance the
+ * Marketplace is disabled or if update notifications are disabled in general.
+ *
+ * @return bool
+ */
+ public static function canBeEnabled()
+ {
+ $isEnabled = Config::getInstance()->General['enable_update_communication'];
+
+ return Marketplace::isMarketplaceEnabled() && !empty($isEnabled);
+ }
+
+ /**
+ * Sends an email to all super users if there is an update available for any plugins from the Marketplace.
+ * For each update we send an email only once.
+ *
+ * @return bool
+ */
+ public function sendNotificationIfUpdatesAvailable()
+ {
+ $pluginsHavingUpdate = $this->getPluginsHavingUpdate();
+
+ if (empty($pluginsHavingUpdate)) {
+ return;
+ }
+
+ $pluginsToBeNotified = array();
+
+ foreach ($pluginsHavingUpdate as $plugin) {
+ if ($this->hasNotificationAlreadyReceived($plugin)) {
+ continue;
+ }
+
+ $this->setHasLatestUpdateNotificationReceived($plugin);
+
+ $pluginsToBeNotified[] = $plugin;
+ }
+
+ if (!empty($pluginsToBeNotified)) {
+ $this->sendNotifications($pluginsToBeNotified);
+ }
+ }
+
+ protected function sendNotifications($pluginsToBeNotified)
+ {
+ $hasThemeUpdate = false;
+ $hasPluginUpdate = false;
+
+ foreach ($pluginsToBeNotified as $plugin) {
+ $hasThemeUpdate = $hasThemeUpdate || $plugin['isTheme'];
+ $hasPluginUpdate = $hasPluginUpdate || !$plugin['isTheme'];
+ }
+
+ $subject = Piwik::translate('CoreUpdater_NotificationSubjectAvailablePluginUpdate');
+ $message = $this->buildNotificationMessage($pluginsToBeNotified, $hasThemeUpdate, $hasPluginUpdate);
+
+ $this->sendEmailNotification($subject, $message);
+ }
+
+ /**
+ * Send an email notification to all super users.
+ *
+ * @param $subject
+ * @param $message
+ */
+ protected function sendEmailNotification($subject, $message)
+ {
+ $superUsers = UsersManagerApi::getInstance()->getUsersHavingSuperUserAccess();
+
+ foreach ($superUsers as $superUser) {
+ $mail = new Mail();
+ $mail->setDefaultFromPiwik();
+ $mail->addTo($superUser['email']);
+ $mail->setSubject($subject);
+ $mail->setBodyText($message);
+ $mail->send();
+ }
+ }
+
+ protected function setHasLatestUpdateNotificationReceived($plugin)
+ {
+ $latestVersion = $this->getLatestVersion($plugin);
+
+ Option::set($this->getNotificationSentOptionName($plugin), $latestVersion);
+ }
+
+ protected function getLatestVersionSent($plugin)
+ {
+ return Option::get($this->getNotificationSentOptionName($plugin));
+ }
+
+ protected function getLatestVersion($plugin)
+ {
+ return $plugin['latestVersion'];
+ }
+
+ protected function hasNotificationAlreadyReceived($plugin)
+ {
+ $latestVersion = $this->getLatestVersion($plugin);
+ $lastVersionSent = $this->getLatestVersionSent($plugin);
+
+ if (!empty($lastVersionSent)
+ && ($latestVersion == $lastVersionSent
+ || version_compare($latestVersion, $lastVersionSent) == -1)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ protected function getNotificationSentOptionName($plugin)
+ {
+ return 'last_update_communication_sent_plugin_' . $plugin['name'];
+ }
+
+ protected function getPluginsHavingUpdate()
+ {
+ $marketplace = StaticContainer::get('Piwik\Plugins\Marketplace\Plugins');
+ $pluginsHavingUpdate = $marketplace->getPluginsHavingUpdate();
+
+ return $pluginsHavingUpdate;
+ }
+
+ protected function buildNotificationMessage($pluginsToBeNotified, $hasThemeUpdate, $hasPluginUpdate)
+ {
+ $message = Piwik::translate('ScheduledReports_EmailHello');
+ $message .= "\n\n";
+ $message .= Piwik::translate('CoreUpdater_ThereIsNewPluginVersionAvailableForUpdate');
+ $message .= "\n\n";
+
+ foreach ($pluginsToBeNotified as $plugin) {
+ $message .= sprintf(' * %s %s', $plugin['name'], $plugin['latestVersion']);
+ $message .= "\n";
+ }
+
+ $message .= "\n";
+
+ $host = SettingsPiwik::getPiwikUrl();
+
+ if ($hasThemeUpdate) {
+ $message .= Piwik::translate('CoreUpdater_NotificationClickToUpdateThemes') . "\n";
+ $message .= $host . 'index.php?module=CorePluginsAdmin&action=themes';
+ }
+
+ if ($hasPluginUpdate) {
+ if ($hasThemeUpdate) {
+ $message .= "\n\n";
+ }
+ $message .= Piwik::translate('CoreUpdater_NotificationClickToUpdatePlugins') . "\n";
+ $message .= $host . 'index.php?module=CorePluginsAdmin&action=plugins';
+ }
+
+ $message .= "\n\n";
+ $message .= Piwik::translate('Installation_HappyAnalysing');
+
+ return $message;
+ }
+}