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