Fix message highlighting again
[squirrelmail.git] / src / read_body.php
CommitLineData
59177427 1<?php
134e4174 2
35586184 3/**
4 * read_body.php
5 *
35586184 6 * This file is used for reading the msgs array and displaying
7 * the resulting emails in the right frame.
8 *
4b5049de 9 * @copyright &copy; 1999-2007 The SquirrelMail Project Team
4b4abf93 10 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
30967a1e 11 * @version $Id$
8f6f9ba5 12 * @package squirrelmail
a07cd1a4 13 */
35586184 14
ebd2391c 15/** This is the read_body page */
16define('PAGE_NAME', 'read_body');
17
30967a1e 18/**
202bcbcc 19 * Include the SquirrelMail initialization file.
30967a1e 20 */
202bcbcc 21require('../include/init.php');
86725763 22
23/* SquirrelMail required files. */
86725763 24require_once(SM_PATH . 'functions/imap.php');
202bcbcc 25require_once(SM_PATH . 'functions/imap_asearch.php'); // => move to mailbox_display
86725763 26require_once(SM_PATH . 'functions/mime.php');
27require_once(SM_PATH . 'functions/date.php');
28require_once(SM_PATH . 'functions/url_parser.php');
6d021521 29require_once(SM_PATH . 'functions/identity.php');
202bcbcc 30require_once(SM_PATH . 'functions/mailbox_display.php');
31require_once(SM_PATH . 'functions/forms.php');
32require_once(SM_PATH . 'functions/attachment_common.php');
628bce99 33require_once(SM_PATH . 'functions/compose.php');
38c944cc 34
a07cd1a4 35/**
1fca12b5 36 * Given an IMAP message id number, this will look it up in the cached
1e150c97 37 * and sorted msgs array and return the index of the next message
1fca12b5 38 *
1e150c97 39 * @param int $passed_id The current message UID
1fca12b5 40 * @return the index of the next valid message from the array
41 */
e0e30169 42function findNextMessage($uidset,$passed_id='backwards') {
324ac3c5 43 if (!is_array($uidset)) {
44 return -1;
45 }
e0e30169 46 if ($passed_id=='backwards' || !is_array($uidset)) { // check for backwards compattibilty gpg plugin
47 $passed_id = $uidset;
e0e30169 48 }
91c27aee 49 $result = sqm_array_get_value_by_offset($uidset,$passed_id,1);
50 if ($result === false) {
51 return -1;
52 } else {
53 return $result;
10f0ce72 54 }
a07cd1a4 55}
56
1e150c97 57/**
58 * Given an IMAP message id number, this will look it up in the cached
59 * and sorted msgs array and return the index of the previous message
60 *
61 * @param int $passed_id The current message UID
62 * @return the index of the next valid message from the array
63 */
e0e30169 64
65function findPreviousMessage($uidset, $passed_id) {
324ac3c5 66 if (!is_array($uidset)) {
67 return -1;
e0e30169 68 }
91c27aee 69 $result = sqm_array_get_value_by_offset($uidset,$passed_id,-1);
70 if ($result === false) {
71 return -1;
72 } else {
73 return $result;
a07cd1a4 74 }
a07cd1a4 75}
10f0ce72 76
7d020720 77function html_toggle_href ($mailbox, $passed_id, $passed_ent_id, $message) {
7277191e 78 global $base_uri, $show_html_default;
79
80 $has_html = false;
81 if ($message->header->type0 == 'message' && $message->header->type1 == 'rfc822') {
82 $type0 = $message->rfc822_header->content_type->type0;
83 $type1 = $message->rfc822_header->content_type->type1;
84 } else {
85 $type0 = $message->header->type0;
86 $type1 = $message->header->type1;
87 }
88 if($type0 == 'multipart' &&
7d020720 89 ($type1 == 'alternative' || $type1 == 'mixed' || $type1 == 'related' || $type1=='signed')) {
7277191e 90 if ($message->findDisplayEntity(array(), array('text/html'), true)) {
91 $has_html = true;
92 }
93 }
94 /*
95 * Normal single part message so check its type.
96 */
97 else {
98 if($type0 == 'text' && $type1 == 'html') {
99 $has_html = true;
100 }
101 }
102 if($has_html == true) {
202bcbcc 103 $vars = array('passed_ent_id', 'show_more', 'show_more_cc', 'override_type0', 'override_type1', 'startMessage','where', 'what');
7277191e 104
105 $new_link = $base_uri . 'src/read_body.php?passed_id=' . urlencode($passed_id) .
106 '&amp;passed_ent_id=' . urlencode($passed_ent_id) .
107 '&amp;mailbox=' . urlencode($mailbox);
108 foreach($vars as $var) {
109 if(sqgetGlobalVar($var, $temp)) {
110 $new_link .= '&amp;' . $var . '=' . urlencode($temp);
111 }
112 }
113
114 if($show_html_default == 1) {
115 $new_link .= '&amp;show_html_default=0';
7277191e 116 } else {
117 $new_link .= '&amp;show_html_default=1';
7277191e 118 }
7d020720 119 return $new_link;
7277191e 120 }
121 return '';
122}
123
4669e892 124function ServerMDNSupport($aFlags) {
125 /* escaping $ doesn't work -> \x36 */
c075fcfe 126 return ( in_array('$mdnsent',$aFlags,true) ||
127 in_array('\\*',$aFlags,true) ) ;
57257333 128}
129
40e07136 130function SendMDN ( $mailbox, $passed_id, $message, $imapConnection) {
856e58ef 131 global $squirrelmail_language, $default_charset,
ce68b76b 132 $languages, $useSendmail, $domain, $sent_folder;
57257333 133
e95c04ec 134 sqgetGlobalVar('SERVER_NAME', $SERVER_NAME, SQ_SERVER);
0b97a708 135
38bca81c 136 $header = $message->rfc822_header;
57257333 137
fc224f68 138 $rfc822_header = new Rfc822Header();
d9c1dccc 139 $content_type = new ContentType('multipart/report');
fc224f68 140 $content_type->properties['report-type']='disposition-notification';
d9c1dccc 141
fc224f68 142 set_my_charset();
143 if ($default_charset) {
d9c1dccc 144 $content_type->properties['charset']=$default_charset;
fc224f68 145 }
146 $rfc822_header->content_type = $content_type;
147 $rfc822_header->to[] = $header->dnt;
2229a3ae 148 $rfc822_header->subject = _("Read:") . ' ' . decodeHeader($header->subject,true,false);
fc224f68 149
40e07136 150 $idents = get_identities();
151 $needles = array();
152 if ($header->to) {
153 foreach ($header->to as $message_to) {
154 $needles[] = $message_to->mailbox.'@'.$message_to->host;
155 }
27a1d10a 156 }
40e07136 157 $identity = find_identity($needles);
158 $from_addr = build_from_header($identity);
159 $reply_to = isset($idents[$identity]['reply_to']) ? $idents[$identity]['reply_to'] : '';
160 // FIXME: this must actually be the envelope address of the orginal message,
161 // but do we have that information? For now the first identity is our best guess.
162 $final_recipient = $idents[0]['email_address'];
fc224f68 163
fc224f68 164 $rfc822_header->from = $rfc822_header->parseAddress($from_addr,true);
165 if ($reply_to) {
166 $rfc822_header->reply_to = $rfc822_header->parseAddress($reply_to,true);
167 }
d9c1dccc 168
57257333 169 // part 1 (RFC2298)
3aaa3214 170 $senton = getLongDateString( $header->date, $header->date_unparsed );
57257333 171 $to_array = $header->to;
172 $to = '';
173 foreach ($to_array as $line) {
af568a82 174 $to .= ' '.$line->getAddress();
57257333 175 }
57257333 176 $now = getLongDateString( time() );
78db1583 177 set_my_charset();
46bb8da8 178 $body = _("Your message") . "\r\n\r\n" .
48027e89 179 "\t" . _("To") . ': ' . decodeHeader($to,false,false) . "\r\n" .
180 "\t" . _("Subject") . ': ' . decodeHeader($header->subject,false,false) . "\r\n" .
181 "\t" . _("Sent") . ': ' . $senton . "\r\n" .
46bb8da8 182 "\r\n" .
183 sprintf( _("Was displayed on %s"), $now );
f69feefe 184
fc224f68 185 $special_encoding = '';
4669e892 186 if (isset($languages[$squirrelmail_language]['XTRA_CODE']) &&
f4bb5d22 187 function_exists($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode')) {
188 $body = call_user_func($languages[$squirrelmail_language]['XTRA_CODE'] . '_encode', $body);
d9c1dccc 189 if (strtolower($default_charset) == 'iso-2022-jp') {
190 if (mb_detect_encoding($body) == 'ASCII') {
191 $special_encoding = '8bit';
192 } else {
193 $body = mb_convert_encoding($body, 'JIS');
194 $special_encoding = '7bit';
195 }
196 }
21461ca4 197 } elseif (sq_is8bit($body)) {
198 $special_encoding = '8bit';
6fbd125b 199 }
fc224f68 200 $part1 = new Message();
201 $part1->setBody($body);
202 $mime_header = new MessageHeader;
203 $mime_header->type0 = 'text';
204 $mime_header->type1 = 'plain';
205 if ($special_encoding) {
206 $mime_header->encoding = $special_encoding;
d9c1dccc 207 } else {
fc224f68 208 $mime_header->encoding = 'us-ascii';
209 }
210 if ($default_charset) {
211 $mime_header->parameters['charset'] = $default_charset;
212 }
213 $part1->mime_header = $mime_header;
214
57257333 215 // part2 (RFC2298)
d9c1dccc 216 $original_recipient = $to;
57257333 217 $original_message_id = $header->message_id;
218
b37e457f 219 $report = "Reporting-UA : $SERVER_NAME ; SquirrelMail (version " . SM_VERSION . ") \r\n";
57257333 220 if ($original_recipient != '') {
fc224f68 221 $report .= "Original-Recipient : $original_recipient\r\n";
57257333 222 }
fc224f68 223 $report .= "Final-Recipient: rfc822; $final_recipient\r\n" .
57257333 224 "Original-Message-ID : $original_message_id\r\n" .
225 "Disposition: manual-action/MDN-sent-manually; displayed\r\n";
226
fc224f68 227 $part2 = new Message();
228 $part2->setBody($report);
229 $mime_header = new MessageHeader;
230 $mime_header->type0 = 'message';
231 $mime_header->type1 = 'disposition-notification';
232 $mime_header->encoding = 'us-ascii';
233 $part2->mime_header = $mime_header;
234
235 $composeMessage = new Message();
236 $composeMessage->rfc822_header = $rfc822_header;
237 $composeMessage->addEntity($part1);
238 $composeMessage->addEntity($part2);
239
240
d9c1dccc 241 if ($useSendmail) {
242 require_once(SM_PATH . 'class/deliver/Deliver_SendMail.class.php');
f3dc9c62 243 global $sendmail_path, $sendmail_args;
244 // Check for outdated configuration
245 if (!isset($sendmail_args)) {
246 if ($sendmail_path=='/var/qmail/bin/qmail-inject') {
247 $sendmail_args = '';
248 } else {
249 $sendmail_args = '-i -t';
250 }
251 }
252 $deliver = new Deliver_SendMail(array('sendmail_args'=>$sendmail_args));
d9c1dccc 253 $stream = $deliver->initStream($composeMessage,$sendmail_path);
fc224f68 254 } else {
d9c1dccc 255 require_once(SM_PATH . 'class/deliver/Deliver_SMTP.class.php');
256 $deliver = new Deliver_SMTP();
ce68b76b 257 global $smtpServerAddress, $smtpPort, $pop_before_smtp;
d9c1dccc 258 $authPop = (isset($pop_before_smtp) && $pop_before_smtp) ? true : false;
9bd3b1e6 259 get_smtp_user($user, $pass);
d9c1dccc 260 $stream = $deliver->initStream($composeMessage,$domain,0,
70ce2218 261 $smtpServerAddress, $smtpPort, $user, $pass, $authPop);
d9c1dccc 262 }
263 $success = false;
fc224f68 264 if ($stream) {
d9c1dccc 265 $length = $deliver->mail($composeMessage, $stream);
266 $success = $deliver->finalizeStream($stream);
fc224f68 267 }
d9c1dccc 268 if (!$success) {
6c3d00b5 269 $msg = _("Message not sent.") . "<br />\n" .
270 $deliver->dlv_msg;
a15f9d93 271 if (! empty($deliver->dlv_server_msg)) {
272 $msg.= '<br />' .
0cc4fb0d 273 _("Server replied:") . ' ' . $deliver->dlv_ret_nr . ' ' .
a15f9d93 274 nl2br(htmlspecialchars($deliver->dlv_server_msg));
275 }
856e58ef 276 plain_error_message($msg);
fc224f68 277 } else {
278 unset ($deliver);
d9c1dccc 279 if (sqimap_mailbox_exists ($imapConnection, $sent_folder)) {
81de00c0 280 $sid = sqimap_append ($imapConnection, $sent_folder, $length);
d9c1dccc 281 require_once(SM_PATH . 'class/deliver/Deliver_IMAP.class.php');
282 $imap_deliver = new Deliver_IMAP();
283 $imap_deliver->mail($composeMessage, $imapConnection);
81de00c0 284 sqimap_append_done ($imapConnection, $sent_folder);
d9c1dccc 285 unset ($imap_deliver);
286 }
287 }
288 return $success;
57257333 289}
290
6201339c 291function ToggleMDNflag ($set ,$imapConnection, $mailbox, $passed_id) {
d9c1dccc 292 $sg = $set?'+':'-';
293 $cmd = 'STORE ' . $passed_id . ' ' . $sg . 'FLAGS ($MDNSent)';
4669e892 294 $read = sqimap_run_command ($imapConnection, $cmd, true, $response,
6201339c 295 $readmessage, TRUE);
57257333 296}
297
4d0cd98b 298function formatRecipientString($recipients, $item ) {
856e58ef 299 global $show_more, $show_more_cc, $show_more_bcc,
7d020720 300 $PHP_SELF, $oTemplate;
4d0cd98b 301
d9c1dccc 302 $string = '';
38c944cc 303 if ((is_array($recipients)) && (isset($recipients[0]))) {
d9c1dccc 304 $show = false;
38c944cc 305
306 if ($item == 'to') {
d9c1dccc 307 if ($show_more) {
308 $show = true;
309 $url = set_url_var($PHP_SELF, 'show_more',0);
310 } else {
311 $url = set_url_var($PHP_SELF, 'show_more',1);
312 }
313 } else if ($item == 'cc') {
314 if ($show_more_cc) {
315 $show = true;
316 $url = set_url_var($PHP_SELF, 'show_more_cc',0);
317 } else {
318 $url = set_url_var($PHP_SELF, 'show_more_cc',1);
319 }
320 } else if ($item == 'bcc') {
321 if ($show_more_bcc) {
322 $show = true;
323 $url = set_url_var($PHP_SELF, 'show_more_bcc',0);
324 } else {
325 $url = set_url_var($PHP_SELF, 'show_more_bcc',1);
326 }
327 }
67dc67bb 328
7d020720 329 $a = array();
330 foreach ($recipients as $r) {
331 $a[] = array(
332 'Name' => htmlspecialchars($r->getAddress(false)),
333 'Email' => htmlspecialchars($r->getEmail()),
334 'Full' => htmlspecialchars($r->getAddress(true))
335 );
1fca12b5 336 }
67dc67bb 337
7d020720 338 $oTemplate->assign('which_field', $item);
339 $oTemplate->assign('recipients', $a);
340 $oTemplate->assign('more_less_toggle_href', $url);
341 $oTemplate->assign('show_more', $show);
67dc67bb 342
7d020720 343 $string = $oTemplate->fetch('read_recipient_list.tpl');
4d0cd98b 344 }
c615b1da 345 return $string;
346}
347
e0e30169 348function formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message,
af568a82 349 $color, $FirstTimeSee) {
ce68b76b 350 global $default_use_mdn, $default_use_priority,
457e8593 351 $show_xmailer_default, $mdn_user_support, $PHP_SELF,
7d020720 352 $squirrelmail_language, $oTemplate;
38bca81c 353
134e4174 354 $mailbox = $aMailbox['NAME'];
e0e30169 355
d9c1dccc 356 $header = $message->rfc822_header;
357 $env = array();
bdb9ce72 358 $env[_("Subject")] = str_replace("&nbsp;"," ",decodeHeader($header->subject));
7893c8a5 359
d9c1dccc 360 $from_name = $header->getAddr_s('from');
d6b6d221 361 if (!$from_name)
d9c1dccc 362 $from_name = $header->getAddr_s('sender');
d6b6d221 363 if (!$from_name)
364 $env[_("From")] = _("Unknown sender");
365 else
366 $env[_("From")] = decodeHeader($from_name);
3aaa3214 367 $env[_("Date")] = getLongDateString($header->date, $header->date_unparsed);
d9c1dccc 368 $env[_("To")] = formatRecipientString($header->to, "to");
369 $env[_("Cc")] = formatRecipientString($header->cc, "cc");
370 $env[_("Bcc")] = formatRecipientString($header->bcc, "bcc");
371 if ($default_use_priority) {
7d020720 372 $oTemplate->assign('message_priority', $header->priority);
373 $env[_("Priority")] = $oTemplate->fetch('read_message_priority.tpl');
d9c1dccc 374 }
375 if ($show_xmailer_default) {
7d020720 376 $oTemplate->assign('xmailer', decodeHeader($header->xmailer));
377 $env[_("Mailer")] = $oTemplate->fetch('read_xmailer.tpl');
d9c1dccc 378 }
379 if ($default_use_mdn) {
380 if ($mdn_user_support) {
381 if ($header->dnt) {
7d020720 382 $mdn_url = $PHP_SELF;
ef3e6c1f 383 $mdn_url = set_url_var($mdn_url, 'mailbox', urlencode($mailbox));
384 $mdn_url = set_url_var($mdn_url, 'passed_id', $passed_id);
385 $mdn_url = set_url_var($mdn_url, 'passed_ent_id', $passed_ent_id);
386 $mdn_url = set_url_var($mdn_url, 'sendreceipt', 1);
7d020720 387
388 $oTemplate->assign('read_receipt_sent', $message->is_mdnsent);
7d020720 389 $oTemplate->assign('send_receipt_href', $mdn_url);
67dc67bb 390
7d020720 391 $env[_("Read Receipt")] = $oTemplate->fetch('read_handle_receipt.tpl');
d9c1dccc 392 }
393 }
394 }
1c3d4412 395
76ff5b21 396 // this is used for both mdn and also general use for plugins, etc
397 $oTemplate->assign('first_time_reading', $FirstTimeSee);
398
1c3d4412 399 $statuses = array();
67dc67bb 400 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
401 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted']) &&
402 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\deleted'] === true) {
403 $statuses[] = _("deleted");
404 }
405 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered']) &&
406 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\answered'] === true) {
407 $statuses[] = _("answered");
408 }
409 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft']) &&
410 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\draft'] === true) {
411 $statuses[] = _("draft");
412 }
413 if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged']) &&
414 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\flagged'] === true) {
415 $statuses[] = _("flagged");
416 }
417 if ( count($statuses) ) {
418 $env[_("Status")] = implode(', ', $statuses);
419 }
1c3d4412 420 }
67dc67bb 421
7d020720 422 $env[_("Options")] = formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color);
c615b1da 423
1c3d4412 424
7d020720 425 $oTemplate->assign('headers_to_display', $env);
67dc67bb 426
7d020720 427 $oTemplate->display('read_headers.tpl');
d9c1dccc 428}
c615b1da 429
1e150c97 430/**
4669e892 431 * Format message toolbar
432 *
1e150c97 433 * @param string $mailbox Name of current mailbox
434 * @param int $passed_id UID of current message
435 * @param int $passed_ent_id Id of entity within message
436 * @param object $message Current message object
437 * @param object $mbx_response
438 */
324ac3c5 439function formatMenubar($aMailbox, $passed_id, $passed_ent_id, $message, $removedVar, $nav_on_top = TRUE) {
7d020720 440 global $base_uri, $draft_folder, $where, $what, $sort,
4669e892 441 $startMessage, $PHP_SELF, $save_as_draft,
1e150c97 442 $enable_forward_as_attachment, $imapConnection, $lastTargetMailbox,
7d020720 443 $delete_prev_next_display, $show_copy_buttons,
457e8593 444 $compose_new_win, $compose_width, $compose_height,
7d020720 445 $oTemplate;
c615b1da 446
e0e30169 447 //FIXME cleanup argument list, use $aMailbox where possible
448 $mailbox = $aMailbox['NAME'];
449
d9c1dccc 450 $urlMailbox = urlencode($mailbox);
c615b1da 451
1e150c97 452 // Create Prev & Next links
453 // Handle nested entities first (i.e. Mime Attach parts)
7d020720 454 $prev_href = $next_href = $up_href = $del_href = $del_prev_href = $del_next_href = '';
67dc67bb 455 $msg_list_href = $search_href = $view_msg_href = '';
1e150c97 456 if (isset($passed_ent_id) && $passed_ent_id) {
457 // code for navigating through attached message/rfc822 messages
d9c1dccc 458 $url = set_url_var($PHP_SELF, 'passed_ent_id',0);
70bdc740 459 $entities = array();
460 $entity_count = array();
461 $c = 0;
f2f03410 462
70bdc740 463 foreach($message->parent->entities as $ent) {
9f42bfc8 464 if ($ent->type0 == 'message' && $ent->type1 == 'rfc822') {
67dc67bb 465
9f42bfc8 466 $c++;
467 $entity_count[$c] = $ent->entity_id;
468 $entities[$ent->entity_id] = $c;
469 }
70bdc740 470 }
1e150c97 471
91c27aee 472 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] > 1) {
70bdc740 473 $prev_ent_id = $entity_count[$entities[$passed_ent_id] - 1];
7d020720 474 $prev_href = set_url_var($PHP_SELF, 'passed_ent_id', $prev_ent_id);
70bdc740 475 }
1e150c97 476
91c27aee 477 if(isset($entities[$passed_ent_id]) && $entities[$passed_ent_id] < $c) {
70bdc740 478 $next_ent_id = $entity_count[$entities[$passed_ent_id] + 1];
7d020720 479 $next_href = set_url_var($PHP_SELF, 'passed_ent_id', $next_ent_id);
70bdc740 480 }
1e150c97 481
d9c1dccc 482 $par_ent_id = $message->parent->entity_id;
483 if ($par_ent_id) {
484 $par_ent_id = substr($par_ent_id,0,-2);
1e150c97 485 if ( $par_ent_id != 0 ) {
7d020720 486 $up_href = set_url_var($PHP_SELF, 'passed_ent_id',$par_ent_id);
1e150c97 487 }
488 }
489
7d020720 490 $view_msg_href = $url;
1e150c97 491
492 // Prev/Next links for regular messages
324ac3c5 493 } else if ( true ) { //!(isset($where) && isset($what)) ) {
324ac3c5 494 $prev = findPreviousMessage($aMailbox['UIDSET'][$what], $passed_id);
495 $next = findNextMessage($aMailbox['UIDSET'][$what],$passed_id);
1e150c97 496
1e150c97 497 if ($prev >= 0) {
7d020720 498 $prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 499 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 500 "&amp;where=$where&amp;what=$what" .
1e150c97 501 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
d9c1dccc 502 }
1e150c97 503
1e150c97 504 if ($next >= 0) {
7d020720 505 $next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 506 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
324ac3c5 507 "&amp;where=$where&amp;what=$what" .
1e150c97 508 '&amp;startMessage='.$startMessage.'&amp;show_more=0';
1e150c97 509 }
510
1e150c97 511 // Only bother with Delete & Prev and Delete & Next IF
6201339c 512 // top display is enabled.
4669e892 513 if ( $delete_prev_next_display == 1 &&
324ac3c5 514 in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true) ) {
1e150c97 515 if ($prev >= 0) {
7d020720 516 $del_prev_href = $base_uri . 'src/read_body.php?passed_id='.$prev.
1e150c97 517 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
518 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 519 "&amp;where=$where&amp;what=$what" .
1e150c97 520 '&amp;delete_id='.$passed_id;
1e150c97 521 }
522
1e150c97 523 if ($next >= 0) {
7d020720 524 $del_next_href = $base_uri . 'src/read_body.php?passed_id='.$next.
1e150c97 525 '&amp;mailbox='.$urlMailbox.'&amp;sort='.$sort.
526 '&amp;startMessage='.$startMessage.'&amp;show_more=0'.
324ac3c5 527 "&amp;where=$where&amp;what=$what" .
1e150c97 528 '&amp;delete_id='.$passed_id;
1e150c97 529 }
1e150c97 530 }
531 }
532
533 // Start with Search Results or Message List link.
7d020720 534 $list_xtra = "?where=read_body.php&amp;what=$what&amp;mailbox=" . $urlMailbox.
324ac3c5 535 "&amp;startMessage=$startMessage";
7d020720 536 $msg_list_href = $base_uri .'src/right_main.php'. $list_xtra;
537 $search_href = $where=='search.php' ? $base_uri .'src/search.php?'.$list_xtra : '';
1e150c97 538
98a9cc03 539 $comp_uri = $base_uri.'src/compose.php' .
540 '?passed_id=' . $passed_id .
541 '&amp;mailbox=' . $urlMailbox .
542 '&amp;startMessage=' . $startMessage .
543 (isset($passed_ent_id) ? '&amp;passed_ent_id='.$passed_ent_id : '');
4669e892 544
545 // Start form for reply/reply all/forward..
1a531551 546 $target = '';
547 $on_click='';
89a067ff 548 $method='post';
6190378c 549 $onsubmit='';
1a531551 550 if ($compose_new_win == '1') {
91c27aee 551 if (!preg_match("/^[0-9]{3,4}$/", $compose_width)) {
552 $compose_width = '640';
553 }
554 if (!preg_match("/^[0-9]{3,4}$/", $compose_height)) {
555 $compose_height = '550';
556 }
457e8593 557 if ( checkForJavascript() ) {
0be2024f 558 $on_click='comp_in_new_form(\''.$comp_uri.'\', this, this.form,'. $compose_width .',' . $compose_height .')';
1a531551 559 $comp_uri = 'javascript:void(0)';
89a067ff 560 $method='get';
561 $onsubmit = 'return false';
1a531551 562 } else {
89a067ff 563 $target = '_blank';
1a531551 564 }
565 }
566
7d020720 567 $oTemplate->assign('nav_on_top', $nav_on_top);
98a9cc03 568
7d020720 569 $oTemplate->assign('prev_href', $prev_href);
570 $oTemplate->assign('up_href', $up_href);
571 $oTemplate->assign('next_href', $next_href);
572 $oTemplate->assign('del_prev_href', $del_prev_href);
573 $oTemplate->assign('del_next_href', $del_next_href);
574 $oTemplate->assign('view_msg_href', $view_msg_href);
575
576 $oTemplate->assign('message_list_href', $msg_list_href);
577 $oTemplate->assign('search_href', $search_href);
578
89a067ff 579 $oTemplate->assign('form_extra', '');
580 $oTemplate->assign('form_method', $method);
581 $oTemplate->assign('form_target', $target);
582 $oTemplate->assign('form_onsubmit', $onsubmit);
7d020720 583 $oTemplate->assign('compose_href', $comp_uri);
584 $oTemplate->assign('button_onclick', $on_click);
585 $oTemplate->assign('forward_as_attachment_enabled', $enable_forward_as_attachment==1);
67dc67bb 586
d08a5945 587 //FIXME: I am surprised these aren't already given to the template; probably needs to be given at a higher level, so I have NO IDEA if this is the right place to do this... adding them so template can construct its own API calls... we can build those herein too if preferrable
588 $oTemplate->assign('mailbox', $aMailbox['NAME']);
589 $oTemplate->assign('passed_id', $passed_id);
590 $oTemplate->assign('what', $what);
591
1e150c97 592 // If Draft folder - create Resume link
67dc67bb 593 $resume_draft = $edit_as_new = false;
1e150c97 594 if (($mailbox == $draft_folder) && ($save_as_draft)) {
7d020720 595 $resume_draft = true; 'smaction_draft';
1e150c97 596 } else if (handleAsSent($mailbox)) {
7d020720 597 $edit_as_new = true;
1e150c97 598 }
7d020720 599 $oTemplate->assign('can_resume_draft', $resume_draft);
67dc67bb 600 $oTemplate->assign('can_edit_as_new', $edit_as_new);
601
7d020720 602 $oTemplate->assign('mailboxes', sqimap_mailbox_option_array($imapConnection));
603 if (in_array('\\deleted', $aMailbox['PERMANENTFLAGS'],true)) {
324ac3c5 604 $delete_url = $base_uri . "src/$where";
7d020720 605 $oTemplate->assign('can_be_deleted', true);
606 $oTemplate->assign('move_delete_form_action', $base_uri.'src/'.$where);
607 $oTemplate->assign('delete_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
608 addHidden('msg[0]', $passed_id)."\n" .
609 addHidden('startMessage', $startMessage)."\n" );
4669e892 610 if (!(isset($passed_ent_id) && $passed_ent_id)) {
7d020720 611 $oTemplate->assign('can_be_moved', true);
612 $oTemplate->assign('move_form_extra', addHidden('mailbox', $aMailbox['NAME'])."\n" .
613 addHidden('msg[0]', $passed_id)."\n" );
614 $oTemplate->assign('last_move_target', isset($lastTargetMailbox) && !empty($lastTargetMailbox) ? $lastTargetMailbox : '');
615 $oTemplate->assign('can_be_copied', $show_copy_buttons==1);
1e150c97 616 } else {
7d020720 617 $oTemplate->assign('can_be_moved', false);
618 $oTemplate->assign('move_form_extra', '');
619 $oTemplate->assign('last_move_target', '');
620 $oTemplate->assign('can_be_copied', false);
988e24f6 621 }
7d020720 622 } else {
623 $oTemplate->assign('can_be_deleted', false);
624 $oTemplate->assign('move_delete_form_action', '');
625 $oTemplate->assign('delete_form_extra', '');
626 $oTemplate->assign('can_be_moved', false);
627 $oTemplate->assign('move_form_extra', '');
628 $oTemplate->assign('last_move_target', '');
629 $oTemplate->assign('can_be_copied', false);
630 }
67dc67bb 631
2d97bb26 632 global $null;
633 do_hook('read_body_menu', $null);
634
7d020720 635 if ($nav_on_top) {
636 $oTemplate->display('read_menubar_nav.tpl');
637 $oTemplate->display('read_menubar_buttons.tpl');
638 } else {
639 $oTemplate->display('read_menubar_buttons.tpl');
640 $oTemplate->display('read_menubar_nav.tpl');
764971df 641 }
67dc67bb 642
c615b1da 643}
644
645function formatToolbar($mailbox, $passed_id, $passed_ent_id, $message, $color) {
7d020720 646 global $base_uri, $where, $what, $show_html_default,
67dc67bb 647 $oTemplate, $download_href,
7d020720 648 $unsafe_image_toggle_href, $unsafe_image_toggle_text;
4669e892 649
d9c1dccc 650 $urlMailbox = urlencode($mailbox);
78909469 651 $urlPassed_id = urlencode($passed_id);
652 $urlPassed_ent_id = urlencode($passed_ent_id);
4669e892 653
78909469 654 $query_string = 'mailbox=' . $urlMailbox . '&amp;passed_id=' . $urlPassed_id . '&amp;passed_ent_id=' . $urlPassed_ent_id;
78909469 655 if (!empty($where)) {
656 $query_string .= '&amp;where=' . urlencode($where);
657 }
78909469 658 if (!empty($what)) {
659 $query_string .= '&amp;what=' . urlencode($what);
660 }
e95c04ec 661 $url = $base_uri.'src/view_header.php?'.$query_string;
d9c1dccc 662
d9c1dccc 663
7d020720 664 // Build the printer friend link
665 /* hackydiehack */
666 if( !sqgetGlobalVar('view_unsafe_images', $view_unsafe_images, SQ_GET) ) {
667 $view_unsafe_images = false;
668 } else {
669 $view_unsafe_images = true;
40a34e57 670 }
7d020720 671 $pf_params = '?passed_ent_id=' . $urlPassed_ent_id .
672 '&mailbox=' . $urlMailbox .
673 '&passed_id=' . $urlPassed_id .
674 '&view_unsafe_images='. (bool) $view_unsafe_images .
67dc67bb 675 '&show_html_default=' . $show_html_default;
7d020720 676 $links = array();
677 $links[] = array (
678 'URL' => $url,
679 'Text' => _("View Full Header")
680 );
681 $links[] = array (
682 'URL' => $pf_params,
683 'Text' => _("View Printable Version")
684 );
685 $links[] = array (
686 'URL' => $download_href,
210b5bb5 687 'Text' => _("Download this as a file")
7d020720 688 );
689 $toggle = html_toggle_href($mailbox, $passed_id, $passed_ent_id, $message);
690 if (!empty($toggle)) {
691 $links[] = array (
692 'URL' => $toggle,
693 'Text' => $show_html_default==1 ? _("View as plain text") : _("View as HTML")
694 );
695 }
696 if (!empty($unsafe_image_toggle_href)) {
697 $links[] = array (
698 'URL' => $unsafe_image_toggle_href,
699 'Text' => $unsafe_image_toggle_text
700 );
701 }
702
703 do_hook('read_body_header_right', $links);
704
705 $oTemplate->assign('links', $links);
67dc67bb 706
7d020720 707 return $oTemplate->fetch('read_toolbar.tpl');
91c27aee 708}
709
6206f6c4 710/***************************/
2ffa3f57 711/* Main of read_body.php */
6206f6c4 712/***************************/
57257333 713
0b97a708 714/* get the globals we may need */
715
e95c04ec 716sqgetGlobalVar('delimiter', $delimiter, SQ_SESSION);
e95c04ec 717sqgetGlobalVar('lastTargetMailbox', $lastTargetMailbox, SQ_SESSION);
e95c04ec 718if (!sqgetGlobalVar('messages', $messages, SQ_SESSION) ) {
719 $messages = array();
ce274df9 720}
81de00c0 721sqgetGlobalVar('delayed_errors', $delayed_errors, SQ_SESSION);
722if (is_array($delayed_errors)) {
723 $oErrorHandler->AssignDelayedErrors($delayed_errors);
724 sqsession_unregister("delayed_errors");
725}
e95c04ec 726/** GET VARS */
727sqgetGlobalVar('sendreceipt', $sendreceipt, SQ_GET);
324ac3c5 728if (!sqgetGlobalVar('where', $where, SQ_GET) ) {
729 $where = 'right_main.php';
730}
d0b119a5 731/*
732 * Used as entry key to the list of uid's cached in the mailbox cache
733 * we use the cached uid's to get the next and prev message.
734 */
324ac3c5 735if (!sqgetGlobalVar('what', $what, SQ_GET) ){
736 $what = 0;
737}
e95c04ec 738if ( sqgetGlobalVar('show_more', $temp, SQ_GET) ) {
739 $show_more = (int) $temp;
1b9f3c04 740}
e95c04ec 741if ( sqgetGlobalVar('show_more_cc', $temp, SQ_GET) ) {
742 $show_more_cc = (int) $temp;
0b97a708 743}
e95c04ec 744if ( sqgetGlobalVar('show_more_bcc', $temp, SQ_GET) ) {
745 $show_more_bcc = (int) $temp;
0b97a708 746}
e95c04ec 747if ( sqgetGlobalVar('view_hdr', $temp, SQ_GET) ) {
748 $view_hdr = (int) $temp;
0b97a708 749}
e95c04ec 750
91c27aee 751if ( sqgetGlobalVar('account', $temp, SQ_GET) ) {
752 $iAccount = (int) $temp;
753} else {
754 $iAccount = 0;
755}
756
e95c04ec 757/** GET/POST VARS */
758sqgetGlobalVar('passed_ent_id', $passed_ent_id);
759sqgetGlobalVar('mailbox', $mailbox);
760
761if ( sqgetGlobalVar('passed_id', $temp) ) {
762 $passed_id = (int) $temp;
0b97a708 763}
e95c04ec 764if ( sqgetGlobalVar('sort', $temp) ) {
765 $sort = (int) $temp;
0b97a708 766}
e95c04ec 767if ( sqgetGlobalVar('startMessage', $temp) ) {
768 $startMessage = (int) $temp;
324ac3c5 769} else {
770 $startMessage = 1;
ce274df9 771}
7277191e 772if(sqgetGlobalVar('show_html_default', $temp)) {
773 $show_html_default = (int) $temp;
774}
775
776if(sqgetGlobalVar('view_unsafe_images', $temp)) {
777 $view_unsafe_images = (int) $temp;
778 if($view_unsafe_images == 1) {
779 $show_html_default = 1;
780 }
781} else {
782 $view_unsafe_images = 0;
783}
324ac3c5 784/**
785 * Retrieve mailbox cache
786 */
787sqgetGlobalVar('mailbox_cache',$mailbox_cache,SQ_SESSION);
0b97a708 788
ce274df9 789/* end of get globals */
38c944cc 790
906f7e9f 791$imapConnection = sqimap_login($username, false, $imapServerAddress, $imapPort, 0);
91c27aee 792$aMailbox = sqm_api_mailbox_select($imapConnection, $iAccount, $mailbox,array('setindex' => $what, 'offset' => $startMessage),array());
793
c3731db5 794
91c27aee 795/**
c3731db5 796 Start code to set the columns to fetch in case of hitting the next/prev link
797 The reason for this is the fact that the cache can be invalidated which means that the headers
798 to fetch aren't there anymore. Before they got calculated when the messagelist was shown.
799
800 Todo, better central handling of setting the mailbox options so we do not need to do the stuff below
801*/
802
803/**
804 * Replace From => To in case it concerns a draft or sent folder
805 */
199ff86a 806$aColumns = array();
c3731db5 807if (($mailbox == $sent_folder || $mailbox == $draft_folder) &&
808 !in_array(SQM_COL_TO,$index_order)) {
809 $aNewOrder = array(); // nice var name ;)
810 foreach($index_order as $iCol) {
811 if ($iCol == SQM_COL_FROM) {
812 $iCol = SQM_COL_TO;
813 }
199ff86a 814 $aColumns[$iCol] = array();
c3731db5 815 }
c3731db5 816} else {
199ff86a 817 foreach ($index_order as $iCol) {
818 $aColumns[$iCol] = array();
819 }
c3731db5 820}
821
822$aProps = array(
823 'columns' => $aColumns, // columns bound settings
824 'config' => array(
825 'highlight_list' => $message_highlight_list, // row highlighting rules
826 'trash_folder' => $trash_folder,
827 'sent_folder' => $sent_folder,
828 'draft_folder' => $draft_folder));
829
830calcFetchColumns($aMailbox,$aProps);
831
832/**
833 End code to set the columns to fetch in case of hitting the next/prev link
834*/
835
836
837
838/**
839 * Check if cache is still valid, $what contains the key
840 * which gives us acces to the array with uid's. At this moment
841 * 0 is used for a normal message list and search uses 1 as key. This can be
842 * changed / extended in the future.
843 * If on a select of a mailbox we detect that the cache should be invalidated due to
844 * the delete of messages or due to new messages we empty the list with uid's and
845 * that's what we detect below.
846 */
91c27aee 847if (!is_array($aMailbox['UIDSET'][$what])) {
d0b119a5 848 fetchMessageHeaders($imapConnection, $aMailbox);
91c27aee 849}
38c944cc 850
d0b119a5 851$iSetIndex = $aMailbox['SETINDEX'];
852$aMailbox['CURRENT_MSG'][$iSetIndex] = $passed_id;
853
324ac3c5 854/**
855 * Update the seen state
856 * and ignore in_array('\\seen',$aMailbox['PERMANENTFLAGS'],true)
857 */
858if (isset($aMailbox['MSG_HEADERS'][$passed_id]['FLAGS'])) {
859 $aMailbox['MSG_HEADERS'][$passed_id]['FLAGS']['\\seen'] = true;
e0e30169 860}
e0e30169 861
1e150c97 862/**
863 * Process Delete from delete-move-next
864 * but only if delete_id was set
865 */
866if ( sqgetGlobalVar('delete_id', $delete_id, SQ_GET) ) {
324ac3c5 867 handleMessageListForm($imapConnection,$aMailbox,$sButton='setDeleted', array($delete_id));
1e150c97 868}
869
38c944cc 870/**
871 * $message contains all information about the message
872 * including header and body
873 */
37d2a6ee 874
324ac3c5 875if (isset($aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'])) {
876 $message = $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'];
877 $FirstTimeSee = !$message->is_seen;
38c944cc 878} else {
324ac3c5 879 $message = sqimap_get_message($imapConnection, $passed_id, $mailbox);
880 $FirstTimeSee = !$message->is_seen;
5200c026 881}
bdfa0f9a 882
883/**
884 * update message seen status and put in cache
885 */
886$message->is_seen = true;
887$aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
888
dd628162 889if (isset($passed_ent_id) && $passed_ent_id) {
324ac3c5 890 $message = $message->getEntity($passed_ent_id);
891 if ($message->type0 != 'message' && $message->type1 != 'rfc822') {
892 $message = $message->parent;
893 }
894 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[$passed_ent_id.HEADER]", true, $response, $msg, TRUE);
895 $rfc822_header = new Rfc822Header();
896 $rfc822_header->parseHeader($read);
897 $message->rfc822_header = $rfc822_header;
91c27aee 898} else if ($message->type0 == 'message' && $message->type1 == 'rfc822' && isset($message->entities[0])) {
899 $read = sqimap_run_command ($imapConnection, "FETCH $passed_id BODY[1.HEADER]", true, $response, $msg, TRUE);
900 $rfc822_header = new Rfc822Header();
901 $rfc822_header->parseHeader($read);
902 $message->rfc822_header = $rfc822_header;
c615b1da 903} else {
324ac3c5 904 $passed_ent_id = 0;
38c944cc 905}
5200c026 906$header = $message->header;
57257333 907
57257333 908
6206f6c4 909/****************************************/
910/* Block for handling incoming url vars */
911/****************************************/
5200c026 912
5200c026 913if (isset($sendreceipt)) {
914 if ( !$message->is_mdnsent ) {
324ac3c5 915 $supportMDN = ServerMDNSupport($aMailbox["PERMANENTFLAGS"]);
40e07136 916 if ( SendMDN( $mailbox, $passed_id, $message, $imapConnection ) > 0 && $supportMDN ) {
6201339c 917 ToggleMDNflag( true, $imapConnection, $mailbox, $passed_id);
5200c026 918 $message->is_mdnsent = true;
1012f961 919 $aMailbox['MSG_HEADERS'][$passed_id]['MESSAGE_OBJECT'] = $message;
5200c026 920 }
5200c026 921 }
922}
6206f6c4 923/***********************************************/
924/* End of block for handling incoming url vars */
925/***********************************************/
926
9f42bfc8 927$messagebody = '';
6e515418 928do_hook('read_body_top', $null);
c4ad259b 929if ($show_html_default == 1) {
930 $ent_ar = $message->findDisplayEntity(array());
931} else {
932 $ent_ar = $message->findDisplayEntity(array(), array('text/plain'));
933}
a128c967 934$cnt = count($ent_ar);
935for ($i = 0; $i < $cnt; $i++) {
6a108031 936 $messagebody .= formatBody($imapConnection, $message, $color, $wrap_at, $ent_ar[$i], $passed_id, $mailbox);
a128c967 937 if ($i != $cnt-1) {
7d020720 938 $messagebody .= '<hr />';
a128c967 939 }
38c944cc 940}
e55c441a 941
202bcbcc 942/**
943 * Write mailbox with updated seen flag information back to cache.
944 */
945$mailbox_cache[$iAccount.'_'.$aMailbox['NAME']] = $aMailbox;
946sqsession_register($mailbox_cache,'mailbox_cache');
947$_SESSION['mailbox_cache'] = $mailbox_cache;
202bcbcc 948
b89ceca6 949displayPageHeader($color, $mailbox,'','');
324ac3c5 950formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message,false);
e0e30169 951formatEnvheader($aMailbox, $passed_id, $passed_ent_id, $message, $color, $FirstTimeSee);
7d020720 952
953$oTemplate->assign('message_body', $messagebody);
954$oTemplate->display('read_message_body.tpl');
955
956formatAttachments($message,$ent_ar,$mailbox, $passed_id);
a07cd1a4 957
958/* show attached images inline -- if pref'fed so */
7d020720 959if ($attachment_common_show_images && is_array($attachment_common_show_images_list)) {
960 $images = array();
a07cd1a4 961 foreach ($attachment_common_show_images_list as $img) {
ce274df9 962 $imgurl = SM_PATH . 'src/download.php' .
57257333 963 '?' .
cd7b8833 964 'passed_id=' . urlencode($img['passed_id']) .
3d570ba0 965 '&amp;mailbox=' . urlencode($mailbox) .
ff9d4297 966 '&amp;ent_id=' . urlencode($img['ent_id']) .
3d570ba0 967 '&amp;absolute_dl=true';
7d020720 968 $a = array();
969 $a['Name'] = $img['name'];
970 $a['DisplayURL'] = $imgurl;
971 $a['DownloadURL'] = $img['download_href'];
972 $images[] = $a;
10f0ce72 973 }
67dc67bb 974
7d020720 975 $oTemplate->assign('images', $images);
976 $oTemplate->display('read_display_images_inline.tpl');
a07cd1a4 977}
978
324ac3c5 979formatMenuBar($aMailbox, $passed_id, $passed_ent_id, $message, false, FALSE);
1e150c97 980
6e515418 981do_hook('read_body_bottom', $null);
a07cd1a4 982sqimap_logout($imapConnection);
51d66ea2 983$oTemplate->display('footer.tpl');