diff options
Diffstat (limited to 'program/steps/mail/func.inc')
-rw-r--r-- | program/steps/mail/func.inc | 420 |
1 files changed, 205 insertions, 215 deletions
diff --git a/program/steps/mail/func.inc b/program/steps/mail/func.inc index 78a977b82..2938e91e1 100644 --- a/program/steps/mail/func.inc +++ b/program/steps/mail/func.inc @@ -89,15 +89,13 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { } $threading = (bool) $RCMAIL->storage->get_threading(); - $delimiter = $RCMAIL->storage->get_hierarchy_delimiter(); // set current mailbox and some other vars in client environment $OUTPUT->set_env('mailbox', $mbox_name); $OUTPUT->set_env('pagesize', $RCMAIL->storage->get_pagesize()); - $OUTPUT->set_env('delimiter', $delimiter); + $OUTPUT->set_env('delimiter', $RCMAIL->storage->get_hierarchy_delimiter()); $OUTPUT->set_env('threading', $threading); $OUTPUT->set_env('threads', $threading || $RCMAIL->storage->get_capability('THREAD')); - $OUTPUT->set_env('reply_all_mode', (int) $RCMAIL->config->get('reply_all_mode')); $OUTPUT->set_env('preview_pane_mark_read', $RCMAIL->config->get('preview_pane_mark_read', 0)); if ($RCMAIL->storage->get_capability('QUOTA')) { $OUTPUT->set_env('quota', true); @@ -121,48 +119,11 @@ if (empty($RCMAIL->action) || $RCMAIL->action == 'list') { if (!$OUTPUT->ajax_call) $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage', 'copyingmessage', 'deletingmessage', 'markingmessage', - 'copy', 'move', 'quota', 'replyall', 'replylist', 'importwait'); + 'copy', 'move', 'quota'); - $pagetitle = $RCMAIL->localize_foldername($RCMAIL->storage->mod_folder($mbox_name), true); - $pagetitle = str_replace($delimiter, " \xC2\xBB ", $pagetitle); - - $OUTPUT->set_pagetitle($pagetitle); + $OUTPUT->set_pagetitle(rcmail_localize_foldername($RCMAIL->storage->mod_folder($mbox_name))); } -// register UI objects -$OUTPUT->add_handlers(array( - 'mailboxlist' => 'rcmail_mailbox_list', - 'messages' => 'rcmail_message_list', - 'messagecountdisplay' => 'rcmail_messagecount_display', - 'quotadisplay' => 'rcmail_quota_display', - 'mailboxname' => 'rcmail_mailbox_name_display', - 'messageheaders' => 'rcmail_message_headers', - 'messagefullheaders' => 'rcmail_message_full_headers', - 'messagebody' => 'rcmail_message_body', - 'messagecontentframe' => 'rcmail_messagecontent_frame', - 'messageimportform' => 'rcmail_message_import_form', - 'searchfilter' => 'rcmail_search_filter', - 'searchform' => array($OUTPUT, 'search_form'), -)); - -// register action aliases -$RCMAIL->register_action_map(array( - 'refresh' => 'check_recent.inc', - 'preview' => 'show.inc', - 'print' => 'show.inc', - 'move' => 'move_del.inc', - 'delete' => 'move_del.inc', - 'send' => 'sendmail.inc', - 'expunge' => 'folders.inc', - 'purge' => 'folders.inc', - 'remove-attachment' => 'attachments.inc', - 'display-attachment' => 'attachments.inc', - 'upload' => 'attachments.inc', - 'group-expand' => 'autocomplete.inc', -)); - - - /** * Returns 'to' if current folder is configured Sent or Drafts * or their subfolders, otherwise returns 'from'. @@ -178,9 +139,7 @@ function rcmail_message_list_smart_column_name() $sent_mbox = $RCMAIL->config->get('sent_mbox'); $drafts_mbox = $RCMAIL->config->get('drafts_mbox'); - if ((strpos($mbox.$delim, $sent_mbox.$delim) === 0 || strpos($mbox.$delim, $drafts_mbox.$delim) === 0) - && strtoupper($mbox) != 'INBOX' - ) { + if (strpos($mbox.$delim, $sent_mbox.$delim) === 0 || strpos($mbox.$delim, $drafts_mbox.$delim) === 0) { return 'to'; } @@ -261,7 +220,7 @@ function rcmail_message_list($attrib) if (!in_array('threads', $a_show_cols)) array_unshift($a_show_cols, 'threads'); - $_SESSION['skin_path'] = $CONFIG['skin_path']; + $skin_path = $_SESSION['skin_path'] = $CONFIG['skin_path']; // set client env $OUTPUT->add_gui_object('messagelist', $attrib['id']); @@ -273,13 +232,15 @@ function rcmail_message_list($attrib) $OUTPUT->include_script('list.js'); - $table = new html_table($attrib); - if (!$attrib['noheader']) { - foreach (rcmail_message_list_head($attrib, $a_show_cols) as $cell) - $table->add_header(array('class' => $cell['className'], 'id' => $cell['id']), $cell['html']); - } + $thead = ''; + foreach (rcmail_message_list_head($attrib, $a_show_cols) as $cell) + $thead .= html::tag('td', array('class' => $cell['className'], 'id' => $cell['id']), $cell['html']); - return $table->show(); + return html::tag('table', + $attrib, + html::tag('thead', null, html::tag('tr', null, $thead)) . + html::tag('tbody', null, ''), + array('style', 'class', 'id', 'cellpadding', 'cellspacing', 'border', 'summary')); } @@ -326,7 +287,7 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null $thead = $head_replace ? rcmail_message_list_head($_SESSION['list_attrib'], $a_show_cols) : NULL; // get name of smart From/To column in folder context - if (array_search('fromto', $a_show_cols) !== false) { + if (($f = array_search('fromto', $a_show_cols)) !== false) { $smart_col = rcmail_message_list_smart_column_name(); } @@ -342,7 +303,7 @@ function rcmail_js_message_list($a_headers, $insert_top=FALSE, $a_show_cols=null } // loop through message headers - foreach ($a_headers as $header) { + foreach ($a_headers as $n => $header) { if (empty($header)) continue; @@ -416,6 +377,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) global $RCMAIL; $skin_path = $_SESSION['skin_path']; + $image_tag = html::img(array('src' => "%s%s", 'alt' => "%s")); // check to see if we have some settings for sorting $sort_col = $_SESSION['sort_col']; @@ -451,7 +413,7 @@ function rcmail_message_list_head($attrib, $a_show_cols) $cells = array(); // get name of smart From/To column in folder context - if (array_search('fromto', $a_show_cols) !== false) { + if (($f = array_search('fromto', $a_show_cols)) !== false) { $smart_col = rcmail_message_list_smart_column_name(); } @@ -642,8 +604,6 @@ function rcmail_check_safe(&$message) $message->set_safe(true); } } - - $RCMAIL->plugins->exec_hook('message_check_safe', array('message' => $message)); break; case 2: // always @@ -743,10 +703,7 @@ function rcmail_print_body($part, $p = array()) + $p + array('safe' => false, 'plain' => false, 'inline_html' => true)); // convert html to text/plain - if ($data['plain'] && ($data['type'] == 'html' || $data['type'] == 'enriched')) { - if ($data['type'] == 'enriched') { - $data['body'] = rcube_enriched::to_html($data['body']); - } + if ($data['type'] == 'html' && $data['plain']) { $txt = new rcube_html2text($data['body'], false, true); $body = $txt->get_text(); $part->ctype_secondary = 'plain'; @@ -772,13 +729,8 @@ function rcmail_print_body($part, $p = array()) unset($data['body']); // plaintext postprocessing - if ($part->ctype_secondary == 'plain') { - if ($part->ctype_secondary == 'plain' && $part->ctype_parameters['format'] == 'flowed') { - $body = rcube_mime::unfold_flowed($body); - } - - $body = rcmail_plain_body($body); - } + if ($part->ctype_secondary == 'plain') + $body = rcmail_plain_body($body, $part->ctype_parameters['format'] == 'flowed'); // allow post-processing of the message body $data = $RCMAIL->plugins->exec_hook('message_part_after', @@ -792,16 +744,16 @@ function rcmail_print_body($part, $p = array()) * Handle links and citation marks in plain text message * * @param string Plain text string + * @param boolean Text uses format=flowed * * @return string Formatted HTML string */ -function rcmail_plain_body($body) +function rcmail_plain_body($body, $flowed=false) { global $RCMAIL; // make links and email-addresses clickable - $attribs = array('link_attribs' => array('rel' => 'noreferrer', 'target' => '_blank')); - $replacer = new rcmail_string_replacer($attribs); + $replacer = new rcmail_string_replacer; // search for patterns like links and e-mail addresses and replace with tokens $body = $replacer->replace($body); @@ -827,10 +779,48 @@ function rcmail_plain_body($body) str_repeat('</blockquote>', $quote_level - $q))) . $body[$n]; $last = $n; } + else if ($flowed) { + // previous line is flowed + if (isset($body[$last]) && $body[$n] + && $body[$last][strlen($body[$last])-1] == ' ') { + // merge lines + $body[$last] .= $body[$n]; + unset($body[$n]); + } + else { + $last = $n; + } + } } else { $q = 0; - if ($quote_level > 0) + if ($flowed) { + // sig separator - line is fixed + if ($body[$n] == '-- ') { + $last = $last_sig = $n; + } + else { + // remove space-stuffing + if ($body[$n][0] == ' ') + $body[$n] = substr($body[$n], 1); + + // previous line is flowed? + if (isset($body[$last]) && $body[$n] + && $last !== $last_sig + && $body[$last][strlen($body[$last])-1] == ' ' + ) { + $body[$last] .= $body[$n]; + unset($body[$n]); + } + else { + $last = $n; + } + } + if ($quote_level > 0) + $body[$last] = $replacer->get_replacement($replacer->add( + str_repeat('</blockquote>', $quote_level))) . $body[$last]; + } + else if ($quote_level > 0) $body[$n] = $replacer->get_replacement($replacer->add( str_repeat('</blockquote>', $quote_level))) . $body[$n]; } @@ -901,7 +891,7 @@ function rcmail_washtml_callback($tagname, $attrib, $content, $washtml) */ function rcmail_message_headers($attrib, $headers=null) { - global $MESSAGE, $PRINT_MODE, $RCMAIL; + global $OUTPUT, $MESSAGE, $PRINT_MODE, $RCMAIL; static $sa_attrib; // keep header table attrib @@ -1086,7 +1076,7 @@ function rcmail_message_body($attrib) $header_attrib[$regs[1]] = $value; if (!empty($MESSAGE->parts)) { - foreach ($MESSAGE->parts as $part) { + foreach ($MESSAGE->parts as $i => $part) { if ($part->type == 'headers') { $out .= html::div('message-partheaders', rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : null, $part->headers)); } @@ -1190,9 +1180,10 @@ function rcmail_message_body($attrib) $show_link = array( 'href' => $MESSAGE->get_part_url($attach_prop->mime_id, false), 'onclick' => sprintf( - 'return %s.command(\'load-attachment\',\'%s\',this)', + 'return %s.command(\'load-attachment\',{part:\'%s\', mimetype:\'%s\'},this)', JS_OBJECT_NAME, - $attach_prop->mime_id) + $attach_prop->mime_id, + $mimetype) ); $out .= html::p('image-attachment', html::a($show_link + array('class' => 'image-link', 'style' => sprintf('width:%dpx', $thumbnail_size)), @@ -1378,15 +1369,18 @@ function rcmail_html4inline($body, $container_id, $body_id='', &$attributes=null /** - * parse link (a, link, area) attributes and set correct target + * parse link attributes and set correct target */ function rcmail_alter_html_link($matches) { global $RCMAIL; - $tag = strtolower($matches[1]); + // Support unicode/punycode in top-level domain part + $EMAIL_PATTERN = '([a-z0-9][a-z0-9\-\.\+\_]*@[^&@"\'.][^@&"\']*\\.([^\\x00-\\x40\\x5b-\\x60\\x7b-\\x7f]{2,}|xn--[a-z0-9]{2,}))'; + + $tag = $matches[1]; $attrib = parse_attrib_string($matches[2]); - $end = '>'; + $end = '>'; // Remove non-printable characters in URL (#1487805) if ($attrib['href']) @@ -1398,36 +1392,12 @@ function rcmail_alter_html_link($matches) $attrib['href'] = $RCMAIL->url(array('task' => 'utils', 'action' => 'modcss', 'u' => $tempurl, 'c' => $GLOBALS['rcmail_html_container_id'])); $end = ' />'; } - else if (preg_match('/^mailto:(.+)/i', $attrib['href'], $mailto)) { - list($mailto, $url) = explode('?', html_entity_decode($mailto[1], ENT_QUOTES, 'UTF-8'), 2); - - $url = urldecode($url); - $mailto = urldecode($mailto); - $addresses = rcube_mime::decode_address_list($mailto, null, true); - $mailto = array(); - - // do sanity checks on recipients - foreach ($addresses as $idx => $addr) { - if (rcube_utils::check_email($addr['mailto'], false)) { - $addresses[$idx] = $addr['mailto']; - $mailto[] = $addr['string']; - } - else { - unset($addresses[$idx]); - } - } - - if (!empty($addresses)) { - $attrib['href'] = 'mailto:' . implode(',', $addresses); - $attrib['onclick'] = sprintf( - "return %s.command('compose','%s',this)", - JS_OBJECT_NAME, - JQ(implode(',', $mailto) . ($url ? "?$url" : ''))); - } - else { - $attrib['href'] = '#NOP'; - $attrib['onclick'] = ''; - } + else if (preg_match('/^mailto:'.$EMAIL_PATTERN.'(\?[^"\'>]+)?/i', $attrib['href'], $mailto)) { + $attrib['href'] = $mailto[0]; + $attrib['onclick'] = sprintf( + "return %s.command('compose','%s',this)", + JS_OBJECT_NAME, + JQ($mailto[1].$mailto[3])); } else if (empty($attrib['href']) && !$attrib['name']) { $attrib['href'] = './#NOP'; @@ -1437,11 +1407,6 @@ function rcmail_alter_html_link($matches) $attrib['target'] = '_blank'; } - // Better security by adding rel="noreferrer" (#1484686) - if (($tag == 'a' || $tag == 'area') && $attrib['href'] && $attrib['href'][0] != '#') { - $attrib['rel'] = 'noreferrer'; - } - // allowed attributes for a|link|area tags $allow = array('href','name','target','onclick','id','class','style','title', 'rel','type','media','alt','coords','nohref','hreflang','shape'); @@ -1465,8 +1430,7 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, $c = count($a_parts); $j = 0; $out = ''; - $allvalues = array(); - $show_email = $RCMAIL->config->get('message_show_email'); + $allvalues = array(); if ($addicon && !isset($_SESSION['writeable_abook'])) { $_SESSION['writeable_abook'] = $RCMAIL->get_address_sources(true) ? true : false; @@ -1480,7 +1444,7 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, $valid = check_email($mailto, false); // phishing email prevention (#1488981), e.g. "valid@email.addr <phishing@email.addr>" - if (!$show_email && $valid && $name && $name != $mailto && strpos($name, '@')) { + if ($name && $valid && $name != $mailto && strpos($name, '@')) { $name = ''; } @@ -1492,25 +1456,19 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, $mailto = rcube_idn_to_utf8($mailto); if ($PRINT_MODE) { - $address = sprintf('%s <%s>', Q($name), Q($mailto)); + $out .= ($out ? ', ' : '') . sprintf('%s <%s>', Q($name), $mailto); + // for printing we display all addresses + continue; } else if ($valid) { if ($linked) { - $attrs = array( - 'href' => 'mailto:' . $mailto, - 'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ(format_email_recipient($mailto, $name))), - 'class' => "rcmContactAddress", - ); - - if ($show_email && $name && $mailto) { - $content = Q($name ? sprintf('%s <%s>', $name, $mailto) : $mailto); - } - else { - $content = Q($name ? $name : $mailto); - $attrs['title'] = $mailto; - } - - $address = html::a($attrs, $content); + $address = html::a(array( + 'href' => 'mailto:'.$mailto, + 'onclick' => sprintf("return %s.command('compose','%s',this)", JS_OBJECT_NAME, JQ($mailto)), + 'title' => $mailto, + 'class' => "rcmContactAddress", + ), + Q($name ? $name : $mailto)); } else { $address = html::span(array('title' => $mailto, 'class' => "rcmContactAddress"), @@ -1556,15 +1514,6 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, } if ($moreadrs) { - if ($PRINT_MODE) { - $out .= ' ' . html::a(array( - 'href' => '#more', - 'class' => 'morelink', - 'onclick' => '$(this).hide().next().show()', - ), Q(rcube_label(array('name' => 'andnmore', 'vars' => array('nr' => $moreadrs))))) . - html::span(array('style' => 'display:none'), join(', ', $allvalues)); - } - else { $out .= ' ' . html::a(array( 'href' => '#more', 'class' => 'morelink', @@ -1574,7 +1523,6 @@ function rcmail_address_string($input, $max=null, $linked=false, $addicon=null, JQ($title)) ), Q(rcube_label(array('name' => 'andnmore', 'vars' => array('nr' => $moreadrs))))); - } } return $out; @@ -1647,6 +1595,45 @@ function rcmail_draftinfo_decode($str) } +function rcmail_message_part_controls($attrib) +{ + global $MESSAGE, $RCMAIL; + + $part = asciiwords(get_input_value('_part', RCUBE_INPUT_GPC)); + if (!is_object($MESSAGE) || !is_array($MESSAGE->parts) || !($_GET['_uid'] && $_GET['_part']) || !$MESSAGE->mime_parts[$part]) + return ''; + + $part = $MESSAGE->mime_parts[$part]; + $table = new html_table(array('cols' => 3)); + + $filename = rcmail_attachment_name($part); + + if (!empty($filename)) { + $table->add('title', Q(rcube_label('filename'))); + $table->add('header', Q($filename)); + $table->add('download-link', html::a(array('href' => './?'.str_replace('_frame=', '_download=', $_SERVER['QUERY_STRING'])), Q(rcube_label('download')))); + } + + $table->add('title', Q(rcube_label('filesize'))); + $table->add('header', Q($RCMAIL->message_part_size($part))); + + return $table->show($attrib); +} + + +function rcmail_message_part_frame($attrib) +{ + global $MESSAGE; + + $part = $MESSAGE->mime_parts[asciiwords(get_input_value('_part', RCUBE_INPUT_GPC))]; + $ctype_primary = strtolower($part->ctype_primary); + + $attrib['src'] = './?' . str_replace('_frame=', ($ctype_primary=='text' ? '_embed=' : '_preload='), $_SERVER['QUERY_STRING']); + + return html::iframe($attrib); +} + + /** * clear message composing settings */ @@ -1734,7 +1721,8 @@ function rcmail_send_mdn($message, &$smtp_error) $sent = rcmail_deliver_message($compose, $identity['email'], $mailto, $smtp_error, $body_file, $options); - if ($sent) { + if ($sent) + { $RCMAIL->storage->set_flag($message->uid, 'MDNSENT'); return true; } @@ -1776,34 +1764,28 @@ function rcmail_identity_select($MESSAGE, $identities = null, $compose_mode = 'r } } - // decode From: address - $from = rcube_mime::decode_address_list($MESSAGE->headers->from, null, true, $MESSAGE->headers->charset); - $from = array_shift($from); - $from['mailto'] = strtolower($from['mailto']); - - $from_idx = null; - $found_idx = array('to' => null, 'from' => null); - $check_from = in_array($compose_mode, array('draft', 'edit', 'reply')); + $from_idx = null; + $found_idx = null; + $default_identity = 0; // default identity is always first on the list // Select identity foreach ($identities as $idx => $ident) { - // use From: header when in edit/draft or reply-to-self - if ($check_from && $from['mailto'] == strtolower($ident['email_ascii'])) { - // remember first matching identity address - if ($found_idx['from'] === null) { - $found_idx['from'] = $idx; - } - // match identity name - if ($from['name'] && $ident['name'] && $from['name'] == $ident['name']) { + // use From header + if (in_array($compose_mode, array('draft', 'edit'))) { + if ($MESSAGE->headers->from == $ident['ident']) { $from_idx = $idx; break; } } - // use replied/forwarded message recipients + // reply to yourself + else if ($compose_mode == 'reply' && $MESSAGE->headers->from == $ident['ident']) { + $from_idx = $idx; + break; + } + // use replied message recipients else if (($found = array_search(strtolower($ident['email_ascii']), $a_recipients)) !== false) { - // remember first matching identity address - if ($found_idx['to'] === null) { - $found_idx['to'] = $idx; + if ($found_idx === null) { + $found_idx = $idx; } // match identity name if ($a_names[$found] && $ident['name'] && $a_names[$found] == $ident['name']) { @@ -1813,10 +1795,9 @@ function rcmail_identity_select($MESSAGE, $identities = null, $compose_mode = 'r } } - // If matching by name+address didn't find any matches, - // get first found identity (address) if any + // If matching by name+address doesn't found any matches, get first found address (identity) if ($from_idx === null) { - $from_idx = $found_idx['from'] !== null ? $found_idx['from'] : $found_idx['to']; + $from_idx = $found_idx; } // Try Return-Path @@ -1841,14 +1822,27 @@ function rcmail_identity_select($MESSAGE, $identities = null, $compose_mode = 'r } } - // See identity_select plugin for example usage of this hook - $plugin = rcmail::get_instance()->plugins->exec_hook('identity_select', - array('message' => $MESSAGE, 'identities' => $identities, 'selected' => $from_idx)); + // Fallback using Delivered-To + if ($from_idx === null && ($delivered_to = $MESSAGE->headers->others['delivered-to'])) { + foreach ($identities as $idx => $ident) { + if (in_array($ident['email_ascii'], (array)$delivered_to)) { + $from_idx = $idx; + break; + } + } + } - $selected = $plugin['selected']; + // Fallback using Envelope-To + if ($from_idx === null && ($envelope_to = $MESSAGE->headers->others['envelope-to'])) { + foreach ($identities as $idx => $ident) { + if (in_array($ident['email_ascii'], (array)$envelope_to)) { + $from_idx = $idx; + break; + } + } + } - // default identity is always first on the list - return $identities[$selected !== null ? $selected : 0]; + return $identities[$from_idx !== null ? $from_idx : $default_identity]; } // Fixes some content-type names @@ -1905,15 +1899,13 @@ function rcmail_search_filter($attrib) $attrib['onchange'] = JS_OBJECT_NAME.'.filter_mailbox(this.value)'; - // Content-Type values of messages with attachments - // the same as in app.js:add_message_row() - $ctypes = array('application/', 'multipart/m', 'multipart/signed', 'multipart/report'); - - // Build search string of "with attachment" filter - $attachment = str_repeat(' OR', count($ctypes)-1); - foreach ($ctypes as $type) { - $attachment .= ' HEADER Content-Type ' . rcube_imap_generic::escape($type); - } + /* + RFC3501 (6.4.4): 'ALL', 'RECENT', + 'ANSWERED', 'DELETED', 'FLAGGED', 'SEEN', + 'UNANSWERED', 'UNDELETED', 'UNFLAGGED', 'UNSEEN', + 'NEW', // = (RECENT UNSEEN) + 'OLD' // = NOT RECENT + */ $select_filter = new html_select($attrib); $select_filter->add(rcube_label('all'), 'ALL'); @@ -1924,7 +1916,6 @@ function rcmail_search_filter($attrib) $select_filter->add(rcube_label('deleted'), 'DELETED'); $select_filter->add(rcube_label('undeleted'), 'UNDELETED'); } - $select_filter->add(rcube_label('withattachment'), $attachment); $select_filter->add(rcube_label('priority').': '.rcube_label('highest'), 'HEADER X-PRIORITY 1'); $select_filter->add(rcube_label('priority').': '.rcube_label('high'), 'HEADER X-PRIORITY 2'); $select_filter->add(rcube_label('priority').': '.rcube_label('normal'), 'NOT HEADER X-PRIORITY 1 NOT HEADER X-PRIORITY 2 NOT HEADER X-PRIORITY 4 NOT HEADER X-PRIORITY 5'); @@ -1954,36 +1945,35 @@ function rcmail_message_error($uid=null) $RCMAIL->output->send('messageerror'); } -function rcmail_message_import_form($attrib = array()) -{ - global $OUTPUT; - - // set defaults - $attrib += array('id' => 'rcmImportform', 'buttons' => 'yes'); - - // Get filesize, enable upload progress bar - $max_filesize = rcube_upload_init(); - - $button = new html_inputfield(array('type' => 'button')); - $fileinput = new html_inputfield(array( - 'type' => 'file', - 'name' => '_file[]', - 'multiple' => 'multiple', - 'accept' => ".eml, .mbox, message/rfc822, text/*", - )); - - $out = html::div($attrib, - $OUTPUT->form_tag(array('id' => $attrib['id'].'Frm', 'method' => 'post', 'enctype' => 'multipart/form-data'), - html::tag('input', array('type' => 'hidden', 'name' => '_unlock', 'value' => '')) . - html::div(null, $fileinput->show()) . - html::div('hint', rcube_label(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize)))) . - (get_boolean($attrib['buttons']) ? html::div('buttons', - $button->show(rcube_label('close'), array('class' => 'button', 'onclick' => "$('#$attrib[id]').hide()")) . ' ' . - $button->show(rcube_label('upload'), array('class' => 'button mainaction', 'onclick' => JS_OBJECT_NAME . ".command('import-messages', this.form)")) - ) : '') - ) - ); +// register UI objects +$OUTPUT->add_handlers(array( + 'mailboxlist' => 'rcmail_mailbox_list', + 'messages' => 'rcmail_message_list', + 'messagecountdisplay' => 'rcmail_messagecount_display', + 'quotadisplay' => 'rcmail_quota_display', + 'mailboxname' => 'rcmail_mailbox_name_display', + 'messageheaders' => 'rcmail_message_headers', + 'messagefullheaders' => 'rcmail_message_full_headers', + 'messagebody' => 'rcmail_message_body', + 'messagecontentframe' => 'rcmail_messagecontent_frame', + 'messagepartframe' => 'rcmail_message_part_frame', + 'messagepartcontrols' => 'rcmail_message_part_controls', + 'searchfilter' => 'rcmail_search_filter', + 'searchform' => array($OUTPUT, 'search_form'), +)); - $OUTPUT->add_gui_object('importform', $attrib['id'].'Frm'); - return $out; -} +// register action aliases +$RCMAIL->register_action_map(array( + 'refresh' => 'check_recent.inc', + 'preview' => 'show.inc', + 'print' => 'show.inc', + 'moveto' => 'move_del.inc', + 'delete' => 'move_del.inc', + 'send' => 'sendmail.inc', + 'expunge' => 'folders.inc', + 'purge' => 'folders.inc', + 'remove-attachment' => 'attachments.inc', + 'display-attachment' => 'attachments.inc', + 'upload' => 'attachments.inc', + 'group-expand' => 'autocomplete.inc', +)); |