alecpl
2008-12-09 de2e0bfeb8bf6884ae4185b94d495a55322348ae
program/steps/mail/func.inc
@@ -22,22 +22,32 @@
require_once('lib/enriched.inc');
require_once('include/rcube_smtp.inc');
$EMAIL_ADDRESS_PATTERN = '/([a-z0-9][a-z0-9\-\.\+\_]*@[a-z0-9]([a-z0-9\-][.]?)*[a-z0-9]\\.[a-z]{2,5})/i';
if (empty($_SESSION['mbox']))
  $_SESSION['mbox'] = $IMAP->get_mailbox_name();
// actions that do not require imap connection
$NOIMAP_ACTIONS = array('spell', 'addcontact', 'autocomplete', 'upload', 'display-attachment', 'remove-attachment');
// log in to imap server
if (!in_array($RCMAIL->action, $NOIMAP_ACTIONS) && !$RCMAIL->imap_connect()) {
  $RCMAIL->kill_session();
  if ($OUTPUT->ajax_call)
    $OUTPUT->redirect(array(), 2000);
  $OUTPUT->set_env('task', 'login');
  $OUTPUT->send('login');
}
// set imap properties and session vars
if ($mbox = get_input_value('_mbox', RCUBE_INPUT_GPC))
  $IMAP->set_mailbox(($_SESSION['mbox'] = $mbox));
else
  $_SESSION['mbox'] = $IMAP->get_mailbox_name();
if (!empty($_GET['_page']))
  $IMAP->set_page(($_SESSION['page'] = intval($_GET['_page'])));
// set mailbox to INBOX if not set
if (empty($_SESSION['mbox']))
  $_SESSION['mbox'] = $IMAP->get_mailbox_name();
// set default sort col/order to session
if (!isset($_SESSION['sort_col']))
@@ -69,6 +79,9 @@
      $_SESSION['search'][$search_request] = $IMAP->get_search_set();
      $OUTPUT->set_env('search_request', $search_request);
      }
      // make sure the message count is refreshed (for default view)
      $IMAP->messagecount($mbox_name, 'ALL', true);
    }
   
  // set current mailbox in client environment
@@ -86,7 +99,7 @@
  if (!$OUTPUT->ajax_call)
    $OUTPUT->add_label('checkingmail', 'deletemessage', 'movemessagetotrash', 'movingmessage');
  $OUTPUT->set_pagetitle(rcmail_localize_foldername($IMAP->get_mailbox_name()));
  $OUTPUT->set_pagetitle(rcmail_localize_foldername($mbox_name));
  }
@@ -119,8 +132,16 @@
  $out = '<table' . $attrib_str . ">\n";
  // define list of cols to be displayed
  $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
  // define list of cols to be displayed based on parameter or config
  if (empty($attrib['columns']))
      $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
  else
      $a_show_cols = explode(',', strip_quotes($attrib['columns']));
  // store column list in a session-variable
  $_SESSION['list_columns'] = $a_show_cols;
  // define sortable columns
  $a_sort_cols = array('subject', 'date', 'from', 'to', 'size');
  $mbox = $IMAP->get_mailbox_name();
@@ -135,9 +156,8 @@
  $out .= '<col class="icon" />';
  foreach ($a_show_cols as $col)
    $out .= sprintf('<col class="%s" />', $col);
    $out .= ($col!='attachment') ? sprintf('<col class="%s" />', $col) : '<col class="icon" />';
  $out .= '<col class="icon" />';
  $out .= "</colgroup>\n";
  // add table title
@@ -147,7 +167,17 @@
  foreach ($a_show_cols as $col)
    {
    // get column name
    $col_name = $col != 'flag' ? Q(rcube_label($col)) : sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], '');
    switch ($col)
      {
      case 'flag':
        $col_name = sprintf($image_tag, $skin_path, $attrib['unflaggedicon'], '');
        break;
      case 'attachment':
        $col_name = sprintf($image_tag, $skin_path, $attrib['attachmenticon'], '');
        break;
      default:
        $col_name = Q(rcube_label($col));
    }
    // make sort links
    $sort = '';
@@ -195,10 +225,12 @@
    $sort_class = $col==$sort_col ? " sorted$sort_order" : '';
    // put it all together
    $out .= '<td class="'.$col.$sort_class.'" id="rcmHead'.$col.'">' . "$col_name$sort</td>\n";
    if ($col!='attachment')
      $out .= '<td class="'.$col.$sort_class.'" id="rcm'.$col.'">' . "$col_name$sort</td>\n";
    else
      $out .= '<td class="icon" id="rcm'.$col.'">' . "$col_name$sort</td>\n";
    }
  $out .= '<td class="icon">'.($attrib['attachmenticon'] ? sprintf($image_tag, $skin_path, $attrib['attachmenticon'], '') : '&nbsp;')."</td>\n";
  $out .= "</tr></thead>\n<tbody>\n";
  // no messages in this mailbox
@@ -250,7 +282,7 @@
      $flagged_icon = $attrib['unflaggedicon'];
    
    // set attachment icon
    if ($attrib['attachmenticon'] && preg_match("/multipart\/[mr]/i", $header->ctype))
    if ($attrib['attachmenticon'] && preg_match("/multipart\/m/i", $header->ctype))
      $attach_icon = $attrib['attachmenticon'];
        
    $out .= sprintf('<tr id="rcmrow%d" class="message%s%s%s%s">'."\n",
@@ -288,10 +320,12 @@
      else
        $cont = Q($header->$col);
        
      $out .= '<td class="'.$col.'">' . $cont . "</td>\n";
      if ($col!='attachment')
        $out .= '<td class="'.$col.'">' . $cont . "</td>\n";
      else
        $out .= sprintf("<td class=\"icon\">%s</td>\n", $attach_icon ? sprintf($image_tag, $skin_path, $attach_icon, '') : '&nbsp;');
      }
    $out .= sprintf("<td class=\"icon\">%s</td>\n", $attach_icon ? sprintf($image_tag, $skin_path, $attach_icon, '') : '');
    $out .= "</tr>\n";
    
    if (sizeof($js_row_arr))
@@ -347,7 +381,11 @@
  {
  global $CONFIG, $IMAP, $OUTPUT;
  $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
  if (empty($_SESSION['list_columns']))
    $a_show_cols = is_array($CONFIG['list_cols']) ? $CONFIG['list_cols'] : array('subject');
  else
    $a_show_cols = $_SESSION['list_columns'];
  $mbox = $IMAP->get_mailbox_name();
  // show 'to' instead of from in sent messages
@@ -368,6 +406,12 @@
    if (!empty($header->charset))
      $IMAP->set_charset($header->charset);
    // remove 'attachment' and 'flag' columns, we don't need them here
    if(($key = array_search('attachment', $a_show_cols)) !== FALSE)
      unset($a_show_cols[$key]);
    if(($key = array_search('flag', $a_show_cols)) !== FALSE)
      unset($a_show_cols[$key]);
    // format each col; similar as in rcmail_message_list()
    foreach ($a_show_cols as $col)
@@ -597,29 +641,33 @@
    // special replacements (not properly handled by washtml class)
    $html_search = array(
   '/(<\/nobr>)(\s+)(<nobr>)/i',   // space(s) between <NOBR>
   '/(<[\/]*st1:[^>]+>)/i',   // Microsoft's Smart Tags <ST1>
   '/<title>.*<\/title>/i',   // PHP bug #32547 workaround: remove title tag
   '/<html[^>]*>/im',      // malformed html: remove html tags (#1485139)
   '/<\/html>/i',         // malformed html: remove html tags (#1485139)
      '/(<\/nobr>)(\s+)(<nobr>)/i',   // space(s) between <NOBR>
    '/(<[\/]*st1:[^>]+>)/i',   // Microsoft's Smart Tags <ST1>
    '/<title>.*<\/title>/i',   // PHP bug #32547 workaround: remove title tag
    '/<html[^>]*>/im',      // malformed html: remove html tags (#1485139)
    '/<\/html>/i',         // malformed html: remove html tags (#1485139)
    '/^[\xFE\xFF\xBB\xBF\x00]+((?:<\!doctype|\<html))/im',   // remove byte-order mark (only outlook?)
    );
    $html_replace = array(
   '\\1'.' &nbsp; '.'\\3',
   '',
   '',
   '',
   '',
      '\\1'.' &nbsp; '.'\\3',
      '',
      '',
      '',
      '\\1',
      '',
    );
    $html = preg_replace($html_search, $html_replace, $html);
    // charset was converted to UTF-8 in rcube_imap::get_message_part() -> change charset specification in HTML accordingly
    if (preg_match('/(\s+content=[\'"]\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i', $html))
      $html = preg_replace('/(\s+content=[\'"]\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i', '\\1='.RCMAIL_CHARSET, $html);
    $charset_pattern = '/(\s+content=[\'"]?\w+\/\w+;\s*charset)=([a-z0-9-_]+)/i';
    if (preg_match($charset_pattern, $html)) {
      $html = preg_replace($charset_pattern, '\\1='.RCMAIL_CHARSET, $html);
    }
    else {
      // add head for malformed messages, washtml cannot work without that
      if (!preg_match('/<head[^>]*>(.*)<\/head>/Uims', $html))
        $html = '<head></head>'. $html;
      $html = substr_replace($html, '<meta http-equiv="Content-Type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '</head>')), 0);
      $html = substr_replace($html, '<meta http-equiv="content-type" content="text/html; charset='.RCMAIL_CHARSET.'" />', intval(stripos($html, '<head>')+6), 0);
    }
    // clean HTML with washhtml by Frederic Motte