primo commit
This commit is contained in:
		| @ -0,0 +1,154 @@ | ||||
| <?php | ||||
|  | ||||
| /** | ||||
|  * @package     Joomla.Administrator | ||||
|  * @subpackage  com_media | ||||
|  * | ||||
|  * @copyright   (C) 2017 Open Source Matters, Inc. <https://www.joomla.org> | ||||
|  * @license     GNU General Public License version 2 or later; see LICENSE.txt | ||||
|  */ | ||||
|  | ||||
| namespace Joomla\Component\Media\Administrator\Controller; | ||||
|  | ||||
| use Joomla\CMS\MVC\Controller\BaseController; | ||||
| use Joomla\CMS\Plugin\PluginHelper; | ||||
| use Joomla\CMS\Router\Route; | ||||
| use Joomla\Component\Media\Administrator\Event\OAuthCallbackEvent; | ||||
|  | ||||
| // phpcs:disable PSR1.Files.SideEffects | ||||
| \defined('_JEXEC') or die; | ||||
| // phpcs:enable PSR1.Files.SideEffects | ||||
|  | ||||
| /** | ||||
|  * Plugin Controller for OAuth2.0 callbacks | ||||
|  * | ||||
|  * This controller handles OAuth2 Callbacks | ||||
|  * | ||||
|  * @since  4.0.0 | ||||
|  */ | ||||
| class PluginController extends BaseController | ||||
| { | ||||
|     /** | ||||
|      * Handles an OAuth Callback request for a specified plugin. | ||||
|      * | ||||
|      * URLs containing [sitename]/administrator/index.php?option=com_media&task=plugin.oauthcallback | ||||
|      *  &plugin=[plugin_name] | ||||
|      * | ||||
|      * will be handled by this endpoint. | ||||
|      * It will select the plugin specified by plugin_name and pass all the data received from the provider | ||||
|      * | ||||
|      * @return void | ||||
|      * | ||||
|      * @since  4.0.0 | ||||
|      */ | ||||
|     public function oauthcallback() | ||||
|     { | ||||
|         try { | ||||
|             // Load plugin names | ||||
|             $pluginName = $this->input->getString('plugin', null); | ||||
|             $plugins    = PluginHelper::getPlugin('filesystem'); | ||||
|  | ||||
|             // If plugin name was not found in parameters redirect back to control panel | ||||
|             if (!$pluginName || !$this->containsPlugin($plugins, $pluginName)) { | ||||
|                 throw new \Exception('Plugin not found!'); | ||||
|             } | ||||
|  | ||||
|             // Check if the plugin is disabled, if so redirect to control panel | ||||
|             if (!PluginHelper::isEnabled('filesystem', $pluginName)) { | ||||
|                 throw new \Exception('Plugin ' . $pluginName . ' is disabled.'); | ||||
|             } | ||||
|  | ||||
|             // Only import our required plugin, not entire group | ||||
|             PluginHelper::importPlugin('filesystem', $pluginName); | ||||
|  | ||||
|             // Event parameters | ||||
|             $eventParameters = ['context' => $pluginName, 'input' => $this->input]; | ||||
|             $event           = new OAuthCallbackEvent('onFileSystemOAuthCallback', $eventParameters); | ||||
|  | ||||
|             // Get results from event | ||||
|             $eventResults = (array) $this->app->triggerEvent('onFileSystemOAuthCallback', $event); | ||||
|  | ||||
|             // If event was not triggered in the selected Plugin, raise a warning and fallback to Control Panel | ||||
|             if (!$eventResults) { | ||||
|                 throw new \Exception( | ||||
|                     'Plugin ' . $pluginName . ' should have implemented onFileSystemOAuthCallback method' | ||||
|                 ); | ||||
|             } | ||||
|  | ||||
|             $action  = $eventResults['action'] ?? null; | ||||
|  | ||||
|             // If there are any messages display them | ||||
|             if (isset($eventResults['message'])) { | ||||
|                 $message     = $eventResults['message']; | ||||
|                 $messageType = ($eventResults['message_type'] ?? ''); | ||||
|  | ||||
|                 $this->app->enqueueMessage($message, $messageType); | ||||
|             } | ||||
|  | ||||
|             /** | ||||
|              * Execute actions defined by the plugin | ||||
|              * Supported actions | ||||
|              *  - close         : Closes the current window, use this only for windows opened by javascript | ||||
|              *  - redirect      : Redirect to a URI defined in 'redirect_uri' parameter, if not fallback to control panel | ||||
|              *  - media-manager : Redirect to Media Manager | ||||
|              *  - control-panel : Redirect to Control Panel | ||||
|              */ | ||||
|             switch ($action) { | ||||
|                 case 'close': | ||||
|                     /** | ||||
|                      * Close a window opened by developer | ||||
|                      * Use this for close New Windows opened for OAuth Process | ||||
|                      */ | ||||
|                     $this->setRedirect(Route::_('index.php?option=com_media&view=plugin&action=close', false)); | ||||
|                     break; | ||||
|  | ||||
|                 case 'redirect': | ||||
|                     // Redirect browser to any page specified by the user | ||||
|                     if (!isset($eventResults['redirect_uri'])) { | ||||
|                         throw new \Exception("Redirect URI must be set in the plugin"); | ||||
|                     } | ||||
|  | ||||
|                     $this->setRedirect($eventResults['redirect_uri']); | ||||
|                     break; | ||||
|  | ||||
|                 case 'control-panel': | ||||
|                     // Redirect browser to Control Panel | ||||
|                     $this->setRedirect(Route::_('index.php', false)); | ||||
|                     break; | ||||
|  | ||||
|                 case 'media-manager': | ||||
|                 default: | ||||
|                     // Redirect browser to Media Manager | ||||
|                     $this->setRedirect(Route::_('index.php?option=com_media&view=media', false)); | ||||
|             } | ||||
|         } catch (\Exception $e) { | ||||
|             // Display any error | ||||
|             $this->app->enqueueMessage($e->getMessage(), 'error'); | ||||
|             $this->setRedirect(Route::_('index.php', false)); | ||||
|         } | ||||
|  | ||||
|         // Redirect | ||||
|         $this->redirect(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Check whether a plugin exists in given plugin array. | ||||
|      * | ||||
|      * @param   array   $plugins     Array of plugin names | ||||
|      * @param   string  $pluginName  Plugin name to look up | ||||
|      * | ||||
|      * @return bool | ||||
|      * | ||||
|      * @since  4.0.0 | ||||
|      */ | ||||
|     private function containsPlugin($plugins, $pluginName) | ||||
|     { | ||||
|         foreach ($plugins as $plugin) { | ||||
|             if ($plugin->name == $pluginName) { | ||||
|                 return true; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
		Reference in New Issue
	
	Block a user