diff options
Diffstat (limited to 'phpBB/phpbb/db/migration')
133 files changed, 11467 insertions, 0 deletions
| diff --git a/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php b/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php new file mode 100644 index 0000000000..648ae9ce96 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/local_url_bbcode.php @@ -0,0 +1,70 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class local_url_bbcode extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_local_url_bbcode'))), +		); +	} + +	/** +	* Update BBCodes that currently use the LOCAL_URL tag +	* +	* To fix http://tracker.phpbb.com/browse/PHPBB3-8319 we changed +	* the second_pass_replace value, so that needs updating for existing ones +	*/ +	public function update_local_url_bbcode() +	{ +		$sql = 'SELECT * +			FROM ' . BBCODES_TABLE . ' +			WHERE bbcode_match ' . $this->db->sql_like_expression($this->db->get_any_char() . 'LOCAL_URL' . $this->db->get_any_char()); +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			if (!class_exists('acp_bbcodes')) +			{ +				if (function_exists('phpbb_require_updated')) +				{ +					phpbb_require_updated('includes/acp/acp_bbcodes.' . $this->php_ext); +				} +				else +				{ +					require($this->phpbb_root_path . 'includes/acp/acp_bbcodes.' . $this->php_ext); +				} +			} + +			$bbcode_match = $row['bbcode_match']; +			$bbcode_tpl = $row['bbcode_tpl']; + +			$acp_bbcodes = new \acp_bbcodes(); +			$sql_ary = $acp_bbcodes->build_regexp($bbcode_match, $bbcode_tpl); + +			$sql = 'UPDATE ' . BBCODES_TABLE . ' +				SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' +				WHERE bbcode_id = ' . (int) $row['bbcode_id']; +			$this->sql_query($sql); +		} +		$this->db->sql_freeresult($result); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_0.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_0.php new file mode 100644 index 0000000000..26937d6d80 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_0.php @@ -0,0 +1,1181 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_0 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.0', '>='); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables' => array( +				$this->table_prefix . 'attachments'	=> array( +					'COLUMNS'	=> array( +						'attach_id'	=> array('UINT', NULL, 'auto_increment'), +						'post_msg_id'	=> array('UINT', 0), +						'topic_id'	=> array('UINT', 0), +						'in_message'	=> array('BOOL', 0), +						'poster_id'	=> array('UINT', 0), +						'is_orphan'	=> array('BOOL', 1), +						'physical_filename'	=> array('VCHAR', ''), +						'real_filename'	=> array('VCHAR', ''), +						'download_count'	=> array('UINT', 0), +						'attach_comment'	=> array('TEXT_UNI', ''), +						'extension'	=> array('VCHAR:100', ''), +						'mimetype'	=> array('VCHAR:100', ''), +						'filesize'	=> array('UINT:20', 0), +						'filetime'	=> array('TIMESTAMP', 0), +						'thumbnail'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'attach_id', +					'KEYS'	=> array( +						'filetime'	=> array('INDEX', 'filetime'), +						'post_msg_id'	=> array('INDEX', 'post_msg_id'), +						'topic_id'	=> array('INDEX', 'topic_id'), +						'poster_id'	=> array('INDEX', 'poster_id'), +						'is_orphan'	=> array('INDEX', 'is_orphan'), +					), +				), + +				$this->table_prefix . 'acl_groups'	=> array( +					'COLUMNS'	=> array( +						'group_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'auth_option_id'	=> array('UINT', 0), +						'auth_role_id'	=> array('UINT', 0), +						'auth_setting'	=> array('TINT:2', 0), +					), +					'KEYS'	=> array( +						'group_id'	=> array('INDEX', 'group_id'), +						'auth_opt_id'	=> array('INDEX', 'auth_option_id'), +						'auth_role_id'	=> array('INDEX', 'auth_role_id'), +					), +				), + +				$this->table_prefix . 'acl_options'	=> array( +					'COLUMNS'	=> array( +						'auth_option_id'	=> array('UINT', NULL, 'auto_increment'), +						'auth_option'	=> array('VCHAR:50', ''), +						'is_global'	=> array('BOOL', 0), +						'is_local'	=> array('BOOL', 0), +						'founder_only'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'auth_option_id', +					'KEYS'	=> array( +						'auth_option'	=> array('INDEX', 'auth_option'), +					), +				), + +				$this->table_prefix . 'acl_roles'	=> array( +					'COLUMNS'	=> array( +						'role_id'	=> array('UINT', NULL, 'auto_increment'), +						'role_name'	=> array('VCHAR_UNI', ''), +						'role_description'	=> array('TEXT_UNI', ''), +						'role_type'	=> array('VCHAR:10', ''), +						'role_order'	=> array('USINT', 0), +					), +					'PRIMARY_KEY'	=> 'role_id', +					'KEYS'	=> array( +						'role_type'	=> array('INDEX', 'role_type'), +						'role_order'	=> array('INDEX', 'role_order'), +					), +				), + +				$this->table_prefix . 'acl_roles_data'	=> array( +					'COLUMNS'	=> array( +						'role_id'	=> array('UINT', 0), +						'auth_option_id'	=> array('UINT', 0), +						'auth_setting'	=> array('TINT:2', 0), +					), +					'PRIMARY_KEY'	=> array('role_id', 'auth_option_id'), +					'KEYS'	=> array( +						'ath_op_id'	=> array('INDEX', 'auth_option_id'), +					), +				), + +				$this->table_prefix . 'acl_users'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'auth_option_id'	=> array('UINT', 0), +						'auth_role_id'	=> array('UINT', 0), +						'auth_setting'	=> array('TINT:2', 0), +					), +					'KEYS'	=> array( +						'user_id'	=> array('INDEX', 'user_id'), +						'auth_option_id'	=> array('INDEX', 'auth_option_id'), +						'auth_role_id'	=> array('INDEX', 'auth_role_id'), +					), +				), + +				$this->table_prefix . 'banlist'	=> array( +					'COLUMNS'	=> array( +						'ban_id'	=> array('UINT', NULL, 'auto_increment'), +						'ban_userid'	=> array('UINT', 0), +						'ban_ip'	=> array('VCHAR:40', ''), +						'ban_email'	=> array('VCHAR_UNI:100', ''), +						'ban_start'	=> array('TIMESTAMP', 0), +						'ban_end'	=> array('TIMESTAMP', 0), +						'ban_exclude'	=> array('BOOL', 0), +						'ban_reason'	=> array('VCHAR_UNI', ''), +						'ban_give_reason'	=> array('VCHAR_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'ban_id', +					'KEYS'	=> array( +						'ban_end'	=> array('INDEX', 'ban_end'), +						'ban_user'	=> array('INDEX', array('ban_userid', 'ban_exclude')), +						'ban_email'	=> array('INDEX', array('ban_email', 'ban_exclude')), +						'ban_ip'	=> array('INDEX', array('ban_ip', 'ban_exclude')), +					), +				), + +				$this->table_prefix . 'bbcodes'	=> array( +					'COLUMNS'	=> array( +						'bbcode_id'	=> array('TINT:3', 0), +						'bbcode_tag'	=> array('VCHAR:16', ''), +						'bbcode_helpline'	=> array('VCHAR_UNI', ''), +						'display_on_posting'	=> array('BOOL', 0), +						'bbcode_match'	=> array('TEXT_UNI', ''), +						'bbcode_tpl'	=> array('MTEXT_UNI', ''), +						'first_pass_match'	=> array('MTEXT_UNI', ''), +						'first_pass_replace'	=> array('MTEXT_UNI', ''), +						'second_pass_match'	=> array('MTEXT_UNI', ''), +						'second_pass_replace'	=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'bbcode_id', +					'KEYS'	=> array( +						'display_on_post'	=> array('INDEX', 'display_on_posting'), +					), +				), + +				$this->table_prefix . 'bookmarks'	=> array( +					'COLUMNS'	=> array( +						'topic_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> array('topic_id', 'user_id'), +				), + +				$this->table_prefix . 'bots'	=> array( +					'COLUMNS'	=> array( +						'bot_id'	=> array('UINT', NULL, 'auto_increment'), +						'bot_active'	=> array('BOOL', 1), +						'bot_name'	=> array('STEXT_UNI', ''), +						'user_id'	=> array('UINT', 0), +						'bot_agent'	=> array('VCHAR', ''), +						'bot_ip'	=> array('VCHAR', ''), +					), +					'PRIMARY_KEY'	=> 'bot_id', +					'KEYS'	=> array( +						'bot_active'	=> array('INDEX', 'bot_active'), +					), +				), + +				$this->table_prefix . 'config'	=> array( +					'COLUMNS'	=> array( +						'config_name'	=> array('VCHAR', ''), +						'config_value'	=> array('VCHAR_UNI', ''), +						'is_dynamic'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'config_name', +					'KEYS'	=> array( +						'is_dynamic'	=> array('INDEX', 'is_dynamic'), +					), +				), + +				$this->table_prefix . 'confirm'	=> array( +					'COLUMNS'	=> array( +						'confirm_id'	=> array('CHAR:32', ''), +						'session_id'	=> array('CHAR:32', ''), +						'confirm_type'	=> array('TINT:3', 0), +						'code'	=> array('VCHAR:8', ''), +						'seed'	=> array('UINT:10', 0), +					), +					'PRIMARY_KEY'	=> array('session_id', 'confirm_id'), +					'KEYS'	=> array( +						'confirm_type'	=> array('INDEX', 'confirm_type'), +					), +				), + +				$this->table_prefix . 'disallow'	=> array( +					'COLUMNS'	=> array( +						'disallow_id'	=> array('UINT', NULL, 'auto_increment'), +						'disallow_username'	=> array('VCHAR_UNI:255', ''), +					), +					'PRIMARY_KEY'	=> 'disallow_id', +				), + +				$this->table_prefix . 'drafts'	=> array( +					'COLUMNS'	=> array( +						'draft_id'	=> array('UINT', NULL, 'auto_increment'), +						'user_id'	=> array('UINT', 0), +						'topic_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'save_time'	=> array('TIMESTAMP', 0), +						'draft_subject'	=> array('XSTEXT_UNI', ''), +						'draft_message'	=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'draft_id', +					'KEYS'	=> array( +						'save_time'	=> array('INDEX', 'save_time'), +					), +				), + +				$this->table_prefix . 'extensions'	=> array( +					'COLUMNS'	=> array( +						'extension_id'	=> array('UINT', NULL, 'auto_increment'), +						'group_id'	=> array('UINT', 0), +						'extension'	=> array('VCHAR:100', ''), +					), +					'PRIMARY_KEY'	=> 'extension_id', +				), + +				$this->table_prefix . 'extension_groups'	=> array( +					'COLUMNS'	=> array( +						'group_id'	=> array('UINT', NULL, 'auto_increment'), +						'group_name'	=> array('VCHAR_UNI', ''), +						'cat_id'	=> array('TINT:2', 0), +						'allow_group'	=> array('BOOL', 0), +						'download_mode'	=> array('BOOL', 1), +						'upload_icon'	=> array('VCHAR', ''), +						'max_filesize'	=> array('UINT:20', 0), +						'allowed_forums'	=> array('TEXT', ''), +						'allow_in_pm'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'group_id', +				), + +				$this->table_prefix . 'forums'	=> array( +					'COLUMNS'	=> array( +						'forum_id'	=> array('UINT', NULL, 'auto_increment'), +						'parent_id'	=> array('UINT', 0), +						'left_id'	=> array('UINT', 0), +						'right_id'	=> array('UINT', 0), +						'forum_parents'	=> array('MTEXT', ''), +						'forum_name'	=> array('STEXT_UNI', ''), +						'forum_desc'	=> array('TEXT_UNI', ''), +						'forum_desc_bitfield'	=> array('VCHAR:255', ''), +						'forum_desc_options'	=> array('UINT:11', 7), +						'forum_desc_uid'	=> array('VCHAR:8', ''), +						'forum_link'	=> array('VCHAR_UNI', ''), +						'forum_password'	=> array('VCHAR_UNI:40', ''), +						'forum_style'	=> array('USINT', 0), +						'forum_image'	=> array('VCHAR', ''), +						'forum_rules'	=> array('TEXT_UNI', ''), +						'forum_rules_link'	=> array('VCHAR_UNI', ''), +						'forum_rules_bitfield'	=> array('VCHAR:255', ''), +						'forum_rules_options'	=> array('UINT:11', 7), +						'forum_rules_uid'	=> array('VCHAR:8', ''), +						'forum_topics_per_page'	=> array('TINT:4', 0), +						'forum_type'	=> array('TINT:4', 0), +						'forum_status'	=> array('TINT:4', 0), +						'forum_posts'	=> array('UINT', 0), +						'forum_topics'	=> array('UINT', 0), +						'forum_topics_real'	=> array('UINT', 0), +						'forum_last_post_id'	=> array('UINT', 0), +						'forum_last_poster_id'	=> array('UINT', 0), +						'forum_last_post_subject' => array('XSTEXT_UNI', ''), +						'forum_last_post_time'	=> array('TIMESTAMP', 0), +						'forum_last_poster_name'=> array('VCHAR_UNI', ''), +						'forum_last_poster_colour'=> array('VCHAR:6', ''), +						'forum_flags'	=> array('TINT:4', 32), +						'display_on_index'	=> array('BOOL', 1), +						'enable_indexing'	=> array('BOOL', 1), +						'enable_icons'	=> array('BOOL', 1), +						'enable_prune'	=> array('BOOL', 0), +						'prune_next'	=> array('TIMESTAMP', 0), +						'prune_days'	=> array('UINT', 0), +						'prune_viewed'	=> array('UINT', 0), +						'prune_freq'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> 'forum_id', +					'KEYS'	=> array( +						'left_right_id'	=> array('INDEX', array('left_id', 'right_id')), +						'forum_lastpost_id'	=> array('INDEX', 'forum_last_post_id'), +					), +				), + +				$this->table_prefix . 'forums_access'	=> array( +					'COLUMNS'	=> array( +						'forum_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'session_id'	=> array('CHAR:32', ''), +					), +					'PRIMARY_KEY'	=> array('forum_id', 'user_id', 'session_id'), +				), + +				$this->table_prefix . 'forums_track'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'mark_time'	=> array('TIMESTAMP', 0), +					), +					'PRIMARY_KEY'	=> array('user_id', 'forum_id'), +				), + +				$this->table_prefix . 'forums_watch'	=> array( +					'COLUMNS'	=> array( +						'forum_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'notify_status'	=> array('BOOL', 0), +					), +					'KEYS'	=> array( +						'forum_id'	=> array('INDEX', 'forum_id'), +						'user_id'	=> array('INDEX', 'user_id'), +						'notify_stat'	=> array('INDEX', 'notify_status'), +					), +				), + +				$this->table_prefix . 'groups'	=> array( +					'COLUMNS'	=> array( +						'group_id'	=> array('UINT', NULL, 'auto_increment'), +						'group_type'	=> array('TINT:4', 1), +						'group_founder_manage'	=> array('BOOL', 0), +						'group_name'	=> array('VCHAR_CI', ''), +						'group_desc'	=> array('TEXT_UNI', ''), +						'group_desc_bitfield'	=> array('VCHAR:255', ''), +						'group_desc_options'	=> array('UINT:11', 7), +						'group_desc_uid'	=> array('VCHAR:8', ''), +						'group_display'	=> array('BOOL', 0), +						'group_avatar'	=> array('VCHAR', ''), +						'group_avatar_type'	=> array('TINT:2', 0), +						'group_avatar_width'	=> array('USINT', 0), +						'group_avatar_height'	=> array('USINT', 0), +						'group_rank'	=> array('UINT', 0), +						'group_colour'	=> array('VCHAR:6', ''), +						'group_sig_chars'	=> array('UINT', 0), +						'group_receive_pm'	=> array('BOOL', 0), +						'group_message_limit'	=> array('UINT', 0), +						'group_legend'	=> array('BOOL', 1), +					), +					'PRIMARY_KEY'	=> 'group_id', +					'KEYS'	=> array( +						'group_legend'	=> array('INDEX', 'group_legend'), +					), +				), + +				$this->table_prefix . 'icons'	=> array( +					'COLUMNS'	=> array( +						'icons_id'	=> array('UINT', NULL, 'auto_increment'), +						'icons_url'	=> array('VCHAR', ''), +						'icons_width'	=> array('TINT:4', 0), +						'icons_height'	=> array('TINT:4', 0), +						'icons_order'	=> array('UINT', 0), +						'display_on_posting'	=> array('BOOL', 1), +					), +					'PRIMARY_KEY'	=> 'icons_id', +					'KEYS'	=> array( +						'display_on_posting'	=> array('INDEX', 'display_on_posting'), +					), +				), + +				$this->table_prefix . 'lang'	=> array( +					'COLUMNS'	=> array( +						'lang_id'	=> array('TINT:4', NULL, 'auto_increment'), +						'lang_iso'	=> array('VCHAR:30', ''), +						'lang_dir'	=> array('VCHAR:30', ''), +						'lang_english_name'	=> array('VCHAR_UNI:100', ''), +						'lang_local_name'	=> array('VCHAR_UNI:255', ''), +						'lang_author'	=> array('VCHAR_UNI:255', ''), +					), +					'PRIMARY_KEY'	=> 'lang_id', +					'KEYS'	=> array( +						'lang_iso'	=> array('INDEX', 'lang_iso'), +					), +				), + +				$this->table_prefix . 'log'	=> array( +					'COLUMNS'	=> array( +						'log_id'	=> array('UINT', NULL, 'auto_increment'), +						'log_type'	=> array('TINT:4', 0), +						'user_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'topic_id'	=> array('UINT', 0), +						'reportee_id'	=> array('UINT', 0), +						'log_ip'	=> array('VCHAR:40', ''), +						'log_time'	=> array('TIMESTAMP', 0), +						'log_operation'	=> array('TEXT_UNI', ''), +						'log_data'	=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'log_id', +					'KEYS'	=> array( +						'log_type'	=> array('INDEX', 'log_type'), +						'forum_id'	=> array('INDEX', 'forum_id'), +						'topic_id'	=> array('INDEX', 'topic_id'), +						'reportee_id'	=> array('INDEX', 'reportee_id'), +						'user_id'	=> array('INDEX', 'user_id'), +					), +				), + +				$this->table_prefix . 'moderator_cache'	=> array( +					'COLUMNS'	=> array( +						'forum_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'username'	=> array('VCHAR_UNI:255', ''), +						'group_id'	=> array('UINT', 0), +						'group_name'	=> array('VCHAR_UNI', ''), +						'display_on_index'	=> array('BOOL', 1), +					), +					'KEYS'	=> array( +						'disp_idx'	=> array('INDEX', 'display_on_index'), +						'forum_id'	=> array('INDEX', 'forum_id'), +					), +				), + +				$this->table_prefix . 'modules'	=> array( +					'COLUMNS'	=> array( +						'module_id'	=> array('UINT', NULL, 'auto_increment'), +						'module_enabled'	=> array('BOOL', 1), +						'module_display'	=> array('BOOL', 1), +						'module_basename'	=> array('VCHAR', ''), +						'module_class'	=> array('VCHAR:10', ''), +						'parent_id'	=> array('UINT', 0), +						'left_id'	=> array('UINT', 0), +						'right_id'	=> array('UINT', 0), +						'module_langname'	=> array('VCHAR', ''), +						'module_mode'	=> array('VCHAR', ''), +						'module_auth'	=> array('VCHAR', ''), +					), +					'PRIMARY_KEY'	=> 'module_id', +					'KEYS'	=> array( +						'left_right_id'	=> array('INDEX', array('left_id', 'right_id')), +						'module_enabled'	=> array('INDEX', 'module_enabled'), +						'class_left_id'	=> array('INDEX', array('module_class', 'left_id')), +					), +				), + +				$this->table_prefix . 'poll_options'	=> array( +					'COLUMNS'	=> array( +						'poll_option_id'	=> array('TINT:4', 0), +						'topic_id'	=> array('UINT', 0), +						'poll_option_text'	=> array('TEXT_UNI', ''), +						'poll_option_total'	=> array('UINT', 0), +					), +					'KEYS'	=> array( +						'poll_opt_id'	=> array('INDEX', 'poll_option_id'), +						'topic_id'	=> array('INDEX', 'topic_id'), +					), +				), + +				$this->table_prefix . 'poll_votes'	=> array( +					'COLUMNS'	=> array( +						'topic_id'	=> array('UINT', 0), +						'poll_option_id'	=> array('TINT:4', 0), +						'vote_user_id'	=> array('UINT', 0), +						'vote_user_ip'	=> array('VCHAR:40', ''), +					), +					'KEYS'	=> array( +						'topic_id'	=> array('INDEX', 'topic_id'), +						'vote_user_id'	=> array('INDEX', 'vote_user_id'), +						'vote_user_ip'	=> array('INDEX', 'vote_user_ip'), +					), +				), + +				$this->table_prefix . 'posts'	=> array( +					'COLUMNS'	=> array( +						'post_id'	=> array('UINT', NULL, 'auto_increment'), +						'topic_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'poster_id'	=> array('UINT', 0), +						'icon_id'	=> array('UINT', 0), +						'poster_ip'	=> array('VCHAR:40', ''), +						'post_time'	=> array('TIMESTAMP', 0), +						'post_approved'	=> array('BOOL', 1), +						'post_reported'	=> array('BOOL', 0), +						'enable_bbcode'	=> array('BOOL', 1), +						'enable_smilies'	=> array('BOOL', 1), +						'enable_magic_url'	=> array('BOOL', 1), +						'enable_sig'	=> array('BOOL', 1), +						'post_username'	=> array('VCHAR_UNI:255', ''), +						'post_subject'	=> array('XSTEXT_UNI', '', 'true_sort'), +						'post_text'	=> array('MTEXT_UNI', ''), +						'post_checksum'	=> array('VCHAR:32', ''), +						'post_attachment'	=> array('BOOL', 0), +						'bbcode_bitfield'	=> array('VCHAR:255', ''), +						'bbcode_uid'	=> array('VCHAR:8', ''), +						'post_postcount'	=> array('BOOL', 1), +						'post_edit_time'	=> array('TIMESTAMP', 0), +						'post_edit_reason'	=> array('STEXT_UNI', ''), +						'post_edit_user'	=> array('UINT', 0), +						'post_edit_count'	=> array('USINT', 0), +						'post_edit_locked'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'post_id', +					'KEYS'	=> array( +						'forum_id'	=> array('INDEX', 'forum_id'), +						'topic_id'	=> array('INDEX', 'topic_id'), +						'poster_ip'	=> array('INDEX', 'poster_ip'), +						'poster_id'	=> array('INDEX', 'poster_id'), +						'post_approved'	=> array('INDEX', 'post_approved'), +						'tid_post_time'	=> array('INDEX', array('topic_id', 'post_time')), +					), +				), + +				$this->table_prefix . 'privmsgs'	=> array( +					'COLUMNS'	=> array( +						'msg_id'	=> array('UINT', NULL, 'auto_increment'), +						'root_level'	=> array('UINT', 0), +						'author_id'	=> array('UINT', 0), +						'icon_id'	=> array('UINT', 0), +						'author_ip'	=> array('VCHAR:40', ''), +						'message_time'	=> array('TIMESTAMP', 0), +						'enable_bbcode'	=> array('BOOL', 1), +						'enable_smilies'	=> array('BOOL', 1), +						'enable_magic_url'	=> array('BOOL', 1), +						'enable_sig'	=> array('BOOL', 1), +						'message_subject'	=> array('XSTEXT_UNI', ''), +						'message_text'	=> array('MTEXT_UNI', ''), +						'message_edit_reason'	=> array('STEXT_UNI', ''), +						'message_edit_user'	=> array('UINT', 0), +						'message_attachment'	=> array('BOOL', 0), +						'bbcode_bitfield'	=> array('VCHAR:255', ''), +						'bbcode_uid'	=> array('VCHAR:8', ''), +						'message_edit_time'	=> array('TIMESTAMP', 0), +						'message_edit_count'	=> array('USINT', 0), +						'to_address'	=> array('TEXT_UNI', ''), +						'bcc_address'	=> array('TEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'msg_id', +					'KEYS'	=> array( +						'author_ip'	=> array('INDEX', 'author_ip'), +						'message_time'	=> array('INDEX', 'message_time'), +						'author_id'	=> array('INDEX', 'author_id'), +						'root_level'	=> array('INDEX', 'root_level'), +					), +				), + +				$this->table_prefix . 'privmsgs_folder'	=> array( +					'COLUMNS'	=> array( +						'folder_id'	=> array('UINT', NULL, 'auto_increment'), +						'user_id'	=> array('UINT', 0), +						'folder_name'	=> array('VCHAR_UNI', ''), +						'pm_count'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> 'folder_id', +					'KEYS'	=> array( +						'user_id'	=> array('INDEX', 'user_id'), +					), +				), + +				$this->table_prefix . 'privmsgs_rules'	=> array( +					'COLUMNS'	=> array( +						'rule_id'	=> array('UINT', NULL, 'auto_increment'), +						'user_id'	=> array('UINT', 0), +						'rule_check'	=> array('UINT', 0), +						'rule_connection'	=> array('UINT', 0), +						'rule_string'	=> array('VCHAR_UNI', ''), +						'rule_user_id'	=> array('UINT', 0), +						'rule_group_id'	=> array('UINT', 0), +						'rule_action'	=> array('UINT', 0), +						'rule_folder_id'	=> array('INT:11', 0), +					), +					'PRIMARY_KEY'	=> 'rule_id', +					'KEYS'	=> array( +						'user_id'	=> array('INDEX', 'user_id'), +					), +				), + +				$this->table_prefix . 'privmsgs_to'	=> array( +					'COLUMNS'	=> array( +						'msg_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'author_id'	=> array('UINT', 0), +						'pm_deleted'	=> array('BOOL', 0), +						'pm_new'	=> array('BOOL', 1), +						'pm_unread'	=> array('BOOL', 1), +						'pm_replied'	=> array('BOOL', 0), +						'pm_marked'	=> array('BOOL', 0), +						'pm_forwarded'	=> array('BOOL', 0), +						'folder_id'	=> array('INT:11', 0), +					), +					'KEYS'	=> array( +						'msg_id'	=> array('INDEX', 'msg_id'), +						'author_id'	=> array('INDEX', 'author_id'), +						'usr_flder_id'	=> array('INDEX', array('user_id', 'folder_id')), +					), +				), + +				$this->table_prefix . 'profile_fields'	=> array( +					'COLUMNS'	=> array( +						'field_id'	=> array('UINT', NULL, 'auto_increment'), +						'field_name'	=> array('VCHAR_UNI', ''), +						'field_type'	=> array('TINT:4', 0), +						'field_ident'	=> array('VCHAR:20', ''), +						'field_length'	=> array('VCHAR:20', ''), +						'field_minlen'	=> array('VCHAR', ''), +						'field_maxlen'	=> array('VCHAR', ''), +						'field_novalue'	=> array('VCHAR_UNI', ''), +						'field_default_value'	=> array('VCHAR_UNI', ''), +						'field_validation'	=> array('VCHAR_UNI:20', ''), +						'field_required'	=> array('BOOL', 0), +						'field_show_on_reg'	=> array('BOOL', 0), +						'field_hide'	=> array('BOOL', 0), +						'field_no_view'	=> array('BOOL', 0), +						'field_active'	=> array('BOOL', 0), +						'field_order'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> 'field_id', +					'KEYS'	=> array( +						'fld_type'	=> array('INDEX', 'field_type'), +						'fld_ordr'	=> array('INDEX', 'field_order'), +					), +				), + +				$this->table_prefix . 'profile_fields_data'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> 'user_id', +				), + +				$this->table_prefix . 'profile_fields_lang'	=> array( +					'COLUMNS'	=> array( +						'field_id'	=> array('UINT', 0), +						'lang_id'	=> array('UINT', 0), +						'option_id'	=> array('UINT', 0), +						'field_type'	=> array('TINT:4', 0), +						'lang_value'	=> array('VCHAR_UNI', ''), +					), +					'PRIMARY_KEY'	=> array('field_id', 'lang_id', 'option_id'), +				), + +				$this->table_prefix . 'profile_lang'	=> array( +					'COLUMNS'	=> array( +						'field_id'	=> array('UINT', 0), +						'lang_id'	=> array('UINT', 0), +						'lang_name'	=> array('VCHAR_UNI', ''), +						'lang_explain'	=> array('TEXT_UNI', ''), +						'lang_default_value'	=> array('VCHAR_UNI', ''), +					), +					'PRIMARY_KEY'	=> array('field_id', 'lang_id'), +				), + +				$this->table_prefix . 'ranks'	=> array( +					'COLUMNS'	=> array( +						'rank_id'	=> array('UINT', NULL, 'auto_increment'), +						'rank_title'	=> array('VCHAR_UNI', ''), +						'rank_min'	=> array('UINT', 0), +						'rank_special'	=> array('BOOL', 0), +						'rank_image'	=> array('VCHAR', ''), +					), +					'PRIMARY_KEY'	=> 'rank_id', +				), + +				$this->table_prefix . 'reports'	=> array( +					'COLUMNS'	=> array( +						'report_id'	=> array('UINT', NULL, 'auto_increment'), +						'reason_id'	=> array('USINT', 0), +						'post_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'user_notify'	=> array('BOOL', 0), +						'report_closed'	=> array('BOOL', 0), +						'report_time'	=> array('TIMESTAMP', 0), +						'report_text'	=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'report_id', +				), + +				$this->table_prefix . 'reports_reasons'	=> array( +					'COLUMNS'	=> array( +						'reason_id'	=> array('USINT', NULL, 'auto_increment'), +						'reason_title'	=> array('VCHAR_UNI', ''), +						'reason_description'	=> array('MTEXT_UNI', ''), +						'reason_order'	=> array('USINT', 0), +					), +					'PRIMARY_KEY'	=> 'reason_id', +				), + +				$this->table_prefix . 'search_results'	=> array( +					'COLUMNS'	=> array( +						'search_key'	=> array('VCHAR:32', ''), +						'search_time'	=> array('TIMESTAMP', 0), +						'search_keywords'	=> array('MTEXT_UNI', ''), +						'search_authors'	=> array('MTEXT', ''), +					), +					'PRIMARY_KEY'	=> 'search_key', +				), + +				$this->table_prefix . 'search_wordlist'	=> array( +					'COLUMNS'	=> array( +						'word_id'	=> array('UINT', NULL, 'auto_increment'), +						'word_text'	=> array('VCHAR_UNI', ''), +						'word_common'	=> array('BOOL', 0), +						'word_count'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'	=> 'word_id', +					'KEYS'	=> array( +						'wrd_txt'	=> array('UNIQUE', 'word_text'), +						'wrd_cnt'	=> array('INDEX', 'word_count'), +					), +				), + +				$this->table_prefix . 'search_wordmatch'	=> array( +					'COLUMNS'	=> array( +						'post_id'	=> array('UINT', 0), +						'word_id'	=> array('UINT', 0), +						'title_match'	=> array('BOOL', 0), +					), +					'KEYS'	=> array( +						'unq_mtch'	=> array('UNIQUE', array('word_id', 'post_id', 'title_match')), +						'word_id'	=> array('INDEX', 'word_id'), +						'post_id'	=> array('INDEX', 'post_id'), +					), +				), + +				$this->table_prefix . 'sessions'	=> array( +					'COLUMNS'	=> array( +						'session_id'	=> array('CHAR:32', ''), +						'session_user_id'	=> array('UINT', 0), +						'session_last_visit'	=> array('TIMESTAMP', 0), +						'session_start'	=> array('TIMESTAMP', 0), +						'session_time'	=> array('TIMESTAMP', 0), +						'session_ip'	=> array('VCHAR:40', ''), +						'session_browser'	=> array('VCHAR:150', ''), +						'session_forwarded_for'	=> array('VCHAR:255', ''), +						'session_page'	=> array('VCHAR_UNI', ''), +						'session_viewonline'	=> array('BOOL', 1), +						'session_autologin'	=> array('BOOL', 0), +						'session_admin'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'session_id', +					'KEYS'	=> array( +						'session_time'	=> array('INDEX', 'session_time'), +						'session_user_id'	=> array('INDEX', 'session_user_id'), +					), +				), + +				$this->table_prefix . 'sessions_keys'	=> array( +					'COLUMNS'	=> array( +						'key_id'	=> array('CHAR:32', ''), +						'user_id'	=> array('UINT', 0), +						'last_ip'	=> array('VCHAR:40', ''), +						'last_login'	=> array('TIMESTAMP', 0), +					), +					'PRIMARY_KEY'	=> array('key_id', 'user_id'), +					'KEYS'	=> array( +						'last_login'	=> array('INDEX', 'last_login'), +					), +				), + +				$this->table_prefix . 'sitelist'	=> array( +					'COLUMNS'	=> array( +						'site_id'	=> array('UINT', NULL, 'auto_increment'), +						'site_ip'	=> array('VCHAR:40', ''), +						'site_hostname'	=> array('VCHAR', ''), +						'ip_exclude'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'site_id', +				), + +				$this->table_prefix . 'smilies'	=> array( +					'COLUMNS'	=> array( +						'smiley_id'	=> array('UINT', NULL, 'auto_increment'), +// We may want to set 'code' to VCHAR:50 or check if unicode support is possible... at the moment only ASCII characters are allowed. +						'code'	=> array('VCHAR_UNI:50', ''), +						'emotion'	=> array('VCHAR_UNI:50', ''), +						'smiley_url'	=> array('VCHAR:50', ''), +						'smiley_width'	=> array('USINT', 0), +						'smiley_height'	=> array('USINT', 0), +						'smiley_order'	=> array('UINT', 0), +						'display_on_posting'=> array('BOOL', 1), +					), +					'PRIMARY_KEY'	=> 'smiley_id', +					'KEYS'	=> array( +						'display_on_post'	=> array('INDEX', 'display_on_posting'), +					), +				), + +				$this->table_prefix . 'styles'	=> array( +					'COLUMNS'	=> array( +						'style_id'	=> array('USINT', NULL, 'auto_increment'), +						'style_name'	=> array('VCHAR_UNI:255', ''), +						'style_copyright'	=> array('VCHAR_UNI', ''), +						'style_active'	=> array('BOOL', 1), +						'template_id'	=> array('USINT', 0), +						'theme_id'	=> array('USINT', 0), +						'imageset_id'	=> array('USINT', 0), +					), +					'PRIMARY_KEY'	=> 'style_id', +					'KEYS'	=> array( +						'style_name'	=> array('UNIQUE', 'style_name'), +						'template_id'	=> array('INDEX', 'template_id'), +						'theme_id'	=> array('INDEX', 'theme_id'), +						'imageset_id'	=> array('INDEX', 'imageset_id'), +					), +				), + +				$this->table_prefix . 'styles_template'	=> array( +					'COLUMNS'	=> array( +						'template_id'	=> array('USINT', NULL, 'auto_increment'), +						'template_name'	=> array('VCHAR_UNI:255', ''), +						'template_copyright'	=> array('VCHAR_UNI', ''), +						'template_path'	=> array('VCHAR:100', ''), +						'bbcode_bitfield'	=> array('VCHAR:255', 'kNg='), +						'template_storedb'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'template_id', +					'KEYS'	=> array( +						'tmplte_nm'	=> array('UNIQUE', 'template_name'), +					), +				), + +				$this->table_prefix . 'styles_template_data'	=> array( +					'COLUMNS'	=> array( +						'template_id'	=> array('USINT', 0), +						'template_filename'	=> array('VCHAR:100', ''), +						'template_included'	=> array('TEXT', ''), +						'template_mtime'	=> array('TIMESTAMP', 0), +						'template_data'	=> array('MTEXT_UNI', ''), +					), +					'KEYS'	=> array( +						'tid'	=> array('INDEX', 'template_id'), +						'tfn'	=> array('INDEX', 'template_filename'), +					), +				), + +				$this->table_prefix . 'styles_theme'	=> array( +					'COLUMNS'	=> array( +						'theme_id'	=> array('USINT', NULL, 'auto_increment'), +						'theme_name'	=> array('VCHAR_UNI:255', ''), +						'theme_copyright'	=> array('VCHAR_UNI', ''), +						'theme_path'	=> array('VCHAR:100', ''), +						'theme_storedb'	=> array('BOOL', 0), +						'theme_mtime'	=> array('TIMESTAMP', 0), +						'theme_data'	=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'theme_id', +					'KEYS'	=> array( +						'theme_name'	=> array('UNIQUE', 'theme_name'), +					), +				), + +				$this->table_prefix . 'styles_imageset'	=> array( +					'COLUMNS'	=> array( +						'imageset_id'	=> array('USINT', NULL, 'auto_increment'), +						'imageset_name'	=> array('VCHAR_UNI:255', ''), +						'imageset_copyright'	=> array('VCHAR_UNI', ''), +						'imageset_path'	=> array('VCHAR:100', ''), +					), +					'PRIMARY_KEY'	=> 'imageset_id', +					'KEYS'	=> array( +						'imgset_nm'	=> array('UNIQUE', 'imageset_name'), +					), +				), + +				$this->table_prefix . 'styles_imageset_data'	=> array( +					'COLUMNS'	=> array( +						'image_id'	=> array('USINT', NULL, 'auto_increment'), +						'image_name'	=> array('VCHAR:200', ''), +						'image_filename'	=> array('VCHAR:200', ''), +						'image_lang'	=> array('VCHAR:30', ''), +						'image_height'	=> array('USINT', 0), +						'image_width'	=> array('USINT', 0), +						'imageset_id'	=> array('USINT', 0), +					), +					'PRIMARY_KEY'	=> 'image_id', +					'KEYS'	=> array( +						'i_d'	=> array('INDEX', 'imageset_id'), +					), +				), + +				$this->table_prefix . 'topics'	=> array( +					'COLUMNS'	=> array( +						'topic_id'	=> array('UINT', NULL, 'auto_increment'), +						'forum_id'	=> array('UINT', 0), +						'icon_id'	=> array('UINT', 0), +						'topic_attachment'	=> array('BOOL', 0), +						'topic_approved'	=> array('BOOL', 1), +						'topic_reported'	=> array('BOOL', 0), +						'topic_title'	=> array('XSTEXT_UNI', '', 'true_sort'), +						'topic_poster'	=> array('UINT', 0), +						'topic_time'	=> array('TIMESTAMP', 0), +						'topic_time_limit'	=> array('TIMESTAMP', 0), +						'topic_views'	=> array('UINT', 0), +						'topic_replies'	=> array('UINT', 0), +						'topic_replies_real'	=> array('UINT', 0), +						'topic_status'	=> array('TINT:3', 0), +						'topic_type'	=> array('TINT:3', 0), +						'topic_first_post_id'	=> array('UINT', 0), +						'topic_first_poster_name'	=> array('VCHAR_UNI', ''), +						'topic_first_poster_colour'	=> array('VCHAR:6', ''), +						'topic_last_post_id'	=> array('UINT', 0), +						'topic_last_poster_id'	=> array('UINT', 0), +						'topic_last_poster_name'	=> array('VCHAR_UNI', ''), +						'topic_last_poster_colour'	=> array('VCHAR:6', ''), +						'topic_last_post_subject'	=> array('XSTEXT_UNI', ''), +						'topic_last_post_time'	=> array('TIMESTAMP', 0), +						'topic_last_view_time'	=> array('TIMESTAMP', 0), +						'topic_moved_id'	=> array('UINT', 0), +						'topic_bumped'	=> array('BOOL', 0), +						'topic_bumper'	=> array('UINT', 0), +						'poll_title'	=> array('STEXT_UNI', ''), +						'poll_start'	=> array('TIMESTAMP', 0), +						'poll_length'	=> array('TIMESTAMP', 0), +						'poll_max_options'	=> array('TINT:4', 1), +						'poll_last_vote'	=> array('TIMESTAMP', 0), +						'poll_vote_change'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> 'topic_id', +					'KEYS'	=> array( +						'forum_id'	=> array('INDEX', 'forum_id'), +						'forum_id_type'	=> array('INDEX', array('forum_id', 'topic_type')), +						'last_post_time'	=> array('INDEX', 'topic_last_post_time'), +						'topic_approved'	=> array('INDEX', 'topic_approved'), +						'forum_appr_last'	=> array('INDEX', array('forum_id', 'topic_approved', 'topic_last_post_id')), +						'fid_time_moved'	=> array('INDEX', array('forum_id', 'topic_last_post_time', 'topic_moved_id')), +					), +				), + +				$this->table_prefix . 'topics_track'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +						'topic_id'	=> array('UINT', 0), +						'forum_id'	=> array('UINT', 0), +						'mark_time'	=> array('TIMESTAMP', 0), +					), +					'PRIMARY_KEY'	=> array('user_id', 'topic_id'), +					'KEYS'	=> array( +						'forum_id'	=> array('INDEX', 'forum_id'), +					), +				), + +				$this->table_prefix . 'topics_posted'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +						'topic_id'	=> array('UINT', 0), +						'topic_posted'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> array('user_id', 'topic_id'), +				), + +				$this->table_prefix . 'topics_watch'	=> array( +					'COLUMNS'	=> array( +						'topic_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'notify_status'	=> array('BOOL', 0), +					), +					'KEYS'	=> array( +						'topic_id'	=> array('INDEX', 'topic_id'), +						'user_id'	=> array('INDEX', 'user_id'), +						'notify_stat'	=> array('INDEX', 'notify_status'), +					), +				), + +				$this->table_prefix . 'user_group'	=> array( +					'COLUMNS'	=> array( +						'group_id'	=> array('UINT', 0), +						'user_id'	=> array('UINT', 0), +						'group_leader'	=> array('BOOL', 0), +						'user_pending'	=> array('BOOL', 1), +					), +					'KEYS'	=> array( +						'group_id'	=> array('INDEX', 'group_id'), +						'user_id'	=> array('INDEX', 'user_id'), +						'group_leader'	=> array('INDEX', 'group_leader'), +					), +				), + +				$this->table_prefix . 'users'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', NULL, 'auto_increment'), +						'user_type'	=> array('TINT:2', 0), +						'group_id'	=> array('UINT', 3), +						'user_permissions'	=> array('MTEXT', ''), +						'user_perm_from'	=> array('UINT', 0), +						'user_ip'	=> array('VCHAR:40', ''), +						'user_regdate'	=> array('TIMESTAMP', 0), +						'username'	=> array('VCHAR_CI', ''), +						'username_clean'	=> array('VCHAR_CI', ''), +						'user_password'	=> array('VCHAR_UNI:40', ''), +						'user_passchg'	=> array('TIMESTAMP', 0), +						'user_pass_convert'	=> array('BOOL', 0), +						'user_email'	=> array('VCHAR_UNI:100', ''), +						'user_email_hash'	=> array('BINT', 0), +						'user_birthday'	=> array('VCHAR:10', ''), +						'user_lastvisit'	=> array('TIMESTAMP', 0), +						'user_lastmark'	=> array('TIMESTAMP', 0), +						'user_lastpost_time'	=> array('TIMESTAMP', 0), +						'user_lastpage'	=> array('VCHAR_UNI:200', ''), +						'user_last_confirm_key'	=> array('VCHAR:10', ''), +						'user_last_search'	=> array('TIMESTAMP', 0), +						'user_warnings'	=> array('TINT:4', 0), +						'user_last_warning'	=> array('TIMESTAMP', 0), +						'user_login_attempts'	=> array('TINT:4', 0), +						'user_inactive_reason'	=> array('TINT:2', 0), +						'user_inactive_time'	=> array('TIMESTAMP', 0), +						'user_posts'	=> array('UINT', 0), +						'user_lang'	=> array('VCHAR:30', ''), +						'user_timezone'	=> array('DECIMAL', 0), +						'user_dst'	=> array('BOOL', 0), +						'user_dateformat'	=> array('VCHAR_UNI:30', 'd M Y H:i'), +						'user_style'	=> array('USINT', 0), +						'user_rank'	=> array('UINT', 0), +						'user_colour'	=> array('VCHAR:6', ''), +						'user_new_privmsg'	=> array('INT:4', 0), +						'user_unread_privmsg'	=> array('INT:4', 0), +						'user_last_privmsg'	=> array('TIMESTAMP', 0), +						'user_message_rules'	=> array('BOOL', 0), +						'user_full_folder'	=> array('INT:11', -3), +						'user_emailtime'	=> array('TIMESTAMP', 0), +						'user_topic_show_days'	=> array('USINT', 0), +						'user_topic_sortby_type'	=> array('VCHAR:1', 't'), +						'user_topic_sortby_dir'	=> array('VCHAR:1', 'd'), +						'user_post_show_days'	=> array('USINT', 0), +						'user_post_sortby_type'	=> array('VCHAR:1', 't'), +						'user_post_sortby_dir'	=> array('VCHAR:1', 'a'), +						'user_notify'	=> array('BOOL', 0), +						'user_notify_pm'	=> array('BOOL', 1), +						'user_notify_type'	=> array('TINT:4', 0), +						'user_allow_pm'	=> array('BOOL', 1), +						'user_allow_viewonline'	=> array('BOOL', 1), +						'user_allow_viewemail'	=> array('BOOL', 1), +						'user_allow_massemail'	=> array('BOOL', 1), +						'user_options'	=> array('UINT:11', 895), +						'user_avatar'	=> array('VCHAR', ''), +						'user_avatar_type'	=> array('TINT:2', 0), +						'user_avatar_width'	=> array('USINT', 0), +						'user_avatar_height'	=> array('USINT', 0), +						'user_sig'	=> array('MTEXT_UNI', ''), +						'user_sig_bbcode_uid'	=> array('VCHAR:8', ''), +						'user_sig_bbcode_bitfield'	=> array('VCHAR:255', ''), +						'user_from'	=> array('VCHAR_UNI:100', ''), +						'user_icq'	=> array('VCHAR:15', ''), +						'user_aim'	=> array('VCHAR_UNI', ''), +						'user_yim'	=> array('VCHAR_UNI', ''), +						'user_msnm'	=> array('VCHAR_UNI', ''), +						'user_jabber'	=> array('VCHAR_UNI', ''), +						'user_website'	=> array('VCHAR_UNI:200', ''), +						'user_occ'	=> array('TEXT_UNI', ''), +						'user_interests'	=> array('TEXT_UNI', ''), +						'user_actkey'	=> array('VCHAR:32', ''), +						'user_newpasswd'	=> array('VCHAR_UNI:40', ''), +						'user_form_salt'	=> array('VCHAR_UNI:32', ''), + +					), +					'PRIMARY_KEY'	=> 'user_id', +					'KEYS'	=> array( +						'user_birthday'	=> array('INDEX', 'user_birthday'), +						'user_email_hash'	=> array('INDEX', 'user_email_hash'), +						'user_type'	=> array('INDEX', 'user_type'), +						'username_clean'	=> array('UNIQUE', 'username_clean'), +					), +				), + +				$this->table_prefix . 'warnings'	=> array( +					'COLUMNS'	=> array( +						'warning_id'	=> array('UINT', NULL, 'auto_increment'), +						'user_id'	=> array('UINT', 0), +						'post_id'	=> array('UINT', 0), +						'log_id'	=> array('UINT', 0), +						'warning_time'	=> array('TIMESTAMP', 0), +					), +					'PRIMARY_KEY'	=> 'warning_id', +				), + +				$this->table_prefix . 'words'	=> array( +					'COLUMNS'	=> array( +						'word_id'	=> array('UINT', NULL, 'auto_increment'), +						'word'	=> array('VCHAR_UNI', ''), +						'replacement'	=> array('VCHAR_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'word_id', +				), + +				$this->table_prefix . 'zebra'	=> array( +					'COLUMNS'	=> array( +						'user_id'	=> array('UINT', 0), +						'zebra_id'	=> array('UINT', 0), +						'friend'	=> array('BOOL', 0), +						'foe'	=> array('BOOL', 0), +					), +					'PRIMARY_KEY'	=> array('user_id', 'zebra_id'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables' => array( +				$this->table_prefix . 'attachments', +				$this->table_prefix . 'acl_groups', +				$this->table_prefix . 'acl_options', +				$this->table_prefix . 'acl_roles', +				$this->table_prefix . 'acl_roles_data', +				$this->table_prefix . 'acl_users', +				$this->table_prefix . 'banlist', +				$this->table_prefix . 'bbcodes', +				$this->table_prefix . 'bookmarks', +				$this->table_prefix . 'bots', +				$this->table_prefix . 'config', +				$this->table_prefix . 'confirm', +				$this->table_prefix . 'disallow', +				$this->table_prefix . 'drafts', +				$this->table_prefix . 'extensions', +				$this->table_prefix . 'extension_groups', +				$this->table_prefix . 'forums', +				$this->table_prefix . 'forums_access', +				$this->table_prefix . 'forums_track', +				$this->table_prefix . 'forums_watch', +				$this->table_prefix . 'groups', +				$this->table_prefix . 'icons', +				$this->table_prefix . 'lang', +				$this->table_prefix . 'log', +				$this->table_prefix . 'moderator_cache', +				$this->table_prefix . 'modules', +				$this->table_prefix . 'poll_options', +				$this->table_prefix . 'poll_votes', +				$this->table_prefix . 'posts', +				$this->table_prefix . 'privmsgs', +				$this->table_prefix . 'privmsgs_folder', +				$this->table_prefix . 'privmsgs_rules', +				$this->table_prefix . 'privmsgs_to', +				$this->table_prefix . 'profile_fields', +				$this->table_prefix . 'profile_fields_data', +				$this->table_prefix . 'profile_fields_lang', +				$this->table_prefix . 'profile_lang', +				$this->table_prefix . 'ranks', +				$this->table_prefix . 'reports', +				$this->table_prefix . 'reports_reasons', +				$this->table_prefix . 'search_results', +				$this->table_prefix . 'search_wordlist', +				$this->table_prefix . 'search_wordmatch', +				$this->table_prefix . 'sessions', +				$this->table_prefix . 'sessions_keys', +				$this->table_prefix . 'sitelist', +				$this->table_prefix . 'smilies', +				$this->table_prefix . 'styles', +				$this->table_prefix . 'styles_template', +				$this->table_prefix . 'styles_template_data', +				$this->table_prefix . 'styles_theme', +				$this->table_prefix . 'styles_imageset', +				$this->table_prefix . 'styles_imageset_data', +				$this->table_prefix . 'topics', +				$this->table_prefix . 'topics_track', +				$this->table_prefix . 'topics_posted', +				$this->table_prefix . 'topics_watch', +				$this->table_prefix . 'user_group', +				$this->table_prefix . 'users', +				$this->table_prefix . 'warnings', +				$this->table_prefix . 'words', +				$this->table_prefix . 'zebra', +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_1.php new file mode 100644 index 0000000000..f5c7e56a81 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_1.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_1_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_10.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10.php new file mode 100644 index 0000000000..0d3a1ca80b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_10 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.10', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_10_rc3'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.10')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc1.php new file mode 100644 index 0000000000..293c46cb06 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc1.php @@ -0,0 +1,36 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_10_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.10-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_9'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('email_max_chunk_size', 50)), + +			array('config.update', array('version', '3.0.10-RC1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc2.php new file mode 100644 index 0000000000..f2889120e6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc2.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_10_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.10-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_10_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.10-RC2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc3.php new file mode 100644 index 0000000000..9d6697ab7f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_10_rc3.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_10_rc3 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.10-RC3', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_10_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.10-RC3')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_11.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11.php new file mode 100644 index 0000000000..e77b54a1b5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_11 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.11', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.11')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc1.php new file mode 100644 index 0000000000..ed2dabf51c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc1.php @@ -0,0 +1,101 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_11_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.11-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_10'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'cleanup_deactivated_styles'))), +			array('custom', array(array(&$this, 'delete_orphan_private_messages'))), + +			array('config.update', array('version', '3.0.11-RC1')), +		); +	} + +	public function cleanup_deactivated_styles() +	{ +		// Updates users having current style a deactivated one +		$sql = 'SELECT style_id +			FROM ' . STYLES_TABLE . ' +			WHERE style_active = 0'; +		$result = $this->sql_query($sql); + +		$deactivated_style_ids = array(); +		while ($style_id = $this->db->sql_fetchfield('style_id', false, $result)) +		{ +			$deactivated_style_ids[] = (int) $style_id; +		} +		$this->db->sql_freeresult($result); + +		if (!empty($deactivated_style_ids)) +		{ +			$sql = 'UPDATE ' . USERS_TABLE . ' +				SET user_style = ' . (int) $this->config['default_style'] .' +				WHERE ' . $this->db->sql_in_set('user_style', $deactivated_style_ids); +			$this->sql_query($sql); +		} +	} + +	public function delete_orphan_private_messages() +	{ +		// Delete orphan private messages +		$batch_size = 500; + +		$sql_array = array( +			'SELECT'	=> 'p.msg_id', +			'FROM'		=> array( +				PRIVMSGS_TABLE	=> 'p', +			), +			'LEFT_JOIN'	=> array( +				array( +					'FROM'	=> array(PRIVMSGS_TO_TABLE => 't'), +					'ON'	=> 'p.msg_id = t.msg_id', +				), +			), +			'WHERE'		=> 't.user_id IS NULL', +		); +		$sql = $this->db->sql_build_query('SELECT', $sql_array); + +		$result = $this->db->sql_query_limit($sql, $batch_size); + +		$delete_pms = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$delete_pms[] = (int) $row['msg_id']; +		} +		$this->db->sql_freeresult($result); + +		if (!empty($delete_pms)) +		{ +			$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' +				WHERE ' . $this->db->sql_in_set('msg_id', $delete_pms); +			$this->sql_query($sql); + +			// Return false to have the Migrator call this function again +			return false; +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc2.php new file mode 100644 index 0000000000..45d88708bd --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_11_rc2.php @@ -0,0 +1,56 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_11_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.11-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11_rc1'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue' => array('BOOL', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.11-RC2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php new file mode 100644 index 0000000000..c489c0c0e8 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_12 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.12', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc3'); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				phpbb_version_compare($this->config['version'], '3.0.12', '<'), +				array('config.update', array('version', '3.0.12')), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc1.php new file mode 100644 index 0000000000..8600472cca --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc1.php @@ -0,0 +1,129 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +/** @todo DROP LOGIN_ATTEMPT_TABLE.attempt_id in 3.0.12-RC1 **/ + +class release_3_0_12_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.12-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'update_module_auth'))), +			array('custom', array(array(&$this, 'update_bots'))), +			array('custom', array(array(&$this, 'disable_bots_from_receiving_pms'))), + +			array('config.update', array('version', '3.0.12-RC1')), +		); +	} + +	public function disable_bots_from_receiving_pms() +	{ +		// Disable receiving pms for bots +		$sql = 'SELECT user_id +			FROM ' . BOTS_TABLE; +		$result = $this->db->sql_query($sql); + +		$bot_user_ids = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$bot_user_ids[] = (int) $row['user_id']; +		} +		$this->db->sql_freeresult($result); + +		if (!empty($bot_user_ids)) +		{ +			$sql = 'UPDATE ' . USERS_TABLE . ' +				SET user_allow_pm = 0 +				WHERE ' . $this->db->sql_in_set('user_id', $bot_user_ids); +			$this->sql_query($sql); +		} +	} + +	public function update_module_auth() +	{ +		$sql = 'UPDATE ' . MODULES_TABLE . ' +			SET module_auth = \'acl_u_sig\' +			WHERE module_class = \'ucp\' +				AND module_basename = \'profile\' +				AND module_mode = \'signature\''; +		$this->sql_query($sql); +	} + +	public function update_bots() +	{ +		// Update bots +		if (!function_exists('user_delete')) +		{ +			include($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext); +		} + +		$bots_updates = array( +			// Bot Deletions +			'NG-Search [Bot]'		=> false, +			'Nutch/CVS [Bot]'		=> false, +			'OmniExplorer [Bot]'	=> false, +			'Seekport [Bot]'		=> false, +			'Synoo [Bot]'			=> false, +			'WiseNut [Bot]'			=> false, + +			// Bot Updates +			// Bot name to bot user agent map +			'Baidu [Spider]'	=> 'Baiduspider', +			'Exabot [Bot]'		=> 'Exabot', +			'Voyager [Bot]'		=> 'voyager/', +			'W3C [Validator]'	=> 'W3C_Validator', +		); + +		foreach ($bots_updates as $bot_name => $bot_agent) +		{ +			$sql = 'SELECT user_id +				FROM ' . USERS_TABLE . ' +				WHERE user_type = ' . USER_IGNORE . " +					AND username_clean = '" . $this->db->sql_escape(utf8_clean_string($bot_name)) . "'"; +			$result = $this->db->sql_query($sql); +			$bot_user_id = (int) $this->db->sql_fetchfield('user_id'); +			$this->db->sql_freeresult($result); + +			if ($bot_user_id) +			{ +				if ($bot_agent === false) +				{ +					$sql = 'DELETE FROM ' . BOTS_TABLE . " +						WHERE user_id = $bot_user_id"; +					$this->sql_query($sql); + +					user_delete('retain', $bot_user_id); +				} +				else +				{ +					$sql = 'UPDATE ' . BOTS_TABLE . " +						SET bot_agent = '" .  $this->db->sql_escape($bot_agent) . "' +						WHERE user_id = $bot_user_id"; +					$this->sql_query($sql); +				} +			} +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php new file mode 100644 index 0000000000..8fac273073 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc2.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_12_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.12-RC2', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				phpbb_version_compare($this->config['version'], '3.0.12-RC2', '<'), +				array('config.update', array('version', '3.0.12-RC2')), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php new file mode 100644 index 0000000000..fb1b8014a4 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_12_rc3.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_12_rc3 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.12-RC3', '>=') && phpbb_version_compare($this->config['version'], '3.1.0-dev', '<'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_12_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				phpbb_version_compare($this->config['version'], '3.0.12-RC3', '<'), +				array('config.update', array('version', '3.0.12-RC3')), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_1_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_1_rc1.php new file mode 100644 index 0000000000..d1ae0b9cbc --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_1_rc1.php @@ -0,0 +1,119 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_1_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.1-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_0'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'forums' => array( +					'display_subforum_list' => array('BOOL', 1), +				), +				$this->table_prefix . 'sessions' => array( +					'session_forum_id' => array('UINT', 0), +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'groups' => array( +					'group_legend', +				), +			), +			'add_index' => array( +				$this->table_prefix . 'sessions' => array( +					'session_forum_id' => array('session_forum_id'), +				), +				$this->table_prefix . 'groups' => array( +					'group_legend_name' => array('group_legend', 'group_name'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'forums' => array( +					'display_subforum_list', +				), +				$this->table_prefix . 'sessions' => array( +					'session_forum_id', +				), +			), +			'add_index' => array( +				$this->table_prefix . 'groups' => array( +					'group_legend' => array('group_legend'), +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'sessions' => array( +					'session_forum_id', +				), +				$this->table_prefix . 'groups' => array( +					'group_legend_name', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'fix_unset_last_view_time'))), +			array('custom', array(array(&$this, 'reset_smiley_size'))), + +			array('config.update', array('version', '3.0.1-RC1')), +		); +	} + +	public function fix_unset_last_view_time() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . "topics +			SET topic_last_view_time = topic_last_post_time +			WHERE topic_last_view_time = 0"; +		$this->sql_query($sql); +	} + +	public function reset_smiley_size() +	{ +		// Update smiley sizes +		$smileys = array('icon_e_surprised.gif', 'icon_eek.gif', 'icon_cool.gif', 'icon_lol.gif', 'icon_mad.gif', 'icon_razz.gif', 'icon_redface.gif', 'icon_cry.gif', 'icon_evil.gif', 'icon_twisted.gif', 'icon_rolleyes.gif', 'icon_exclaim.gif', 'icon_question.gif', 'icon_idea.gif', 'icon_arrow.gif', 'icon_neutral.gif', 'icon_mrgreen.gif', 'icon_e_ugeek.gif'); + +		foreach ($smileys as $smiley) +		{ +			if (file_exists($this->phpbb_root_path . 'images/smilies/' . $smiley)) +			{ +				list($width, $height) = getimagesize($this->phpbb_root_path . 'images/smilies/' . $smiley); + +				$sql = 'UPDATE ' . SMILIES_TABLE . ' +					SET smiley_width = ' . $width . ', smiley_height = ' . $height . " +					WHERE smiley_url = '" . $this->db->sql_escape($smiley) . "'"; + +				$this->sql_query($sql); +			} +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2.php new file mode 100644 index 0000000000..c08f01dbeb --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_2_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc1.php new file mode 100644 index 0000000000..2e7f141a9b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc1.php @@ -0,0 +1,38 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_2_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.2-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('referer_validation', '1')), +			array('config.add', array('check_attachment_content', '1')), +			array('config.add', array('mime_triggers', 'body|head|html|img|plaintext|a href|pre|script|table|title')), + +			array('config.update', array('version', '3.0.2-RC1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc2.php new file mode 100644 index 0000000000..bde5febc59 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_2_rc2.php @@ -0,0 +1,86 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_2_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.2-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_2_rc1'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns' => array( +				$this->table_prefix . 'drafts' => array( +					'draft_subject' => array('STEXT_UNI', ''), +				), +				$this->table_prefix . 'forums' => array( +					'forum_last_post_subject' => array('STEXT_UNI', ''), +				), +				$this->table_prefix . 'posts' => array( +					'post_subject' => array('STEXT_UNI', '', 'true_sort'), +				), +				$this->table_prefix . 'privmsgs' => array( +					'message_subject' => array('STEXT_UNI', ''), +				), +				$this->table_prefix . 'topics' => array( +					'topic_title' => array('STEXT_UNI', '', 'true_sort'), +					'topic_last_post_subject' => array('STEXT_UNI', ''), +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'sessions' => array( +					'session_forum_id', +				), +			), +			'add_index' => array( +				$this->table_prefix . 'sessions' => array( +					'session_fid' => array('session_forum_id'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_index' => array( +				$this->table_prefix . 'sessions' => array( +					'session_forum_id' => array( +						'session_forum_id', +					), +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'sessions' => array( +					'session_fid', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.2-RC2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_3.php new file mode 100644 index 0000000000..c277da224c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_3.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_3 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.3', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_3_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.3')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_3_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_3_rc1.php new file mode 100644 index 0000000000..530eaf47e6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_3_rc1.php @@ -0,0 +1,89 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_3_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.3-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_2'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'styles_template' => array( +					'template_inherits_id' => array('UINT:4', 0), +					'template_inherit_path' => array('VCHAR', ''), +				), +				$this->table_prefix . 'groups' => array( +					'group_max_recipients' => array('UINT', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'styles_template' => array( +					'template_inherits_id', +					'template_inherit_path', +				), +				$this->table_prefix . 'groups' => array( +					'group_max_recipients', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('enable_queue_trigger', '0')), +			array('config.add', array('queue_trigger_posts', '3')), +			array('config.add', array('pm_max_recipients', '0')), +			array('custom', array(array(&$this, 'set_group_default_max_recipients'))), +			array('config.add', array('dbms_version', $this->db->sql_server_info(true))), +			array('permission.add', array('u_masspm_group', true, 'u_masspm')), +			array('custom', array(array(&$this, 'correct_acp_email_permissions'))), + +			array('config.update', array('version', '3.0.3-RC1')), +		); +	} + +	public function correct_acp_email_permissions() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . 'modules +			SET module_auth = \'acl_a_email && cfg_email_enable\' +			WHERE module_class = \'acp\' +				AND module_basename = \'email\''; +		$this->sql_query($sql); +	} + +	public function set_group_default_max_recipients() +	{ +		// Set maximum number of recipients for the registered users, bots, guests group +		$sql = 'UPDATE ' . GROUPS_TABLE . ' SET group_max_recipients = 5 +			WHERE ' . $this->db->sql_in_set('group_name', array('GUESTS', 'REGISTERED', 'REGISTERED_COPPA', 'BOTS')); +		$this->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php new file mode 100644 index 0000000000..9b08da0125 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_4 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.4', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_4_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'rename_log_delete_topic'))), + +			array('config.update', array('version', '3.0.4')), +		); +	} + +	public function rename_log_delete_topic() +	{ +		if ($this->db->get_sql_layer() == 'oracle') +		{ +			// log_operation is CLOB - but we can change this later +			$sql = 'UPDATE ' . $this->table_prefix . "log +				SET log_operation = 'LOG_DELETE_TOPIC' +				WHERE log_operation LIKE 'LOG_TOPIC_DELETED'"; +			$this->sql_query($sql); +		} +		else +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "log +				SET log_operation = 'LOG_DELETE_TOPIC' +				WHERE log_operation = 'LOG_TOPIC_DELETED'"; +			$this->sql_query($sql); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_4_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4_rc1.php new file mode 100644 index 0000000000..10343438b3 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_4_rc1.php @@ -0,0 +1,129 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_4_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.4-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_3'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_profile' => array('BOOL', 0), +				), +			), +			'change_columns' => array( +				$this->table_prefix . 'styles' => array( +					'style_id' => array('UINT', NULL, 'auto_increment'), +					'template_id' => array('UINT', 0), +					'theme_id' => array('UINT', 0), +					'imageset_id' => array('UINT', 0), +				), +				$this->table_prefix . 'styles_imageset' => array( +					'imageset_id' => array('UINT', NULL, 'auto_increment'), +				), +				$this->table_prefix . 'styles_imageset_data' => array( +					'image_id' => array('UINT', NULL, 'auto_increment'), +					'imageset_id' => array('UINT', 0), +				), +				$this->table_prefix . 'styles_theme' => array( +					'theme_id' => array('UINT', NULL, 'auto_increment'), +				), +				$this->table_prefix . 'styles_template' => array( +					'template_id' => array('UINT', NULL, 'auto_increment'), +				), +				$this->table_prefix . 'styles_template_data' => array( +					'template_id' => array('UINT', 0), +				), +				$this->table_prefix . 'forums' => array( +					'forum_style' => array('UINT', 0), +				), +				$this->table_prefix . 'users' => array( +					'user_style' => array('UINT', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_profile', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'update_custom_profile_fields'))), + +			array('config.update', array('version', '3.0.4-RC1')), +		); +	} + +	public function update_custom_profile_fields() +	{ +		// Update the Custom Profile Fields based on previous settings to the new \format +		$sql = 'SELECT field_id, field_required, field_show_on_reg, field_hide +				FROM ' . PROFILE_FIELDS_TABLE; +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$sql_ary = array( +				'field_required'	=> 0, +				'field_show_on_reg'	=> 0, +				'field_hide'		=> 0, +				'field_show_profile'=> 0, +			); + +			if ($row['field_required']) +			{ +				$sql_ary['field_required'] = $sql_ary['field_show_on_reg'] = $sql_ary['field_show_profile'] = 1; +			} +			else if ($row['field_show_on_reg']) +			{ +				$sql_ary['field_show_on_reg'] = $sql_ary['field_show_profile'] = 1; +			} +			else if ($row['field_hide']) +			{ +				// Only administrators and moderators can see this CPF, if the view is enabled, they can see it, otherwise just admins in the acp_users module +				$sql_ary['field_hide'] = 1; +			} +			else +			{ +				// equivelant to "none", which is the "Display in user control panel" option +				$sql_ary['field_show_profile'] = 1; +			} + +			$this->sql_query('UPDATE ' . $this->table_prefix . 'profile_fields SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' WHERE field_id = ' . $row['field_id'], $errored, $error_ary); +		} + +		$this->db->sql_freeresult($result); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_5.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5.php new file mode 100644 index 0000000000..09c2bfea50 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_5 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.5', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_5_rc1part2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.5')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1.php new file mode 100644 index 0000000000..f593c32181 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1.php @@ -0,0 +1,130 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_5_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.5-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_4'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns' => array( +				$this->table_prefix . 'forums' => array( +					'forum_style' => array('UINT', 0), +				), +			), +		); +	} + +	public function update_data() +	{ +		$search_indexing_state = $this->config['search_indexing_state']; + +		return array( +			array('config.add', array('captcha_gd_wave', 0)), +			array('config.add', array('captcha_gd_3d_noise', 1)), +			array('config.add', array('captcha_gd_fonts', 1)), +			array('config.add', array('confirm_refresh', 1)), +			array('config.add', array('max_num_search_keywords', 10)), +			array('config.remove', array('search_indexing_state')), +			array('config.add', array('search_indexing_state', $search_indexing_state, true)), +			array('custom', array(array(&$this, 'hash_old_passwords'))), +			array('custom', array(array(&$this, 'update_ichiro_bot'))), +		); +	} + +	public function hash_old_passwords() +	{ +		$sql = 'SELECT user_id, user_password +				FROM ' . $this->table_prefix . 'users +				WHERE user_pass_convert = 1'; +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			if (strlen($row['user_password']) == 32) +			{ +				$sql_ary = array( +					'user_password'	=> phpbb_hash($row['user_password']), +				); + +				$this->sql_query('UPDATE ' . $this->table_prefix . 'users SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' WHERE user_id = ' . $row['user_id']); +			} +		} +		$this->db->sql_freeresult($result); +	} + +	public function update_ichiro_bot() +	{ +		// Adjust bot entry +		$sql = 'UPDATE ' . $this->table_prefix . "bots +			SET bot_agent = 'ichiro/' +			WHERE bot_agent = 'ichiro/2'"; +		$this->sql_query($sql); +	} + +	public function remove_duplicate_auth_options() +	{ +		// Before we are able to add a unique key to auth_option, we need to remove duplicate entries +		$sql = 'SELECT auth_option +			FROM ' . $this->table_prefix . 'acl_options +			GROUP BY auth_option +			HAVING COUNT(*) >= 2'; +		$result = $this->db->sql_query($sql); + +		$auth_options = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$auth_options[] = $row['auth_option']; +		} +		$this->db->sql_freeresult($result); + +		// Remove specific auth options +		if (!empty($auth_options)) +		{ +			foreach ($auth_options as $option) +			{ +				// Select auth_option_ids... the largest id will be preserved +				$sql = 'SELECT auth_option_id +					FROM ' . ACL_OPTIONS_TABLE . " +					WHERE auth_option = '" . $db->sql_escape($option) . "' +					ORDER BY auth_option_id DESC"; +				// sql_query_limit not possible here, due to bug in postgresql layer +				$result = $this->db->sql_query($sql); + +				// Skip first row, this is our original auth option we want to preserve +				$row = $this->db->sql_fetchrow($result); + +				while ($row = $this->db->sql_fetchrow($result)) +				{ +					// Ok, remove this auth option... +					$this->sql_query('DELETE FROM ' . ACL_OPTIONS_TABLE . ' WHERE auth_option_id = ' . $row['auth_option_id']); +					$this->sql_query('DELETE FROM ' . ACL_ROLES_DATA_TABLE . ' WHERE auth_option_id = ' . $row['auth_option_id']); +					$this->sql_query('DELETE FROM ' . ACL_GROUPS_TABLE . ' WHERE auth_option_id = ' . $row['auth_option_id']); +					$this->sql_query('DELETE FROM ' . ACL_USERS_TABLE . ' WHERE auth_option_id = ' . $row['auth_option_id']); +				} +				$this->db->sql_freeresult($result); +			} +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1part2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1part2.php new file mode 100644 index 0000000000..a9041ef354 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_5_rc1part2.php @@ -0,0 +1,48 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_5_rc1part2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.5-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_5_rc1'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_keys'			=> array( +				$this->table_prefix . 'acl_options'		=> array('auth_option'), +			), +			'add_unique_index'	=> array( +				$this->table_prefix . 'acl_options'		=> array( +					'auth_option'		=> array('auth_option'), +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.5-RC1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6.php new file mode 100644 index 0000000000..74c338a9c5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_6 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.6', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_6_rc4'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.6')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php new file mode 100644 index 0000000000..faef68121d --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc1.php @@ -0,0 +1,330 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_6_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.6-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_5'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'confirm' => array( +					'attempts' => array('UINT', 0), +				), +				$this->table_prefix . 'users' => array( +					'user_new' => array('BOOL', 1), +					'user_reminded' => array('TINT:4', 0), +					'user_reminded_time' => array('TIMESTAMP', 0), +				), +				$this->table_prefix . 'groups' => array( +					'group_skip_auth' => array('BOOL', 0, 'after' => 'group_founder_manage'), +				), +				$this->table_prefix . 'privmsgs' => array( +					'message_reported' => array('BOOL', 0), +				), +				$this->table_prefix . 'reports' => array( +					'pm_id' => array('UINT', 0), +				), +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_vt' => array('BOOL', 0), +				), +				$this->table_prefix . 'forums' => array( +					'forum_options' => array('UINT:20', 0), +				), +			), +			'change_columns' => array( +				$this->table_prefix . 'users' => array( +					'user_options' => array('UINT:11', 230271), +				), +			), +			'add_index' => array( +				$this->table_prefix . 'reports' => array( +					'post_id' => array('post_id'), +					'pm_id' => array('pm_id'), +				), +				$this->table_prefix . 'posts' => array( +					'post_username' => array('post_username:255'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'confirm' => array( +					'attempts', +				), +				$this->table_prefix . 'users' => array( +					'user_new', +					'user_reminded', +					'user_reminded_time', +				), +				$this->table_prefix . 'groups' => array( +					'group_skip_auth', +				), +				$this->table_prefix . 'privmsgs' => array( +					'message_reported', +				), +				$this->table_prefix . 'reports' => array( +					'pm_id', +				), +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_vt', +				), +				$this->table_prefix . 'forums' => array( +					'forum_options', +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'reports' => array( +					'post_id', +					'pm_id', +				), +				$this->table_prefix . 'posts' => array( +					'post_username', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('captcha_plugin', 'phpbb_captcha_nogd')), +			array('if', array( +				($this->config['captcha_gd']), +				array('config.update', array('captcha_plugin', 'phpbb_captcha_gd')), +			)), + +			array('config.add', array('feed_enable', 0)), +			array('config.add', array('feed_limit', 10)), +			array('config.add', array('feed_overall_forums', 1)), +			array('config.add', array('feed_overall_forums_limit', 15)), +			array('config.add', array('feed_overall_topics', 0)), +			array('config.add', array('feed_overall_topics_limit', 15)), +			array('config.add', array('feed_forum', 1)), +			array('config.add', array('feed_topic', 1)), +			array('config.add', array('feed_item_statistics', 1)), + +			array('config.add', array('smilies_per_page', 50)), +			array('config.add', array('allow_pm_report', 1)), +			array('config.add', array('min_post_chars', 1)), +			array('config.add', array('allow_quick_reply', 1)), +			array('config.add', array('new_member_post_limit', 0)), +			array('config.add', array('new_member_group_default', 0)), +			array('config.add', array('delete_time', $this->config['edit_time'])), + +			array('config.add', array('allow_avatar', 0)), +			array('if', array( +				($this->config['allow_avatar_upload'] || $this->config['allow_avatar_local'] || $this->config['allow_avatar_remote']), +				array('config.update', array('allow_avatar', 1)), +			)), +			array('config.add', array('allow_avatar_remote_upload', 0)), +			array('if', array( +				($this->config['allow_avatar_remote'] && $this->config['allow_avatar_upload']), +				array('config.update', array('allow_avatar_remote_upload', 1)), +			)), + +			array('module.add', array( +				'acp', +				'ACP_BOARD_CONFIGURATION', +				array( +					'module_basename'	=> 'acp_board', +					'modes'				=> array('feed'), +				), +			)), +			array('module.add', array( +				'acp', +				'ACP_CAT_USERS', +				array( +					'module_basename'	=> 'acp_users', +					'modes'				=> array('warnings'), +				), +			)), +			array('module.add', array( +				'acp', +				'ACP_SERVER_CONFIGURATION', +				array( +					'module_basename'	=> 'acp_send_statistics', +					'modes'				=> array('send_statistics'), +				), +			)), +			array('module.add', array( +				'acp', +				'ACP_FORUM_BASED_PERMISSIONS', +				array( +					'module_basename'	=> 'acp_permissions', +					'modes'				=> array('setting_forum_copy'), +				), +			)), +			array('module.add', array( +				'mcp', +				'MCP_REPORTS', +				array( +					'module_basename'	=> 'mcp_pm_reports', +					'modes'				=> array('pm_reports','pm_reports_closed','pm_report_details'), +				), +			)), +			array('custom', array(array(&$this, 'add_newly_registered_group'))), +			array('custom', array(array(&$this, 'set_user_options_default'))), + +			array('config.update', array('version', '3.0.6-RC1')), +		); +	} + +	public function set_user_options_default() +	{ +		// 229376 is the added value to enable all three signature options +		$sql = 'UPDATE ' . USERS_TABLE . ' SET user_options = user_options + 229376'; +		$this->sql_query($sql); +	} + +	public function add_newly_registered_group() +	{ +		// Add newly_registered group... but check if it already exists (we always supported running the updater on any schema) +		$sql = 'SELECT group_id +			FROM ' . GROUPS_TABLE . " +			WHERE group_name = 'NEWLY_REGISTERED'"; +		$result = $this->db->sql_query($sql); +		$group_id = (int) $this->db->sql_fetchfield('group_id'); +		$this->db->sql_freeresult($result); + +		if (!$group_id) +		{ +			$sql = 'INSERT INTO ' .  GROUPS_TABLE . " (group_name, group_type, group_founder_manage, group_colour, group_legend, group_avatar, group_desc, group_desc_uid, group_max_recipients) VALUES ('NEWLY_REGISTERED', 3, 0, '', 0, '', '', '', 5)"; +			$this->sql_query($sql); + +			$group_id = $this->db->sql_nextid(); +		} + +		// Insert new user role... at the end of the chain +		$sql = 'SELECT role_id +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_name = 'ROLE_USER_NEW_MEMBER' +				AND role_type = 'u_'"; +		$result = $this->db->sql_query($sql); +		$u_role = (int) $this->db->sql_fetchfield('role_id'); +		$this->db->sql_freeresult($result); + +		if (!$u_role) +		{ +			$sql = 'SELECT MAX(role_order) as max_order_id +				FROM ' . ACL_ROLES_TABLE . " +				WHERE role_type = 'u_'"; +			$result = $this->db->sql_query($sql); +			$next_order_id = (int) $this->db->sql_fetchfield('max_order_id'); +			$this->db->sql_freeresult($result); + +			$next_order_id++; + +			$sql = 'INSERT INTO ' . ACL_ROLES_TABLE . " (role_name, role_description, role_type, role_order) VALUES ('ROLE_USER_NEW_MEMBER', 'ROLE_DESCRIPTION_USER_NEW_MEMBER', 'u_', $next_order_id)"; +			$this->sql_query($sql); +			$u_role = $this->db->sql_nextid(); + +			// Now add the correct data to the roles... +			// The standard role says that new users are not able to send a PM, Mass PM, are not able to PM groups +			$sql = 'INSERT INTO ' . ACL_ROLES_DATA_TABLE . " (role_id, auth_option_id, auth_setting) SELECT $u_role, auth_option_id, 0 FROM " . ACL_OPTIONS_TABLE . " WHERE auth_option LIKE 'u_%' AND auth_option IN ('u_sendpm', 'u_masspm', 'u_masspm_group')"; +			$this->sql_query($sql); + +			// Add user role to group +			$sql = 'INSERT INTO ' . ACL_GROUPS_TABLE . " (group_id, forum_id, auth_option_id, auth_role_id, auth_setting) VALUES ($group_id, 0, 0, $u_role, 0)"; +			$this->sql_query($sql); +		} + +		// Insert new forum role +		$sql = 'SELECT role_id +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_name = 'ROLE_FORUM_NEW_MEMBER' +				AND role_type = 'f_'"; +		$result = $this->db->sql_query($sql); +		$f_role = (int) $this->db->sql_fetchfield('role_id'); +		$this->db->sql_freeresult($result); + +		if (!$f_role) +		{ +			$sql = 'SELECT MAX(role_order) as max_order_id +				FROM ' . ACL_ROLES_TABLE . " +				WHERE role_type = 'f_'"; +			$result = $this->db->sql_query($sql); +			$next_order_id = (int) $this->db->sql_fetchfield('max_order_id'); +			$this->db->sql_freeresult($result); + +			$next_order_id++; + +			$sql = 'INSERT INTO ' . ACL_ROLES_TABLE . " (role_name, role_description, role_type, role_order) VALUES  ('ROLE_FORUM_NEW_MEMBER', 'ROLE_DESCRIPTION_FORUM_NEW_MEMBER', 'f_', $next_order_id)"; +			$this->sql_query($sql); +			$f_role = $this->db->sql_nextid(); + +			$sql = 'INSERT INTO ' . ACL_ROLES_DATA_TABLE . " (role_id, auth_option_id, auth_setting) SELECT $f_role, auth_option_id, 0 FROM " . ACL_OPTIONS_TABLE . " WHERE auth_option LIKE 'f_%' AND auth_option IN ('f_noapprove')"; +			$this->sql_query($sql); +		} + +		// Set every members user_new column to 0 (old users) only if there is no one yet (this makes sure we do not execute this more than once) +		$sql = 'SELECT 1 +			FROM ' . USERS_TABLE . ' +			WHERE user_new = 0'; +		$result = $this->db->sql_query_limit($sql, 1); +		$row = $this->db->sql_fetchrow($result); +		$this->db->sql_freeresult($result); + +		if (!$row) +		{ +			$sql = 'UPDATE ' . USERS_TABLE . ' SET user_new = 0'; +			$this->sql_query($sql); +		} + +		// To mimick the old "feature" we will assign the forum role to every forum, regardless of the setting (this makes sure there are no "this does not work!!!! YUO!!!" posts... +		// Check if the role is already assigned... +		$sql = 'SELECT forum_id +			FROM ' . ACL_GROUPS_TABLE . ' +			WHERE group_id = ' . $group_id . ' +				AND auth_role_id = ' . $f_role; +		$result = $this->db->sql_query($sql); +		$is_options = (int) $this->db->sql_fetchfield('forum_id'); +		$this->db->sql_freeresult($result); + +		// Not assigned at all... :/ +		if (!$is_options) +		{ +			// Get postable forums +			$sql = 'SELECT forum_id +				FROM ' . FORUMS_TABLE . ' +				WHERE forum_type != ' . FORUM_LINK; +			$result = $this->db->sql_query($sql); + +			while ($row = $this->db->sql_fetchrow($result)) +			{ +				$this->sql_query('INSERT INTO ' . ACL_GROUPS_TABLE . ' (group_id, forum_id, auth_option_id, auth_role_id, auth_setting) VALUES (' . $group_id . ', ' . (int) $row['forum_id'] . ', 0, ' . $f_role . ', 0)'); +			} +			$this->db->sql_freeresult($result); +		} + +		// Clear permissions... +		include_once($this->phpbb_root_path . 'includes/acp/auth.' . $this->php_ext); +		$auth_admin = new \auth_admin(); +		$auth_admin->acl_clear_prefetch(); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc2.php new file mode 100644 index 0000000000..c52b71d8fa --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc2.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_6_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.6-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_6_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.6-RC2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc3.php new file mode 100644 index 0000000000..2db3341b0a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc3.php @@ -0,0 +1,46 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_6_rc3 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.6-RC3', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_6_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'update_cp_fields'))), + +			array('config.update', array('version', '3.0.6-RC3')), +		); +	} + +	public function update_cp_fields() +	{ +		// Update the Custom Profile Fields based on previous settings to the new \format +		$sql = 'UPDATE ' . PROFILE_FIELDS_TABLE . ' +			SET field_show_on_vt = 1 +			WHERE field_hide = 0 +				AND (field_required = 1 OR field_show_on_reg = 1 OR field_show_profile = 1)'; +		$this->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc4.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc4.php new file mode 100644 index 0000000000..5734db25e6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_6_rc4.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_6_rc4 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.6-RC4', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_6_rc3'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.6-RC4')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7.php new file mode 100644 index 0000000000..d1d602819d --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_7 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.7', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_7_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.7')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_pl1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_pl1.php new file mode 100644 index 0000000000..784e810f14 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_pl1.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_7_pl1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.7-pl1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_7'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.7-pl1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php new file mode 100644 index 0000000000..1843c3f262 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc1.php @@ -0,0 +1,82 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_7_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.7-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_6'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_keys' => array( +				$this->table_prefix . 'log' => array( +					'log_time', +				), +			), +			'add_index' => array( +				$this->table_prefix . 'topics_track' => array( +					'topic_id' => array('topic_id'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_index' => array( +				$this->table_prefix . 'log' => array( +					'log_time'	=> array('log_time'), +				), +			), +			'drop_keys' => array( +				$this->table_prefix . 'topics_track' => array( +					'topic_id', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('feed_overall', 1)), +			array('config.add', array('feed_http_auth', 0)), +			array('config.add', array('feed_limit_post', $this->config['feed_limit'])), +			array('config.add', array('feed_limit_topic', $this->config['feed_overall_topics_limit'])), +			array('config.add', array('feed_topics_new', $this->config['feed_overall_topics'])), +			array('config.add', array('feed_topics_active', $this->config['feed_overall_topics'])), +			array('custom', array(array(&$this, 'delete_text_templates'))), + +			array('config.update', array('version', '3.0.7-RC1')), +		); +	} + +	public function delete_text_templates() +	{ +		// Delete all text-templates from the template_data +		$sql = 'DELETE FROM ' . STYLES_TEMPLATE_DATA_TABLE . ' +			WHERE template_filename ' . $this->db->sql_like_expression($this->db->get_any_char() . '.txt'); +		$this->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc2.php new file mode 100644 index 0000000000..e497a38765 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_7_rc2.php @@ -0,0 +1,79 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_7_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.7-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_7_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'update_email_hash'))), + +			array('config.update', array('version', '3.0.7-RC2')), +		); +	} + +	public function update_email_hash($start = 0) +	{ +		$limit = 1000; + +		$sql = 'SELECT user_id, user_email, user_email_hash +			FROM ' . USERS_TABLE . ' +			WHERE user_type <> ' . USER_IGNORE . " +				AND user_email <> ''"; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		$i = 0; +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$i++; + +			// Snapshot of the phpbb_email_hash() function +			// We cannot call it directly because the auto updater updates the DB first. :/ +			$user_email_hash = sprintf('%u', crc32(strtolower($row['user_email']))) . strlen($row['user_email']); + +			if ($user_email_hash != $row['user_email_hash']) +			{ +				$sql_ary = array( +					'user_email_hash'	=> $user_email_hash, +				); + +				$sql = 'UPDATE ' . USERS_TABLE . ' +					SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' +					WHERE user_id = ' . (int) $row['user_id']; +				$this->sql_query($sql); +			} +		} +		$this->db->sql_freeresult($result); + +		if ($i < $limit) +		{ +			// Completed +			return; +		} + +		// Return the next start, will be sent to $start when this function is called again +		return $start + $limit; +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_8.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8.php new file mode 100644 index 0000000000..04b5bd4a13 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_8 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.8', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_8_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.8')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php new file mode 100644 index 0000000000..4e863fa143 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_8_rc1.php @@ -0,0 +1,227 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_8_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.8-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_7_pl1'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array(&$this, 'update_file_extension_group_names'))), +			array('custom', array(array(&$this, 'update_module_auth'))), +			array('custom', array(array(&$this, 'update_bots'))), +			array('custom', array(array(&$this, 'delete_orphan_shadow_topics'))), +			array('module.add', array( +				'acp', +				'ACP_MESSAGES', +				array( +					'module_basename'	=> 'acp_board', +					'modes'				=> array('post'), +				), +			)), +			array('config.add', array('load_unreads_search', 1)), +			array('config.update_if_equals', array(600, 'queue_interval', 60)), +			array('config.update_if_equals', array(50, 'email_package_size', 20)), + +			array('config.update', array('version', '3.0.8-RC1')), +		); +	} + +	public function update_file_extension_group_names() +	{ +		// Update file extension group names to use language strings. +		$sql = 'SELECT lang_dir +			FROM ' . LANG_TABLE; +		$result = $this->db->sql_query($sql); + +		$extension_groups_updated = array(); +		while ($lang_dir = $this->db->sql_fetchfield('lang_dir')) +		{ +			$lang_dir = basename($lang_dir); + +			// The language strings we need are either in language/.../acp/attachments.php +			// in the update package if we're updating to 3.0.8-RC1 or later, +			// or they are in language/.../install.php when we're updating from 3.0.7-PL1 or earlier. +			// On an already updated board, they can also already be in language/.../acp/attachments.php +			// in the board root. +			$lang_files = array( +				"{$this->phpbb_root_path}install/update/new/language/$lang_dir/acp/attachments.{$this->php_ext}", +				"{$this->phpbb_root_path}language/$lang_dir/install.{$this->php_ext}", +				"{$this->phpbb_root_path}language/$lang_dir/acp/attachments.{$this->php_ext}", +			); + +			foreach ($lang_files as $lang_file) +			{ +				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 ' . $this->db->sql_build_array('UPDATE', $sql_ary) . " +						WHERE group_name = '" . $this->db->sql_escape($lang_val) . "'"; +					$this->sql_query($sql); + +					$extension_groups_updated[$lang_key] = true; +				} +			} +		} +		$this->db->sql_freeresult($result); +	} + +	public function update_module_auth() +	{ +		$sql = 'UPDATE ' . MODULES_TABLE . ' +			SET module_auth = \'cfg_allow_avatar && (cfg_allow_avatar_local || cfg_allow_avatar_remote || cfg_allow_avatar_upload || cfg_allow_avatar_remote_upload)\' +			WHERE module_class = \'ucp\' +				AND module_basename = \'profile\' +				AND module_mode = \'avatar\''; +		$this->sql_query($sql); +	} + +	public function update_bots() +	{ +		$bot_name = 'Bing [Bot]'; +		$bot_name_clean = utf8_clean_string($bot_name); + +		$sql = 'SELECT user_id +			FROM ' . USERS_TABLE . " +			WHERE username_clean = '" . $this->db->sql_escape($bot_name_clean) . "'"; +		$result = $this->db->sql_query($sql); +		$bing_already_added = (bool) $this->db->sql_fetchfield('user_id'); +		$this->db->sql_freeresult($result); + +		if (!$bing_already_added) +		{ +			$bot_agent = 'bingbot/'; +			$bot_ip = ''; +			$sql = 'SELECT group_id, group_colour +				FROM ' . GROUPS_TABLE . " +				WHERE group_name = 'BOTS'"; +			$result = $this->db->sql_query($sql); +			$group_row = $this->db->sql_fetchrow($result); +			$this->db->sql_freeresult($result); + +			if (!$group_row) +			{ +				// default fallback, should never get here +				$group_row['group_id'] = 6; +				$group_row['group_colour'] = '9E8DA7'; +			} + +			if (!function_exists('user_add')) +			{ +				include($this->phpbb_root_path . 'includes/functions_user.' . $this->php_ext); +			} + +			$user_row = array( +				'user_type'				=> USER_IGNORE, +				'group_id'				=> $group_row['group_id'], +				'username'				=> $bot_name, +				'user_regdate'			=> time(), +				'user_password'			=> '', +				'user_colour'			=> $group_row['group_colour'], +				'user_email'			=> '', +				'user_lang'				=> $this->config['default_lang'], +				'user_style'			=> $this->config['default_style'], +				'user_timezone'			=> 0, +				'user_dateformat'		=> $this->config['default_dateformat'], +				'user_allow_massemail'	=> 0, +			); + +			$user_id = user_add($user_row); + +			$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $this->db->sql_build_array('INSERT', array( +				'bot_active'	=> 1, +				'bot_name'		=> (string) $bot_name, +				'user_id'		=> (int) $user_id, +				'bot_agent'		=> (string) $bot_agent, +				'bot_ip'		=> (string) $bot_ip, +			)); + +			$this->sql_query($sql); +		} +	} + +	public function delete_orphan_shadow_topics() +	{ +		// Delete shadow topics pointing to not existing topics +		$batch_size = 500; + +		// Set of affected forums we have to resync +		$sync_forum_ids = array(); + +		$sql_array = array( +			'SELECT'	=> 't1.topic_id, t1.forum_id', +			'FROM'		=> array( +				TOPICS_TABLE	=> 't1', +			), +			'LEFT_JOIN'	=> array( +				array( +					'FROM'	=> array(TOPICS_TABLE	=> 't2'), +					'ON'	=> 't1.topic_moved_id = t2.topic_id', +				), +			), +			'WHERE'		=> 't1.topic_moved_id <> 0 +						AND t2.topic_id IS NULL', +		); +		$sql = $this->db->sql_build_query('SELECT', $sql_array); +		$result = $this->db->sql_query_limit($sql, $batch_size); + +		$topic_ids = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$topic_ids[] = (int) $row['topic_id']; + +			$sync_forum_ids[(int) $row['forum_id']] = (int) $row['forum_id']; +		} +		$this->db->sql_freeresult($result); + +		if (!empty($topic_ids)) +		{ +			$sql = 'DELETE FROM ' . TOPICS_TABLE . ' +				WHERE ' . $this->db->sql_in_set('topic_id', $topic_ids); +			$this->db->sql_query($sql); + +			// Sync the forums we have deleted shadow topics from. +			sync('forum', 'forum_id', $sync_forum_ids, true, true); + +			return false; +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9.php new file mode 100644 index 0000000000..e69134c538 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_9 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.9', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_9_rc4'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.9')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php new file mode 100644 index 0000000000..06e46d522f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc1.php @@ -0,0 +1,130 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_9_rc1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.9-RC1', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_8'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables' => array( +				$this->table_prefix . 'login_attempts' => array( +					'COLUMNS' => array( +						// this column was removed from the database updater +						// after 3.0.9-RC3 was released. It might still exist +						// in 3.0.9-RCX installations and has to be dropped as +						// soon as the db_tools class is capable of properly +						// removing a primary key. +						// 'attempt_id'			=> array('UINT', NULL, 'auto_increment'), +						'attempt_ip'			=> array('VCHAR:40', ''), +						'attempt_browser'		=> array('VCHAR:150', ''), +						'attempt_forwarded_for'	=> array('VCHAR:255', ''), +						'attempt_time'			=> array('TIMESTAMP', 0), +						'user_id'				=> array('UINT', 0), +						'username'				=> array('VCHAR_UNI:255', 0), +						'username_clean'		=> array('VCHAR_CI', 0), +					), +					//'PRIMARY_KEY' => 'attempt_id', +					'KEYS' => array( +						'att_ip' => array('INDEX', array('attempt_ip', 'attempt_time')), +						'att_for' => array('INDEX', array('attempt_forwarded_for', 'attempt_time')), +						'att_time' => array('INDEX', array('attempt_time')), +						'user_id' => array('INDEX', 'user_id'), +					), +				), +			), +			'change_columns' => array( +				$this->table_prefix . 'bbcodes' => array( +					'bbcode_id' => array('USINT', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables' => array( +				$this->table_prefix . 'login_attempts', +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('ip_login_limit_max', 50)), +			array('config.add', array('ip_login_limit_time', 21600)), +			array('config.add', array('ip_login_limit_use_forwarded', 0)), +			array('custom', array(array(&$this, 'update_file_extension_group_names'))), +			array('custom', array(array(&$this, 'fix_firebird_qa_captcha'))), + +			array('config.update', array('version', '3.0.9-RC1')), +		); +	} + +	public function update_file_extension_group_names() +	{ +		// Update file extension group names to use language strings, again. +		$sql = 'SELECT group_id, group_name +			FROM ' . EXTENSION_GROUPS_TABLE . ' +			WHERE group_name ' . $this->db->sql_like_expression('EXT_GROUP_' . $this->db->get_any_char()); +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$sql_ary = array( +				'group_name'	=> substr($row['group_name'], 10), // Strip off 'EXT_GROUP_' +			); + +			$sql = 'UPDATE ' . EXTENSION_GROUPS_TABLE . ' +				SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' +				WHERE group_id = ' . $row['group_id']; +			$this->sql_query($sql); +		} +		$this->db->sql_freeresult($result); +	} + +	public function fix_firebird_qa_captcha() +	{ +		// Recover from potentially broken Q&A CAPTCHA table on firebird +		// Q&A CAPTCHA was uninstallable, so it's safe to remove these +		// without data loss +		if ($this->db_tools->sql_layer == 'firebird') +		{ +			$tables = array( +				$this->table_prefix . 'captcha_questions', +				$this->table_prefix . 'captcha_answers', +				$this->table_prefix . 'qa_confirm', +			); +			foreach ($tables as $table) +			{ +				if ($this->db_tools->sql_table_exists($table)) +				{ +					$this->db_tools->sql_table_drop($table); +				} +			} +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc2.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc2.php new file mode 100644 index 0000000000..46fd51e7fe --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc2.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_9_rc2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.9-RC2', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_9_rc1'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.9-RC2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc3.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc3.php new file mode 100644 index 0000000000..1696060735 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc3.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_9_rc3 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.9-RC3', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_9_rc2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.9-RC3')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc4.php b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc4.php new file mode 100644 index 0000000000..fdc92b52f9 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v30x/release_3_0_9_rc4.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v30x; + +class release_3_0_9_rc4 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return phpbb_version_compare($this->config['version'], '3.0.9-RC4', '>='); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_9_rc3'); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.0.9-RC4')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/acp_prune_users_module.php b/phpBB/phpbb/db/migration/data/v310/acp_prune_users_module.php new file mode 100644 index 0000000000..0ca4f2f19c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/acp_prune_users_module.php @@ -0,0 +1,81 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class acp_prune_users_module extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'acp' +				AND module_langname = 'ACP_CAT_USERS'"; +		$result = $this->db->sql_query($sql); +		$acp_cat_users_id = (int) $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT parent_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'acp' +				AND module_basename = 'acp_prune' +				AND module_mode = 'users'"; +		$result = $this->db->sql_query($sql); +		$acp_prune_users_parent = (int) $this->db->sql_fetchfield('parent_id'); +		$this->db->sql_freeresult($result); + +		// Skip migration if "Users" category has been deleted +		// or the module has already been moved to that category +		return !$acp_cat_users_id || $acp_cat_users_id === $acp_prune_users_parent; +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\beta1'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'move_prune_users_module'))), +		); +	} + +	public function move_prune_users_module() +	{ +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'acp' +				AND module_basename = 'acp_prune' +				AND module_mode = 'users'"; +		$result = $this->db->sql_query($sql); +		$acp_prune_users_id = (int) $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'acp' +				AND module_langname = 'ACP_CAT_USERS'"; +		$result = $this->db->sql_query($sql); +		$acp_cat_users_id = (int) $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		if (!class_exists('\acp_modules')) +		{ +			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +		} +		$module_manager = new \acp_modules(); +		$module_manager->module_class = 'acp'; +		$module_manager->move_module($acp_prune_users_id, $acp_cat_users_id); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php b/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php new file mode 100644 index 0000000000..4bd29f87d7 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/acp_style_components_module.php @@ -0,0 +1,46 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class acp_style_components_module extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'acp' +				AND module_langname = 'ACP_STYLE_COMPONENTS'"; +		$result = $this->db->sql_query($sql); +		$module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		return $module_id == false; +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('module.remove', array( +				'acp', +				false, +				'ACP_STYLE_COMPONENTS', +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/allow_cdn.php b/phpBB/phpbb/db/migration/data/v310/allow_cdn.php new file mode 100644 index 0000000000..286d20e20b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/allow_cdn.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class allow_cdn extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['allow_cdn']); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\jquery_update', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('allow_cdn', (int) $this->config['load_jquery_cdn'])), +			array('config.remove', array('load_jquery_cdn')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/alpha1.php b/phpBB/phpbb/db/migration/data/v310/alpha1.php new file mode 100644 index 0000000000..1df85bc64c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/alpha1.php @@ -0,0 +1,48 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class alpha1 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v30x\local_url_bbcode', +			'\phpbb\db\migration\data\v30x\release_3_0_12', +			'\phpbb\db\migration\data\v310\acp_style_components_module', +			'\phpbb\db\migration\data\v310\allow_cdn', +			'\phpbb\db\migration\data\v310\auth_provider_oauth', +			'\phpbb\db\migration\data\v310\avatars', +			'\phpbb\db\migration\data\v310\boardindex', +			'\phpbb\db\migration\data\v310\config_db_text', +			'\phpbb\db\migration\data\v310\forgot_password', +			'\phpbb\db\migration\data\v310\mod_rewrite', +			'\phpbb\db\migration\data\v310\mysql_fulltext_drop', +			'\phpbb\db\migration\data\v310\namespaces', +			'\phpbb\db\migration\data\v310\notifications_cron', +			'\phpbb\db\migration\data\v310\notification_options_reconvert', +			'\phpbb\db\migration\data\v310\plupload', +			'\phpbb\db\migration\data\v310\signature_module_auth', +			'\phpbb\db\migration\data\v310\softdelete_mcp_modules', +			'\phpbb\db\migration\data\v310\teampage', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-a1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/alpha2.php b/phpBB/phpbb/db/migration/data/v310/alpha2.php new file mode 100644 index 0000000000..78bc755ec9 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/alpha2.php @@ -0,0 +1,32 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class alpha2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha1', +			'\phpbb\db\migration\data\v310\notifications_cron_p2', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-a2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/alpha3.php b/phpBB/phpbb/db/migration/data/v310/alpha3.php new file mode 100644 index 0000000000..574d19d2f4 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/alpha3.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class alpha3 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha2', +			'\phpbb\db\migration\data\v310\avatar_types', +			'\phpbb\db\migration\data\v310\passwords', +			'\phpbb\db\migration\data\v310\profilefield_types', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-a3')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php new file mode 100644 index 0000000000..2d51bd53e4 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth.php @@ -0,0 +1,77 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class auth_provider_oauth extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'auth_provider_oauth'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables'	=> array( +				$this->table_prefix . 'oauth_tokens'	=> array( +					'COLUMNS' => array( +						'user_id'			=> array('UINT', 0), // phpbb_users.user_id +						'session_id'		=> array('CHAR:32', ''), // phpbb_sessions.session_id used only when user_id not set +						'provider'			=> array('VCHAR', ''), // Name of the OAuth provider +						'oauth_token'		=> array('MTEXT', ''), // Serialized token +					), +					'KEYS' => array( +						'user_id'			=> array('INDEX', 'user_id'), +						'provider'			=> array('INDEX', 'provider'), +					), +				), +				$this->table_prefix . 'oauth_accounts'	=> array( +					'COLUMNS' => array( +						'user_id'			=> array('UINT', 0), +						'provider'			=> array('VCHAR', ''), +						'oauth_provider_id'	=> array('TEXT_UNI', ''), +					), +					'PRIMARY_KEY' => array( +						'user_id', +						'provider', +					), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'	=> array( +				$this->table_prefix . 'oauth_tokens', +				$this->table_prefix . 'oauth_accounts', +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('module.add', array( +				'ucp', +				'UCP_PROFILE', +				array( +					'module_basename'	=> 'ucp_auth_link', +					'modes'				=> array('auth_link'), +				), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth2.php b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth2.php new file mode 100644 index 0000000000..e9e726ae20 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/auth_provider_oauth2.php @@ -0,0 +1,44 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class auth_provider_oauth2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\auth_provider_oauth', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array( +				array($this, 'update_auth_link_module_auth'), +			)), +		); +	} + +	public function update_auth_link_module_auth() +	{ +		$sql = 'UPDATE ' . MODULES_TABLE . " +			SET module_auth = 'authmethod_oauth' +			WHERE module_class = 'ucp' +				AND module_basename = 'ucp_auth_link' +				AND module_mode = 'auth_link' +				AND module_auth = ''"; +		$this->db->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/avatar_types.php b/phpBB/phpbb/db/migration/data/v310/avatar_types.php new file mode 100644 index 0000000000..117e93239d --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/avatar_types.php @@ -0,0 +1,64 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class avatar_types extends \phpbb\db\migration\migration +{ +	/** +	* @var avatar type map +	*/ +	protected $avatar_type_map = array( +		AVATAR_UPLOAD	=> 'avatar.driver.upload', +		AVATAR_REMOTE	=> 'avatar.driver.remote', +		AVATAR_GALLERY	=> 'avatar.driver.local', +	); + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +			'\phpbb\db\migration\data\v310\avatars', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_user_avatar_type'))), +			array('custom', array(array($this, 'update_group_avatar_type'))), +		); +	} + +	public function update_user_avatar_type() +	{ +		foreach ($this->avatar_type_map as $old => $new) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "users +				SET user_avatar_type = '$new' +				WHERE user_avatar_type = '$old'"; +			$this->db->sql_query($sql); +		} +	} + +	public function update_group_avatar_type() +	{ +		foreach ($this->avatar_type_map as $old => $new) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "groups +				SET group_avatar_type = '$new' +				WHERE group_avatar_type = '$old'"; +			$this->db->sql_query($sql); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/avatars.php b/phpBB/phpbb/db/migration/data/v310/avatars.php new file mode 100644 index 0000000000..2698adeed5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/avatars.php @@ -0,0 +1,73 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class avatars extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['allow_avatar_gravatar']); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_avatar_type'		=> array('VCHAR:255', ''), +				), +				$this->table_prefix . 'groups'			=> array( +					'group_avatar_type'		=> array('VCHAR:255', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_avatar_type'		=> array('TINT:2', ''), +				), +				$this->table_prefix . 'groups'			=> array( +					'group_avatar_type'		=> array('TINT:2', ''), +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('allow_avatar_gravatar', 0)), +			array('custom', array(array($this, 'update_module_auth'))), +		); +	} + +	public function update_module_auth() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . "modules +			SET module_auth = 'cfg_allow_avatar' +			WHERE module_class = 'ucp' +				AND module_basename = 'ucp_profile' +				AND module_mode = 'avatar'"; +		$this->db->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/beta1.php b/phpBB/phpbb/db/migration/data/v310/beta1.php new file mode 100644 index 0000000000..84887bd58e --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/beta1.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class beta1 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha3', +			'\phpbb\db\migration\data\v310\passwords_p2', +			'\phpbb\db\migration\data\v310\postgres_fulltext_drop', +			'\phpbb\db\migration\data\v310\profilefield_change_load_settings', +			'\phpbb\db\migration\data\v310\profilefield_location', +			'\phpbb\db\migration\data\v310\soft_delete_mod_convert2', +			'\phpbb\db\migration\data\v310\ucp_popuppm_module', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-b1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/beta2.php b/phpBB/phpbb/db/migration/data/v310/beta2.php new file mode 100644 index 0000000000..458e305c7b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/beta2.php @@ -0,0 +1,33 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class beta2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\beta1', +			'\phpbb\db\migration\data\v310\acp_prune_users_module', +			'\phpbb\db\migration\data\v310\profilefield_location_cleanup', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-b2')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/beta3.php b/phpBB/phpbb/db/migration/data/v310/beta3.php new file mode 100644 index 0000000000..a6c62bf936 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/beta3.php @@ -0,0 +1,36 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class beta3 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\beta2', +			'\phpbb\db\migration\data\v310\auth_provider_oauth2', +			'\phpbb\db\migration\data\v310\board_contact_name', +			'\phpbb\db\migration\data\v310\jquery_update2', +			'\phpbb\db\migration\data\v310\live_searches_config', +			'\phpbb\db\migration\data\v310\prune_shadow_topics', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-b3')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/beta4.php b/phpBB/phpbb/db/migration/data/v310/beta4.php new file mode 100644 index 0000000000..3e91d95178 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/beta4.php @@ -0,0 +1,33 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class beta4 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\beta3', +			'\phpbb\db\migration\data\v310\extensions_version_check_force_unstable', +			'\phpbb\db\migration\data\v310\reset_missing_captcha_plugin', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-b4')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/board_contact_name.php b/phpBB/phpbb/db/migration/data/v310/board_contact_name.php new file mode 100644 index 0000000000..6f5188720b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/board_contact_name.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class board_contact_name extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['board_contact_name']); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\beta2'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('board_contact_name', '')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/boardindex.php b/phpBB/phpbb/db/migration/data/v310/boardindex.php new file mode 100644 index 0000000000..77a8558f21 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/boardindex.php @@ -0,0 +1,29 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class boardindex extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['board_index_text']); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('board_index_text', '')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/config_db_text.php b/phpBB/phpbb/db/migration/data/v310/config_db_text.php new file mode 100644 index 0000000000..438883c438 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/config_db_text.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class config_db_text extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'config_text'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables' => array( +				$this->table_prefix . 'config_text' => array( +					'COLUMNS' => array( +						'config_name'	=> array('VCHAR', ''), +						'config_value'	=> array('MTEXT', ''), +					), +					'PRIMARY_KEY' => 'config_name', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables' => array( +				$this->table_prefix . 'config_text', +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php new file mode 100644 index 0000000000..20bd547ac3 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/contact_admin_acp_module.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class contact_admin_acp_module extends \phpbb\db\migration\migration +{ +	public function update_data() +	{ +		return array( +			array('module.add', array( +				'acp', +				'ACP_BOARD_CONFIGURATION', +				array( +					'module_basename'	=> 'acp_contact', +					'modes'				=> array('contact'), +				), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php b/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php new file mode 100644 index 0000000000..c2dd09ddf6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/contact_admin_form.php @@ -0,0 +1,41 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class contact_admin_form extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['contact_admin_form_enable']); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('contact_admin_form_enable', 1)), +			array('custom', array(array($this, 'contact_admin_info'))), +		); +	} + +	public function contact_admin_info() +	{ +		$text_config = new \phpbb\config\db_text($this->db, $this->table_prefix . 'config_text'); +		$text_config->set_array(array( +			'contact_admin_info'			=> '', +			'contact_admin_info_uid'		=> '', +			'contact_admin_info_bitfield'	=> '', +			'contact_admin_info_flags'		=> OPTION_FLAG_BBCODE + OPTION_FLAG_SMILIES + OPTION_FLAG_LINKS, +		)); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/dev.php b/phpBB/phpbb/db/migration/data/v310/dev.php new file mode 100644 index 0000000000..f037191c2a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/dev.php @@ -0,0 +1,415 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class dev extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return version_compare($this->config['version'], '3.1.0-dev', '>='); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\extensions', +			'\phpbb\db\migration\data\v310\style_update_p2', +			'\phpbb\db\migration\data\v310\timezone_p2', +			'\phpbb\db\migration\data\v310\reported_posts_display', +			'\phpbb\db\migration\data\v310\migrations_table', +		); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'groups'		=> array( +					'group_teampage'	=> array('UINT', 0, 'after' => 'group_legend'), +				), +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_pm'		=> array('BOOL', 0), +				), +				$this->table_prefix . 'styles'		=> array( +					'style_path'			=> array('VCHAR:100', ''), +					'bbcode_bitfield'		=> array('VCHAR:255', 'kNg='), +					'style_parent_id'		=> array('UINT:4', 0), +					'style_parent_tree'		=> array('TEXT', ''), +				), +				$this->table_prefix . 'reports'		=> array( +					'reported_post_text'		=> array('MTEXT_UNI', ''), +					'reported_post_uid'			=> array('VCHAR:8', ''), +					'reported_post_bitfield'	=> array('VCHAR:255', ''), +				), +			), +			'change_columns'	=> array( +				$this->table_prefix . 'groups'		=> array( +					'group_legend'		=> array('UINT', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'groups'		=> array( +					'group_teampage', +				), +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_pm', +				), +				$this->table_prefix . 'styles'		=> array( +					'style_path', +					'bbcode_bitfield', +					'style_parent_id', +					'style_parent_tree', +				), +				$this->table_prefix . 'reports'		=> array( +					'reported_post_text', +					'reported_post_uid', +					'reported_post_bitfield', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				(strpos('phpbb_search_', $this->config['search_type']) !== 0), +				array('config.update', array('search_type', 'phpbb_search_' . $this->config['search_type'])), +			)), + +			array('config.add', array('fulltext_postgres_ts_name', 'simple')), +			array('config.add', array('fulltext_postgres_min_word_len', 4)), +			array('config.add', array('fulltext_postgres_max_word_len', 254)), +			array('config.add', array('fulltext_sphinx_stopwords', 0)), +			array('config.add', array('fulltext_sphinx_indexer_mem_limit', 512)), + +			array('config.add', array('load_jquery_cdn', 0)), +			array('config.add', array('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js')), + +			array('config.add', array('use_system_cron', 0)), + +			array('config.add', array('legend_sort_groupname', 0)), +			array('config.add', array('teampage_forums', 1)), +			array('config.add', array('teampage_memberships', 1)), + +			array('config.add', array('load_cpf_pm', 0)), + +			array('config.add', array('display_last_subject', 1)), + +			array('config.add', array('assets_version', 1)), + +			array('config.add', array('site_home_url', '')), +			array('config.add', array('site_home_text', '')), + +			array('permission.add', array('u_chgprofileinfo', true, 'u_sig')), + +			array('module.add', array( +				'acp', +				'ACP_GROUPS', +				array( +					'module_basename'	=> 'acp_groups', +					'modes'				=> array('position'), +				), +			)), +			array('module.add', array( +				'acp', +				'ACP_ATTACHMENTS', +				array( +					'module_basename'	=> 'acp_attachments', +					'modes'				=> array('manage'), +				), +			)), +			array('module.add', array( +				'acp', +				'ACP_STYLE_MANAGEMENT', +				array( +					'module_basename'	=> 'acp_styles', +					'modes'				=> array('install', 'cache'), +				), +			)), +			array('module.add', array( +				'ucp', +				'UCP_PROFILE', +				array( +					'module_basename'	=> 'ucp_profile', +					'modes'				=> array('autologin_keys'), +				), +			)), +			// Module will be renamed later +			array('module.add', array( +				'acp', +				'ACP_CAT_STYLES', +				'ACP_LANGUAGE' +			)), + +			array('module.remove', array( +				'acp', +				false, +				'ACP_TEMPLATES', +			)), +			array('module.remove', array( +				'acp', +				false, +				'ACP_THEMES', +			)), +			array('module.remove', array( +				'acp', +				false, +				'ACP_IMAGESETS', +			)), + +			array('custom', array(array($this, 'rename_module_basenames'))), +			array('custom', array(array($this, 'rename_styles_module'))), +			array('custom', array(array($this, 'add_group_teampage'))), +			array('custom', array(array($this, 'update_group_legend'))), +			array('custom', array(array($this, 'localise_global_announcements'))), +			array('custom', array(array($this, 'update_ucp_pm_basename'))), +			array('custom', array(array($this, 'update_ucp_profile_auth'))), +			array('custom', array(array($this, 'move_customise_modules'))), + +			array('config.update', array('version', '3.1.0-dev')), +		); +	} + +	public function move_customise_modules() +	{ +		// Move language management to new location in the Customise tab +		// First get language module id +		$sql = 'SELECT module_id FROM ' . MODULES_TABLE . " +			WHERE module_basename = 'acp_language'"; +		$result = $this->db->sql_query($sql); +		$language_module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); +		// Next get language management module id of the one just created +		$sql = 'SELECT module_id FROM ' . MODULES_TABLE . " +			WHERE module_langname = 'ACP_LANGUAGE'"; +		$result = $this->db->sql_query($sql); +		$language_management_module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		if (!class_exists('acp_modules')) +		{ +			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +		} +		// acp_modules calls adm_back_link, which is undefined at this point +		if (!function_exists('adm_back_link')) +		{ +			include($this->phpbb_root_path . 'includes/functions_acp.' . $this->php_ext); +		} +		$module_manager = new \acp_modules(); +		$module_manager->module_class = 'acp'; +		$module_manager->move_module($language_module_id, $language_management_module_id); +	} + +	public function update_ucp_pm_basename() +	{ +		$sql = 'SELECT module_id, module_basename +			FROM ' . MODULES_TABLE . " +			WHERE module_basename <> 'ucp_pm' AND +				module_langname='UCP_PM'"; +		$result = $this->db->sql_query_limit($sql, 1); + +		if ($row = $this->db->sql_fetchrow($result)) +		{ +			// This update is still not applied. Applying it + +			$sql = 'UPDATE ' . MODULES_TABLE . " +				SET module_basename = 'ucp_pm' +				WHERE  module_id = " . (int) $row['module_id']; + +			$this->sql_query($sql); +		} +		$this->db->sql_freeresult($result); +	} + +	public function update_ucp_profile_auth() +	{ +		// Update the auth setting for the module +		$sql = 'UPDATE ' . MODULES_TABLE . " +			SET module_auth = 'acl_u_chgprofileinfo' +			WHERE module_class = 'ucp' +				AND module_basename = 'ucp_profile' +				AND module_mode = 'profile_info'"; +		$this->sql_query($sql); +	} + +	public function rename_styles_module() +	{ +		// Rename styles module to Customise +		$sql = 'UPDATE ' . MODULES_TABLE . " +			SET module_langname = 'ACP_CAT_CUSTOMISE' +			WHERE module_langname = 'ACP_CAT_STYLES'"; +		$this->sql_query($sql); +	} + +	public function rename_module_basenames() +	{ +		// rename all module basenames to full classname +		$sql = 'SELECT module_id, module_basename, module_class +			FROM ' . MODULES_TABLE; +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$module_id = (int) $row['module_id']; +			unset($row['module_id']); + +			if (!empty($row['module_basename']) && !empty($row['module_class'])) +			{ +				// all the class names start with class name or with phpbb_ for auto loading +				if (strpos($row['module_basename'], $row['module_class'] . '_') !== 0 && +					strpos($row['module_basename'], 'phpbb_') !== 0) +				{ +					$row['module_basename'] = $row['module_class'] . '_' . $row['module_basename']; + +					$sql_update = $this->db->sql_build_array('UPDATE', $row); + +					$sql = 'UPDATE ' . MODULES_TABLE . ' +						SET ' . $sql_update . ' +						WHERE module_id = ' . $module_id; +					$this->sql_query($sql); +				} +			} +		} + +		$this->db->sql_freeresult($result); +	} + +	public function add_group_teampage() +	{ +		$sql = 'UPDATE ' . GROUPS_TABLE . ' +			SET group_teampage = 1 +			WHERE group_type = ' . GROUP_SPECIAL . " +				AND group_name = 'ADMINISTRATORS'"; +		$this->sql_query($sql); + +		$sql = 'UPDATE ' . GROUPS_TABLE . ' +			SET group_teampage = 2 +			WHERE group_type = ' . GROUP_SPECIAL . " +				AND group_name = 'GLOBAL_MODERATORS'"; +		$this->sql_query($sql); +	} + +	public function update_group_legend() +	{ +		$sql = 'SELECT group_id +			FROM ' . GROUPS_TABLE . ' +			WHERE group_legend = 1 +			ORDER BY group_name ASC'; +		$result = $this->db->sql_query($sql); + +		$next_legend = 1; +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$sql = 'UPDATE ' . GROUPS_TABLE . ' +				SET group_legend = ' . $next_legend . ' +				WHERE group_id = ' . (int) $row['group_id']; +			$this->sql_query($sql); + +			$next_legend++; +		} +		$this->db->sql_freeresult($result); +	} + +	public function localise_global_announcements() +	{ +		// Localise Global Announcements +		$sql = 'SELECT topic_id, topic_approved, (topic_replies + 1) AS topic_posts, topic_last_post_id, topic_last_post_subject, topic_last_post_time, topic_last_poster_id, topic_last_poster_name, topic_last_poster_colour +			FROM ' . TOPICS_TABLE . ' +			WHERE forum_id = 0 +				AND topic_type = ' . POST_GLOBAL; +		$result = $this->db->sql_query($sql); + +		$global_announcements = $update_lastpost_data = array(); +		$update_lastpost_data['forum_last_post_time'] = 0; +		$update_forum_data = array( +			'forum_posts'		=> 0, +			'forum_topics'		=> 0, +			'forum_topics_real'	=> 0, +		); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$global_announcements[] = (int) $row['topic_id']; + +			$update_forum_data['forum_posts'] += (int) $row['topic_posts']; +			$update_forum_data['forum_topics_real']++; +			if ($row['topic_approved']) +			{ +				$update_forum_data['forum_topics']++; +			} + +			if ($update_lastpost_data['forum_last_post_time'] < $row['topic_last_post_time']) +			{ +				$update_lastpost_data = array( +					'forum_last_post_id'		=> (int) $row['topic_last_post_id'], +					'forum_last_post_subject'	=> $row['topic_last_post_subject'], +					'forum_last_post_time'		=> (int) $row['topic_last_post_time'], +					'forum_last_poster_id'		=> (int) $row['topic_last_poster_id'], +					'forum_last_poster_name'	=> $row['topic_last_poster_name'], +					'forum_last_poster_colour'	=> $row['topic_last_poster_colour'], +				); +			} +		} +		$this->db->sql_freeresult($result); + +		if (!empty($global_announcements)) +		{ +			// Update the post/topic-count for the forum and the last-post if needed +			$sql = 'SELECT forum_id +				FROM ' . FORUMS_TABLE . ' +				WHERE forum_type = ' . FORUM_POST; +			$result = $this->db->sql_query_limit($sql, 1); +			$ga_forum_id = $this->db->sql_fetchfield('forum_id'); +			$this->db->sql_freeresult($result); + +			$sql = 'SELECT forum_last_post_time +				FROM ' . FORUMS_TABLE . ' +				WHERE forum_id = ' . $ga_forum_id; +			$result = $this->db->sql_query($sql); +			$lastpost = (int) $this->db->sql_fetchfield('forum_last_post_time'); +			$this->db->sql_freeresult($result); + +			$sql_update = 'forum_posts = forum_posts + ' . $update_forum_data['forum_posts'] . ', '; +			$sql_update .= 'forum_topics_real = forum_topics_real + ' . $update_forum_data['forum_topics_real'] . ', '; +			$sql_update .= 'forum_topics = forum_topics + ' . $update_forum_data['forum_topics']; +			if ($lastpost < $update_lastpost_data['forum_last_post_time']) +			{ +				$sql_update .= ', ' . $this->db->sql_build_array('UPDATE', $update_lastpost_data); +			} + +			$sql = 'UPDATE ' . FORUMS_TABLE . ' +				SET ' . $sql_update . ' +				WHERE forum_id = ' . $ga_forum_id; +			$this->sql_query($sql); + +			// Update some forum_ids +			$table_ary = array(TOPICS_TABLE, POSTS_TABLE, LOG_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE); +			foreach ($table_ary as $table) +			{ +				$sql = "UPDATE $table +					SET forum_id = $ga_forum_id +					WHERE " . $this->db->sql_in_set('topic_id', $global_announcements); +				$this->sql_query($sql); +			} +			unset($table_ary); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/extensions.php b/phpBB/phpbb/db/migration/data/v310/extensions.php new file mode 100644 index 0000000000..3171435482 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/extensions.php @@ -0,0 +1,75 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class extensions extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'ext'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables'		=> array( +				$this->table_prefix . 'ext'	=> array( +					'COLUMNS'			=> array( +						'ext_name'		=> array('VCHAR', ''), +						'ext_active'	=> array('BOOL', 0), +						'ext_state'		=> array('TEXT', ''), +					), +					'KEYS'				=> array( +						'ext_name'		=> array('UNIQUE', 'ext_name'), +					), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'		=> array( +				$this->table_prefix . 'ext', +			), +		); +	} + +	public function update_data() +	{ +		return array( +			// Module will be renamed later +			array('module.add', array( +				'acp', +				'ACP_CAT_STYLES', +				'ACP_EXTENSION_MANAGEMENT' +			)), +			array('module.add', array( +				'acp', +				'ACP_EXTENSION_MANAGEMENT', +				array( +					'module_basename'	=> 'acp_extensions', +					'modes'				=> array('main'), +				), +			)), +			array('permission.add', array('a_extensions', true, 'a_styles')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/extensions_version_check_force_unstable.php b/phpBB/phpbb/db/migration/data/v310/extensions_version_check_force_unstable.php new file mode 100644 index 0000000000..1d6276f484 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/extensions_version_check_force_unstable.php @@ -0,0 +1,29 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class extensions_version_check_force_unstable extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('extension_force_unstable', false)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/forgot_password.php b/phpBB/phpbb/db/migration/data/v310/forgot_password.php new file mode 100644 index 0000000000..362457cf23 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/forgot_password.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class forgot_password extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['allow_password_reset']); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('allow_password_reset', 1)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/jquery_update.php b/phpBB/phpbb/db/migration/data/v310/jquery_update.php new file mode 100644 index 0000000000..8011331e80 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/jquery_update.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class jquery_update extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->config['load_jquery_url'] !== '//ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js'; +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js')), +		); +	} + +} diff --git a/phpBB/phpbb/db/migration/data/v310/jquery_update2.php b/phpBB/phpbb/db/migration/data/v310/jquery_update2.php new file mode 100644 index 0000000000..4061be5940 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/jquery_update2.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class jquery_update2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->config['load_jquery_url'] !== '//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js'; +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\jquery_update', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('load_jquery_url', '//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js')), +		); +	} + +} diff --git a/phpBB/phpbb/db/migration/data/v310/live_searches_config.php b/phpBB/phpbb/db/migration/data/v310/live_searches_config.php new file mode 100644 index 0000000000..3d87e04ac2 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/live_searches_config.php @@ -0,0 +1,29 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class live_searches_config extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['allow_live_searches']); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('allow_live_searches', '1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/migrations_table.php b/phpBB/phpbb/db/migration/data/v310/migrations_table.php new file mode 100644 index 0000000000..48508b05c2 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/migrations_table.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class migrations_table extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'migrations'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables'		=> array( +				$this->table_prefix . 'migrations'	=> array( +					'COLUMNS'		=> array( +						'migration_name'			=> array('VCHAR', ''), +						'migration_depends_on'		=> array('TEXT', ''), +						'migration_schema_done'		=> array('BOOL', 0), +						'migration_data_done'		=> array('BOOL', 0), +						'migration_data_state'		=> array('TEXT', ''), +						'migration_start_time'		=> array('TIMESTAMP', 0), +						'migration_end_time'		=> array('TIMESTAMP', 0), +					), +					'PRIMARY_KEY'	=> 'migration_name', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'		=> array( +				$this->table_prefix . 'migrations', +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/mod_rewrite.php b/phpBB/phpbb/db/migration/data/v310/mod_rewrite.php new file mode 100644 index 0000000000..85e479db59 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/mod_rewrite.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class mod_rewrite extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('enable_mod_rewrite', '0')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php new file mode 100644 index 0000000000..4530ebe285 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/mysql_fulltext_drop.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class mysql_fulltext_drop extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		// This migration is irrelevant for all non-MySQL DBMSes. +		return strpos($this->db->get_sql_layer(), 'mysql') === false; +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +		); +	} + +	public function update_schema() +	{ +		/* +		* Drop FULLTEXT indexes related to MySQL fulltext search. +		* Doing so is equivalent to dropping the search index from the ACP. +		* Possibly time-consuming recreation of the search index (i.e. +		* FULLTEXT indexes) is left as a task to the admin to not +		* unnecessarily stall the upgrade process. The new search index will +		* then require about 40% less table space (also see PHPBB3-11621). +		*/ +		return array( +			'drop_keys' => array( +				$this->table_prefix . 'posts' => array( +					'post_subject', +					'post_text', +					'post_content', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/namespaces.php b/phpBB/phpbb/db/migration/data/v310/namespaces.php new file mode 100644 index 0000000000..2a4935395e --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/namespaces.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class namespaces extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +		); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				(preg_match('#^phpbb_search_#', $this->config['search_type'])), +				array('config.update', array('search_type', str_replace('phpbb_search_', '\\phpbb\\search\\', $this->config['search_type']))), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/notification_options_reconvert.php b/phpBB/phpbb/db/migration/data/v310/notification_options_reconvert.php new file mode 100644 index 0000000000..2d4d26ae61 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/notification_options_reconvert.php @@ -0,0 +1,141 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class notification_options_reconvert extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\notifications_schema_fix'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'purge_notifications'))), +			array('custom', array(array($this, 'convert_notifications'))), +		); +	} + +	public function purge_notifications() +	{ +		$sql = 'DELETE FROM ' . $this->table_prefix . 'user_notifications'; +		$this->sql_query($sql); +	} + +	public function convert_notifications($start) +	{ +		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->table_prefix . 'user_notifications'); + +		return $this->perform_conversion($insert_buffer, $start); +	} + +	/** +	* Perform the conversion (separate for testability) +	* +	* @param \phpbb\db\sql_insert_buffer		$insert_buffer +	* @param int			$start		Start of staggering step +	* @return		mixed		int start of the next step, null if the end was reached +	*/ +	public function perform_conversion(\phpbb\db\sql_insert_buffer $insert_buffer, $start) +	{ +		$limit = 250; +		$converted_users = 0; + +		$sql = 'SELECT user_id, user_notify_type, user_notify_pm +			FROM ' . $this->table_prefix . 'users +			ORDER BY user_id'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$converted_users++; +			$notification_methods = array(); + +			// In-board notification +			$notification_methods[] = ''; + +			if ($row['user_notify_type'] == NOTIFY_EMAIL || $row['user_notify_type'] == NOTIFY_BOTH) +			{ +				$notification_methods[] = 'email'; +			} + +			if ($row['user_notify_type'] == NOTIFY_IM || $row['user_notify_type'] == NOTIFY_BOTH) +			{ +				$notification_methods[] = 'jabber'; +			} + +			// Notifications for posts +			foreach (array('post', 'topic') as $item_type) +			{ +				$this->add_method_rows( +					$insert_buffer, +					$item_type, +					0, +					$row['user_id'], +					$notification_methods +				); +			} + +			if ($row['user_notify_pm']) +			{ +				// Notifications for private messages +				// User either gets all methods or no method +				$this->add_method_rows( +					$insert_buffer, +					'pm', +					0, +					$row['user_id'], +					$notification_methods +				); +			} +		} +		$this->db->sql_freeresult($result); + +		$insert_buffer->flush(); + +		if ($converted_users < $limit) +		{ +			// No more users left, we are done... +			return; +		} + +		return $start + $limit; +	} + +	/** +	* Insert method rows to DB +	* +	* @param \phpbb\db\sql_insert_buffer $insert_buffer +	* @param string $item_type +	* @param int $item_id +	* @param int $user_id +	* @param string $methods +	*/ +	protected function add_method_rows(\phpbb\db\sql_insert_buffer $insert_buffer, $item_type, $item_id, $user_id, array $methods) +	{ +		$row_base = array( +			'item_type'		=> $item_type, +			'item_id'		=> (int) $item_id, +			'user_id'		=> (int) $user_id, +			'notify'		=> 1 +		); + +		foreach ($methods as $method) +		{ +			$row_base['method'] = $method; +			$insert_buffer->insert($row_base); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/notifications.php b/phpBB/phpbb/db/migration/data/v310/notifications.php new file mode 100644 index 0000000000..f4d012b5ac --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/notifications.php @@ -0,0 +1,102 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class notifications extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'notifications'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables'		=> array( +				$this->table_prefix . 'notification_types'	=> array( +					'COLUMNS'			=> array( +						'notification_type'			=> array('VCHAR:255', ''), +						'notification_type_enabled'	=> array('BOOL', 1), +					), +					'PRIMARY_KEY'		=> array('notification_type', 'notification_type_enabled'), +				), +				$this->table_prefix . 'notifications'		=> array( +					'COLUMNS'			=> array( +						'notification_id'  				=> array('UINT', null, 'auto_increment'), +						'item_type'			   			=> array('VCHAR:255', ''), +						'item_id'		  				=> array('UINT', 0), +						'item_parent_id'   				=> array('UINT', 0), +						'user_id'						=> array('UINT', 0), +						'notification_read'				=> array('BOOL', 0), +						'notification_time'				=> array('TIMESTAMP', 1), +						'notification_data'			   	=> array('TEXT_UNI', ''), +					), +					'PRIMARY_KEY'		=> 'notification_id', +					'KEYS'				=> array( +						'item_ident'		=> array('INDEX', array('item_type', 'item_id')), +						'user'				=> array('INDEX', array('user_id', 'notification_read')), +					), +				), +				$this->table_prefix . 'user_notifications'	=> array( +					'COLUMNS'			=> array( +						'item_type'			=> array('VCHAR:255', ''), +						'item_id'			=> array('UINT', 0), +						'user_id'			=> array('UINT', 0), +						'method'			=> array('VCHAR:255', ''), +						'notify'			=> array('BOOL', 1), +					), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'	=> array( +				$this->table_prefix . 'notification_types', +				$this->table_prefix . 'notifications', +				$this->table_prefix . 'user_notifications', +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('module.add', array( +				'ucp', +				'UCP_MAIN', +				array( +					'module_basename'	=> 'ucp_notifications', +					'modes'				=> array('notification_list'), +				), +			)), +			array('module.add', array( +				'ucp', +				'UCP_PREFS', +				array( +					'module_basename'	=> 'ucp_notifications', +					'modes'				=> array('notification_options'), +				), +			)), +			array('config.add', array('load_notifications', 1)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_cron.php b/phpBB/phpbb/db/migration/data/v310/notifications_cron.php new file mode 100644 index 0000000000..ba600f7bf5 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/notifications_cron.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class notifications_cron extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\notifications'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('read_notification_expire_days', 30)), +			array('config.add', array('read_notification_last_gc', 0)), // last run +			array('config.add', array('read_notification_gc', (60 * 60 * 24))), // seconds between run; 1 day +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php b/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php new file mode 100644 index 0000000000..263584b343 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/notifications_cron_p2.php @@ -0,0 +1,31 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class notifications_cron_p2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\notifications_cron'); +	} + +	public function update_data() +	{ +		return array( +			// Make read_notification_last_gc dynamic. +			array('config.remove', array('read_notification_last_gc')), +			array('config.add', array('read_notification_last_gc', 0, 1)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php new file mode 100644 index 0000000000..21a39a7c91 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/notifications_schema_fix.php @@ -0,0 +1,98 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class notifications_schema_fix extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\notifications'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_tables'		=> array( +				$this->table_prefix . 'notification_types', +				$this->table_prefix . 'notifications', +			), +			'add_tables'		=> array( +				$this->table_prefix . 'notification_types'	=> array( +					'COLUMNS'			=> array( +						'notification_type_id'		=> array('USINT', null, 'auto_increment'), +						'notification_type_name'	=> array('VCHAR:255', ''), +						'notification_type_enabled'	=> array('BOOL', 1), +					), +					'PRIMARY_KEY'		=> array('notification_type_id'), +					'KEYS'				=> array( +						'type'			=> array('UNIQUE', array('notification_type_name')), +					), +				), +				$this->table_prefix . 'notifications'		=> array( +					'COLUMNS'			=> array( +						'notification_id'				=> array('UINT:10', null, 'auto_increment'), +						'notification_type_id'			=> array('USINT', 0), +						'item_id'						=> array('UINT', 0), +						'item_parent_id'				=> array('UINT', 0), +						'user_id'						=> array('UINT', 0), +						'notification_read'				=> array('BOOL', 0), +						'notification_time'				=> array('TIMESTAMP', 1), +						'notification_data'				=> array('TEXT_UNI', ''), +					), +					'PRIMARY_KEY'		=> 'notification_id', +					'KEYS'				=> array( +						'item_ident'		=> array('INDEX', array('notification_type_id', 'item_id')), +						'user'				=> array('INDEX', array('user_id', 'notification_read')), +					), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'	=> array( +				$this->table_prefix . 'notification_types', +				$this->table_prefix . 'notifications', +			), +			'add_tables'		=> array( +				$this->table_prefix . 'notification_types'	=> array( +					'COLUMNS'			=> array( +						'notification_type'			=> array('VCHAR:255', ''), +						'notification_type_enabled'	=> array('BOOL', 1), +					), +					'PRIMARY_KEY'		=> array('notification_type', 'notification_type_enabled'), +				), +				$this->table_prefix . 'notifications'		=> array( +					'COLUMNS'			=> array( +						'notification_id'  				=> array('UINT', null, 'auto_increment'), +						'item_type'			   			=> array('VCHAR:255', ''), +						'item_id'		  				=> array('UINT', 0), +						'item_parent_id'   				=> array('UINT', 0), +						'user_id'						=> array('UINT', 0), +						'notification_read'				=> array('BOOL', 0), +						'notification_time'				=> array('TIMESTAMP', 1), +						'notification_data'			   	=> array('TEXT_UNI', ''), +					), +					'PRIMARY_KEY'		=> 'notification_id', +					'KEYS'				=> array( +						'item_ident'		=> array('INDEX', array('item_type', 'item_id')), +						'user'				=> array('INDEX', array('user_id', 'notification_read')), +					), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/passwords.php b/phpBB/phpbb/db/migration/data/v310/passwords.php new file mode 100644 index 0000000000..adee44147f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/passwords.php @@ -0,0 +1,50 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class passwords extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'	=> array( +					'user_password'		=> array('VCHAR:255', ''), +				), +				$this->table_prefix . 'forums'	=> array( +					'forum_password'	=> array('VCHAR:255', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'	=> array( +					'user_password'		=> array('VCHAR:40', ''), +				), +				$this->table_prefix . 'forums'	=> array( +					'forum_password'	=> array('VCHAR:40', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/passwords_convert_p1.php b/phpBB/phpbb/db/migration/data/v310/passwords_convert_p1.php new file mode 100644 index 0000000000..aad8e44681 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/passwords_convert_p1.php @@ -0,0 +1,84 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class passwords_convert_p1 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\passwords_p2'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_passwords'))), +		); +	} + +	public function update_passwords($start) +	{ +		// Nothing to do if user_pass_convert column doesn't exist +		if (!$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_pass_convert')) +		{ +			return; +		} + +		$start = (int) $start; +		$limit = 1000; +		$converted_users = 0; + +		$sql = 'SELECT user_password, user_id +			FROM ' . $this->table_prefix . 'users +			WHERE user_pass_convert = 1 +			ORDER BY user_id'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		$update_users = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$converted_users++; + +			$user_id = (int) $row['user_id']; +			// Only prefix passwords without proper prefix +			if (!isset($update_users[$user_id]) && !preg_match('#^\$([a-zA-Z0-9\\\]*?)\$#', $row['user_password'])) +			{ +				// Use $CP$ prefix for passwords that need to +				// be converted and set pass convert to false. +				$update_users[$user_id] = array( +					'user_password'		=> '$CP$' . $row['user_password'], +					'user_pass_convert'	=> 0, +				); +			} +		} +		$this->db->sql_freeresult($result); + +		foreach ($update_users as $user_id => $user_data) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . 'users +				SET ' . $this->db->sql_build_array('UPDATE', $user_data) . ' +				WHERE user_id = ' . $user_id; +			$this->sql_query($sql); +		} + +		if ($converted_users < $limit) +		{ +			// There are no more users to be converted +			return; +		} + +		// There are still more users to query, return the next start value +		return $start + $limit; +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/passwords_convert_p2.php b/phpBB/phpbb/db/migration/data/v310/passwords_convert_p2.php new file mode 100644 index 0000000000..26a99184a6 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/passwords_convert_p2.php @@ -0,0 +1,49 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class passwords_convert_p2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_pass_convert'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\passwords_convert_p1'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'users'		=> array( +					'user_pass_convert', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'users'		=> array( +					'user_pass_convert'	=> array('BOOL', 0, 'after' => 'user_passchg'), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/passwords_p2.php b/phpBB/phpbb/db/migration/data/v310/passwords_p2.php new file mode 100644 index 0000000000..afc7ba2813 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/passwords_p2.php @@ -0,0 +1,44 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class passwords_p2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\passwords'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'	=> array( +					'user_newpasswd'		=> array('VCHAR:255', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'	=> array( +					'user_newpasswd'		=> array('VCHAR:40', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/plupload.php b/phpBB/phpbb/db/migration/data/v310/plupload.php new file mode 100644 index 0000000000..69367f86a9 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/plupload.php @@ -0,0 +1,36 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class plupload extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return isset($this->config['plupload_last_gc']) && +			isset($this->config['plupload_salt']); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('config.add', array('plupload_last_gc', 0)), +			array('config.add', array('plupload_salt', unique_id())), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php b/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php new file mode 100644 index 0000000000..ea442dfb1b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/postgres_fulltext_drop.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class postgres_fulltext_drop extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		// This migration is irrelevant for all non-PostgreSQL DBMSes. +		return strpos($this->db->get_sql_layer(), 'postgres') === false; +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +		); +	} + +	public function update_schema() +	{ +		/* +		* Drop FULLTEXT indexes related to PostgreSQL fulltext search. +		* Doing so is equivalent to dropping the search index from the ACP. +		* Possibly time-consuming recreation of the search index (i.e. +		* FULLTEXT indexes) is left as a task to the admin to not +		* unnecessarily stall the upgrade process. The new search index will +		* then require about 40% less table space (also see PHPBB3-11040). +		*/ +		return array( +			'drop_keys' => array( +				$this->table_prefix . 'posts' => array( +					'post_subject', +					'post_text', +					'post_content', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php b/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php new file mode 100644 index 0000000000..65d4fe1078 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_aol.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_aol extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_yahoo_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_aol'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_aol', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_aol', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> '', +		'field_contact_url'		=> '', +	); + +	protected $user_column_name = 'user_aim'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php new file mode 100644 index 0000000000..f884d83d26 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_aol_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_aol_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_aim'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_aol', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_aim', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_aim'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php new file mode 100644 index 0000000000..7cc4fd8daa --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_change_load_settings.php @@ -0,0 +1,34 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_change_load_settings extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_aol_cleanup', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('load_cpf_memberlist', '1')), +			array('config.update', array('load_cpf_pm', '1')), +			array('config.update', array('load_cpf_viewprofile', '1')), +			array('config.update', array('load_cpf_viewtopic', '1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_cleanup.php new file mode 100644 index 0000000000..c44167dbfe --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_cleanup.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_occ') && +			!$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_interests'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_interests', +			'\phpbb\db\migration\data\v310\profilefield_occupation', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_occ', +					'user_interests', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_occ'			=> array('MTEXT', ''), +					'user_interests'	=> array('MTEXT', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php b/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php new file mode 100644 index 0000000000..02cd420c0f --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_contact_field.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_contact_field extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields', 'field_is_contact'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_on_memberlist', +		); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_is_contact'			=> array('BOOL', 0), +					'field_contact_desc'		=> array('VCHAR', ''), +					'field_contact_url'			=> array('VCHAR', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_is_contact', +					'field_contact_desc', +					'field_contact_url', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php b/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php new file mode 100644 index 0000000000..5964e7a997 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_facebook.php @@ -0,0 +1,60 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_facebook extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +		); +	} + +	protected $profilefield_name = 'phpbb_facebook'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_facebook', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_facebook', +		'field_length'			=> '20', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '50', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[\w.]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VIEW_FACEBOOK_PROFILE', +		'field_contact_url'		=> 'http://facebook.com/%s/', +	); +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php b/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php new file mode 100644 index 0000000000..9bef0a4c0b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_googleplus.php @@ -0,0 +1,60 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_googleplus extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +		); +	} + +	protected $profilefield_name = 'phpbb_googleplus'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_googleplus', +		'field_type'			=> 'profilefields.type.googleplus', +		'field_ident'			=> 'phpbb_googleplus', +		'field_length'			=> '20', +		'field_minlen'			=> '3', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[\w]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VIEW_GOOGLEPLUS_PROFILE', +		'field_contact_url'		=> 'http://plus.google.com/%s', +	); +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php new file mode 100644 index 0000000000..e61653f3db --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq.php @@ -0,0 +1,54 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_icq extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_contact_field', +		); +	} + +	protected $profilefield_name = 'phpbb_icq'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_icq', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_icq', +		'field_length'			=> '20', +		'field_minlen'			=> '3', +		'field_maxlen'			=> '15', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[0-9]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'SEND_ICQ_MESSAGE', +		'field_contact_url'		=> 'https://www.icq.com/people/%s/', +	); + +	protected $user_column_name = 'user_icq'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php new file mode 100644 index 0000000000..516c690093 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_icq_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_icq_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_icq'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_icq', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_icq', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_icq'	=> array('VCHAR:20', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php b/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php new file mode 100644 index 0000000000..33a5ba15ae --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_interests.php @@ -0,0 +1,52 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_interests extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	protected $profilefield_name = 'phpbb_interests'; + +	protected $profilefield_database_type = array('MTEXT', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_interests', +		'field_type'			=> 'profilefields.type.text', +		'field_ident'			=> 'phpbb_interests', +		'field_length'			=> '3|30', +		'field_minlen'			=> '2', +		'field_maxlen'			=> '500', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 0, +		'field_show_on_vt'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +	); + +	protected $user_column_name = 'user_interests'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_location.php b/phpBB/phpbb/db/migration/data/v310/profilefield_location.php new file mode 100644 index 0000000000..2d27c09e68 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_location.php @@ -0,0 +1,52 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_location extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_on_memberlist', +		); +	} + +	protected $profilefield_name = 'phpbb_location'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_location', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_location', +		'field_length'			=> '20', +		'field_minlen'			=> '2', +		'field_maxlen'			=> '100', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +	); + +	protected $user_column_name = 'user_from'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_location_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_location_cleanup.php new file mode 100644 index 0000000000..b824e3406a --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_location_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_location_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_from'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_location', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_from', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_from'	=> array('VCHAR_UNI:100', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_occupation.php b/phpBB/phpbb/db/migration/data/v310/profilefield_occupation.php new file mode 100644 index 0000000000..75df2bcdee --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_occupation.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_occupation extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_interests', +		); +	} + +	protected $profilefield_name = 'phpbb_occupation'; + +	protected $profilefield_database_type = array('MTEXT', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_occupation', +		'field_type'			=> 'profilefields.type.text', +		'field_ident'			=> 'phpbb_occupation', +		'field_length'			=> '3|30', +		'field_minlen'			=> '2', +		'field_maxlen'			=> '500', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 0, +		'field_show_on_vt'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +	); + +	protected $user_column_name = 'user_occ'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_on_memberlist.php b/phpBB/phpbb/db/migration/data/v310/profilefield_on_memberlist.php new file mode 100644 index 0000000000..7ce5de0f00 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_on_memberlist.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_on_memberlist extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields', 'field_show_on_ml'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_cleanup', +		); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_ml'		=> array('BOOL', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'profile_fields'	=> array( +					'field_show_on_ml', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php b/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php new file mode 100644 index 0000000000..5fc88b6809 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_show_novalue.php @@ -0,0 +1,49 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_show_novalue extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields', 'field_show_novalue'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\profilefield_types'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue' => array('BOOL', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns' => array( +				$this->table_prefix . 'profile_fields' => array( +					'field_show_novalue', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php b/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php new file mode 100644 index 0000000000..9a5de9d0eb --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_skype.php @@ -0,0 +1,60 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_skype extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +		); +	} + +	protected $profilefield_name = 'phpbb_skype'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_skype', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_skype', +		'field_length'			=> '20', +		'field_minlen'			=> '6', +		'field_maxlen'			=> '32', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[a-zA-Z][\w\.,\-_]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VIEW_SKYPE_PROFILE', +		'field_contact_url'		=> 'skype:%s?userinfo', +	); +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php b/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php new file mode 100644 index 0000000000..68d038f609 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_twitter.php @@ -0,0 +1,60 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_twitter extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +		); +	} + +	protected $profilefield_name = 'phpbb_twitter'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_twitter', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_twitter', +		'field_length'			=> '20', +		'field_minlen'			=> '1', +		'field_maxlen'			=> '15', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[\w_]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VIEW_TWITTER_PROFILE', +		'field_contact_url'		=> 'http://twitter.com/%s', +	); +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_types.php b/phpBB/phpbb/db/migration/data/v310/profilefield_types.php new file mode 100644 index 0000000000..5045eb8807 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_types.php @@ -0,0 +1,110 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_types extends \phpbb\db\migration\migration +{ + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha2', +		); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'profile_fields'			=> array( +					'field_type'		=> array('VCHAR:100', ''), +				), +				$this->table_prefix . 'profile_fields_lang'		=> array( +					'field_type'		=> array('VCHAR:100', ''), +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_profile_fields_type'))), +			array('custom', array(array($this, 'update_profile_fields_lang_type'))), +		); +	} + +	public function update_profile_fields_type() +	{ +		// Update profile field types +		$sql = 'SELECT field_type +			FROM ' . $this->table_prefix . 'profile_fields +			GROUP BY field_type'; +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "profile_fields +				SET field_type = '" . $this->db->sql_escape($this->convert_phpbb30_field_type($row['field_type'])) . "' +				WHERE field_type = '" . $this->db->sql_escape($row['field_type']) . "'"; +			$this->sql_query($sql); +		} +		$this->db->sql_freeresult($result); +	} + +	public function update_profile_fields_lang_type() +	{ +		// Update profile field language types +		$sql = 'SELECT field_type +			FROM ' . $this->table_prefix . 'profile_fields_lang +			GROUP BY field_type'; +		$result = $this->db->sql_query($sql); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$sql = 'UPDATE ' . $this->table_prefix . "profile_fields_lang +				SET field_type = '" . $this->db->sql_escape($this->convert_phpbb30_field_type($row['field_type'])) . "' +				WHERE field_type = '" . $this->db->sql_escape($row['field_type']) . "'"; +			$this->sql_query($sql); +		} +		$this->db->sql_freeresult($result); +	} + +	/** +	* Determine the new field type for a given phpBB 3.0 field type +	* +	*	@param	$field_type	string		Field type in 3.0 +	*	@return		string		Field new type which is used since 3.1 +	*/ +	public function convert_phpbb30_field_type($field_type) +	{ +		switch ($field_type) +		{ +			case FIELD_INT: +				return 'profilefields.type.int'; +			case FIELD_STRING: +				return 'profilefields.type.string'; +			case FIELD_TEXT: +				return 'profilefields.type.text'; +			case FIELD_BOOL: +				return 'profilefields.type.bool'; +			case FIELD_DROPDOWN: +				return 'profilefields.type.dropdown'; +			case FIELD_DATE: +				return 'profilefields.type.date'; +			default: +				return $field_type; +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_website.php b/phpBB/phpbb/db/migration/data/v310/profilefield_website.php new file mode 100644 index 0000000000..e1e10f09f4 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_website.php @@ -0,0 +1,56 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_website extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_on_memberlist', +			'\phpbb\db\migration\data\v310\profilefield_icq_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_website'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_website', +		'field_type'			=> 'profilefields.type.url', +		'field_ident'			=> 'phpbb_website', +		'field_length'			=> '40', +		'field_minlen'			=> '12', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VISIT_WEBSITE', +		'field_contact_url'		=> '%s', +	); + +	protected $user_column_name = 'user_website'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php new file mode 100644 index 0000000000..94442f0497 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_website_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_website_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_website'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_website', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_website', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_website'	=> array('VCHAR_UNI:200', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php new file mode 100644 index 0000000000..2cd333fcbd --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_wlm extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_website_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_wlm'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_wlm', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_wlm', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> '', +		'field_contact_url'		=> '', +	); + +	protected $user_column_name = 'user_msnm'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php new file mode 100644 index 0000000000..7ef9e44020 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_wlm_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_wlm_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_msnm'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_wlm', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_msnm', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_msnm'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php new file mode 100644 index 0000000000..e269f88420 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo.php @@ -0,0 +1,55 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_yahoo extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_wlm_cleanup', +		); +	} + +	protected $profilefield_name = 'phpbb_yahoo'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_yahoo', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_yahoo', +		'field_length'			=> '40', +		'field_minlen'			=> '5', +		'field_maxlen'			=> '255', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '.*', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_on_ml'		=> 0, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'SEND_YIM_MESSAGE', +		'field_contact_url'		=> 'http://edit.yahoo.com/config/send_webmesg?.target=%s&.src=pg', +	); + +	protected $user_column_name = 'user_yim'; +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php new file mode 100644 index 0000000000..bd724ff7db --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_yahoo_cleanup.php @@ -0,0 +1,51 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_yahoo_cleanup extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_yim'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_yahoo', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_yim', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_yim'	=> array('VCHAR_UNI', ''), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php b/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php new file mode 100644 index 0000000000..bb90c0aa5c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/profilefield_youtube.php @@ -0,0 +1,60 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class profilefield_youtube extends \phpbb\db\migration\profilefield_base_migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\profilefield_types', +			'\phpbb\db\migration\data\v310\profilefield_show_novalue', +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +		); +	} + +	protected $profilefield_name = 'phpbb_youtube'; + +	protected $profilefield_database_type = array('VCHAR', ''); + +	protected $profilefield_data = array( +		'field_name'			=> 'phpbb_youtube', +		'field_type'			=> 'profilefields.type.string', +		'field_ident'			=> 'phpbb_youtube', +		'field_length'			=> '20', +		'field_minlen'			=> '3', +		'field_maxlen'			=> '60', +		'field_novalue'			=> '', +		'field_default_value'	=> '', +		'field_validation'		=> '[a-zA-Z][\w\.,\-_]+', +		'field_required'		=> 0, +		'field_show_novalue'	=> 0, +		'field_show_on_reg'		=> 0, +		'field_show_on_pm'		=> 1, +		'field_show_on_vt'		=> 1, +		'field_show_profile'	=> 1, +		'field_hide'			=> 0, +		'field_no_view'			=> 0, +		'field_active'			=> 1, +		'field_is_contact'		=> 1, +		'field_contact_desc'	=> 'VIEW_YOUTUBE_CHANNEL', +		'field_contact_url'		=> 'http://youtube.com/user/%s', +	); +} diff --git a/phpBB/phpbb/db/migration/data/v310/prune_shadow_topics.php b/phpBB/phpbb/db/migration/data/v310/prune_shadow_topics.php new file mode 100644 index 0000000000..f6d27d385e --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/prune_shadow_topics.php @@ -0,0 +1,50 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class prune_shadow_topics extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'forums'		=> array( +					'enable_shadow_prune'	=> array('BOOL', 0), +					'prune_shadow_days'	=> array('UINT', 7), +					'prune_shadow_freq'	=> array('UINT', 1), +					'prune_shadow_next'	=> array('INT:11', 0), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'forums'		=> array( +					'enable_shadow_prune', +					'prune_shadow_days', +					'prune_shadow_freq', +					'prune_shadow_next', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/rc1.php b/phpBB/phpbb/db/migration/data/v310/rc1.php new file mode 100644 index 0000000000..10ba7fefff --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/rc1.php @@ -0,0 +1,39 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class rc1 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\beta4', +			'\phpbb\db\migration\data\v310\contact_admin_acp_module', +			'\phpbb\db\migration\data\v310\contact_admin_form', +			'\phpbb\db\migration\data\v310\passwords_convert_p2', +			'\phpbb\db\migration\data\v310\profilefield_facebook', +			'\phpbb\db\migration\data\v310\profilefield_googleplus', +			'\phpbb\db\migration\data\v310\profilefield_skype', +			'\phpbb\db\migration\data\v310\profilefield_twitter', +			'\phpbb\db\migration\data\v310\profilefield_youtube', +		); +	} + +	public function update_data() +	{ +		return array( +			array('config.update', array('version', '3.1.0-RC1')), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/reported_posts_display.php b/phpBB/phpbb/db/migration/data/v310/reported_posts_display.php new file mode 100644 index 0000000000..575a65d9dd --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/reported_posts_display.php @@ -0,0 +1,53 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class reported_posts_display extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'reports', 'reported_post_enable_bbcode'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'reports'		=> array( +					'reported_post_enable_bbcode'		=> array('BOOL', 1), +					'reported_post_enable_smilies'		=> array('BOOL', 1), +					'reported_post_enable_magic_url'	=> array('BOOL', 1), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'reports'		=> array( +					'reported_post_enable_bbcode', +					'reported_post_enable_smilies', +					'reported_post_enable_magic_url', +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/reset_missing_captcha_plugin.php b/phpBB/phpbb/db/migration/data/v310/reset_missing_captcha_plugin.php new file mode 100644 index 0000000000..d5f9076196 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/reset_missing_captcha_plugin.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +/** +* Class captcha_plugin +* +* Reset the captcha setting to the default plugin if the defined 'captcha_plugin' is missing. +*/ +class reset_missing_captcha_plugin extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('if', array( +				(!is_file($this->phpbb_root_path . "includes/captcha/plugins/{$this->config['captcha_plugin']}_plugin." . $this->php_ext)), +				array('config.update', array('captcha_plugin', 'phpbb_captcha_nogd')), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php b/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php new file mode 100644 index 0000000000..e50f5e53a0 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/signature_module_auth.php @@ -0,0 +1,57 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class signature_module_auth extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		$sql = 'SELECT module_auth +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'ucp' +				AND module_basename = 'ucp_profile' +				AND module_mode = 'signature'"; +		$result = $this->db->sql_query($sql); +		$module_auth = $this->db->sql_fetchfield('module_auth'); +		$this->db->sql_freeresult($result); + +		return $module_auth === 'acl_u_sig' || $module_auth === false; +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array( +					array($this, 'update_signature_module_auth'), +				), +			), +		); +	} + +	public function update_signature_module_auth() +	{ +		$sql = 'UPDATE ' . MODULES_TABLE . " +			SET module_auth = 'acl_u_sig' +			WHERE module_class = 'ucp' +				AND module_basename = 'ucp_profile' +				AND module_mode = 'signature' +				AND module_auth = ''"; +		$this->db->sql_query($sql); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php new file mode 100644 index 0000000000..f5970e74b2 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert.php @@ -0,0 +1,132 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +/** + * Migration to convert the Soft Delete MOD for 3.0 + * + * https://www.phpbb.com/customise/db/mod/soft_delete/ + */ +class soft_delete_mod_convert extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\alpha3', +		); +	} + +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_deleted'); +	} + +	public function update_data() +	{ +		return array( +			array('permission.remove', array('m_harddelete', true)), +			array('permission.remove', array('m_harddelete', false)), + +			array('custom', array(array($this, 'convert_posts'))), +			array('custom', array(array($this, 'convert_topics'))), +		); +	} + +	public function convert_posts($start) +	{ +		$content_visibility = $this->get_content_visibility(); + +		$limit = 250; +		$i = 0; + +		$sql = 'SELECT p.*, t.topic_first_post_id, t.topic_last_post_id +			FROM ' . $this->table_prefix . 'posts p, ' . $this->table_prefix . 'topics t +			WHERE p.post_deleted > 0 +				AND t.topic_id = p.topic_id'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$content_visibility->set_post_visibility( +				ITEM_DELETED, +				$row['post_id'], +				$row['topic_id'], +				$row['forum_id'], +				$row['post_deleted'], +				$row['post_deleted_time'], +				'', +				($row['post_id'] == $row['topic_first_post_id']) ? true : false, +				($row['post_id'] == $row['topic_last_post_id']) ? true : false +			); + +			$i++; +		} + +		$this->db->sql_freeresult($result); + +		if ($i == $limit) +		{ +			return $start + $i; +		} +	} + +	public function convert_topics($start) +	{ +		$content_visibility = $this->get_content_visibility(); + +		$limit = 100; +		$i = 0; + +		$sql = 'SELECT * +			FROM ' . $this->table_prefix . 'topics +			WHERE topic_deleted > 0'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$content_visibility->set_topic_visibility( +				ITEM_DELETED, +				$row['topic_id'], +				$row['forum_id'], +				$row['topic_deleted'], +				$row['topic_deleted_time'], +				'' +			); + +			$i++; +		} + +		$this->db->sql_freeresult($result); + +		if ($i == $limit) +		{ +			return $start + $i; +		} +	} + +	protected function get_content_visibility() +	{ +		return new \phpbb\content_visibility( +			new \phpbb\auth\auth(), +			$this->db, +			new \phpbb\user(), +			$this->phpbb_root_path, +			$this->php_ext, +			$this->table_prefix . 'forums', +			$this->table_prefix . 'posts', +			$this->table_prefix . 'topics', +			$this->table_prefix . 'users' +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php new file mode 100644 index 0000000000..246a267a8c --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/soft_delete_mod_convert2.php @@ -0,0 +1,66 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +/** + * Migration to convert the Soft Delete MOD for 3.0 + * + * https://www.phpbb.com/customise/db/mod/soft_delete/ + */ +class soft_delete_mod_convert2 extends \phpbb\db\migration\migration +{ +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\soft_delete_mod_convert', +		); +	} + +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_deleted'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'forums'			=> array('forum_deleted_topic_count', 'forum_deleted_reply_count'), +				$this->table_prefix . 'posts'			=> array('post_deleted', 'post_deleted_time'), +				$this->table_prefix . 'topics'			=> array('topic_deleted', 'topic_deleted_time', 'topic_deleted_reply_count'), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'forums'			=> array( +					'forum_deleted_topic_count'		=> array('UINT', 0), +					'forum_deleted_reply_count'		=> array('UINT', 0), +				), +				$this->table_prefix . 'posts'			=> array( +					'post_deleted'					=> array('UINT', 0), +					'post_deleted_time'				=> array('TIMESTAMP', 0), +				), +				$this->table_prefix . 'topics'			=> array( +					'topic_deleted'					=> array('UINT', 0), +					'topic_deleted_time'			=> array('TIMESTAMP', 0), +					'topic_deleted_reply_count'		=> array('UINT', 0), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php b/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php new file mode 100644 index 0000000000..5e68db5889 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/softdelete_mcp_modules.php @@ -0,0 +1,61 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class softdelete_mcp_modules extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'mcp' +				AND module_basename = 'mcp_queue' +				AND module_mode = 'deleted_topics'"; +		$result = $this->db->sql_query($sql); +		$module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		return $module_id !== false; +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +			'\phpbb\db\migration\data\v310\softdelete_p2', +		); +	} + +	public function update_data() +	{ +		return array( +			array('module.add', array( +				'mcp', +				'MCP_QUEUE', +				array( +					'module_basename'	=> 'mcp_queue', +					'modes'				=> array('deleted_topics'), +				), +			)), +			array('module.add', array( +				'mcp', +				'MCP_QUEUE', +				array( +					'module_basename'	=> 'mcp_queue', +					'modes'				=> array('deleted_posts'), +				), +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/softdelete_p1.php b/phpBB/phpbb/db/migration/data/v310/softdelete_p1.php new file mode 100644 index 0000000000..b1e7486e24 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/softdelete_p1.php @@ -0,0 +1,211 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class softdelete_p1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_visibility'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'forums'		=> array( +					'forum_posts_approved'		=> array('UINT', 0), +					'forum_posts_unapproved'	=> array('UINT', 0), +					'forum_posts_softdeleted'	=> array('UINT', 0), +					'forum_topics_approved'		=> array('UINT', 0), +					'forum_topics_unapproved'	=> array('UINT', 0), +					'forum_topics_softdeleted'	=> array('UINT', 0), +				), +				$this->table_prefix . 'posts'		=> array( +					'post_visibility'		=> array('TINT:3', 0), +					'post_delete_time'		=> array('TIMESTAMP', 0), +					'post_delete_reason'	=> array('STEXT_UNI', ''), +					'post_delete_user'		=> array('UINT', 0), +				), +				$this->table_prefix . 'topics'		=> array( +					'topic_visibility'		=> array('TINT:3', 0), +					'topic_delete_time'		=> array('TIMESTAMP', 0), +					'topic_delete_reason'	=> array('STEXT_UNI', ''), +					'topic_delete_user'		=> array('UINT', 0), +					'topic_posts_approved'		=> array('UINT', 0), +					'topic_posts_unapproved'	=> array('UINT', 0), +					'topic_posts_softdeleted'	=> array('UINT', 0), +				), +			), +			'add_index'		=> array( +				$this->table_prefix . 'posts'		=> array( +					'post_visibility'		=> array('post_visibility'), +				), +				$this->table_prefix . 'topics'		=> array( +					'topic_visibility'		=> array('topic_visibility'), +					'forum_vis_last'		=> array('forum_id', 'topic_visibility', 'topic_last_post_id'), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'forums'		=> array( +					'forum_posts_approved', +					'forum_posts_unapproved', +					'forum_posts_softdeleted', +					'forum_topics_approved', +					'forum_topics_unapproved', +					'forum_topics_softdeleted', +				), +				$this->table_prefix . 'posts'		=> array( +					'post_visibility', +					'post_delete_time', +					'post_delete_reason', +					'post_delete_user', +				), +				$this->table_prefix . 'topics'		=> array( +					'topic_visibility', +					'topic_delete_time', +					'topic_delete_reason', +					'topic_delete_user', +					'topic_posts_approved', +					'topic_posts_unapproved', +					'topic_posts_softdeleted', +				), +			), +			'drop_keys'		=> array( +				$this->table_prefix . 'posts'		=> array('post_visibility'), +				$this->table_prefix . 'topics'	=> array('topic_visibility', 'forum_vis_last'), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_post_visibility'))), +			array('custom', array(array($this, 'update_topic_visibility'))), +			array('custom', array(array($this, 'update_topics_post_counts'))), +			array('custom', array(array($this, 'update_forums_topic_and_post_counts'))), + +			array('permission.add', array('f_softdelete', false)), +			array('permission.add', array('m_softdelete', false)), +		); +	} + +	public function update_post_visibility() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . 'posts +			SET post_visibility = post_approved'; +		$this->sql_query($sql); +	} + +	public function update_topic_visibility() +	{ +		$sql = 'UPDATE ' . $this->table_prefix . 'topics +			SET topic_visibility = topic_approved'; +		$this->sql_query($sql); +	} + +	public function update_topics_post_counts() +	{ +		/* +		* Using sql_case here to avoid "BIGINT UNSIGNED value is out of range" errors. +		* As we update all topics in 2 queries, one broken topic would stop the conversion +		* for all topics and the surpressed error will cause the admin to not even notice it. +		*/ +		$sql = 'UPDATE ' . $this->table_prefix . 'topics +			SET topic_posts_approved = topic_replies + 1, +				topic_posts_unapproved = ' . $this->db->sql_case('topic_replies_real > topic_replies', 'topic_replies_real - topic_replies', '0') . ' +			WHERE topic_visibility = ' . ITEM_APPROVED; +		$this->sql_query($sql); + +		$sql = 'UPDATE ' . $this->table_prefix . 'topics +			SET topic_posts_approved = 0, +				topic_posts_unapproved = (' . $this->db->sql_case('topic_replies_real > topic_replies', 'topic_replies_real - topic_replies', '0') . ') + 1 +			WHERE topic_visibility = ' . ITEM_UNAPPROVED; +		$this->sql_query($sql); +	} + +	public function update_forums_topic_and_post_counts($start) +	{ +		$start = (int) $start; +		$limit = 10; +		$converted_forums = 0; + +		if (!$start) +		{ +			// Preserve the forum_posts value for link forums as it represents redirects. +			$sql = 'UPDATE ' . $this->table_prefix . 'forums +				SET forum_posts_approved = forum_posts +				WHERE forum_type = ' . FORUM_LINK; +			$this->db->sql_query($sql); +		} + +		$sql = 'SELECT forum_id, topic_visibility, COUNT(topic_id) AS sum_topics, SUM(topic_posts_approved) AS sum_posts_approved, SUM(topic_posts_unapproved) AS sum_posts_unapproved +			FROM ' . $this->table_prefix . 'topics +			GROUP BY forum_id, topic_visibility +			ORDER BY forum_id, topic_visibility'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		$update_forums = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$converted_forums++; + +			$forum_id = (int) $row['forum_id']; +			if (!isset($update_forums[$forum_id])) +			{ +				$update_forums[$forum_id] = array( +					'forum_posts_approved'		=> 0, +					'forum_posts_unapproved'	=> 0, +					'forum_topics_approved'		=> 0, +					'forum_topics_unapproved'	=> 0, +				); +			} + +			$update_forums[$forum_id]['forum_posts_approved'] += (int) $row['sum_posts_approved']; +			$update_forums[$forum_id]['forum_posts_unapproved'] += (int) $row['sum_posts_unapproved']; + +			$update_forums[$forum_id][(($row['topic_visibility'] == ITEM_APPROVED) ? 'forum_topics_approved' : 'forum_topics_unapproved')] += (int) $row['sum_topics']; +		} +		$this->db->sql_freeresult($result); + +		foreach ($update_forums as $forum_id => $forum_data) +		{ +			$sql = 'UPDATE ' . FORUMS_TABLE . ' +				SET ' . $this->db->sql_build_array('UPDATE', $forum_data) . ' +				WHERE forum_id = ' . $forum_id; +			$this->sql_query($sql); +		} + +		if ($converted_forums < $limit) +		{ +			// There are no more topics, we are done +			return; +		} + +		// There are still more topics to query, return the next start value +		return $start + $limit; +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php b/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php new file mode 100644 index 0000000000..849a996c1b --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/softdelete_p2.php @@ -0,0 +1,78 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class softdelete_p2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'posts', 'post_approved'); +	} + +	static public function depends_on() +	{ +		return array( +			'\phpbb\db\migration\data\v310\dev', +			'\phpbb\db\migration\data\v310\softdelete_p1', +		); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'		=> array( +				$this->table_prefix . 'forums'			=> array('forum_posts', 'forum_topics', 'forum_topics_real'), +				$this->table_prefix . 'posts'			=> array('post_approved'), +				$this->table_prefix . 'topics'			=> array('topic_approved', 'topic_replies', 'topic_replies_real'), +			), +			'drop_keys'		=> array( +				$this->table_prefix . 'posts'			=> array('post_approved'), +				$this->table_prefix . 'topics'			=> array( +					'forum_appr_last', +					'topic_approved', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'		=> array( +				$this->table_prefix . 'forums'			=> array( +					'forum_posts'			=> array('UINT', 0), +					'forum_topics'			=> array('UINT', 0), +					'forum_topics_real'		=> array('UINT', 0), +				), +				$this->table_prefix . 'posts'			=> array( +					'post_approved'			=> array('BOOL', 1), +				), +				$this->table_prefix . 'topics'		=> array( +					'topic_approved'			=> array('BOOL', 1), +					'topic_replies'				=> array('UINT', 0), +					'topic_replies_real'		=> array('UINT', 0), +				), +			), +			'add_index'		=> array( +				$this->table_prefix . 'posts'			=> array( +					'post_approved'		=> array('post_approved'), +				), +				$this->table_prefix . 'topics'		=> array( +					'forum_appr_last'	=> array('forum_id', 'topic_approved', 'topic_last_post_id'), +					'topic_approved'	=> array('topic_approved'), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/style_update_p1.php b/phpBB/phpbb/db/migration/data/v310/style_update_p1.php new file mode 100644 index 0000000000..5a3a1d5de7 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/style_update_p1.php @@ -0,0 +1,191 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class style_update_p1 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_table_exists($this->table_prefix . 'styles_imageset'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'styles'		=> array( +					'style_path'			=> array('VCHAR:100', ''), +					'bbcode_bitfield'		=> array('VCHAR:255', 'kNg='), +					'style_parent_id'		=> array('UINT', 0), +					'style_parent_tree'		=> array('TEXT', ''), +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'styles'		=> array( +					'style_path', +					'bbcode_bitfield', +					'style_parent_id', +					'style_parent_tree', +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'styles_update'))), +		); +	} + +	public function styles_update() +	{ +		// Get list of valid 3.1 styles +		$available_styles = array('prosilver'); + +		$iterator = new \DirectoryIterator($this->phpbb_root_path . 'styles'); +		$skip_dirs = array('.', '..', 'prosilver'); +		foreach ($iterator as $fileinfo) +		{ +			if ($fileinfo->isDir() && !in_array($fileinfo->getFilename(), $skip_dirs) && file_exists($fileinfo->getPathname() . '/style.cfg')) +			{ +				$style_cfg = parse_cfg_file($fileinfo->getPathname() . '/style.cfg'); +				if (isset($style_cfg['phpbb_version']) && version_compare($style_cfg['phpbb_version'], '3.1.0-dev', '>=')) +				{ +					// 3.1 style +					$available_styles[] = $fileinfo->getFilename(); +				} +			} +		} + +		// Get all installed styles +		if ($this->db_tools->sql_table_exists($this->table_prefix . 'styles_imageset')) +		{ +			$sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id, i.imageset_path +				FROM ' . STYLES_TABLE . ' s, ' . $this->table_prefix . 'styles_template t, ' . $this->table_prefix . 'styles_theme c, ' . $this->table_prefix . "styles_imageset i +				WHERE t.template_id = s.template_id +					AND c.theme_id = s.theme_id +					AND i.imageset_id = s.imageset_id"; +		} +		else +		{ +			$sql = 'SELECT s.style_id, t.template_path, t.template_id, t.bbcode_bitfield, t.template_inherits_id, t.template_inherit_path, c.theme_path, c.theme_id +				FROM ' . STYLES_TABLE . ' s, ' . $this->table_prefix . 'styles_template t, ' . $this->table_prefix . "stles_theme c +				WHERE t.template_id = s.template_id +					AND c.theme_id = s.theme_id"; +		} +		$result = $this->db->sql_query($sql); + +		$styles = array(); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$styles[] = $row; +		} +		$this->db->sql_freeresult($result); + +		// Decide which styles to keep, all others will be deleted +		$valid_styles = array(); +		foreach ($styles as $style_row) +		{ +			if ( +				// Delete styles with parent style (not supported yet) +				$style_row['template_inherits_id'] == 0 && +				// Check if components match +				$style_row['template_path'] == $style_row['theme_path'] && (!isset($style_row['imageset_path']) || $style_row['template_path'] == $style_row['imageset_path']) && +				// Check if components are valid +				in_array($style_row['template_path'], $available_styles) +				) +			{ +				// Valid style. Keep it +				$sql_ary = array( +					'style_path'	=> $style_row['template_path'], +					'bbcode_bitfield'	=> $style_row['bbcode_bitfield'], +					'style_parent_id'	=> 0, +					'style_parent_tree'	=> '', +				); +				$this->sql_query('UPDATE ' . STYLES_TABLE . ' +					SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . ' +					WHERE style_id = ' . $style_row['style_id']); +				$valid_styles[] = (int) $style_row['style_id']; +			} +		} + +		// Remove old entries from styles table +		if (!sizeof($valid_styles)) +		{ +			// No valid styles: remove everything and add prosilver +			$this->sql_query('DELETE FROM ' . STYLES_TABLE, $errored, $error_ary); + +			$sql_ary = array( +				'style_name'		=> 'prosilver', +				'style_copyright'	=> '© phpBB Limited', +				'style_active'		=> 1, +				'style_path'		=> 'prosilver', +				'bbcode_bitfield'	=> 'lNg=', +				'style_parent_id'	=> 0, +				'style_parent_tree'	=> '', + +				// Will be removed in the next step +				'imageset_id'		=> 0, +				'template_id'		=> 0, +				'theme_id'			=> 0, +			); + +			$sql = 'INSERT INTO ' . STYLES_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary); +			$this->sql_query($sql); + +			$sql = 'SELECT style_id +				FROM ' . $table . " +				WHERE style_name = 'prosilver'"; +			$result = $this->sql_query($sql); +			$default_style = $this->db->sql_fetchfield($result); +			$this->db->sql_freeresult($result); + +			set_config('default_style', $default_style); + +			$sql = 'UPDATE ' . USERS_TABLE . ' SET user_style = 0'; +			$this->sql_query($sql); +		} +		else +		{ +			// There are valid styles in styles table. Remove styles that are outdated +			$this->sql_query('DELETE FROM ' . STYLES_TABLE . ' +				WHERE ' . $this->db->sql_in_set('style_id', $valid_styles, true)); + +			// Change default style +			if (!in_array($this->config['default_style'], $valid_styles)) +			{ +				$this->sql_query('UPDATE ' . CONFIG_TABLE . " +					SET config_value = '" . $valid_styles[0] . "' +					WHERE config_name = 'default_style'"); +			} + +			// Reset styles for users +			$this->sql_query('UPDATE ' . USERS_TABLE . ' +				SET user_style = 0 +				WHERE ' . $this->db->sql_in_set('user_style', $valid_styles, true)); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/style_update_p2.php b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php new file mode 100644 index 0000000000..52c8ffb2e2 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/style_update_p2.php @@ -0,0 +1,151 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class style_update_p2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_table_exists($this->table_prefix . 'styles_imageset'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\style_update_p1'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_keys'	=> array( +				$this->table_prefix . 'styles'		=> array( +					'imageset_id', +					'template_id', +					'theme_id', +				), +			), + +			'drop_columns'	=> array( +				$this->table_prefix . 'styles'		=> array( +					'imageset_id', +					'template_id', +					'theme_id', +				), +			), + +			'drop_tables'	=> array( +				$this->table_prefix . 'styles_imageset', +				$this->table_prefix . 'styles_imageset_data', +				$this->table_prefix . 'styles_template', +				$this->table_prefix . 'styles_template_data', +				$this->table_prefix . 'styles_theme', +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'styles'		=> array( +					'imageset_id'	=> array('UINT', 0), +					'template_id'	=> array('UINT', 0), +					'theme_id'		=> array('UINT', 0), +				), +			), + +			'add_index'		=> array( +				$this->table_prefix . 'styles'			=> array( +					'imageset_id'		=> array('imageset_id'), +					'template_id'		=> array('template_id'), +					'theme_id'			=> array('theme_id'), +				), +			), + +			'add_tables'	=> array( +				$this->table_prefix . 'styles_imageset'		=> array( +					'COLUMNS'		=> array( +						'imageset_id'				=> array('UINT', null, 'auto_increment'), +						'imageset_name'				=> array('VCHAR_UNI:255', ''), +						'imageset_copyright'		=> array('VCHAR_UNI', ''), +						'imageset_path'				=> array('VCHAR:100', ''), +					), +					'PRIMARY_KEY'		=> 'imageset_id', +					'KEYS'				=> array( +						'imgset_nm'			=> array('UNIQUE', 'imageset_name'), +					), +				), +				$this->table_prefix . 'styles_imageset_data'	=> array( +					'COLUMNS'		=> array( +						'image_id'				=> array('UINT', null, 'auto_increment'), +						'image_name'			=> array('VCHAR:200', ''), +						'image_filename'		=> array('VCHAR:200', ''), +						'image_lang'			=> array('VCHAR:30', ''), +						'image_height'			=> array('USINT', 0), +						'image_width'			=> array('USINT', 0), +						'imageset_id'			=> array('UINT', 0), +					), +					'PRIMARY_KEY'		=> 'image_id', +					'KEYS'				=> array( +						'i_d'			=> array('INDEX', 'imageset_id'), +					), +				), +				$this->table_prefix . 'styles_template'		=> array( +					'COLUMNS'		=> array( +						'template_id'			=> array('UINT', null, 'auto_increment'), +						'template_name'			=> array('VCHAR_UNI:255', ''), +						'template_copyright'	=> array('VCHAR_UNI', ''), +						'template_path'			=> array('VCHAR:100', ''), +						'bbcode_bitfield'		=> array('VCHAR:255', 'kNg='), +						'template_storedb'		=> array('BOOL', 0), +						'template_inherits_id'		=> array('UINT:4', 0), +						'template_inherit_path'		=> array('VCHAR', ''), +					), +					'PRIMARY_KEY'	=> 'template_id', +					'KEYS'			=> array( +						'tmplte_nm'				=> array('UNIQUE', 'template_name'), +					), +				), +				$this->table_prefix . 'styles_template_data'	=> array( +					'COLUMNS'		=> array( +						'template_id'			=> array('UINT', 0), +						'template_filename'		=> array('VCHAR:100', ''), +						'template_included'		=> array('TEXT', ''), +						'template_mtime'		=> array('TIMESTAMP', 0), +						'template_data'			=> array('MTEXT_UNI', ''), +					), +					'KEYS'			=> array( +						'tid'					=> array('INDEX', 'template_id'), +						'tfn'					=> array('INDEX', 'template_filename'), +					), +				), +				$this->table_prefix . 'styles_theme'			=> array( +					'COLUMNS'		=> array( +						'theme_id'				=> array('UINT', null, 'auto_increment'), +						'theme_name'			=> array('VCHAR_UNI:255', ''), +						'theme_copyright'		=> array('VCHAR_UNI', ''), +						'theme_path'			=> array('VCHAR:100', ''), +						'theme_storedb'			=> array('BOOL', 0), +						'theme_mtime'			=> array('TIMESTAMP', 0), +						'theme_data'			=> array('MTEXT_UNI', ''), +					), +					'PRIMARY_KEY'	=> 'theme_id', +					'KEYS'			=> array( +						'theme_name'		=> array('UNIQUE', 'theme_name'), +					), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/teampage.php b/phpBB/phpbb/db/migration/data/v310/teampage.php new file mode 100644 index 0000000000..f8edbc3492 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/teampage.php @@ -0,0 +1,110 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class teampage extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return $this->db_tools->sql_table_exists($this->table_prefix . 'teampage'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_schema() +	{ +		return array( +			'add_tables'		=> array( +				$this->table_prefix . 'teampage'	=> array( +					'COLUMNS'		=> array( +						'teampage_id'		=> array('UINT', null, 'auto_increment'), +						'group_id'			=> array('UINT', 0), +						'teampage_name'		=> array('VCHAR_UNI:255', ''), +						'teampage_position'	=> array('UINT', 0), +						'teampage_parent'	=> array('UINT', 0), +					), +					'PRIMARY_KEY'		=> 'teampage_id', +				), +			), +			'drop_columns'		=> array( +				$this->table_prefix . 'groups'		=> array( +					'group_teampage', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_tables'		=> array( +				$this->table_prefix . 'teampage', +			), +			'add_columns'		=> array( +				$this->table_prefix . 'groups'		=> array( +					'group_teampage'	=> array('UINT', 0, 'after' => 'group_legend'), +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'add_groups_teampage'))), +		); +	} + +	public function add_groups_teampage() +	{ +		$sql = 'SELECT teampage_id +			FROM ' . TEAMPAGE_TABLE; +		$result = $this->db->sql_query_limit($sql, 1); +		$added_groups_teampage = (bool) $this->db->sql_fetchfield('teampage_id'); +		$this->db->sql_freeresult($result); + +		if (!$added_groups_teampage) +		{ +			$sql = 'SELECT * +				FROM ' . GROUPS_TABLE . ' +				WHERE group_type = ' . GROUP_SPECIAL . " +					AND (group_name = 'ADMINISTRATORS' +						OR group_name = 'GLOBAL_MODERATORS') +				ORDER BY group_name ASC"; +			$result = $this->db->sql_query($sql); + +			$teampage_entries = array(); +			while ($row = $this->db->sql_fetchrow($result)) +			{ +				$teampage_entries[] = array( +					'group_id'			=> (int) $row['group_id'], +					'teampage_name'		=> '', +					'teampage_position'	=> sizeof($teampage_entries) + 1, +					'teampage_parent'	=> 0, +				); +			} +			$this->db->sql_freeresult($result); + +			if (sizeof($teampage_entries)) +			{ +				$this->db->sql_multi_insert(TEAMPAGE_TABLE, $teampage_entries); +			} +			unset($teampage_entries); +		} + +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/timezone.php b/phpBB/phpbb/db/migration/data/v310/timezone.php new file mode 100644 index 0000000000..1f6b47ad50 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/timezone.php @@ -0,0 +1,194 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class timezone extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_dst'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v30x\release_3_0_11'); +	} + +	public function update_schema() +	{ +		return array( +			'change_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_timezone'		=> array('VCHAR:100', ''), +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'update_timezones'))), +		); +	} + +	public function update_timezones($start) +	{ +		$start = (int) $start; +		$limit = 500; +		$converted = 0; + +		$update_blocks = array(); + +		$sql = 'SELECT user_id, user_timezone, user_dst +			FROM ' . $this->table_prefix . 'users +			ORDER BY user_id ASC'; +		$result = $this->db->sql_query_limit($sql, $limit, $start); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$converted++; + +			// In case this is somehow run twice on a row. +			// Otherwise it would just end up as UTC on the second run +			if (is_numeric($row['user_timezone'])) +			{ +				$update_blocks[$row['user_timezone'] . ':' . $row['user_dst']][] = (int) $row['user_id']; +			} +		} +		$this->db->sql_freeresult($result); + +		// Update blocks of users who share the same timezone/dst +		foreach ($update_blocks as $timezone => $user_ids) +		{ +			$timezone = explode(':', $timezone); +			$converted_timezone = $this->convert_phpbb30_timezone($timezone[0], $timezone[1]); + +			$sql = 'UPDATE ' . $this->table_prefix . "users +				SET user_timezone = '" . $this->db->sql_escape($converted_timezone) . "' +				WHERE " . $this->db->sql_in_set('user_id', $user_ids); +			$this->sql_query($sql); +		} + +		if ($converted == $limit) +		{ +			// There are still more to convert +			return $start + $limit; +		} + +		// Update board default timezone +		$sql = 'UPDATE ' . $this->table_prefix . "config +			SET config_value = '" . $this->convert_phpbb30_timezone($this->config['board_timezone'], $this->config['board_dst']) . "' +			WHERE config_name = 'board_timezone'"; +		$this->sql_query($sql); +	} + +	/** +	* Determine the new timezone for a given phpBB 3.0 timezone and +	* "Daylight Saving Time" option +	* +	*	@param	$timezone	float	Users timezone in 3.0 +	*	@param	$dst		int		Users daylight saving time +	*	@return		string		Users new php Timezone which is used since 3.1 +	*/ +	public function convert_phpbb30_timezone($timezone, $dst) +	{ +		$offset = $timezone + $dst; + +		switch ($timezone) +		{ +			case '-12': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 12] Baker Island Time' +			case '-11': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 11] Niue Time, Samoa Standard Time' +			case '-10': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 10] Hawaii-Aleutian Standard Time, Cook Island Time' +			case '-9.5': +				return 'Pacific/Marquesas';			//'[UTC - 9:30] Marquesas Islands Time' +			case '-9': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 9] Alaska Standard Time, Gambier Island Time' +			case '-8': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 8] Pacific Standard Time' +			case '-7': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 7] Mountain Standard Time' +			case '-6': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 6] Central Standard Time' +			case '-5': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 5] Eastern Standard Time' +			case '-4.5': +				return 'America/Caracas';			//'[UTC - 4:30] Venezuelan Standard Time' +			case '-4': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 4] Atlantic Standard Time' +			case '-3.5': +				return 'America/St_Johns';			//'[UTC - 3:30] Newfoundland Standard Time' +			case '-3': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 3] Amazon Standard Time, Central Greenland Time' +			case '-2': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 2] Fernando de Noronha Time, South Georgia & the South Sandwich Islands Time' +			case '-1': +				return 'Etc/GMT+' . abs($offset);	//'[UTC - 1] Azores Standard Time, Cape Verde Time, Eastern Greenland Time' +			case '0': +				return (!$dst) ? 'UTC' : 'Etc/GMT-1';	//'[UTC] Western European Time, Greenwich Mean Time' +			case '1': +				return 'Etc/GMT-' . $offset;		//'[UTC + 1] Central European Time, West African Time' +			case '2': +				return 'Etc/GMT-' . $offset;		//'[UTC + 2] Eastern European Time, Central African Time' +			case '3': +				return 'Etc/GMT-' . $offset;		//'[UTC + 3] Moscow Standard Time, Eastern African Time' +			case '3.5': +				return 'Asia/Tehran';				//'[UTC + 3:30] Iran Standard Time' +			case '4': +				return 'Etc/GMT-' . $offset;		//'[UTC + 4] Gulf Standard Time, Samara Standard Time' +			case '4.5': +				return 'Asia/Kabul';				//'[UTC + 4:30] Afghanistan Time' +			case '5': +				return 'Etc/GMT-' . $offset;		//'[UTC + 5] Pakistan Standard Time, Yekaterinburg Standard Time' +			case '5.5': +				return 'Asia/Kolkata';				//'[UTC + 5:30] Indian Standard Time, Sri Lanka Time' +			case '5.75': +				return 'Asia/Kathmandu';			//'[UTC + 5:45] Nepal Time' +			case '6': +				return 'Etc/GMT-' . $offset;		//'[UTC + 6] Bangladesh Time, Bhutan Time, Novosibirsk Standard Time' +			case '6.5': +				return 'Indian/Cocos';				//'[UTC + 6:30] Cocos Islands Time, Myanmar Time' +			case '7': +				return 'Etc/GMT-' . $offset;		//'[UTC + 7] Indochina Time, Krasnoyarsk Standard Time' +			case '8': +				return 'Etc/GMT-' . $offset;		//'[UTC + 8] Chinese Standard Time, Australian Western Standard Time, Irkutsk Standard Time' +			case '8.75': +				return 'Australia/Eucla';			//'[UTC + 8:45] Southeastern Western Australia Standard Time' +			case '9': +				return 'Etc/GMT-' . $offset;		//'[UTC + 9] Japan Standard Time, Korea Standard Time, Chita Standard Time' +			case '9.5': +				return 'Australia/ACT';				//'[UTC + 9:30] Australian Central Standard Time' +			case '10': +				return 'Etc/GMT-' . $offset;		//'[UTC + 10] Australian Eastern Standard Time, Vladivostok Standard Time' +			case '10.5': +				return 'Australia/Lord_Howe';		//'[UTC + 10:30] Lord Howe Standard Time' +			case '11': +				return 'Etc/GMT-' . $offset;		//'[UTC + 11] Solomon Island Time, Magadan Standard Time' +			case '11.5': +				return 'Pacific/Norfolk';			//'[UTC + 11:30] Norfolk Island Time' +			case '12': +				return 'Etc/GMT-12';				//'[UTC + 12] New Zealand Time, Fiji Time, Kamchatka Standard Time' +			case '12.75': +				return 'Pacific/Chatham';			//'[UTC + 12:45] Chatham Islands Time' +			case '13': +				return 'Pacific/Tongatapu';			//'[UTC + 13] Tonga Time, Phoenix Islands Time' +			case '14': +				return 'Pacific/Kiritimati';		//'[UTC + 14] Line Island Time' +			default: +				return 'UTC'; +		} +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/timezone_p2.php b/phpBB/phpbb/db/migration/data/v310/timezone_p2.php new file mode 100644 index 0000000000..3ac7ab3c51 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/timezone_p2.php @@ -0,0 +1,49 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class timezone_p2 extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		return !$this->db_tools->sql_column_exists($this->table_prefix . 'users', 'user_dst'); +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\timezone'); +	} + +	public function update_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_dst', +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'users'			=> array( +					'user_dst'		=> array('BOOL', 0), +				), +			), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php b/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php new file mode 100644 index 0000000000..8600f6ee27 --- /dev/null +++ b/phpBB/phpbb/db/migration/data/v310/ucp_popuppm_module.php @@ -0,0 +1,46 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\data\v310; + +class ucp_popuppm_module extends \phpbb\db\migration\migration +{ +	public function effectively_installed() +	{ +		$sql = 'SELECT module_id +			FROM ' . MODULES_TABLE . " +			WHERE module_class = 'ucp' +				AND module_langname = 'UCP_PM_POPUP_TITLE'"; +		$result = $this->db->sql_query($sql); +		$module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		return $module_id == false; +	} + +	static public function depends_on() +	{ +		return array('\phpbb\db\migration\data\v310\dev'); +	} + +	public function update_data() +	{ +		return array( +			array('module.remove', array( +				'ucp', +				'UCP_PM', +				'UCP_PM_POPUP_TITLE', +			)), +		); +	} +} diff --git a/phpBB/phpbb/db/migration/exception.php b/phpBB/phpbb/db/migration/exception.php new file mode 100644 index 0000000000..7990e85f2d --- /dev/null +++ b/phpBB/phpbb/db/migration/exception.php @@ -0,0 +1,75 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration; + +/** +* The migrator is responsible for applying new migrations in the correct order. +*/ +class exception extends \Exception +{ +	/** +	* Extra parameters sent to exception to aid in debugging +	* @var array +	*/ +	protected $parameters; + +	/** +	* Throw an exception. +	* +	* First argument is the error message. +	* Additional arguments will be output with the error message. +	*/ +	public function __construct() +	{ +		$parameters = func_get_args(); +		$message = array_shift($parameters); +		parent::__construct($message); + +		$this->parameters = $parameters; +	} + +	/** +	* Output the error as a string +	* +	* @return string +	*/ +	public function __toString() +	{ +		return $this->message . ': ' . var_export($this->parameters, true); +	} + +	/** +	* Get the parameters +	* +	* @return array +	*/ +	public function getParameters() +	{ +		return $this->parameters; +	} + +	/** +	* Get localised message (with $user->lang()) +	* +	* @param \phpbb\user $user +	* @return string +	*/ +	public function getLocalisedMessage(\phpbb\user $user) +	{ +		$parameters = $this->getParameters(); +		array_unshift($parameters, $this->getMessage()); + +		return call_user_func_array(array($user, 'lang'), $parameters); +	} +} diff --git a/phpBB/phpbb/db/migration/helper.php b/phpBB/phpbb/db/migration/helper.php new file mode 100644 index 0000000000..e40deeb37b --- /dev/null +++ b/phpBB/phpbb/db/migration/helper.php @@ -0,0 +1,84 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration; + +/** +* The migrator is responsible for applying new migrations in the correct order. +*/ +class helper +{ +	/** +	 * Get the schema steps from an array of schema changes +	 * +	 * This splits up $schema_changes into individual changes so that the +	 * changes can be chunked +	 * +	 * @param array $schema_changes from migration +	 * @return array +	 */ +	public function get_schema_steps($schema_changes) +	{ +		$steps = array(); + +		// Nested level of data (only supports 1/2 currently) +		$nested_level = array( +			'drop_tables'		=> 1, +			'add_tables'		=> 1, +			'change_columns'	=> 2, +			'add_columns'		=> 2, +			'drop_keys'			=> 2, +			'drop_columns'		=> 2, +			'add_primary_keys'	=> 2, // perform_schema_changes only uses one level, but second is in the function +			'add_unique_index'	=> 2, +			'add_index'			=> 2, +		); + +		foreach ($nested_level as $change_type => $data_depth) +		{ +			if (!empty($schema_changes[$change_type])) +			{ +				foreach ($schema_changes[$change_type] as $key => $value) +				{ +					if ($data_depth === 1) +					{ +						$steps[] = array( +							'dbtools.perform_schema_changes', array(array( +									$change_type	=> array( +										(!is_int($key)) ? $key : 0	=> $value, +								), +							)), +						); +					} +					else if ($data_depth === 2) +					{ +						foreach ($value as $key2 => $value2) +						{ +							$steps[] = array( +								'dbtools.perform_schema_changes', array(array( +									$change_type	=> array( +										$key => array( +											$key2	=> $value2, +										), +									), +								)), +							); +						} +					} +				} +			} +		} + +		return $steps; +	} +} diff --git a/phpBB/phpbb/db/migration/migration.php b/phpBB/phpbb/db/migration/migration.php new file mode 100644 index 0000000000..5f120333e1 --- /dev/null +++ b/phpBB/phpbb/db/migration/migration.php @@ -0,0 +1,186 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration; + +/** +* Abstract base class for database migrations +* +* Each migration consists of a set of schema and data changes to be implemented +* in a subclass. This class provides various utility methods to simplify editing +* a phpBB. +*/ +abstract class migration +{ +	/** @var \phpbb\config\config */ +	protected $config; + +	/** @var \phpbb\db\driver\driver_interface */ +	protected $db; + +	/** @var \phpbb\db\tools */ +	protected $db_tools; + +	/** @var string */ +	protected $table_prefix; + +	/** @var string */ +	protected $phpbb_root_path; + +	/** @var string */ +	protected $php_ext; + +	/** @var array Errors, if any occurred */ +	protected $errors; + +	/** @var array List of queries executed through $this->sql_query() */ +	protected $queries = array(); + +	/** +	* Constructor +	* +	* @param \phpbb\config\config $config +	* @param \phpbb\db\driver\driver_interface $db +	* @param \phpbb\db\tools $db_tools +	* @param string $phpbb_root_path +	* @param string $php_ext +	* @param string $table_prefix +	*/ +	public function __construct(\phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix) +	{ +		$this->config = $config; +		$this->db = $db; +		$this->db_tools = $db_tools; +		$this->table_prefix = $table_prefix; + +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; + +		$this->errors = array(); +	} + +	/** +	* Defines other migrations to be applied first +	* +	* @return array An array of migration class names +	*/ +	static public function depends_on() +	{ +		return array(); +	} + +	/** +	* Allows you to check if the migration is effectively installed (entirely optional) +	* +	* This is checked when a migration is installed. If true is returned, the migration will be set as +	* installed without performing the database changes. +	* This function is intended to help moving to migrations from a previous database updater, where some +	* migrations may have been installed already even though they are not yet listed in the migrations table. +	* +	* @return bool True if this migration is installed, False if this migration is not installed (checked on install) +	*/ +	public function effectively_installed() +	{ +		return false; +	} + +	/** +	* Updates the database schema by providing a set of change instructions +	* +	* @return array Array of schema changes (compatible with db_tools->perform_schema_changes()) +	*/ +	public function update_schema() +	{ +		return array(); +	} + +	/** +	* Reverts the database schema by providing a set of change instructions +	* +	* @return array Array of schema changes (compatible with db_tools->perform_schema_changes()) +	*/ +	public function revert_schema() +	{ +		return array(); +	} + +	/** +	* Updates data by returning a list of instructions to be executed +	* +	* @return array Array of data update instructions +	*/ +	public function update_data() +	{ +		return array(); +	} + +	/** +	* Reverts data by returning a list of instructions to be executed +	* +	* @return array Array of data instructions that will be performed on revert +	* 	NOTE: calls to tools (such as config.add) are automatically reverted when +	* 		possible, so you should not attempt to revert those, this is mostly for +	* 		otherwise unrevertable calls (custom functions for example) +	*/ +	public function revert_data() +	{ +		return array(); +	} + +	/** +	* Wrapper for running queries to generate user feedback on updates +	* +	* @param string $sql SQL query to run on the database +	* @return mixed Query result from db->sql_query() +	*/ +	protected function sql_query($sql) +	{ +		$this->queries[] = $sql; + +		$this->db->sql_return_on_error(true); + +		if ($sql === 'begin') +		{ +			$result = $this->db->sql_transaction('begin'); +		} +		else if ($sql === 'commit') +		{ +			$result = $this->db->sql_transaction('commit'); +		} +		else +		{ +			$result = $this->db->sql_query($sql); +			if ($this->db->get_sql_error_triggered()) +			{ +				$this->errors[] = array( +					'sql'	=> $this->db->get_sql_error_sql(), +					'code'	=> $this->db->get_sql_error_returned(), +				); +			} +		} + +		$this->db->sql_return_on_error(false); + +		return $result; +	} + +	/** +	* Get the list of queries run +	* +	* @return array +	*/ +	public function get_queries() +	{ +		return $this->queries; +	} +} diff --git a/phpBB/phpbb/db/migration/profilefield_base_migration.php b/phpBB/phpbb/db/migration/profilefield_base_migration.php new file mode 100644 index 0000000000..e66e5fd080 --- /dev/null +++ b/phpBB/phpbb/db/migration/profilefield_base_migration.php @@ -0,0 +1,247 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration; + +abstract class profilefield_base_migration extends \phpbb\db\migration\migration +{ +	protected $profilefield_name; + +	protected $profilefield_database_type; + +	protected $profilefield_data; + +	/** +	* Language data should be in array -> each language_data in separate key +	* array( +	*	array( +	*		'option_id'	=> value, +	*		'field_type'	=> value, +	*		'lang_value'	=> value, +	*	), +	*	array( +	*		'option_id'	=> value, +	*		'field_type'	=> value, +	*		'lang_value'	=> value, +	*	), +	* ) +	*/ +	protected $profilefield_language_data; + +	protected $user_column_name; + +	public function effectively_installed() +	{ +		return $this->db_tools->sql_column_exists($this->table_prefix . 'profile_fields_data', 'pf_' . $this->profilefield_name); +	} + +	public function update_schema() +	{ +		return array( +			'add_columns'	=> array( +				$this->table_prefix . 'profile_fields_data'			=> array( +					'pf_' . $this->profilefield_name		=> $this->profilefield_database_type, +				), +			), +		); +	} + +	public function revert_schema() +	{ +		return array( +			'drop_columns'	=> array( +				$this->table_prefix . 'profile_fields_data'			=> array( +					'pf_' . $this->profilefield_name, +				), +			), +		); +	} + +	public function update_data() +	{ +		return array( +			array('custom', array(array($this, 'create_custom_field'))), +			array('custom', array(array($this, 'convert_user_field_to_custom_field'))), +		); +	} + +	public function revert_data() +	{ +		return array( +			array('custom', array(array($this, 'delete_custom_profile_field_data'))), +		); +	} + +	public function create_custom_field() +	{ +		$sql = 'SELECT MAX(field_order) as max_field_order +			FROM ' . PROFILE_FIELDS_TABLE; +		$result = $this->db->sql_query($sql); +		$max_field_order = (int) $this->db->sql_fetchfield('max_field_order'); +		$this->db->sql_freeresult($result); + +		$sql_ary = array_merge($this->profilefield_data, array( +			'field_order'			=> $max_field_order + 1, +		)); + +		$sql = 'INSERT INTO ' . PROFILE_FIELDS_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary); +		$this->db->sql_query($sql); +		$field_id = (int) $this->db->sql_nextid(); + +		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, PROFILE_LANG_TABLE); + +		$sql = 'SELECT lang_id +			FROM ' . LANG_TABLE; +		$result = $this->db->sql_query($sql); +		$lang_name = (strpos($this->profilefield_name, 'phpbb_') === 0) ? strtoupper(substr($this->profilefield_name, 6)) : strtoupper($this->profilefield_name); +		while ($lang_id = (int) $this->db->sql_fetchfield('lang_id')) +		{ +			$insert_buffer->insert(array( +				'field_id'				=> $field_id, +				'lang_id'				=> $lang_id, +				'lang_name'				=> $lang_name, +				'lang_explain'			=> '', +				'lang_default_value'	=> '', +			)); +		} +		$this->db->sql_freeresult($result); + +		$insert_buffer->flush(); +	} + +	/** +	* Create Custom profile fields languguage entries +	*/ +	public function create_language_entries() +	{ +		$field_id = $this->get_custom_profile_field_id(); + +		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, PROFILE_FIELDS_LANG_TABLE); + +		$sql = 'SELECT lang_id +			FROM ' . LANG_TABLE; +		$result = $this->db->sql_query($sql); +		while ($lang_id = (int) $this->db->sql_fetchfield('lang_id')) +		{ +			foreach ($this->profilefield_language_data as $language_data) +			{ +				$insert_buffer->insert(array_merge(array( +					'field_id'	=> $field_id, +					'lang_id'	=> $lang_id, +				), $language_data)); +			} +		} +		$this->db->sql_freeresult($result); + +		$insert_buffer->flush(); +	} + +	/** +	* Clean database when reverting the migration +	*/ +	public function delete_custom_profile_field_data() +	{ +		$field_id = $this->get_custom_profile_field_id(); + +		$sql = 'DELETE FROM ' . PROFILE_FIELDS_TABLE . ' +			WHERE field_id = ' . $field_id; +		$this->db->sql_query($sql); + +		$sql = 'DELETE FROM ' . PROFILE_LANG_TABLE . ' +			WHERE field_id = ' . $field_id; +		$this->db->sql_query($sql); + +		$sql = 'DELETE FROM ' . PROFILE_FIELDS_LANG_TABLE . ' +			WHERE field_id = ' . $field_id; +		$this->db->sql_query($sql); +	} + +	/** +	* Get custom profile field id +	* @return	int	custom profile filed id +	*/ +	public function get_custom_profile_field_id() +	{ +		$sql = 'SELECT field_id +			FROM ' . PROFILE_FIELDS_TABLE . " +			WHERE field_name = '" . $this->profilefield_name . "'"; +		$result = $this->db->sql_query($sql); +		$field_id = (int) $this->db->sql_fetchfield('field_id'); +		$this->db->sql_freeresult($result); + +		return $field_id; +	} + +	/** +	* @param int			$start		Start of staggering step +	* @return		mixed		int start of the next step, null if the end was reached +	*/ +	public function convert_user_field_to_custom_field($start) +	{ +		$insert_buffer = new \phpbb\db\sql_insert_buffer($this->db, $this->table_prefix . 'profile_fields_data'); +		$limit = 250; +		$converted_users = 0; + +		$sql = 'SELECT user_id, ' . $this->user_column_name . ' +			FROM ' . $this->table_prefix . 'users +			WHERE ' . $this->user_column_name . " <> '' +			ORDER BY user_id"; +		$result = $this->db->sql_query_limit($sql, $limit, $start); + +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$converted_users++; + +			$cp_data = array( +				'pf_' . $this->profilefield_name		=> $row[$this->user_column_name], +			); + +			$sql = 'UPDATE ' . $this->table_prefix . 'profile_fields_data +				SET ' . $this->db->sql_build_array('UPDATE', $cp_data) . ' +				WHERE user_id = ' . (int) $row['user_id']; +			$this->db->sql_query($sql); + +			if (!$this->db->sql_affectedrows()) +			{ +				$cp_data['user_id'] = (int) $row['user_id']; +				$cp_data = array_merge($this->get_insert_sql_array(), $cp_data); +				$insert_buffer->insert($cp_data); +			} +		} +		$this->db->sql_freeresult($result); + +		$insert_buffer->flush(); + +		if ($converted_users < $limit) +		{ +			// No more users left, we are done... +			return; +		} + +		return $start + $limit; +	} + +	protected function get_insert_sql_array() +	{ +		static $profile_row; + +		if ($profile_row === null) +		{ +			global $phpbb_container; +			$manager = $phpbb_container->get('profilefields.manager'); +			$profile_row = $manager->build_insert_sql_array(array()); +		} + +		return $profile_row; +	} +} diff --git a/phpBB/phpbb/db/migration/schema_generator.php b/phpBB/phpbb/db/migration/schema_generator.php new file mode 100644 index 0000000000..91d8307d91 --- /dev/null +++ b/phpBB/phpbb/db/migration/schema_generator.php @@ -0,0 +1,235 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration; + +/** +* The schema generator generates the schema based on the existing migrations +*/ +class schema_generator +{ +	/** @var \phpbb\config\config */ +	protected $config; + +	/** @var \phpbb\db\driver\driver_interface */ +	protected $db; + +	/** @var \phpbb\db\tools */ +	protected $db_tools; + +	/** @var array */ +	protected $class_names; + +	/** @var string */ +	protected $table_prefix; + +	/** @var string */ +	protected $phpbb_root_path; + +	/** @var string */ +	protected $php_ext; + +	/** @var array */ +	protected $tables; + +	/** @var array */ +	protected $dependencies = array(); + +	/** +	* Constructor +	*/ +	public function __construct(array $class_names, \phpbb\config\config $config, \phpbb\db\driver\driver_interface $db, \phpbb\db\tools $db_tools, $phpbb_root_path, $php_ext, $table_prefix) +	{ +		$this->config = $config; +		$this->db = $db; +		$this->db_tools = $db_tools; +		$this->class_names = $class_names; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->table_prefix = $table_prefix; +	} + +	/** +	* Loads all migrations and their application state from the database. +	* +	* @return array +	*/ +	public function get_schema() +	{ +		if (!empty($this->tables)) +		{ +			return $this->tables; +		} + +		$migrations = $this->class_names; + +		$tree = array(); +		$check_dependencies = true; +		while (!empty($migrations)) +		{ +			foreach ($migrations as $migration_class) +			{ +				$open_dependencies = array_diff($migration_class::depends_on(), $tree); + +				if (empty($open_dependencies)) +				{ +					$migration = new $migration_class($this->config, $this->db, $this->db_tools, $this->phpbb_root_path, $this->php_ext, $this->table_prefix); +					$tree[] = $migration_class; +					$migration_key = array_search($migration_class, $migrations); + +					foreach ($migration->update_schema() as $change_type => $data) +					{ +						if ($change_type === 'add_tables') +						{ +							foreach ($data as $table => $table_data) +							{ +								$this->tables[$table] = $table_data; +							} +						} +						else if ($change_type === 'drop_tables') +						{ +							foreach ($data as $table) +							{ +								unset($this->tables[$table]); +							} +						} +						else if ($change_type === 'add_columns') +						{ +							foreach ($data as $table => $add_columns) +							{ +								foreach ($add_columns as $column => $column_data) +								{ +									if (isset($column_data['after'])) +									{ +										$columns = $this->tables[$table]['COLUMNS']; +										$offset = array_search($column_data['after'], array_keys($columns)); +										unset($column_data['after']); + +										if ($offset === false) +										{ +											$this->tables[$table]['COLUMNS'][$column] = array_values($column_data); +										} +										else +										{ +											$this->tables[$table]['COLUMNS'] = array_merge(array_slice($columns, 0, $offset + 1, true), array($column => array_values($column_data)), array_slice($columns, $offset)); +										} +									} +									else +									{ +										$this->tables[$table]['COLUMNS'][$column] = $column_data; +									} +								} +							} +						} +						else if ($change_type === 'change_columns') +						{ +							foreach ($data as $table => $change_columns) +							{ +								foreach ($change_columns as $column => $column_data) +								{ +									$this->tables[$table]['COLUMNS'][$column] = $column_data; +								} +							} +						} +						else if ($change_type === 'drop_columns') +						{ +							foreach ($data as $table => $drop_columns) +							{ +								if (is_array($drop_columns)) +								{ +									foreach ($drop_columns as $column) +									{ +										unset($this->tables[$table]['COLUMNS'][$column]); +									} +								} +								else +								{ +									unset($this->tables[$table]['COLUMNS'][$drop_columns]); +								} +							} +						} +						else if ($change_type === 'add_unique_index') +						{ +							foreach ($data as $table => $add_index) +							{ +								foreach ($add_index as $key => $index_data) +								{ +									$this->tables[$table]['KEYS'][$key] = array('UNIQUE', $index_data); +								} +							} +						} +						else if ($change_type === 'add_index') +						{ +							foreach ($data as $table => $add_index) +							{ +								foreach ($add_index as $key => $index_data) +								{ +									$this->tables[$table]['KEYS'][$key] = array('INDEX', $index_data); +								} +							} +						} +						else if ($change_type === 'drop_keys') +						{ +							foreach ($data as $table => $drop_keys) +							{ +								foreach ($drop_keys as $key) +								{ +									unset($this->tables[$table]['KEYS'][$key]); +								} +							} +						} +						else +						{ +							var_dump($change_type); +						} +					} +					unset($migrations[$migration_key]); +				} +				else if ($check_dependencies) +				{ +					$this->dependencies = array_merge($this->dependencies, $open_dependencies); +				} +			} + +			// Only run this check after the first run +			if ($check_dependencies) +			{ +				$this->check_dependencies(); +				$check_dependencies = false; +			} +		} + +		ksort($this->tables); +		return $this->tables; +	} + +	/** +	* Check if one of the migrations files' dependencies can't be resolved +	* by the supplied list of migrations +	* +	* @throws \UnexpectedValueException If a dependency can't be resolved +	*/ +	protected function check_dependencies() +	{ +		// Strip duplicate values from array +		$this->dependencies = array_unique($this->dependencies); + +		foreach ($this->dependencies as $dependency) +		{ +			if (!in_array($dependency, $this->class_names)) +			{ +				throw new \UnexpectedValueException("Unable to resolve the dependency '$dependency'"); +			} +		} +	} +} diff --git a/phpBB/phpbb/db/migration/tool/config.php b/phpBB/phpbb/db/migration/tool/config.php new file mode 100644 index 0000000000..f93e7118c4 --- /dev/null +++ b/phpBB/phpbb/db/migration/tool/config.php @@ -0,0 +1,160 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\tool; + +/** +* Migration config tool +*/ +class config implements \phpbb\db\migration\tool\tool_interface +{ +	/** @var \phpbb\config\config */ +	protected $config; + +	/** +	* Constructor +	* +	* @param \phpbb\config\config $config +	*/ +	public function __construct(\phpbb\config\config $config) +	{ +		$this->config = $config; +	} + +	/** +	* {@inheritdoc} +	*/ +	public function get_name() +	{ +		return 'config'; +	} + +	/** +	* Add a config setting. +	* +	* @param string $config_name The name of the config setting +	* 	you would like to add +	* @param mixed $config_value The value of the config setting +	* @param bool $is_dynamic True if it is dynamic (changes very often) +	* 	and should not be stored in the cache, false if not. +	* @return null +	*/ +	public function add($config_name, $config_value, $is_dynamic = false) +	{ +		if (isset($this->config[$config_name])) +		{ +			return; +		} + +		$this->config->set($config_name, $config_value, !$is_dynamic); +	} + +	/** +	* Update an existing config setting. +	* +	* @param string $config_name The name of the config setting you would +	* 	like to update +	* @param mixed $config_value The value of the config setting +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function update($config_name, $config_value) +	{ +		if (!isset($this->config[$config_name])) +		{ +			throw new \phpbb\db\migration\exception('CONFIG_NOT_EXIST', $config_name); +		} + +		$this->config->set($config_name, $config_value); +	} + +	/** +	* Update a config setting if the first argument equal to the +	* current config value +	* +	* @param string $compare If equal to the current config value, will be +	* 	updated to the new config value, otherwise not +	* @param string $config_name The name of the config setting you would +	* 	like to update +	* @param mixed $config_value The value of the config setting +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function update_if_equals($compare, $config_name, $config_value) +	{ +		if (!isset($this->config[$config_name])) +		{ +			throw new \phpbb\db\migration\exception('CONFIG_NOT_EXIST', $config_name); +		} + +		$this->config->set_atomic($config_name, $compare, $config_value); +	} + +	/** +	* Remove an existing config setting. +	* +	* @param string $config_name The name of the config setting you would +	* 	like to remove +	* @return null +	*/ +	public function remove($config_name) +	{ +		if (!isset($this->config[$config_name])) +		{ +			return; +		} + +		$this->config->delete($config_name); +	} + +	/** +	* {@inheritdoc} +	*/ +	public function reverse() +	{ +		$arguments = func_get_args(); +		$original_call = array_shift($arguments); + +		$call = false; +		switch ($original_call) +		{ +			case 'add': +				$call = 'remove'; +			break; + +			case 'remove': +				$call = 'add'; +				if (sizeof($arguments) == 1) +				{ +					$arguments[] = ''; +				} +			break; + +			case 'update_if_equals': +				$call = 'update_if_equals'; + +				// Set to the original value if the current value is what we compared to originally +				$arguments = array( +					$arguments[2], +					$arguments[1], +					$arguments[0], +				); +			break; +		} + +		if ($call) +		{ +			return call_user_func_array(array(&$this, $call), $arguments); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/tool/config_text.php b/phpBB/phpbb/db/migration/tool/config_text.php new file mode 100644 index 0000000000..bf8ac55023 --- /dev/null +++ b/phpBB/phpbb/db/migration/tool/config_text.php @@ -0,0 +1,125 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\tool; + +/** +* Migration config_text tool +*/ +class config_text implements \phpbb\db\migration\tool\tool_interface +{ +	/** @var \phpbb\config\db_text */ +	protected $config_text; + +	/** +	* Constructor +	* +	* @param \phpbb\config\db_text $config_text +	*/ +	public function __construct(\phpbb\config\db_text $config_text) +	{ +		$this->config_text = $config_text; +	} + +	/** +	* {@inheritdoc} +	*/ +	public function get_name() +	{ +		return 'config_text'; +	} + +	/** +	* Add a config_text setting. +	* +	* @param string $config_name The name of the config_text setting +	* 	you would like to add +	* @param mixed $config_value The value of the config_text setting +	* @return null +	*/ +	public function add($config_name, $config_value) +	{ +		if (!is_null($this->config_text->get($config_name))) +		{ +			return; +		} + +		$this->config_text->set($config_name, $config_value); +	} + +	/** +	* Update an existing config_text setting. +	* +	* @param string $config_name The name of the config_text setting you would +	* 	like to update +	* @param mixed $config_value The value of the config_text setting +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function update($config_name, $config_value) +	{ +		if (is_null($this->config_text->get($config_name))) +		{ +			throw new \phpbb\db\migration\exception('CONFIG_NOT_EXIST', $config_name); +		} + +		$this->config_text->set($config_name, $config_value); +	} + +	/** +	* Remove an existing config_text setting. +	* +	* @param string $config_name The name of the config_text setting you would +	* 	like to remove +	* @return null +	*/ +	public function remove($config_name) +	{ +		if (is_null($this->config_text->get($config_name))) +		{ +			return; +		} + +		$this->config_text->delete($config_name); +	} + +	/** +	* {@inheritdoc} +	*/ +	public function reverse() +	{ +		$arguments = func_get_args(); +		$original_call = array_shift($arguments); + +		$call = false; +		switch ($original_call) +		{ +			case 'add': +				$call = 'remove'; +			break; + +			case 'remove': +				$call = 'add'; +				if (sizeof($arguments) == 1) +				{ +					$arguments[] = ''; +				} +			break; +		} + +		if ($call) +		{ +			return call_user_func_array(array(&$this, $call), $arguments); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/tool/module.php b/phpBB/phpbb/db/migration/tool/module.php new file mode 100644 index 0000000000..db43046a95 --- /dev/null +++ b/phpBB/phpbb/db/migration/tool/module.php @@ -0,0 +1,489 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\tool; + +/** +* Migration module management tool +*/ +class module implements \phpbb\db\migration\tool\tool_interface +{ +	/** @var \phpbb\cache\service */ +	protected $cache; + +	/** @var \phpbb\db\driver\driver_interface */ +	protected $db; + +	/** @var \phpbb\user */ +	protected $user; + +	/** @var string */ +	protected $phpbb_root_path; + +	/** @var string */ +	protected $php_ext; + +	/** @var string */ +	protected $modules_table; + +	/** +	* Constructor +	* +	* @param \phpbb\db\driver\driver_interface $db +	* @param \phpbb\cache\service $cache +	* @param \phpbb\user $user +	* @param string $phpbb_root_path +	* @param string $php_ext +	* @param string $modules_table +	*/ +	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\user $user, $phpbb_root_path, $php_ext, $modules_table) +	{ +		$this->db = $db; +		$this->cache = $cache; +		$this->user = $user; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +		$this->modules_table = $modules_table; +	} + +	/** +	* {@inheritdoc} +	*/ +	public function get_name() +	{ +		return 'module'; +	} + +	/** +	* Module Exists +	* +	* Check if a module exists +	* +	* @param string $class The module class(acp|mcp|ucp) +	* @param int|string|bool $parent The parent module_id|module_langname (0 for no parent). +	*		Use false to ignore the parent check and check class wide. +	* @param int|string $module The module_id|module_langname you would like to +	* 		check for to see if it exists +	* @return bool true/false if module exists +	*/ +	public function exists($class, $parent, $module) +	{ +		// the main root directory should return true +		if (!$module) +		{ +			return true; +		} + +		$parent_sql = ''; +		if ($parent !== false) +		{ +			// Allows '' to be sent as 0 +			$parent = $parent ?: 0; + +			if (!is_numeric($parent)) +			{ +				$sql = 'SELECT module_id +					FROM ' . $this->modules_table . " +					WHERE module_langname = '" . $this->db->sql_escape($parent) . "' +						AND module_class = '" . $this->db->sql_escape($class) . "'"; +				$result = $this->db->sql_query($sql); +				$module_id = $this->db->sql_fetchfield('module_id'); +				$this->db->sql_freeresult($result); + +				if (!$module_id) +				{ +					return false; +				} + +				$parent_sql = 'AND parent_id = ' . (int) $module_id; +			} +			else +			{ +				$parent_sql = 'AND parent_id = ' . (int) $parent; +			} +		} + +		$sql = 'SELECT module_id +			FROM ' . $this->modules_table . " +			WHERE module_class = '" . $this->db->sql_escape($class) . "' +				$parent_sql +				AND " . ((is_numeric($module)) ? 'module_id = ' . (int) $module : "module_langname = '" . $this->db->sql_escape($module) . "'"); +		$result = $this->db->sql_query($sql); +		$module_id = $this->db->sql_fetchfield('module_id'); +		$this->db->sql_freeresult($result); + +		if ($module_id) +		{ +			return true; +		} + +		return false; +	} + +	/** +	* Module Add +	* +	* Add a new module +	* +	* @param string $class The module class(acp|mcp|ucp) +	* @param int|string $parent The parent module_id|module_langname (0 for no parent) +	* @param array $data an array of the data on the new \module. +	* 	This can be setup in two different ways. +	*	1. The "manual" way.  For inserting a category or one at a time. +	*		It will be merged with the base array shown a bit below, +	*			but at the least requires 'module_langname' to be sent, and, +	*			if you want to create a module (instead of just a category) you must +	*			send module_basename and module_mode. +	*		array( +	*			'module_enabled'	=> 1, +	*			'module_display'	=> 1, +	*	   		'module_basename'	=> '', +	*			'module_class'		=> $class, +	*	   		'parent_id'			=> (int) $parent, +	*			'module_langname'	=> '', +	*	   		'module_mode'		=> '', +	*	   		'module_auth'		=> '', +	*		) +	*	2. The "automatic" way.  For inserting multiple at a time based on the +	*			specs in the info file for the module(s).  For this to work the +	*			modules must be correctly setup in the info file. +	*		An example follows (this would insert the settings, log, and flag +	*			modes from the includes/acp/info/acp_asacp.php file): +	* 		array( +	* 			'module_basename'	=> 'asacp', +	* 			'modes'				=> array('settings', 'log', 'flag'), +	* 		) +	* 		Optionally you may not send 'modes' and it will insert all of the +	* 			modules in that info file. +	* 	path, specify that here +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function add($class, $parent = 0, $data = array()) +	{ +		// Allows '' to be sent as 0 +		$parent = $parent ?: 0; + +		// allow sending the name as a string in $data to create a category +		if (!is_array($data)) +		{ +			$data = array('module_langname' => $data); +		} + +		if (!isset($data['module_langname'])) +		{ +			// The "automatic" way +			$basename = (isset($data['module_basename'])) ? $data['module_basename'] : ''; +			$module = $this->get_module_info($class, $basename); + +			$result = ''; +			foreach ($module['modes'] as $mode => $module_info) +			{ +				if (!isset($data['modes']) || in_array($mode, $data['modes'])) +				{ +					$new_module = array( +						'module_basename'	=> $basename, +						'module_langname'	=> $module_info['title'], +						'module_mode'		=> $mode, +						'module_auth'		=> $module_info['auth'], +						'module_display'	=> (isset($module_info['display'])) ? $module_info['display'] : true, +						'before'			=> (isset($module_info['before'])) ? $module_info['before'] : false, +						'after'				=> (isset($module_info['after'])) ? $module_info['after'] : false, +					); + +					// Run the "manual" way with the data we've collected. +					$this->add($class, $parent, $new_module); +				} +			} + +			return; +		} + +		// The "manual" way +		if (!is_numeric($parent)) +		{ +			$sql = 'SELECT module_id +				FROM ' . $this->modules_table . " +				WHERE module_langname = '" . $this->db->sql_escape($parent) . "' +					AND module_class = '" . $this->db->sql_escape($class) . "'"; +			$result = $this->db->sql_query($sql); +			$module_id = $this->db->sql_fetchfield('module_id'); +			$this->db->sql_freeresult($result); + +			if (!$module_id) +			{ +				throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent); +			} + +			$parent = $data['parent_id'] = $module_id; +		} +		else if (!$this->exists($class, false, $parent)) +		{ +			throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST', $parent); +		} + +		if ($this->exists($class, $parent, $data['module_langname'])) +		{ +			return; +		} + +		if (!class_exists('acp_modules')) +		{ +			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +			$this->user->add_lang('acp/modules'); +		} +		$acp_modules = new \acp_modules(); + +		$module_data = array( +			'module_enabled'	=> (isset($data['module_enabled'])) ? $data['module_enabled'] : 1, +			'module_display'	=> (isset($data['module_display'])) ? $data['module_display'] : 1, +			'module_basename'	=> (isset($data['module_basename'])) ? $data['module_basename'] : '', +			'module_class'		=> $class, +			'parent_id'			=> (int) $parent, +			'module_langname'	=> (isset($data['module_langname'])) ? $data['module_langname'] : '', +			'module_mode'		=> (isset($data['module_mode'])) ? $data['module_mode'] : '', +			'module_auth'		=> (isset($data['module_auth'])) ? $data['module_auth'] : '', +		); +		$result = $acp_modules->update_module_data($module_data, true); + +		// update_module_data can either return a string or an empty array... +		if (is_string($result)) +		{ +			// Error +			throw new \phpbb\db\migration\exception('MODULE_ERROR', $result); +		} +		else +		{ +			// Success +			$module_log_name = ((isset($this->user->lang[$data['module_langname']])) ? $this->user->lang[$data['module_langname']] : $data['module_langname']); +			add_log('admin', 'LOG_MODULE_ADD', $module_log_name); + +			// Move the module if requested above/below an existing one +			if (isset($data['before']) && $data['before']) +			{ +				$sql = 'SELECT left_id +					FROM ' . $this->modules_table . " +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND parent_id = " . (int) $parent . " +						AND module_langname = '" . $this->db->sql_escape($data['before']) . "'"; +				$this->db->sql_query($sql); +				$to_left = (int) $this->db->sql_fetchfield('left_id'); + +				$sql = 'UPDATE ' . $this->modules_table . " +					SET left_id = left_id + 2, right_id = right_id + 2 +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND left_id >= $to_left +						AND left_id < {$module_data['left_id']}"; +				$this->db->sql_query($sql); + +				$sql = 'UPDATE ' . $this->modules_table . " +					SET left_id = $to_left, right_id = " . ($to_left + 1) . " +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND module_id = {$module_data['module_id']}"; +				$this->db->sql_query($sql); +			} +			else if (isset($data['after']) && $data['after']) +			{ +				$sql = 'SELECT right_id +					FROM ' . $this->modules_table . " +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND parent_id = " . (int) $parent . " +						AND module_langname = '" . $this->db->sql_escape($data['after']) . "'"; +				$this->db->sql_query($sql); +				$to_right = (int) $this->db->sql_fetchfield('right_id'); + +				$sql = 'UPDATE ' . $this->modules_table . " +					SET left_id = left_id + 2, right_id = right_id + 2 +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND left_id >= $to_right +						AND left_id < {$module_data['left_id']}"; +				$this->db->sql_query($sql); + +				$sql = 'UPDATE ' . $this->modules_table . ' +					SET left_id = ' . ($to_right + 1) . ', right_id = ' . ($to_right + 2) . " +					WHERE module_class = '" . $this->db->sql_escape($class) . "' +						AND module_id = {$module_data['module_id']}"; +				$this->db->sql_query($sql); +			} +		} + +		// Clear the Modules Cache +		$this->cache->destroy("_modules_$class"); +	} + +	/** +	* Module Remove +	* +	* Remove a module +	* +	* @param string $class The module class(acp|mcp|ucp) +	* @param int|string|bool $parent The parent module_id|module_langname(0 for no parent). +	* 	Use false to ignore the parent check and check class wide. +	* @param int|string $module The module id|module_langname +	* 	specify that here +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function remove($class, $parent = 0, $module = '') +	{ +		// Imitation of module_add's "automatic" and "manual" method so the uninstaller works from the same set of instructions for umil_auto +		if (is_array($module)) +		{ +			if (isset($module['module_langname'])) +			{ +				// Manual Method +				return $this->remove($class, $parent, $module['module_langname']); +			} + +			// Failed. +			if (!isset($module['module_basename'])) +			{ +				throw new \phpbb\db\migration\exception('MODULE_NOT_EXIST'); +			} + +			// Automatic method +			$basename = $module['module_basename']; +			$module_info = $this->get_module_info($class, $basename); + +			foreach ($module_info['modes'] as $mode => $info) +			{ +				if (!isset($module['modes']) || in_array($mode, $module['modes'])) +				{ +					$this->remove($class, $parent, $info['title']); +				} +			} +		} +		else +		{ +			if (!$this->exists($class, $parent, $module)) +			{ +				return; +			} + +			$parent_sql = ''; +			if ($parent !== false) +			{ +				// Allows '' to be sent as 0 +				$parent = ($parent) ?: 0; + +				if (!is_numeric($parent)) +				{ +					$sql = 'SELECT module_id +						FROM ' . $this->modules_table . " +						WHERE module_langname = '" . $this->db->sql_escape($parent) . "' +							AND module_class = '" . $this->db->sql_escape($class) . "'"; +					$result = $this->db->sql_query($sql); +					$module_id = $this->db->sql_fetchfield('module_id'); +					$this->db->sql_freeresult($result); + +					// we know it exists from the module_exists check +					$parent_sql = 'AND parent_id = ' . (int) $module_id; +				} +				else +				{ +					$parent_sql = 'AND parent_id = ' . (int) $parent; +				} +			} + +			$module_ids = array(); +			if (!is_numeric($module)) +			{ +				$sql = 'SELECT module_id +					FROM ' . $this->modules_table . " +					WHERE module_langname = '" . $this->db->sql_escape($module) . "' +						AND module_class = '" . $this->db->sql_escape($class) . "' +						$parent_sql"; +				$result = $this->db->sql_query($sql); +				while ($module_id = $this->db->sql_fetchfield('module_id')) +				{ +					$module_ids[] = (int) $module_id; +				} +				$this->db->sql_freeresult($result); +			} +			else +			{ +				$module_ids[] = (int) $module; +			} + +			if (!class_exists('acp_modules')) +			{ +				include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +				$this->user->add_lang('acp/modules'); +			} +			$acp_modules = new \acp_modules(); +			$acp_modules->module_class = $class; + +			foreach ($module_ids as $module_id) +			{ +				$result = $acp_modules->delete_module($module_id); +				if (!empty($result)) +				{ +					return; +				} +			} + +			$this->cache->destroy("_modules_$class"); +		} +	} + +	/** +	* {@inheritdoc} +	*/ +	public function reverse() +	{ +		$arguments = func_get_args(); +		$original_call = array_shift($arguments); + +		$call = false; +		switch ($original_call) +		{ +			case 'add': +				$call = 'remove'; +			break; + +			case 'remove': +				$call = 'add'; +			break; +		} + +		if ($call) +		{ +			return call_user_func_array(array(&$this, $call), $arguments); +		} +	} + +	/** +	* Wrapper for \acp_modules::get_module_infos() +	* +	* @param string $class Module Class +	* @param string $basename Module Basename +	* @return array Module Information +	* @throws \phpbb\db\migration\exception +	*/ +	protected function get_module_info($class, $basename) +	{ +		if (!class_exists('acp_modules')) +		{ +			include($this->phpbb_root_path . 'includes/acp/acp_modules.' . $this->php_ext); +		} +		$acp_modules = new \acp_modules(); +		$module = $acp_modules->get_module_infos($basename, $class, true); + +		if (empty($module)) +		{ +			throw new \phpbb\db\migration\exception('MODULE_INFO_FILE_NOT_EXIST', $class, $basename); +		} + +		return array_pop($module); +	} +} diff --git a/phpBB/phpbb/db/migration/tool/permission.php b/phpBB/phpbb/db/migration/tool/permission.php new file mode 100644 index 0000000000..d2df27613a --- /dev/null +++ b/phpBB/phpbb/db/migration/tool/permission.php @@ -0,0 +1,629 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\tool; + +/** +* Migration permission management tool +*/ +class permission implements \phpbb\db\migration\tool\tool_interface +{ +	/** @var \phpbb\auth\auth */ +	protected $auth; + +	/** @var \phpbb\cache\service */ +	protected $cache; + +	/** @var \phpbb\db\driver\driver_interface */ +	protected $db; + +	/** @var string */ +	protected $phpbb_root_path; + +	/** @var string */ +	protected $php_ext; + +	/** +	* Constructor +	* +	* @param \phpbb\db\driver\driver_interface $db +	* @param \phpbb\cache\service $cache +	* @param \phpbb\auth\auth $auth +	* @param string $phpbb_root_path +	* @param string $php_ext +	*/ +	public function __construct(\phpbb\db\driver\driver_interface $db, \phpbb\cache\service $cache, \phpbb\auth\auth $auth, $phpbb_root_path, $php_ext) +	{ +		$this->db = $db; +		$this->cache = $cache; +		$this->auth = $auth; +		$this->phpbb_root_path = $phpbb_root_path; +		$this->php_ext = $php_ext; +	} + +	/** +	* {@inheritdoc} +	*/ +	public function get_name() +	{ +		return 'permission'; +	} + +	/** +	* Permission Exists +	* +	* Check if a permission (auth) setting exists +	* +	* @param string $auth_option The name of the permission (auth) option +	* @param bool $global True for checking a global permission setting, +	* 	False for a local permission setting +	* @return bool true if it exists, false if not +	*/ +	public function exists($auth_option, $global = true) +	{ +		if ($global) +		{ +			$type_sql = ' AND is_global = 1'; +		} +		else +		{ +			$type_sql = ' AND is_local = 1'; +		} + +		$sql = 'SELECT auth_option_id +			FROM ' . ACL_OPTIONS_TABLE . " +			WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'" +				. $type_sql; +		$result = $this->db->sql_query($sql); + +		$row = $this->db->sql_fetchrow($result); +		$this->db->sql_freeresult($result); + +		if ($row) +		{ +			return true; +		} + +		return false; +	} + +	/** +	* Permission Add +	* +	* Add a permission (auth) option +	* +	* @param string $auth_option The name of the permission (auth) option +	* @param bool $global True for checking a global permission setting, +	* 	False for a local permission setting +	* @return null +	*/ +	public function add($auth_option, $global = true, $copy_from = false) +	{ +		if ($this->exists($auth_option, $global)) +		{ +			return; +		} + +		// We've added permissions, so set to true to notify the user. +		$this->permissions_added = true; + +		if (!class_exists('auth_admin')) +		{ +			include($this->phpbb_root_path . 'includes/acp/auth.' . $this->php_ext); +		} +		$auth_admin = new \auth_admin(); + +		// We have to add a check to see if the !$global (if global, local, and if local, global) permission already exists.  If it does, acl_add_option currently has a bug which would break the ACL system, so we are having a work-around here. +		if ($this->exists($auth_option, !$global)) +		{ +			$sql_ary = array( +				'is_global'	=> 1, +				'is_local'	=> 1, +			); +			$sql = 'UPDATE ' . ACL_OPTIONS_TABLE . ' +				SET ' . $this->db->sql_build_array('UPDATE', $sql_ary) . " +				WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'"; +			$this->db->sql_query($sql); +		} +		else +		{ +			if ($global) +			{ +				$auth_admin->acl_add_option(array('global' => array($auth_option))); +			} +			else +			{ +				$auth_admin->acl_add_option(array('local' => array($auth_option))); +			} +		} + +		// The permission has been added, now we can copy it if needed +		if ($copy_from && isset($auth_admin->acl_options['id'][$copy_from])) +		{ +			$old_id = $auth_admin->acl_options['id'][$copy_from]; +			$new_id = $auth_admin->acl_options['id'][$auth_option]; + +			$tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE); + +			foreach ($tables as $table) +			{ +				$sql = 'SELECT * +					FROM ' . $table . ' +					WHERE auth_option_id = ' . $old_id; +				$result = $this->db->sql_query($sql); + +				$sql_ary = array(); +				while ($row = $this->db->sql_fetchrow($result)) +				{ +					$row['auth_option_id'] = $new_id; +					$sql_ary[] = $row; +				} +				$this->db->sql_freeresult($result); + +				if (!empty($sql_ary)) +				{ +					$this->db->sql_multi_insert($table, $sql_ary); +				} +			} + +			$auth_admin->acl_clear_prefetch(); +		} +	} + +	/** +	* Permission Remove +	* +	* Remove a permission (auth) option +	* +	* @param string $auth_option The name of the permission (auth) option +	* @param bool $global True for checking a global permission setting, +	* 	False for a local permission setting +	* @return null +	*/ +	public function remove($auth_option, $global = true) +	{ +		if (!$this->exists($auth_option, $global)) +		{ +			return; +		} + +		if ($global) +		{ +			$type_sql = ' AND is_global = 1'; +		} +		else +		{ +			$type_sql = ' AND is_local = 1'; +		} +		$sql = 'SELECT auth_option_id, is_global, is_local +			FROM ' . ACL_OPTIONS_TABLE . " +			WHERE auth_option = '" . $this->db->sql_escape($auth_option) . "'" . +				$type_sql; +		$result = $this->db->sql_query($sql); +		$row = $this->db->sql_fetchrow($result); +		$this->db->sql_freeresult($result); + +		$id = (int) $row['auth_option_id']; + +		// If it is a local and global permission, do not remove the row! :P +		if ($row['is_global'] && $row['is_local']) +		{ +			$sql = 'UPDATE ' . ACL_OPTIONS_TABLE . ' +				SET ' . (($global) ? 'is_global = 0' : 'is_local = 0') . ' +				WHERE auth_option_id = ' . $id; +			$this->db->sql_query($sql); +		} +		else +		{ +			// Delete time +			$tables = array(ACL_GROUPS_TABLE, ACL_ROLES_DATA_TABLE, ACL_USERS_TABLE, ACL_OPTIONS_TABLE); +			foreach ($tables as $table) +			{ +				$this->db->sql_query('DELETE FROM ' . $table . ' +					WHERE auth_option_id = ' . $id); +			} +		} + +		// Purge the auth cache +		$this->cache->destroy('_acl_options'); +		$this->auth->acl_clear_prefetch(); +	} + +	/** +	* Add a new permission role +	* +	* @param string $role_name The new role name +	* @param sting $role_type The type (u_, m_, a_) +	* @return null +	*/ +	public function role_add($role_name, $role_type, $role_description = '') +	{ +		$sql = 'SELECT role_id +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_name = '" . $this->db->sql_escape($role_name) . "'"; +		$this->db->sql_query($sql); +		$role_id = (int) $this->db->sql_fetchfield('role_id'); + +		if ($role_id) +		{ +			return; +		} + +		$sql = 'SELECT MAX(role_order) AS max_role_order +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_type = '" . $this->db->sql_escape($role_type) . "'"; +		$this->db->sql_query($sql); +		$role_order = (int) $this->db->sql_fetchfield('max_role_order'); +		$role_order = (!$role_order) ? 1 : $role_order + 1; + +		$sql_ary = array( +			'role_name'			=> $role_name, +			'role_description'	=> $role_description, +			'role_type'			=> $role_type, +			'role_order'		=> $role_order, +		); + +		$sql = 'INSERT INTO ' . ACL_ROLES_TABLE . ' ' . $this->db->sql_build_array('INSERT', $sql_ary); +		$this->db->sql_query($sql); +	} + +	/** +	* Update the name on a permission role +	* +	* @param string $old_role_name The old role name +	* @param string $new_role_name The new role name +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function role_update($old_role_name, $new_role_name) +	{ +		$sql = 'SELECT role_id +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_name = '" . $this->db->sql_escape($old_role_name) . "'"; +		$this->db->sql_query($sql); +		$role_id = (int) $this->db->sql_fetchfield('role_id'); + +		if (!$role_id) +		{ +			throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $old_role_name); +		} + +		$sql = 'UPDATE ' . ACL_ROLES_TABLE . " +			SET role_name = '" . $this->db->sql_escape($new_role_name) . "' +			WHERE role_name = '" . $this->db->sql_escape($old_role_name) . "'"; +		$this->db->sql_query($sql); +	} + +	/** +	* Remove a permission role +	* +	* @param string $role_name The role name to remove +	* @return null +	*/ +	public function role_remove($role_name) +	{ +		$sql = 'SELECT role_id +			FROM ' . ACL_ROLES_TABLE . " +			WHERE role_name = '" . $this->db->sql_escape($role_name) . "'"; +		$this->db->sql_query($sql); +		$role_id = (int) $this->db->sql_fetchfield('role_id'); + +		if (!$role_id) +		{ +			return; +		} + +		$sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . ' +			WHERE role_id = ' . $role_id; +		$this->db->sql_query($sql); + +		$sql = 'DELETE FROM ' . ACL_ROLES_TABLE . ' +			WHERE role_id = ' . $role_id; +		$this->db->sql_query($sql); + +		$this->auth->acl_clear_prefetch(); +	} + +	/** +	* Permission Set +	* +	* Allows you to set permissions for a certain group/role +	* +	* @param string $name The name of the role/group +	* @param string|array $auth_option The auth_option or array of +	* 	auth_options you would like to set +	* @param string $type The type (role|group) +	* @param bool $has_permission True if you want to give them permission, +	* 	false if you want to deny them permission +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function permission_set($name, $auth_option, $type = 'role', $has_permission = true) +	{ +		if (!is_array($auth_option)) +		{ +			$auth_option = array($auth_option); +		} + +		$new_auth = array(); +		$sql = 'SELECT auth_option_id +			FROM ' . ACL_OPTIONS_TABLE . ' +			WHERE ' . $this->db->sql_in_set('auth_option', $auth_option); +		$result = $this->db->sql_query($sql); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$new_auth[] = (int) $row['auth_option_id']; +		} +		$this->db->sql_freeresult($result); + +		if (empty($new_auth)) +		{ +			return; +		} + +		$current_auth = array(); + +		$type = (string) $type; // Prevent PHP bug. + +		switch ($type) +		{ +			case 'role': +				$sql = 'SELECT role_id +					FROM ' . ACL_ROLES_TABLE . " +					WHERE role_name = '" . $this->db->sql_escape($name) . "'"; +				$this->db->sql_query($sql); +				$role_id = (int) $this->db->sql_fetchfield('role_id'); + +				if (!$role_id) +				{ +					throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $name); +				} + +				$sql = 'SELECT auth_option_id, auth_setting +					FROM ' . ACL_ROLES_DATA_TABLE . ' +					WHERE role_id = ' . $role_id; +				$result = $this->db->sql_query($sql); +				while ($row = $this->db->sql_fetchrow($result)) +				{ +					$current_auth[$row['auth_option_id']] = $row['auth_setting']; +				} +				$this->db->sql_freeresult($result); +			break; + +			case 'group': +				$sql = 'SELECT group_id +					FROM ' . GROUPS_TABLE . " +					WHERE group_name = '" . $this->db->sql_escape($name) . "'"; +				$this->db->sql_query($sql); +				$group_id = (int) $this->db->sql_fetchfield('group_id'); + +				if (!$group_id) +				{ +					throw new \phpbb\db\migration\exception('GROUP_NOT_EXIST', $name); +				} + +				// If the group has a role set for them we will add the requested permissions to that role. +				$sql = 'SELECT auth_role_id +					FROM ' . ACL_GROUPS_TABLE . ' +					WHERE group_id = ' . $group_id . ' +						AND auth_role_id <> 0 +						AND forum_id = 0'; +				$this->db->sql_query($sql); +				$role_id = (int) $this->db->sql_fetchfield('auth_role_id'); +				if ($role_id) +				{ +					$sql = 'SELECT role_name +						FROM ' . ACL_ROLES_TABLE . ' +						WHERE role_id = ' . $role_id; +					$this->db->sql_query($sql); +					$role_name = $this->db->sql_fetchfield('role_name'); + +					return $this->permission_set($role_name, $auth_option, 'role', $has_permission); +				} + +				$sql = 'SELECT auth_option_id, auth_setting +					FROM ' . ACL_GROUPS_TABLE . ' +					WHERE group_id = ' . $group_id; +				$result = $this->db->sql_query($sql); +				while ($row = $this->db->sql_fetchrow($result)) +				{ +					$current_auth[$row['auth_option_id']] = $row['auth_setting']; +				} +				$this->db->sql_freeresult($result); +			break; +		} + +		$sql_ary = array(); +		switch ($type) +		{ +			case 'role': +				foreach ($new_auth as $auth_option_id) +				{ +					if (!isset($current_auth[$auth_option_id])) +					{ +						$sql_ary[] = array( +							'role_id'			=> $role_id, +							'auth_option_id'	=> $auth_option_id, +							'auth_setting'		=> $has_permission, +						); +					} +				} + +				$this->db->sql_multi_insert(ACL_ROLES_DATA_TABLE, $sql_ary); +			break; + +			case 'group': +				foreach ($new_auth as $auth_option_id) +				{ +					if (!isset($current_auth[$auth_option_id])) +					{ +						$sql_ary[] = array( +							'group_id'			=> $group_id, +							'auth_option_id'	=> $auth_option_id, +							'auth_setting'		=> $has_permission, +						); +					} +				} + +				$this->db->sql_multi_insert(ACL_GROUPS_TABLE, $sql_ary); +			break; +		} + +		$this->auth->acl_clear_prefetch(); +	} + +	/** +	* Permission Unset +	* +	* Allows you to unset (remove) permissions for a certain group/role +	* +	* @param string $name The name of the role/group +	* @param string|array $auth_option The auth_option or array of +	* 	auth_options you would like to set +	* @param string $type The type (role|group) +	* @return null +	* @throws \phpbb\db\migration\exception +	*/ +	public function permission_unset($name, $auth_option, $type = 'role') +	{ +		if (!is_array($auth_option)) +		{ +			$auth_option = array($auth_option); +		} + +		$to_remove = array(); +		$sql = 'SELECT auth_option_id +			FROM ' . ACL_OPTIONS_TABLE . ' +			WHERE ' . $this->db->sql_in_set('auth_option', $auth_option); +		$result = $this->db->sql_query($sql); +		while ($row = $this->db->sql_fetchrow($result)) +		{ +			$to_remove[] = (int) $row['auth_option_id']; +		} +		$this->db->sql_freeresult($result); + +		if (empty($to_remove)) +		{ +			return; +		} + +		$type = (string) $type; // Prevent PHP bug. + +		switch ($type) +		{ +			case 'role': +				$sql = 'SELECT role_id +					FROM ' . ACL_ROLES_TABLE . " +					WHERE role_name = '" . $this->db->sql_escape($name) . "'"; +				$this->db->sql_query($sql); +				$role_id = (int) $this->db->sql_fetchfield('role_id'); + +				if (!$role_id) +				{ +					throw new \phpbb\db\migration\exception('ROLE_NOT_EXIST', $name); +				} + +				$sql = 'DELETE FROM ' . ACL_ROLES_DATA_TABLE . ' +					WHERE ' . $this->db->sql_in_set('auth_option_id', $to_remove); +				$this->db->sql_query($sql); +			break; + +			case 'group': +				$sql = 'SELECT group_id +					FROM ' . GROUPS_TABLE . " +					WHERE group_name = '" . $this->db->sql_escape($name) . "'"; +				$this->db->sql_query($sql); +				$group_id = (int) $this->db->sql_fetchfield('group_id'); + +				if (!$group_id) +				{ +					throw new \phpbb\db\migration\exception('GROUP_NOT_EXIST', $name); +				} + +				// If the group has a role set for them we will remove the requested permissions from that role. +				$sql = 'SELECT auth_role_id +					FROM ' . ACL_GROUPS_TABLE . ' +					WHERE group_id = ' . $group_id . ' +						AND auth_role_id <> 0'; +				$this->db->sql_query($sql); +				$role_id = (int) $this->db->sql_fetchfield('auth_role_id'); +				if ($role_id) +				{ +					$sql = 'SELECT role_name +						FROM ' . ACL_ROLES_TABLE . ' +						WHERE role_id = ' . $role_id; +					$this->db->sql_query($sql); +					$role_name = $this->db->sql_fetchfield('role_name'); + +					return $this->permission_unset($role_name, $auth_option, 'role'); +				} + +				$sql = 'DELETE FROM ' . ACL_GROUPS_TABLE . ' +					WHERE ' . $this->db->sql_in_set('auth_option_id', $to_remove); +				$this->db->sql_query($sql); +			break; +		} + +		$this->auth->acl_clear_prefetch(); +	} + +	/** +	* {@inheritdoc} +	*/ +	public function reverse() +	{ +		$arguments = func_get_args(); +		$original_call = array_shift($arguments); + +		$call = false; +		switch ($original_call) +		{ +			case 'add': +				$call = 'remove'; +			break; + +			case 'remove': +				$call = 'add'; +			break; + +			case 'permission_set': +				$call = 'permission_unset'; +			break; + +			case 'permission_unset': +				$call = 'permission_set'; +			break; + +			case 'role_add': +				$call = 'role_remove'; +			break; + +			case 'role_remove': +				$call = 'role_add'; +			break; + +			case 'role_update': +				// Set to the original value if the current value is what we compared to originally +				$arguments = array( +					$arguments[1], +					$arguments[0], +				); +			break; +		} + +		if ($call) +		{ +			return call_user_func_array(array(&$this, $call), $arguments); +		} +	} +} diff --git a/phpBB/phpbb/db/migration/tool/tool_interface.php b/phpBB/phpbb/db/migration/tool/tool_interface.php new file mode 100644 index 0000000000..07cd2435e4 --- /dev/null +++ b/phpBB/phpbb/db/migration/tool/tool_interface.php @@ -0,0 +1,37 @@ +<?php +/** +* +* This file is part of the phpBB Forum Software package. +* +* @copyright (c) phpBB Limited <https://www.phpbb.com> +* @license GNU General Public License, version 2 (GPL-2.0) +* +* For full copyright and license information, please see +* the docs/CREDITS.txt file. +* +*/ + +namespace phpbb\db\migration\tool; + +/** +* Migration tool interface +*/ +interface tool_interface +{ +	/** +	* Retrieve a short name used for commands in migrations. +	* +	* @return string short name +	*/ +	public function get_name(); + +	/** +	* Reverse an original install action +	* +	* First argument is the original call to the class (e.g. add, remove) +	* After the first argument, send the original arguments to the function in the original call +	* +	* @return null +	*/ +	public function reverse(); +} | 
