diff options
Diffstat (limited to 'phpBB/includes/ucp/ucp_pm_viewmessage.php')
| -rw-r--r-- | phpBB/includes/ucp/ucp_pm_viewmessage.php | 471 |
1 files changed, 471 insertions, 0 deletions
diff --git a/phpBB/includes/ucp/ucp_pm_viewmessage.php b/phpBB/includes/ucp/ucp_pm_viewmessage.php new file mode 100644 index 0000000000..bb9cda5804 --- /dev/null +++ b/phpBB/includes/ucp/ucp_pm_viewmessage.php @@ -0,0 +1,471 @@ +<?php +// ------------------------------------------------------------- +// +// $Id$ +// +// FILENAME : viewmessage.php +// STARTED : Mon Apr 12, 2004 +// COPYRIGHT : © 2004 phpBB Group +// WWW : http://www.phpbb.com/ +// LICENCE : GPL vs2.0 [ see /docs/COPYING ] +// +// ------------------------------------------------------------- + +function view_message($id, $mode, $folder_id, $msg_id, $folder, $message_row) +{ + global $phpbb_root_path, $phpEx, $SID, $user, $template, $auth, $config, $db; + + $user->add_lang('viewtopic'); + + $msg_id = (int) $msg_id; + $folder_id = (int) $folder_id; + $author_id = (int) $message_row['author_id']; + + // Grab icons + $icons = array(); + obtain_icons($icons); + + // Instantiate BBCode if need be + if ($message_row['bbcode_bitfield']) + { + include($phpbb_root_path . 'includes/bbcode.'.$phpEx); + $bbcode = new bbcode($message_row['bbcode_bitfield']); + } + + // Assign TO/BCC Addresses to template + write_pm_addresses(array('to' => $message_row['to_address'], 'bcc' => $message_row['bcc_address']), $author_id); + + $user_info = get_user_informations($author_id, $message_row); + + // Parse the message and subject + $message = $message_row['message_text']; + + // If the board has HTML off but the message has HTML on then we process it, else leave it alone + if (!$config['auth_html_pm'] || !$auth->acl_get('u_pm_html')) + { + if ($message_row['enable_html'] && $config['auth_bbcode_pm'] && $auth->acl_get('u_pm_bbcode')) + { + $message = preg_replace('#(<)([\/]?.*?)(>)#is', "<\\2>", $message); + } + } + + // Second parse bbcode here + if ($message_row['bbcode_bitfield']) + { + $bbcode->bbcode_second_pass($message, $message_row['bbcode_uid'], $message_row['bbcode_bitfield']); + } + + // Always process smilies after parsing bbcodes + $message = smilie_text($message); + + // Replace naughty words such as farty pants + $message_row['message_subject'] = censor_text($message_row['message_subject']); + $message = str_replace("\n", '<br />', censor_text($message)); + + // Editing information + if ($message_row['message_edit_count'] && $config['display_last_edited']) + { + $l_edit_time_total = ($message_row['message_edit_count'] == 1) ? $user->lang['EDITED_TIME_TOTAL'] : $user->lang['EDITED_TIMES_TOTAL']; + $l_edited_by = '<br /><br />' . sprintf($l_edit_time_total, (!$message_row['message_edit_user']) ? $message_row['username'] : $message_row['message_edit_user'], $user->format_date($message_row['message_edit_time']), $message_row['message_edit_count']); + } + else + { + $l_edited_by = ''; + } + + // Pull attachment data + $display_notice = false; + $attachments = array(); + + if ($message_row['message_attachment'] && $config['allow_pm_attach']) + { + if ($config['auth_download_pm'] && $auth->acl_get('u_pm_download')) + { + include($phpbb_root_path . 'includes/functions_display.' . $phpEx); + + $sql = 'SELECT * + FROM ' . ATTACHMENTS_TABLE . " + WHERE post_msg_id = $msg_id + AND in_message = 1 + ORDER BY filetime " . ((!$config['display_order']) ? 'DESC' : 'ASC') . ', post_msg_id ASC'; + $result = $db->sql_query($sql); + + while ($row = $db->sql_fetchrow($result)) + { + $attachments[] = $row; + } + $db->sql_freeresult($result); + + // No attachments exist, but message table thinks they do so go ahead and reset attach flags + if (!sizeof($attachments)) + { + $sql = 'UPDATE ' . PRIVMSGS_TABLE . " + SET message_attachment = 0 + WHERE msg_id = $msg_id"; + $db->sql_query($sql); + } + } + else + { + $display_notice = true; + } + } + + // Assign inline attachments + if (sizeof($attachments)) + { + // preg_replace_callback does not work here because of inability to correctly assign globals (seems to be a bug in some PHP versions) + process_inline_attachments($message, $attachments, $update_count); + } + + $user_info['sig'] = ''; + + $signature = ($message_row['enable_sig'] && $config['allow_sig_pm'] && $auth->acl_get('u_pm_sig') && $user->optionget('viewsigs')) ? $user_info['user_sig'] : ''; + + // End signature parsing, only if needed + if ($signature) + { + if ($user_info['user_sig_bbcode_bitfield']) + { + if (!isset($bbcode) || !$bbcode) + { + include($phpbb_root_path . 'includes/bbcode.'.$phpEx); + $bbcode = new bbcode($user_info['user_sig_bbcode_bitfield']); + } + + $bbcode->bbcode_second_pass($signature, $user_info['user_sig_bbcode_uid'], $user_info['user_sig_bbcode_bitfield']); + } + + $signature = smilie_text($signature); + $signature = str_replace("\n", '<br />', censor_text($signature)); + } + + $url = "{$phpbb_root_path}ucp.$phpEx$SID&i=$id"; + + $template->assign_vars(array( + 'AUTHOR_NAME' => ($user_info['user_colour']) ? '<span style="color:#' . $user_info['user_colour'] . '">' . $user_info['username'] . '</span>' : $user_info['username'], + 'AUTHOR_RANK' => $user_info['rank_title'], + 'RANK_IMAGE' => $user_info['rank_image'], + 'AUTHOR_AVATAR' => (isset($user_info['avatar'])) ? $user_info['avatar'] : '', + 'AUTHOR_JOINED' => $user->format_date($user_info['user_regdate'], $user->lang['DATE_FORMAT']), + 'AUTHOR_POSTS' => (!empty($user_info['user_posts'])) ? $user_info['user_posts'] : '', + 'AUTHOR_FROM' => (!empty($user_info['user_from'])) ? $user_info['user_from'] : '', + + 'ONLINE_IMG' => (!$config['load_onlinetrack']) ? '' : (($user_info['online']) ? $user->img('btn_online', $user->lang['ONLINE']) : $user->img('btn_offline', $user->lang['OFFLINE'])), + 'DELETE_IMG' => $user->img('btn_delete', $user->lang['DELETE_PM']), + 'IP_IMG' => $user->img('btn_ip', $user->lang['VIEW_IP']), + 'REPORT_IMG' => $user->img('btn_report', $user->lang['REPORT_PM']), + 'REPORTED_IMG' => $user->img('icon_reported', $user->lang['REPORTED_MESSAGE']), + 'PROFILE_IMG' => $user->img('btn_profile', $user->lang['READ_PROFILE']), + 'EMAIL_IMG' => $user->img('btn_email', $user->lang['SEND_EMAIL']), + 'QUOTE_IMG' => $user->img('btn_quote', $user->lang['POST_QUOTE_PM']), + 'REPLY_IMG' => $user->img('btn_reply_pm', $user->lang['POST_REPLY_PM']), + 'EDIT_IMG' => $user->img('btn_edit', $user->lang['POST_EDIT_PM']), + 'MINI_POST_IMG' => $user->img('icon_post', $user->lang['PM']), + + 'SENT_DATE' => $user->format_date($message_row['message_time']), + 'SUBJECT' => $message_row['message_subject'], + 'MESSAGE' => $message, + 'SIGNATURE' => ($message_row['enable_sig']) ? $signature : '', + 'EDITED_MESSAGE' => $l_edited_by, + + 'U_MCP_REPORT' => "{$phpbb_root_path}mcp.$phpEx$SID&mode=pm_details&p=" . $message_row['msg_id'], + 'U_REPORT' => ($config['auth_report_pm'] && $auth->acl_get('u_pm_report')) ? "{$phpbb_root_path}report.$phpEx$SID&pm=" . $message_row['msg_id'] : '', + 'U_IP' => ($auth->acl_get('m_') && $message_row['message_reported']) ? "{$phpbb_root_path}mcp.$phpEx?sid=" . $user->session_id . "&mode=pm_details&p=" . $message_row['msg_id'] . '#ip' : '', + 'U_DELETE' => ($auth->acl_get('u_pm_delete')) ? "$url&mode=compose&action=delete&f=$folder_id&p=" . $message_row['msg_id'] : '', + 'U_AUTHOR_PROFILE' => "{$phpbb_root_path}memberlist.$phpEx$SID&mode=viewprofile&u=" . $author_id, + 'U_EMAIL' => $user_info['email'], + 'U_QUOTE' => ($config['auth_quote_pm'] && $auth->acl_get('u_sendpm') && $author_id != $user->data['user_id']) ? "$url&mode=compose&action=quote&f=$folder_id&p=" . $message_row['msg_id'] : '', + 'U_EDIT' => (($message_row['message_time'] > time() - $config['pm_edit_time'] || !$config['pm_edit_time']) && $folder_id == PRIVMSGS_OUTBOX && $auth->acl_get('u_pm_edit')) ? "$url&mode=compose&action=edit&f=$folder_id&p=" . $message_row['msg_id'] : '', + 'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $auth->acl_get('u_sendpm')) ? "$url&mode=compose&action=reply&f=$folder_id&p=" . $message_row['msg_id'] : '', + 'U_PREVIOUS_PM' => "$url&f=$folder_id&p=" . $message_row['msg_id'] . "&view=previous", + 'U_NEXT_PM' => "$url&f=$folder_id&p=" . $message_row['msg_id'] . "&view=next", + + 'S_MESSAGE_REPORTED'=> ($message_row['message_reported'] && $auth->acl_get('m_')) ? true : false, + 'S_HAS_ATTACHMENTS' => (sizeof($attachments)) ? true : false, + 'S_DISPLAY_NOTICE' => $display_notice && $message_row['message_attachment'], + + 'U_PRINT_PM' => ($config['print_pm'] && $auth->acl_get('u_pm_printpm')) ? "$url&f=$folder_id&p=" . $message_row['msg_id'] . "&view=print" : '', + 'U_EMAIL_PM' => ($config['email_pm'] && $config['email_enable'] && $auth->acl_get('u_pm_emailpm')) ? 'Email' : '', + 'U_FORWARD_PM' => ($config['forward_pm'] && $auth->acl_get('u_pm_forward')) ? "$url&mode=compose&action=forward&f=$folder_id&p=" . $message_row['msg_id'] : '') + ); + + // Display not already displayed Attachments for this post, we already parsed them. ;) + if (sizeof($attachments)) + { + foreach ($attachments as $attachment) + { + $template->assign_block_vars('attachment', array( + 'DISPLAY_ATTACHMENT' => $attachment) + ); + } + } + + if ($_REQUEST['view'] != 'print') + { + // Message History + if (message_history($msg_id, $user->data['user_id'], $message_row, $folder)) + { + $template->assign_var('S_DISPLAY_HISTORY', true); + } + } +} + +// Display Message History +function message_history($msg_id, $user_id, $message_row, $folder) +{ + global $db, $user, $config, $template, $phpbb_root_path, $phpEx, $SID, $auth, $bbcode; + + // Get History Messages (could be newer) + $sql = 'SELECT t.*, p.*, u.* + FROM ' . PRIVMSGS_TABLE . ' p, ' . PRIVMSGS_TO_TABLE . ' t, ' . USERS_TABLE . ' u + WHERE t.msg_id = p.msg_id + AND p.author_id = u.user_id + AND t.folder_id <> ' . PRIVMSGS_NO_BOX . " + AND t.user_id = $user_id"; + + if (!$message_row['root_level']) + { + $sql .= " AND (p.root_level = $msg_id OR (p.root_level = 0 AND p.msg_id = $msg_id))"; + } + else + { + $sql .= " AND (p.root_level = " . $message_row['root_level'] . ' OR p.msg_id = ' . $message_row['root_level'] . ')'; + } + $sql .= ' ORDER BY p.message_time '; + $sort_dir = (!empty($user->data['user_sortby_dir'])) ? $user->data['user_sortby_dir'] : 'd'; + $sql .= ($sort_dir == 'd') ? 'ASC' : 'DESC'; + + $result = $db->sql_query($sql); + + if (!($row = $db->sql_fetchrow($result))) + { + return false; + } + + $rowset = array(); + $bbcode_bitfield = 0; + $folder_url = "{$phpbb_root_path}ucp.$phpEx$SID&i=pm&folder="; + + $title = ($sort_dir == 'd') ? $row['message_subject'] : ''; + do + { + $folder_id = (int) $row['folder_id']; + + $row['folder'][] = (isset($folder[$folder_id])) ? '<a href="' . $folder_url . $folder_id . '">' . $folder[$folder_id]['folder_name'] . '</a>' : $user->lang['UNKOWN_FOLDER']; + + if (isset($rowset[$row['msg_id']])) + { + $rowset[$row['msg_id']]['folder'][] = (isset($folder[$folder_id])) ? '<a href="' . $folder_url . $folder_id . '">' . $folder[$folder_id]['folder_name'] . '</a>' : $user->lang['UNKOWN_FOLDER']; + } + else + { + $rowset[$row['msg_id']] = $row; + $bbcode_bitfield |= $row['bbcode_bitfield']; + } + } + while ($row = $db->sql_fetchrow($result)); + $db->sql_freeresult($result); + + $title = ($sort_dir == 'a') ? $row['message_subject'] : $title; + + if (sizeof($rowset) == 1) + { + return false; + } + + // Instantiate BBCode class + if (!isset($bbcode) && $bbcode_bitfield) + { + if (!class_exists('bbcode')) + { + include($phpbb_root_path . 'includes/bbcode.'.$phpEx); + } + $bbcode = new bbcode($bbcode_bitfield); + } + + $title = censor_text($title); + + $i = 1; + $url = "{$phpbb_root_path}ucp.$phpEx$SID&i=pm"; + $next_history_pm = $previous_history_pm = $prev_id = 0; + + foreach ($rowset as $id => $row) + { + $author_id = $row['author_id']; + $author = $row['username']; + $folder_id = (int) $row['folder_id']; + + $subject = $row['message_subject']; + $message = $row['message_text']; + + if ($row['bbcode_bitfield']) + { + $bbcode->bbcode_second_pass($message, $row['bbcode_uid'], $row['bbcode_bitfield']); + } + + $message = smilie_text($message, !$row['enable_smilies']); + + $subject = censor_text($subject); + $message = censor_text($message); + + if ($id == $msg_id) + { + $next_history_pm = next($rowset); + $next_history_pm = (sizeof($next_history_pm)) ? (int) $next_history_pm['msg_id'] : 0; + $previous_history_pm = $prev_id; + } + + $template->assign_block_vars('history_row', array( + 'AUTHOR_NAME' => $author, + 'SUBJECT' => $subject, + 'SENT_DATE' => $user->format_date($row['message_time']), + 'MESSAGE' => str_replace("\n", '<br />', $message), + 'FOLDER' => implode(', ', $row['folder']), + + 'S_CURRENT_MSG' => ($row['msg_id'] == $msg_id), + + 'U_MSG_ID' => $row['msg_id'], + 'U_VIEW_MESSAGE'=> "$url&f=$folder_id&p=" . $row['msg_id'], + 'U_AUTHOR_PROFILE' => "{$phpbb_root_path}memberlist.$phpEx$SID&mode=viewprofile&u=$author_id", + 'U_QUOTE' => ($config['auth_quote_pm'] && $auth->acl_get('u_sendpm') && $author_id != $user->data['user_id']) ? "$url&mode=compose&action=quote&f=" . $folder_id . "&p=" . $row['msg_id'] : '', + 'U_POST_REPLY_PM' => ($author_id != $user->data['user_id'] && $auth->acl_get('u_sendpm')) ? "$url&mode=compose&action=reply&f=$folder_id&p=" . $row['msg_id'] : '', + + 'S_ROW_COUNT' => $i) + ); + unset($rowset[$id]); + $prev_id = $id; + $i++; + } + + $template->assign_vars(array( + 'QUOTE_IMG' => $user->img('btn_quote', $user->lang['REPLY_WITH_QUOTE']), + 'TITLE' => $title, + + 'U_VIEW_NEXT_HISTORY' => "$url&p=" . (($next_history_pm) ? $next_history_pm : $msg_id), + 'U_VIEW_PREVIOUS_HISTORY' => "$url&p=" . (($previous_history_pm) ? $previous_history_pm : $msg_id)) + ); + + return true; +} + +// Get User Informations (only for message display) +function get_user_informations($user_id, $user_row) +{ + global $config, $db, $auth, $user, $phpbb_root_path, $phpEx, $SID; + + if (!$user_id) + { + return; + } + + if (empty($user_row)) + { + $user_row = get_userdata((int) $user_id); + } + + // Grab ranks + $ranks = array(); + obtain_ranks($ranks); + + // Generate online information for user + if ($config['load_onlinetrack']) + { + $sql = 'SELECT session_user_id, MAX(session_time) as online_time, MIN(session_allow_viewonline) AS viewonline + FROM ' . SESSIONS_TABLE . " + WHERE session_user_id = $user_id + GROUP BY session_user_id"; + $result = $db->sql_query_limit($sql, 1); + + $update_time = $config['load_online_time'] * 60; + if ($row = $db->sql_fetchrow($result)) + { + $user_row['online'] = (time() - $update_time < $row['online_time'] && ($row['viewonline'] && $user_row['user_allow_viewonline'])) ? true : false; + } + } + else + { + $user_row['online'] = false; + } + + if ($user_row['user_avatar'] && $user->optionget('viewavatars')) + { + $avatar_img = ''; + switch ($user_row['user_avatar_type']) + { + case AVATAR_UPLOAD: + $avatar_img = $config['avatar_path'] . '/'; + break; + case AVATAR_GALLERY: + $avatar_img = $config['avatar_gallery_path'] . '/'; + break; + } + $avatar_img .= $user_row['user_avatar']; + + $user_row['avatar'] = '<img src="' . $avatar_img . '" width="' . $user_row['user_avatar_width'] . '" height="' . $user_row['user_avatar_height'] . '" border="0" alt="" />'; + } + + if (!empty($user_row['user_rank'])) + { + $user_row['rank_title'] = $ranks['special'][$user_row['user_rank']]['rank_title']; + $user_row['rank_image'] = (!empty($ranks['special'][$user_row['user_rank']]['rank_image'])) ? '<img src="' . $config['ranks_path'] . '/' . $ranks['special'][$user_row['user_rank']]['rank_image'] . '" border="0" alt="' . $ranks['special'][$user_row['user_rank']]['rank_title'] . '" title="' . $ranks['special'][$user_row['user_rank']]['rank_title'] . '" /><br />' : ''; + } + else + { + foreach ($ranks['normal'] as $rank) + { + if ($user_row['user_posts'] >= $rank['rank_min']) + { + $user_row['rank_title'] = $rank['rank_title']; + $user_row['rank_image'] = (!empty($rank['rank_image'])) ? '<img src="' . $config['ranks_path'] . '/' . $rank['rank_image'] . '" border="0" alt="' . $rank['rank_title'] . '" title="' . $rank['rank_title'] . '" /><br />' : ''; + break; + } + } + } + + if (!empty($user_row['user_allow_viewemail']) || $auth->acl_get('a_email')) + { + $user_row['email'] = ($config['board_email_form'] && $config['email_enable']) ? "{$phpbb_root_path}memberlist.$phpEx$SID&mode=email&u=" . $user_id : 'mailto:' . $user_row['user_email']; + } + else + { + $user_row['email'] = ''; + } + + return $user_row; +} + +function process_inline_attachments(&$message, &$attachments, &$update_count) +{ + global $user, $config; + + $tpl = array(); + $tpl = display_attachments(0, NULL, $attachments, $update_count, false, true); + $tpl_size = sizeof($tpl); + + $unset_tpl = array(); + + preg_match_all('#<!\-\- ia([0-9]+) \-\->(.*?)<!\-\- ia\1 \-\->#', $message, $matches); + + $replace = array(); + foreach ($matches[0] as $num => $capture) + { + // Flip index if we are displaying the reverse way + $index = ($config['display_order']) ? ($tpl_size-($matches[1][$num] + 1)) : $matches[1][$num]; + + $replace['from'][] = $matches[0][$index]; + $replace['to'][] = (isset($tpl[$index])) ? $tpl[$index] : sprintf($user->lang['MISSING_INLINE_ATTACHMENT'], $matches[2][$num]); + + $unset_tpl[] = $index; + } + unset($tpl, $tpl_size); + + $message = str_replace($replace['from'], $replace['to'], $message); + + foreach (array_unique($unset_tpl) as $index) + { + unset($attachments[$index]); + } +} + +?>
\ No newline at end of file |
