Open Monograph Press  3.3.0
PluginGalleryGridHandler.inc.php
1 <?php
2 
16 import('lib.pkp.classes.controllers.grid.GridHandler');
17 import('lib.pkp.classes.linkAction.request.RemoteActionConfirmationModal');
18 
22 define('PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE', 'all');
23 
28  function __construct() {
29  parent::__construct();
30  $this->addRoleAssignment(
31  array(ROLE_ID_MANAGER, ROLE_ID_SITE_ADMIN),
32  array('fetchGrid', 'fetchRow', 'viewPlugin')
33  );
34  $this->addRoleAssignment(
35  array(ROLE_ID_SITE_ADMIN),
36  array('installPlugin', 'upgradePlugin')
37  );
38  }
39 
40 
41  //
42  // Implement template methods from PKPHandler.
43  //
47  function initialize($request, $args = null) {
48  parent::initialize($request, $args);
49  AppLocale::requireComponents(LOCALE_COMPONENT_PKP_MANAGER, LOCALE_COMPONENT_APP_DEFAULT);
50 
51  // Basic grid configuration.
52  $this->setTitle('manager.plugins.pluginGallery');
53 
54  //
55  // Grid columns.
56  //
57  import('lib.pkp.controllers.grid.plugins.PluginGalleryGridCellProvider');
58  $pluginGalleryGridCellProvider = new PluginGalleryGridCellProvider();
59 
60  // Plugin name.
61  $this->addColumn(
62  new GridColumn(
63  'name',
64  'common.name',
65  null,
66  null,
67  $pluginGalleryGridCellProvider
68  )
69  );
70 
71  // Description.
72  $this->addColumn(
73  new GridColumn(
74  'summary',
75  'common.description',
76  null,
77  null,
78  $pluginGalleryGridCellProvider,
79  array('width' => 50, 'alignment' => COLUMN_ALIGNMENT_LEFT)
80  )
81  );
82 
83  // Status.
84  $this->addColumn(
85  new GridColumn(
86  'status',
87  'common.status',
88  null,
89  null,
90  $pluginGalleryGridCellProvider,
91  array('width' => 20)
92  )
93  );
94  }
95 
99  function authorize($request, &$args, $roleAssignments) {
100  import('lib.pkp.classes.security.authorization.PolicySet');
101  $rolePolicy = new PolicySet(COMBINING_PERMIT_OVERRIDES);
102 
103  import('lib.pkp.classes.security.authorization.RoleBasedHandlerOperationPolicy');
104  foreach($roleAssignments as $role => $operations) {
105  $rolePolicy->addPolicy(new RoleBasedHandlerOperationPolicy($request, $role, $operations));
106  }
107  $this->addPolicy($rolePolicy);
108 
109  return parent::authorize($request, $args, $roleAssignments);
110  }
111 
112  //
113  // Implement methods from GridHandler.
114  //
121  protected function loadData($request, $filter) {
122  // Get all plugins.
123  $pluginGalleryDao = DAORegistry::getDAO('PluginGalleryDAO'); /* @var $pluginGalleryDao PluginGalleryDAO */
124  return $pluginGalleryDao->getNewestCompatible(
126  $request->getUserVar('category'),
127  $request->getUserVar('pluginText')
128  );
129  }
130 
134  protected function getFilterForm() {
135  return 'controllers/grid/plugins/pluginGalleryGridFilter.tpl';
136  }
137 
141  function getFilterSelectionData($request) {
142  $category = $request->getUserVar('category');
143  $pluginName = $request->getUserVar('pluginText');
144 
145  if (is_null($category)) {
146  $category = PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE;
147  }
148 
149  return array('category' => $category, 'pluginText' => $pluginName);
150  }
151 
155  protected function renderFilter($request, $filterData = array()) {
156  $categoriesSymbolic = $categories = PluginRegistry::getCategories();
157  $categories = array(PLUGIN_GALLERY_ALL_CATEGORY_SEARCH_VALUE => __('grid.plugin.allCategories'));
158  foreach ($categoriesSymbolic as $category) {
159  $categories[$category] = __("plugins.categories.$category");
160  }
161  $filterData['categories'] = $categories;
162 
163  return parent::renderFilter($request, $filterData);
164  }
165 
166  //
167  // Public operations
168  //
175  function viewPlugin($args, $request) {
176  $plugin = $this->_getSpecifiedPlugin($request);
177 
178  // Display plugin information
179  $templateMgr = TemplateManager::getManager($request);
180  $templateMgr->assign('plugin', $plugin);
181 
182  // Get currently installed version, if any.
183  $installActionKey = $installConfirmKey = $installOp = null;
184  switch ($plugin->getCurrentStatus()) {
185  case PLUGIN_GALLERY_STATE_NEWER:
186  $statusKey = 'manager.plugins.installedVersionNewer';
187  $statusClass = 'newer';
188  break;
189  case PLUGIN_GALLERY_STATE_UPGRADABLE:
190  $statusKey = 'manager.plugins.installedVersionOlder';
191  $statusClass = 'older';
192  $installActionKey='grid.action.upgrade';
193  $installOp = 'upgradePlugin';
194  $installConfirmKey = 'manager.plugins.upgradeConfirm';
195  break;
196  case PLUGIN_GALLERY_STATE_CURRENT:
197  $statusKey = 'manager.plugins.installedVersionNewest';
198  $statusClass = 'newest';
199  break;
200  case PLUGIN_GALLERY_STATE_AVAILABLE:
201  $statusKey = 'manager.plugins.noInstalledVersion';
202  $statusClass = 'notinstalled';
203  $installActionKey='grid.action.install';
204  $installOp = 'installPlugin';
205  $installConfirmKey = 'manager.plugins.installConfirm';
206  break;
207  case PLUGIN_GALLERY_STATE_INCOMPATIBLE:
208  $statusKey = 'manager.plugins.noCompatibleVersion';
209  $statusClass = 'incompatible';
210  break;
211  default: return assert(false);
212  }
213  $templateMgr->assign('statusKey', $statusKey);
214  $templateMgr->assign('statusClass', $statusClass);
215 
216  $router = $request->getRouter();
217  if (Validation::isSiteAdmin() && $installOp) $templateMgr->assign('installAction', new LinkAction(
218  'installPlugin',
220  $request->getSession(),
221  __($installConfirmKey),
222  __($installActionKey),
223  $router->url($request, null, null, $installOp, null, array('rowId' => $request->getUserVar('rowId'))),
224  'modal_information'
225  ),
226  __($installActionKey),
227  null
228  ));
229  return new JSONMessage(true, $templateMgr->fetch('controllers/grid/plugins/viewPlugin.tpl'));
230  }
231 
237  function upgradePlugin($args, $request) {
238  return $this->installPlugin($args, $request, true);
239  }
240 
247  function installPlugin($args, $request, $isUpgrade = false) {
248  $redirectUrl = $request->getDispatcher()->url($request, ROUTE_PAGE, null, 'management', 'settings', array('website'), array('r' => uniqid()), 'plugins');
249  if (!$request->checkCSRF()) return $request->redirectUrlJson($redirectUrl);
250 
251  $plugin = $this->_getSpecifiedPlugin($request);
252  $notificationMgr = new NotificationManager();
253  $user = $request->getUser();
254 
255  // Download the file and ensure the MD5 sum
256  $destPath = tempnam(sys_get_temp_dir(), 'plugin');
257 
258  // Download the plugin package.
259  try {
260  $client = Application::get()->getHttpClient();
261  $response = $client->request('GET', $plugin->getReleasePackage());
262  if (file_put_contents($destPath, $body->getContents())) throw new Exception('Unable to save plugin to local file!');
263  } catch (Exception $e) {
264  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => $e->getMessage()));
265  return $request->redirectUrlJson($redirectUrl);
266  }
267 
268  // Verify the plugin checksum.
269  if (md5_file($destPath) !== $plugin->getReleaseMD5()) {
270  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => 'Incorrect MD5 checksum!'));
271  unlink($destPath);
272  return $request->redirectUrlJson($redirectUrl);
273  }
274 
275  // Extract the plugin
276  import('lib.pkp.classes.plugins.PluginHelper');
277  $pluginHelper = new PluginHelper();
278  try {
279  $pluginDir = $pluginHelper->extractPlugin($destPath, $plugin->getProduct() . '-' . $plugin->getVersion());
280  } catch (Exception $e) {
281  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => $e->getMessage()));
282  return $request->redirectUrlJson($redirectUrl);
283  } finally {
284  unlink($destPath);
285  }
286 
287  // Install or upgrade the plugin
288  try {
289  if (!$isUpgrade) {
290  $pluginVersion = $pluginHelper->installPlugin($pluginDir);
291  } else {
292  $pluginVersion = $pluginHelper->upgradePlugin($plugin->getCategory(), $plugin->getProduct(), $pluginDir);
293  }
294 
295  // Notify of success.
296  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_SUCCESS, array('contents' => __('manager.plugins.upgradeSuccessful', array('versionString' => $pluginVersion->getVersionString(false)))));
297  } catch (Exception $e) {
298  $notificationMgr->createTrivialNotification($user->getId(), NOTIFICATION_TYPE_ERROR, array('contents' => $e->getMessage()));
299  if (!$isUpgrade) {
300  import('lib.pkp.classes.file.TemporaryFileManager');
301  $temporaryFileManager = new TemporaryFileManager();
302  $temporaryFileManager->rmtree($pluginDir);
303  }
304  }
305  return $request->redirectUrlJson($redirectUrl);
306  }
307 
313  function _getSpecifiedPlugin($request) {
314  // Get all plugins.
315  $pluginGalleryDao = DAORegistry::getDAO('PluginGalleryDAO'); /* @var $pluginGalleryDao PluginGalleryDAO */
316  $plugins = $pluginGalleryDao->getNewestCompatible(Application::get());
317 
318  // Get specified plugin. Indexes into $plugins are 0-based
319  // but row IDs are 1-based; compensate.
320  $rowId = (int) $request->getUserVar('rowId')-1;
321  if (!isset($plugins[$rowId])) fatalError('Invalid row ID!');
322  return $plugins[$rowId];
323  }
324 }
325 
326 
PKPHandler\addRoleAssignment
addRoleAssignment($roleIds, $operations)
Definition: PKPHandler.inc.php:213
PluginGalleryGridHandler\installPlugin
installPlugin($args, $request, $isUpgrade=false)
Definition: PluginGalleryGridHandler.inc.php:247
TemporaryFileManager
Definition: TemporaryFileManager.inc.php:19
GridColumn
The GridColumn class represents a column within a grid. It is used to format the data presented in a ...
Definition: GridColumn.inc.php:27
AppLocale\requireComponents
static requireComponents()
Definition: env1/MockAppLocale.inc.php:56
Validation\isSiteAdmin
static isSiteAdmin()
Definition: Validation.inc.php:400
PluginGalleryGridHandler\__construct
__construct()
Definition: PluginGalleryGridHandler.inc.php:28
RemoteActionConfirmationModal
Class defining a simple confirmation modal with a remote action and ok/cancel buttons.
Definition: RemoteActionConfirmationModal.inc.php:18
DAORegistry\getDAO
static & getDAO($name, $dbconn=null)
Definition: DAORegistry.inc.php:57
PluginGalleryGridHandler\renderFilter
renderFilter($request, $filterData=array())
Definition: PluginGalleryGridHandler.inc.php:155
GridHandler\addColumn
addColumn($column)
Definition: GridHandler.inc.php:335
PluginGalleryGridHandler\authorize
authorize($request, &$args, $roleAssignments)
Definition: PluginGalleryGridHandler.inc.php:99
PluginGalleryGridHandler\_getSpecifiedPlugin
_getSpecifiedPlugin($request)
Definition: PluginGalleryGridHandler.inc.php:313
PluginGalleryGridHandler\loadData
loadData($request, $filter)
Definition: PluginGalleryGridHandler.inc.php:121
PluginGalleryGridHandler\initialize
initialize($request, $args=null)
Definition: PluginGalleryGridHandler.inc.php:47
JSONMessage
Class to represent a JSON (Javascript Object Notation) message.
Definition: JSONMessage.inc.php:18
PluginGalleryGridHandler\getFilterForm
getFilterForm()
Definition: PluginGalleryGridHandler.inc.php:134
LinkAction
Base class defining an action that can be performed by the user in the user interface.
Definition: LinkAction.inc.php:22
GridHandler\setTitle
setTitle($title)
Definition: GridHandler.inc.php:215
PKPTemplateManager\getManager
static & getManager($request=null)
Definition: PKPTemplateManager.inc.php:1239
PluginRegistry\getCategories
static getCategories()
Definition: PluginRegistry.inc.php:196
GridHandler
This class defines basic operations for handling HTML grids. Grids are used to implement a standardiz...
Definition: GridHandler.inc.php:58
PluginHelper
Helper class implementing plugin administration functions.
Definition: PluginHelper.inc.php:29
PluginGalleryGridHandler
Handle review form grid requests.
Definition: PluginGalleryGridHandler.inc.php:24
PluginGalleryGridHandler\getFilterSelectionData
getFilterSelectionData($request)
Definition: PluginGalleryGridHandler.inc.php:141
NotificationManager
Definition: NotificationManager.inc.php:19
PluginGalleryGridCellProvider
Provide information about plugins to the plugin gallery grid handler.
Definition: PluginGalleryGridCellProvider.inc.php:18
RoleBasedHandlerOperationPolicy
Class to control access to handler operations via role based access control.
Definition: RoleBasedHandlerOperationPolicy.inc.php:18
PKPApplication\get
static get()
Definition: PKPApplication.inc.php:235
PKPHandler\addPolicy
addPolicy($authorizationPolicy, $addToTop=false)
Definition: PKPHandler.inc.php:157
fatalError
if(!function_exists('import')) fatalError($reason)
Definition: functions.inc.php:32
PluginGalleryGridHandler\viewPlugin
viewPlugin($args, $request)
Definition: PluginGalleryGridHandler.inc.php:175
PluginGalleryGridHandler\upgradePlugin
upgradePlugin($args, $request)
Definition: PluginGalleryGridHandler.inc.php:237
PolicySet
An ordered list of policies. Policy sets can be added to decision managers like policies....
Definition: PolicySet.inc.php:26