[ Index ]

PHP Cross Reference of phpBB-3.2.11-deutsch

title

Body

[close]

/install/convertors/ -> functions_phpbb20.php (source)

   1  <?php
   2  /**
   3  *
   4  * This file is part of the phpBB Forum Software package.
   5  *
   6  * @copyright (c) phpBB Limited <https://www.phpbb.com>
   7  * @license GNU General Public License, version 2 (GPL-2.0)
   8  *
   9  * For full copyright and license information, please see
  10  * the docs/CREDITS.txt file.
  11  *
  12  */
  13  
  14  if (!defined('IN_PHPBB'))
  15  {
  16      exit;
  17  }
  18  
  19  /**
  20  * Helper functions for phpBB 2.0.x to phpBB 3.1.x conversion
  21  */
  22  
  23  /**
  24  * Set forum flags - only prune old polls by default
  25  */
  26  function phpbb_forum_flags()
  27  {
  28      // Set forum flags
  29      $forum_flags = 0;
  30  
  31      // FORUM_FLAG_LINK_TRACK
  32      $forum_flags += 0;
  33  
  34      // FORUM_FLAG_PRUNE_POLL
  35      $forum_flags += FORUM_FLAG_PRUNE_POLL;
  36  
  37      // FORUM_FLAG_PRUNE_ANNOUNCE
  38      $forum_flags += 0;
  39  
  40      // FORUM_FLAG_PRUNE_STICKY
  41      $forum_flags += 0;
  42  
  43      // FORUM_FLAG_ACTIVE_TOPICS
  44      $forum_flags += 0;
  45  
  46      // FORUM_FLAG_POST_REVIEW
  47      $forum_flags += FORUM_FLAG_POST_REVIEW;
  48  
  49      return $forum_flags;
  50  }
  51  
  52  /**
  53  * Insert/Convert forums
  54  */
  55  function phpbb_insert_forums()
  56  {
  57      global $db, $src_db, $same_db, $convert, $user;
  58  
  59      $db->sql_query($convert->truncate_statement . FORUMS_TABLE);
  60  
  61      // Determine the highest id used within the old forums table (we add the categories after the forum ids)
  62      $sql = 'SELECT MAX(forum_id) AS max_forum_id
  63          FROM ' . $convert->src_table_prefix . 'forums';
  64      $result = $src_db->sql_query($sql);
  65      $max_forum_id = (int) $src_db->sql_fetchfield('max_forum_id');
  66      $src_db->sql_freeresult($result);
  67  
  68      $max_forum_id++;
  69  
  70      // pruning disabled globally?
  71      $sql = "SELECT config_value
  72          FROM {$convert->src_table_prefix}config
  73          WHERE config_name = 'prune_enable'";
  74      $result = $src_db->sql_query($sql);
  75      $prune_enabled = (int) $src_db->sql_fetchfield('config_value');
  76      $src_db->sql_freeresult($result);
  77  
  78      // Insert categories
  79      $sql = 'SELECT cat_id, cat_title
  80          FROM ' . $convert->src_table_prefix . 'categories
  81          ORDER BY cat_order';
  82  
  83      if ($convert->mysql_convert && $same_db)
  84      {
  85          $src_db->sql_query("SET NAMES 'binary'");
  86      }
  87  
  88      $result = $src_db->sql_query($sql);
  89  
  90      if ($convert->mysql_convert && $same_db)
  91      {
  92          $src_db->sql_query("SET NAMES 'utf8'");
  93      }
  94  
  95      switch ($db->get_sql_layer())
  96      {
  97          case 'mssql_odbc':
  98          case 'mssqlnative':
  99              $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' ON');
 100          break;
 101      }
 102  
 103      $cats_added = array();
 104      while ($row = $src_db->sql_fetchrow($result))
 105      {
 106          $sql_ary = array(
 107              'forum_id'        => (int) $max_forum_id,
 108              'forum_name'    => ($row['cat_title']) ? htmlspecialchars(phpbb_set_default_encoding($row['cat_title']), ENT_COMPAT, 'UTF-8') : $user->lang['CATEGORY'],
 109              'parent_id'        => 0,
 110              'forum_parents'    => '',
 111              'forum_desc'    => '',
 112              'forum_type'    => FORUM_CAT,
 113              'forum_status'    => ITEM_UNLOCKED,
 114              'forum_rules'    => '',
 115          );
 116  
 117          $sql = 'SELECT MAX(right_id) AS right_id
 118              FROM ' . FORUMS_TABLE;
 119          $_result = $db->sql_query($sql);
 120          $cat_row = $db->sql_fetchrow($_result);
 121          $db->sql_freeresult($_result);
 122  
 123          $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1);
 124          $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2);
 125  
 126          $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 127          $db->sql_query($sql);
 128  
 129          $cats_added[$row['cat_id']] = $max_forum_id;
 130          $max_forum_id++;
 131      }
 132      $src_db->sql_freeresult($result);
 133  
 134      // There may be installations having forums with non-existant category ids.
 135      // We try to catch them and add them to an "unknown" category instead of leaving them out.
 136      $sql = 'SELECT cat_id
 137          FROM ' . $convert->src_table_prefix . 'forums
 138          GROUP BY cat_id';
 139      $result = $src_db->sql_query($sql);
 140  
 141      $unknown_cat_id = false;
 142      while ($row = $src_db->sql_fetchrow($result))
 143      {
 144          // Catch those categories not been added before
 145          if (!isset($cats_added[$row['cat_id']]))
 146          {
 147              $unknown_cat_id = true;
 148          }
 149      }
 150      $src_db->sql_freeresult($result);
 151  
 152      // Is there at least one category not known?
 153      if ($unknown_cat_id === true)
 154      {
 155          $unknown_cat_id = 'ghost';
 156  
 157          $sql_ary = array(
 158              'forum_id'        => (int) $max_forum_id,
 159              'forum_name'    => (string) $user->lang['CATEGORY'],
 160              'parent_id'        => 0,
 161              'forum_parents'    => '',
 162              'forum_desc'    => '',
 163              'forum_type'    => FORUM_CAT,
 164              'forum_status'    => ITEM_UNLOCKED,
 165              'forum_rules'    => '',
 166          );
 167  
 168          $sql = 'SELECT MAX(right_id) AS right_id
 169              FROM ' . FORUMS_TABLE;
 170          $_result = $db->sql_query($sql);
 171          $cat_row = $db->sql_fetchrow($_result);
 172          $db->sql_freeresult($_result);
 173  
 174          $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1);
 175          $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2);
 176  
 177          $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 178          $db->sql_query($sql);
 179  
 180          $cats_added[$unknown_cat_id] = $max_forum_id;
 181      }
 182  
 183      // Now insert the forums
 184      $sql = 'SELECT f.forum_id, f.forum_name, f.cat_id, f.forum_desc, f.forum_status, f.prune_enable, f.prune_next, fp.prune_days, fp.prune_freq FROM ' . $convert->src_table_prefix . 'forums f
 185          LEFT JOIN ' . $convert->src_table_prefix . 'forum_prune fp ON f.forum_id = fp.forum_id
 186          GROUP BY f.forum_id, f.forum_name, f.cat_id, f.forum_desc, f.forum_status, f.prune_enable, f.prune_next, f.forum_order, fp.prune_days, fp.prune_freq
 187          ORDER BY f.cat_id, f.forum_order';
 188  
 189      if ($convert->mysql_convert && $same_db)
 190      {
 191          $src_db->sql_query("SET NAMES 'binary'");
 192      }
 193  
 194      $result = $src_db->sql_query($sql);
 195  
 196      if ($convert->mysql_convert && $same_db)
 197      {
 198          $src_db->sql_query("SET NAMES 'utf8'");
 199      }
 200  
 201      while ($row = $src_db->sql_fetchrow($result))
 202      {
 203          // Some might have forums here with an id not being "possible"...
 204          // To be somewhat friendly we "change" the category id for those to a previously created ghost category
 205          if (!isset($cats_added[$row['cat_id']]) && $unknown_cat_id !== false)
 206          {
 207              $row['cat_id'] = $unknown_cat_id;
 208          }
 209  
 210          if (!isset($cats_added[$row['cat_id']]))
 211          {
 212              continue;
 213          }
 214  
 215          // Define the new forums sql ary
 216          $sql_ary = array(
 217              'forum_id'            => (int) $row['forum_id'],
 218              'forum_name'        => htmlspecialchars(phpbb_set_default_encoding($row['forum_name']), ENT_COMPAT, 'UTF-8'),
 219              'parent_id'            => (int) $cats_added[$row['cat_id']],
 220              'forum_parents'        => '',
 221              'forum_desc'        => htmlspecialchars(phpbb_set_default_encoding($row['forum_desc']), ENT_COMPAT, 'UTF-8'),
 222              'forum_type'        => FORUM_POST,
 223              'forum_status'        => is_item_locked($row['forum_status']),
 224              'enable_prune'        => ($prune_enabled) ? (int) $row['prune_enable'] : 0,
 225              'prune_next'        => (int) null_to_zero($row['prune_next']),
 226              'prune_days'        => (int) null_to_zero($row['prune_days']),
 227              'prune_viewed'        => 0,
 228              'prune_freq'        => (int) null_to_zero($row['prune_freq']),
 229  
 230              'forum_flags'        => phpbb_forum_flags(),
 231              'forum_options'        => 0,
 232  
 233              // Default values
 234              'forum_desc_bitfield'        => '',
 235              'forum_desc_options'        => 7,
 236              'forum_desc_uid'            => '',
 237              'forum_link'                => '',
 238              'forum_password'            => '',
 239              'forum_style'                => 0,
 240              'forum_image'                => '',
 241              'forum_rules'                => '',
 242              'forum_rules_link'            => '',
 243              'forum_rules_bitfield'        => '',
 244              'forum_rules_options'        => 7,
 245              'forum_rules_uid'            => '',
 246              'forum_topics_per_page'        => 0,
 247              'forum_posts_approved'        => 0,
 248              'forum_posts_unapproved'    => 0,
 249              'forum_posts_softdeleted'    => 0,
 250              'forum_topics_approved'        => 0,
 251              'forum_topics_unapproved'    => 0,
 252              'forum_topics_softdeleted'    => 0,
 253              'forum_last_post_id'        => 0,
 254              'forum_last_poster_id'        => 0,
 255              'forum_last_post_subject'    => '',
 256              'forum_last_post_time'        => 0,
 257              'forum_last_poster_name'    => '',
 258              'forum_last_poster_colour'    => '',
 259              'display_on_index'            => 1,
 260              'enable_indexing'            => 1,
 261              'enable_icons'                => 0,
 262          );
 263  
 264          // Now add the forums with proper left/right ids
 265          $sql = 'SELECT left_id, right_id
 266              FROM ' . FORUMS_TABLE . '
 267              WHERE forum_id = ' . $cats_added[$row['cat_id']];
 268          $_result = $db->sql_query($sql);
 269          $cat_row = $db->sql_fetchrow($_result);
 270          $db->sql_freeresult($_result);
 271  
 272          $sql = 'UPDATE ' . FORUMS_TABLE . '
 273              SET left_id = left_id + 2, right_id = right_id + 2
 274              WHERE left_id > ' . $cat_row['right_id'];
 275          $db->sql_query($sql);
 276  
 277          $sql = 'UPDATE ' . FORUMS_TABLE . '
 278              SET right_id = right_id + 2
 279              WHERE ' . $cat_row['left_id'] . ' BETWEEN left_id AND right_id';
 280          $db->sql_query($sql);
 281  
 282          $sql_ary['left_id'] = (int) $cat_row['right_id'];
 283          $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 1);
 284  
 285          $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary);
 286          $db->sql_query($sql);
 287      }
 288      $src_db->sql_freeresult($result);
 289  
 290      switch ($db->get_sql_layer())
 291      {
 292          case 'postgres':
 293              $db->sql_query("SELECT SETVAL('" . FORUMS_TABLE . "_seq',(select case when max(forum_id)>0 then max(forum_id)+1 else 1 end from " . FORUMS_TABLE . '));');
 294          break;
 295  
 296          case 'mssql_odbc':
 297          case 'mssqlnative':
 298              $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' OFF');
 299          break;
 300  
 301          case 'oracle':
 302              $result = $db->sql_query('SELECT MAX(forum_id) as max_id FROM ' . FORUMS_TABLE);
 303              $row = $db->sql_fetchrow($result);
 304              $db->sql_freeresult($result);
 305  
 306              $largest_id = (int) $row['max_id'];
 307  
 308              if ($largest_id)
 309              {
 310                  $db->sql_query('DROP SEQUENCE ' . FORUMS_TABLE . '_seq');
 311                  $db->sql_query('CREATE SEQUENCE ' . FORUMS_TABLE . '_seq START WITH ' . ($largest_id + 1));
 312              }
 313          break;
 314      }
 315  }
 316  
 317  /**
 318  * Function for recoding text with the default language
 319  *
 320  * @param string $text text to recode to utf8
 321  * @param bool $grab_user_lang if set to true the function tries to use $convert_row['user_lang'] (and falls back to $convert_row['poster_id']) instead of the boards default language
 322  */
 323  function phpbb_set_encoding($text, $grab_user_lang = true)
 324  {
 325      global $lang_enc_array, $convert_row;
 326      global $convert, $phpEx;
 327  
 328      /*static $lang_enc_array = array(
 329          'korean'                        => 'euc-kr',
 330          'serbian'                        => 'windows-1250',
 331          'polish'                        => 'iso-8859-2',
 332          'kurdish'                        => 'windows-1254',
 333          'slovak'                        => 'Windows-1250',
 334          'russian'                        => 'windows-1251',
 335          'estonian'                        => 'iso-8859-4',
 336          'chinese_simplified'            => 'gb2312',
 337          'macedonian'                    => 'windows-1251',
 338          'azerbaijani'                    => 'UTF-8',
 339          'romanian'                        => 'iso-8859-2',
 340          'romanian_diacritice'            => 'iso-8859-2',
 341          'lithuanian'                    => 'windows-1257',
 342          'turkish'                        => 'iso-8859-9',
 343          'ukrainian'                        => 'windows-1251',
 344          'japanese'                        => 'shift_jis',
 345          'hungarian'                        => 'ISO-8859-2',
 346          'romanian_no_diacritics'        => 'iso-8859-2',
 347          'mongolian'                        => 'UTF-8',
 348          'slovenian'                        => 'windows-1250',
 349          'bosnian'                        => 'windows-1250',
 350          'czech'                            => 'Windows-1250',
 351          'farsi'                            => 'Windows-1256',
 352          'croatian'                        => 'windows-1250',
 353          'greek'                            => 'iso-8859-7',
 354          'russian_tu'                    => 'windows-1251',
 355          'sakha'                            => 'UTF-8',
 356          'serbian_cyrillic'                => 'windows-1251',
 357          'bulgarian'                        => 'windows-1251',
 358          'chinese_traditional_taiwan'    => 'big5',
 359          'chinese_traditional'            => 'big5',
 360          'arabic'                        => 'windows-1256',
 361          'hebrew'                        => 'WINDOWS-1255',
 362          'thai'                            => 'windows-874',
 363          //'chinese_traditional_taiwan'    => 'utf-8' // custom modified, we may have to do an include :-(
 364      );*/
 365  
 366      if (empty($lang_enc_array))
 367      {
 368          $lang_enc_array = array();
 369      }
 370  
 371      $get_lang = trim(get_config_value('default_lang'));
 372  
 373      // Do we need the users language encoding?
 374      if ($grab_user_lang && !empty($convert_row))
 375      {
 376          if (!empty($convert_row['user_lang']))
 377          {
 378              $get_lang = trim($convert_row['user_lang']);
 379          }
 380          else if (!empty($convert_row['poster_id']))
 381          {
 382              global $src_db, $same_db;
 383  
 384              if ($convert->mysql_convert && $same_db)
 385              {
 386                  $src_db->sql_query("SET NAMES 'binary'");
 387              }
 388  
 389              $sql = 'SELECT user_lang
 390                  FROM ' . $convert->src_table_prefix . 'users
 391                  WHERE user_id = ' . (int) $convert_row['poster_id'];
 392              $result = $src_db->sql_query($sql);
 393              $get_lang = (string) $src_db->sql_fetchfield('user_lang');
 394              $src_db->sql_freeresult($result);
 395  
 396              if ($convert->mysql_convert && $same_db)
 397              {
 398                  $src_db->sql_query("SET NAMES 'utf8'");
 399              }
 400  
 401              $get_lang = (!trim($get_lang)) ? trim(get_config_value('default_lang')) : trim($get_lang);
 402          }
 403      }
 404  
 405      if (!isset($lang_enc_array[$get_lang]))
 406      {
 407          $filename = $convert->options['forum_path'] . '/language/lang_' . $get_lang . '/lang_main.' . $phpEx;
 408  
 409          if (!file_exists($filename))
 410          {
 411              $get_lang = trim(get_config_value('default_lang'));
 412          }
 413  
 414          if (!isset($lang_enc_array[$get_lang]))
 415          {
 416              include($convert->options['forum_path'] . '/language/lang_' . $get_lang . '/lang_main.' . $phpEx);
 417              $lang_enc_array[$get_lang] = $lang['ENCODING'];
 418              unset($lang);
 419          }
 420      }
 421  
 422      return utf8_recode($text, $lang_enc_array[$get_lang]);
 423  }
 424  
 425  /**
 426  * Same as phpbb_set_encoding, but forcing boards default language
 427  */
 428  function phpbb_set_default_encoding($text)
 429  {
 430      return phpbb_set_encoding($text, false);
 431  }
 432  
 433  /**
 434  * Convert Birthday from Birthday MOD to phpBB Format
 435  */
 436  function phpbb_get_birthday($birthday = '')
 437  {
 438      if (defined('MOD_BIRTHDAY_TERRA'))
 439      {
 440          $birthday = (string) $birthday;
 441  
 442          // stored as month, day, year
 443          if (!$birthday)
 444          {
 445              return ' 0- 0-   0';
 446          }
 447  
 448          // We use the original mod code to retrieve the birthday (not ideal)
 449          preg_match('/(..)(..)(....)/', sprintf('%08d', $birthday), $birthday_parts);
 450  
 451          $month = $birthday_parts[1];
 452          $day = $birthday_parts[2];
 453          $year =  $birthday_parts[3];
 454  
 455          return sprintf('%2d-%2d-%4d', $day, $month, $year);
 456      }
 457      else
 458      {
 459          $birthday = (int) $birthday;
 460  
 461          if (!$birthday || $birthday == 999999)
 462          {
 463              return ' 0- 0-   0';
 464          }
 465  
 466          // The birthday mod from niels is using this code to transform to day/month/year
 467          return sprintf('%2d-%2d-%4d', gmdate('j', $birthday * 86400 + 1), gmdate('n', $birthday * 86400 + 1), gmdate('Y', $birthday * 86400 + 1));
 468      }
 469  }
 470  
 471  /**
 472  * Return correct user id value
 473  * Everyone's id will be one higher to allow the guest/anonymous user to have a positive id as well
 474  */
 475  function phpbb_user_id($user_id)
 476  {
 477      global $config;
 478  
 479      // Increment user id if the old forum is having a user with the id 1
 480      if (!isset($config['increment_user_id']))
 481      {
 482          global $src_db, $same_db, $convert;
 483  
 484          if ($convert->mysql_convert && $same_db)
 485          {
 486              $src_db->sql_query("SET NAMES 'binary'");
 487          }
 488  
 489          // Now let us set a temporary config variable for user id incrementing
 490          $sql = "SELECT user_id
 491              FROM {$convert->src_table_prefix}users
 492              WHERE user_id = 1";
 493          $result = $src_db->sql_query($sql);
 494          $id = (int) $src_db->sql_fetchfield('user_id');
 495          $src_db->sql_freeresult($result);
 496  
 497          // Try to get the maximum user id possible...
 498          $sql = "SELECT MAX(user_id) AS max_user_id
 499              FROM {$convert->src_table_prefix}users";
 500          $result = $src_db->sql_query($sql);
 501          $max_id = (int) $src_db->sql_fetchfield('max_user_id');
 502          $src_db->sql_freeresult($result);
 503  
 504          if ($convert->mysql_convert && $same_db)
 505          {
 506              $src_db->sql_query("SET NAMES 'utf8'");
 507          }
 508  
 509          // If there is a user id 1, we need to increment user ids. :/
 510          if ($id === 1)
 511          {
 512              $config->set('increment_user_id', ($max_id + 1), false);
 513              $config['increment_user_id'] = $max_id + 1;
 514          }
 515          else
 516          {
 517              $config->set('increment_user_id', 0, false);
 518              $config['increment_user_id'] = 0;
 519          }
 520      }
 521  
 522      // If the old user id is -1 in 2.0.x it is the anonymous user...
 523      if ($user_id == -1)
 524      {
 525          return ANONYMOUS;
 526      }
 527  
 528      if (!empty($config['increment_user_id']) && $user_id == 1)
 529      {
 530          return $config['increment_user_id'];
 531      }
 532  
 533      // A user id of 0 can happen, for example within the ban table if no user is banned...
 534      // Within the posts and topics table this can be "dangerous" but is the fault of the user
 535      // having mods installed (a poster id of 0 is not possible in 2.0.x).
 536      // Therefore, we return the user id "as is".
 537  
 538      return (int) $user_id;
 539  }
 540  
 541  /**
 542  * Return correct user id value
 543  * Everyone's id will be one higher to allow the guest/anonymous user to have a positive id as well
 544  */
 545  function phpbb_topic_replies_to_posts($num_replies)
 546  {
 547      return (int) $num_replies + 1;
 548  }
 549  
 550  /* Copy additional table fields from old forum to new forum if user wants this (for Mod compatibility for example)
 551  function phpbb_copy_table_fields()
 552  {
 553  }
 554  */
 555  
 556  /**
 557  * Convert authentication
 558  * user, group and forum table has to be filled in order to work
 559  */
 560  function phpbb_convert_authentication($mode)
 561  {
 562      global $db, $src_db, $same_db, $convert, $config;
 563  
 564      if ($mode == 'start')
 565      {
 566          $db->sql_query($convert->truncate_statement . ACL_USERS_TABLE);
 567          $db->sql_query($convert->truncate_statement . ACL_GROUPS_TABLE);
 568  
 569          // What we will do is handling all 2.0.x admins as founder to replicate what is common in 2.0.x.
 570          // After conversion the main admin need to make sure he is removing permissions and the founder status if wanted.
 571  
 572          // Grab user ids of users with user_level of ADMIN
 573          $sql = "SELECT user_id
 574              FROM {$convert->src_table_prefix}users
 575              WHERE user_level = 1
 576              ORDER BY user_regdate ASC";
 577          $result = $src_db->sql_query($sql);
 578  
 579          while ($row = $src_db->sql_fetchrow($result))
 580          {
 581              $user_id = (int) phpbb_user_id($row['user_id']);
 582              // Set founder admin...
 583              $sql = 'UPDATE ' . USERS_TABLE . '
 584                  SET user_type = ' . USER_FOUNDER . "
 585                  WHERE user_id = $user_id";
 586              $db->sql_query($sql);
 587          }
 588          $src_db->sql_freeresult($result);
 589  
 590          $sql = 'SELECT group_id
 591              FROM ' . GROUPS_TABLE . "
 592              WHERE group_name = '" . $db->sql_escape('BOTS') . "'";
 593          $result = $db->sql_query($sql);
 594          $bot_group_id = (int) $db->sql_fetchfield('group_id');
 595          $db->sql_freeresult($result);
 596      }
 597  
 598      // Grab forum auth information
 599      $sql = "SELECT *
 600          FROM {$convert->src_table_prefix}forums";
 601      $result = $src_db->sql_query($sql);
 602  
 603      $forum_access = array();
 604      while ($row = $src_db->sql_fetchrow($result))
 605      {
 606          $forum_access[$row['forum_id']] = $row;
 607      }
 608      $src_db->sql_freeresult($result);
 609  
 610      if ($convert->mysql_convert && $same_db)
 611      {
 612          $src_db->sql_query("SET NAMES 'binary'");
 613      }
 614      // Grab user auth information from 2.0.x board
 615      $sql = "SELECT ug.user_id, aa.*
 616          FROM {$convert->src_table_prefix}auth_access aa, {$convert->src_table_prefix}user_group ug, {$convert->src_table_prefix}groups g, {$convert->src_table_prefix}forums f
 617          WHERE g.group_id = aa.group_id
 618              AND g.group_single_user = 1
 619              AND ug.group_id = g.group_id
 620              AND f.forum_id = aa.forum_id";
 621      $result = $src_db->sql_query($sql);
 622  
 623      $user_access = array();
 624      while ($row = $src_db->sql_fetchrow($result))
 625      {
 626          $user_access[$row['forum_id']][] = $row;
 627      }
 628      $src_db->sql_freeresult($result);
 629  
 630      // Grab group auth information
 631      $sql = "SELECT g.group_id, aa.*
 632          FROM {$convert->src_table_prefix}auth_access aa, {$convert->src_table_prefix}groups g
 633          WHERE g.group_id = aa.group_id
 634              AND g.group_single_user <> 1";
 635      $result = $src_db->sql_query($sql);
 636  
 637      $group_access = array();
 638      while ($row = $src_db->sql_fetchrow($result))
 639      {
 640          $group_access[$row['forum_id']][] = $row;
 641      }
 642      $src_db->sql_freeresult($result);
 643  
 644      if ($convert->mysql_convert && $same_db)
 645      {
 646          $src_db->sql_query("SET NAMES 'utf8'");
 647      }
 648  
 649      // Add Forum Access List
 650      $auth_map = array(
 651          'auth_view'            => array('f_', 'f_list'),
 652          'auth_read'            => array('f_read', 'f_search'),
 653          'auth_post'            => array('f_post', 'f_bbcode', 'f_smilies', 'f_img', 'f_sigs', 'f_postcount', 'f_report', 'f_subscribe', 'f_print', 'f_email'),
 654          'auth_reply'        => 'f_reply',
 655          'auth_edit'            => 'f_edit',
 656          'auth_delete'        => 'f_delete',
 657          'auth_pollcreate'    => 'f_poll',
 658          'auth_vote'            => 'f_vote',
 659          'auth_announce'        => array('f_announce', 'f_announce_global'),
 660          'auth_sticky'        => 'f_sticky',
 661          'auth_attachments'    => array('f_attach', 'f_download'),
 662          'auth_download'        => 'f_download',
 663      );
 664  
 665      // Define the ACL constants used in 2.0 to make the code slightly more readable
 666      define('AUTH_ALL', 0);
 667      define('AUTH_REG', 1);
 668      define('AUTH_ACL', 2);
 669      define('AUTH_MOD', 3);
 670      define('AUTH_ADMIN', 5);
 671  
 672      // A mapping of the simple permissions used by 2.0
 673      $simple_auth_ary = array(
 674          'public'            => array(
 675              'auth_view'            => AUTH_ALL,
 676              'auth_read'            => AUTH_ALL,
 677              'auth_post'            => AUTH_ALL,
 678              'auth_reply'        => AUTH_ALL,
 679              'auth_edit'            => AUTH_REG,
 680              'auth_delete'        => AUTH_REG,
 681              'auth_sticky'        => AUTH_MOD,
 682              'auth_announce'        => AUTH_MOD,
 683              'auth_vote'            => AUTH_REG,
 684              'auth_pollcreate'    => AUTH_REG,
 685          ),
 686          'registered'        => array(
 687              'auth_view'            => AUTH_ALL,
 688              'auth_read'            => AUTH_ALL,
 689              'auth_post'            => AUTH_REG,
 690              'auth_reply'        => AUTH_REG,
 691              'auth_edit'            => AUTH_REG,
 692              'auth_delete'        => AUTH_REG,
 693              'auth_sticky'        => AUTH_MOD,
 694              'auth_announce'        => AUTH_MOD,
 695              'auth_vote'            => AUTH_REG,
 696              'auth_pollcreate'    => AUTH_REG,
 697          ),
 698          'registered_hidden'    => array(
 699              'auth_view'            => AUTH_REG,
 700              'auth_read'            => AUTH_REG,
 701              'auth_post'            => AUTH_REG,
 702              'auth_reply'        => AUTH_REG,
 703              'auth_edit'            => AUTH_REG,
 704              'auth_delete'        => AUTH_REG,
 705              'auth_sticky'        => AUTH_MOD,
 706              'auth_announce'        => AUTH_MOD,
 707              'auth_vote'            => AUTH_REG,
 708              'auth_pollcreate'    => AUTH_REG,
 709          ),
 710          'private'            => array(
 711              'auth_view'            => AUTH_ALL,
 712              'auth_read'            => AUTH_ACL,
 713              'auth_post'            => AUTH_ACL,
 714              'auth_reply'        => AUTH_ACL,
 715              'auth_edit'            => AUTH_ACL,
 716              'auth_delete'        => AUTH_ACL,
 717              'auth_sticky'        => AUTH_ACL,
 718              'auth_announce'        => AUTH_MOD,
 719              'auth_vote'            => AUTH_ACL,
 720              'auth_pollcreate'    => AUTH_ACL,
 721          ),
 722          'private_hidden'    => array(
 723              'auth_view'            => AUTH_ACL,
 724              'auth_read'            => AUTH_ACL,
 725              'auth_post'            => AUTH_ACL,
 726              'auth_reply'        => AUTH_ACL,
 727              'auth_edit'            => AUTH_ACL,
 728              'auth_delete'        => AUTH_ACL,
 729              'auth_sticky'        => AUTH_ACL,
 730              'auth_announce'        => AUTH_MOD,
 731              'auth_vote'            => AUTH_ACL,
 732              'auth_pollcreate'    => AUTH_ACL,
 733          ),
 734          'moderator'            => array(
 735              'auth_view'            => AUTH_ALL,
 736              'auth_read'            => AUTH_MOD,
 737              'auth_post'            => AUTH_MOD,
 738              'auth_reply'        => AUTH_MOD,
 739              'auth_edit'            => AUTH_MOD,
 740              'auth_delete'        => AUTH_MOD,
 741              'auth_sticky'        => AUTH_MOD,
 742              'auth_announce'        => AUTH_MOD,
 743              'auth_vote'            => AUTH_MOD,
 744              'auth_pollcreate'    => AUTH_MOD,
 745          ),
 746          'moderator_hidden'    => array(
 747              'auth_view'            => AUTH_MOD,
 748              'auth_read'            => AUTH_MOD,
 749              'auth_post'            => AUTH_MOD,
 750              'auth_reply'        => AUTH_MOD,
 751              'auth_edit'            => AUTH_MOD,
 752              'auth_delete'        => AUTH_MOD,
 753              'auth_sticky'        => AUTH_MOD,
 754              'auth_announce'        => AUTH_MOD,
 755              'auth_vote'            => AUTH_MOD,
 756              'auth_pollcreate'    => AUTH_MOD,
 757          ),
 758      );
 759  
 760      if ($mode == 'start')
 761      {
 762          user_group_auth('guests', 'SELECT user_id, {GUESTS} FROM ' . USERS_TABLE . ' WHERE user_id = ' . ANONYMOUS, false);
 763          user_group_auth('registered', 'SELECT user_id, {REGISTERED} FROM ' . USERS_TABLE . ' WHERE user_id <> ' . ANONYMOUS . " AND group_id <> $bot_group_id", false);
 764  
 765          // Selecting from old table
 766          if (!empty($config['increment_user_id']))
 767          {
 768              $auth_sql = 'SELECT user_id, {ADMINISTRATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id <> 1';
 769              user_group_auth('administrators', $auth_sql, true);
 770  
 771              $auth_sql = 'SELECT ' . $config['increment_user_id'] . ' as user_id, {ADMINISTRATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id = 1';
 772              user_group_auth('administrators', $auth_sql, true);
 773          }
 774          else
 775          {
 776              $auth_sql = 'SELECT user_id, {ADMINISTRATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1';
 777              user_group_auth('administrators', $auth_sql, true);
 778          }
 779  
 780          if (!empty($config['increment_user_id']))
 781          {
 782              $auth_sql = 'SELECT user_id, {GLOBAL_MODERATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id <> 1';
 783              user_group_auth('global_moderators', $auth_sql, true);
 784  
 785              $auth_sql = 'SELECT ' . $config['increment_user_id'] . ' as user_id, {GLOBAL_MODERATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id = 1';
 786              user_group_auth('global_moderators', $auth_sql, true);
 787          }
 788          else
 789          {
 790              $auth_sql = 'SELECT user_id, {GLOBAL_MODERATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1';
 791              user_group_auth('global_moderators', $auth_sql, true);
 792          }
 793      }
 794      else if ($mode == 'first')
 795      {
 796          // Go through all 2.0.x forums
 797          foreach ($forum_access as $forum)
 798          {
 799              $new_forum_id = (int) $forum['forum_id'];
 800  
 801              // Administrators have full access to all forums whatever happens
 802              mass_auth('group_role', $new_forum_id, 'administrators', 'FORUM_FULL');
 803  
 804              $matched_type = '';
 805              foreach ($simple_auth_ary as $key => $auth_levels)
 806              {
 807                  $matched = 1;
 808                  foreach ($auth_levels as $k => $level)
 809                  {
 810                      if ($forum[$k] != $auth_levels[$k])
 811                      {
 812                          $matched = 0;
 813                      }
 814                  }
 815  
 816                  if ($matched)
 817                  {
 818                      $matched_type = $key;
 819                      break;
 820                  }
 821              }
 822  
 823              switch ($matched_type)
 824              {
 825                  case 'public':
 826                      mass_auth('group_role', $new_forum_id, 'guests', 'FORUM_LIMITED');
 827                      mass_auth('group_role', $new_forum_id, 'registered', 'FORUM_LIMITED_POLLS');
 828                      mass_auth('group_role', $new_forum_id, 'bots', 'FORUM_BOT');
 829                  break;
 830  
 831                  case 'registered':
 832                      mass_auth('group_role', $new_forum_id, 'guests', 'FORUM_READONLY');
 833                      mass_auth('group_role', $new_forum_id, 'bots', 'FORUM_BOT');
 834  
 835                  // no break;
 836  
 837                  case 'registered_hidden':
 838                      mass_auth('group_role', $new_forum_id, 'registered', 'FORUM_POLLS');
 839                  break;
 840  
 841                  case 'private':
 842                  case 'private_hidden':
 843                  case 'moderator':
 844                  case 'moderator_hidden':
 845                  default:
 846                      // The permissions don't match a simple set, so we're going to have to map them directly
 847  
 848                      // No post approval for all, in 2.0.x this feature does not exist
 849                      mass_auth('group', $new_forum_id, 'guests', 'f_noapprove', ACL_YES);
 850                      mass_auth('group', $new_forum_id, 'registered', 'f_noapprove', ACL_YES);
 851  
 852                      // Go through authentication map
 853                      foreach ($auth_map as $old_auth_key => $new_acl)
 854                      {
 855                          // If old authentication key does not exist we continue
 856                          // This is helpful for mods adding additional authentication fields, we need to add them to the auth_map array
 857                          if (!isset($forum[$old_auth_key]))
 858                          {
 859                              continue;
 860                          }
 861  
 862                          // Now set the new ACL correctly
 863                          switch ($forum[$old_auth_key])
 864                          {
 865                              // AUTH_ALL
 866                              case AUTH_ALL:
 867                                  mass_auth('group', $new_forum_id, 'guests', $new_acl, ACL_YES);
 868                                  mass_auth('group', $new_forum_id, 'bots', $new_acl, ACL_YES);
 869                                  mass_auth('group', $new_forum_id, 'registered', $new_acl, ACL_YES);
 870                              break;
 871  
 872                              // AUTH_REG
 873                              case AUTH_REG:
 874                                  mass_auth('group', $new_forum_id, 'registered', $new_acl, ACL_YES);
 875                              break;
 876  
 877                              // AUTH_ACL
 878                              case AUTH_ACL:
 879                                  // Go through the old group access list for this forum
 880                                  if (isset($group_access[$forum['forum_id']]))
 881                                  {
 882                                      foreach ($group_access[$forum['forum_id']] as $index => $access)
 883                                      {
 884                                          // We only check for ACL_YES equivalence entry
 885                                          if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1)
 886                                          {
 887                                              mass_auth('group', $new_forum_id, (int) $access['group_id'], $new_acl, ACL_YES);
 888                                          }
 889                                      }
 890                                  }
 891  
 892                                  if (isset($user_access[$forum['forum_id']]))
 893                                  {
 894                                      foreach ($user_access[$forum['forum_id']] as $index => $access)
 895                                      {
 896                                          // We only check for ACL_YES equivalence entry
 897                                          if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1)
 898                                          {
 899                                              mass_auth('user', $new_forum_id, (int) phpbb_user_id($access['user_id']), $new_acl, ACL_YES);
 900                                          }
 901                                      }
 902                                  }
 903                              break;
 904  
 905                              // AUTH_MOD
 906                              case AUTH_MOD:
 907                                  if (isset($group_access[$forum['forum_id']]))
 908                                  {
 909                                      foreach ($group_access[$forum['forum_id']] as $index => $access)
 910                                      {
 911                                          // We only check for ACL_YES equivalence entry
 912                                          if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1)
 913                                          {
 914                                              mass_auth('group', $new_forum_id, (int) $access['group_id'], $new_acl, ACL_YES);
 915                                          }
 916                                      }
 917                                  }
 918  
 919                                  if (isset($user_access[$forum['forum_id']]))
 920                                  {
 921                                      foreach ($user_access[$forum['forum_id']] as $index => $access)
 922                                      {
 923                                          // We only check for ACL_YES equivalence entry
 924                                          if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1)
 925                                          {
 926                                              mass_auth('user', $new_forum_id, (int) phpbb_user_id($access['user_id']), $new_acl, ACL_YES);
 927                                          }
 928                                      }
 929                                  }
 930                              break;
 931                          }
 932                      }
 933                  break;
 934              }
 935          }
 936      }
 937      else if ($mode == 'second')
 938      {
 939          // Assign permission roles and other default permissions
 940  
 941          // guests having u_download and u_search ability
 942          $db->sql_query('INSERT INTO ' . ACL_GROUPS_TABLE . ' (group_id, forum_id, auth_option_id, auth_role_id, auth_setting) SELECT ' . get_group_id('guests') . ', 0, auth_option_id, 0, 1 FROM ' . ACL_OPTIONS_TABLE . " WHERE auth_option IN ('u_', 'u_download', 'u_search')");
 943  
 944          // administrators/global mods having full user features
 945          mass_auth('group_role', 0, 'administrators', 'USER_FULL');
 946          mass_auth('group_role', 0, 'global_moderators', 'USER_FULL');
 947  
 948          // By default all converted administrators are given full access
 949          mass_auth('group_role', 0, 'administrators', 'ADMIN_FULL');
 950  
 951          // All registered users are assigned the standard user role
 952          mass_auth('group_role', 0, 'registered', 'USER_STANDARD');
 953          mass_auth('group_role', 0, 'registered_coppa', 'USER_STANDARD');
 954  
 955          // Instead of administrators being global moderators we give the MOD_FULL role to global mods (admins already assigned to this group)
 956          mass_auth('group_role', 0, 'global_moderators', 'MOD_FULL');
 957  
 958          // And now those who have had their avatar rights removed get assigned a more restrictive role
 959          $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users
 960              WHERE user_allowavatar = 0
 961                  AND user_id > 0';
 962          $result = $src_db->sql_query($sql);
 963  
 964          while ($row = $src_db->sql_fetchrow($result))
 965          {
 966              mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOAVATAR');
 967          }
 968          $src_db->sql_freeresult($result);
 969  
 970          // And the same for those who have had their PM rights removed
 971          $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users
 972              WHERE user_allow_pm = 0
 973                  AND user_id > 0';
 974          $result = $src_db->sql_query($sql);
 975  
 976          while ($row = $src_db->sql_fetchrow($result))
 977          {
 978              mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOPM');
 979          }
 980          $src_db->sql_freeresult($result);
 981      }
 982      else if ($mode == 'third')
 983      {
 984          // And now the moderators
 985          // We make sure that they have at least standard access to the forums they moderate in addition to the moderating permissions
 986  
 987          $mod_post_map = array(
 988              'auth_announce'        => array('f_announce', 'f_announce_global'),
 989              'auth_sticky'        => 'f_sticky'
 990          );
 991  
 992          foreach ($user_access as $forum_id => $access_map)
 993          {
 994              $forum_id = (int) $forum_id;
 995  
 996              foreach ($access_map as $access)
 997              {
 998                  if (isset($access['auth_mod']) && $access['auth_mod'] == 1)
 999                  {
1000                      mass_auth('user_role', $forum_id, (int) phpbb_user_id($access['user_id']), 'MOD_STANDARD');
1001                      mass_auth('user_role', $forum_id, (int) phpbb_user_id($access['user_id']), 'FORUM_STANDARD');
1002                      foreach ($mod_post_map as $old => $new)
1003                      {
1004                          if (isset($forum_access[$forum_id]) && isset($forum_access[$forum_id][$old]) && $forum_access[$forum_id][$old] == AUTH_MOD)
1005                          {
1006                              mass_auth('user', $forum_id, (int) phpbb_user_id($access['user_id']), $new, ACL_YES);
1007                          }
1008                      }
1009                  }
1010              }
1011          }
1012  
1013          foreach ($group_access as $forum_id => $access_map)
1014          {
1015              $forum_id = (int) $forum_id;
1016  
1017              foreach ($access_map as $access)
1018              {
1019                  if (isset($access['auth_mod']) && $access['auth_mod'] == 1)
1020                  {
1021                      mass_auth('group_role', $forum_id, (int) $access['group_id'], 'MOD_STANDARD');
1022                      mass_auth('group_role', $forum_id, (int) $access['group_id'], 'FORUM_STANDARD');
1023                      foreach ($mod_post_map as $old => $new)
1024                      {
1025                          if (isset($forum_access[$forum_id]) && isset($forum_access[$forum_id][$old]) && $forum_access[$forum_id][$old] == AUTH_MOD)
1026                          {
1027                              mass_auth('group', $forum_id, (int) $access['group_id'], $new, ACL_YES);
1028                          }
1029                      }
1030                  }
1031              }
1032          }
1033  
1034          // We grant everyone readonly access to the categories to ensure that the forums are visible
1035          $sql = 'SELECT forum_id, forum_name, parent_id, left_id, right_id
1036              FROM ' . FORUMS_TABLE . '
1037              ORDER BY left_id ASC';
1038          $result = $db->sql_query($sql);
1039  
1040          $parent_forums = $forums = array();
1041          while ($row = $db->sql_fetchrow($result))
1042          {
1043              if ($row['parent_id'] == 0)
1044              {
1045                  mass_auth('group_role', $row['forum_id'], 'administrators', 'FORUM_FULL');
1046                  mass_auth('group_role', $row['forum_id'], 'global_moderators', 'FORUM_FULL');
1047                  $parent_forums[] = $row;
1048              }
1049              else
1050              {
1051                  $forums[] = $row;
1052              }
1053          }
1054          $db->sql_freeresult($result);
1055  
1056          global $auth;
1057  
1058          // Let us see which groups have access to these forums...
1059          foreach ($parent_forums as $row)
1060          {
1061              // Get the children
1062              $branch = $forum_ids = array();
1063  
1064              foreach ($forums as $key => $_row)
1065              {
1066                  if ($_row['left_id'] > $row['left_id'] && $_row['left_id'] < $row['right_id'])
1067                  {
1068                      $branch[] = $_row;
1069                      $forum_ids[] = $_row['forum_id'];
1070                      continue;
1071                  }
1072              }
1073  
1074              if (count($forum_ids))
1075              {
1076                  // Now make sure the user is able to read these forums
1077                  $hold_ary = $auth->acl_group_raw_data(false, 'f_list', $forum_ids);
1078  
1079                  if (empty($hold_ary))
1080                  {
1081                      continue;
1082                  }
1083  
1084                  foreach ($hold_ary as $g_id => $f_id_ary)
1085                  {
1086                      $set_group = false;
1087  
1088                      foreach ($f_id_ary as $f_id => $auth_ary)
1089                      {
1090                          foreach ($auth_ary as $auth_option => $setting)
1091                          {
1092                              if ($setting == ACL_YES)
1093                              {
1094                                  $set_group = true;
1095                                  break 2;
1096                              }
1097                          }
1098                      }
1099  
1100                      if ($set_group)
1101                      {
1102                          mass_auth('group', $row['forum_id'], $g_id, 'f_list', ACL_YES);
1103                      }
1104                  }
1105              }
1106          }
1107      }
1108  }
1109  
1110  /**
1111  * Set primary group.
1112  * Really simple and only based on user_level (remaining groups will be assigned later)
1113  */
1114  function phpbb_set_primary_group($user_level)
1115  {
1116      global $convert_row;
1117  
1118      if ($user_level == 1)
1119      {
1120          return get_group_id('administrators');
1121      }
1122  /*    else if ($user_level == 2)
1123      {
1124          return get_group_id('global_moderators');
1125      }
1126      else if ($user_level == 0 && $convert_row['user_active'])*/
1127      else if ($convert_row['user_active'])
1128      {
1129          return get_group_id('registered');
1130      }
1131  
1132      return 0;
1133  }
1134  
1135  /**
1136  * Convert the group name, making sure to avoid conflicts with 3.0 special groups
1137  */
1138  function phpbb_convert_group_name($group_name)
1139  {
1140      $default_groups = array(
1141          'GUESTS',
1142          'REGISTERED',
1143          'REGISTERED_COPPA',
1144          'GLOBAL_MODERATORS',
1145          'ADMINISTRATORS',
1146          'BOTS',
1147      );
1148  
1149      if (in_array(strtoupper($group_name), $default_groups))
1150      {
1151          return 'phpBB2 - ' . $group_name;
1152      }
1153  
1154      return phpbb_set_default_encoding($group_name);
1155  }
1156  
1157  /**
1158  * Convert the group type constants
1159  */
1160  function phpbb_convert_group_type($group_type)
1161  {
1162      switch ($group_type)
1163      {
1164          case 0:
1165              return GROUP_OPEN;
1166          break;
1167  
1168          case 1:
1169              return GROUP_CLOSED;
1170          break;
1171  
1172          case 2:
1173              return GROUP_HIDDEN;
1174          break;
1175      }
1176  
1177      // Never return GROUP_SPECIAL here, because only phpBB3's default groups are allowed to have this type set.
1178      return GROUP_HIDDEN;
1179  }
1180  
1181  /**
1182  * Convert the topic type constants
1183  */
1184  function phpbb_convert_topic_type($topic_type)
1185  {
1186      switch ($topic_type)
1187      {
1188          case 0:
1189              return POST_NORMAL;
1190          break;
1191  
1192          case 1:
1193              return POST_STICKY;
1194          break;
1195  
1196          case 2:
1197              return POST_ANNOUNCE;
1198          break;
1199  
1200          case 3:
1201              return POST_GLOBAL;
1202          break;
1203      }
1204  
1205      return POST_NORMAL;
1206  }
1207  
1208  function phpbb_replace_size($matches)
1209  {
1210      return '[size=' . min(200, ceil(100.0 * (((double) $matches[1])/12.0))) . ':' . $matches[2] . ']';
1211  }
1212  
1213  /**
1214  * Reparse the message stripping out the bbcode_uid values and adding new ones and setting the bitfield
1215  * @todo What do we want to do about HTML in messages - currently it gets converted to the entities, but there may be some objections to this
1216  */
1217  function phpbb_prepare_message($message)
1218  {
1219      global $convert, $user, $convert_row, $message_parser;
1220  
1221      if (!$message)
1222      {
1223          $convert->row['mp_bbcode_bitfield'] = $convert_row['mp_bbcode_bitfield'] = 0;
1224          return '';
1225      }
1226  
1227      // Decode phpBB 2.0.x Message
1228      if (isset($convert->row['old_bbcode_uid']) && $convert->row['old_bbcode_uid'] != '')
1229      {
1230          // Adjust size...
1231          if (strpos($message, '[size=') !== false)
1232          {
1233              $message = preg_replace_callback('/\[size=(\d*):(' . $convert->row['old_bbcode_uid'] . ')\]/', 'phpbb_replace_size', $message);
1234          }
1235  
1236          $message = preg_replace('/\:(([a-z0-9]:)?)' . $convert->row['old_bbcode_uid'] . '/s', '', $message);
1237      }
1238  
1239      if (strpos($message, '[quote=') !== false)
1240      {
1241          $message = preg_replace('/\[quote="(.*?)"\]/s', '[quote=&quot;\1&quot;]', $message);
1242          $message = preg_replace('/\[quote=\\\"(.*?)\\\"\]/s', '[quote=&quot;\1&quot;]', $message);
1243  
1244          // let's hope that this solves more problems than it causes. Deal with escaped quotes.
1245          $message = str_replace('\"', '&quot;', $message);
1246          $message = str_replace('\&quot;', '&quot;', $message);
1247      }
1248  
1249      $message = str_replace('<br />', "\n", $message);
1250      $message = str_replace('<', '&lt;', $message);
1251      $message = str_replace('>', '&gt;', $message);
1252  
1253      // make the post UTF-8
1254      $message = phpbb_set_encoding($message);
1255  
1256      $message_parser->warn_msg = array(); // Reset the errors from the previous message
1257      $message_parser->bbcode_uid = make_uid($convert->row['post_time']);
1258      $message_parser->message = $message;
1259      unset($message);
1260  
1261      // Make sure options are set.
1262  //    $enable_html = (!isset($row['enable_html'])) ? false : $row['enable_html'];
1263      $enable_bbcode = (!isset($convert->row['enable_bbcode'])) ? true : $convert->row['enable_bbcode'];
1264      $enable_smilies = (!isset($convert->row['enable_smilies'])) ? true : $convert->row['enable_smilies'];
1265      $enable_magic_url = (!isset($convert->row['enable_magic_url'])) ? true : $convert->row['enable_magic_url'];
1266  
1267      // parse($allow_bbcode, $allow_magic_url, $allow_smilies, $allow_img_bbcode = true, $allow_flash_bbcode = true, $allow_quote_bbcode = true, $allow_url_bbcode = true, $update_this_message = true, $mode = 'post')
1268      $message_parser->parse($enable_bbcode, $enable_magic_url, $enable_smilies);
1269  
1270      if (count($message_parser->warn_msg))
1271      {
1272          $msg_id = isset($convert->row['post_id']) ? $convert->row['post_id'] : $convert->row['privmsgs_id'];
1273          $convert->p_master->error('<span style="color:red">' . $user->lang['POST_ID'] . ': ' . $msg_id . ' ' . $user->lang['CONV_ERROR_MESSAGE_PARSER'] . ': <br /><br />' . implode('<br />', $message_parser->warn_msg), __LINE__, __FILE__, true);
1274      }
1275  
1276      $convert->row['mp_bbcode_bitfield'] = $convert_row['mp_bbcode_bitfield'] = $message_parser->bbcode_bitfield;
1277  
1278      $message = $message_parser->message;
1279      unset($message_parser->message);
1280  
1281      return $message;
1282  }
1283  
1284  /**
1285  * Return the bitfield calculated by the previous function
1286  */
1287  function get_bbcode_bitfield()
1288  {
1289      global $convert_row;
1290  
1291      return $convert_row['mp_bbcode_bitfield'];
1292  }
1293  
1294  /**
1295  * Determine the last user to edit a post
1296  * In practice we only tracked edits by the original poster in 2.0.x so this will only be set if they had edited their own post
1297  */
1298  function phpbb_post_edit_user()
1299  {
1300      global $convert_row;
1301  
1302      if (isset($convert_row['post_edit_count']))
1303      {
1304          return phpbb_user_id($convert_row['poster_id']);
1305      }
1306  
1307      return 0;
1308  }
1309  
1310  /**
1311  * Obtain the path to uploaded files on the 2.0.x forum
1312  * This is only used if the Attachment MOD was installed
1313  */
1314  function phpbb_get_files_dir()
1315  {
1316      if (!defined('MOD_ATTACHMENT'))
1317      {
1318          return;
1319      }
1320  
1321      global $src_db, $same_db, $convert, $user;
1322  
1323      if ($convert->mysql_convert && $same_db)
1324      {
1325          $src_db->sql_query("SET NAMES 'binary'");
1326      }
1327      $sql = 'SELECT config_value AS upload_dir
1328          FROM ' . $convert->src_table_prefix . "attachments_config
1329          WHERE config_name = 'upload_dir'";
1330      $result = $src_db->sql_query($sql);
1331      $upload_path = $src_db->sql_fetchfield('upload_dir');
1332      $src_db->sql_freeresult($result);
1333  
1334      $sql = 'SELECT config_value AS ftp_upload
1335          FROM ' . $convert->src_table_prefix . "attachments_config
1336          WHERE config_name = 'allow_ftp_upload'";
1337      $result = $src_db->sql_query($sql);
1338      $ftp_upload = (int) $src_db->sql_fetchfield('ftp_upload');
1339      $src_db->sql_freeresult($result);
1340  
1341      if ($convert->mysql_convert && $same_db)
1342      {
1343          $src_db->sql_query("SET NAMES 'utf8'");
1344      }
1345  
1346      if ($ftp_upload)
1347      {
1348          $convert->p_master->error($user->lang['CONV_ERROR_ATTACH_FTP_DIR'], __LINE__, __FILE__);
1349      }
1350  
1351      return $upload_path;
1352  }
1353  
1354  /**
1355  * Copy thumbnails of uploaded images from the 2.0.x forum
1356  * This is only used if the Attachment MOD was installed
1357  */
1358  function phpbb_copy_thumbnails()
1359  {
1360      global $convert, $config, $phpbb_root_path;
1361  
1362      $src_path = $convert->options['forum_path'] . '/' . phpbb_get_files_dir() . '/thumbs/';
1363  
1364      if ($handle = @opendir($src_path))
1365      {
1366          while ($entry = readdir($handle))
1367          {
1368              if ($entry[0] == '.')
1369              {
1370                  continue;
1371              }
1372  
1373              if (is_dir($src_path . $entry))
1374              {
1375                  continue;
1376              }
1377              else
1378              {
1379                  copy_file($src_path . $entry, $config['upload_path'] . '/' . preg_replace('/^t_/', 'thumb_', $entry));
1380                  @unlink($phpbb_root_path . $config['upload_path'] . '/thumbs/' . $entry);
1381              }
1382          }
1383          closedir($handle);
1384      }
1385  }
1386  
1387  /**
1388  * Convert the attachment category constants
1389  * This is only used if the Attachment MOD was installed
1390  */
1391  function phpbb_attachment_category($cat_id)
1392  {
1393      switch ($cat_id)
1394      {
1395          case 1:
1396              return ATTACHMENT_CATEGORY_IMAGE;
1397          break;
1398  
1399          case 2:
1400              return ATTACHMENT_CATEGORY_WM;
1401          break;
1402  
1403          case 3:
1404              return ATTACHMENT_CATEGORY_FLASH;
1405          break;
1406      }
1407  
1408      return ATTACHMENT_CATEGORY_NONE;
1409  }
1410  
1411  /**
1412  * Convert the attachment extension names
1413  * This is only used if the Attachment MOD was installed
1414  */
1415  function phpbb_attachment_extension_group_name()
1416  {
1417      global $db, $phpbb_root_path, $phpEx;
1418  
1419      // Update file extension group names to use language strings.
1420      $sql = 'SELECT lang_dir
1421          FROM ' . LANG_TABLE;
1422      $result = $db->sql_query($sql);
1423  
1424      $extension_groups_updated = array();
1425      while ($lang_dir = $db->sql_fetchfield('lang_dir'))
1426      {
1427          $lang_dir = basename($lang_dir);
1428          $lang_file = $phpbb_root_path . 'language/' . $lang_dir . '/acp/attachments.' . $phpEx;
1429  
1430          if (!file_exists($lang_file))
1431          {
1432              continue;
1433          }
1434  
1435          $lang = array();
1436          include($lang_file);
1437  
1438          foreach ($lang as $lang_key => $lang_val)
1439          {
1440              if (isset($extension_groups_updated[$lang_key]) || strpos($lang_key, 'EXT_GROUP_') !== 0)
1441              {
1442                  continue;
1443              }
1444  
1445              $sql_ary = array(
1446                  'group_name'    => substr($lang_key, 10), // Strip off 'EXT_GROUP_'
1447              );
1448  
1449              $sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . '
1450                  SET ' . $db->sql_build_array('UPDATE', $sql_ary) . "
1451                      WHERE group_name = '" . $db->sql_escape($lang_val) . "'";
1452              $db->sql_query($sql);
1453  
1454              $extension_groups_updated[$lang_key] = true;
1455          }
1456      }
1457      $db->sql_freeresult($result);
1458  }
1459  
1460  /**
1461  * Obtain list of forums in which different attachment categories can be used
1462  */
1463  function phpbb_attachment_forum_perms($forum_permissions)
1464  {
1465      if (empty($forum_permissions))
1466      {
1467          return '';
1468      }
1469  
1470      // Decode forum permissions
1471      $forum_ids = array();
1472  
1473      $one_char_encoding = '#';
1474      $two_char_encoding = '.';
1475  
1476      $auth_len = 1;
1477      for ($pos = 0; $pos < strlen($forum_permissions); $pos += $auth_len)
1478      {
1479          $forum_auth = substr($forum_permissions, $pos, 1);
1480          if ($forum_auth == $one_char_encoding)
1481          {
1482              $auth_len = 1;
1483              continue;
1484          }
1485          else if ($forum_auth == $two_char_encoding)
1486          {
1487              $auth_len = 2;
1488              $pos--;
1489              continue;
1490          }
1491  
1492          $forum_auth = substr($forum_permissions, $pos, $auth_len);
1493          $forum_id = base64_unpack($forum_auth);
1494  
1495          $forum_ids[] = (int) $forum_id;
1496      }
1497  
1498      if (count($forum_ids))
1499      {
1500          return attachment_forum_perms($forum_ids);
1501      }
1502  
1503      return '';
1504  }
1505  
1506  /**
1507  * Convert the avatar type constants
1508  */
1509  function phpbb_avatar_type($type)
1510  {
1511      switch ($type)
1512      {
1513          case 1:
1514              return AVATAR_UPLOAD;
1515          break;
1516  
1517          case 2:
1518              return AVATAR_REMOTE;
1519          break;
1520  
1521          case 3:
1522              return AVATAR_GALLERY;
1523          break;
1524      }
1525  
1526      return 0;
1527  }
1528  
1529  
1530  /**
1531  * Just undos the replacing of '<' and '>'
1532  */
1533  function  phpbb_smilie_html_decode($code)
1534  {
1535      $code = str_replace('&lt;', '<', $code);
1536      return str_replace('&gt;', '>', $code);
1537  }
1538  
1539  /**
1540  * Transfer avatars, copying the image if it was uploaded
1541  */
1542  function phpbb_import_avatar($user_avatar)
1543  {
1544      global $convert_row;
1545  
1546      if (!$convert_row['user_avatar_type'])
1547      {
1548          return '';
1549      }
1550      else if ($convert_row['user_avatar_type'] == 1)
1551      {
1552          // Uploaded avatar
1553          return import_avatar($user_avatar, false, $convert_row['user_id']);
1554      }
1555      else if ($convert_row['user_avatar_type'] == 2)
1556      {
1557          // Remote avatar
1558          return $user_avatar;
1559      }
1560      else if ($convert_row['user_avatar_type'] == 3)
1561      {
1562          // Gallery avatar
1563          return $user_avatar;
1564      }
1565  
1566      return '';
1567  }
1568  
1569  
1570  /**
1571  * Find out about the avatar's dimensions
1572  */
1573  function phpbb_get_avatar_height($user_avatar)
1574  {
1575      global $convert_row;
1576  
1577      if (empty($convert_row['user_avatar_type']))
1578      {
1579          return 0;
1580      }
1581      return get_avatar_height($user_avatar, 'phpbb_avatar_type', $convert_row['user_avatar_type']);
1582  }
1583  
1584  
1585  /**
1586  * Find out about the avatar's dimensions
1587  */
1588  function phpbb_get_avatar_width($user_avatar)
1589  {
1590      global $convert_row;
1591  
1592      if (empty($convert_row['user_avatar_type']))
1593      {
1594          return 0;
1595      }
1596  
1597      return get_avatar_width($user_avatar, 'phpbb_avatar_type', $convert_row['user_avatar_type']);
1598  }
1599  
1600  
1601  /**
1602  * Calculate the correct to_address field for private messages
1603  */
1604  function phpbb_privmsgs_to_userid($to_userid)
1605  {
1606      return 'u_' . phpbb_user_id($to_userid);
1607  }
1608  
1609  /**
1610  * Calculate whether a private message was unread using the bitfield
1611  */
1612  function phpbb_unread_pm($pm_type)
1613  {
1614      return ($pm_type == 5) ? 1 : 0;
1615  }
1616  
1617  /**
1618  * Calculate whether a private message was new using the bitfield
1619  */
1620  function phpbb_new_pm($pm_type)
1621  {
1622      return ($pm_type == 1) ? 1 : 0;
1623  }
1624  
1625  /**
1626  * Obtain the folder_id for the custom folder created to replace the savebox from 2.0.x (used to store saved private messages)
1627  */
1628  function phpbb_get_savebox_id($user_id)
1629  {
1630      global $db;
1631  
1632      $user_id = phpbb_user_id($user_id);
1633  
1634      // Only one custom folder, check only one
1635      $sql = 'SELECT folder_id
1636          FROM ' . PRIVMSGS_FOLDER_TABLE . '
1637          WHERE user_id = ' . $user_id;
1638      $result = $db->sql_query_limit($sql, 1);
1639      $folder_id = (int) $db->sql_fetchfield('folder_id');
1640      $db->sql_freeresult($result);
1641  
1642      return $folder_id;
1643  }
1644  
1645  /**
1646  * Transfer attachment specific configuration options
1647  * These were not stored in the main config table on 2.0.x
1648  * This is only used if the Attachment MOD was installed
1649  */
1650  function phpbb_import_attach_config()
1651  {
1652      global $src_db, $same_db, $convert, $config;
1653  
1654      if ($convert->mysql_convert && $same_db)
1655      {
1656          $src_db->sql_query("SET NAMES 'binary'");
1657      }
1658  
1659      $sql = 'SELECT *
1660          FROM ' . $convert->src_table_prefix . 'attachments_config';
1661      $result = $src_db->sql_query($sql);
1662  
1663      if ($convert->mysql_convert && $same_db)
1664      {
1665          $src_db->sql_query("SET NAMES 'utf8'");
1666      }
1667  
1668      $attach_config = array();
1669      while ($row = $src_db->sql_fetchrow($result))
1670      {
1671          $attach_config[$row['config_name']] = $row['config_value'];
1672      }
1673      $src_db->sql_freeresult($result);
1674  
1675      $config->set('allow_attachments', 1);
1676  
1677      // old attachment mod? Must be very old if this entry do not exist...
1678      if (!empty($attach_config['display_order']))
1679      {
1680          $config->set('display_order', $attach_config['display_order']);
1681      }
1682      $config->set('max_filesize', $attach_config['max_filesize']);
1683      $config->set('max_filesize_pm', $attach_config['max_filesize_pm']);
1684      $config->set('attachment_quota', $attach_config['attachment_quota']);
1685      $config->set('max_attachments', $attach_config['max_attachments']);
1686      $config->set('max_attachments_pm', $attach_config['max_attachments_pm']);
1687      $config->set('allow_pm_attach', $attach_config['allow_pm_attach']);
1688  
1689      $config->set('img_display_inlined', $attach_config['img_display_inlined']);
1690      $config->set('img_max_width', $attach_config['img_max_width']);
1691      $config->set('img_max_height', $attach_config['img_max_height']);
1692      $config->set('img_link_width', $attach_config['img_link_width']);
1693      $config->set('img_link_height', $attach_config['img_link_height']);
1694      $config->set('img_create_thumbnail', $attach_config['img_create_thumbnail']);
1695      $config->set('img_max_thumb_width', 400);
1696      $config->set('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']);
1697  }
1698  
1699  /**
1700  * Calculate the date a user became inactive
1701  */
1702  function phpbb_inactive_time()
1703  {
1704      global $convert_row;
1705  
1706      if ($convert_row['user_active'])
1707      {
1708          return 0;
1709      }
1710  
1711      if ($convert_row['user_lastvisit'])
1712      {
1713          return $convert_row['user_lastvisit'];
1714      }
1715  
1716      return $convert_row['user_regdate'];
1717  }
1718  
1719  /**
1720  * Calculate the reason a user became inactive
1721  * We can't actually tell the difference between a manual deactivation and one for profile changes
1722  * from the data available to assume the latter
1723  */
1724  function phpbb_inactive_reason()
1725  {
1726      global $convert_row;
1727  
1728      if ($convert_row['user_active'])
1729      {
1730          return 0;
1731      }
1732  
1733      if ($convert_row['user_lastvisit'])
1734      {
1735          return INACTIVE_PROFILE;
1736      }
1737  
1738      return INACTIVE_REGISTER;
1739  }
1740  
1741  /**
1742  * Adjust 2.0.x disallowed names to 3.0.x format
1743  */
1744  function phpbb_disallowed_username($username)
1745  {
1746      // Replace * with %
1747      $username = phpbb_set_default_encoding(str_replace('*', '%', $username));
1748      return utf8_htmlspecialchars($username);
1749  }
1750  
1751  /**
1752  * Checks whether there are any usernames on the old board that would map to the same
1753  * username_clean on phpBB3. Prints out a list if any exist and exits.
1754  */
1755  function phpbb_create_userconv_table()
1756  {
1757      global $db;
1758  
1759      switch ($db->get_sql_layer())
1760      {
1761          case 'mysql':
1762              $map_dbms = 'mysql_40';
1763          break;
1764  
1765          case 'mysql4':
1766              if (version_compare($db->sql_server_info(true), '4.1.3', '>='))
1767              {
1768                  $map_dbms = 'mysql_41';
1769              }
1770              else
1771              {
1772                  $map_dbms = 'mysql_40';
1773              }
1774          break;
1775  
1776          case 'mysqli':
1777              $map_dbms = 'mysql_41';
1778          break;
1779  
1780          case 'mssql_odbc':
1781          case 'mssqlnative':
1782              $map_dbms = 'mssql';
1783          break;
1784  
1785          default:
1786              $map_dbms = $db->get_sql_layer();
1787          break;
1788      }
1789  
1790      // create a temporary table in which we store the clean usernames
1791      $drop_sql = 'DROP TABLE ' . USERCONV_TABLE;
1792      switch ($map_dbms)
1793      {
1794          case 'mssql':
1795              $create_sql = 'CREATE TABLE [' . USERCONV_TABLE . '] (
1796                  [user_id] [int] NOT NULL ,
1797                  [username_clean] [varchar] (255) DEFAULT (\'\') NOT NULL
1798              )';
1799          break;
1800  
1801          case 'mysql_40':
1802              $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
1803                  user_id mediumint(8) NOT NULL,
1804                  username_clean blob NOT NULL
1805              )';
1806          break;
1807  
1808          case 'mysql_41':
1809              $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
1810                  user_id mediumint(8) NOT NULL,
1811                  username_clean varchar(255) DEFAULT \'\' NOT NULL
1812              ) CHARACTER SET `utf8` COLLATE `utf8_bin`';
1813          break;
1814  
1815          case 'oracle':
1816              $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
1817                  user_id number(8) NOT NULL,
1818                  username_clean varchar2(255) DEFAULT \'\'
1819              )';
1820          break;
1821  
1822          case 'postgres':
1823              $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
1824                  user_id INT4 DEFAULT \'0\',
1825                  username_clean varchar_ci DEFAULT \'\' NOT NULL
1826              )';
1827          break;
1828  
1829          case 'sqlite3':
1830              $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' (
1831                  user_id INTEGER NOT NULL DEFAULT \'0\',
1832                  username_clean varchar(255) NOT NULL DEFAULT \'\'
1833              )';
1834          break;
1835      }
1836  
1837      $db->sql_return_on_error(true);
1838      $db->sql_query($drop_sql);
1839      $db->sql_return_on_error(false);
1840      $db->sql_query($create_sql);
1841  }
1842  
1843  function phpbb_check_username_collisions()
1844  {
1845      global $db, $src_db, $convert, $user, $lang;
1846  
1847      // now find the clean version of the usernames that collide
1848      $sql = 'SELECT username_clean
1849          FROM ' . USERCONV_TABLE .'
1850          GROUP BY username_clean
1851          HAVING COUNT(user_id) > 1';
1852      $result = $db->sql_query($sql);
1853  
1854      $colliding_names = array();
1855      while ($row = $db->sql_fetchrow($result))
1856      {
1857          $colliding_names[] = $row['username_clean'];
1858      }
1859      $db->sql_freeresult($result);
1860  
1861      // there was at least one collision, the admin will have to solve it before conversion can continue
1862      if (count($colliding_names))
1863      {
1864          $sql = 'SELECT user_id, username_clean
1865              FROM ' . USERCONV_TABLE . '
1866              WHERE ' . $db->sql_in_set('username_clean', $colliding_names);
1867          $result = $db->sql_query($sql);
1868          unset($colliding_names);
1869  
1870          $colliding_user_ids = array();
1871          while ($row = $db->sql_fetchrow($result))
1872          {
1873              $colliding_user_ids[(int) $row['user_id']] = $row['username_clean'];
1874          }
1875          $db->sql_freeresult($result);
1876  
1877          $sql = 'SELECT username, user_id, user_posts
1878              FROM ' . $convert->src_table_prefix . 'users
1879              WHERE ' . $src_db->sql_in_set('user_id', array_keys($colliding_user_ids));
1880          $result = $src_db->sql_query($sql);
1881  
1882          $colliding_users = array();
1883          while ($row = $src_db->sql_fetchrow($result))
1884          {
1885              $row['user_id'] = (int) $row['user_id'];
1886              if (isset($colliding_user_ids[$row['user_id']]))
1887              {
1888                  $colliding_users[$colliding_user_ids[$row['user_id']]][] = $row;
1889              }
1890          }
1891          $src_db->sql_freeresult($result);
1892          unset($colliding_user_ids);
1893  
1894          $list = '';
1895          foreach ($colliding_users as $username_clean => $users)
1896          {
1897              $list .= sprintf($user->lang['COLLIDING_CLEAN_USERNAME'], $username_clean) . "<br />\n";
1898              foreach ($users as $i => $row)
1899              {
1900                  $list .= sprintf($user->lang['COLLIDING_USER'], $row['user_id'], phpbb_set_default_encoding($row['username']), $row['user_posts']) . "<br />\n";
1901              }
1902          }
1903  
1904          $lang['INST_ERR_FATAL'] = $user->lang['CONV_ERR_FATAL'];
1905          $convert->p_master->error('<span style="color:red">' . $user->lang['COLLIDING_USERNAMES_FOUND'] . '</span></b><br /><br />' . $list . '<b>', __LINE__, __FILE__);
1906      }
1907  
1908      $drop_sql = 'DROP TABLE ' . USERCONV_TABLE;
1909      $db->sql_query($drop_sql);
1910  }
1911  
1912  function phpbb_convert_timezone($timezone)
1913  {
1914      global $config, $db, $phpbb_root_path, $phpEx, $table_prefix;
1915  
1916      $factory = new \phpbb\db\tools\factory();
1917      $timezone_migration = new \phpbb\db\migration\data\v310\timezone($config, $db, $factory->get($db), $phpbb_root_path, $phpEx, $table_prefix);
1918      return $timezone_migration->convert_phpbb30_timezone($timezone, 0);
1919  }
1920  
1921  function phpbb_add_notification_options($user_notify_pm)
1922  {
1923      global $convert_row, $db;
1924  
1925      $user_id = phpbb_user_id($convert_row['user_id']);
1926      if ($user_id == ANONYMOUS)
1927      {
1928          return;
1929      }
1930  
1931      $rows = array();
1932  
1933      $rows[] = array(
1934          'item_type'        => 'post',
1935          'item_id'        => 0,
1936          'user_id'        => (int) $user_id,
1937          'notify'        => 1,
1938          'method'        => 'email',
1939      );
1940      $rows[] = array(
1941          'item_type'        => 'topic',
1942          'item_id'        => 0,
1943          'user_id'        => (int) $user_id,
1944          'notify'        => 1,
1945          'method'        => 'email',
1946      );
1947      if ($user_notify_pm)
1948      {
1949          $rows[] = array(
1950              'item_type'        => 'pm',
1951              'item_id'        => 0,
1952              'user_id'        => (int) $user_id,
1953              'notify'        => 1,
1954              'method'        => 'email',
1955          );
1956      }
1957  
1958      $db->sql_multi_insert(USER_NOTIFICATIONS_TABLE, $rows);
1959  }
1960  
1961  function phpbb_convert_password_hash($hash)
1962  {
1963      global $phpbb_container;
1964  
1965      /* @var $manager \phpbb\passwords\manager */
1966      $manager = $phpbb_container->get('passwords.manager');
1967      $hash = $manager->hash($hash, '$H$');
1968  
1969      return '$CP$' . $hash;
1970  }


Generated: Wed Nov 11 20:33:01 2020 Cross-referenced by PHPXref 0.7.1