diff options
Diffstat (limited to 'phpBB/includes')
| -rw-r--r-- | phpBB/includes/acp/acp_board.php | 29 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_extensions.php | 3 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_inactive.php | 3 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_main.php | 2 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_profile.php | 15 | ||||
| -rw-r--r-- | phpBB/includes/acp/acp_users.php | 26 | ||||
| -rw-r--r-- | phpBB/includes/functions.php | 3 | ||||
| -rw-r--r-- | phpBB/includes/functions_admin.php | 178 | ||||
| -rw-r--r-- | phpBB/includes/functions_mcp.php | 4 | ||||
| -rw-r--r-- | phpBB/includes/functions_posting.php | 10 | ||||
| -rw-r--r-- | phpBB/includes/functions_upload.php | 1129 | ||||
| -rw-r--r-- | phpBB/includes/mcp/mcp_queue.php | 3 | ||||
| -rw-r--r-- | phpBB/includes/mcp/mcp_topic.php | 24 | 
13 files changed, 273 insertions, 1156 deletions
diff --git a/phpBB/includes/acp/acp_board.php b/phpBB/includes/acp/acp_board.php index 6e636d2f7d..5a0ede1de3 100644 --- a/phpBB/includes/acp/acp_board.php +++ b/phpBB/includes/acp/acp_board.php @@ -448,6 +448,7 @@ class acp_board  						'board_email'			=> array('lang' => 'ADMIN_EMAIL',			'validate' => 'email',	'type' => 'email:25:100', 'explain' => true),  						'board_email_sig'		=> array('lang' => 'EMAIL_SIG',				'validate' => 'string',	'type' => 'textarea:5:30', 'explain' => true),  						'board_hide_emails'		=> array('lang' => 'BOARD_HIDE_EMAILS',		'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), +						'send_test_email'		=> array('lang' => 'SEND_TEST_EMAIL',		'validate' => 'bool',	'type' => 'custom', 'method' => 'send_test_email', 'explain' => true),  						'legend2'				=> 'SMTP_SETTINGS',  						'smtp_delivery'			=> array('lang' => 'USE_SMTP',				'validate' => 'bool',	'type' => 'radio:yes_no', 'explain' => true), @@ -631,6 +632,27 @@ class acp_board  			}  		} +		if ($mode == 'email' && $request->is_set_post('send_test_email')) +		{ +			if ($config['email_enable']) +			{ +				include_once($phpbb_root_path . 'includes/functions_messenger.' . $phpEx); + +				$messenger = new messenger(false); +				$messenger->template('test'); +				$messenger->set_addresses($user->data); +				$messenger->anti_abuse_headers($config, $user); +				$messenger->send(NOTIFY_EMAIL); + +				trigger_error($user->lang('TEST_EMAIL_SENT') . adm_back_link($this->u_action)); +			} +			else +			{ +				$user->add_lang('memberlist'); +				trigger_error($user->lang('EMAIL_DISABLED') . adm_back_link($this->u_action), E_USER_WARNING); +			} +		} +  		if ($submit)  		{  			$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_CONFIG_' . strtoupper($mode)); @@ -1139,4 +1161,11 @@ class acp_board  		return h_radio($field_name, array(1 => 'YES', 0 => 'NO'), $value) .  			($message !== false ? '<br /><span>' . $user->lang($message) . '</span>' : '');  	} + +	function send_test_email($value, $key) +	{ +		global $user; + +		return '<input class="button2" type="submit" id="' . $key . '" name="' . $key . '" value="' . $user->lang['SEND_TEST_EMAIL'] . '" />'; +	}  } diff --git a/phpBB/includes/acp/acp_extensions.php b/phpBB/includes/acp/acp_extensions.php index 0373a3b115..7bcf6e1957 100644 --- a/phpBB/includes/acp/acp_extensions.php +++ b/phpBB/includes/acp/acp_extensions.php @@ -371,6 +371,7 @@ class acp_extensions  		foreach ($enabled_extension_meta_data as $name => $block_vars)  		{ +			$block_vars['NAME'] = $name;  			$block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);  			$this->template->assign_block_vars('enabled', $block_vars); @@ -428,6 +429,7 @@ class acp_extensions  		foreach ($disabled_extension_meta_data as $name => $block_vars)  		{ +			$block_vars['NAME'] = $name;  			$block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);  			$this->template->assign_block_vars('disabled', $block_vars); @@ -488,6 +490,7 @@ class acp_extensions  		foreach ($available_extension_meta_data as $name => $block_vars)  		{ +			$block_vars['NAME'] = $name;  			$block_vars['U_DETAILS'] = $this->u_action . '&action=details&ext_name=' . urlencode($name);  			$this->template->assign_block_vars('disabled', $block_vars); diff --git a/phpBB/includes/acp/acp_inactive.php b/phpBB/includes/acp/acp_inactive.php index 3a72cf1fe6..df445394db 100644 --- a/phpBB/includes/acp/acp_inactive.php +++ b/phpBB/includes/acp/acp_inactive.php @@ -275,9 +275,10 @@ class acp_inactive  				'REMINDED_EXPLAIN'	=> $user->lang('USER_LAST_REMINDED', (int) $row['user_reminded'], $user->format_date($row['user_reminded_time'])), -				'USERNAME_FULL'		=> get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=overview')), +				'USERNAME_FULL'		=> get_username_string('full', $row['user_id'], $row['username'], $row['user_colour'], false, append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=overview&redirect=acp_inactive')),  				'USERNAME'			=> get_username_string('username', $row['user_id'], $row['username'], $row['user_colour']),  				'USER_COLOR'		=> get_username_string('colour', $row['user_id'], $row['username'], $row['user_colour']), +				'USER_EMAIL'		=> $row['user_email'],  				'U_USER_ADMIN'	=> append_sid("{$phpbb_admin_path}index.$phpEx", "i=users&mode=overview&u={$row['user_id']}"),  				'U_SEARCH_USER'	=> ($auth->acl_get('u_search')) ? append_sid("{$phpbb_root_path}search.$phpEx", "author_id={$row['user_id']}&sr=posts") : '', diff --git a/phpBB/includes/acp/acp_main.php b/phpBB/includes/acp/acp_main.php index 8a53edb8ee..47e2660770 100644 --- a/phpBB/includes/acp/acp_main.php +++ b/phpBB/includes/acp/acp_main.php @@ -426,7 +426,7 @@ class acp_main  		// Version check  		$user->add_lang('install'); -		if ($auth->acl_get('a_server') && version_compare(PHP_VERSION, '5.3.3', '<')) +		if ($auth->acl_get('a_server') && version_compare(PHP_VERSION, '5.4', '<'))  		{  			$template->assign_vars(array(  				'S_PHP_VERSION_OLD'	=> true, diff --git a/phpBB/includes/acp/acp_profile.php b/phpBB/includes/acp/acp_profile.php index 9b4fdaf993..c60e203040 100644 --- a/phpBB/includes/acp/acp_profile.php +++ b/phpBB/includes/acp/acp_profile.php @@ -543,13 +543,14 @@ class acp_profile  					}  				} -				$step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step); -  				if (sizeof($error))  				{ -					$step--;  					$submit = false;  				} +				else +				{ +					$step = (isset($_REQUEST['next'])) ? $step + 1 : ((isset($_REQUEST['prev'])) ? $step - 1 : $step); +				}  				// Build up the specific hidden fields  				foreach ($exclude as $num => $key_ary) @@ -567,7 +568,7 @@ class acp_profile  						$var = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data);  						if ($var !== null)  						{ -							$_new_key_ary[$key] = $profile_field->prepare_hidden_fields($step, $key, $action, $field_data); +							$_new_key_ary[$key] = $var;  						}  					}  					$cp->vars = $field_data; @@ -577,11 +578,7 @@ class acp_profile  				if (!sizeof($error))  				{ -					if ($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) -					{ -						$this->save_profile_field($cp, $field_type, $action); -					} -					else if ($action == 'edit' && $save) +					if (($step == 3 && (sizeof($this->lang_defs['iso']) == 1 || $save)) || ($action == 'edit' && $save))  					{  						$this->save_profile_field($cp, $field_type, $action);  					} diff --git a/phpBB/includes/acp/acp_users.php b/phpBB/includes/acp/acp_users.php index bbc8e73cb8..857c625867 100644 --- a/phpBB/includes/acp/acp_users.php +++ b/phpBB/includes/acp/acp_users.php @@ -44,6 +44,11 @@ class acp_users  		$user_id	= $request->variable('u', 0);  		$action		= $request->variable('action', ''); +		// Get referer to redirect user to the appropriate page after delete action +		$redirect		= $request->variable('redirect', ''); +		$redirect_tag	= "redirect=$redirect"; +		$redirect_url	= append_sid("{$phpbb_admin_path}index.$phpEx", "i=$redirect"); +  		$submit		= (isset($_POST['update']) && !isset($_POST['cancel'])) ? true : false;  		$form_name = 'acp_users'; @@ -146,9 +151,9 @@ class acp_users  		}  		$template->assign_vars(array( -			'U_BACK'			=> $this->u_action, +			'U_BACK'			=> (empty($redirect)) ? $this->u_action : $redirect_url,  			'U_MODE_SELECT'		=> append_sid("{$phpbb_admin_path}index.$phpEx", "i=$id&u=$user_id"), -			'U_ACTION'			=> $this->u_action . '&u=' . $user_id, +			'U_ACTION'			=> $this->u_action . '&u=' . $user_id . ((empty($redirect)) ? '' : '&' . $redirect_tag),  			'S_FORM_OPTIONS'	=> $s_form_options,  			'MANAGED_USERNAME'	=> $user_row['username'])  		); @@ -221,19 +226,30 @@ class acp_users  								user_delete($delete_type, $user_id, $user_row['username']);  								$phpbb_log->add('admin', $user->data['user_id'], $user->ip, 'LOG_USER_DELETED', false, array($user_row['username'])); -								trigger_error($user->lang['USER_DELETED'] . adm_back_link($this->u_action)); +								trigger_error($user->lang['USER_DELETED'] . adm_back_link( +										(empty($redirect)) ? $this->u_action : $redirect_url +									) +								);  							}  							else  							{ -								confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array( +								$delete_confirm_hidden_fields = array(  									'u'				=> $user_id,  									'i'				=> $id,  									'mode'			=> $mode,  									'action'		=> $action,  									'update'		=> true,  									'delete'		=> 1, -									'delete_type'	=> $delete_type)) +									'delete_type'	=> $delete_type,  								); + +								// Checks if the redirection page is specified +								if (!empty($redirect)) +								{ +									$delete_confirm_hidden_fields['redirect'] = $redirect; +								} + +								confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields($delete_confirm_hidden_fields));  							}  						}  						else diff --git a/phpBB/includes/functions.php b/phpBB/includes/functions.php index 311208baf3..58b2f0ca57 100644 --- a/phpBB/includes/functions.php +++ b/phpBB/includes/functions.php @@ -4410,7 +4410,8 @@ function page_header($page_title = '', $display_online_list = false, $item_id =  		'T_RANKS_PATH'			=> "{$web_path}{$config['ranks_path']}/",  		'T_UPLOAD_PATH'			=> "{$web_path}{$config['upload_path']}/",  		'T_STYLESHEET_LINK'		=> "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/stylesheet.css?assets_version=' . $config['assets_version'], -		'T_STYLESHEET_LANG_LINK'    => "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'], +		'T_STYLESHEET_LANG_LINK'=> "{$web_path}styles/" . rawurlencode($user->style['style_path']) . '/theme/' . $user->lang_name . '/stylesheet.css?assets_version=' . $config['assets_version'], +		'T_FONT_AWESOME_LINK'	=> !empty($config['allow_cdn']) && !empty($config['load_font_awesome_url']) ? $config['load_font_awesome_url'] : "{$web_path}assets/css/font-awesome.min.css?assets_version=" . $config['assets_version'],  		'T_JQUERY_LINK'			=> !empty($config['allow_cdn']) && !empty($config['load_jquery_url']) ? $config['load_jquery_url'] : "{$web_path}assets/javascript/jquery.min.js?assets_version=" . $config['assets_version'],  		'S_ALLOW_CDN'			=> !empty($config['allow_cdn']), diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index cd8dcc2734..3515150f93 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -579,7 +579,7 @@ function move_topics($topic_ids, $forum_id, $auto_sync = true)  */  function move_posts($post_ids, $topic_id, $auto_sync = true)  { -	global $db; +	global $db, $phpbb_dispatcher;  	if (!is_array($post_ids))  	{ @@ -613,6 +613,28 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)  		trigger_error('NO_TOPIC');  	} +	/** +	 * Perform additional actions before moving posts +	 * +	 * @event core.move_posts_before +	 * @var	array	post_ids	Array of post ids to move +	 * @var	string	topic_id	The topic id the posts are moved to +	 * @var bool	auto_sync	Whether or not to perform auto sync +	 * @var	array	forum_ids	Array of the forum ids the posts are moved from +	 * @var	array	topic_ids	Array of the topic ids the posts are moved from +	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to +	 * @since 3.1.7-RC1 +	 */ +	$vars = array( +			'post_ids', +			'topic_id', +			'auto_sync', +			'forum_ids', +			'topic_ids', +			'forum_row', +	); +	extract($phpbb_dispatcher->trigger_event('core.move_posts_before', compact($vars))); +  	$sql = 'UPDATE ' . POSTS_TABLE . '  		SET forum_id = ' . (int) $forum_row['forum_id'] . ", topic_id = $topic_id  		WHERE " . $db->sql_in_set('post_id', $post_ids); @@ -623,6 +645,28 @@ function move_posts($post_ids, $topic_id, $auto_sync = true)  		WHERE " . $db->sql_in_set('post_msg_id', $post_ids);  	$db->sql_query($sql); +	/** +	 * Perform additional actions after moving posts +	 * +	 * @event core.move_posts_after +	 * @var	array	post_ids	Array of the moved post ids +	 * @var	string	topic_id	The topic id the posts are moved to +	 * @var bool	auto_sync	Whether or not to perform auto sync +	 * @var	array	forum_ids	Array of the forum ids the posts are moved from +	 * @var	array	topic_ids	Array of the topic ids the posts are moved from +	 * @var	array	forum_row	Array with the forum id of the topic the posts are moved to +	 * @since 3.1.7-RC1 +	 */ +	$vars = array( +			'post_ids', +			'topic_id', +			'auto_sync', +			'forum_ids', +			'topic_ids', +			'forum_row', +	); +	extract($phpbb_dispatcher->trigger_event('core.move_posts_after', compact($vars))); +  	if ($auto_sync)  	{  		$forum_ids[] = (int) $forum_row['forum_id']; @@ -890,6 +934,32 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  	$table_ary = array(POSTS_TABLE, REPORTS_TABLE); +	/** +	* Perform additional actions during post(s) deletion before running the queries +	* +	* @event core.delete_posts_in_transaction_before +	* @var	array	post_ids					Array with deleted posts' ids +	* @var	array	poster_ids					Array with deleted posts' author ids +	* @var	array	topic_ids					Array with deleted posts' topic ids +	* @var	array	forum_ids					Array with deleted posts' forum ids +	* @var	string	where_type					Variable containing posts deletion mode +	* @var	mixed	where_ids					Array or comma separated list of post ids to delete +	* @var	array	delete_notifications_types	Array with notifications types to delete +	* @var	array	table_ary					Array with table names to delete data from +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'post_ids', +		'poster_ids', +		'topic_ids', +		'forum_ids', +		'where_type', +		'where_ids', +		'delete_notifications_types', +		'table_ary', +	); +	extract($phpbb_dispatcher->trigger_event('core.delete_posts_in_transaction_before', compact($vars))); +  	foreach ($table_ary as $table)  	{  		$sql = "DELETE FROM $table @@ -1047,7 +1117,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync =  */  function delete_attachments($mode, $ids, $resync = true)  { -	global $db, $config; +	global $db, $config, $phpbb_dispatcher;  	// 0 is as bad as an empty array  	if (empty($ids)) @@ -1092,6 +1162,24 @@ function delete_attachments($mode, $ids, $resync = true)  	$post_ids = $message_ids = $topic_ids = $physical = array(); +	/** +	* Perform additional actions before collecting data for attachment(s) deletion +	* +	* @event core.delete_attachments_collect_data_before +	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user +	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode +	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized +	* @var	string	sql_id			The field name to collect/delete data for depending on the mode +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'mode', +		'ids', +		'resync', +		'sql_id', +	); +	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_collect_data_before', compact($vars))); +  	// Collect post and topic ids for later use if we need to touch remaining entries (if resync is enabled)  	$sql = 'SELECT post_msg_id, topic_id, in_message, physical_filename, thumbnail, filesize, is_orphan  			FROM ' . ATTACHMENTS_TABLE . ' @@ -1121,6 +1209,32 @@ function delete_attachments($mode, $ids, $resync = true)  	}  	$db->sql_freeresult($result); +	/** +	* Perform additional actions before attachment(s) deletion +	* +	* @event core.delete_attachments_before +	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user +	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode +	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized +	* @var	string	sql_id			The field name to collect/delete data for depending on the mode +	* @var	array	post_ids		Array with post ids for deleted attachment(s) +	* @var	array	topic_ids		Array with topic ids for deleted attachment(s) +	* @var	array	message_ids		Array with private message ids for deleted attachment(s) +	* @var	array	physical		Array with deleted attachment(s) physical file(s) data +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'mode', +		'ids', +		'resync', +		'sql_id', +		'post_ids', +		'topic_ids', +		'message_ids', +		'physical', +	); +	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_before', compact($vars))); +  	// Delete attachments  	$sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . '  		WHERE ' . $db->sql_in_set($sql_id, $ids); @@ -1130,6 +1244,34 @@ function delete_attachments($mode, $ids, $resync = true)  	$db->sql_query($sql);  	$num_deleted = $db->sql_affectedrows(); +	/** +	* Perform additional actions after attachment(s) deletion from the database +	* +	* @event core.delete_attachments_from_database_after +	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user +	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode +	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized +	* @var	string	sql_id			The field name to collect/delete data for depending on the mode +	* @var	array	post_ids		Array with post ids for deleted attachment(s) +	* @var	array	topic_ids		Array with topic ids for deleted attachment(s) +	* @var	array	message_ids		Array with private message ids for deleted attachment(s) +	* @var	array	physical		Array with deleted attachment(s) physical file(s) data +	* @var	int		num_deleted		The number of deleted attachment(s) from the database +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'mode', +		'ids', +		'resync', +		'sql_id', +		'post_ids', +		'topic_ids', +		'message_ids', +		'physical', +		'num_deleted', +	); +	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_database_after', compact($vars))); +  	if (!$num_deleted)  	{  		return 0; @@ -1152,6 +1294,38 @@ function delete_attachments($mode, $ids, $resync = true)  		}  	} +	/** +	* Perform additional actions after attachment(s) deletion from the filesystem +	* +	* @event core.delete_attachments_from_filesystem_after +	* @var	string	mode			Variable containing attachments deletion mode, can be: post|message|topic|attach|user +	* @var	mixed	ids				Array or comma separated list of ids corresponding to the mode +	* @var	bool	resync			Flag indicating if posts/messages/topics should be synchronized +	* @var	string	sql_id			The field name to collect/delete data for depending on the mode +	* @var	array	post_ids		Array with post ids for deleted attachment(s) +	* @var	array	topic_ids		Array with topic ids for deleted attachment(s) +	* @var	array	message_ids		Array with private message ids for deleted attachment(s) +	* @var	array	physical		Array with deleted attachment(s) physical file(s) data +	* @var	int		num_deleted		The number of deleted attachment(s) from the database +	* @var	int		space_removed	The size of deleted files(s) from the filesystem +	* @var	int		files_removed	The number of deleted file(s) from the filesystem +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'mode', +		'ids', +		'resync', +		'sql_id', +		'post_ids', +		'topic_ids', +		'message_ids', +		'physical', +		'num_deleted', +		'space_removed', +		'files_removed', +	); +	extract($phpbb_dispatcher->trigger_event('core.delete_attachments_from_filesystem_after', compact($vars))); +  	if ($space_removed || $files_removed)  	{  		$config->increment('upload_dir_size', $space_removed * (-1), false); diff --git a/phpBB/includes/functions_mcp.php b/phpBB/includes/functions_mcp.php index 46e85c5674..50acbebd4f 100644 --- a/phpBB/includes/functions_mcp.php +++ b/phpBB/includes/functions_mcp.php @@ -389,7 +389,7 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by  			if (!$auth->acl_get('m_approve', $forum_id))  			{ -				$sql .= 'AND topic_visibility = ' . ITEM_APPROVED; +				$sql .= ' AND topic_visibility = ' . ITEM_APPROVED;  			}  			break; @@ -405,7 +405,7 @@ function phpbb_mcp_sorting($mode, &$sort_days, &$sort_key, &$sort_dir, &$sort_by  			if (!$auth->acl_get('m_approve', $forum_id))  			{ -				$sql .= 'AND post_visibility = ' . ITEM_APPROVED; +				$sql .= ' AND post_visibility = ' . ITEM_APPROVED;  			}  			break; diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index deac7bc91d..19756d97b4 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -405,14 +405,13 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null)  {  	global $auth, $user, $config, $db, $cache; -	global $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_filesystem; +	global $phpbb_root_path, $phpEx, $phpbb_dispatcher, $phpbb_container;  	$filedata = array(  		'error'	=> array()  	); -	include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx); -	$upload = new fileupload($phpbb_filesystem); +	$upload = $phpbb_container->get('files.upload');  	if ($config['check_attachment_content'] && isset($config['mime_triggers']))  	{ @@ -434,9 +433,10 @@ function upload_attachment($form_name, $forum_id, $local = false, $local_storage  	$extensions = $cache->obtain_attach_extensions((($is_message) ? false : (int) $forum_id));  	$upload->set_allowed_extensions(array_keys($extensions['_allowed_'])); -	$file = ($local) ? $upload->local_upload($local_storage, $local_filedata, $mimetype_guesser) : $upload->form_upload($form_name, $mimetype_guesser, $plupload); +	/** @var \phpbb\files\filespec $file */ +	$file = ($local) ? $upload->handle_upload('files.types.local', $local_storage, $local_filedata) : $upload->handle_upload('files.types.form', $form_name); -	if ($file->init_error) +	if ($file->init_error())  	{  		$filedata['post_attach'] = false;  		return $filedata; diff --git a/phpBB/includes/functions_upload.php b/phpBB/includes/functions_upload.php deleted file mode 100644 index 3ab87ee794..0000000000 --- a/phpBB/includes/functions_upload.php +++ /dev/null @@ -1,1129 +0,0 @@ -<?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. -* -*/ - -/** -* @ignore -*/ -if (!defined('IN_PHPBB')) -{ -	exit; -} - -/** -* Responsible for holding all file relevant information, as well as doing file-specific operations. -* The {@link fileupload fileupload class} can be used to upload several files, each of them being this object to operate further on. -*/ -class filespec -{ -	var $filename = ''; -	var $realname = ''; -	var $uploadname = ''; -	var $mimetype = ''; -	var $extension = ''; -	var $filesize = 0; -	var $width = 0; -	var $height = 0; -	var $image_info = array(); - -	var $destination_file = ''; -	var $destination_path = ''; - -	var $file_moved = false; -	var $init_error = false; -	var $local = false; - -	var $error = array(); - -	var $upload = ''; - -	/** -	 * @var \phpbb\filesystem\filesystem_interface -	 */ -	protected $filesystem; - -	/** -	 * The plupload object -	 * @var \phpbb\plupload\plupload -	 */ -	protected $plupload; - -	/** -	 * phpBB Mimetype guesser -	 * @var \phpbb\mimetype\guesser -	 */ -	protected $mimetype_guesser; - -	/** -	* File Class -	* @access private -	*/ -	function filespec($upload_ary, $upload_namespace, \phpbb\filesystem\filesystem_interface $phpbb_filesystem, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null) -	{ -		if (!isset($upload_ary)) -		{ -			$this->init_error = true; -			return; -		} - -		$this->filename = $upload_ary['tmp_name']; -		$this->filesize = $upload_ary['size']; -		$name = (STRIP) ? stripslashes($upload_ary['name']) : $upload_ary['name']; -		$name = trim(utf8_basename($name)); -		$this->realname = $this->uploadname = $name; -		$this->mimetype = $upload_ary['type']; - -		// Opera adds the name to the mime type -		$this->mimetype	= (strpos($this->mimetype, '; name') !== false) ? str_replace(strstr($this->mimetype, '; name'), '', $this->mimetype) : $this->mimetype; - -		if (!$this->mimetype) -		{ -			$this->mimetype = 'application/octet-stream'; -		} - -		$this->extension = strtolower(self::get_extension($this->realname)); - -		// Try to get real filesize from temporary folder (not always working) ;) -		$this->filesize = (@filesize($this->filename)) ? @filesize($this->filename) : $this->filesize; - -		$this->width = $this->height = 0; -		$this->file_moved = false; - -		$this->local = (isset($upload_ary['local_mode'])) ? true : false; -		$this->upload = $upload_namespace; -		$this->plupload = $plupload; -		$this->mimetype_guesser = $mimetype_guesser; -		$this->filesystem = $phpbb_filesystem; -	} - -	/** -	* Cleans destination filename -	* -	* @param real|unique|unique_ext $mode real creates a realname, filtering some characters, lowering every character. Unique creates an unique filename -	* @param string $prefix Prefix applied to filename -	* @param string $user_id The user_id is only needed for when cleaning a user's avatar -	* @access public -	*/ -	function clean_filename($mode = 'unique', $prefix = '', $user_id = '') -	{ -		if ($this->init_error) -		{ -			return; -		} - -		switch ($mode) -		{ -			case 'real': -				// Remove every extension from filename (to not let the mime bug being exposed) -				if (strpos($this->realname, '.') !== false) -				{ -					$this->realname = substr($this->realname, 0, strpos($this->realname, '.')); -				} - -				// Replace any chars which may cause us problems with _ -				$bad_chars = array("'", "\\", ' ', '/', ':', '*', '?', '"', '<', '>', '|'); - -				$this->realname = rawurlencode(str_replace($bad_chars, '_', strtolower($this->realname))); -				$this->realname = preg_replace("/%(\w{2})/", '_', $this->realname); - -				$this->realname = $prefix . $this->realname . '.' . $this->extension; -			break; - -			case 'unique': -				$this->realname = $prefix . md5(unique_id()); -			break; - -			case 'avatar': -				$this->extension = strtolower($this->extension); -				$this->realname = $prefix . $user_id . '.' . $this->extension; - -			break; - -			case 'unique_ext': -			default: -				$this->realname = $prefix . md5(unique_id()) . '.' . $this->extension; -			break; -		} -	} - -	/** -	* Get property from file object -	*/ -	function get($property) -	{ -		if ($this->init_error || !isset($this->$property)) -		{ -			return false; -		} - -		return $this->$property; -	} - -	/** -	* Check if file is an image (mimetype) -	* -	* @return true if it is an image, false if not -	*/ -	function is_image() -	{ -		return (strpos($this->mimetype, 'image/') === 0); -	} - -	/** -	* Check if the file got correctly uploaded -	* -	* @return true if it is a valid upload, false if not -	*/ -	function is_uploaded() -	{ -		$is_plupload = $this->plupload && $this->plupload->is_active(); - -		if (!$this->local && !$is_plupload && !is_uploaded_file($this->filename)) -		{ -			return false; -		} - -		if (($this->local || $is_plupload) && !file_exists($this->filename)) -		{ -			return false; -		} - -		return true; -	} - -	/** -	* Remove file -	*/ -	function remove() -	{ -		if ($this->file_moved) -		{ -			@unlink($this->destination_file); -		} -	} - -	/** -	* Get file extension -	* -	* @param string Filename that needs to be checked -	* @return string Extension of the supplied filename -	*/ -	static public function get_extension($filename) -	{ -		$filename = utf8_basename($filename); - -		if (strpos($filename, '.') === false) -		{ -			return ''; -		} - -		$filename = explode('.', $filename); -		return array_pop($filename); -	} - -	/** -	* Get mimetype -	* -	* @param string $filename Filename that needs to be checked -	* @return string Mimetype of supplied filename -	*/ -	function get_mimetype($filename) -	{ -		if ($this->mimetype_guesser !== null) -		{ -			$mimetype = $this->mimetype_guesser->guess($filename, $this->uploadname); - -			if ($mimetype !== 'application/octet-stream') -			{ -				$this->mimetype = $mimetype; -			} -		} - -		return $this->mimetype; -	} - -	/** -	* Get filesize -	*/ -	function get_filesize($filename) -	{ -		return @filesize($filename); -	} - - -	/** -	* Check the first 256 bytes for forbidden content -	*/ -	function check_content($disallowed_content) -	{ -		if (empty($disallowed_content)) -		{ -			return true; -		} - -		$fp = @fopen($this->filename, 'rb'); - -		if ($fp !== false) -		{ -			$ie_mime_relevant = fread($fp, 256); -			fclose($fp); -			foreach ($disallowed_content as $forbidden) -			{ -				if (stripos($ie_mime_relevant, '<' . $forbidden) !== false) -				{ -					return false; -				} -			} -		} -		return true; -	} - -	/** -	* Move file to destination folder -	* The phpbb_root_path variable will be applied to the destination path -	* -	* @param string $destination Destination path, for example $config['avatar_path'] -	* @param bool $overwrite If set to true, an already existing file will be overwritten -	* @param bool $skip_image_check If set to true, the check for the file to be a valid image is skipped -	* @param string $chmod Permission mask for chmodding the file after a successful move. The mode entered here reflects the mode defined by {@link phpbb_chmod()} -	* -	* @access public -	*/ -	function move_file($destination, $overwrite = false, $skip_image_check = false, $chmod = false) -	{ -		global $user, $phpbb_root_path; - -		if (sizeof($this->error)) -		{ -			return false; -		} - -		$chmod = ($chmod === false) ? CHMOD_READ | CHMOD_WRITE : $chmod; - -		// We need to trust the admin in specifying valid upload directories and an attacker not being able to overwrite it... -		$this->destination_path = $phpbb_root_path . $destination; - -		// Check if the destination path exist... -		if (!file_exists($this->destination_path)) -		{ -			@unlink($this->filename); -			return false; -		} - -		$upload_mode = (@ini_get('open_basedir') || @ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'on') ? 'move' : 'copy'; -		$upload_mode = ($this->local) ? 'local' : $upload_mode; -		$this->destination_file = $this->destination_path . '/' . utf8_basename($this->realname); - -		// Check if the file already exist, else there is something wrong... -		if (file_exists($this->destination_file) && !$overwrite) -		{ -			@unlink($this->filename); -			$this->error[] = $user->lang($this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR', $this->destination_file); -			$this->file_moved = false; -			return false; -		} -		else -		{ -			if (file_exists($this->destination_file)) -			{ -				@unlink($this->destination_file); -			} - -			switch ($upload_mode) -			{ -				case 'copy': - -					if (!@copy($this->filename, $this->destination_file)) -					{ -						if (!@move_uploaded_file($this->filename, $this->destination_file)) -						{ -							$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file); -						} -					} - -				break; - -				case 'move': - -					if (!@move_uploaded_file($this->filename, $this->destination_file)) -					{ -						if (!@copy($this->filename, $this->destination_file)) -						{ -							$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file); -						} -					} - -				break; - -				case 'local': - -					if (!@copy($this->filename, $this->destination_file)) -					{ -						$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'GENERAL_UPLOAD_ERROR'], $this->destination_file); -					} - -				break; -			} - -			// Remove temporary filename -			@unlink($this->filename); - -			if (sizeof($this->error)) -			{ -				return false; -			} - -			try -			{ -				$this->filesystem->phpbb_chmod($this->destination_file, $chmod); -			} -			catch (\phpbb\filesystem\exception\filesystem_exception $e) -			{ -				// Do nothing -			} -		} - -		// Try to get real filesize from destination folder -		$this->filesize = (@filesize($this->destination_file)) ? @filesize($this->destination_file) : $this->filesize; - -		// Get mimetype of supplied file -		$this->mimetype = $this->get_mimetype($this->destination_file); - -		if ($this->is_image() && !$skip_image_check) -		{ -			$this->width = $this->height = 0; - -			// Get imagesize class -			$imagesize = new \FastImageSize\FastImageSize(); - -			$this->image_info = $imagesize->getImageSize($this->destination_file, $this->mimetype); - -			if ($this->image_info !== false) -			{ -				$this->width = $this->image_info['width']; -				$this->height = $this->image_info['height']; - -				// Check image type -				$types = fileupload::image_types(); - -				if (!isset($types[$this->image_info['type']]) || !in_array($this->extension, $types[$this->image_info['type']])) -				{ -					if (!isset($types[$this->image_info['type']])) -					{ -						$this->error[] = $user->lang('IMAGE_FILETYPE_INVALID', $this->image_info['type'], $this->mimetype); -					} -					else -					{ -						$this->error[] = $user->lang('IMAGE_FILETYPE_MISMATCH', $types[$this->image_info['type']][0], $this->extension); -					} -				} - -				// Make sure the dimensions match a valid image -				if (empty($this->width) || empty($this->height)) -				{ -					$this->error[] = $user->lang['ATTACHED_IMAGE_NOT_IMAGE']; -				} -			} -			else -			{ -				$this->error[] = $user->lang['UNABLE_GET_IMAGE_SIZE']; -			} -		} - -		$this->file_moved = true; -		$this->additional_checks(); -		unset($this->upload); - -		return true; -	} - -	/** -	* Performing additional checks -	*/ -	function additional_checks() -	{ -		global $user; - -		if (!$this->file_moved) -		{ -			return false; -		} - -		// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form -		if ($this->upload->max_filesize && ($this->get('filesize') > $this->upload->max_filesize || $this->filesize == 0)) -		{ -			$max_filesize = get_formatted_filesize($this->upload->max_filesize, false); - -			$this->error[] = sprintf($user->lang[$this->upload->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']); - -			return false; -		} - -		if (!$this->upload->valid_dimensions($this)) -		{ -			$this->error[] = $user->lang($this->upload->error_prefix . 'WRONG_SIZE', -				$user->lang('PIXELS', (int) $this->upload->min_width), -				$user->lang('PIXELS', (int) $this->upload->min_height), -				$user->lang('PIXELS', (int) $this->upload->max_width), -				$user->lang('PIXELS', (int) $this->upload->max_height), -				$user->lang('PIXELS', (int) $this->width), -				$user->lang('PIXELS', (int) $this->height)); - -			return false; -		} - -		return true; -	} -} - -/** -* Class for assigning error messages before a real filespec class can be assigned -*/ -class fileerror extends filespec -{ -	function fileerror($error_msg) -	{ -		$this->error[] = $error_msg; -	} -} - -/** -* File upload class -* Init class (all parameters optional and able to be set/overwritten separately) - scope is global and valid for all uploads -*/ -class fileupload -{ -	var $allowed_extensions = array(); -	var $disallowed_content = array('body', 'head', 'html', 'img', 'plaintext', 'a href', 'pre', 'script', 'table', 'title'); -	var $max_filesize = 0; -	var $min_width = 0; -	var $min_height = 0; -	var $max_width = 0; -	var $max_height = 0; -	var $error_prefix = ''; - -	/** @var int Timeout for remote upload */ -	var $upload_timeout = 6; - -	/** -	 * @var \phpbb\filesystem\filesystem_interface -	 */ -	protected $filesystem; - -	/** -	* Init file upload class. -	* -	* @param \phpbb\filesystem\filesystem_interface $filesystem -	* @param string $error_prefix Used error messages will get prefixed by this string -	* @param array $allowed_extensions Array of allowed extensions, for example array('jpg', 'jpeg', 'gif', 'png') -	* @param int $max_filesize Maximum filesize -	* @param int $min_width Minimum image width (only checked for images) -	* @param int $min_height Minimum image height (only checked for images) -	* @param int $max_width Maximum image width (only checked for images) -	* @param int $max_height Maximum image height (only checked for images) -	* @param bool|array $disallowed_content If enabled, the first 256 bytes of the file must not -	*										contain any of its values. Defaults to false. -	* -	*/ -	function fileupload(\phpbb\filesystem\filesystem_interface $filesystem, $error_prefix = '', $allowed_extensions = false, $max_filesize = false, $min_width = false, $min_height = false, $max_width = false, $max_height = false, $disallowed_content = false) -	{ -		$this->set_allowed_extensions($allowed_extensions); -		$this->set_max_filesize($max_filesize); -		$this->set_allowed_dimensions($min_width, $min_height, $max_width, $max_height); -		$this->set_error_prefix($error_prefix); -		$this->set_disallowed_content($disallowed_content); -		$this->filesystem = $filesystem; -	} - -	/** -	* Reset vars -	*/ -	function reset_vars() -	{ -		$this->max_filesize = 0; -		$this->min_width = $this->min_height = $this->max_width = $this->max_height = 0; -		$this->error_prefix = ''; -		$this->allowed_extensions = array(); -		$this->disallowed_content = array(); -	} - -	/** -	* Set allowed extensions -	*/ -	function set_allowed_extensions($allowed_extensions) -	{ -		if ($allowed_extensions !== false && is_array($allowed_extensions)) -		{ -			$this->allowed_extensions = $allowed_extensions; -		} -	} - -	/** -	* Set allowed dimensions -	*/ -	function set_allowed_dimensions($min_width, $min_height, $max_width, $max_height) -	{ -		$this->min_width = (int) $min_width; -		$this->min_height = (int) $min_height; -		$this->max_width = (int) $max_width; -		$this->max_height = (int) $max_height; -	} - -	/** -	* Set maximum allowed filesize -	*/ -	function set_max_filesize($max_filesize) -	{ -		if ($max_filesize !== false && (int) $max_filesize) -		{ -			$this->max_filesize = (int) $max_filesize; -		} -	} - -	/** -	* Set disallowed strings -	*/ -	function set_disallowed_content($disallowed_content) -	{ -		if ($disallowed_content !== false && is_array($disallowed_content)) -		{ -			$this->disallowed_content = array_diff($disallowed_content, array('')); -		} -	} - -	/** -	* Set error prefix -	*/ -	function set_error_prefix($error_prefix) -	{ -		$this->error_prefix = $error_prefix; -	} - -	/** -	* Form upload method -	* Upload file from users harddisk -	* -	* @param string $form_name Form name assigned to the file input field (if it is an array, the key has to be specified) -	* @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser -	* @param \phpbb\plupload\plupload $plupload The plupload object -	* -	* @return object $file Object "filespec" is returned, all further operations can be done with this object -	* @access public -	*/ -	function form_upload($form_name, \phpbb\mimetype\guesser $mimetype_guesser = null, \phpbb\plupload\plupload $plupload = null) -	{ -		global $user, $request; - -		$upload = $request->file($form_name); -		unset($upload['local_mode']); - -		if ($plupload) -		{ -			$result = $plupload->handle_upload($form_name); -			if (is_array($result)) -			{ -				$upload = array_merge($upload, $result); -			} -		} - -		$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser, $plupload); - -		if ($file->init_error) -		{ -			$file->error[] = ''; -			return $file; -		} - -		// Error array filled? -		if (isset($upload['error'])) -		{ -			$error = $this->assign_internal_error($upload['error']); - -			if ($error !== false) -			{ -				$file->error[] = $error; -				return $file; -			} -		} - -		// Check if empty file got uploaded (not catched by is_uploaded_file) -		if (isset($upload['size']) && $upload['size'] == 0) -		{ -			$file->error[] = $user->lang[$this->error_prefix . 'EMPTY_FILEUPLOAD']; -			return $file; -		} - -		// PHP Upload filesize exceeded -		if ($file->get('filename') == 'none') -		{ -			$max_filesize = @ini_get('upload_max_filesize'); -			$unit = 'MB'; - -			if (!empty($max_filesize)) -			{ -				$unit = strtolower(substr($max_filesize, -1, 1)); -				$max_filesize = (int) $max_filesize; - -				$unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB'); -			} - -			$file->error[] = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]); -			return $file; -		} - -		// Not correctly uploaded -		if (!$file->is_uploaded()) -		{ -			$file->error[] = $user->lang[$this->error_prefix . 'NOT_UPLOADED']; -			return $file; -		} - -		$this->common_checks($file); - -		return $file; -	} - -	/** -	* Move file from another location to phpBB -	*/ -	function local_upload($source_file, $filedata = false, \phpbb\mimetype\guesser $mimetype_guesser = null) -	{ -		global $user, $request; - -		$upload = array(); - -		$upload['local_mode'] = true; -		$upload['tmp_name'] = $source_file; - -		if ($filedata === false) -		{ -			$upload['name'] = utf8_basename($source_file); -			$upload['size'] = 0; -		} -		else -		{ -			$upload['name'] = $filedata['realname']; -			$upload['size'] = $filedata['size']; -			$upload['type'] = $filedata['type']; -		} - -		$file = new filespec($upload, $this, $this->filesystem, $mimetype_guesser); - -		if ($file->init_error) -		{ -			$file->error[] = ''; -			return $file; -		} - -		if (isset($upload['error'])) -		{ -			$error = $this->assign_internal_error($upload['error']); - -			if ($error !== false) -			{ -				$file->error[] = $error; -				return $file; -			} -		} - -		// PHP Upload filesize exceeded -		if ($file->get('filename') == 'none') -		{ -			$max_filesize = @ini_get('upload_max_filesize'); -			$unit = 'MB'; - -			if (!empty($max_filesize)) -			{ -				$unit = strtolower(substr($max_filesize, -1, 1)); -				$max_filesize = (int) $max_filesize; - -				$unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB'); -			} - -			$file->error[] = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]); -			return $file; -		} - -		// Not correctly uploaded -		if (!$file->is_uploaded()) -		{ -			$file->error[] = $user->lang[$this->error_prefix . 'NOT_UPLOADED']; -			return $file; -		} - -		$this->common_checks($file); -		$request->overwrite('local', $upload, \phpbb\request\request_interface::FILES); - -		return $file; -	} - -	/** -	* Remote upload method -	* Uploads file from given url -	* -	* @param string $upload_url URL pointing to file to upload, for example http://www.foobar.com/example.gif -	* @param \phpbb\mimetype\guesser $mimetype_guesser Mimetype guesser -	* @return object $file Object "filespec" is returned, all further operations can be done with this object -	* @access public -	*/ -	function remote_upload($upload_url, \phpbb\mimetype\guesser $mimetype_guesser = null) -	{ -		global $user, $phpbb_root_path; - -		$upload_ary = array(); -		$upload_ary['local_mode'] = true; - -		if (!preg_match('#^(https?://).*?\.(' . implode('|', $this->allowed_extensions) . ')$#i', $upload_url, $match)) -		{ -			$file = new fileerror($user->lang[$this->error_prefix . 'URL_INVALID']); -			return $file; -		} - -		if (empty($match[2])) -		{ -			$file = new fileerror($user->lang[$this->error_prefix . 'URL_INVALID']); -			return $file; -		} - -		$url = parse_url($upload_url); - -		$host = $url['host']; -		$path = $url['path']; -		$port = (!empty($url['port'])) ? (int) $url['port'] : 80; - -		$upload_ary['type'] = 'application/octet-stream'; - -		$url['path'] = explode('.', $url['path']); -		$ext = array_pop($url['path']); - -		$url['path'] = implode('', $url['path']); -		$upload_ary['name'] = utf8_basename($url['path']) . (($ext) ? '.' . $ext : ''); -		$filename = $url['path']; -		$filesize = 0; - -		$remote_max_filesize = $this->max_filesize; -		if (!$remote_max_filesize) -		{ -			$max_filesize = @ini_get('upload_max_filesize'); - -			if (!empty($max_filesize)) -			{ -				$unit = strtolower(substr($max_filesize, -1, 1)); -				$remote_max_filesize = (int) $max_filesize; - -				switch ($unit) -				{ -					case 'g': -						$remote_max_filesize *= 1024; -					// no break -					case 'm': -						$remote_max_filesize *= 1024; -					// no break -					case 'k': -						$remote_max_filesize *= 1024; -					// no break -				} -			} -		} - -		$errno = 0; -		$errstr = ''; - -		if (!($fsock = @fsockopen($host, $port, $errno, $errstr))) -		{ -			$file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']); -			return $file; -		} - -		// Make sure $path not beginning with / -		if (strpos($path, '/') === 0) -		{ -			$path = substr($path, 1); -		} - -		fputs($fsock, 'GET /' . $path . " HTTP/1.1\r\n"); -		fputs($fsock, "HOST: " . $host . "\r\n"); -		fputs($fsock, "Connection: close\r\n\r\n"); - -		// Set a proper timeout for the socket -		socket_set_timeout($fsock, $this->upload_timeout); - -		$get_info = false; -		$data = ''; -		$length = false; -		$timer_stop = time() + $this->upload_timeout; - -		while ((!$length || $filesize < $length) && !@feof($fsock)) -		{ -			if ($get_info) -			{ -				if ($length) -				{ -					// Don't attempt to read past end of file if server indicated length -					$block = @fread($fsock, min($length - $filesize, 1024)); -				} -				else -				{ -					$block = @fread($fsock, 1024); -				} - -				$filesize += strlen($block); - -				if ($remote_max_filesize && $filesize > $remote_max_filesize) -				{ -					$max_filesize = get_formatted_filesize($remote_max_filesize, false); - -					$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit'])); -					return $file; -				} - -				$data .= $block; -			} -			else -			{ -				$line = @fgets($fsock, 1024); - -				if ($line == "\r\n") -				{ -					$get_info = true; -				} -				else -				{ -					if (stripos($line, 'content-type: ') !== false) -					{ -						$upload_ary['type'] = rtrim(str_replace('content-type: ', '', strtolower($line))); -					} -					else if ($this->max_filesize && stripos($line, 'content-length: ') !== false) -					{ -						$length = (int) str_replace('content-length: ', '', strtolower($line)); - -						if ($remote_max_filesize && $length && $length > $remote_max_filesize) -						{ -							$max_filesize = get_formatted_filesize($remote_max_filesize, false); - -							$file = new fileerror(sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit'])); -							return $file; -						} -					} -					else if (stripos($line, '404 not found') !== false) -					{ -						$file = new fileerror($user->lang[$this->error_prefix . 'URL_NOT_FOUND']); -						return $file; -					} -				} -			} - -			$stream_meta_data = stream_get_meta_data($fsock); - -			// Cancel upload if we exceed timeout -			if (!empty($stream_meta_data['timed_out']) || time() >= $timer_stop) -			{ -				$file = new fileerror($user->lang[$this->error_prefix . 'REMOTE_UPLOAD_TIMEOUT']); -				return $file; -			} -		} -		@fclose($fsock); - -		if (empty($data)) -		{ -			$file = new fileerror($user->lang[$this->error_prefix . 'EMPTY_REMOTE_DATA']); -			return $file; -		} - -		$tmp_path = (!@ini_get('safe_mode') || strtolower(@ini_get('safe_mode')) == 'off') ? false : $phpbb_root_path . 'cache'; -		$filename = tempnam($tmp_path, unique_id() . '-'); - -		if (!($fp = @fopen($filename, 'wb'))) -		{ -			$file = new fileerror($user->lang[$this->error_prefix . 'NOT_UPLOADED']); -			return $file; -		} - -		$upload_ary['size'] = fwrite($fp, $data); -		fclose($fp); -		unset($data); - -		$upload_ary['tmp_name'] = $filename; - -		$file = new filespec($upload_ary, $this, $this->filesystem, $mimetype_guesser); -		$this->common_checks($file); - -		return $file; -	} - -	/** -	* Assign internal error -	* @access private -	*/ -	function assign_internal_error($errorcode) -	{ -		global $user; - -		switch ($errorcode) -		{ -			case 1: -				$max_filesize = @ini_get('upload_max_filesize'); -				$unit = 'MB'; - -				if (!empty($max_filesize)) -				{ -					$unit = strtolower(substr($max_filesize, -1, 1)); -					$max_filesize = (int) $max_filesize; - -					$unit = ($unit == 'k') ? 'KB' : (($unit == 'g') ? 'GB' : 'MB'); -				} - -				$error = (empty($max_filesize)) ? $user->lang[$this->error_prefix . 'PHP_SIZE_NA'] : sprintf($user->lang[$this->error_prefix . 'PHP_SIZE_OVERRUN'], $max_filesize, $user->lang[$unit]); -			break; - -			case 2: -				$max_filesize = get_formatted_filesize($this->max_filesize, false); - -				$error = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']); -			break; - -			case 3: -				$error = $user->lang[$this->error_prefix . 'PARTIAL_UPLOAD']; -			break; - -			case 4: -				$error = $user->lang[$this->error_prefix . 'NOT_UPLOADED']; -			break; - -			case 6: -				$error = 'Temporary folder could not be found. Please check your PHP installation.'; -			break; - -			default: -				$error = false; -			break; -		} - -		return $error; -	} - -	/** -	* Perform common checks -	*/ -	function common_checks(&$file) -	{ -		global $user; - -		// Filesize is too big or it's 0 if it was larger than the maxsize in the upload form -		if ($this->max_filesize && ($file->get('filesize') > $this->max_filesize || $file->get('filesize') == 0)) -		{ -			$max_filesize = get_formatted_filesize($this->max_filesize, false); - -			$file->error[] = sprintf($user->lang[$this->error_prefix . 'WRONG_FILESIZE'], $max_filesize['value'], $max_filesize['unit']); -		} - -		// check Filename -		if (preg_match("#[\\/:*?\"<>|]#i", $file->get('realname'))) -		{ -			$file->error[] = sprintf($user->lang[$this->error_prefix . 'INVALID_FILENAME'], $file->get('realname')); -		} - -		// Invalid Extension -		if (!$this->valid_extension($file)) -		{ -			$file->error[] = sprintf($user->lang[$this->error_prefix . 'DISALLOWED_EXTENSION'], $file->get('extension')); -		} - -		// MIME Sniffing -		if (!$this->valid_content($file)) -		{ -			$file->error[] = sprintf($user->lang[$this->error_prefix . 'DISALLOWED_CONTENT']); -		} -	} - -	/** -	* Check for allowed extension -	*/ -	function valid_extension(&$file) -	{ -		return (in_array($file->get('extension'), $this->allowed_extensions)) ? true : false; -	} - -	/** -	* Check for allowed dimension -	*/ -	function valid_dimensions(&$file) -	{ -		if (!$this->max_width && !$this->max_height && !$this->min_width && !$this->min_height) -		{ -			return true; -		} - -		if (($file->get('width') > $this->max_width && $this->max_width) || -			($file->get('height') > $this->max_height && $this->max_height) || -			($file->get('width') < $this->min_width && $this->min_width) || -			($file->get('height') < $this->min_height && $this->min_height)) -		{ -			return false; -		} - -		return true; -	} - -	/** -	* Check if form upload is valid -	*/ -	function is_valid($form_name) -	{ -		global $request; -		$upload = $request->file($form_name); - -		return (!empty($upload) && $upload['name'] !== 'none'); -	} - - -	/** -	* Check for bad content (IE mime-sniffing) -	*/ -	function valid_content(&$file) -	{ -		return ($file->check_content($this->disallowed_content)); -	} - -	/** -	* Get image type/extension mapping -	* -	* @return array Array containing the image types and their extensions -	*/ -	static public function image_types() -	{ -		$result = array( -			IMAGETYPE_GIF		=> array('gif'), -			IMAGETYPE_JPEG		=> array('jpg', 'jpeg'), -			IMAGETYPE_PNG		=> array('png'), -			IMAGETYPE_SWF		=> array('swf'), -			IMAGETYPE_PSD		=> array('psd'), -			IMAGETYPE_BMP		=> array('bmp'), -			IMAGETYPE_TIFF_II	=> array('tif', 'tiff'), -			IMAGETYPE_TIFF_MM	=> array('tif', 'tiff'), -			IMAGETYPE_JPC		=> array('jpg', 'jpeg'), -			IMAGETYPE_JP2		=> array('jpg', 'jpeg'), -			IMAGETYPE_JPX		=> array('jpg', 'jpeg'), -			IMAGETYPE_JB2		=> array('jpg', 'jpeg'), -			IMAGETYPE_IFF		=> array('iff'), -			IMAGETYPE_WBMP		=> array('wbmp'), -			IMAGETYPE_XBM		=> array('xbm'), -		); - -		if (defined('IMAGETYPE_SWC')) -		{ -			$result[IMAGETYPE_SWC] = array('swc'); -		} - -		return $result; -	} -} diff --git a/phpBB/includes/mcp/mcp_queue.php b/phpBB/includes/mcp/mcp_queue.php index ac82c9f2ad..132786818b 100644 --- a/phpBB/includes/mcp/mcp_queue.php +++ b/phpBB/includes/mcp/mcp_queue.php @@ -284,6 +284,7 @@ class mcp_queue  				$template->assign_vars(array(  					'S_MCP_QUEUE'			=> true,  					'U_APPROVE_ACTION'		=> append_sid("{$phpbb_root_path}mcp.$phpEx", "i=queue&p=$post_id&f=$forum_id"), +					'S_CAN_DELETE_POST'		=> $auth->acl_get('m_delete', $post_info['forum_id']),  					'S_CAN_VIEWIP'			=> $auth->acl_get('m_info', $post_info['forum_id']),  					'S_POST_REPORTED'		=> $post_info['post_reported'],  					'S_POST_UNAPPROVED'		=> $post_info['post_visibility'] == ITEM_UNAPPROVED || $post_info['post_visibility'] == ITEM_REAPPROVE, @@ -1269,7 +1270,7 @@ class mcp_queue  						continue;  					} -					$post_data['disapprove_reason'] = ''; +					$post_data['disapprove_reason'] = $disapprove_reason;  					if (isset($disapprove_reason_lang))  					{  						// Okay we need to get the reason from the posters language diff --git a/phpBB/includes/mcp/mcp_topic.php b/phpBB/includes/mcp/mcp_topic.php index 66bcdad72c..70794312f4 100644 --- a/phpBB/includes/mcp/mcp_topic.php +++ b/phpBB/includes/mcp/mcp_topic.php @@ -196,6 +196,30 @@ function mcp_topic_view($id, $mode, $action)  		}  	} +	/** +	* Event to modify the post data for the MCP topic review before assigning the posts +	* +	* @event core.mcp_topic_modify_post_data +	* @var	array	attachments		List of attachments post_id => array of attachments +	* @var	int		forum_id		The forum ID we are currently in +	* @var	int		id				ID of the tab we are displaying +	* @var	string	mode			Mode of the MCP page we are displaying +	* @var	array	post_id_list	Array with post ids we are going to display +	* @var	array	rowset			Array with the posts data +	* @var	int		topic_id		The topic ID we are currently reviewing +	* @since 3.1.7-RC1 +	*/ +	$vars = array( +		'attachments', +		'forum_id', +		'id', +		'mode', +		'post_id_list', +		'rowset', +		'topic_id', +	); +	extract($phpbb_dispatcher->trigger_event('core.mcp_topic_modify_post_data', compact($vars))); +  	foreach ($rowset as $i => $row)  	{  		$message = $row['post_text'];  | 
