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