diff options
Diffstat (limited to 'phpBB/includes/functions_posting.php')
| -rw-r--r-- | phpBB/includes/functions_posting.php | 952 | 
1 files changed, 548 insertions, 404 deletions
| diff --git a/phpBB/includes/functions_posting.php b/phpBB/includes/functions_posting.php index 8e9cc3a950..56d2408e88 100644 --- a/phpBB/includes/functions_posting.php +++ b/phpBB/includes/functions_posting.php @@ -1,9 +1,13 @@  <?php  /**  * -* @package phpBB3 -* @copyright (c) 2005 phpBB Group -* @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2 +* 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.  *  */ @@ -20,12 +24,13 @@ if (!defined('IN_PHPBB'))  */  function generate_smilies($mode, $forum_id)  { -	global $db, $user, $config, $template, $phpbb_dispatcher; -	global $phpEx, $phpbb_root_path, $phpbb_container; +	global $db, $user, $config, $template, $phpbb_dispatcher, $request; +	global $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_path_helper; -	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&f=' . $forum_id); +	/* @var $pagination \phpbb\pagination */  	$pagination = $phpbb_container->get('pagination'); -	$start = request_var('start', 0); +	$base_url = append_sid("{$phpbb_root_path}posting.$phpEx", 'mode=smilies&f=' . $forum_id); +	$start = $request->variable('start', 0);  	if ($mode == 'window')  	{ @@ -111,7 +116,7 @@ function generate_smilies($mode, $forum_id)  	if (sizeof($smilies))  	{ -		$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_root_path; +		$root_path = (defined('PHPBB_USE_BOARD_URL_PATH') && PHPBB_USE_BOARD_URL_PATH) ? generate_board_url() . '/' : $phpbb_path_helper->get_web_root_path();  		foreach ($smilies as $row)  		{ @@ -133,7 +138,7 @@ function generate_smilies($mode, $forum_id)  	* @var	string	mode			Mode of the smilies: window|inline  	* @var	int		forum_id		The forum ID we are currently in  	* @var	bool	display_link	Shall we display the "more smilies" link? -	* @since 3.1-A1 +	* @since 3.1.0-a1  	*/  	$vars = array('mode', 'forum_id', 'display_link');  	extract($phpbb_dispatcher->trigger_event('core.generate_smilies_after', compact($vars))); @@ -173,7 +178,6 @@ function update_post_information($type, $ids, $return_update_sql = false)  		$ids = array($ids);  	} -  	$update_sql = $empty_forums = $not_empty_forums = array();  	if ($type != 'topic') @@ -310,6 +314,7 @@ function posting_gen_topic_icons($mode, $icon_id)  					'ICON_IMG'		=> $root_path . $config['icons_path'] . '/' . $data['img'],  					'ICON_WIDTH'	=> $data['width'],  					'ICON_HEIGHT'	=> $data['height'], +					'ICON_ALT'		=> $data['alt'],  					'S_CHECKED'			=> ($id == $icon_id) ? true : false,  					'S_ICON_CHECKED'	=> ($id == $icon_id) ? ' checked="checked"' : '') @@ -328,23 +333,20 @@ function posting_gen_topic_icons($mode, $icon_id)  */  function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  { -	global $auth, $user, $template, $topic_type; +	global $auth, $user, $template;  	$toggle = false;  	$topic_types = array( -		'sticky'	=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), -		'announce'	=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), -		'global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL') +		'sticky'			=> array('const' => POST_STICKY, 'lang' => 'POST_STICKY'), +		'announce'			=> array('const' => POST_ANNOUNCE, 'lang' => 'POST_ANNOUNCEMENT'), +		'announce_global'	=> array('const' => POST_GLOBAL, 'lang' => 'POST_GLOBAL')  	);  	$topic_type_array = array();  	foreach ($topic_types as $auth_key => $topic_value)  	{ -		// We do not have a special post global announcement permission -		$auth_key = ($auth_key == 'global') ? 'announce' : $auth_key; -  		if ($auth->acl_get('f_' . $auth_key, $forum_id))  		{  			$toggle = true; @@ -374,8 +376,8 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  		$template->assign_vars(array(  			'S_TOPIC_TYPE_STICKY'	=> ($auth->acl_get('f_sticky', $forum_id)), -			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_get('f_announce', $forum_id))) -		); +			'S_TOPIC_TYPE_ANNOUNCE'	=> ($auth->acl_gets('f_announce', 'f_announce_global', $forum_id)), +		));  	}  	return $toggle; @@ -389,164 +391,27 @@ function posting_gen_topic_types($forum_id, $cur_topic_type = POST_NORMAL)  * Upload Attachment - filedata is generated here  * Uses upload class  * +* @deprecated 3.2.0-a1 (To be removed: 3.4.0) +*  * @param string			$form_name		The form name of the file upload input  * @param int			$forum_id		The id of the forum  * @param bool			$local			Whether the file is local or not  * @param string			$local_storage	The path to the local file  * @param bool			$is_message		Whether it is a PM or not -* @param \filespec		$local_filedata	A filespec object created for the local file -* @param \phpbb\plupload\plupload	$plupload		The plupload object if one is being used +* @param array			$local_filedata	A filespec object created for the local file  * -* @return object filespec +* @return array File data array  */ -function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false, \phpbb\plupload\plupload $plupload = null) +function upload_attachment($form_name, $forum_id, $local = false, $local_storage = '', $is_message = false, $local_filedata = false)  { -	global $auth, $user, $config, $db, $cache; -	global $phpbb_root_path, $phpEx; - -	$filedata = array( -		'error'	=> array() -	); - -	include_once($phpbb_root_path . 'includes/functions_upload.' . $phpEx); -	$upload = new fileupload(); - -	if ($config['check_attachment_content'] && isset($config['mime_triggers'])) -	{ -		$upload->set_disallowed_content(explode('|', $config['mime_triggers'])); -	} - -	$filedata['post_attach'] = $local || $upload->is_valid($form_name); - -	if (!$filedata['post_attach']) -	{ -		$filedata['error'][] = $user->lang['NO_UPLOAD_FORM_FOUND']; -		return $filedata; -	} - -	$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) : $upload->form_upload($form_name, $plupload); - -	if ($file->init_error) -	{ -		$filedata['post_attach'] = false; -		return $filedata; -	} - -	// Whether the uploaded file is in the image category -	$is_image = (isset($extensions[$file->get('extension')]['display_cat'])) ? $extensions[$file->get('extension')]['display_cat'] == ATTACHMENT_CATEGORY_IMAGE : false; - -	if (!$auth->acl_get('a_') && !$auth->acl_get('m_', $forum_id)) -	{ -		// Check Image Size, if it is an image -		if ($is_image) -		{ -			$file->upload->set_allowed_dimensions(0, 0, $config['img_max_width'], $config['img_max_height']); -		} - -		// Admins and mods are allowed to exceed the allowed filesize -		if (!empty($extensions[$file->get('extension')]['max_filesize'])) -		{ -			$allowed_filesize = $extensions[$file->get('extension')]['max_filesize']; -		} -		else -		{ -			$allowed_filesize = ($is_message) ? $config['max_filesize_pm'] : $config['max_filesize']; -		} - -		$file->upload->set_max_filesize($allowed_filesize); -	} - -	$file->clean_filename('unique', $user->data['user_id'] . '_'); - -	// Are we uploading an image *and* this image being within the image category? -	// Only then perform additional image checks. -	$file->move_file($config['upload_path'], false, !$is_image); - -	// Do we have to create a thumbnail? -	$filedata['thumbnail'] = ($is_image && $config['img_create_thumbnail']) ? 1 : 0; - -	if (sizeof($file->error)) -	{ -		$file->remove(); -		$filedata['error'] = array_merge($filedata['error'], $file->error); -		$filedata['post_attach'] = false; - -		return $filedata; -	} - -	// Make sure the image category only holds valid images... -	if ($is_image && !$file->is_image()) -	{ -		$file->remove(); - -		if ($plupload && $plupload->is_active()) -		{ -			$plupload->emit_error(104, 'ATTACHED_IMAGE_NOT_IMAGE'); -		} - -		// If this error occurs a user tried to exploit an IE Bug by renaming extensions -		// Since the image category is displaying content inline we need to catch this. -		trigger_error($user->lang['ATTACHED_IMAGE_NOT_IMAGE']); -	} - -	$filedata['filesize'] = $file->get('filesize'); -	$filedata['mimetype'] = $file->get('mimetype'); -	$filedata['extension'] = $file->get('extension'); -	$filedata['physical_filename'] = $file->get('realname'); -	$filedata['real_filename'] = $file->get('uploadname'); -	$filedata['filetime'] = time(); - -	// Check our complete quota -	if ($config['attachment_quota']) -	{ -		if ($config['upload_dir_size'] + $file->get('filesize') > $config['attachment_quota']) -		{ -			$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED']; -			$filedata['post_attach'] = false; +	global $phpbb_container; -			$file->remove(); +	/** @var \phpbb\attachment\manager $attachment_manager */ +	$attachment_manager = $phpbb_container->get('attachment.manager'); +	$file = $attachment_manager->upload($form_name, $forum_id, $local, $local_storage, $is_message, $local_filedata); +	unset($attachment_manager); -			return $filedata; -		} -	} - -	// Check free disk space -	if ($free_space = @disk_free_space($phpbb_root_path . $config['upload_path'])) -	{ -		if ($free_space <= $file->get('filesize')) -		{ -			if ($auth->acl_get('a_')) -			{ -				$filedata['error'][] = $user->lang['ATTACH_DISK_FULL']; -			} -			else -			{ -				$filedata['error'][] = $user->lang['ATTACH_QUOTA_REACHED']; -			} -			$filedata['post_attach'] = false; - -			$file->remove(); - -			return $filedata; -		} -	} - -	// Create Thumbnail -	if ($filedata['thumbnail']) -	{ -		$source = $file->get('destination_file'); -		$destination = $file->get('destination_path') . '/thumb_' . $file->get('realname'); - -		if (!create_thumbnail($source, $destination, $file->get('mimetype'))) -		{ -			$filedata['thumbnail'] = 0; -		} -	} - -	return $filedata; +	return $file;  }  /** @@ -645,7 +510,7 @@ function get_supported_image_types($type = false)  */  function create_thumbnail($source, $destination, $mimetype)  { -	global $config; +	global $config, $phpbb_filesystem;  	$min_filesize = (int) $config['img_min_thumb_filesize'];  	$img_filesize = (file_exists($source)) ? @filesize($source) : false; @@ -797,7 +662,14 @@ function create_thumbnail($source, $destination, $mimetype)  		return false;  	} -	phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE); +	try +	{ +		$phpbb_filesystem->phpbb_chmod($destination, CHMOD_READ | CHMOD_WRITE); +	} +	catch (\phpbb\filesystem\exception\filesystem_exception $e) +	{ +		// Do nothing +	}  	return true;  } @@ -886,7 +758,7 @@ function posting_gen_attachment_entry($attachment_data, &$filename_data, $show_a  function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $msg_id = 0)  {  	global $user, $db, $template, $auth; -	global $phpbb_root_path, $phpEx; +	global $phpbb_root_path, $phpbb_dispatcher, $phpEx;  	$topic_ids = $forum_ids = $draft_rows = array(); @@ -929,7 +801,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms  	$topic_rows = array();  	if (sizeof($topic_ids))  	{ -		$sql = 'SELECT topic_id, forum_id, topic_title +		$sql = 'SELECT topic_id, forum_id, topic_title, topic_poster  			FROM ' . TOPICS_TABLE . '  			WHERE ' . $db->sql_in_set('topic_id', array_unique($topic_ids));  		$result = $db->sql_query($sql); @@ -940,6 +812,20 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms  		}  		$db->sql_freeresult($result);  	} + +	/** +	* Drafts found and their topics +	* Edit $draft_rows in order to add or remove drafts loaded +	* +	* @event core.load_drafts_draft_list_result +	* @var	array	draft_rows			The drafts query result. Includes its forum id and everything about the draft +	* @var	array	topic_ids			The list of topics got from the topics table +	* @var	array	topic_rows			The topics that draft_rows references +	* @since 3.1.0-RC3 +	*/ +	$vars = array('draft_rows', 'topic_ids', 'topic_rows'); +	extract($phpbb_dispatcher->trigger_event('core.load_drafts_draft_list_result', compact($vars))); +  	unset($topic_ids);  	$template->assign_var('S_SHOW_DRAFTS', true); @@ -947,7 +833,7 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms  	foreach ($draft_rows as $draft)  	{  		$link_topic = $link_forum = $link_pm = false; -		$insert_url = $view_url = $title = ''; +		$view_url = $title = '';  		if (isset($topic_rows[$draft['topic_id']])  			&& ( @@ -1000,10 +886,12 @@ function load_drafts($topic_id = 0, $forum_id = 0, $id = 0, $pm_action = '', $ms  */  function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id = 0, $show_quote_button = true)  { -	global $user, $auth, $db, $template, $bbcode, $cache; -	global $config, $phpbb_root_path, $phpEx, $phpbb_container; +	global $user, $auth, $db, $template; +	global $config, $phpbb_root_path, $phpEx, $phpbb_container, $phpbb_dispatcher; +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility'); +	$sql_sort = ($mode == 'post_review') ? 'ASC' : 'DESC';  	// Go ahead and pull all data for this topic  	$sql = 'SELECT p.post_id @@ -1012,8 +900,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  			AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id, 'p.') . '  			' . (($mode == 'post_review') ? " AND p.post_id > $cur_post_id" : '') . '  			' . (($mode == 'post_review_edit') ? " AND p.post_id = $cur_post_id" : '') . ' -		ORDER BY p.post_time '; -	$sql .= ($mode == 'post_review') ? 'ASC' : 'DESC'; +		ORDER BY p.post_time ' . $sql_sort . ', p.post_id ' . $sql_sort;  	$result = $db->sql_query_limit($sql, $config['posts_per_page']);  	$post_list = array(); @@ -1058,13 +945,11 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  	$sql = $db->sql_build_query('SELECT', $sql_ary);  	$result = $db->sql_query($sql); -	$bbcode_bitfield = '';  	$rowset = array();  	$has_attachments = false;  	while ($row = $db->sql_fetchrow($result))  	{  		$rowset[$row['post_id']] = $row; -		$bbcode_bitfield = $bbcode_bitfield | base64_decode($row['bbcode_bitfield']);  		if ($row['post_attachment'])  		{ @@ -1073,19 +958,10 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  	}  	$db->sql_freeresult($result); -	// Instantiate BBCode class -	if (!isset($bbcode) && $bbcode_bitfield !== '') -	{ -		include_once($phpbb_root_path . 'includes/bbcode.' . $phpEx); -		$bbcode = new bbcode(base64_encode($bbcode_bitfield)); -	} -  	// Grab extensions -	$extensions = $attachments = array(); +	$attachments = array();  	if ($has_attachments && $auth->acl_get('u_download') && $auth->acl_get('f_download', $forum_id))  	{ -		$extensions = $cache->obtain_attach_extensions($forum_id); -  		// Get attachments...  		$sql = 'SELECT *  			FROM ' . ATTACHMENTS_TABLE . ' @@ -1140,7 +1016,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  		$post_anchor = ($mode == 'post_review') ? 'ppr' . $row['post_id'] : 'pr' . $row['post_id'];  		$u_show_post = append_sid($phpbb_root_path . 'viewtopic.' . $phpEx, "f=$forum_id&t=$topic_id&p={$row['post_id']}&view=show#p{$row['post_id']}"); -		$template->assign_block_vars($mode . '_row', array( +		$post_row = array(  			'POST_AUTHOR_FULL'		=> get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),  			'POST_AUTHOR_COLOUR'	=> get_username_string('colour', $poster_id, $row['username'], $row['user_colour'], $row['post_username']),  			'POST_AUTHOR'			=> get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), @@ -1149,7 +1025,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  			'S_HAS_ATTACHMENTS'	=> (!empty($attachments[$row['post_id']])) ? true : false,  			'S_FRIEND'			=> ($row['friend']) ? true : false,  			'S_IGNORE_POST'		=> ($row['foe']) ? true : false, -			'L_IGNORE_POST'		=> ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), "<a href=\"{$u_show_post}\" onclick=\"dE('{$post_anchor}', 1); return false;\">", '</a>') : '', +			'L_IGNORE_POST'		=> ($row['foe']) ? sprintf($user->lang['POST_BY_FOE'], get_username_string('full', $poster_id, $row['username'], $row['user_colour'], $row['post_username']), "<a href=\"{$u_show_post}\" onclick=\"phpbb.toggleDisplay('{$post_anchor}', 1); return false;\">", '</a>') : '',  			'POST_SUBJECT'		=> $post_subject,  			'MINI_POST_IMG'		=> $user->img('icon_post_target', $user->lang['POST']), @@ -1157,11 +1033,41 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  			'MESSAGE'			=> $message,  			'DECODED_MESSAGE'	=> $decoded_message,  			'POST_ID'			=> $row['post_id'], +			'POST_TIME'			=> $row['post_time'], +			'USER_ID'			=> $row['user_id'],  			'U_MINI_POST'		=> append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'p=' . $row['post_id']) . '#p' . $row['post_id'],  			'U_MCP_DETAILS'		=> ($auth->acl_get('m_info', $forum_id)) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=main&mode=post_details&f=' . $forum_id . '&p=' . $row['post_id'], true, $user->session_id) : '', -			'POSTER_QUOTE'		=> ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '') +			'POSTER_QUOTE'		=> ($show_quote_button && $auth->acl_get('f_reply', $forum_id)) ? addslashes(get_username_string('username', $poster_id, $row['username'], $row['user_colour'], $row['post_username'])) : '',  		); +		$current_row_number = $i; + +		/** +		* Event to modify the template data block for topic reviews +		* +		* @event core.topic_review_modify_row +		* @var	string	mode				The review mode +		* @var	int		topic_id			The topic that is being reviewed +		* @var	int		forum_id			The topic's forum +		* @var	int		cur_post_id			Post offset id +		* @var	int		current_row_number	Number of the current row being iterated +		* @var	array	post_row			Template block array of the current post +		* @var	array	row					Array with original post and user data +		* @since 3.1.4-RC1 +		*/ +		$vars = array( +			'mode', +			'topic_id', +			'forum_id', +			'cur_post_id', +			'current_row_number', +			'post_row', +			'row', +		); +		extract($phpbb_dispatcher->trigger_event('core.topic_review_modify_row', compact($vars))); + +		$template->assign_block_vars($mode . '_row', $post_row); +  		// Display not already displayed Attachments for this post, we already parsed them. ;)  		if (!empty($attachments[$row['post_id']]))  		{ @@ -1193,7 +1099,7 @@ function topic_review($topic_id, $forum_id, $mode = 'topic_review', $cur_post_id  */  function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $softdelete_reason = '')  { -	global $db, $user, $auth, $phpbb_container; +	global $db, $user, $phpbb_container;  	global $config, $phpEx, $phpbb_root_path;  	// Specify our post mode @@ -1240,6 +1146,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  		$db->sql_freeresult($result);  	} +	/* @var $phpbb_content_visibility \phpbb\content_visibility */  	$phpbb_content_visibility = $phpbb_container->get('content.visibility');  	// (Soft) delete the post @@ -1281,25 +1188,13 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  			if ($is_soft)  			{ -				$topic_row = array();  				$phpbb_content_visibility->set_topic_visibility(ITEM_DELETED, $topic_id, $forum_id, $user->data['user_id'], time(), $softdelete_reason);  			}  			else  			{  				delete_topics('topic_id', array($topic_id), false); -				if ($data['topic_visibility'] == ITEM_APPROVED) -				{ -					$sql_data[FORUMS_TABLE] .= 'forum_posts_approved = forum_posts_approved - 1, forum_topics_approved = forum_topics_approved - 1'; -				} -				else if ($data['topic_visibility'] == ITEM_UNAPPROVED) -				{ -					$sql_data[FORUMS_TABLE] .= 'forum_posts_unapproved = forum_posts_unapproved - 1, forum_topics_unapproved = forum_topics_unapproved - 1'; -				} -				else if ($data['topic_visibility'] == ITEM_DELETED) -				{ -					$sql_data[FORUMS_TABLE] .= 'forum_posts_softdeleted = forum_posts_softdeleted - 1, forum_topics_softdeleted = forum_topics_softdeleted - 1'; -				} +				$phpbb_content_visibility->remove_topic_from_statistic($data, $sql_data);  				$update_sql = update_post_information('forum', $forum_id, true);  				if (sizeof($update_sql)) @@ -1317,7 +1212,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  				WHERE p.topic_id = $topic_id  					AND p.poster_id = u.user_id  					AND p.post_visibility = " . ITEM_APPROVED . ' -				ORDER BY p.post_time ASC'; +				ORDER BY p.post_time ASC, p.post_id ASC';  			$result = $db->sql_query_limit($sql, 1);  			$row = $db->sql_fetchrow($result);  			$db->sql_freeresult($result); @@ -1329,7 +1224,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  					FROM ' . POSTS_TABLE . ' p, ' . USERS_TABLE . " u  					WHERE p.topic_id = $topic_id  						AND p.poster_id = u.user_id -					ORDER BY p.post_time ASC"; +					ORDER BY p.post_time ASC, p.post_id ASC";  				$result = $db->sql_query_limit($sql, 1);  				$row = $db->sql_fetchrow($result);  				$db->sql_freeresult($result); @@ -1384,7 +1279,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  				WHERE topic_id = $topic_id  					AND " . $phpbb_content_visibility->get_visibility_sql('post', $forum_id) . '  					AND post_time > ' . $data['post_time'] . ' -				ORDER BY post_time ASC'; +				ORDER BY post_time ASC, post_id ASC';  			$result = $db->sql_query_limit($sql, 1);  			$next_post_id = (int) $db->sql_fetchfield('post_id');  			$db->sql_freeresult($result); @@ -1395,20 +1290,7 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  	{  		if (!$is_soft)  		{ -			if ($data['post_visibility'] == ITEM_APPROVED) -			{ -				$phpbb_content_visibility->remove_post_from_statistic($data, $sql_data); -			} -			else if ($data['post_visibility'] == ITEM_UNAPPROVED) -			{ -				$sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_unapproved = forum_posts_unapproved - 1'; -				$sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_unapproved = topic_posts_unapproved - 1'; -			} -			else if ($data['post_visibility'] == ITEM_DELETED) -			{ -				$sql_data[FORUMS_TABLE] = (($sql_data[FORUMS_TABLE]) ? $sql_data[FORUMS_TABLE] . ', ' : '') . 'forum_posts_softdeleted = forum_posts_softdeleted - 1'; -				$sql_data[TOPICS_TABLE] = (($sql_data[TOPICS_TABLE]) ? $sql_data[TOPICS_TABLE] . ', ' : '') . 'topic_posts_softdeleted = topic_posts_softdeleted - 1'; -			} +			$phpbb_content_visibility->remove_post_from_statistic($data, $sql_data);  		}  		$sql = 'SELECT 1 AS has_attachments @@ -1475,10 +1357,12 @@ function delete_post($forum_id, $topic_id, $post_id, &$data, $is_soft = false, $  * Submit Post  * @todo Split up and create lightweight, simple API for this.  */ -function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $update_message = true, $update_search_index = true) +function submit_post($mode, $subject, $username, $topic_type, &$poll_ary, &$data_ary, $update_message = true, $update_search_index = true)  { -	global $db, $auth, $user, $config, $phpEx, $template, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher; +	global $db, $auth, $user, $config, $phpEx, $phpbb_root_path, $phpbb_container, $phpbb_dispatcher, $phpbb_log, $request; +	$poll = $poll_ary; +	$data = $data_ary;  	/**  	* Modify the data for post submitting  	* @@ -1493,7 +1377,21 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	* @var	bool	update_search_index	Flag indicating if the search index will be updated  	* @since 3.1.0-a4  	*/ -	extract($phpbb_dispatcher->trigger_event('core.modify_submit_post_data', compact(array('mode', 'subject', 'username', 'topic_type', 'poll', 'data', 'update_message', 'update_search_index')))); +	$vars = array( +		'mode', +		'subject', +		'username', +		'topic_type', +		'poll', +		'data', +		'update_message', +		'update_search_index', +	); +	extract($phpbb_dispatcher->trigger_event('core.modify_submit_post_data', compact($vars))); +	$poll_ary = $poll; +	$data_ary = $data; +	unset($poll); +	unset($data);  	// We do not handle erasing posts here  	if ($mode == 'delete') @@ -1501,7 +1399,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		return false;  	} -	$current_time = time(); +	if (!empty($data_ary['post_time'])) +	{ +		$current_time = $data_ary['post_time']; +	} +	else +	{ +		$current_time = time(); +	}  	if ($mode == 'post')  	{ @@ -1515,31 +1420,31 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	}  	else if ($mode == 'edit')  	{ -		$post_mode = ($data['topic_posts_approved'] + $data['topic_posts_unapproved'] + $data['topic_posts_softdeleted'] == 1) ? 'edit_topic' : (($data['topic_first_post_id'] == $data['post_id']) ? 'edit_first_post' : (($data['topic_last_post_id'] == $data['post_id']) ? 'edit_last_post' : 'edit')); +		$post_mode = ($data_ary['topic_posts_approved'] + $data_ary['topic_posts_unapproved'] + $data_ary['topic_posts_softdeleted'] == 1) ? 'edit_topic' : (($data_ary['topic_first_post_id'] == $data_ary['post_id']) ? 'edit_first_post' : (($data_ary['topic_last_post_id'] == $data_ary['post_id']) ? 'edit_last_post' : 'edit'));  	}  	// First of all make sure the subject and topic title are having the correct length.  	// To achieve this without cutting off between special chars we convert to an array and then count the elements.  	$subject = truncate_string($subject, 120); -	$data['topic_title'] = truncate_string($data['topic_title'], 120); +	$data_ary['topic_title'] = truncate_string($data_ary['topic_title'], 120);  	// Collect some basic information about which tables and which rows to update/insert  	$sql_data = $topic_row = array(); -	$poster_id = ($mode == 'edit') ? $data['poster_id'] : (int) $user->data['user_id']; +	$poster_id = ($mode == 'edit') ? $data_ary['poster_id'] : (int) $user->data['user_id'];  	// Retrieve some additional information if not present -	if ($mode == 'edit' && (!isset($data['post_visibility']) || !isset($data['topic_visibility']) || $data['post_visibility'] === false || $data['topic_visibility'] === false)) +	if ($mode == 'edit' && (!isset($data_ary['post_visibility']) || !isset($data_ary['topic_visibility']) || $data_ary['post_visibility'] === false || $data_ary['topic_visibility'] === false))  	{  		$sql = 'SELECT p.post_visibility, t.topic_type, t.topic_posts_approved, t.topic_posts_unapproved, t.topic_posts_softdeleted, t.topic_visibility  			FROM ' . TOPICS_TABLE . ' t, ' . POSTS_TABLE . ' p  			WHERE t.topic_id = p.topic_id -				AND p.post_id = ' . $data['post_id']; +				AND p.post_id = ' . $data_ary['post_id'];  		$result = $db->sql_query($sql);  		$topic_row = $db->sql_fetchrow($result);  		$db->sql_freeresult($result); -		$data['topic_visibility'] = $topic_row['topic_visibility']; -		$data['post_visibility'] = $topic_row['post_visibility']; +		$data_ary['topic_visibility'] = $topic_row['topic_visibility']; +		$data_ary['post_visibility'] = $topic_row['post_visibility'];  	}  	// This variable indicates if the user is able to post or put into the queue @@ -1547,20 +1452,29 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	// Check the permissions for post approval.  	// Moderators must go through post approval like ordinary users. -	if (!$auth->acl_get('f_noapprove', $data['forum_id'])) +	if (!$auth->acl_get('f_noapprove', $data_ary['forum_id']))  	{  		// Post not approved, but in queue  		$post_visibility = ITEM_UNAPPROVED; +		switch ($post_mode) +		{ +			case 'edit_first_post': +			case 'edit': +			case 'edit_last_post': +			case 'edit_topic': +				$post_visibility = ITEM_REAPPROVE; +			break; +		}  	}  	// MODs/Extensions are able to force any visibility on posts -	if (isset($data['force_approved_state'])) +	if (isset($data_ary['force_approved_state']))  	{ -		$post_visibility = (in_array((int) $data['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_approved_state'] : $post_visibility; +		$post_visibility = (in_array((int) $data_ary['force_approved_state'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data_ary['force_approved_state'] : $post_visibility;  	} -	if (isset($data['force_visibility'])) +	if (isset($data_ary['force_visibility']))  	{ -		$post_visibility = (in_array((int) $data['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED))) ? (int) $data['force_visibility'] : $post_visibility; +		$post_visibility = (in_array((int) $data_ary['force_visibility'], array(ITEM_APPROVED, ITEM_UNAPPROVED, ITEM_DELETED, ITEM_REAPPROVE))) ? (int) $data_ary['force_visibility'] : $post_visibility;  	}  	// Start the transaction here @@ -1572,25 +1486,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		case 'post':  		case 'reply':  			$sql_data[POSTS_TABLE]['sql'] = array( -				'forum_id'			=> $data['forum_id'], +				'forum_id'			=> $data_ary['forum_id'],  				'poster_id'			=> (int) $user->data['user_id'], -				'icon_id'			=> $data['icon_id'], +				'icon_id'			=> $data_ary['icon_id'],  				'poster_ip'			=> $user->ip,  				'post_time'			=> $current_time,  				'post_visibility'	=> $post_visibility, -				'enable_bbcode'		=> $data['enable_bbcode'], -				'enable_smilies'	=> $data['enable_smilies'], -				'enable_magic_url'	=> $data['enable_urls'], -				'enable_sig'		=> $data['enable_sig'], +				'enable_bbcode'		=> $data_ary['enable_bbcode'], +				'enable_smilies'	=> $data_ary['enable_smilies'], +				'enable_magic_url'	=> $data_ary['enable_urls'], +				'enable_sig'		=> $data_ary['enable_sig'],  				'post_username'		=> (!$user->data['is_registered']) ? $username : '',  				'post_subject'		=> $subject, -				'post_text'			=> $data['message'], -				'post_checksum'		=> $data['message_md5'], -				'post_attachment'	=> (!empty($data['attachment_data'])) ? 1 : 0, -				'bbcode_bitfield'	=> $data['bbcode_bitfield'], -				'bbcode_uid'		=> $data['bbcode_uid'], -				'post_postcount'	=> ($auth->acl_get('f_postcount', $data['forum_id'])) ? 1 : 0, -				'post_edit_locked'	=> $data['post_edit_locked'] +				'post_text'			=> $data_ary['message'], +				'post_checksum'		=> $data_ary['message_md5'], +				'post_attachment'	=> (!empty($data_ary['attachment_data'])) ? 1 : 0, +				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'], +				'bbcode_uid'		=> $data_ary['bbcode_uid'], +				'post_postcount'	=> ($auth->acl_get('f_postcount', $data_ary['forum_id'])) ? 1 : 0, +				'post_edit_locked'	=> $data_ary['post_edit_locked']  			);  		break; @@ -1607,19 +1521,19 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			// If normal edit display edit info  			// Display edit info if edit reason given or user is editing his post, which is not the last within the topic. -			if ($data['post_edit_reason'] || (!$auth->acl_get('m_edit', $data['forum_id']) && ($post_mode == 'edit' || $post_mode == 'edit_first_post'))) +			if ($data_ary['post_edit_reason'] || (!$auth->acl_get('m_edit', $data_ary['forum_id']) && ($post_mode == 'edit' || $post_mode == 'edit_first_post')))  			{ -				$data['post_edit_reason']		= truncate_string($data['post_edit_reason'], 255, 255, false); +				$data_ary['post_edit_reason']		= truncate_string($data_ary['post_edit_reason'], 255, 255, false);  				$sql_data[POSTS_TABLE]['sql']	= array(  					'post_edit_time'	=> $current_time, -					'post_edit_reason'	=> $data['post_edit_reason'], -					'post_edit_user'	=> (int) $data['post_edit_user'], +					'post_edit_reason'	=> $data_ary['post_edit_reason'], +					'post_edit_user'	=> (int) $data_ary['post_edit_user'],  				);  				$sql_data[POSTS_TABLE]['stat'][] = 'post_edit_count = post_edit_count + 1';  			} -			else if (!$data['post_edit_reason'] && $mode == 'edit' && $auth->acl_get('m_edit', $data['forum_id'])) +			else if (!$data_ary['post_edit_reason'] && $mode == 'edit' && $auth->acl_get('m_edit', $data_ary['forum_id']))  			{  				$sql_data[POSTS_TABLE]['sql'] = array(  					'post_edit_reason'	=> '', @@ -1630,8 +1544,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			// Could be simplified by only adding to the log if the edit is not tracked - but this may confuse admins/mods  			if ($user->data['user_id'] != $poster_id)  			{ -				$log_subject = ($subject) ? $subject : $data['topic_title']; -				add_log('mod', $data['forum_id'], $data['topic_id'], 'LOG_POST_EDITED', $log_subject, (!empty($username)) ? $username : $user->lang['GUEST']); +				$log_subject = ($subject) ? $subject : $data_ary['topic_title']; +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_POST_EDITED', false, array( +					'forum_id' => $data_ary['forum_id'], +					'topic_id' => $data_ary['topic_id'], +					'post_id'  => $data_ary['post_id'], +					$log_subject, +					(!empty($username)) ? $username : $user->lang['GUEST'], +					$data_ary['post_edit_reason'] +				));  			}  			if (!isset($sql_data[POSTS_TABLE]['sql'])) @@ -1640,32 +1561,31 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			}  			$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( -				'forum_id'			=> $data['forum_id'], -				'poster_id'			=> $data['poster_id'], -				'icon_id'			=> $data['icon_id'], +				'forum_id'			=> $data_ary['forum_id'], +				'poster_id'			=> $data_ary['poster_id'], +				'icon_id'			=> $data_ary['icon_id'],  				// We will change the visibility later  				//'post_visibility'	=> $post_visibility, -				'enable_bbcode'		=> $data['enable_bbcode'], -				'enable_smilies'	=> $data['enable_smilies'], -				'enable_magic_url'	=> $data['enable_urls'], -				'enable_sig'		=> $data['enable_sig'], -				'post_username'		=> ($username && $data['poster_id'] == ANONYMOUS) ? $username : '', +				'enable_bbcode'		=> $data_ary['enable_bbcode'], +				'enable_smilies'	=> $data_ary['enable_smilies'], +				'enable_magic_url'	=> $data_ary['enable_urls'], +				'enable_sig'		=> $data_ary['enable_sig'], +				'post_username'		=> ($username && $data_ary['poster_id'] == ANONYMOUS) ? $username : '',  				'post_subject'		=> $subject, -				'post_checksum'		=> $data['message_md5'], -				'post_attachment'	=> (!empty($data['attachment_data'])) ? 1 : 0, -				'bbcode_bitfield'	=> $data['bbcode_bitfield'], -				'bbcode_uid'		=> $data['bbcode_uid'], -				'post_edit_locked'	=> $data['post_edit_locked']) +				'post_checksum'		=> $data_ary['message_md5'], +				'post_attachment'	=> (!empty($data_ary['attachment_data'])) ? 1 : 0, +				'bbcode_bitfield'	=> $data_ary['bbcode_bitfield'], +				'bbcode_uid'		=> $data_ary['bbcode_uid'], +				'post_edit_locked'	=> $data_ary['post_edit_locked'])  			);  			if ($update_message)  			{ -				$sql_data[POSTS_TABLE]['sql']['post_text'] = $data['message']; +				$sql_data[POSTS_TABLE]['sql']['post_text'] = $data_ary['message'];  			}  		break;  	} -	$topic_row = array();  	// And the topic ladies and gentlemen  	switch ($post_mode) @@ -1675,8 +1595,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				'topic_poster'				=> (int) $user->data['user_id'],  				'topic_time'				=> $current_time,  				'topic_last_view_time'		=> $current_time, -				'forum_id'					=> $data['forum_id'], -				'icon_id'					=> $data['icon_id'], +				'forum_id'					=> $data_ary['forum_id'], +				'icon_id'					=> $data_ary['icon_id'],  				'topic_posts_approved'		=> ($post_visibility == ITEM_APPROVED) ? 1 : 0,  				'topic_posts_softdeleted'	=> ($post_visibility == ITEM_DELETED) ? 1 : 0,  				'topic_posts_unapproved'	=> ($post_visibility == ITEM_UNAPPROVED) ? 1 : 0, @@ -1686,14 +1606,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				'topic_first_poster_name'	=> (!$user->data['is_registered'] && $username) ? $username : (($user->data['user_id'] != ANONYMOUS) ? $user->data['username'] : ''),  				'topic_first_poster_colour'	=> $user->data['user_colour'],  				'topic_type'				=> $topic_type, -				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0, -				'topic_attachment'			=> (!empty($data['attachment_data'])) ? 1 : 0, +				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data_ary['topic_time_limit'] * 86400) : 0, +				'topic_attachment'			=> (!empty($data_ary['attachment_data'])) ? 1 : 0, +				'topic_status'				=> (isset($data_ary['topic_status'])) ? $data_ary['topic_status'] : ITEM_UNLOCKED,  			); -			if (isset($poll['poll_options']) && !empty($poll['poll_options'])) +			if (isset($poll_ary['poll_options']) && !empty($poll_ary['poll_options']))  			{ -				$poll_start = ($poll['poll_start']) ? $poll['poll_start'] : $current_time; -				$poll_length = $poll['poll_length'] * 86400; +				$poll_start = ($poll_ary['poll_start']) ? $poll_ary['poll_start'] : $current_time; +				$poll_length = $poll_ary['poll_length'] * 86400;  				if ($poll_length < 0)  				{  					$poll_start = $poll_start + $poll_length; @@ -1705,15 +1626,15 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				}  				$sql_data[TOPICS_TABLE]['sql'] = array_merge($sql_data[TOPICS_TABLE]['sql'], array( -					'poll_title'		=> $poll['poll_title'], +					'poll_title'		=> $poll_ary['poll_title'],  					'poll_start'		=> $poll_start, -					'poll_max_options'	=> $poll['poll_max_options'], +					'poll_max_options'	=> $poll_ary['poll_max_options'],  					'poll_length'		=> $poll_length, -					'poll_vote_change'	=> $poll['poll_vote_change']) +					'poll_vote_change'	=> $poll_ary['poll_vote_change'])  				);  			} -			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : ''); +			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data_ary['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');  			if ($post_visibility == ITEM_APPROVED)  			{ @@ -1739,9 +1660,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				(($post_visibility == ITEM_APPROVED) ? ', topic_posts_approved = topic_posts_approved + 1' : '') .  				(($post_visibility == ITEM_UNAPPROVED) ? ', topic_posts_unapproved = topic_posts_unapproved + 1' : '') .  				(($post_visibility == ITEM_DELETED) ? ', topic_posts_softdeleted = topic_posts_softdeleted + 1' : '') . -				((!empty($data['attachment_data']) || (isset($data['topic_attachment']) && $data['topic_attachment'])) ? ', topic_attachment = 1' : ''); +				((!empty($data_ary['attachment_data']) || (isset($data_ary['topic_attachment']) && $data_ary['topic_attachment'])) ? ', topic_attachment = 1' : ''); -			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : ''); +			$sql_data[USERS_TABLE]['stat'][] = "user_lastpost_time = $current_time" . (($auth->acl_get('f_postcount', $data_ary['forum_id']) && $post_visibility == ITEM_APPROVED) ? ', user_posts = user_posts + 1' : '');  			if ($post_visibility == ITEM_APPROVED)  			{ @@ -1759,10 +1680,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		case 'edit_topic':  		case 'edit_first_post': -			if (isset($poll['poll_options'])) +			if (isset($poll_ary['poll_options']))  			{ -				$poll_start = ($poll['poll_start'] || empty($poll['poll_options'])) ? $poll['poll_start'] : $current_time; -				$poll_length = $poll['poll_length'] * 86400; +				$poll_start = ($poll_ary['poll_start'] || empty($poll_ary['poll_options'])) ? $poll_ary['poll_start'] : $current_time; +				$poll_length = $poll_ary['poll_length'] * 86400;  				if ($poll_length < 0)  				{  					$poll_start = $poll_start + $poll_length; @@ -1775,25 +1696,55 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			}  			$sql_data[TOPICS_TABLE]['sql'] = array( -				'forum_id'					=> $data['forum_id'], -				'icon_id'					=> $data['icon_id'], +				'forum_id'					=> $data_ary['forum_id'], +				'icon_id'					=> $data_ary['icon_id'],  				'topic_title'				=> $subject,  				'topic_first_poster_name'	=> $username,  				'topic_type'				=> $topic_type, -				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data['topic_time_limit'] * 86400) : 0, -				'poll_title'				=> (isset($poll['poll_options'])) ? $poll['poll_title'] : '', -				'poll_start'				=> (isset($poll['poll_options'])) ? $poll_start : 0, -				'poll_max_options'			=> (isset($poll['poll_options'])) ? $poll['poll_max_options'] : 1, -				'poll_length'				=> (isset($poll['poll_options'])) ? $poll_length : 0, -				'poll_vote_change'			=> (isset($poll['poll_vote_change'])) ? $poll['poll_vote_change'] : 0, +				'topic_time_limit'			=> ($topic_type == POST_STICKY || $topic_type == POST_ANNOUNCE) ? ($data_ary['topic_time_limit'] * 86400) : 0, +				'poll_title'				=> (isset($poll_ary['poll_options'])) ? $poll_ary['poll_title'] : '', +				'poll_start'				=> (isset($poll_ary['poll_options'])) ? $poll_start : 0, +				'poll_max_options'			=> (isset($poll_ary['poll_options'])) ? $poll_ary['poll_max_options'] : 1, +				'poll_length'				=> (isset($poll_ary['poll_options'])) ? $poll_length : 0, +				'poll_vote_change'			=> (isset($poll_ary['poll_vote_change'])) ? $poll_ary['poll_vote_change'] : 0,  				'topic_last_view_time'		=> $current_time, -				'topic_attachment'			=> (!empty($data['attachment_data'])) ? 1 : (isset($data['topic_attachment']) ? $data['topic_attachment'] : 0), +				'topic_attachment'			=> (!empty($data_ary['attachment_data'])) ? 1 : (isset($data_ary['topic_attachment']) ? $data_ary['topic_attachment'] : 0),  			);  		break;  	} +	$poll = $poll_ary; +	$data = $data_ary; +	/** +	* Modify sql query data for post submitting +	* +	* @event core.submit_post_modify_sql_data +	* @var	array	data				Array with the data for the post +	* @var	array	poll				Array with the poll data for the post +	* @var	string	post_mode			Variable containing posting mode value +	* @var	bool	sql_data			Array with the data for the posting SQL query +	* @var	string	subject				Variable containing post subject value +	* @var	int		topic_type			Variable containing topic type value +	* @var	string	username			Variable containing post author name +	* @since 3.1.3-RC1 +	*/ +	$vars = array( +		'data', +		'poll', +		'post_mode', +		'sql_data', +		'subject', +		'topic_type', +		'username', +	); +	extract($phpbb_dispatcher->trigger_event('core.submit_post_modify_sql_data', compact($vars))); +	$poll_ary = $poll; +	$data_ary = $data; +	unset($poll); +	unset($data); +  	// Submit new topic  	if ($post_mode == 'post')  	{ @@ -1801,10 +1752,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			$db->sql_build_array('INSERT', $sql_data[TOPICS_TABLE]['sql']);  		$db->sql_query($sql); -		$data['topic_id'] = $db->sql_nextid(); +		$data_ary['topic_id'] = $db->sql_nextid();  		$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( -			'topic_id' => $data['topic_id']) +			'topic_id' => $data_ary['topic_id'])  		);  		unset($sql_data[TOPICS_TABLE]['sql']);  	} @@ -1815,18 +1766,18 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		if ($post_mode == 'reply')  		{  			$sql_data[POSTS_TABLE]['sql'] = array_merge($sql_data[POSTS_TABLE]['sql'], array( -				'topic_id' => $data['topic_id'], +				'topic_id' => $data_ary['topic_id'],  			));  		}  		$sql = 'INSERT INTO ' . POSTS_TABLE . ' ' . $db->sql_build_array('INSERT', $sql_data[POSTS_TABLE]['sql']);  		$db->sql_query($sql); -		$data['post_id'] = $db->sql_nextid(); +		$data_ary['post_id'] = $db->sql_nextid();  		if ($post_mode == 'post' || $post_visibility == ITEM_APPROVED)  		{  			$sql_data[TOPICS_TABLE]['sql'] = array( -				'topic_last_post_id'		=> $data['post_id'], +				'topic_last_post_id'		=> $data_ary['post_id'],  				'topic_last_post_time'		=> $current_time,  				'topic_last_poster_id'		=> $sql_data[POSTS_TABLE]['sql']['poster_id'],  				'topic_last_poster_name'	=> ($user->data['user_id'] == ANONYMOUS) ? $sql_data[POSTS_TABLE]['sql']['post_username'] : $user->data['username'], @@ -1837,7 +1788,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		if ($post_mode == 'post')  		{ -			$sql_data[TOPICS_TABLE]['sql']['topic_first_post_id'] = $data['post_id']; +			$sql_data[TOPICS_TABLE]['sql']['topic_first_post_id'] = $data_ary['post_id'];  		}  		// Update total post count and forum information @@ -1845,11 +1796,11 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		{  			if ($post_mode == 'post')  			{ -				set_config_count('num_topics', 1, true); +				$config->increment('num_topics', 1, false);  			} -			set_config_count('num_posts', 1, true); +			$config->increment('num_posts', 1, false); -			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data['post_id']; +			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_id = ' . $data_ary['post_id'];  			$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_post_subject = '" . $db->sql_escape($subject) . "'";  			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_post_time = ' . $current_time;  			$sql_data[FORUMS_TABLE]['stat'][] = 'forum_last_poster_id = ' . (int) $user->data['user_id']; @@ -1865,7 +1816,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	{  		$sql = 'UPDATE ' . TOPICS_TABLE . '  			SET ' . $db->sql_build_array('UPDATE', $sql_data[TOPICS_TABLE]['sql']) . ' -			WHERE topic_id = ' . $data['topic_id']; +			WHERE topic_id = ' . $data_ary['topic_id'];  		$db->sql_query($sql);  		unset($sql_data[TOPICS_TABLE]['sql']); @@ -1876,14 +1827,14 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	{  		$sql = 'UPDATE ' . POSTS_TABLE . '  			SET ' . $db->sql_build_array('UPDATE', $sql_data[POSTS_TABLE]['sql']) . ' -			WHERE post_id = ' . $data['post_id']; +			WHERE post_id = ' . $data_ary['post_id'];  		$db->sql_query($sql);  		unset($sql_data[POSTS_TABLE]['sql']);  	}  	// Update Poll Tables -	if (isset($poll['poll_options'])) +	if (isset($poll_ary['poll_options']))  	{  		$cur_poll_options = array(); @@ -1891,7 +1842,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		{  			$sql = 'SELECT *  				FROM ' . POLL_OPTIONS_TABLE . ' -				WHERE topic_id = ' . $data['topic_id'] . ' +				WHERE topic_id = ' . $data_ary['topic_id'] . '  				ORDER BY poll_option_id';  			$result = $db->sql_query($sql); @@ -1905,25 +1856,25 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		$sql_insert_ary = array(); -		for ($i = 0, $size = sizeof($poll['poll_options']); $i < $size; $i++) +		for ($i = 0, $size = sizeof($poll_ary['poll_options']); $i < $size; $i++)  		{ -			if (strlen(trim($poll['poll_options'][$i]))) +			if (strlen(trim($poll_ary['poll_options'][$i])))  			{  				if (empty($cur_poll_options[$i]))  				{  					// If we add options we need to put them to the end to be able to preserve votes...  					$sql_insert_ary[] = array(  						'poll_option_id'	=> (int) sizeof($cur_poll_options) + 1 + sizeof($sql_insert_ary), -						'topic_id'			=> (int) $data['topic_id'], -						'poll_option_text'	=> (string) $poll['poll_options'][$i] +						'topic_id'			=> (int) $data_ary['topic_id'], +						'poll_option_text'	=> (string) $poll_ary['poll_options'][$i]  					);  				} -				else if ($poll['poll_options'][$i] != $cur_poll_options[$i]) +				else if ($poll_ary['poll_options'][$i] != $cur_poll_options[$i])  				{  					$sql = 'UPDATE ' . POLL_OPTIONS_TABLE . " -						SET poll_option_text = '" . $db->sql_escape($poll['poll_options'][$i]) . "' +						SET poll_option_text = '" . $db->sql_escape($poll_ary['poll_options'][$i]) . "'  						WHERE poll_option_id = " . $cur_poll_options[$i]['poll_option_id'] . ' -							AND topic_id = ' . $data['topic_id']; +							AND topic_id = ' . $data_ary['topic_id'];  					$db->sql_query($sql);  				}  			} @@ -1931,29 +1882,29 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		$db->sql_multi_insert(POLL_OPTIONS_TABLE, $sql_insert_ary); -		if (sizeof($poll['poll_options']) < sizeof($cur_poll_options)) +		if (sizeof($poll_ary['poll_options']) < sizeof($cur_poll_options))  		{  			$sql = 'DELETE FROM ' . POLL_OPTIONS_TABLE . ' -				WHERE poll_option_id > ' . sizeof($poll['poll_options']) . ' -					AND topic_id = ' . $data['topic_id']; +				WHERE poll_option_id > ' . sizeof($poll_ary['poll_options']) . ' +					AND topic_id = ' . $data_ary['topic_id'];  			$db->sql_query($sql);  		}  		// If edited, we would need to reset votes (since options can be re-ordered above, you can't be sure if the change is for changing the text or adding an option -		if ($mode == 'edit' && sizeof($poll['poll_options']) != sizeof($cur_poll_options)) +		if ($mode == 'edit' && sizeof($poll_ary['poll_options']) != sizeof($cur_poll_options))  		{ -			$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data['topic_id']); -			$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data['topic_id']); +			$db->sql_query('DELETE FROM ' . POLL_VOTES_TABLE . ' WHERE topic_id = ' . $data_ary['topic_id']); +			$db->sql_query('UPDATE ' . POLL_OPTIONS_TABLE . ' SET poll_option_total = 0 WHERE topic_id = ' . $data_ary['topic_id']);  		}  	}  	// Submit Attachments -	if (!empty($data['attachment_data']) && $data['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit'))) +	if (!empty($data_ary['attachment_data']) && $data_ary['post_id'] && in_array($mode, array('post', 'reply', 'quote', 'edit')))  	{  		$space_taken = $files_added = 0;  		$orphan_rows = array(); -		foreach ($data['attachment_data'] as $pos => $attach_row) +		foreach ($data_ary['attachment_data'] as $pos => $attach_row)  		{  			$orphan_rows[(int) $attach_row['attach_id']] = array();  		} @@ -1975,7 +1926,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			$db->sql_freeresult($result);  		} -		foreach ($data['attachment_data'] as $pos => $attach_row) +		foreach ($data_ary['attachment_data'] as $pos => $attach_row)  		{  			if ($attach_row['is_orphan'] && !isset($orphan_rows[$attach_row['attach_id']]))  			{ @@ -2003,8 +1954,8 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				$files_added++;  				$attach_sql = array( -					'post_msg_id'		=> $data['post_id'], -					'topic_id'			=> $data['topic_id'], +					'post_msg_id'		=> $data_ary['post_id'], +					'topic_id'			=> $data_ary['topic_id'],  					'is_orphan'			=> 0,  					'poster_id'			=> $poster_id,  					'attach_comment'	=> $attach_row['attach_comment'], @@ -2020,36 +1971,38 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		if ($space_taken && $files_added)  		{ -			set_config_count('upload_dir_size', $space_taken, true); -			set_config_count('num_files', $files_added, true); +			$config->increment('upload_dir_size', $space_taken, false); +			$config->increment('num_files', $files_added, false);  		}  	}  	$first_post_has_topic_info = ($post_mode == 'edit_first_post' && -			(($post_visibility == ITEM_DELETED && $data['topic_posts_softdeleted'] == 1) || -			($post_visibility == ITEM_UNAPPROVED && $data['topic_posts_unapproved'] == 1) || -			($post_visibility == ITEM_APPROVED && $data['topic_posts_approved'] == 1))); +			(($post_visibility == ITEM_DELETED && $data_ary['topic_posts_softdeleted'] == 1) || +			($post_visibility == ITEM_UNAPPROVED && $data_ary['topic_posts_unapproved'] == 1) || +			($post_visibility == ITEM_REAPPROVE && $data_ary['topic_posts_unapproved'] == 1) || +			($post_visibility == ITEM_APPROVED && $data_ary['topic_posts_approved'] == 1)));  	// Fix the post's and topic's visibility and first/last post information, when the post is edited -	if (($post_mode != 'post' && $post_mode != 'reply') && $data['post_visibility'] != $post_visibility) +	if (($post_mode != 'post' && $post_mode != 'reply') && $data_ary['post_visibility'] != $post_visibility)  	{  		// If the post was not approved, it could also be the starter,  		// so we sync the starter after approving/restoring, to ensure that the stats are correct  		// Same applies for the last post -		$is_starter = ($post_mode == 'edit_first_post' || $data['post_visibility'] != ITEM_APPROVED); -		$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data['post_visibility'] != ITEM_APPROVED); +		$is_starter = ($post_mode == 'edit_first_post' || $post_mode == 'edit_topic' || $data_ary['post_visibility'] != ITEM_APPROVED); +		$is_latest = ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $data_ary['post_visibility'] != ITEM_APPROVED); +		/* @var $phpbb_content_visibility \phpbb\content_visibility */  		$phpbb_content_visibility = $phpbb_container->get('content.visibility'); -		$phpbb_content_visibility->set_post_visibility($post_visibility, $data['post_id'], $data['topic_id'], $data['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest); +		$phpbb_content_visibility->set_post_visibility($post_visibility, $data_ary['post_id'], $data_ary['topic_id'], $data_ary['forum_id'], $user->data['user_id'], time(), '', $is_starter, $is_latest);  	}  	else if ($post_mode == 'edit_last_post' || $post_mode == 'edit_topic' || $first_post_has_topic_info)  	{ -		if ($post_visibility == ITEM_APPROVED || $data['topic_visibility'] == $post_visibility) +		if ($post_visibility == ITEM_APPROVED || $data_ary['topic_visibility'] == $post_visibility)  		{  			// only the subject can be changed from edit  			$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_post_subject = '" . $db->sql_escape($subject) . "'";  			// Maybe not only the subject, but also changing anonymous usernames. ;) -			if ($data['poster_id'] == ANONYMOUS) +			if ($data_ary['poster_id'] == ANONYMOUS)  			{  				$sql_data[TOPICS_TABLE]['stat'][] = "topic_last_poster_name = '" . $db->sql_escape($username) . "'";  			} @@ -2060,13 +2013,13 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  				// it just means that we might have to  				$sql = 'SELECT forum_last_post_id, forum_last_post_subject  					FROM ' . FORUMS_TABLE . ' -					WHERE forum_id = ' . (int) $data['forum_id']; +					WHERE forum_id = ' . (int) $data_ary['forum_id'];  				$result = $db->sql_query($sql);  				$row = $db->sql_fetchrow($result);  				$db->sql_freeresult($result);  				// this post is the latest post in the forum, better update -				if ($row['forum_last_post_id'] == $data['post_id'] && ($row['forum_last_post_subject'] !== $subject || $data['poster_id'] == ANONYMOUS)) +				if ($row['forum_last_post_id'] == $data_ary['post_id'] && ($row['forum_last_post_subject'] !== $subject || $data_ary['poster_id'] == ANONYMOUS))  				{  					// the post's subject changed  					if ($row['forum_last_post_subject'] !== $subject) @@ -2075,7 +2028,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  					}  					// Update the user name if poster is anonymous... just in case a moderator changed it -					if ($data['poster_id'] == ANONYMOUS) +					if ($data_ary['poster_id'] == ANONYMOUS)  					{  						$sql_data[FORUMS_TABLE]['stat'][] = "forum_last_poster_name = '" . $db->sql_escape($username) . "'";  					} @@ -2086,9 +2039,9 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	// Update forum stats  	$where_sql = array( -		POSTS_TABLE		=> 'post_id = ' . $data['post_id'], -		TOPICS_TABLE	=> 'topic_id = ' . $data['topic_id'], -		FORUMS_TABLE	=> 'forum_id = ' . $data['forum_id'], +		POSTS_TABLE		=> 'post_id = ' . $data_ary['post_id'], +		TOPICS_TABLE	=> 'topic_id = ' . $data_ary['topic_id'], +		FORUMS_TABLE	=> 'forum_id = ' . $data_ary['forum_id'],  		USERS_TABLE		=> 'user_id = ' . $poster_id  	); @@ -2105,7 +2058,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	if ($topic_type == POST_GLOBAL)  	{  		$sql = 'DELETE FROM ' . TOPICS_TABLE . ' -			WHERE topic_moved_id = ' . $data['topic_id']; +			WHERE topic_moved_id = ' . $data_ary['topic_id'];  		$db->sql_query($sql);  	} @@ -2113,7 +2066,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	$db->sql_transaction('commit');  	// Delete draft if post was loaded... -	$draft_id = request_var('draft_loaded', 0); +	$draft_id = $request->variable('draft_loaded', 0);  	if ($draft_id)  	{  		$sql = 'DELETE FROM ' . DRAFTS_TABLE . " @@ -2123,7 +2076,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	}  	// Index message contents -	if ($update_search_index && $data['enable_indexing']) +	if ($update_search_index && $data_ary['enable_indexing'])  	{  		// Select the search method and do some additional checks to ensure it can actually be utilised  		$search_type = $config['search_type']; @@ -2134,30 +2087,30 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		}  		$error = false; -		$search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user); +		$search = new $search_type($error, $phpbb_root_path, $phpEx, $auth, $config, $db, $user, $phpbb_dispatcher);  		if ($error)  		{  			trigger_error($error);  		} -		$search->index($mode, $data['post_id'], $data['message'], $subject, $poster_id, $data['forum_id']); +		$search->index($mode, $data_ary['post_id'], $data_ary['message'], $subject, $poster_id, $data_ary['forum_id']);  	}  	// Topic Notification, do not change if moderator is changing other users posts...  	if ($user->data['user_id'] == $poster_id)  	{ -		if (!$data['notify_set'] && $data['notify']) +		if (!$data_ary['notify_set'] && $data_ary['notify'])  		{  			$sql = 'INSERT INTO ' . TOPICS_WATCH_TABLE . ' (user_id, topic_id) -				VALUES (' . $user->data['user_id'] . ', ' . $data['topic_id'] . ')'; +				VALUES (' . $user->data['user_id'] . ', ' . $data_ary['topic_id'] . ')';  			$db->sql_query($sql);  		} -		else if (($config['email_enable'] || $config['jab_enable']) && $data['notify_set'] && !$data['notify']) +		else if (($config['email_enable'] || $config['jab_enable']) && $data_ary['notify_set'] && !$data_ary['notify'])  		{  			$sql = 'DELETE FROM ' . TOPICS_WATCH_TABLE . '  				WHERE user_id = ' . $user->data['user_id'] . ' -					AND topic_id = ' . $data['topic_id']; +					AND topic_id = ' . $data_ary['topic_id'];  			$db->sql_query($sql);  		}  	} @@ -2165,12 +2118,12 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	if ($mode == 'post' || $mode == 'reply' || $mode == 'quote')  	{  		// Mark this topic as posted to -		markread('post', $data['forum_id'], $data['topic_id']); +		markread('post', $data_ary['forum_id'], $data_ary['topic_id']);  	}  	// Mark this topic as read  	// We do not use post_time here, this is intended (post_time can have a date in the past if editing a message) -	markread('topic', $data['forum_id'], $data['topic_id'], time()); +	markread('topic', $data_ary['forum_id'], $data_ary['topic_id'], time());  	//  	if ($config['load_db_lastread'] && $user->data['is_registered']) @@ -2178,7 +2131,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		$sql = 'SELECT mark_time  			FROM ' . FORUMS_TRACK_TABLE . '  			WHERE user_id = ' . $user->data['user_id'] . ' -				AND forum_id = ' . $data['forum_id']; +				AND forum_id = ' . $data_ary['forum_id'];  		$result = $db->sql_query($sql);  		$f_mark_time = (int) $db->sql_fetchfield('mark_time');  		$db->sql_freeresult($result); @@ -2193,12 +2146,12 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		// Update forum info  		$sql = 'SELECT forum_last_post_time  			FROM ' . FORUMS_TABLE . ' -			WHERE forum_id = ' . $data['forum_id']; +			WHERE forum_id = ' . $data_ary['forum_id'];  		$result = $db->sql_query($sql);  		$forum_last_post_time = (int) $db->sql_fetchfield('forum_last_post_time');  		$db->sql_freeresult($result); -		update_forum_tracking_info($data['forum_id'], $forum_last_post_time, $f_mark_time, false); +		update_forum_tracking_info($data_ary['forum_id'], $forum_last_post_time, $f_mark_time, false);  	}  	// If a username was supplied or the poster is a guest, we will use the supplied username. @@ -2207,15 +2160,16 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	$username = ($username !== '' || !$user->data['is_registered']) ? $username : $user->data['username'];  	// Send Notifications -	$notification_data = array_merge($data, array( -		'topic_title'		=> (isset($data['topic_title'])) ? $data['topic_title'] : $subject, +	$notification_data = array_merge($data_ary, array( +		'topic_title'		=> (isset($data_ary['topic_title'])) ? $data_ary['topic_title'] : $subject,  		'post_username'		=> $username,  		'poster_id'			=> $poster_id, -		'post_text'			=> $data['message'], +		'post_text'			=> $data_ary['message'],  		'post_time'			=> $current_time,  		'post_subject'		=> $subject,  	)); +	/* @var $phpbb_notifications \phpbb\notification\manager */  	$phpbb_notifications = $phpbb_container->get('notification_manager');  	if ($post_visibility == ITEM_APPROVED) @@ -2224,17 +2178,17 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		{  			case 'post':  				$phpbb_notifications->add_notifications(array( -					'quote', -					'topic', +					'notification.type.quote', +					'notification.type.topic',  				), $notification_data);  			break;  			case 'reply':  			case 'quote':  				$phpbb_notifications->add_notifications(array( -					'quote', -					'bookmark', -					'post', +					'notification.type.quote', +					'notification.type.bookmark', +					'notification.type.post',  				), $notification_data);  			break; @@ -2243,10 +2197,10 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  			case 'edit':  			case 'edit_last_post':  				$phpbb_notifications->update_notifications(array( -					'quote', -					'bookmark', -					'topic', -					'post', +					'notification.type.quote', +					'notification.type.bookmark', +					'notification.type.topic', +					'notification.type.post',  				), $notification_data);  			break;  		} @@ -2256,51 +2210,63 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  		switch ($mode)  		{  			case 'post': -				$phpbb_notifications->add_notifications('topic_in_queue', $notification_data); +				$phpbb_notifications->add_notifications('notification.type.topic_in_queue', $notification_data);  			break;  			case 'reply':  			case 'quote': -				$phpbb_notifications->add_notifications('post_in_queue', $notification_data); +				$phpbb_notifications->add_notifications('notification.type.post_in_queue', $notification_data);  			break;  			case 'edit_topic':  			case 'edit_first_post':  			case 'edit':  			case 'edit_last_post': -				// @todo: Check whether these notification deletions are correct -				$phpbb_notifications->delete_notifications('topic', $data['topic_id']); - -				$phpbb_notifications->delete_notifications(array( -					'quote', -					'bookmark', -					'post', -				), $data['post_id']); +				// Nothing to do here  			break;  		}  	} -	else if ($post_visibility == ITEM_DELETED) +	else if ($post_visibility == ITEM_REAPPROVE)  	{  		switch ($mode)  		{ +			case 'edit_topic': +			case 'edit_first_post': +				$phpbb_notifications->add_notifications('notification.type.topic_in_queue', $notification_data); + +				// Delete the approve_post notification so we can notify the user again, +				// when his post got reapproved +				$phpbb_notifications->delete_notifications('notification.type.approve_post', $notification_data['post_id']); +			break; + +			case 'edit': +			case 'edit_last_post': +				$phpbb_notifications->add_notifications('notification.type.post_in_queue', $notification_data); + +				// Delete the approve_post notification so we can notify the user again, +				// when his post got reapproved +				$phpbb_notifications->delete_notifications('notification.type.approve_post', $notification_data['post_id']); +			break; +  			case 'post':  			case 'reply':  			case 'quote':  				// Nothing to do here  			break; - +		} +	} +	else if ($post_visibility == ITEM_DELETED) +	{ +		switch ($mode) +		{ +			case 'post': +			case 'reply': +			case 'quote':  			case 'edit_topic':  			case 'edit_first_post':  			case 'edit':  			case 'edit_last_post': -				// @todo: Check whether these notification deletions are correct -				$phpbb_notifications->delete_notifications('topic', $data['topic_id']); - -				$phpbb_notifications->delete_notifications(array( -					'quote', -					'bookmark', -					'post', -				), $data['post_id']); +				// Nothing to do here  			break;  		}  	} @@ -2309,22 +2275,24 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	if ($post_visibility == ITEM_APPROVED)  	{ -		$params .= '&t=' . $data['topic_id']; +		$params .= '&t=' . $data_ary['topic_id'];  		if ($mode != 'post')  		{ -			$params .= '&p=' . $data['post_id']; -			$add_anchor = '#p' . $data['post_id']; +			$params .= '&p=' . $data_ary['post_id']; +			$add_anchor = '#p' . $data_ary['post_id'];  		}  	}  	else if ($mode != 'post' && $post_mode != 'edit_first_post' && $post_mode != 'edit_topic')  	{ -		$params .= '&t=' . $data['topic_id']; +		$params .= '&t=' . $data_ary['topic_id'];  	}  	$url = (!$params) ? "{$phpbb_root_path}viewforum.$phpEx" : "{$phpbb_root_path}viewtopic.$phpEx"; -	$url = append_sid($url, 'f=' . $data['forum_id'] . $params) . $add_anchor; +	$url = append_sid($url, 'f=' . $data_ary['forum_id'] . $params) . $add_anchor; +	$poll = $poll_ary; +	$data = $data_ary;  	/**  	* This event is used for performing actions directly after a post or topic  	* has been submitted. When a new topic is posted, the topic ID is @@ -2334,13 +2302,38 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  	* event is to modify the return URL ($url).  	*  	* @event core.submit_post_end -	* @var	string		url						The "Return to topic" URL -	* @var	array		data					Array of post data about the -	*											submitted post -	* @since 3.1-A3 +	* @var	string	mode				Variable containing posting mode value +	* @var	string	subject				Variable containing post subject value +	* @var	string	username			Variable containing post author name +	* @var	int		topic_type			Variable containing topic type value +	* @var	array	poll				Array with the poll data for the post +	* @var	array	data				Array with the data for the post +	* @var	int		post_visibility		Variable containing up to date post visibility +	* @var	bool	update_message		Flag indicating if the post will be updated +	* @var	bool	update_search_index	Flag indicating if the search index will be updated +	* @var	string	url					The "Return to topic" URL +	* +	* @since 3.1.0-a3 +	* @change 3.1.0-RC3 Added vars mode, subject, username, topic_type, +	*		poll, update_message, update_search_index  	*/ -	$vars = array('url', 'data'); +	$vars = array( +		'mode', +		'subject', +		'username', +		'topic_type', +		'poll', +		'data', +		'post_visibility', +		'update_message', +		'update_search_index', +		'url', +	);  	extract($phpbb_dispatcher->trigger_event('core.submit_post_end', compact($vars))); +	$data_ary = $data; +	$poll_ary = $poll; +	unset($data); +	unset($poll);  	return $url;  } @@ -2361,7 +2354,7 @@ function submit_post($mode, $subject, $username, $topic_type, &$poll, &$data, $u  */  function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)  { -	global $config, $db, $user, $phpEx, $phpbb_root_path; +	global $config, $db, $user, $phpEx, $phpbb_root_path, $phpbb_log;  	if ($bump_time === false)  	{ @@ -2440,9 +2433,160 @@ function phpbb_bump_topic($forum_id, $topic_id, $post_data, $bump_time = false)  		update_forum_tracking_info($forum_id, $forum_last_post_time, $f_mark_time, false);  	} -	add_log('mod', $forum_id, $topic_id, 'LOG_BUMP_TOPIC', $post_data['topic_title']); +	$phpbb_log->add('mod', $user->data['user_id'], $user->ip, 'LOG_BUMP_TOPIC', false, array( +		'forum_id' => $forum_id, +		'topic_id' => $topic_id, +		$post_data['topic_title'] +	));  	$url = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&p={$post_data['topic_last_post_id']}") . "#p{$post_data['topic_last_post_id']}";  	return $url;  } + +/** +* Show upload popup (progress bar) +*/ +function phpbb_upload_popup($forum_style = 0) +{ +	global $template, $user; + +	($forum_style) ? $user->setup('posting', $forum_style) : $user->setup('posting'); + +	page_header($user->lang['PROGRESS_BAR']); + +	$template->set_filenames(array( +			'popup'	=> 'posting_progress_bar.html') +	); + +	$template->assign_vars(array( +			'PROGRESS_BAR'	=> $user->img('upload_bar', $user->lang['UPLOAD_IN_PROGRESS'])) +	); + +	$template->display('popup'); + +	garbage_collection(); +	exit_handler(); +} + +/** +* Do the various checks required for removing posts as well as removing it +*/ +function phpbb_handle_post_delete($forum_id, $topic_id, $post_id, &$post_data, $is_soft = false, $delete_reason = '') +{ +	global $user, $auth, $config, $request; +	global $phpbb_root_path, $phpEx, $phpbb_log; + +	$perm_check = ($is_soft) ? 'softdelete' : 'delete'; + +	// If moderator removing post or user itself removing post, present a confirmation screen +	if ($auth->acl_get("m_$perm_check", $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get("f_$perm_check", $forum_id) && $post_id == $post_data['topic_last_post_id'] && !$post_data['post_edit_locked'] && ($post_data['post_time'] > time() - ($config['delete_time'] * 60) || !$config['delete_time']))) +	{ +		$s_hidden_fields = array( +			'p'		=> $post_id, +			'f'		=> $forum_id, +			'mode'	=> ($is_soft) ? 'soft_delete' : 'delete', +		); + +		if (confirm_box(true)) +		{ +			$data = array( +				'topic_first_post_id'	=> $post_data['topic_first_post_id'], +				'topic_last_post_id'	=> $post_data['topic_last_post_id'], +				'topic_posts_approved'		=> $post_data['topic_posts_approved'], +				'topic_posts_unapproved'	=> $post_data['topic_posts_unapproved'], +				'topic_posts_softdeleted'	=> $post_data['topic_posts_softdeleted'], +				'topic_visibility'		=> $post_data['topic_visibility'], +				'topic_type'			=> $post_data['topic_type'], +				'post_visibility'		=> $post_data['post_visibility'], +				'post_reported'			=> $post_data['post_reported'], +				'post_time'				=> $post_data['post_time'], +				'poster_id'				=> $post_data['poster_id'], +				'post_postcount'		=> $post_data['post_postcount'], +			); + +			$next_post_id = delete_post($forum_id, $topic_id, $post_id, $data, $is_soft, $delete_reason); +			$post_username = ($post_data['poster_id'] == ANONYMOUS && !empty($post_data['post_username'])) ? $post_data['post_username'] : $post_data['username']; + +			if ($next_post_id === false) +			{ +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_TOPIC' : 'LOG_DELETE_TOPIC'), false, array( +					'forum_id' => $forum_id, +					'topic_id' => $topic_id, +					$post_data['topic_title'], +					$post_username, +					$delete_reason +				)); + +				$meta_info = append_sid("{$phpbb_root_path}viewforum.$phpEx", "f=$forum_id"); +				$message = $user->lang['POST_DELETED']; +			} +			else +			{ +				$phpbb_log->add('mod', $user->data['user_id'], $user->ip, (($is_soft) ? 'LOG_SOFTDELETE_POST' : 'LOG_DELETE_POST'), false, array( +					'forum_id' => $forum_id, +					'topic_id' => $topic_id, +					'post_id'  => $post_id, +					$post_data['post_subject'], +					$post_username, +					$delete_reason +				)); + +				$meta_info = append_sid("{$phpbb_root_path}viewtopic.$phpEx", "f=$forum_id&t=$topic_id&p=$next_post_id") . "#p$next_post_id"; +				$message = $user->lang['POST_DELETED']; + +				if (!$request->is_ajax()) +				{ +					$message .= '<br /><br />' . $user->lang('RETURN_TOPIC', '<a href="' . $meta_info . '">', '</a>'); +				} +			} + +			meta_refresh(3, $meta_info); +			if (!$request->is_ajax()) +			{ +				$message .= '<br /><br />' . $user->lang('RETURN_FORUM', '<a href="' . append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $forum_id) . '">', '</a>'); +			} +			trigger_error($message); +		} +		else +		{ +			global $user, $template, $request; + +			$can_delete = $auth->acl_get('m_delete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_delete', $forum_id)); +			$can_softdelete = $auth->acl_get('m_softdelete', $forum_id) || ($post_data['poster_id'] == $user->data['user_id'] && $user->data['is_registered'] && $auth->acl_get('f_softdelete', $forum_id)); + +			$template->assign_vars(array( +				'S_SOFTDELETED'			=> $post_data['post_visibility'] == ITEM_DELETED, +				'S_CHECKED_PERMANENT'	=> $request->is_set_post('delete_permanent') ? ' checked="checked"' : '', +				'S_ALLOWED_DELETE'		=> $can_delete, +				'S_ALLOWED_SOFTDELETE'	=> $can_softdelete, +			)); + +			$l_confirm = 'DELETE_POST'; +			if ($post_data['post_visibility'] == ITEM_DELETED) +			{ +				$l_confirm .= '_PERMANENTLY'; +				$s_hidden_fields['delete_permanent'] = '1'; +			} +			else if (!$can_softdelete) +			{ +				$s_hidden_fields['delete_permanent'] = '1'; +			} + +			confirm_box(false, $l_confirm, build_hidden_fields($s_hidden_fields), 'confirm_delete_body.html'); +		} +	} + +	// If we are here the user is not able to delete - present the correct error message +	if ($post_data['poster_id'] != $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id)) +	{ +		trigger_error('DELETE_OWN_POSTS'); +	} + +	if ($post_data['poster_id'] == $user->data['user_id'] && $auth->acl_get('f_delete', $forum_id) && $post_id != $post_data['topic_last_post_id']) +	{ +		trigger_error('CANNOT_DELETE_REPLIED'); +	} + +	trigger_error('USER_CANNOT_DELETE'); +} | 
