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

convertor.php

Zuletzt modifiziert: 02.04.2025, 15:02 - Dateigröße: 23.41 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\convert\controller;
015   
016  use phpbb\cache\driver\driver_interface;
017  use phpbb\exception\http_exception;
018  use phpbb\install\controller\helper;
019  use phpbb\install\helper\container_factory;
020  use phpbb\install\helper\database;
021  use phpbb\install\helper\install_helper;
022  use phpbb\install\helper\iohandler\factory;
023  use phpbb\install\helper\iohandler\iohandler_interface;
024  use phpbb\install\helper\navigation\navigation_provider;
025  use phpbb\language\language;
026  use phpbb\request\request_interface;
027  use phpbb\template\template;
028  use Symfony\Component\HttpFoundation\StreamedResponse;
029   
030  /**
031   * Controller for forum convertors
032   *
033   * WARNING: This file did not meant to be present in a production environment, so moving
034   *             this file to a location which is accessible after board installation might
035   *             lead to security issues.
036   */
037  class convertor
038  {
039      /**
040       * @var driver_interface
041       */
042      protected $cache;
043   
044      /**
045       * @var driver_interface
046       */
047      protected $installer_cache;
048   
049      /**
050       * @var \phpbb\config\db
051       */
052      protected $config;
053   
054      /**
055       * @var \phpbb\config_php_file
056       */
057      protected $config_php_file;
058   
059      /**
060       * @var string
061       */
062      protected $config_table;
063   
064      /**
065       * @var helper
066       */
067      protected $controller_helper;
068   
069      /**
070       * @var database
071       */
072      protected $db_helper;
073   
074      /**
075       * @var \phpbb\db\driver\driver_interface
076       */
077      protected $db;
078   
079      /**
080       * @var install_helper
081       */
082      protected $install_helper;
083   
084      /**
085       * @var iohandler_interface
086       */
087      protected $iohandler;
088   
089      /**
090       * @var language
091       */
092      protected $language;
093   
094      /**
095       * @var navigation_provider
096       */
097      protected $navigation_provider;
098   
099      /**
100       * @var request_interface
101       */
102      protected $request;
103   
104      /**
105       * @var string
106       */
107      protected $session_keys_table;
108   
109      /**
110       * @var string
111       */
112      protected $session_table;
113   
114      /**
115       * @var template
116       */
117      protected $template;
118   
119      /**
120       * @var string
121       */
122      protected $phpbb_root_path;
123   
124      /**
125       * @var string
126       */
127      protected $php_ext;
128   
129      /**
130       * Constructor
131       *
132       * @param driver_interface        $cache
133       * @param container_factory        $container
134       * @param database                $db_helper
135       * @param helper                $controller_helper
136       * @param install_helper        $install_helper
137       * @param factory                $iohandler
138       * @param language                $language
139       * @param navigation_provider    $nav
140       * @param request_interface        $request
141       * @param template                $template
142       * @param string                $phpbb_root_path
143       * @param string                $php_ext
144       */
145      public function __construct(driver_interface $cache, container_factory $container, database $db_helper, helper $controller_helper, install_helper $install_helper, factory $iohandler, language $language, navigation_provider $nav, request_interface $request, template $template, $phpbb_root_path, $php_ext)
146      {
147          $this->installer_cache        = $cache;
148          $this->controller_helper    = $controller_helper;
149          $this->db_helper            = $db_helper;
150          $this->install_helper        = $install_helper;
151          $this->language                = $language;
152          $this->navigation_provider    = $nav;
153          $this->request                = $request;
154          $this->template                = $template;
155          $this->phpbb_root_path        = $phpbb_root_path;
156          $this->php_ext                = $php_ext;
157   
158          $iohandler->set_environment('ajax');
159          $this->iohandler = $iohandler->get();
160   
161          if (!$this->install_helper->is_phpbb_installed() || !defined('IN_INSTALL'))
162          {
163              throw new http_exception(403, 'INSTALL_PHPBB_NOT_INSTALLED');
164          }
165   
166          $this->controller_helper->handle_language_select();
167   
168          $this->cache    = $container->get('cache.driver');
169          $this->config    = $container->get('config');
170          $this->config_php_file    = new \phpbb\config_php_file($this->phpbb_root_path, $this->php_ext);
171          $this->db        = $container->get('dbal.conn.driver');
172   
173          $this->config_table            = $container->get_parameter('tables.config');
174          $this->session_keys_table    = $container->get_parameter('tables.sessions_keys');
175          $this->session_table        = $container->get_parameter('tables.sessions');
176      }
177   
178      /**
179       * Render the intro page
180       *
181       * @param bool|int    $start_new    Whether or not to force to start a new convertor
182       *
183       * @return \Symfony\Component\HttpFoundation\Response
184       */
185      public function intro($start_new)
186      {
187          $this->setup_navigation('intro');
188   
189          if ($start_new)
190          {
191              if ($this->request->is_ajax())
192              {
193                  $response = new StreamedResponse();
194                  $iohandler = $this->iohandler;
195                  $url = $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new'));
196                  $response->setCallback(function() use ($iohandler, $url) {
197                      $iohandler->redirect($url);
198                  });
199                  $response->headers->set('X-Accel-Buffering', 'no');
200   
201                  return $response;
202              }
203   
204              $this->config['convert_progress'] = '';
205              $this->config['convert_db_server'] = '';
206              $this->config['convert_db_user'] = '';
207              $this->db->sql_query('DELETE FROM ' . $this->config_table . "
208                  WHERE config_name = 'convert_progress'
209                      OR config_name = 'convert_db_server'
210                      OR config_name = 'convert_db_user'"
211              );
212          }
213   
214          // Let's see if there is a conversion in the works...
215          $options = array();
216          if (!empty($this->config['convert_progress']) &&
217              !empty($this->config['convert_db_server']) &&
218              !empty($this->config['convert_db_user']) &&
219              !empty($this->config['convert_options']))
220          {
221              $options = unserialize($this->config['convert_progress']);
222              $options = array_merge($options,
223                  unserialize($this->config['convert_db_server']),
224                  unserialize($this->config['convert_db_user']),
225                  unserialize($this->config['convert_options'])
226              );
227          }
228   
229          // This information should have already been checked once, but do it again for safety
230          if (!empty($options) && !empty($options['tag']) &&
231              isset($options['dbms']) &&
232              isset($options['dbhost']) &&
233              isset($options['dbport']) &&
234              isset($options['dbuser']) &&
235              isset($options['dbpasswd']) &&
236              isset($options['dbname']) &&
237              isset($options['table_prefix']))
238          {
239              $this->template->assign_vars(array(
240                  'TITLE'                => $this->language->lang('CONTINUE_CONVERT'),
241                  'BODY'                => $this->language->lang('CONTINUE_CONVERT_BODY'),
242                  'S_CONTINUE'        => true,
243                  'U_NEW_ACTION'        => $this->controller_helper->route('phpbb_convert_intro', array('start_new' => 'new')),
244                  'U_CONTINUE_ACTION'    => $this->controller_helper->route('phpbb_convert_convert', array('converter' => $options['tag'])),
245              ));
246   
247              return $this->controller_helper->render('installer_convert.html', 'CONTINUE_CONVERT', true);
248          }
249   
250          return $this->render_convert_list();
251      }
252   
253      /**
254       * Obtain convertor settings
255       *
256       * @param string    $converter    Name of the convertor
257       *
258       * @return \Symfony\Component\HttpFoundation\Response|StreamedResponse
259       */
260      public function settings($converter)
261      {
262          $this->setup_navigation('settings');
263   
264          require_once ($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
265          require_once ($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
266   
267          // Include convertor if available
268          $convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $converter . '.' . $this->php_ext;
269          if (!file_exists($convertor_file_path))
270          {
271              if ($this->request->is_ajax())
272              {
273                  $response = new StreamedResponse();
274                  $ref = $this;
275                  $response->setCallback(function() use ($ref) {
276                      $ref->render_error('CONVERT_NOT_EXIST');
277                  });
278                  $response->headers->set('X-Accel-Buffering', 'no');
279   
280                  return $response;
281              }
282   
283              $this->render_error('CONVERT_NOT_EXIST');
284              return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
285          }
286   
287          $get_info = true;
288          $phpbb_root_path = $this->phpbb_root_path; // These globals are required
289          $phpEx = $this->php_ext; // See above
290          include_once ($convertor_file_path);
291   
292          // The test_file is a file that should be present in the location of the old board.
293          if (!isset($test_file))
294          {
295              if ($this->request->is_ajax())
296              {
297                  $response = new StreamedResponse();
298                  $ref = $this;
299                  $response->setCallback(function() use ($ref) {
300                      $ref->render_error('DEV_NO_TEST_FILE');
301                  });
302                  $response->headers->set('X-Accel-Buffering', 'no');
303   
304                  return $response;
305              }
306   
307              $this->render_error('DEV_NO_TEST_FILE');
308              return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
309          }
310   
311          if ($this->request->variable('submit', false))
312          {
313              // It must be an AJAX request at this point
314              $response = new StreamedResponse();
315              $ref = $this;
316              $response->setCallback(function() use ($ref, $converter) {
317                  $ref->proccess_settings_form($converter);
318              });
319              $response->headers->set('X-Accel-Buffering', 'no');
320   
321              return $response;
322          }
323          else
324          {
325              $this->template->assign_vars(array(
326                  'U_ACTION'    => $this->controller_helper->route('phpbb_convert_settings', array(
327                      'converter'    => $converter,
328                  ))
329              ));
330   
331              if ($this->request->is_ajax())
332              {
333                  $response = new StreamedResponse();
334                  $ref = $this;
335                  $response->setCallback(function() use ($ref) {
336                      $ref->render_settings_form();
337                  });
338                  $response->headers->set('X-Accel-Buffering', 'no');
339   
340                  return $response;
341              }
342   
343              $this->render_settings_form();
344          }
345   
346          return $this->controller_helper->render('installer_convert.html', 'STAGE_SETTINGS', true);
347      }
348   
349      /**
350       * Run conversion
351       */
352      public function convert($converter)
353      {
354          $this->setup_navigation('convert');
355   
356          if ($this->request->is_ajax())
357          {
358              $route = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $converter));
359              $response = new StreamedResponse();
360              $ref = $this;
361              $response->setCallback(function() use ($ref, $route) {
362                  $ref->redirect_to_html($route);
363              });
364              $response->headers->set('X-Accel-Buffering', 'no');
365   
366              return $response;
367          }
368   
369          $convertor = new \phpbb\convert\convertor($this->template, $this->controller_helper);
370          $convertor->convert_data($converter);
371   
372          return $this->controller_helper->render('installer_convert.html', 'STAGE_IN_PROGRESS');
373      }
374   
375      /**
376       * Render the final page of the convertor
377       */
378      public function finish()
379      {
380          $this->setup_navigation('finish');
381   
382          $this->template->assign_vars(array(
383              'TITLE'        => $this->language->lang('CONVERT_COMPLETE'),
384              'BODY'        => $this->language->lang('CONVERT_COMPLETE_EXPLAIN'),
385          ));
386   
387          // If we reached this step (conversion completed) we want to purge the cache and log the user out.
388          // This is for making sure the session get not screwed due to the 3.0.x users table being completely new.
389          $this->cache->purge();
390          $this->installer_cache->purge();
391   
392          require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
393          require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
394   
395          $sql = 'SELECT config_value
396              FROM ' . $this->config_table . '
397              WHERE config_name = \'search_type\'';
398          $result = $this->db->sql_query($sql);
399   
400          if ($this->db->sql_fetchfield('config_value') != 'fulltext_mysql')
401          {
402              $this->template->assign_vars(array(
403                  'S_ERROR_BOX'    => true,
404                  'ERROR_TITLE'    => $this->language->lang('SEARCH_INDEX_UNCONVERTED'),
405                  'ERROR_MSG'        => $this->language->lang('SEARCH_INDEX_UNCONVERTED_EXPLAIN'),
406              ));
407          }
408   
409          $this->db->sql_freeresult($result);
410   
411          switch ($this->db->get_sql_layer())
412          {
413              case 'sqlite3':
414                  $this->db->sql_query('DELETE FROM ' . $this->session_keys_table);
415                  $this->db->sql_query('DELETE FROM ' . $this->session_table);
416              break;
417   
418              default:
419                  $this->db->sql_query('TRUNCATE TABLE ' . $this->session_keys_table);
420                  $this->db->sql_query('TRUNCATE TABLE ' . $this->session_table);
421              break;
422          }
423   
424          return $this->controller_helper->render('installer_convert.html', 'CONVERT_COMPLETE');
425      }
426   
427      /**
428       * Validates settings form
429       *
430       * @param string    $convertor
431       */
432      public function proccess_settings_form($convertor)
433      {
434          global $phpbb_root_path, $phpEx, $get_info;
435   
436          $phpbb_root_path = $this->phpbb_root_path;
437          $phpEx = $this->php_ext;
438          $get_info = true;
439   
440          require_once($this->phpbb_root_path . 'includes/constants.' . $this->php_ext);
441          require_once($this->phpbb_root_path . 'includes/functions_convert.' . $this->php_ext);
442   
443          // Include convertor if available
444          $convertor_file_path = $this->phpbb_root_path . 'install/convertors/convert_' . $convertor . '.' . $this->php_ext;
445          include ($convertor_file_path);
446   
447          // We expect to have an AJAX request here
448          $src_dbms            = $this->request->variable('src_dbms', $convertor_data['dbms']);
449          $src_dbhost            = $this->request->variable('src_dbhost', $convertor_data['dbhost']);
450          $src_dbport            = $this->request->variable('src_dbport', $convertor_data['dbport']);
451          $src_dbuser            = $this->request->variable('src_dbuser', $convertor_data['dbuser']);
452          $src_dbpasswd        = $this->request->variable('src_dbpasswd', $convertor_data['dbpasswd']);
453          $src_dbname            = $this->request->variable('src_dbname', $convertor_data['dbname']);
454          $src_table_prefix    = $this->request->variable('src_table_prefix', $convertor_data['table_prefix']);
455          $forum_path            = $this->request->variable('forum_path', $convertor_data['forum_path']);
456          $refresh            = $this->request->variable('refresh', 1);
457   
458          // Default URL of the old board
459          // @todo Are we going to use this for attempting to convert URL references in posts, or should we remove it?
460          //        -> We should convert old urls to the new relative urls format
461          // $src_url = $request->variable('src_url', 'Not in use at the moment');
462   
463          // strip trailing slash from old forum path
464          $forum_path = (strlen($forum_path) && $forum_path[strlen($forum_path) - 1] == '/') ? substr($forum_path, 0, -1) : $forum_path;
465   
466          $error = array();
467          if (!file_exists($this->phpbb_root_path . $forum_path . '/' . $test_file))
468          {
469              $error[] = $this->language->lang('COULD_NOT_FIND_PATH', $forum_path);
470          }
471   
472          $connect_test = false;
473          $available_dbms = $this->db_helper->get_available_dbms(false, true, true);
474          if (!isset($available_dbms[$src_dbms]) || !$available_dbms[$src_dbms]['AVAILABLE'])
475          {
476              $error[] = $this->language->lang('INST_ERR_NO_DB');
477          }
478          else
479          {
480              $connect_test = $this->db_helper->check_database_connection($src_dbms, $src_dbhost, $src_dbport, $src_dbuser, $src_dbpasswd, $src_dbname, $src_table_prefix);
481          }
482   
483          extract($this->config_php_file->get_all());
484   
485          // The forum prefix of the old and the new forum can only be the same if two different databases are used.
486          if ($src_table_prefix === $table_prefix && $src_dbms === $dbms && $src_dbhost === $dbhost && $src_dbport === $dbport && $src_dbname === $dbname)
487          {
488              $error[] = $this->language->lang('TABLE_PREFIX_SAME', $src_table_prefix);
489          }
490   
491          if (!$connect_test)
492          {
493              $error[] = $this->language->lang('INST_ERR_DB_CONNECT');
494          }
495   
496          $src_dbms = $this->config_php_file->convert_30_dbms_to_31($src_dbms);
497   
498          // Check table prefix
499          if (empty($error))
500          {
501              // initiate database connection to old db if old and new db differ
502              global $src_db, $same_db;
503              $src_db = $same_db = false;
504   
505              if ($src_dbms != $dbms || $src_dbhost != $dbhost || $src_dbport != $dbport || $src_dbname != $dbname || $src_dbuser != $dbuser)
506              {
507                  /** @var \phpbb\db\driver\driver_interface $src_db */
508                  $src_db = new $src_dbms();
509                  $src_db->sql_connect($src_dbhost, $src_dbuser, htmlspecialchars_decode($src_dbpasswd, ENT_COMPAT), $src_dbname, $src_dbport, false, true);
510                  $same_db = false;
511              }
512              else
513              {
514                  $src_db = $this->db;
515                  $same_db = true;
516              }
517   
518              $src_db->sql_return_on_error(true);
519              $this->db->sql_return_on_error(true);
520   
521              // Try to select one row from the first table to see if the prefix is OK
522              $result = $src_db->sql_query_limit('SELECT * FROM ' . $src_table_prefix . $tables[0], 1);
523   
524              if (!$result)
525              {
526                  $prefixes = array();
527   
528                  $db_tools_factory = new \phpbb\db\tools\factory();
529                  $db_tools = $db_tools_factory->get($src_db);
530                  $tables_existing = $db_tools->sql_list_tables();
531                  $tables_existing = array_map('strtolower', $tables_existing);
532                  foreach ($tables_existing as $table_name)
533                  {
534                      compare_table($tables, $table_name, $prefixes);
535                  }
536                  unset($tables_existing);
537   
538                  foreach ($prefixes as $prefix => $count)
539                  {
540                      if ($count >= count($tables))
541                      {
542                          $possible_prefix = $prefix;
543                          break;
544                      }
545                  }
546   
547                  $msg = '';
548                  if (!empty($convertor_data['table_prefix']))
549                  {
550                      $msg .= $this->language->lang_array('DEFAULT_PREFIX_IS', array($convertor_data['forum_name'], $convertor_data['table_prefix']));
551                  }
552   
553                  if (!empty($possible_prefix))
554                  {
555                      $msg .= '<br />';
556                      $msg .= ($possible_prefix == '*') ? $this->language->lang('BLANK_PREFIX_FOUND') : $this->language->lang_array('PREFIX_FOUND', array($possible_prefix));
557                      $src_table_prefix = ($possible_prefix == '*') ? '' : $possible_prefix;
558                  }
559   
560                  $error[] = $msg;
561              }
562   
563              $src_db->sql_freeresult($result);
564              $src_db->sql_return_on_error(false);
565          }
566   
567          if (empty($error))
568          {
569              // Save convertor Status
570              $this->config->set('convert_progress', serialize(array(
571                  'step'            => '',
572                  'table_prefix'    => $src_table_prefix,
573                  'tag'            => $convertor,
574              )), false);
575              $this->config->set('convert_db_server', serialize(array(
576                  'dbms'            => $src_dbms,
577                  'dbhost'        => $src_dbhost,
578                  'dbport'        => $src_dbport,
579                  'dbname'        => $src_dbname,
580              )), false);
581              $this->config->set('convert_db_user', serialize(array(
582                  'dbuser'        => $src_dbuser,
583                  'dbpasswd'        => $src_dbpasswd,
584              )), false);
585   
586              // Save options
587              $this->config->set('convert_options', serialize(array(
588                  'forum_path' => $this->phpbb_root_path . $forum_path,
589                  'refresh' => $refresh
590              )), false);
591   
592              $url = $this->controller_helper->route('phpbb_convert_convert', array('converter' => $convertor));
593              $this->iohandler->redirect($url);
594              $this->iohandler->send_response(true);
595          }
596          else
597          {
598              $this->render_settings_form($error);
599          }
600      }
601   
602      /**
603       * Renders settings form
604       *
605       * @param array    $error    Array of errors
606       */
607      public function render_settings_form($error = array())
608      {
609          foreach ($error as $msg)
610          {
611              $this->iohandler->add_error_message($msg);
612          }
613   
614          $dbms_options = array();
615          foreach ($this->db_helper->get_available_dbms() as $dbms_key => $dbms_array)
616          {
617              $dbms_options[] = array(
618                  'value'        => $dbms_key,
619                  'label'        => 'DB_OPTION_' . strtoupper($dbms_key),
620              );
621          }
622   
623          $form_title = 'SPECIFY_OPTIONS';
624          $form_data = array(
625              'src_dbms'    => array(
626                  'label'        => 'DBMS',
627                  'type'        => 'select',
628                  'options'    => $dbms_options,
629              ),
630              'src_dbhost' => array(
631                  'label'            => 'DB_HOST',
632                  'description'    => 'DB_HOST_EXPLAIN',
633                  'type'            => 'text',
634              ),
635              'src_dbport' => array(
636                  'label'            => 'DB_PORT',
637                  'description'    => 'DB_PORT_EXPLAIN',
638                  'type'            => 'text',
639              ),
640              'src_dbname' => array(
641                  'label'        => 'DB_NAME',
642                  'type'        => 'text',
643              ),
644              'src_dbuser' => array(
645                  'label'        => 'DB_USERNAME',
646                  'type'        => 'text',
647              ),
648              'src_dbpasswd' => array(
649                  'label'    => 'DB_PASSWORD',
650                  'type'    => 'password',
651              ),
652              'src_table_prefix' => array(
653                  'label'            => 'TABLE_PREFIX',
654                  'description'    => 'TABLE_PREFIX_EXPLAIN',
655                  'type'            => 'text',
656              ),
657              'forum_path' => array(
658                  'label'            => 'FORUM_PATH',
659                  'description'    => 'FORUM_PATH_EXPLAIN',
660                  'type'            => 'text',
661              ),
662              'refresh' => array(
663                  'label'            => 'REFRESH_PAGE',
664                  'description'    => 'REFRESH_PAGE_EXPLAIN',
665                  'type'            => 'radio',
666                  'options'        => array(
667                      array(
668                          'value'        => 0,
669                          'label'        => 'NO',
670                          'selected'    => true,
671                      ),
672                      array(
673                          'value'        => 1,
674                          'label'        => 'YES',
675                          'selected'    => false,
676                      ),
677                  ),
678              ),
679              'submit' => array(
680                  'label'    => 'SUBMIT',
681                  'type'    => 'submit',
682              ),
683          );
684   
685          if ($this->request->is_ajax())
686          {
687              $this->iohandler->add_user_form_group($form_title, $form_data);
688              $this->iohandler->send_response(true);
689          }
690          else
691          {
692              $rendered_form = $this->iohandler->generate_form_render_data($form_title, $form_data);
693   
694              $this->template->assign_vars(array(
695                  'TITLE'        => $this->language->lang('STAGE_SETTINGS'),
696                  'CONTENT'    => $rendered_form,
697              ));
698          }
699      }
700   
701      /**
702       * Render the list of available convertors
703       *
704       * @return \Symfony\Component\HttpFoundation\Response
705       */
706      protected function render_convert_list()
707      {
708          $this->template->assign_vars(array(
709              'TITLE'        => $this->language->lang('CONVERT_INTRO'),
710              'BODY'        => $this->language->lang('CONVERT_INTRO_BODY'),
711              'S_LIST'    => true,
712          ));
713   
714          $convertors = $sort = array();
715          $get_info = true; // Global flag
716   
717          $handle = @opendir($this->phpbb_root_path . 'install/convertors/');
718   
719          if (!$handle)
720          {
721              die('Unable to access the convertors directory');
722          }
723   
724          while ($entry = readdir($handle))
725          {
726              if (preg_match('/^convert_([a-z0-9_]+).' . $this->php_ext . '$/i', $entry, $m))
727              {
728                  $phpbb_root_path = $this->phpbb_root_path; // These globals are required
729                  $phpEx = $this->php_ext; // See above
730                  include_once($this->phpbb_root_path . 'install/convertors/' . $entry);
731                  if (isset($convertor_data))
732                  {
733                      $sort[strtolower($convertor_data['forum_name'])] = count($convertors);
734   
735                      $convertors[] = array(
736                          'tag'            =>    $m[1],
737                          'forum_name'    =>    $convertor_data['forum_name'],
738                          'version'        =>    $convertor_data['version'],
739                          'dbms'            =>    $convertor_data['dbms'],
740                          'dbhost'        =>    $convertor_data['dbhost'],
741                          'dbport'        =>    $convertor_data['dbport'],
742                          'dbuser'        =>    $convertor_data['dbuser'],
743                          'dbpasswd'        =>    $convertor_data['dbpasswd'],
744                          'dbname'        =>    $convertor_data['dbname'],
745                          'table_prefix'    =>    $convertor_data['table_prefix'],
746                          'author'        =>    $convertor_data['author']
747                      );
748                  }
749                  unset($convertor_data);
750              }
751          }
752          closedir($handle);
753   
754          @ksort($sort);
755   
756          foreach ($sort as $void => $index)
757          {
758              $this->template->assign_block_vars('convertors', array(
759                  'AUTHOR'    => $convertors[$index]['author'],
760                  'SOFTWARE'    => $convertors[$index]['forum_name'],
761                  'VERSION'    => $convertors[$index]['version'],
762   
763                  'U_CONVERT'    => $this->controller_helper->route('phpbb_convert_settings', array('converter' => $convertors[$index]['tag'])),
764              ));
765          }
766   
767          return $this->controller_helper->render('installer_convert.html', 'SUB_INTRO', true);
768      }
769   
770      /**
771       * Renders an error form
772       *
773       * @param string        $msg
774       * @param string|bool    $desc
775       */
776      public function render_error($msg, $desc = false)
777      {
778          if ($this->request->is_ajax())
779          {
780              $this->iohandler->add_error_message($msg, $desc);
781              $this->iohandler->send_response(true);
782          }
783          else
784          {
785              $this->template->assign_vars(array(
786                  'S_ERROR_BOX'    => true,
787                  'ERROR_TITLE'    => $this->language->lang($msg),
788              ));
789   
790              if ($desc)
791              {
792                  $this->template->assign_var('ERROR_MSG', $this->language->lang($desc));
793              }
794          }
795      }
796   
797      /**
798       * Redirects an AJAX request to a non-JS version
799       *
800       * @param string    $url    URL to redirect to
801       */
802      public function redirect_to_html($url)
803      {
804          $this->iohandler->redirect($url);
805          $this->iohandler->send_response(true);
806      }
807   
808      private function setup_navigation($stage)
809      {
810          $active = true;
811          $completed = false;
812   
813          switch ($stage)
814          {
815              case 'finish':
816                  $this->navigation_provider->set_nav_property(
817                      array('convert', 0, 'finish'),
818                      array(
819                          'selected'    => $active,
820                          'completed'    => $completed,
821                      )
822                  );
823   
824                  $active = false;
825                  $completed = true;
826              // no break;
827   
828              case 'convert':
829                  $this->navigation_provider->set_nav_property(
830                      array('convert', 0, 'convert'),
831                      array(
832                          'selected'    => $active,
833                          'completed'    => $completed,
834                      )
835                  );
836   
837                  $active = false;
838                  $completed = true;
839              // no break;
840   
841              case 'settings':
842                  $this->navigation_provider->set_nav_property(
843                      array('convert', 0, 'settings'),
844                      array(
845                          'selected'    => $active,
846                          'completed'    => $completed,
847                      )
848                  );
849   
850                  $active = false;
851                  $completed = true;
852              // no break;
853   
854              case 'intro':
855                  $this->navigation_provider->set_nav_property(
856                      array('convert', 0, 'intro'),
857                      array(
858                          'selected'    => $active,
859                          'completed'    => $completed,
860                      )
861                  );
862              break;
863          }
864      }
865  }
866