diff options
Diffstat (limited to 'phpBB/includes/functions_privmsgs.php')
| -rw-r--r-- | phpBB/includes/functions_privmsgs.php | 166 | 
1 files changed, 160 insertions, 6 deletions
diff --git a/phpBB/includes/functions_privmsgs.php b/phpBB/includes/functions_privmsgs.php index 434349714b..8542e3ab0a 100644 --- a/phpBB/includes/functions_privmsgs.php +++ b/phpBB/includes/functions_privmsgs.php @@ -1128,6 +1128,166 @@ function delete_pm($user_id, $msg_ids, $folder_id)  }  /** +* Delete all PM(s) for a given user and delete the ones without references +* +* @param	int		$user_id	ID of the user whose private messages we want to delete +* +* @return	boolean		False if there were no pms found, true otherwise. +*/ +function phpbb_delete_user_pms($user_id) +{ +	global $db, $user, $phpbb_root_path, $phpEx; + +	$user_id = (int) $user_id; + +	if (!$user_id) +	{ +		return false; +	} + +	// Get PM Information for later deleting +	// The two queries where split, so we can use our indexes +	// Part 1: get PMs the user received +	$sql = 'SELECT msg_id, author_id, folder_id, pm_unread, pm_new +		FROM ' . PRIVMSGS_TO_TABLE . ' +		WHERE user_id = ' . $user_id; +	$result = $db->sql_query($sql); + +	$undelivered_msg = $undelivered_user = $delete_ids = array(); +	while ($row = $db->sql_fetchrow($result)) +	{ +		if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) +		{ +			// Undelivered messages +			$undelivered_msg[] = $row['msg_id']; + +			if (isset($undelivered_user[$row['user_id']])) +			{ +				++$undelivered_user[$row['user_id']]; +			} +			else +			{ +				$undelivered_user[$row['user_id']] = 1; +			} +		} + +		$delete_ids[(int) $row['msg_id']] = (int) $row['msg_id']; +	} +	$db->sql_freeresult($result); + +	// Part 2: get PMs the user sent +	$sql = 'SELECT msg_id, author_id, folder_id, pm_unread, pm_new +		FROM ' . PRIVMSGS_TO_TABLE . ' +		WHERE author_id = ' . $user_id . ' +				AND folder_id = ' . PRIVMSGS_NO_BOX; +	$result = $db->sql_query($sql); + +	while ($row = $db->sql_fetchrow($result)) +	{ +		if ($row['author_id'] == $user_id && $row['folder_id'] == PRIVMSGS_NO_BOX) +		{ +			// Undelivered messages +			$undelivered_msg[] = $row['msg_id']; + +			if (isset($undelivered_user[$row['user_id']])) +			{ +				++$undelivered_user[$row['user_id']]; +			} +			else +			{ +				$undelivered_user[$row['user_id']] = 1; +			} +		} + +		$delete_ids[(int) $row['msg_id']] = (int) $row['msg_id']; +	} +	$db->sql_freeresult($result); + +	if (empty($delete_ids)) +	{ +		return false; +	} + +	$db->sql_transaction('begin'); + +	if (sizeof($undelivered_msg)) +	{ +		$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' +			WHERE ' . $db->sql_in_set('msg_id', $undelivered_msg); +		$db->sql_query($sql); +	} + +	// Reset the userīs pm count to 0 +	if (isset($undelivered_user[$user_id])) +	{ +		$sql = 'UPDATE ' . USERS_TABLE . ' +			SET user_new_privmsg = 0, +				user_unread_privmsg = 0 +			WHERE user_id = ' . $user_id; +		$db->sql_query($sql); +		unset($undelivered_user[$user_id]); +	} + +	foreach ($undelivered_user as $_user_id => $count) +	{ +		$sql = 'UPDATE ' . USERS_TABLE . ' +			SET user_new_privmsg = user_new_privmsg - ' . $count . ', +				user_unread_privmsg = user_unread_privmsg - ' . $count . ' +			WHERE user_id = ' . $_user_id; +		$db->sql_query($sql); +	} + +	// Delete private message data +	$sql = 'DELETE FROM ' . PRIVMSGS_TO_TABLE . " +		WHERE user_id = $user_id +			AND " . $db->sql_in_set('msg_id', $delete_ids); +	$db->sql_query($sql); + +	// Now we have to check which messages we can delete completely +	$sql = 'SELECT msg_id +		FROM ' . PRIVMSGS_TO_TABLE . ' +		WHERE ' . $db->sql_in_set('msg_id', $delete_ids); +	$result = $db->sql_query($sql); + +	while ($row = $db->sql_fetchrow($result)) +	{ +		unset($delete_ids[$row['msg_id']]); +	} +	$db->sql_freeresult($result); + +	if (!empty($delete_ids)) +	{ +		// Check if there are any attachments we need to remove +		if (!function_exists('delete_attachments')) +		{ +			include($phpbb_root_path . 'includes/functions_admin.' . $phpEx); +		} + +		delete_attachments('message', $delete_ids, false); + +		$sql = 'DELETE FROM ' . PRIVMSGS_TABLE . ' +			WHERE ' . $db->sql_in_set('msg_id', $delete_ids); +		$db->sql_query($sql); +	} + +	// Set the remaining author id to anonymous +	// This way users are still able to read messages from users being removed +	$sql = 'UPDATE ' . PRIVMSGS_TO_TABLE . ' +		SET author_id = ' . ANONYMOUS . ' +		WHERE author_id = ' . $user_id; +	$db->sql_query($sql); + +	$sql = 'UPDATE ' . PRIVMSGS_TABLE . ' +		SET author_id = ' . ANONYMOUS . ' +		WHERE author_id = ' . $user_id; +	$db->sql_query($sql); + +	$db->sql_transaction('commit'); + +	return true; +} + +/**  * Rebuild message header  */  function rebuild_header($check_ary) @@ -1406,12 +1566,6 @@ function submit_pm($mode, $subject, &$data, $put_in_outbox = true)  			while ($row = $db->sql_fetchrow($result))  			{ -				// Additionally, do not include the sender if he is in the group he wants to send to. ;) -				if ($row['user_id'] === $user->data['user_id']) -				{ -					continue; -				} -  				$field = ($data['address_list']['g'][$row['group_id']] == 'to') ? 'to' : 'bcc';  				$recipients[$row['user_id']] = $field;  			}  | 
