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