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