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.
Auf den Verzeichnisnamen klicken, dies zeigt nur das Verzeichnis mit Inhalt an

(Beispiel Datei-Icons)

Auf das Icon klicken um den Quellcode anzuzeigen

acp_extensions.php

Zuletzt modifiziert: 09.10.2024, 12:52 - Dateigröße: 18.89 KiB


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 . '&amp;action=list&amp;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 . '&amp;action=enable&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;action=enable&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;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 . '&amp;action=disable&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;action=disable&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;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 . '&amp;action=delete_data&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;action=delete_data&amp;ext_name=' . urlencode($ext_name) . '&amp;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 . '&amp;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 . '&amp;action=list',
346                      'U_VERSIONCHECK_FORCE'    => $this->u_action . '&amp;action=details&amp;versioncheck_force=1&amp;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 . '&amp;action=details&amp;versioncheck_force=1&amp;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 . '&amp;action=details&amp;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 . '&amp;action=disable_pre&amp;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 . '&amp;action=details&amp;versioncheck_force=1&amp;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 . '&amp;action=details&amp;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 . '&amp;action=enable_pre&amp;ext_name=' . urlencode($name),
491                  'DELETE_DATA'    => $this->u_action . '&amp;action=delete_data_pre&amp;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 . '&amp;action=details&amp;versioncheck_force=1&amp;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 . '&amp;action=details&amp;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 . '&amp;action=enable_pre&amp;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