diff options
author | Thomas Steur <tsteur@users.noreply.github.com> | 2016-11-15 04:03:59 +0300 |
---|---|---|
committer | Matthieu Aubry <mattab@users.noreply.github.com> | 2016-11-15 04:03:59 +0300 |
commit | 587cc39e0362719332d410b7a4d5ddcc68788eeb (patch) | |
tree | c982c369cdda542c3a4de08be11c893e5364838c /plugins/Marketplace/UpdateCommunication.php | |
parent | 64314b26dbc6619d535002bdb79b9e55d1fc87db (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.php | 208 |
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; + } +} |