* @license GNU General Public License, version 2 (GPL-2.0) * * For full copyright and license information, please see * the docs/CREDITS.txt file. * */ if (!defined('IN_PHPBB')) { exit; } /** * Helper functions for phpBB 2.0.x to phpBB 3.1.x conversion */ /** * Set forum flags - only prune old polls by default */ function phpbb_forum_flags() { // Set forum flags $forum_flags = 0; // FORUM_FLAG_LINK_TRACK $forum_flags += 0; // FORUM_FLAG_PRUNE_POLL $forum_flags += FORUM_FLAG_PRUNE_POLL; // FORUM_FLAG_PRUNE_ANNOUNCE $forum_flags += 0; // FORUM_FLAG_PRUNE_STICKY $forum_flags += 0; // FORUM_FLAG_ACTIVE_TOPICS $forum_flags += 0; // FORUM_FLAG_POST_REVIEW $forum_flags += FORUM_FLAG_POST_REVIEW; return $forum_flags; } /** * Insert/Convert forums */ function phpbb_insert_forums() { global $db, $src_db, $same_db, $convert, $user, $config; $db->sql_query($convert->truncate_statement . FORUMS_TABLE); // Determine the highest id used within the old forums table (we add the categories after the forum ids) $sql = 'SELECT MAX(forum_id) AS max_forum_id FROM ' . $convert->src_table_prefix . 'forums'; $result = $src_db->sql_query($sql); $max_forum_id = (int) $src_db->sql_fetchfield('max_forum_id'); $src_db->sql_freeresult($result); $max_forum_id++; // pruning disabled globally? $sql = "SELECT config_value FROM {$convert->src_table_prefix}config WHERE config_name = 'prune_enable'"; $result = $src_db->sql_query($sql); $prune_enabled = (int) $src_db->sql_fetchfield('config_value'); $src_db->sql_freeresult($result); // Insert categories $sql = 'SELECT cat_id, cat_title FROM ' . $convert->src_table_prefix . 'categories ORDER BY cat_order'; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } switch ($db->get_sql_layer()) { case 'mssql': case 'mssql_odbc': case 'mssqlnative': $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' ON'); break; } $cats_added = array(); while ($row = $src_db->sql_fetchrow($result)) { $sql_ary = array( 'forum_id' => (int) $max_forum_id, 'forum_name' => ($row['cat_title']) ? htmlspecialchars(phpbb_set_default_encoding($row['cat_title']), ENT_COMPAT, 'UTF-8') : $user->lang['CATEGORY'], 'parent_id' => 0, 'forum_parents' => '', 'forum_desc' => '', 'forum_type' => FORUM_CAT, 'forum_status' => ITEM_UNLOCKED, 'forum_rules' => '', ); $sql = 'SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1); $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); $cats_added[$row['cat_id']] = $max_forum_id; $max_forum_id++; } $src_db->sql_freeresult($result); // There may be installations having forums with non-existant category ids. // We try to catch them and add them to an "unknown" category instead of leaving them out. $sql = 'SELECT cat_id FROM ' . $convert->src_table_prefix . 'forums GROUP BY cat_id'; $result = $src_db->sql_query($sql); $unknown_cat_id = false; while ($row = $src_db->sql_fetchrow($result)) { // Catch those categories not been added before if (!isset($cats_added[$row['cat_id']])) { $unknown_cat_id = true; } } $src_db->sql_freeresult($result); // Is there at least one category not known? if ($unknown_cat_id === true) { $unknown_cat_id = 'ghost'; $sql_ary = array( 'forum_id' => (int) $max_forum_id, 'forum_name' => (string) $user->lang['CATEGORY'], 'parent_id' => 0, 'forum_parents' => '', 'forum_desc' => '', 'forum_type' => FORUM_CAT, 'forum_status' => ITEM_UNLOCKED, 'forum_rules' => '', ); $sql = 'SELECT MAX(right_id) AS right_id FROM ' . FORUMS_TABLE; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql_ary['left_id'] = (int) ($cat_row['right_id'] + 1); $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 2); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); $cats_added[$unknown_cat_id] = $max_forum_id; $max_forum_id++; } // Now insert the forums $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 LEFT JOIN ' . $convert->src_table_prefix . 'forum_prune fp ON f.forum_id = fp.forum_id 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 ORDER BY f.cat_id, f.forum_order'; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } while ($row = $src_db->sql_fetchrow($result)) { // Some might have forums here with an id not being "possible"... // To be somewhat friendly we "change" the category id for those to a previously created ghost category if (!isset($cats_added[$row['cat_id']]) && $unknown_cat_id !== false) { $row['cat_id'] = $unknown_cat_id; } if (!isset($cats_added[$row['cat_id']])) { continue; } // Define the new forums sql ary $sql_ary = array( 'forum_id' => (int) $row['forum_id'], 'forum_name' => htmlspecialchars(phpbb_set_default_encoding($row['forum_name']), ENT_COMPAT, 'UTF-8'), 'parent_id' => (int) $cats_added[$row['cat_id']], 'forum_parents' => '', 'forum_desc' => htmlspecialchars(phpbb_set_default_encoding($row['forum_desc']), ENT_COMPAT, 'UTF-8'), 'forum_type' => FORUM_POST, 'forum_status' => is_item_locked($row['forum_status']), 'enable_prune' => ($prune_enabled) ? (int) $row['prune_enable'] : 0, 'prune_next' => (int) null_to_zero($row['prune_next']), 'prune_days' => (int) null_to_zero($row['prune_days']), 'prune_viewed' => 0, 'prune_freq' => (int) null_to_zero($row['prune_freq']), 'forum_flags' => phpbb_forum_flags(), 'forum_options' => 0, // Default values 'forum_desc_bitfield' => '', 'forum_desc_options' => 7, 'forum_desc_uid' => '', 'forum_link' => '', 'forum_password' => '', 'forum_style' => 0, 'forum_image' => '', 'forum_rules' => '', 'forum_rules_link' => '', 'forum_rules_bitfield' => '', 'forum_rules_options' => 7, 'forum_rules_uid' => '', 'forum_topics_per_page' => 0, 'forum_posts_approved' => 0, 'forum_posts_unapproved' => 0, 'forum_posts_softdeleted' => 0, 'forum_topics_approved' => 0, 'forum_topics_unapproved' => 0, 'forum_topics_softdeleted' => 0, 'forum_last_post_id' => 0, 'forum_last_poster_id' => 0, 'forum_last_post_subject' => '', 'forum_last_post_time' => 0, 'forum_last_poster_name' => '', 'forum_last_poster_colour' => '', 'display_on_index' => 1, 'enable_indexing' => 1, 'enable_icons' => 0, ); // Now add the forums with proper left/right ids $sql = 'SELECT left_id, right_id FROM ' . FORUMS_TABLE . ' WHERE forum_id = ' . $cats_added[$row['cat_id']]; $_result = $db->sql_query($sql); $cat_row = $db->sql_fetchrow($_result); $db->sql_freeresult($_result); $sql = 'UPDATE ' . FORUMS_TABLE . ' SET left_id = left_id + 2, right_id = right_id + 2 WHERE left_id > ' . $cat_row['right_id']; $db->sql_query($sql); $sql = 'UPDATE ' . FORUMS_TABLE . ' SET right_id = right_id + 2 WHERE ' . $cat_row['left_id'] . ' BETWEEN left_id AND right_id'; $db->sql_query($sql); $sql_ary['left_id'] = (int) $cat_row['right_id']; $sql_ary['right_id'] = (int) ($cat_row['right_id'] + 1); $sql = 'INSERT INTO ' . FORUMS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_ary); $db->sql_query($sql); } $src_db->sql_freeresult($result); switch ($db->get_sql_layer()) { case 'postgres': $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 . '));'); break; case 'mssql': case 'mssql_odbc': case 'mssqlnative': $db->sql_query('SET IDENTITY_INSERT ' . FORUMS_TABLE . ' OFF'); break; case 'oracle': $result = $db->sql_query('SELECT MAX(forum_id) as max_id FROM ' . FORUMS_TABLE); $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); $largest_id = (int) $row['max_id']; if ($largest_id) { $db->sql_query('DROP SEQUENCE ' . FORUMS_TABLE . '_seq'); $db->sql_query('CREATE SEQUENCE ' . FORUMS_TABLE . '_seq START WITH ' . ($largest_id + 1)); } break; } } /** * Function for recoding text with the default language * * @param string $text text to recode to utf8 * @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 */ function phpbb_set_encoding($text, $grab_user_lang = true) { global $lang_enc_array, $convert_row; global $convert, $phpEx; /*static $lang_enc_array = array( 'korean' => 'euc-kr', 'serbian' => 'windows-1250', 'polish' => 'iso-8859-2', 'kurdish' => 'windows-1254', 'slovak' => 'Windows-1250', 'russian' => 'windows-1251', 'estonian' => 'iso-8859-4', 'chinese_simplified' => 'gb2312', 'macedonian' => 'windows-1251', 'azerbaijani' => 'UTF-8', 'romanian' => 'iso-8859-2', 'romanian_diacritice' => 'iso-8859-2', 'lithuanian' => 'windows-1257', 'turkish' => 'iso-8859-9', 'ukrainian' => 'windows-1251', 'japanese' => 'shift_jis', 'hungarian' => 'ISO-8859-2', 'romanian_no_diacritics' => 'iso-8859-2', 'mongolian' => 'UTF-8', 'slovenian' => 'windows-1250', 'bosnian' => 'windows-1250', 'czech' => 'Windows-1250', 'farsi' => 'Windows-1256', 'croatian' => 'windows-1250', 'greek' => 'iso-8859-7', 'russian_tu' => 'windows-1251', 'sakha' => 'UTF-8', 'serbian_cyrillic' => 'windows-1251', 'bulgarian' => 'windows-1251', 'chinese_traditional_taiwan' => 'big5', 'chinese_traditional' => 'big5', 'arabic' => 'windows-1256', 'hebrew' => 'WINDOWS-1255', 'thai' => 'windows-874', //'chinese_traditional_taiwan' => 'utf-8' // custom modified, we may have to do an include :-( );*/ if (empty($lang_enc_array)) { $lang_enc_array = array(); } $get_lang = trim(get_config_value('default_lang')); // Do we need the users language encoding? if ($grab_user_lang && !empty($convert_row)) { if (!empty($convert_row['user_lang'])) { $get_lang = trim($convert_row['user_lang']); } else if (!empty($convert_row['poster_id'])) { global $src_db, $same_db; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $sql = 'SELECT user_lang FROM ' . $convert->src_table_prefix . 'users WHERE user_id = ' . (int) $convert_row['poster_id']; $result = $src_db->sql_query($sql); $get_lang = (string) $src_db->sql_fetchfield('user_lang'); $src_db->sql_freeresult($result); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } $get_lang = (!trim($get_lang)) ? trim(get_config_value('default_lang')) : trim($get_lang); } } if (!isset($lang_enc_array[$get_lang])) { $filename = $convert->options['forum_path'] . '/language/lang_' . $get_lang . '/lang_main.' . $phpEx; if (!file_exists($filename)) { $get_lang = trim(get_config_value('default_lang')); } if (!isset($lang_enc_array[$get_lang])) { include($convert->options['forum_path'] . '/language/lang_' . $get_lang . '/lang_main.' . $phpEx); $lang_enc_array[$get_lang] = $lang['ENCODING']; unset($lang); } } $encoding = $lang_enc_array[$get_lang]; return utf8_recode($text, $lang_enc_array[$get_lang]); } /** * Same as phpbb_set_encoding, but forcing boards default language */ function phpbb_set_default_encoding($text) { return phpbb_set_encoding($text, false); } /** * Convert Birthday from Birthday MOD to phpBB Format */ function phpbb_get_birthday($birthday = '') { if (defined('MOD_BIRTHDAY_TERRA')) { $birthday = (string) $birthday; // stored as month, day, year if (!$birthday) { return ' 0- 0- 0'; } // We use the original mod code to retrieve the birthday (not ideal) preg_match('/(..)(..)(....)/', sprintf('%08d', $birthday), $birthday_parts); $month = $birthday_parts[1]; $day = $birthday_parts[2]; $year = $birthday_parts[3]; return sprintf('%2d-%2d-%4d', $day, $month, $year); } else { $birthday = (int) $birthday; if (!$birthday || $birthday == 999999) { return ' 0- 0- 0'; } // The birthday mod from niels is using this code to transform to day/month/year return sprintf('%2d-%2d-%4d', gmdate('j', $birthday * 86400 + 1), gmdate('n', $birthday * 86400 + 1), gmdate('Y', $birthday * 86400 + 1)); } } /** * Return correct user id value * Everyone's id will be one higher to allow the guest/anonymous user to have a positive id as well */ function phpbb_user_id($user_id) { global $config; // Increment user id if the old forum is having a user with the id 1 if (!isset($config['increment_user_id'])) { global $src_db, $same_db, $convert; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } // Now let us set a temporary config variable for user id incrementing $sql = "SELECT user_id FROM {$convert->src_table_prefix}users WHERE user_id = 1"; $result = $src_db->sql_query($sql); $id = (int) $src_db->sql_fetchfield('user_id'); $src_db->sql_freeresult($result); // Try to get the maximum user id possible... $sql = "SELECT MAX(user_id) AS max_user_id FROM {$convert->src_table_prefix}users"; $result = $src_db->sql_query($sql); $max_id = (int) $src_db->sql_fetchfield('max_user_id'); $src_db->sql_freeresult($result); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } // If there is a user id 1, we need to increment user ids. :/ if ($id === 1) { set_config('increment_user_id', ($max_id + 1), true); $config['increment_user_id'] = $max_id + 1; } else { set_config('increment_user_id', 0, true); $config['increment_user_id'] = 0; } } // If the old user id is -1 in 2.0.x it is the anonymous user... if ($user_id == -1) { return ANONYMOUS; } if (!empty($config['increment_user_id']) && $user_id == 1) { return $config['increment_user_id']; } // A user id of 0 can happen, for example within the ban table if no user is banned... // Within the posts and topics table this can be "dangerous" but is the fault of the user // having mods installed (a poster id of 0 is not possible in 2.0.x). // Therefore, we return the user id "as is". return (int) $user_id; } /** * Return correct user id value * Everyone's id will be one higher to allow the guest/anonymous user to have a positive id as well */ function phpbb_topic_replies_to_posts($num_replies) { return (int) $num_replies + 1; } /* Copy additional table fields from old forum to new forum if user wants this (for Mod compatibility for example) function phpbb_copy_table_fields() { } */ /** * Convert authentication * user, group and forum table has to be filled in order to work */ function phpbb_convert_authentication($mode) { global $db, $src_db, $same_db, $convert, $user, $config, $cache; if ($mode == 'start') { $db->sql_query($convert->truncate_statement . ACL_USERS_TABLE); $db->sql_query($convert->truncate_statement . ACL_GROUPS_TABLE); // What we will do is handling all 2.0.x admins as founder to replicate what is common in 2.0.x. // After conversion the main admin need to make sure he is removing permissions and the founder status if wanted. // Grab user ids of users with user_level of ADMIN $sql = "SELECT user_id FROM {$convert->src_table_prefix}users WHERE user_level = 1 ORDER BY user_regdate ASC"; $result = $src_db->sql_query($sql); while ($row = $src_db->sql_fetchrow($result)) { $user_id = (int) phpbb_user_id($row['user_id']); // Set founder admin... $sql = 'UPDATE ' . USERS_TABLE . ' SET user_type = ' . USER_FOUNDER . " WHERE user_id = $user_id"; $db->sql_query($sql); } $src_db->sql_freeresult($result); $sql = 'SELECT group_id FROM ' . GROUPS_TABLE . " WHERE group_name = '" . $db->sql_escape('BOTS') . "'"; $result = $db->sql_query($sql); $bot_group_id = (int) $db->sql_fetchfield('group_id'); $db->sql_freeresult($result); } // Grab forum auth information $sql = "SELECT * FROM {$convert->src_table_prefix}forums"; $result = $src_db->sql_query($sql); $forum_access = array(); while ($row = $src_db->sql_fetchrow($result)) { $forum_access[$row['forum_id']] = $row; } $src_db->sql_freeresult($result); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } // Grab user auth information from 2.0.x board $sql = "SELECT ug.user_id, aa.* 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 WHERE g.group_id = aa.group_id AND g.group_single_user = 1 AND ug.group_id = g.group_id AND f.forum_id = aa.forum_id"; $result = $src_db->sql_query($sql); $user_access = array(); while ($row = $src_db->sql_fetchrow($result)) { $user_access[$row['forum_id']][] = $row; } $src_db->sql_freeresult($result); // Grab group auth information $sql = "SELECT g.group_id, aa.* FROM {$convert->src_table_prefix}auth_access aa, {$convert->src_table_prefix}groups g WHERE g.group_id = aa.group_id AND g.group_single_user <> 1"; $result = $src_db->sql_query($sql); $group_access = array(); while ($row = $src_db->sql_fetchrow($result)) { $group_access[$row['forum_id']][] = $row; } $src_db->sql_freeresult($result); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } // Add Forum Access List $auth_map = array( 'auth_view' => array('f_', 'f_list'), 'auth_read' => array('f_read', 'f_search'), 'auth_post' => array('f_post', 'f_bbcode', 'f_smilies', 'f_img', 'f_sigs', 'f_postcount', 'f_report', 'f_subscribe', 'f_print', 'f_email'), 'auth_reply' => 'f_reply', 'auth_edit' => 'f_edit', 'auth_delete' => 'f_delete', 'auth_pollcreate' => 'f_poll', 'auth_vote' => 'f_vote', 'auth_announce' => 'f_announce', 'auth_sticky' => 'f_sticky', 'auth_attachments' => array('f_attach', 'f_download'), 'auth_download' => 'f_download', ); // Define the ACL constants used in 2.0 to make the code slightly more readable define('AUTH_ALL', 0); define('AUTH_REG', 1); define('AUTH_ACL', 2); define('AUTH_MOD', 3); define('AUTH_ADMIN', 5); // A mapping of the simple permissions used by 2.0 $simple_auth_ary = array( 'public' => array( 'auth_view' => AUTH_ALL, 'auth_read' => AUTH_ALL, 'auth_post' => AUTH_ALL, 'auth_reply' => AUTH_ALL, 'auth_edit' => AUTH_REG, 'auth_delete' => AUTH_REG, 'auth_sticky' => AUTH_MOD, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_REG, 'auth_pollcreate' => AUTH_REG, ), 'registered' => array( 'auth_view' => AUTH_ALL, 'auth_read' => AUTH_ALL, 'auth_post' => AUTH_REG, 'auth_reply' => AUTH_REG, 'auth_edit' => AUTH_REG, 'auth_delete' => AUTH_REG, 'auth_sticky' => AUTH_MOD, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_REG, 'auth_pollcreate' => AUTH_REG, ), 'registered_hidden' => array( 'auth_view' => AUTH_REG, 'auth_read' => AUTH_REG, 'auth_post' => AUTH_REG, 'auth_reply' => AUTH_REG, 'auth_edit' => AUTH_REG, 'auth_delete' => AUTH_REG, 'auth_sticky' => AUTH_MOD, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_REG, 'auth_pollcreate' => AUTH_REG, ), 'private' => array( 'auth_view' => AUTH_ALL, 'auth_read' => AUTH_ACL, 'auth_post' => AUTH_ACL, 'auth_reply' => AUTH_ACL, 'auth_edit' => AUTH_ACL, 'auth_delete' => AUTH_ACL, 'auth_sticky' => AUTH_ACL, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_ACL, 'auth_pollcreate' => AUTH_ACL, ), 'private_hidden' => array( 'auth_view' => AUTH_ACL, 'auth_read' => AUTH_ACL, 'auth_post' => AUTH_ACL, 'auth_reply' => AUTH_ACL, 'auth_edit' => AUTH_ACL, 'auth_delete' => AUTH_ACL, 'auth_sticky' => AUTH_ACL, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_ACL, 'auth_pollcreate' => AUTH_ACL, ), 'moderator' => array( 'auth_view' => AUTH_ALL, 'auth_read' => AUTH_MOD, 'auth_post' => AUTH_MOD, 'auth_reply' => AUTH_MOD, 'auth_edit' => AUTH_MOD, 'auth_delete' => AUTH_MOD, 'auth_sticky' => AUTH_MOD, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_MOD, 'auth_pollcreate' => AUTH_MOD, ), 'moderator_hidden' => array( 'auth_view' => AUTH_MOD, 'auth_read' => AUTH_MOD, 'auth_post' => AUTH_MOD, 'auth_reply' => AUTH_MOD, 'auth_edit' => AUTH_MOD, 'auth_delete' => AUTH_MOD, 'auth_sticky' => AUTH_MOD, 'auth_announce' => AUTH_MOD, 'auth_vote' => AUTH_MOD, 'auth_pollcreate' => AUTH_MOD, ), ); if ($mode == 'start') { user_group_auth('guests', 'SELECT user_id, {GUESTS} FROM ' . USERS_TABLE . ' WHERE user_id = ' . ANONYMOUS, false); user_group_auth('registered', 'SELECT user_id, {REGISTERED} FROM ' . USERS_TABLE . ' WHERE user_id <> ' . ANONYMOUS . " AND group_id <> $bot_group_id", false); // Selecting from old table if (!empty($config['increment_user_id'])) { $auth_sql = 'SELECT user_id, {ADMINISTRATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id <> 1'; user_group_auth('administrators', $auth_sql, true); $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'; user_group_auth('administrators', $auth_sql, true); } else { $auth_sql = 'SELECT user_id, {ADMINISTRATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1'; user_group_auth('administrators', $auth_sql, true); } if (!empty($config['increment_user_id'])) { $auth_sql = 'SELECT user_id, {GLOBAL_MODERATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1 AND user_id <> 1'; user_group_auth('global_moderators', $auth_sql, true); $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'; user_group_auth('global_moderators', $auth_sql, true); } else { $auth_sql = 'SELECT user_id, {GLOBAL_MODERATORS} FROM ' . $convert->src_table_prefix . 'users WHERE user_level = 1'; user_group_auth('global_moderators', $auth_sql, true); } } else if ($mode == 'first') { // Go through all 2.0.x forums foreach ($forum_access as $forum) { $new_forum_id = (int) $forum['forum_id']; // Administrators have full access to all forums whatever happens mass_auth('group_role', $new_forum_id, 'administrators', 'FORUM_FULL'); $matched_type = ''; foreach ($simple_auth_ary as $key => $auth_levels) { $matched = 1; foreach ($auth_levels as $k => $level) { if ($forum[$k] != $auth_levels[$k]) { $matched = 0; } } if ($matched) { $matched_type = $key; break; } } switch ($matched_type) { case 'public': mass_auth('group_role', $new_forum_id, 'guests', 'FORUM_LIMITED'); mass_auth('group_role', $new_forum_id, 'registered', 'FORUM_LIMITED_POLLS'); mass_auth('group_role', $new_forum_id, 'bots', 'FORUM_BOT'); break; case 'registered': mass_auth('group_role', $new_forum_id, 'guests', 'FORUM_READONLY'); mass_auth('group_role', $new_forum_id, 'bots', 'FORUM_BOT'); // no break; case 'registered_hidden': mass_auth('group_role', $new_forum_id, 'registered', 'FORUM_POLLS'); break; case 'private': case 'private_hidden': case 'moderator': case 'moderator_hidden': default: // The permissions don't match a simple set, so we're going to have to map them directly // No post approval for all, in 2.0.x this feature does not exist mass_auth('group', $new_forum_id, 'guests', 'f_noapprove', ACL_YES); mass_auth('group', $new_forum_id, 'registered', 'f_noapprove', ACL_YES); // Go through authentication map foreach ($auth_map as $old_auth_key => $new_acl) { // If old authentication key does not exist we continue // This is helpful for mods adding additional authentication fields, we need to add them to the auth_map array if (!isset($forum[$old_auth_key])) { continue; } // Now set the new ACL correctly switch ($forum[$old_auth_key]) { // AUTH_ALL case AUTH_ALL: mass_auth('group', $new_forum_id, 'guests', $new_acl, ACL_YES); mass_auth('group', $new_forum_id, 'bots', $new_acl, ACL_YES); mass_auth('group', $new_forum_id, 'registered', $new_acl, ACL_YES); break; // AUTH_REG case AUTH_REG: mass_auth('group', $new_forum_id, 'registered', $new_acl, ACL_YES); break; // AUTH_ACL case AUTH_ACL: // Go through the old group access list for this forum if (isset($group_access[$forum['forum_id']])) { foreach ($group_access[$forum['forum_id']] as $index => $access) { // We only check for ACL_YES equivalence entry if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1) { mass_auth('group', $new_forum_id, (int) $access['group_id'], $new_acl, ACL_YES); } } } if (isset($user_access[$forum['forum_id']])) { foreach ($user_access[$forum['forum_id']] as $index => $access) { // We only check for ACL_YES equivalence entry if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1) { mass_auth('user', $new_forum_id, (int) phpbb_user_id($access['user_id']), $new_acl, ACL_YES); } } } break; // AUTH_MOD case AUTH_MOD: if (isset($group_access[$forum['forum_id']])) { foreach ($group_access[$forum['forum_id']] as $index => $access) { // We only check for ACL_YES equivalence entry if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1) { mass_auth('group', $new_forum_id, (int) $access['group_id'], $new_acl, ACL_YES); } } } if (isset($user_access[$forum['forum_id']])) { foreach ($user_access[$forum['forum_id']] as $index => $access) { // We only check for ACL_YES equivalence entry if (isset($access[$old_auth_key]) && $access[$old_auth_key] == 1) { mass_auth('user', $new_forum_id, (int) phpbb_user_id($access['user_id']), $new_acl, ACL_YES); } } } break; } } break; } } } else if ($mode == 'second') { // Assign permission roles and other default permissions // guests having u_download and u_search ability $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')"); // administrators/global mods having full user features mass_auth('group_role', 0, 'administrators', 'USER_FULL'); mass_auth('group_role', 0, 'global_moderators', 'USER_FULL'); // By default all converted administrators are given full access mass_auth('group_role', 0, 'administrators', 'ADMIN_FULL'); // All registered users are assigned the standard user role mass_auth('group_role', 0, 'registered', 'USER_STANDARD'); mass_auth('group_role', 0, 'registered_coppa', 'USER_STANDARD'); // Instead of administrators being global moderators we give the MOD_FULL role to global mods (admins already assigned to this group) mass_auth('group_role', 0, 'global_moderators', 'MOD_FULL'); // And now those who have had their avatar rights removed get assigned a more restrictive role $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users WHERE user_allowavatar = 0 AND user_id > 0'; $result = $src_db->sql_query($sql); while ($row = $src_db->sql_fetchrow($result)) { mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOAVATAR'); } $src_db->sql_freeresult($result); // And the same for those who have had their PM rights removed $sql = 'SELECT user_id FROM ' . $convert->src_table_prefix . 'users WHERE user_allow_pm = 0 AND user_id > 0'; $result = $src_db->sql_query($sql); while ($row = $src_db->sql_fetchrow($result)) { mass_auth('user_role', 0, (int) phpbb_user_id($row['user_id']), 'USER_NOPM'); } $src_db->sql_freeresult($result); } else if ($mode == 'third') { // And now the moderators // We make sure that they have at least standard access to the forums they moderate in addition to the moderating permissions $mod_post_map = array( 'auth_announce' => 'f_announce', 'auth_sticky' => 'f_sticky' ); foreach ($user_access as $forum_id => $access_map) { $forum_id = (int) $forum_id; foreach ($access_map as $access) { if (isset($access['auth_mod']) && $access['auth_mod'] == 1) { mass_auth('user_role', $forum_id, (int) phpbb_user_id($access['user_id']), 'MOD_STANDARD'); mass_auth('user_role', $forum_id, (int) phpbb_user_id($access['user_id']), 'FORUM_STANDARD'); foreach ($mod_post_map as $old => $new) { if (isset($forum_access[$forum_id]) && isset($forum_access[$forum_id][$old]) && $forum_access[$forum_id][$old] == AUTH_MOD) { mass_auth('user', $forum_id, (int) phpbb_user_id($access['user_id']), $new, ACL_YES); } } } } } foreach ($group_access as $forum_id => $access_map) { $forum_id = (int) $forum_id; foreach ($access_map as $access) { if (isset($access['auth_mod']) && $access['auth_mod'] == 1) { mass_auth('group_role', $forum_id, (int) $access['group_id'], 'MOD_STANDARD'); mass_auth('group_role', $forum_id, (int) $access['group_id'], 'FORUM_STANDARD'); foreach ($mod_post_map as $old => $new) { if (isset($forum_access[$forum_id]) && isset($forum_access[$forum_id][$old]) && $forum_access[$forum_id][$old] == AUTH_MOD) { mass_auth('group', $forum_id, (int) $access['group_id'], $new, ACL_YES); } } } } } // We grant everyone readonly access to the categories to ensure that the forums are visible $sql = 'SELECT forum_id, forum_name, parent_id, left_id, right_id FROM ' . FORUMS_TABLE . ' ORDER BY left_id ASC'; $result = $db->sql_query($sql); $parent_forums = $forums = array(); while ($row = $db->sql_fetchrow($result)) { if ($row['parent_id'] == 0) { mass_auth('group_role', $row['forum_id'], 'administrators', 'FORUM_FULL'); mass_auth('group_role', $row['forum_id'], 'global_moderators', 'FORUM_FULL'); $parent_forums[] = $row; } else { $forums[] = $row; } } $db->sql_freeresult($result); global $auth; // Let us see which groups have access to these forums... foreach ($parent_forums as $row) { // Get the children $branch = $forum_ids = array(); foreach ($forums as $key => $_row) { if ($_row['left_id'] > $row['left_id'] && $_row['left_id'] < $row['right_id']) { $branch[] = $_row; $forum_ids[] = $_row['forum_id']; continue; } } if (sizeof($forum_ids)) { // Now make sure the user is able to read these forums $hold_ary = $auth->acl_group_raw_data(false, 'f_list', $forum_ids); if (empty($hold_ary)) { continue; } foreach ($hold_ary as $g_id => $f_id_ary) { $set_group = false; foreach ($f_id_ary as $f_id => $auth_ary) { foreach ($auth_ary as $auth_option => $setting) { if ($setting == ACL_YES) { $set_group = true; break 2; } } } if ($set_group) { mass_auth('group', $row['forum_id'], $g_id, 'f_list', ACL_YES); } } } } } } /** * Set primary group. * Really simple and only based on user_level (remaining groups will be assigned later) */ function phpbb_set_primary_group($user_level) { global $convert_row; if ($user_level == 1) { return get_group_id('administrators'); } /* else if ($user_level == 2) { return get_group_id('global_moderators'); } else if ($user_level == 0 && $convert_row['user_active'])*/ else if ($convert_row['user_active']) { return get_group_id('registered'); } return 0; } /** * Convert the group name, making sure to avoid conflicts with 3.0 special groups */ function phpbb_convert_group_name($group_name) { $default_groups = array( 'GUESTS', 'REGISTERED', 'REGISTERED_COPPA', 'GLOBAL_MODERATORS', 'ADMINISTRATORS', 'BOTS', ); if (in_array(strtoupper($group_name), $default_groups)) { return 'phpBB2 - ' . $group_name; } return phpbb_set_default_encoding($group_name); } /** * Convert the group type constants */ function phpbb_convert_group_type($group_type) { switch ($group_type) { case 0: return GROUP_OPEN; break; case 1: return GROUP_CLOSED; break; case 2: return GROUP_HIDDEN; break; } // Never return GROUP_SPECIAL here, because only phpBB3's default groups are allowed to have this type set. return GROUP_HIDDEN; } /** * Convert the topic type constants */ function phpbb_convert_topic_type($topic_type) { switch ($topic_type) { case 0: return POST_NORMAL; break; case 1: return POST_STICKY; break; case 2: return POST_ANNOUNCE; break; case 3: return POST_GLOBAL; break; } return POST_NORMAL; } function phpbb_replace_size($matches) { return '[size=' . min(200, ceil(100.0 * (((double) $matches[1])/12.0))) . ':' . $matches[2] . ']'; } /** * Reparse the message stripping out the bbcode_uid values and adding new ones and setting the bitfield * @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 */ function phpbb_prepare_message($message) { global $phpbb_root_path, $phpEx, $db, $convert, $user, $config, $cache, $convert_row, $message_parser; if (!$message) { $convert->row['mp_bbcode_bitfield'] = $convert_row['mp_bbcode_bitfield'] = 0; return ''; } // Decode phpBB 2.0.x Message if (isset($convert->row['old_bbcode_uid']) && $convert->row['old_bbcode_uid'] != '') { // Adjust size... if (strpos($message, '[size=') !== false) { $message = preg_replace_callback('/\[size=(\d*):(' . $convert->row['old_bbcode_uid'] . ')\]/', 'phpbb_replace_size', $message); } $message = preg_replace('/\:(([a-z0-9]:)?)' . $convert->row['old_bbcode_uid'] . '/s', '', $message); } if (strpos($message, '[quote=') !== false) { $message = preg_replace('/\[quote="(.*?)"\]/s', '[quote="\1"]', $message); $message = preg_replace('/\[quote=\\\"(.*?)\\\"\]/s', '[quote="\1"]', $message); // let's hope that this solves more problems than it causes. Deal with escaped quotes. $message = str_replace('\"', '"', $message); $message = str_replace('\"', '"', $message); } // Already the new user id ;) $user_id = $convert->row['poster_id']; $message = str_replace('
', "\n", $message); $message = str_replace('<', '<', $message); $message = str_replace('>', '>', $message); // make the post UTF-8 $message = phpbb_set_encoding($message); $message_parser->warn_msg = array(); // Reset the errors from the previous message $message_parser->bbcode_uid = make_uid($convert->row['post_time']); $message_parser->message = $message; unset($message); // Make sure options are set. // $enable_html = (!isset($row['enable_html'])) ? false : $row['enable_html']; $enable_bbcode = (!isset($convert->row['enable_bbcode'])) ? true : $convert->row['enable_bbcode']; $enable_smilies = (!isset($convert->row['enable_smilies'])) ? true : $convert->row['enable_smilies']; $enable_magic_url = (!isset($convert->row['enable_magic_url'])) ? true : $convert->row['enable_magic_url']; // 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') $message_parser->parse($enable_bbcode, $enable_magic_url, $enable_smilies); if (sizeof($message_parser->warn_msg)) { $msg_id = isset($convert->row['post_id']) ? $convert->row['post_id'] : $convert->row['privmsgs_id']; $convert->p_master->error('' . $user->lang['POST_ID'] . ': ' . $msg_id . ' ' . $user->lang['CONV_ERROR_MESSAGE_PARSER'] . ':

' . implode('
', $message_parser->warn_msg), __LINE__, __FILE__, true); } $convert->row['mp_bbcode_bitfield'] = $convert_row['mp_bbcode_bitfield'] = $message_parser->bbcode_bitfield; $message = $message_parser->message; unset($message_parser->message); return $message; } /** * Return the bitfield calculated by the previous function */ function get_bbcode_bitfield() { global $convert_row; return $convert_row['mp_bbcode_bitfield']; } /** * Determine the last user to edit a post * 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 */ function phpbb_post_edit_user() { global $convert_row, $config; if (isset($convert_row['post_edit_count'])) { return phpbb_user_id($convert_row['poster_id']); } return 0; } /** * Obtain the path to uploaded files on the 2.0.x forum * This is only used if the Attachment MOD was installed */ function phpbb_get_files_dir() { if (!defined('MOD_ATTACHMENT')) { return; } global $src_db, $same_db, $convert, $user, $config, $cache; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $sql = 'SELECT config_value AS upload_dir FROM ' . $convert->src_table_prefix . "attachments_config WHERE config_name = 'upload_dir'"; $result = $src_db->sql_query($sql); $upload_path = $src_db->sql_fetchfield('upload_dir'); $src_db->sql_freeresult($result); $sql = 'SELECT config_value AS ftp_upload FROM ' . $convert->src_table_prefix . "attachments_config WHERE config_name = 'allow_ftp_upload'"; $result = $src_db->sql_query($sql); $ftp_upload = (int) $src_db->sql_fetchfield('ftp_upload'); $src_db->sql_freeresult($result); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } if ($ftp_upload) { $convert->p_master->error($user->lang['CONV_ERROR_ATTACH_FTP_DIR'], __LINE__, __FILE__); } return $upload_path; } /** * Copy thumbnails of uploaded images from the 2.0.x forum * This is only used if the Attachment MOD was installed */ function phpbb_copy_thumbnails() { global $db, $convert, $user, $config, $cache, $phpbb_root_path; $src_path = $convert->options['forum_path'] . '/' . phpbb_get_files_dir() . '/thumbs/'; if ($handle = @opendir($src_path)) { while ($entry = readdir($handle)) { if ($entry[0] == '.') { continue; } if (is_dir($src_path . $entry)) { continue; } else { copy_file($src_path . $entry, $config['upload_path'] . '/' . preg_replace('/^t_/', 'thumb_', $entry)); @unlink($phpbb_root_path . $config['upload_path'] . '/thumbs/' . $entry); } } closedir($handle); } } /** * Convert the attachment category constants * This is only used if the Attachment MOD was installed */ function phpbb_attachment_category($cat_id) { switch ($cat_id) { case 1: return ATTACHMENT_CATEGORY_IMAGE; break; case 2: return ATTACHMENT_CATEGORY_WM; break; case 3: return ATTACHMENT_CATEGORY_FLASH; break; } return ATTACHMENT_CATEGORY_NONE; } /** * Convert the attachment extension names * This is only used if the Attachment MOD was installed */ function phpbb_attachment_extension_group_name() { global $db, $phpbb_root_path, $phpEx; // Update file extension group names to use language strings. $sql = 'SELECT lang_dir FROM ' . LANG_TABLE; $result = $db->sql_query($sql); $extension_groups_updated = array(); while ($lang_dir = $db->sql_fetchfield('lang_dir')) { $lang_dir = basename($lang_dir); $lang_file = $phpbb_root_path . 'language/' . $lang_dir . '/acp/attachments.' . $phpEx; if (!file_exists($lang_file)) { continue; } $lang = array(); include($lang_file); foreach ($lang as $lang_key => $lang_val) { if (isset($extension_groups_updated[$lang_key]) || strpos($lang_key, 'EXT_GROUP_') !== 0) { continue; } $sql_ary = array( 'group_name' => substr($lang_key, 10), // Strip off 'EXT_GROUP_' ); $sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE group_name = '" . $db->sql_escape($lang_val) . "'"; $db->sql_query($sql); $extension_groups_updated[$lang_key] = true; } } $db->sql_freeresult($result); } /** * Obtain list of forums in which different attachment categories can be used */ function phpbb_attachment_forum_perms($forum_permissions) { if (empty($forum_permissions)) { return ''; } // Decode forum permissions $forum_ids = array(); $one_char_encoding = '#'; $two_char_encoding = '.'; $auth_len = 1; for ($pos = 0; $pos < strlen($forum_permissions); $pos += $auth_len) { $forum_auth = substr($forum_permissions, $pos, 1); if ($forum_auth == $one_char_encoding) { $auth_len = 1; continue; } else if ($forum_auth == $two_char_encoding) { $auth_len = 2; $pos--; continue; } $forum_auth = substr($forum_permissions, $pos, $auth_len); $forum_id = base64_unpack($forum_auth); $forum_ids[] = (int) $forum_id; } if (sizeof($forum_ids)) { return attachment_forum_perms($forum_ids); } return ''; } /** * Convert the avatar type constants */ function phpbb_avatar_type($type) { switch ($type) { case 1: return AVATAR_UPLOAD; break; case 2: return AVATAR_REMOTE; break; case 3: return AVATAR_GALLERY; break; } return 0; } /** * Just undos the replacing of '<' and '>' */ function phpbb_smilie_html_decode($code) { $code = str_replace('<', '<', $code); return str_replace('>', '>', $code); } /** * Transfer avatars, copying the image if it was uploaded */ function phpbb_import_avatar($user_avatar) { global $convert_row; if (!$convert_row['user_avatar_type']) { return ''; } else if ($convert_row['user_avatar_type'] == 1) { // Uploaded avatar return import_avatar($user_avatar, false, $convert_row['user_id']); } else if ($convert_row['user_avatar_type'] == 2) { // Remote avatar return $user_avatar; } else if ($convert_row['user_avatar_type'] == 3) { // Gallery avatar return $user_avatar; } return ''; } /** * Find out about the avatar's dimensions */ function phpbb_get_avatar_height($user_avatar) { global $convert_row; if (empty($convert_row['user_avatar_type'])) { return 0; } return get_avatar_height($user_avatar, 'phpbb_avatar_type', $convert_row['user_avatar_type']); } /** * Find out about the avatar's dimensions */ function phpbb_get_avatar_width($user_avatar) { global $convert_row; if (empty($convert_row['user_avatar_type'])) { return 0; } return get_avatar_width($user_avatar, 'phpbb_avatar_type', $convert_row['user_avatar_type']); } /** * Calculate the correct to_address field for private messages */ function phpbb_privmsgs_to_userid($to_userid) { global $config; return 'u_' . phpbb_user_id($to_userid); } /** * Calculate whether a private message was unread using the bitfield */ function phpbb_unread_pm($pm_type) { return ($pm_type == 5) ? 1 : 0; } /** * Calculate whether a private message was new using the bitfield */ function phpbb_new_pm($pm_type) { return ($pm_type == 1) ? 1 : 0; } /** * Obtain the folder_id for the custom folder created to replace the savebox from 2.0.x (used to store saved private messages) */ function phpbb_get_savebox_id($user_id) { global $db; $user_id = phpbb_user_id($user_id); // Only one custom folder, check only one $sql = 'SELECT folder_id FROM ' . PRIVMSGS_FOLDER_TABLE . ' WHERE user_id = ' . $user_id; $result = $db->sql_query_limit($sql, 1); $folder_id = (int) $db->sql_fetchfield('folder_id'); $db->sql_freeresult($result); return $folder_id; } /** * Transfer attachment specific configuration options * These were not stored in the main config table on 2.0.x * This is only used if the Attachment MOD was installed */ function phpbb_import_attach_config() { global $db, $src_db, $same_db, $convert, $config; if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'binary'"); } $sql = 'SELECT * FROM ' . $convert->src_table_prefix . 'attachments_config'; $result = $src_db->sql_query($sql); if ($convert->mysql_convert && $same_db) { $src_db->sql_query("SET NAMES 'utf8'"); } $attach_config = array(); while ($row = $src_db->sql_fetchrow($result)) { $attach_config[$row['config_name']] = $row['config_value']; } $src_db->sql_freeresult($result); set_config('allow_attachments', 1); // old attachment mod? Must be very old if this entry do not exist... if (!empty($attach_config['display_order'])) { set_config('display_order', $attach_config['display_order']); } set_config('max_filesize', $attach_config['max_filesize']); set_config('max_filesize_pm', $attach_config['max_filesize_pm']); set_config('attachment_quota', $attach_config['attachment_quota']); set_config('max_attachments', $attach_config['max_attachments']); set_config('max_attachments_pm', $attach_config['max_attachments_pm']); set_config('allow_pm_attach', $attach_config['allow_pm_attach']); set_config('img_display_inlined', $attach_config['img_display_inlined']); set_config('img_max_width', $attach_config['img_max_width']); set_config('img_max_height', $attach_config['img_max_height']); set_config('img_link_width', $attach_config['img_link_width']); set_config('img_link_height', $attach_config['img_link_height']); set_config('img_create_thumbnail', $attach_config['img_create_thumbnail']); set_config('img_max_thumb_width', 400); set_config('img_min_thumb_filesize', $attach_config['img_min_thumb_filesize']); set_config('img_imagick', $attach_config['img_imagick']); } /** * Calculate the date a user became inactive */ function phpbb_inactive_time() { global $convert_row; if ($convert_row['user_active']) { return 0; } if ($convert_row['user_lastvisit']) { return $convert_row['user_lastvisit']; } return $convert_row['user_regdate']; } /** * Calculate the reason a user became inactive * We can't actually tell the difference between a manual deactivation and one for profile changes * from the data available to assume the latter */ function phpbb_inactive_reason() { global $convert_row; if ($convert_row['user_active']) { return 0; } if ($convert_row['user_lastvisit']) { return INACTIVE_PROFILE; } return INACTIVE_REGISTER; } /** * Adjust 2.0.x disallowed names to 3.0.x format */ function phpbb_disallowed_username($username) { // Replace * with % $username = phpbb_set_default_encoding(str_replace('*', '%', $username)); return utf8_htmlspecialchars($username); } /** * Checks whether there are any usernames on the old board that would map to the same * username_clean on phpBB3. Prints out a list if any exist and exits. */ function phpbb_create_userconv_table() { global $db, $src_db, $convert, $table_prefix, $user, $lang; $map_dbms = ''; switch ($db->get_sql_layer()) { case 'mysql': $map_dbms = 'mysql_40'; break; case 'mysql4': if (version_compare($db->sql_server_info(true), '4.1.3', '>=')) { $map_dbms = 'mysql_41'; } else { $map_dbms = 'mysql_40'; } break; case 'mysqli': $map_dbms = 'mysql_41'; break; case 'mssql': case 'mssql_odbc': case 'mssqlnative': $map_dbms = 'mssql'; break; default: $map_dbms = $db->get_sql_layer(); break; } // create a temporary table in which we store the clean usernames $drop_sql = 'DROP TABLE ' . USERCONV_TABLE; switch ($map_dbms) { case 'mssql': $create_sql = 'CREATE TABLE [' . USERCONV_TABLE . '] ( [user_id] [int] NOT NULL , [username_clean] [varchar] (255) DEFAULT (\'\') NOT NULL )'; break; case 'mysql_40': $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( user_id mediumint(8) NOT NULL, username_clean blob NOT NULL )'; break; case 'mysql_41': $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( user_id mediumint(8) NOT NULL, username_clean varchar(255) DEFAULT \'\' NOT NULL ) CHARACTER SET `utf8` COLLATE `utf8_bin`'; break; case 'oracle': $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( user_id number(8) NOT NULL, username_clean varchar2(255) DEFAULT \'\' )'; break; case 'postgres': $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( user_id INT4 DEFAULT \'0\', username_clean varchar_ci DEFAULT \'\' NOT NULL )'; break; case 'sqlite': case 'sqlite3': $create_sql = 'CREATE TABLE ' . USERCONV_TABLE . ' ( user_id INTEGER NOT NULL DEFAULT \'0\', username_clean varchar(255) NOT NULL DEFAULT \'\' )'; break; } $db->sql_return_on_error(true); $db->sql_query($drop_sql); $db->sql_return_on_error(false); $db->sql_query($create_sql); } function phpbb_check_username_collisions() { global $db, $src_db, $convert, $table_prefix, $user, $lang; // now find the clean version of the usernames that collide $sql = 'SELECT username_clean FROM ' . USERCONV_TABLE .' GROUP BY username_clean HAVING COUNT(user_id) > 1'; $result = $db->sql_query($sql); $colliding_names = array(); while ($row = $db->sql_fetchrow($result)) { $colliding_names[] = $row['username_clean']; } $db->sql_freeresult($result); // there was at least one collision, the admin will have to solve it before conversion can continue if (sizeof($colliding_names)) { $sql = 'SELECT user_id, username_clean FROM ' . USERCONV_TABLE . ' WHERE ' . $db->sql_in_set('username_clean', $colliding_names); $result = $db->sql_query($sql); unset($colliding_names); $colliding_user_ids = array(); while ($row = $db->sql_fetchrow($result)) { $colliding_user_ids[(int) $row['user_id']] = $row['username_clean']; } $db->sql_freeresult($result); $sql = 'SELECT username, user_id, user_posts FROM ' . $convert->src_table_prefix . 'users WHERE ' . $src_db->sql_in_set('user_id', array_keys($colliding_user_ids)); $result = $src_db->sql_query($sql); $colliding_users = array(); while ($row = $src_db->sql_fetchrow($result)) { $row['user_id'] = (int) $row['user_id']; if (isset($colliding_user_ids[$row['user_id']])) { $colliding_users[$colliding_user_ids[$row['user_id']]][] = $row; } } $src_db->sql_freeresult($result); unset($colliding_user_ids); $list = ''; foreach ($colliding_users as $username_clean => $users) { $list .= sprintf($user->lang['COLLIDING_CLEAN_USERNAME'], $username_clean) . "
\n"; foreach ($users as $i => $row) { $list .= sprintf($user->lang['COLLIDING_USER'], $row['user_id'], phpbb_set_default_encoding($row['username']), $row['user_posts']) . "
\n"; } } $lang['INST_ERR_FATAL'] = $user->lang['CONV_ERR_FATAL']; $convert->p_master->error('' . $user->lang['COLLIDING_USERNAMES_FOUND'] . '

' . $list . '', __LINE__, __FILE__); } $drop_sql = 'DROP TABLE ' . USERCONV_TABLE; $db->sql_query($drop_sql); } function phpbb_convert_timezone($timezone) { global $config, $db, $phpbb_root_path, $phpEx, $table_prefix; $timezone_migration = new \phpbb\db\migration\data\v310\timezone($config, $db, new \phpbb\db\tools($db), $phpbb_root_path, $phpEx, $table_prefix); return $timezone_migration->convert_phpbb30_timezone($timezone, 0); } function phpbb_add_notification_options($user_notify_pm) { global $convert_row, $db; $user_id = phpbb_user_id($convert_row['user_id']); if ($user_id == ANONYMOUS) { return; } $rows = array(); $rows[] = array( 'item_type' => 'post', 'item_id' => 0, 'user_id' => (int) $user_id, 'notify' => 1, 'method' => 'email', ); $rows[] = array( 'item_type' => 'topic', 'item_id' => 0, 'user_id' => (int) $user_id, 'notify' => 1, 'method' => 'email', ); if ($user_notify_pm) { $rows[] = array( 'item_type' => 'pm', 'item_id' => 0, 'user_id' => (int) $user_id, 'notify' => 1, 'method' => 'email', ); } $sql = $db->sql_multi_insert(USER_NOTIFICATIONS_TABLE, $rows); } function phpbb_convert_password_hash($hash) { global $phpbb_container; $manager = $phpbb_container->get('passwords.manager'); $hash = $manager->hash($hash, '$H$'); return '$CP$' . $hash; }