Skip to content
Extraits de code Groupes Projets
Controller.php 9,32 ko
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Piwik - Open source web analytics
    
    robocoder's avatar
    robocoder a validé
     * @license http://www.gnu.org/licenses/gpl-3.0.html GPL v3 or later
    
    robocoder's avatar
    robocoder a validé
     * @category Piwik_Plugins
    
    mattab's avatar
    mattab a validé
    use Piwik\Common;
    
    Thomas Steur's avatar
    Thomas Steur a validé
    use Piwik\Date;
    
    use Piwik\Filechecks;
    
    use Piwik\Filesystem;
    
    class Controller extends \Piwik\Controller\Admin
    
        private $validSortMethods  = array('popular', 'newest', 'alpha');
    
        private $defaultSortMethod = 'popular';
    
        private function createUpdateOrInstallView($template, $nonceName)
    
            $view = $this->configureView('@CorePluginsAdmin/' . $template);
    
            $pluginName = Common::getRequestVar('pluginName', null, 'string');
            $nonce      = Common::getRequestVar('nonce', null, 'string');
    
            $view->plugin = array('name' => $pluginName);
    
    
            if (!Nonce::verifyNonce('CorePluginsAdmin.' . $nonceName, $nonce)) {
    
    Thomas Steur's avatar
    Thomas Steur a validé
                $view->errorMessage = Piwik_Translate('General_ExceptionNonceMismatch');
    
            Nonce::discardNonce('CorePluginsAdmin.' . $nonceName);
    
            try {
                $pluginInstaller = new PluginInstaller($pluginName);
                $pluginInstaller->installOrUpdatePluginFromMarketplace();
    
    
            } catch (\Exception $e) {
    
                $view->errorMessage = $e->getMessage();
    
            $marketplace  = new Marketplace();
    
            $view->plugin = $marketplace->getPluginInfo($pluginName);
    
    
            return $view;
        }
    
        public function updatePlugin()
        {
            $view = $this->createUpdateOrInstallView('updatePlugin', 'updatePlugin');
    
        public function installPlugin()
        {
    
            $view = $this->createUpdateOrInstallView('installPlugin', 'installPlugin');
            $view->nonce = Nonce::getNonce('CorePluginsAdmin.activatePlugin');
    
        public function pluginDetails()
        {
    
            $pluginName = Common::getRequestVar('pluginName', null, 'string');
    
            $view = $this->configureView('@CorePluginsAdmin/pluginDetails');
    
                $marketplace  = new Marketplace();
    
                $view->plugin = $marketplace->getPluginInfo($pluginName);
            } catch (\Exception $e) {
                $view->errorMessage = $e->getMessage();
            }
    
        private function createBrowsePluginsOrThemesView($template, $themesOnly)
    
            $query = Common::getRequestVar('query', '', 'string', $_POST);
            $sort  = Common::getRequestVar('sort', $this->defaultSortMethod, 'string');
    
            if (!in_array($sort, $this->validSortMethods)) {
                $sort = $this->defaultSortMethod;
            }
    
            $view = $this->configureView('@CorePluginsAdmin/' . $template);
    
    Thomas Steur's avatar
    Thomas Steur a validé
    
    
            $marketplace   = new Marketplace();
    
            $view->plugins = $marketplace->searchPlugins($query, $sort, $themesOnly);
    
    Thomas Steur's avatar
    Thomas Steur a validé
    
    
            $view->query   = $query;
    
            $view->sort    = $sort;
    
            $view->installNonce = Nonce::getNonce('CorePluginsAdmin.installPlugin');
            $view->updateNonce  = Nonce::getNonce('CorePluginsAdmin.updatePlugin');
    
            $view->isSuperUser  = Piwik::isUserIsSuperUser();
    
            return $view;
        }
    
        public function browsePlugins()
        {
            $view = $this->createBrowsePluginsOrThemesView('browsePlugins', $themesOnly = false);
    
            echo $view->render();
        }
    
    
        public function browseThemes()
    
            $view = $this->createBrowsePluginsOrThemesView('browseThemes', $themesOnly = true);
    
    mattab's avatar
    mattab a validé
        function extend()
    
    mattab's avatar
    mattab a validé
            $view = $this->configureView('@CorePluginsAdmin/extend');
    
        private function createPluginsOrThemesView($template, $themesOnly)
    
            $activated  = Common::getRequestVar('activated', false, 'integer', $_GET);
            $pluginName = Common::getRequestVar('pluginName', '', 'string');
    
            $pluginName = strip_tags($pluginName);
    
            $view = $this->configureView('@CorePluginsAdmin/' . $template);
    
            $view->activatedPluginName = '';
            if ($activated && $pluginName) {
                $view->activatedPluginName = $pluginName;
            }
    
    
            $view->updateNonce   = Nonce::getNonce('CorePluginsAdmin.updatePlugin');
            $view->activateNonce = Nonce::getNonce('CorePluginsAdmin.activatePlugin');
    
            $view->pluginsInfo   = $this->getPluginsInfo($themesOnly);
    
            $marketplace = new Marketplace();
    
            $view->pluginsHavingUpdate = $marketplace->getPluginsHavingUpdate($themesOnly);
    
            return $view;
        }
    
        function plugins()
        {
            $view = $this->createPluginsOrThemesView('plugins', $themesOnly = false);
    
            $view = $this->createPluginsOrThemesView('themes', $themesOnly = true);
    
            echo $view->render();
        }
    
        protected function configureView($template)
        {
    
            $this->setBasicVariablesView($view);
            $this->displayWarningIfConfigFileNotWritable($view);
    
        protected function getPluginsInfo($themesOnly = false)
    
            $plugins = PluginsManager::getInstance()->returnLoadedPluginsInfo();
    
            foreach ($plugins as $pluginName => &$plugin) {
                if (!isset($plugin['info'])) {
    
                        $description = '<strong><em>'
                                    . Piwik_Translate('CorePluginsAdmin_PluginNotCompatibleWith', array($pluginName, self::getPiwikVersion()))
                                    . '</strong> <br/> '
                                    . Piwik_Translate('CorePluginsAdmin_PluginAskDevToUpdate')
                                    . '</em>';
    
                        'version'     => Piwik_Translate('General_Unknown'),
    
    mattab's avatar
    mattab a validé
            $pluginsFiltered = $this->keepPluginsOrThemes($themesOnly, $plugins);
            return $pluginsFiltered;
        }
    
    mattab's avatar
    mattab a validé
        protected function keepPluginsOrThemes($themesOnly, $plugins)
        {
    
    mattab's avatar
    mattab a validé
            foreach ($plugins as $name => $thisPlugin) {
    
                $isTheme = false;
                if (!empty($thisPlugin['info']['theme'])) {
                    $isTheme = (bool)$thisPlugin['info']['theme'];
                }
                if (($themesOnly && $isTheme)
                    || (!$themesOnly && !$isTheme)
                ) {
                    $pluginsFiltered[$name] = $thisPlugin;
    
        public function deactivate($redirectAfter = true)
        {
    
            $pluginName = $this->initPluginModification();
    
            \Piwik\PluginsManager::getInstance()->deactivatePlugin($pluginName);
    
            $this->redirectAfterModification($redirectAfter);
        }
    
        protected function redirectAfterModification($redirectAfter)
        {
    
        protected function initPluginModification()
    
        {
            Piwik::checkUserIsSuperUser();
            $this->checkTokenInUrl();
    
            $pluginName = Common::getRequestVar('pluginName', null, 'string');
    
            return $pluginName;
        }
    
        public function activate($redirectAfter = true)
        {
    
            $pluginName = Common::getRequestVar('pluginName', null, 'string');
            $nonce      = Common::getRequestVar('nonce', null, 'string');
    
    
            if (!Nonce::verifyNonce('CorePluginsAdmin.activatePlugin', $nonce)) {
    
    Thomas Steur's avatar
    Thomas Steur a validé
                throw new \Exception(Piwik_Translate('General_ExceptionNonceMismatch'));
    
            }
    
            Nonce::discardNonce('CorePluginsAdmin.activatePlugin');
    
    
            \Piwik\PluginsManager::getInstance()->activatePlugin($pluginName);
    
                $params = array('activated' => 1, 'pluginName' => $pluginName);
    
                $plugin = PluginsManager::getInstance()->loadPlugin($pluginName);
    
                $actionToRedirect = 'plugins';
    
                    $actionToRedirect = 'themes';
    
    
                $this->redirectToIndex('CorePluginsAdmin', $actionToRedirect, null, null, null, $params);
    
        }
    
        public function uninstall($redirectAfter = true)
        {
            $pluginName = $this->initPluginModification();
    
            $uninstalled = \Piwik\PluginsManager::getInstance()->uninstallPlugin($pluginName);
    
                $path = Filesystem::getPathToPiwikRoot() . '/plugins/' . $pluginName . '/';
    
                $messagePermissions = Filechecks::getErrorMessageMissingPermissions($path);
    
    
                $messageIntro = Piwik_Translate("Warning: \"%s\" could not be uninstalled. Piwik did not have enough permission to delete the files in $path. ",
                    $pluginName);
                $exitMessage = $messageIntro . "<br/><br/>" . $messagePermissions;
                Piwik_ExitWithMessage($exitMessage, $optionalTrace = false, $optionalLinks = false, $optionalLinkBack = true);
    
            $this->redirectAfterModification($redirectAfter);