Verzeichnisstruktur phpBB-3.2.0
- Veröffentlicht
- 06.01.2017
So funktioniert es
|
Auf das letzte Element klicken. Dies geht jeweils ein Schritt zurück |
Auf das Icon klicken, dies öffnet das Verzeichnis. Nochmal klicken schließt das Verzeichnis. |
|
(Beispiel Datei-Icons)
|
Auf das Icon klicken um den Quellcode anzuzeigen |
acp_extensions.php
001 <?php
002 /**
003 *
004 * This file is part of the phpBB Forum Software package.
005 *
006 * @copyright (c) phpBB Limited <https://www.phpbb.com>
007 * @license GNU General Public License, version 2 (GPL-2.0)
008 *
009 * For full copyright and license information, please see
010 * the docs/CREDITS.txt file.
011 *
012 */
013
014 use phpbb\exception\exception_interface;
015 use phpbb\exception\version_check_exception;
016
017 /**
018 * @ignore
019 */
020 if (!defined('IN_PHPBB'))
021 {
022 exit;
023 }
024
025 class acp_extensions
026 {
027 var $u_action;
028
029 private $db;
030 private $config;
031 private $template;
032 private $user;
033 private $cache;
034 private $log;
035 private $request;
036
037 function main()
038 {
039 // Start the page
040 global $config, $user, $template, $request, $phpbb_extension_manager, $db, $phpbb_root_path, $phpbb_log, $cache, $phpbb_dispatcher;
041
042 $this->db = $db;
043 $this->config = $config;
044 $this->template = $template;
045 $this->user = $user;
046 $this->cache = $cache;
047 $this->request = $request;
048 $this->log = $phpbb_log;
049 $this->phpbb_dispatcher = $phpbb_dispatcher;
050
051 $user->add_lang(array('install', 'acp/extensions', 'migrator'));
052
053 $this->page_title = 'ACP_EXTENSIONS';
054
055 $action = $request->variable('action', 'list');
056 $ext_name = $request->variable('ext_name', '');
057
058 // What is a safe limit of execution time? Half the max execution time should be safe.
059 $safe_time_limit = (ini_get('max_execution_time') / 2);
060 $start_time = time();
061
062 /**
063 * Event to run a specific action on extension
064 *
065 * @event core.acp_extensions_run_action
066 * @var string action Action to run
067 * @var string u_action Url we are at
068 * @var string ext_name Extension name from request
069 * @var int safe_time_limit Safe limit of execution time
070 * @var int start_time Start time
071 * @since 3.1.11-RC1
072 */
073 $u_action = $this->u_action;
074 $vars = array('action', 'u_action', 'ext_name', 'safe_time_limit', 'start_time');
075 extract($this->phpbb_dispatcher->trigger_event('core.acp_extensions_run_action', compact($vars)));
076
077 // Cancel action
078 if ($request->is_set_post('cancel'))
079 {
080 $action = 'list';
081 $ext_name = '';
082 }
083
084 if (in_array($action, array('enable', 'disable', 'delete_data')) && !check_link_hash($request->variable('hash', ''), $action . '.' . $ext_name))
085 {
086 trigger_error('FORM_INVALID', E_USER_WARNING);
087 }
088
089 // If they've specified an extension, let's load the metadata manager and validate it.
090 if ($ext_name)
091 {
092 $md_manager = new \phpbb\extension\metadata_manager($ext_name, $config, $phpbb_extension_manager, $phpbb_root_path);
093
094 try
095 {
096 $md_manager->get_metadata('all');
097 }
098 catch (exception_interface $e)
099 {
100 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
101 trigger_error($message, E_USER_WARNING);
102 }
103 }
104
105 // What are we doing?
106 switch ($action)
107 {
108 case 'set_config_version_check_force_unstable':
109 $force_unstable = $this->request->variable('force_unstable', false);
110
111 if ($force_unstable)
112 {
113 $s_hidden_fields = build_hidden_fields(array(
114 'force_unstable' => $force_unstable,
115 ));
116
117 confirm_box(false, $user->lang('EXTENSION_FORCE_UNSTABLE_CONFIRM'), $s_hidden_fields);
118 }
119 else
120 {
121 $config->set('extension_force_unstable', false);
122 trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
123 }
124 break;
125
126 case 'list':
127 default:
128 if (confirm_box(true))
129 {
130 $config->set('extension_force_unstable', true);
131 trigger_error($user->lang['CONFIG_UPDATED'] . adm_back_link($this->u_action));
132 }
133
134 $this->list_enabled_exts($phpbb_extension_manager);
135 $this->list_disabled_exts($phpbb_extension_manager);
136 $this->list_available_exts($phpbb_extension_manager);
137
138 $this->template->assign_vars(array(
139 'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=list&versioncheck_force=1',
140 'FORCE_UNSTABLE' => $config['extension_force_unstable'],
141 'U_ACTION' => $this->u_action,
142 ));
143
144 $this->tpl_name = 'acp_ext_list';
145 break;
146
147 case 'enable_pre':
148 if (!$md_manager->validate_dir())
149 {
150 trigger_error($user->lang['EXTENSION_DIR_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
151 }
152
153 if (!$md_manager->validate_enable())
154 {
155 trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
156 }
157
158 $extension = $phpbb_extension_manager->get_extension($ext_name);
159 if (!$extension->is_enableable())
160 {
161 trigger_error($user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
162 }
163
164 if ($phpbb_extension_manager->is_enabled($ext_name))
165 {
166 redirect($this->u_action);
167 }
168
169 $this->tpl_name = 'acp_ext_enable';
170
171 $template->assign_vars(array(
172 'PRE' => true,
173 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_ENABLE_CONFIRM', $md_manager->get_metadata('display-name')),
174 'U_ENABLE' => $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name),
175 ));
176 break;
177
178 case 'enable':
179 if (!$md_manager->validate_dir())
180 {
181 trigger_error($user->lang['EXTENSION_DIR_INVALID'] . adm_back_link($this->u_action), E_USER_WARNING);
182 }
183
184 if (!$md_manager->validate_enable())
185 {
186 trigger_error($user->lang['EXTENSION_NOT_AVAILABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
187 }
188
189 $extension = $phpbb_extension_manager->get_extension($ext_name);
190 if (!$extension->is_enableable())
191 {
192 trigger_error($user->lang['EXTENSION_NOT_ENABLEABLE'] . adm_back_link($this->u_action), E_USER_WARNING);
193 }
194
195 try
196 {
197 while ($phpbb_extension_manager->enable_step($ext_name))
198 {
199 // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
200 if ((time() - $start_time) >= $safe_time_limit)
201 {
202 $template->assign_var('S_NEXT_STEP', true);
203
204 meta_refresh(0, $this->u_action . '&action=enable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('enable.' . $ext_name));
205 }
206 }
207 $this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_ENABLE', time(), array($ext_name));
208 }
209 catch (\phpbb\db\migration\exception $e)
210 {
211 $template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($user));
212 }
213
214 $this->tpl_name = 'acp_ext_enable';
215
216 $template->assign_vars(array(
217 'U_RETURN' => $this->u_action . '&action=list',
218 ));
219 break;
220
221 case 'disable_pre':
222 if (!$phpbb_extension_manager->is_enabled($ext_name))
223 {
224 redirect($this->u_action);
225 }
226
227 $this->tpl_name = 'acp_ext_disable';
228
229 $template->assign_vars(array(
230 'PRE' => true,
231 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DISABLE_CONFIRM', $md_manager->get_metadata('display-name')),
232 'U_DISABLE' => $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name),
233 ));
234 break;
235
236 case 'disable':
237 if (!$phpbb_extension_manager->is_enabled($ext_name))
238 {
239 redirect($this->u_action);
240 }
241
242 while ($phpbb_extension_manager->disable_step($ext_name))
243 {
244 // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
245 if ((time() - $start_time) >= $safe_time_limit)
246 {
247 $template->assign_var('S_NEXT_STEP', true);
248
249 meta_refresh(0, $this->u_action . '&action=disable&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('disable.' . $ext_name));
250 }
251 }
252 $this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_DISABLE', time(), array($ext_name));
253
254 $this->tpl_name = 'acp_ext_disable';
255
256 $template->assign_vars(array(
257 'U_RETURN' => $this->u_action . '&action=list',
258 ));
259 break;
260
261 case 'delete_data_pre':
262 if ($phpbb_extension_manager->is_enabled($ext_name))
263 {
264 redirect($this->u_action);
265 }
266 $this->tpl_name = 'acp_ext_delete_data';
267
268 $template->assign_vars(array(
269 'PRE' => true,
270 'L_CONFIRM_MESSAGE' => $this->user->lang('EXTENSION_DELETE_DATA_CONFIRM', $md_manager->get_metadata('display-name')),
271 'U_PURGE' => $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name),
272 ));
273 break;
274
275 case 'delete_data':
276 if ($phpbb_extension_manager->is_enabled($ext_name))
277 {
278 redirect($this->u_action);
279 }
280
281 try
282 {
283 while ($phpbb_extension_manager->purge_step($ext_name))
284 {
285 // Are we approaching the time limit? If so we want to pause the update and continue after refreshing
286 if ((time() - $start_time) >= $safe_time_limit)
287 {
288 $template->assign_var('S_NEXT_STEP', true);
289
290 meta_refresh(0, $this->u_action . '&action=delete_data&ext_name=' . urlencode($ext_name) . '&hash=' . generate_link_hash('delete_data.' . $ext_name));
291 }
292 }
293 $this->log->add('admin', $user->data['user_id'], $user->ip, 'LOG_EXT_PURGE', time(), array($ext_name));
294 }
295 catch (\phpbb\db\migration\exception $e)
296 {
297 $template->assign_var('MIGRATOR_ERROR', $e->getLocalisedMessage($user));
298 }
299
300 $this->tpl_name = 'acp_ext_delete_data';
301
302 $template->assign_vars(array(
303 'U_RETURN' => $this->u_action . '&action=list',
304 ));
305 break;
306
307 case 'details':
308 // Output it to the template
309 $md_manager->output_template_data($template);
310
311 $meta = $md_manager->get_metadata('all');
312 if (isset($meta['extra']['version-check']))
313 {
314 try
315 {
316 $updates_available = $phpbb_extension_manager->version_check($md_manager, $request->variable('versioncheck_force', false), $this->config['extension_force_unstable'] ? 'unstable' : null);
317
318 $template->assign_vars(array(
319 'S_UP_TO_DATE' => empty($updates_available),
320 'UP_TO_DATE_MSG' => $this->user->lang(empty($updates_available) ? 'UP_TO_DATE' : 'NOT_UP_TO_DATE', $md_manager->get_metadata('display-name')),
321 ));
322
323 foreach ($updates_available as $branch => $version_data)
324 {
325 $template->assign_block_vars('updates_available', $version_data);
326 }
327 }
328 catch (exception_interface $e)
329 {
330 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
331
332 $template->assign_vars(array(
333 'S_VERSIONCHECK_FAIL' => true,
334 'VERSIONCHECK_FAIL_REASON' => ($e->getMessage() !== 'VERSIONCHECK_FAIL') ? $message : '',
335 ));
336 }
337 $template->assign_var('S_VERSIONCHECK', true);
338 }
339 else
340 {
341 $template->assign_var('S_VERSIONCHECK', false);
342 }
343
344 $template->assign_vars(array(
345 'U_BACK' => $this->u_action . '&action=list',
346 'U_VERSIONCHECK_FORCE' => $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name')),
347 ));
348
349 $this->tpl_name = 'acp_ext_details';
350 break;
351 }
352 }
353
354 /**
355 * Lists all the enabled extensions and dumps to the template
356 *
357 * @param $phpbb_extension_manager An instance of the extension manager
358 * @return null
359 */
360 public function list_enabled_exts(\phpbb\extension\manager $phpbb_extension_manager)
361 {
362 $enabled_extension_meta_data = array();
363
364 foreach ($phpbb_extension_manager->all_enabled() as $name => $location)
365 {
366 $md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
367
368 try
369 {
370 $meta = $md_manager->get_metadata('all');
371 $enabled_extension_meta_data[$name] = array(
372 'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
373 'META_VERSION' => $meta['version'],
374 );
375
376 if (isset($meta['extra']['version-check']))
377 {
378 try
379 {
380 $force_update = $this->request->variable('versioncheck_force', false);
381 $updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
382
383 $enabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
384 $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
385 $enabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name'));
386 }
387 catch (exception_interface $e)
388 {
389 // Ignore exceptions due to the version check
390 }
391 }
392 else
393 {
394 $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
395 }
396 }
397 catch (exception_interface $e)
398 {
399 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
400 $this->template->assign_block_vars('disabled', array(
401 'META_DISPLAY_NAME' => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
402 'S_VERSIONCHECK' => false,
403 ));
404 }
405 catch (\RuntimeException $e)
406 {
407 $enabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
408 }
409 }
410
411 uasort($enabled_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
412
413 foreach ($enabled_extension_meta_data as $name => $block_vars)
414 {
415 $block_vars['NAME'] = $name;
416 $block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);
417
418 $this->template->assign_block_vars('enabled', $block_vars);
419
420 $this->output_actions('enabled', array(
421 'DISABLE' => $this->u_action . '&action=disable_pre&ext_name=' . urlencode($name),
422 ));
423 }
424 }
425
426 /**
427 * Lists all the disabled extensions and dumps to the template
428 *
429 * @param $phpbb_extension_manager An instance of the extension manager
430 * @return null
431 */
432 public function list_disabled_exts(\phpbb\extension\manager $phpbb_extension_manager)
433 {
434 $disabled_extension_meta_data = array();
435
436 foreach ($phpbb_extension_manager->all_disabled() as $name => $location)
437 {
438 $md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
439
440 try
441 {
442 $meta = $md_manager->get_metadata('all');
443 $disabled_extension_meta_data[$name] = array(
444 'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
445 'META_VERSION' => $meta['version'],
446 );
447
448 if (isset($meta['extra']['version-check']))
449 {
450 $force_update = $this->request->variable('versioncheck_force', false);
451 $updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
452
453 $disabled_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
454 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
455 $disabled_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name'));
456 }
457 else
458 {
459 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
460 }
461 }
462 catch (version_check_exception $e)
463 {
464 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
465 }
466 catch (exception_interface $e)
467 {
468 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
469 $this->template->assign_block_vars('disabled', array(
470 'META_DISPLAY_NAME' => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
471 'S_VERSIONCHECK' => false,
472 ));
473 }
474 catch (\RuntimeException $e)
475 {
476 $disabled_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
477 }
478 }
479
480 uasort($disabled_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
481
482 foreach ($disabled_extension_meta_data as $name => $block_vars)
483 {
484 $block_vars['NAME'] = $name;
485 $block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);
486
487 $this->template->assign_block_vars('disabled', $block_vars);
488
489 $this->output_actions('disabled', array(
490 'ENABLE' => $this->u_action . '&action=enable_pre&ext_name=' . urlencode($name),
491 'DELETE_DATA' => $this->u_action . '&action=delete_data_pre&ext_name=' . urlencode($name),
492 ));
493 }
494 }
495
496 /**
497 * Lists all the available extensions and dumps to the template
498 *
499 * @param $phpbb_extension_manager An instance of the extension manager
500 * @return null
501 */
502 public function list_available_exts(\phpbb\extension\manager $phpbb_extension_manager)
503 {
504 $uninstalled = array_diff_key($phpbb_extension_manager->all_available(), $phpbb_extension_manager->all_configured());
505
506 $available_extension_meta_data = array();
507
508 foreach ($uninstalled as $name => $location)
509 {
510 $md_manager = $phpbb_extension_manager->create_extension_metadata_manager($name);
511
512 try
513 {
514 $meta = $md_manager->get_metadata('all');
515 $available_extension_meta_data[$name] = array(
516 'META_DISPLAY_NAME' => $md_manager->get_metadata('display-name'),
517 'META_VERSION' => $meta['version'],
518 );
519
520 if (isset($meta['extra']['version-check']))
521 {
522 $force_update = $this->request->variable('versioncheck_force', false);
523 $updates = $phpbb_extension_manager->version_check($md_manager, $force_update, !$force_update);
524
525 $available_extension_meta_data[$name]['S_UP_TO_DATE'] = empty($updates);
526 $available_extension_meta_data[$name]['S_VERSIONCHECK'] = true;
527 $available_extension_meta_data[$name]['U_VERSIONCHECK_FORCE'] = $this->u_action . '&action=details&versioncheck_force=1&ext_name=' . urlencode($md_manager->get_metadata('name'));
528 }
529 else
530 {
531 $available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
532 }
533 }
534 catch (version_check_exception $e)
535 {
536 $available_extension_meta_data[$name]['S_VERSIONCHECK'] = false;
537 }
538 catch (exception_interface $e)
539 {
540 $message = call_user_func_array(array($this->user, 'lang'), array_merge(array($e->getMessage()), $e->get_parameters()));
541 $this->template->assign_block_vars('disabled', array(
542 'META_DISPLAY_NAME' => $this->user->lang('EXTENSION_INVALID_LIST', $name, $message),
543 'S_VERSIONCHECK' => false,
544 ));
545 }
546 }
547
548 uasort($available_extension_meta_data, array($this, 'sort_extension_meta_data_table'));
549
550 foreach ($available_extension_meta_data as $name => $block_vars)
551 {
552 $block_vars['NAME'] = $name;
553 $block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);
554
555 $this->template->assign_block_vars('disabled', $block_vars);
556
557 $this->output_actions('disabled', array(
558 'ENABLE' => $this->u_action . '&action=enable_pre&ext_name=' . urlencode($name),
559 ));
560 }
561 }
562
563 /**
564 * Output actions to a block
565 *
566 * @param string $block
567 * @param array $actions
568 */
569 private function output_actions($block, $actions)
570 {
571 foreach ($actions as $lang => $url)
572 {
573 $this->template->assign_block_vars($block . '.actions', array(
574 'L_ACTION' => $this->user->lang('EXTENSION_' . $lang),
575 'L_ACTION_EXPLAIN' => (isset($this->user->lang['EXTENSION_' . $lang . '_EXPLAIN'])) ? $this->user->lang('EXTENSION_' . $lang . '_EXPLAIN') : '',
576 'U_ACTION' => $url,
577 ));
578 }
579 }
580
581 /**
582 * Sort helper for the table containing the metadata about the extensions.
583 */
584 protected function sort_extension_meta_data_table($val1, $val2)
585 {
586 return strnatcasecmp($val1['META_DISPLAY_NAME'], $val2['META_DISPLAY_NAME']);
587 }
588 }
589