Verzeichnisstruktur phpBB-3.3.15


Veröffentlicht
28.08.2024

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

add_modules.php

Zuletzt modifiziert: 02.04.2025, 15:03 - Dateigröße: 15.51 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  namespace phpbb\install\module\install_data\task;
015   
016  use phpbb\install\exception\resource_limit_reached_exception;
017  use phpbb\install\helper\config;
018  use phpbb\install\helper\container_factory;
019  use phpbb\install\helper\iohandler\iohandler_interface;
020   
021  class add_modules extends \phpbb\install\task_base
022  {
023      /**
024       * @var config
025       */
026      protected $config;
027   
028      /**
029       * @var \phpbb\db\driver\driver_interface
030       */
031      protected $db;
032   
033      /**
034       * @var \phpbb\extension\manager
035       */
036      protected $extension_manager;
037   
038      /**
039       * @var iohandler_interface
040       */
041      protected $iohandler;
042   
043      /**
044       * @var \phpbb\module\module_manager
045       */
046      protected $module_manager;
047   
048      /**
049       * Define the module structure so that we can populate the database without
050       * needing to hard-code module_id values
051       *
052       * @var array
053       */
054      protected $module_categories = array(
055          'acp' => array(
056              'ACP_CAT_GENERAL' => array(
057                  'ACP_QUICK_ACCESS',
058                  'ACP_BOARD_CONFIGURATION',
059                  'ACP_CLIENT_COMMUNICATION',
060                  'ACP_SERVER_CONFIGURATION',
061              ),
062              'ACP_CAT_FORUMS' => array(
063                  'ACP_MANAGE_FORUMS',
064                  'ACP_FORUM_BASED_PERMISSIONS',
065              ),
066              'ACP_CAT_POSTING' => array(
067                  'ACP_MESSAGES',
068                  'ACP_ATTACHMENTS',
069              ),
070              'ACP_CAT_USERGROUP' => array(
071                  'ACP_CAT_USERS',
072                  'ACP_GROUPS',
073                  'ACP_USER_SECURITY',
074              ),
075              'ACP_CAT_PERMISSIONS' => array(
076                  'ACP_GLOBAL_PERMISSIONS',
077                  'ACP_FORUM_BASED_PERMISSIONS',
078                  'ACP_PERMISSION_ROLES',
079                  'ACP_PERMISSION_MASKS',
080              ),
081              'ACP_CAT_CUSTOMISE' => array(
082                  'ACP_STYLE_MANAGEMENT',
083                  'ACP_EXTENSION_MANAGEMENT',
084                  'ACP_LANGUAGE',
085              ),
086              'ACP_CAT_MAINTENANCE' => array(
087                  'ACP_FORUM_LOGS',
088                  'ACP_CAT_DATABASE',
089              ),
090              'ACP_CAT_SYSTEM' => array(
091                  'ACP_AUTOMATION',
092                  'ACP_GENERAL_TASKS',
093                  'ACP_MODULE_MANAGEMENT',
094              ),
095              'ACP_CAT_DOT_MODS' => null,
096          ),
097          'mcp' => array(
098              'MCP_MAIN'        => null,
099              'MCP_QUEUE'        => null,
100              'MCP_REPORTS'    => null,
101              'MCP_NOTES'        => null,
102              'MCP_WARN'        => null,
103              'MCP_LOGS'        => null,
104              'MCP_BAN'        => null,
105          ),
106          'ucp' => array(
107              'UCP_MAIN'            => null,
108              'UCP_PROFILE'        => null,
109              'UCP_PREFS'            => null,
110              'UCP_PM'            => null,
111              'UCP_USERGROUPS'    => null,
112              'UCP_ZEBRA'            => null,
113          ),
114      );
115   
116      /**
117       * @var array
118       */
119      protected $module_categories_basenames = array(
120          'UCP_PM' => 'ucp_pm',
121      );
122   
123      /**
124       * @var array
125       */
126      protected $module_extras = array(
127          'acp'    => array(
128              'ACP_QUICK_ACCESS' => array(
129                  'ACP_MANAGE_USERS',
130                  'ACP_GROUPS_MANAGE',
131                  'ACP_MANAGE_FORUMS',
132                  'ACP_MOD_LOGS',
133                  'ACP_BOTS',
134                  'ACP_PHP_INFO',
135              ),
136              'ACP_FORUM_BASED_PERMISSIONS' => array(
137                  'ACP_FORUM_PERMISSIONS',
138                  'ACP_FORUM_PERMISSIONS_COPY',
139                  'ACP_FORUM_MODERATORS',
140                  'ACP_USERS_FORUM_PERMISSIONS',
141                  'ACP_GROUPS_FORUM_PERMISSIONS',
142              ),
143          ),
144      );
145   
146      /**
147       * Constructor
148       *
149       * @parma config                $config        Installer's config
150       * @param iohandler_interface    $iohandler    Installer's input-output handler
151       * @param container_factory        $container    Installer's DI container
152       */
153      public function __construct(config $config, iohandler_interface $iohandler, container_factory $container)
154      {
155          $this->config                = $config;
156          $this->db                    = $container->get('dbal.conn');
157          $this->extension_manager    = $container->get('ext.manager');
158          $this->iohandler            = $iohandler;
159          $this->module_manager        = $container->get('module.manager');
160   
161          parent::__construct(true);
162      }
163   
164      /**
165       * {@inheritdoc}
166       */
167      public function run()
168      {
169          $this->db->sql_return_on_error(true);
170   
171          $module_classes = array('acp', 'mcp', 'ucp');
172          $total = count($module_classes);
173          $i = $this->config->get('module_class_index', 0);
174          $module_classes = array_slice($module_classes, $i);
175   
176          foreach ($module_classes as $module_class)
177          {
178              $categories = $this->config->get('module_categories_array', array());
179   
180              $k = $this->config->get('module_categories_index', 0);
181              $module_categories = array_slice($this->module_categories[$module_class], $k);
182              $timed_out = false;
183   
184              foreach ($module_categories as $cat_name => $subs)
185              {
186                  // Check if this sub-category has a basename. If it has, use it.
187                  $basename = (isset($this->module_categories_basenames[$cat_name])) ? $this->module_categories_basenames[$cat_name] : '';
188   
189                  $module_data = array(
190                      'module_basename'    => $basename,
191                      'module_enabled'    => 1,
192                      'module_display'    => 1,
193                      'parent_id'            => 0,
194                      'module_class'        => $module_class,
195                      'module_langname'    => $cat_name,
196                      'module_mode'        => '',
197                      'module_auth'        => '',
198                  );
199   
200                  $this->module_manager->update_module_data($module_data);
201   
202                  // Check for last sql error happened
203                  if ($this->db->get_sql_error_triggered())
204                  {
205                      $error = $this->db->sql_error($this->db->get_sql_error_sql());
206                      $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
207                  }
208   
209                  $categories[$cat_name]['id'] = (int) $module_data['module_id'];
210                  $categories[$cat_name]['parent_id'] = 0;
211   
212                  if (is_array($subs))
213                  {
214                      foreach ($subs as $level2_name)
215                      {
216                          // Check if this sub-category has a basename. If it has, use it.
217                          $basename = (isset($this->module_categories_basenames[$level2_name])) ? $this->module_categories_basenames[$level2_name] : '';
218   
219                          $module_data = array(
220                              'module_basename'    => $basename,
221                              'module_enabled'    => 1,
222                              'module_display'    => 1,
223                              'parent_id'            => (int) $categories[$cat_name]['id'],
224                              'module_class'        => $module_class,
225                              'module_langname'    => $level2_name,
226                              'module_mode'        => '',
227                              'module_auth'        => '',
228                          );
229   
230                          $this->module_manager->update_module_data($module_data);
231   
232                          // Check for last sql error happened
233                          if ($this->db->get_sql_error_triggered())
234                          {
235                              $error = $this->db->sql_error($this->db->get_sql_error_sql());
236                              $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
237                          }
238   
239                          $categories[$level2_name]['id'] = (int) $module_data['module_id'];
240                          $categories[$level2_name]['parent_id'] = (int) $categories[$cat_name]['id'];
241                      }
242                  }
243   
244                  $k++;
245   
246                  // Stop execution if resource limit is reached
247                  if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
248                  {
249                      $timed_out = true;
250                      break;
251                  }
252              }
253   
254              $this->config->set('module_categories_array', $categories);
255              $this->config->set('module_categories_index', $k);
256   
257              if ($timed_out)
258              {
259                  throw new resource_limit_reached_exception();
260              }
261   
262              // Get the modules we want to add... returned sorted by name
263              $module_info = $this->module_manager->get_module_infos($module_class);
264   
265              $k = $this->config->get('module_info_index', 0);
266              $module_info = array_slice($module_info, $k);
267   
268              foreach ($module_info as $module_basename => $fileinfo)
269              {
270                  foreach ($fileinfo['modes'] as $module_mode => $row)
271                  {
272                      foreach ($row['cat'] as $cat_name)
273                      {
274                          if (!isset($categories[$cat_name]))
275                          {
276                              continue;
277                          }
278   
279                          $module_data = array(
280                              'module_basename'    => $module_basename,
281                              'module_enabled'    => 1,
282                              'module_display'    => (isset($row['display'])) ? (int) $row['display'] : 1,
283                              'parent_id'            => (int) $categories[$cat_name]['id'],
284                              'module_class'        => $module_class,
285                              'module_langname'    => $row['title'],
286                              'module_mode'        => $module_mode,
287                              'module_auth'        => $row['auth'],
288                          );
289   
290                          $this->module_manager->update_module_data($module_data);
291   
292                          // Check for last sql error happened
293                          if ($this->db->get_sql_error_triggered())
294                          {
295                              $error = $this->db->sql_error($this->db->get_sql_error_sql());
296                              $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
297                          }
298                      }
299                  }
300   
301                  $k++;
302   
303                  // Stop execution if resource limit is reached
304                  if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
305                  {
306                      $timed_out = true;
307                      break;
308                  }
309              }
310   
311              $this->config->set('module_info_index', $k);
312   
313              // Stop execution if resource limit is reached
314              if ($timed_out)
315              {
316                  throw new resource_limit_reached_exception();
317              }
318   
319              // Move some of the modules around since the code above will put them in the wrong place
320              if (!$this->config->get('modules_ordered', false))
321              {
322                  $this->order_modules($module_class);
323                  $this->config->set('modules_ordered', true);
324   
325                  // Stop execution if resource limit is reached
326                  if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
327                  {
328                      throw new resource_limit_reached_exception();
329                  }
330              }
331   
332              // And now for the special ones
333              // (these are modules which appear in multiple categories and thus get added manually
334              // to some for more control)
335              if (isset($this->module_extras[$module_class]))
336              {
337                  $this->add_module_extras($module_class);
338              }
339   
340              $this->module_manager->remove_cache_file($module_class);
341   
342              $i++;
343   
344              $this->config->set('module_class_index', $i);
345              $this->config->set('module_categories_index', 0);
346              $this->config->set('module_info_index', 0);
347              $this->config->set('added_extra_modules', false);
348              $this->config->set('modules_ordered', false);
349              $this->config->set('module_categories_array', array());
350   
351              // Stop execution if resource limit is reached
352              if ($this->config->get_time_remaining() <= 0 || $this->config->get_memory_remaining() <= 0)
353              {
354                  break;
355              }
356          }
357   
358          if ($i < $total)
359          {
360              throw new resource_limit_reached_exception();
361          }
362      }
363   
364      /**
365       * Move modules to their correct place
366       *
367       * @param string    $module_class
368       */
369      protected function order_modules($module_class)
370      {
371          if ($module_class == 'acp')
372          {
373              // Move main module 4 up...
374              $sql = 'SELECT *
375                  FROM ' . MODULES_TABLE . "
376                  WHERE module_basename = 'acp_main'
377                      AND module_class = 'acp'
378                      AND module_mode = 'main'";
379              $result = $this->db->sql_query($sql);
380              $row = $this->db->sql_fetchrow($result);
381              $this->db->sql_freeresult($result);
382   
383              $this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
384   
385              // Move permissions intro screen module 4 up...
386              $sql = 'SELECT *
387                  FROM ' . MODULES_TABLE . "
388                  WHERE module_basename = 'acp_permissions'
389                      AND module_class = 'acp'
390                      AND module_mode = 'intro'";
391              $result = $this->db->sql_query($sql);
392              $row = $this->db->sql_fetchrow($result);
393              $this->db->sql_freeresult($result);
394   
395              $this->module_manager->move_module_by($row, 'acp', 'move_up', 4);
396   
397              // Move manage users screen module 5 up...
398              $sql = 'SELECT *
399                  FROM ' . MODULES_TABLE . "
400                  WHERE module_basename = 'acp_users'
401                      AND module_class = 'acp'
402                      AND module_mode = 'overview'";
403              $result = $this->db->sql_query($sql);
404              $row = $this->db->sql_fetchrow($result);
405              $this->db->sql_freeresult($result);
406   
407              $this->module_manager->move_module_by($row, 'acp', 'move_up', 5);
408   
409              // Move extension management module 1 up...
410              $sql = 'SELECT *
411                  FROM ' . MODULES_TABLE . "
412                  WHERE module_langname = 'ACP_EXTENSION_MANAGEMENT'
413                      AND module_class = 'acp'
414                      AND module_mode = ''
415                      AND module_basename = ''";
416              $result = $this->db->sql_query($sql);
417              $row = $this->db->sql_fetchrow($result);
418              $this->db->sql_freeresult($result);
419   
420              $this->module_manager->move_module_by($row, 'acp', 'move_up', 1);
421          }
422   
423          if ($module_class == 'mcp')
424          {
425              // Move pm report details module 3 down...
426              $sql = 'SELECT *
427                  FROM ' . MODULES_TABLE . "
428                  WHERE module_basename = 'mcp_pm_reports'
429                      AND module_class = 'mcp'
430                      AND module_mode = 'pm_report_details'";
431              $result = $this->db->sql_query($sql);
432              $row = $this->db->sql_fetchrow($result);
433              $this->db->sql_freeresult($result);
434   
435              $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
436   
437              // Move closed pm reports module 3 down...
438              $sql = 'SELECT *
439                  FROM ' . MODULES_TABLE . "
440                  WHERE module_basename = 'mcp_pm_reports'
441                      AND module_class = 'mcp'
442                      AND module_mode = 'pm_reports_closed'";
443              $result = $this->db->sql_query($sql);
444              $row = $this->db->sql_fetchrow($result);
445              $this->db->sql_freeresult($result);
446   
447              $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
448   
449              // Move open pm reports module 3 down...
450              $sql = 'SELECT *
451                  FROM ' . MODULES_TABLE . "
452                  WHERE module_basename = 'mcp_pm_reports'
453                      AND module_class = 'mcp'
454                      AND module_mode = 'pm_reports'";
455              $result = $this->db->sql_query($sql);
456              $row = $this->db->sql_fetchrow($result);
457              $this->db->sql_freeresult($result);
458   
459              $this->module_manager->move_module_by($row, 'mcp', 'move_down', 3);
460          }
461   
462          if ($module_class == 'ucp')
463          {
464              // Move attachment module 4 down...
465              $sql = 'SELECT *
466                  FROM ' . MODULES_TABLE . "
467                  WHERE module_basename = 'ucp_attachments'
468                      AND module_class = 'ucp'
469                      AND module_mode = 'attachments'";
470              $result = $this->db->sql_query($sql);
471              $row = $this->db->sql_fetchrow($result);
472              $this->db->sql_freeresult($result);
473   
474              $this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
475   
476              // Move notification options module 4 down...
477              $sql = 'SELECT *
478                  FROM ' . MODULES_TABLE . "
479                  WHERE module_basename = 'ucp_notifications'
480                      AND module_class = 'ucp'
481                      AND module_mode = 'notification_options'";
482              $result = $this->db->sql_query($sql);
483              $row = $this->db->sql_fetchrow($result);
484              $this->db->sql_freeresult($result);
485   
486              $this->module_manager->move_module_by($row, 'ucp', 'move_down', 4);
487   
488              // Move OAuth module 5 down...
489              $sql = 'SELECT *
490                  FROM ' . MODULES_TABLE . "
491                  WHERE module_basename = 'ucp_auth_link'
492                      AND module_class = 'ucp'
493                      AND module_mode = 'auth_link'";
494              $result = $this->db->sql_query($sql);
495              $row = $this->db->sql_fetchrow($result);
496              $this->db->sql_freeresult($result);
497   
498              $this->module_manager->move_module_by($row, 'ucp', 'move_down', 5);
499          }
500      }
501   
502      /**
503       * Add extra modules
504       *
505       * @param string    $module_class
506       */
507      protected function add_module_extras($module_class)
508      {
509          foreach ($this->module_extras[$module_class] as $cat_name => $mods)
510          {
511              $sql = 'SELECT module_id, left_id, right_id
512                  FROM ' . MODULES_TABLE . "
513                  WHERE module_langname = '" . $this->db->sql_escape($cat_name) . "'
514                      AND module_class = '" . $this->db->sql_escape($module_class) . "'";
515              $result = $this->db->sql_query_limit($sql, 1);
516              $row2 = $this->db->sql_fetchrow($result);
517              $this->db->sql_freeresult($result);
518   
519              foreach ($mods as $mod_name)
520              {
521                  $sql = 'SELECT *
522                      FROM ' . MODULES_TABLE . "
523                      WHERE module_langname = '" . $this->db->sql_escape($mod_name) . "'
524                          AND module_class = '" . $this->db->sql_escape($module_class) . "'
525                          AND module_basename <> ''";
526                  $result = $this->db->sql_query_limit($sql, 1);
527                  $row = $this->db->sql_fetchrow($result);
528                  $this->db->sql_freeresult($result);
529   
530                  $module_data = array(
531                      'module_basename'    => $row['module_basename'],
532                      'module_enabled'    => (int) $row['module_enabled'],
533                      'module_display'    => (int) $row['module_display'],
534                      'parent_id'            => (int) $row2['module_id'],
535                      'module_class'        => $row['module_class'],
536                      'module_langname'    => $row['module_langname'],
537                      'module_mode'        => $row['module_mode'],
538                      'module_auth'        => $row['module_auth'],
539                  );
540   
541                  $this->module_manager->update_module_data($module_data);
542   
543                  // Check for last sql error happened
544                  if ($this->db->get_sql_error_triggered())
545                  {
546                      $error = $this->db->sql_error($this->db->get_sql_error_sql());
547                      $this->iohandler->add_error_message('INST_ERR_DB', $error['message']);
548                  }
549              }
550          }
551      }
552   
553      /**
554       * {@inheritdoc}
555       */
556      static public function get_step_count()
557      {
558          return 1;
559      }
560   
561      /**
562       * {@inheritdoc}
563       */
564      public function get_task_lang_name()
565      {
566          return 'TASK_ADD_MODULES';
567      }
568  }
569