Changeset 320 in subversion


Ignore:
Timestamp:
Aug 18, 2006 8:48:33 AM (7 years ago)
Author:
thomasb
Message:

Re-built message parsing (Bug #1327068)

Location:
trunk/roundcubemail/program
Files:
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/roundcubemail/program/include/main.inc

    r314 r320  
    17891789function console($msg) 
    17901790  { 
    1791   if (is_string($msg)) 
     1791  if (!is_string($msg)) 
    17921792    $msg = var_export($msg, true); 
    17931793 
  • trunk/roundcubemail/program/include/rcube_imap.inc

    r305 r320  
    710710     
    711711   
    712   // return sorted array of message UIDs 
     712  /** 
     713   * Return sorted array of message UIDs 
     714   * 
     715   * @param string Mailbox to get index from 
     716   * @param string Sort column 
     717   * @param string Sort order [ASC, DESC] 
     718   * @return array Indexed array with message ids 
     719   */ 
    713720  function message_index($mbox_name='', $sort_field=NULL, $sort_order=NULL) 
    714721    { 
     
    781788      if ($cache_index[$id] == $uid) 
    782789        { 
    783 // console("$id / $uid: OK"); 
    784790        unset($cache_index[$id]); 
    785791        continue; 
     
    789795      if (in_array((string)$uid, $cache_index, TRUE)) 
    790796        { 
    791 // console("$id / $uid: Moved"); 
    792797        unset($cache_index[$id]);         
    793798        } 
     
    796801      if (isset($cache_index[$id])) 
    797802        { 
    798 // console("$id / $uid: Delete"); 
    799803        $this->remove_message_cache($cache_key, $id); 
    800804        unset($cache_index[$id]); 
    801805        } 
    802806         
    803  
    804 // console("$id / $uid: Add"); 
    805807 
    806808      // fetch complete headers and add to cache 
     
    868870 
    869871 
     872  /** 
     873   * Return message headers object of a specific message 
     874   * 
     875   * @param int     Message ID 
     876   * @param string  Mailbox to read from  
     877   * @param boolean True if $id is the message UID 
     878   * @return object Message headers representation 
     879   */ 
    870880  function get_headers($id, $mbox_name=NULL, $is_uid=TRUE) 
    871881    { 
    872882    $mailbox = $mbox_name ? $this->_mod_mailbox($mbox_name) : $this->mailbox; 
     883    $uid = $is_uid ? $id : $this->_id2uid($id); 
    873884 
    874885    // get cached headers 
    875     if ($is_uid && ($headers = $this->get_cached_message($mailbox.'.msg', $id))) 
     886    if ($uid && ($headers = $this->get_cached_message($mailbox.'.msg', $uid))) 
    876887      return $headers; 
    877888 
     
    887898 
    888899 
    889   function get_body($uid, $part=1) 
     900  /** 
     901   * Fetch body structure from the IMAP server and build 
     902   * an object structure similar to the one generated by PEAR::Mail_mimeDecode 
     903   * 
     904   * @param Int Message UID to fetch 
     905   * @return object Standard object tree or False on failure 
     906   */ 
     907  function &get_structure($uid) 
    890908    { 
    891909    if (!($msg_id = $this->_uid2id($uid))) 
     
    894912        $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id);  
    895913        $structure = iml_GetRawStructureArray($structure_str); 
    896     $body = iil_C_FetchPartBody($this->conn, $this->mailbox, $msg_id, $part); 
    897  
    898     $encoding = iml_GetPartEncodingCode($structure, $part); 
    899      
    900     if ($encoding==3) $body = $this->mime_decode($body, 'base64'); 
    901     else if ($encoding==4) $body = $this->mime_decode($body, 'quoted-printable'); 
    902  
    903     return $body; 
    904     } 
    905  
    906  
    907   function get_raw_body($uid) 
     914        $struct = false; 
     915         
     916    // parse structure and add headers 
     917    if (!empty($structure)) 
     918      { 
     919      $this->_msg_id = $msg_id; 
     920      $headers = $this->get_headers($msg_id, NULL, FALSE); 
     921       
     922      $struct = &$this->_structure_part($structure); 
     923      $struct->headers = get_object_vars($headers); 
     924       
     925      // don't trust given content-type 
     926      if (empty($struct->parts)) 
     927        { 
     928        $struct->mime_id = '1'; 
     929        $struct->mimetype = strtolower($struct->headers['ctype']); 
     930        list($struct->ctype_primary, $struct->ctype_secondary) = explode('/', $struct->mimetype); 
     931        } 
     932      } 
     933         
     934        return $struct; 
     935        } 
     936 
     937   
     938  /** 
     939   * Build message part object 
     940   * 
     941   * @access private 
     942   */ 
     943  function &_structure_part($part, $count=0, $parent='') 
     944    { 
     945    $struct = new rcube_message_part; 
     946    $struct->mime_id = empty($parent) ? (string)$count : "$parent.$count"; 
     947     
     948    // multipart 
     949    if (is_array($part[0])) 
     950      { 
     951      $struct->ctype_primary = 'multipart'; 
     952       
     953      // find first non-array entry 
     954      for ($i=1; count($part); $i++) 
     955        if (!is_array($part[$i])) 
     956          { 
     957          $struct->ctype_secondary = strtolower($part[$i]); 
     958          break; 
     959          } 
     960           
     961      $struct->mimetype = 'multipart/'.$struct->ctype_secondary; 
     962 
     963      $struct->parts = array(); 
     964      for ($i=0, $count=0; $i<count($part); $i++) 
     965        if (is_array($part[$i]) && count($part[$i]) > 5) 
     966          $struct->parts[] = $this->_structure_part($part[$i], ++$count, $struct->mime_id); 
     967 
     968      return $struct;       
     969      } 
     970     
     971     
     972    // regular part 
     973    $struct->ctype_primary = strtolower($part[0]); 
     974    $struct->ctype_secondary = strtolower($part[1]); 
     975    $struct->mimetype = $struct->ctype_primary.'/'.$struct->ctype_secondary; 
     976         
     977    // read content type parameters 
     978        if (is_array($part[2])) 
     979          { 
     980          $struct->ctype_parameters = array(); 
     981      for ($i=0; $i<count($part[2]); $i+=2) 
     982        $struct->ctype_parameters[strtolower($part[2][$i])] = $part[2][$i+1]; 
     983         
     984      if (isset($struct->ctype_parameters['charset'])) 
     985        $struct->charset = $struct->ctype_parameters['charset']; 
     986          } 
     987           
     988        // read content encoding 
     989        if (!empty($part[5]) && $part[5]!='NIL') 
     990          { 
     991          $struct->encoding = strtolower($part[5]); 
     992          $struct->headers['content-transfer-encoding'] = $struct->encoding; 
     993          } 
     994           
     995        // get part size 
     996        if (!empty($part[6]) && $part[6]!='NIL') 
     997          $struct->size = intval($part[6]); 
     998 
     999        // read part disposition 
     1000    $di = count($part) - 3; 
     1001    if (is_array($part[$di])) 
     1002      { 
     1003      $struct->disposition = strtolower($part[$di][0]); 
     1004 
     1005      if (is_array($part[$di][1])) 
     1006        for ($n=0; $n<count($part[$di][1]); $n+=2) 
     1007          $struct->d_parameters[strtolower($part[$di][1][$n])] = $part[$di][1][$n+1]; 
     1008      } 
     1009       
     1010    // get child parts 
     1011    if (is_array($part[8]) && $di != 8) 
     1012      { 
     1013      $struct->parts = array(); 
     1014      for ($i=0, $count=0; $i<count($part[8]); $i++) 
     1015        if (is_array($part[8][$i]) && count($part[8][$i]) > 5) 
     1016          $struct->parts[] = $this->_structure_part($part[8][$i], ++$count, $struct->mime_id); 
     1017      } 
     1018       
     1019        // get part ID 
     1020        if (!empty($part[3]) && $part[3]!='NIL') 
     1021          { 
     1022          $struct->content_id = $part[3]; 
     1023          $struct->headers['content-id'] = $part[3]; 
     1024           
     1025          if (empty($struct->disposition)) 
     1026            $struct->disposition = 'inline'; 
     1027          } 
     1028 
     1029    // fetch message headers if message/rfc822 
     1030    if ($struct->ctype_primary=='message') 
     1031      { 
     1032      $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); 
     1033      $struct->headers = $this->_parse_headers($headers); 
     1034      } 
     1035   
     1036        return $struct; 
     1037    } 
     1038     
     1039   
     1040  /** 
     1041   * Return a flat array with references to all parts, indexed by part numbmers 
     1042   * 
     1043   * @param object Message body structure 
     1044   * @return Array with part number -> object pairs 
     1045   */ 
     1046  function get_mime_numbers(&$structure) 
     1047    { 
     1048    $a_parts = array(); 
     1049    $this->_get_part_numbers($structure, $a_parts); 
     1050    return $a_parts; 
     1051    } 
     1052   
     1053   
     1054  /** 
     1055   * Helper method for recursive calls 
     1056   * 
     1057   * @access  
     1058   */ 
     1059  function _get_part_numbers(&$part, &$a_parts) 
     1060    { 
     1061    if ($part->mime_id) 
     1062      $a_parts[$part->mime_id] = &$part; 
     1063       
     1064    if (is_array($part->parts)) 
     1065      for ($i=0; $i<count($part->parts); $i++) 
     1066        $this->_get_part_numbers($part->parts[$i], &$a_parts); 
     1067    } 
     1068   
     1069 
     1070  /** 
     1071   * Fetch message body of a specific message from the server 
     1072   * 
     1073   * @param  int    Message UID 
     1074   * @param  string Part number 
     1075   * @param  object Part object created by get_structure() 
     1076   * @param  mixed  True to print part, ressource to write part contents in 
     1077   * @return Message/part body if not printed 
     1078   */ 
     1079  function &get_message_part($uid, $part=1, $o_part=NULL, $print=NULL) 
    9081080    { 
    9091081    if (!($msg_id = $this->_uid2id($uid))) 
    9101082      return FALSE; 
     1083     
     1084    // get part encoding if not provided 
     1085    if (!is_object($o_part)) 
     1086      { 
     1087      $structure_str = iil_C_FetchStructureString($this->conn, $this->mailbox, $msg_id);  
     1088      $structure = iml_GetRawStructureArray($structure_str); 
     1089      $part_type = iml_GetPartTypeCode($structure, $part); 
     1090      $o_part = new rcube_message_part; 
     1091      $o_part->ctype_primary = $part_type==0 ? 'text' : ($part_type==2 ? 'message' : 'other'); 
     1092      $o_part->encoding = strtolower(iml_GetPartEncodingString($structure, $part)); 
     1093      $o_part->charset = iml_GetPartCharset($structure, $part); 
     1094      } 
     1095       
     1096    // TODO: Add caching for message parts 
     1097 
     1098    if ($print) 
     1099      { 
     1100      iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, ($o_part->encoding=='base64'?3:2)); 
     1101      $body = TRUE; 
     1102      } 
     1103    else 
     1104      { 
     1105      $body = iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, $part, 1); 
     1106 
     1107      // decode part body 
     1108      if ($o_part->encoding=='base64' || $o_part->encoding=='quoted-printable') 
     1109        $body = $this->mime_decode($body, $o_part->encoding); 
     1110 
     1111      // convert charset (if text or message part) 
     1112      if (!empty($o_part->charset) && ($o_part->ctype_primary=='text' || $o_part->ctype_primary=='message') && !stristr($body, 'charset=')) 
     1113        $body = rcube_charset_convert($body, $o_part->charset); 
     1114      } 
     1115 
     1116    return $body; 
     1117    } 
     1118 
     1119 
     1120  /** 
     1121   * Fetch message body of a specific message from the server 
     1122   * 
     1123   * @param  int    Message UID 
     1124   * @return Message/part body 
     1125   * @see    ::get_message_part() 
     1126   */ 
     1127  function &get_body($uid, $part=1) 
     1128    { 
     1129    return $this->get_message_part($uid, $part); 
     1130    } 
     1131 
     1132 
     1133  /** 
     1134   * Returns the whole message source as string 
     1135   * 
     1136   * @param int  Message UID 
     1137   * @return Message source string 
     1138   */ 
     1139  function &get_raw_body($uid) 
     1140    { 
     1141    if (!($msg_id = $this->_uid2id($uid))) 
     1142      return FALSE; 
    9111143 
    9121144        $body = iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL); 
     
    9151147    return $body;     
    9161148    } 
    917  
    918  
    919   // set message flag to one or several messages 
    920   // possible flags are: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT 
     1149     
     1150 
     1151  /** 
     1152   * Sends the whole message source to stdout 
     1153   * 
     1154   * @param int  Message UID 
     1155   */  
     1156  function print_raw_body($uid) 
     1157    { 
     1158    if (!($msg_id = $this->_uid2id($uid))) 
     1159      return FALSE; 
     1160 
     1161        print iil_C_FetchPartHeader($this->conn, $this->mailbox, $msg_id, NULL); 
     1162        flush(); 
     1163        iil_C_HandlePartBody($this->conn, $this->mailbox, $msg_id, NULL, 2); 
     1164    } 
     1165 
     1166 
     1167  /** 
     1168   * Set message flag to one or several messages 
     1169   * 
     1170   * @param mixed  Message UIDs as array or as comma-separated string 
     1171   * @param string Flag to set: SEEN, UNDELETED, DELETED, RECENT, ANSWERED, DRAFT 
     1172   * @return True on success, False on failure 
     1173   */ 
    9211174  function set_flag($uids, $flag) 
    9221175    { 
     
    15901843 
    15911844 
    1592   function get_cached_message($key, $uid, $body=FALSE) 
     1845  function &get_cached_message($key, $uid, $body=FALSE) 
    15931846    { 
    15941847    if (!$this->caching_enabled) 
     
    20492302 
    20502303 
     2304  // split RFC822 header string into an associative array 
     2305  function _parse_headers($headers) 
     2306    { 
     2307    $a_headers = array(); 
     2308    $lines = explode("\n", $headers); 
     2309    $c = count($lines); 
     2310    for ($i=0; $i<$c; $i++) 
     2311      { 
     2312      if ($p = strpos($lines[$i], ': ')) 
     2313        { 
     2314        $field = strtolower(substr($lines[$i], 0, $p)); 
     2315        $value = trim(substr($lines[$i], $p+1)); 
     2316        if (!empty($value)) 
     2317          $a_headers[$field] = $value; 
     2318        } 
     2319      } 
     2320     
     2321    return $a_headers; 
     2322    } 
     2323 
     2324 
    20512325  function _parse_address_list($str) 
    20522326    { 
     
    20932367  } 
    20942368 
     2369 
     2370/** 
     2371 * Class representing a message part 
     2372 */ 
     2373class rcube_message_part 
     2374{ 
     2375  var $mime_id = ''; 
     2376  var $ctype_primary = 'text'; 
     2377  var $ctype_secondary = 'plain'; 
     2378  var $mimetype = 'text/plain'; 
     2379  var $disposition = ''; 
     2380  var $encoding = '8bit'; 
     2381  var $charset = ''; 
     2382  var $size = 0; 
     2383  var $headers = array(); 
     2384  var $d_parameters = array(); 
     2385  var $ctype_parameters = array(); 
     2386 
     2387} 
    20952388 
    20962389 
     
    22342527  } 
    22352528 
     2529 
    22362530?> 
  • trunk/roundcubemail/program/include/rcube_shared.inc

    r288 r320  
    3434  var $script_tag_file = "<script type=\"text/javascript\" src=\"%s%s\"></script>\n"; 
    3535  var $script_tag      = "<script type=\"text/javascript\">\n<!--\n%s\n\n//-->\n</script>\n"; 
    36   var $default_template = "<html>\n<body></body>\n</html>"; 
     36  var $default_template = "<html>\n<head><title></title></head>\n<body></body>\n</html>"; 
    3737   
    3838  var $title = ''; 
     
    117117    { 
    118118    $output = empty($templ) ? $this->default_template : trim($templ); 
    119    
     119     
    120120    // set default page title 
    121121    if (!strlen($this->title)) 
  • trunk/roundcubemail/program/steps/mail/compose.inc

    r297 r320  
    2020*/ 
    2121 
    22  
    2322require_once('Mail/mimeDecode.php'); 
     23 
     24// define constants for message compose mode 
     25define('RCUBE_COMPOSE_REPLY', 0x0106); 
     26define('RCUBE_COMPOSE_FORWARD', 0x0107); 
     27define('RCUBE_COMPOSE_DRAFT', 0x0108); 
     28 
    2429 
    2530// remove an attachment 
     
    3944 
    4045$MESSAGE_FORM = NULL; 
    41 $REPLY_MESSAGE = NULL; 
    42 $FORWARD_MESSAGE = NULL; 
    43 $DRAFT_MESSAGE = NULL; 
     46$MESSAGE = NULL; 
    4447 
    4548// nothing below is called during message composition, only at "new/forward/reply/draft" initialization 
     
    5457 
    5558 
    56 if ($_GET['_reply_uid'] || $_GET['_forward_uid'] || $_GET['_draft_uid']) 
    57   { 
    58   $msg_uid = ($_GET['_reply_uid'] ? $_GET['_reply_uid'] : ($_GET['_forward_uid'] ? $_GET['_forward_uid'] : $_GET['_draft_uid'])); 
    59  
     59// get reference message and set compose mode 
     60if ($msg_uid = get_input_value('_reply_uid', RCUBE_INPUT_GET)) 
     61  $compose_mode = RCUBE_COMPOSE_REPLY; 
     62else if ($msg_uid = get_input_value('_forward_uid', RCUBE_INPUT_GET)) 
     63  $compose_mode = RCUBE_COMPOSE_FORWARD; 
     64else if ($msg_uid = get_input_value('_draft_uid', RCUBE_INPUT_GET)) 
     65  $compose_mode = RCUBE_COMPOSE_DRAFT; 
     66 
     67 
     68if (!empty($msg_uid)) 
     69  { 
    6070  // similar as in program/steps/mail/show.inc 
    61   $MESSAGE = array(); 
    62   $MESSAGE['headers'] = $IMAP->get_headers($msg_uid); 
    63    
    64   $MESSAGE['source'] = rcmail_message_source($msg_uid); 
    65    
    66   $mmd = new Mail_mimeDecode($MESSAGE['source']); 
    67   $MESSAGE['structure'] = $mmd->decode(array('include_bodies' => TRUE, 
    68                                              'decode_headers' => TRUE, 
    69                                              'decode_bodies' => FALSE)); 
    70  
     71  $MESSAGE = array('UID' => $msg_uid); 
     72  $MESSAGE['headers'] = &$IMAP->get_headers($msg_uid); 
     73  $MESSAGE['structure'] = &$IMAP->get_structure($msg_uid);   
    7174  $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); 
    72   $MESSAGE['parts'] = $mmd->getMimeNumbers($MESSAGE['structure']); 
    73  
    74   if ($_GET['_reply_uid']) 
    75     { 
    76     $REPLY_MESSAGE = &$MESSAGE; 
    77     $_SESSION['compose']['reply_uid'] = $_GET['_reply_uid']; 
    78     $_SESSION['compose']['reply_msgid'] = $REPLY_MESSAGE['headers']->messageID; 
    79     $_SESSION['compose']['references']  = $REPLY_MESSAGE['headers']->reference; 
    80     $_SESSION['compose']['references'] .= !empty($REPLY_MESSAGE['headers']->reference) ? ' ' : ''; 
    81     $_SESSION['compose']['references'] .= $REPLY_MESSAGE['headers']->messageID; 
    82  
    83     if ($_GET['_all']) 
    84       $REPLY_MESSAGE['reply_all'] = 1; 
    85  
    86     } 
    87   else if ($_GET['_forward_uid']) 
    88     { 
    89     $FORWARD_MESSAGE = $MESSAGE; 
    90     $_SESSION['compose']['forward_uid'] = $_GET['_forward_uid']; 
    91     } 
    92   else 
    93     { 
    94     $DRAFT_MESSAGE = $MESSAGE; 
    95     $_SESSION['compose']['draft_uid'] = $_GET['_draft_uid']; 
     75  $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']); 
     76 
     77  if ($compose_mode == RCUBE_COMPOSE_REPLY) 
     78    { 
     79    $_SESSION['compose']['reply_uid'] = $msg_uid; 
     80    $_SESSION['compose']['reply_msgid'] = $MESSAGE['headers']->messageID; 
     81    $_SESSION['compose']['references']  = $MESSAGE['headers']->reference; 
     82    $_SESSION['compose']['references'] .= !empty($MESSAGE['headers']->reference) ? ' ' : ''; 
     83    $_SESSION['compose']['references'] .= $MESSAGE['headers']->messageID; 
     84 
     85    if (!empty($_GET['_all'])) 
     86      $MESSAGE['reply_all'] = 1; 
     87    } 
     88  else if ($compose_mode == RCUBE_COMPOSE_FORWARD) 
     89    { 
     90    $_SESSION['compose']['forward_uid'] = $msg_uid; 
     91    } 
     92  else if ($compose_mode == RCUBE_COMPOSE_DRAFT) 
     93    { 
     94    $_SESSION['compose']['draft_uid'] = $msg_uid; 
    9695    } 
    9796 
     
    103102function rcmail_compose_headers($attrib) 
    104103  { 
    105   global $IMAP, $REPLY_MESSAGE, $DRAFT_MESSAGE, $DB; 
     104  global $IMAP, $MESSAGE, $DB, $compose_mode; 
    106105  static $sa_recipients = array(); 
    107106 
     
    138137        } 
    139138      else if (!empty($_GET['_to'])) 
    140         $fvalue = $_GET['_to']; 
     139        $fvalue = get_input_value('_to', RCUBE_INPUT_GET); 
    141140         
    142141    case 'cc': 
     
    165164  if ($fname && !empty($_POST[$fname])) 
    166165    $fvalue = get_input_value($fname, RCUBE_INPUT_POST, TRUE); 
    167   else if ($header && is_object($REPLY_MESSAGE['headers'])) 
     166 
     167  else if ($header && $compose_mode == RCUBE_COMPOSE_REPLY) 
    168168    { 
    169169    // get recipent address(es) out of the message headers 
    170     if ($header=='to' && $REPLY_MESSAGE['headers']->replyto) 
    171       $fvalue = $IMAP->decode_header($REPLY_MESSAGE['headers']->replyto); 
    172  
    173     else if ($header=='to' && $REPLY_MESSAGE['headers']->from) 
    174       $fvalue = $IMAP->decode_header($REPLY_MESSAGE['headers']->from); 
     170    if ($header=='to' && !empty($MESSAGE['headers']->replyto)) 
     171      $fvalue = $IMAP->decode_header($MESSAGE['headers']->replyto); 
     172 
     173    else if ($header=='to' && !empty($MESSAGE['headers']->from)) 
     174      $fvalue = $IMAP->decode_header($MESSAGE['headers']->from); 
    175175 
    176176    // add recipent of original message if reply to all 
    177     else if ($header=='cc' && $REPLY_MESSAGE['reply_all']) 
     177    else if ($header=='cc' && !empty($MESSAGE['reply_all'])) 
    178178      { 
    179       if ($IMAP->decode_header($REPLY_MESSAGE['headers']->to)) 
    180         $fvalue .= $IMAP->decode_header($REPLY_MESSAGE['headers']->to); 
    181  
    182       if ($IMAP->decode_header($REPLY_MESSAGE['headers']->cc)) 
    183         { 
    184         if($fvalue) 
    185           $fvalue .= ', '; 
    186  
    187         $fvalue .= $IMAP->decode_header($REPLY_MESSAGE['headers']->cc); 
    188         } 
     179      if ($v = $IMAP->decode_header($MESSAGE['headers']->to)) 
     180        $fvalue .= $v; 
     181 
     182      if ($v = $IMAP->decode_header($MESSAGE['headers']->cc)) 
     183        $fvalue .= (!empty($fvalue) ? ', ' : '') . $v; 
    189184      } 
    190185 
     
    196191      foreach ($to_addresses as $addr_part) 
    197192        { 
    198         if (!in_array($addr_part['mailto'], $sa_recipients) && (!$REPLY_MESSAGE['FROM'] || !in_array($addr_part['mailto'], $REPLY_MESSAGE['FROM']))) 
     193        if (!in_array($addr_part['mailto'], $sa_recipients) && (!$MESSAGE['FROM'] || !in_array($addr_part['mailto'], $MESSAGE['FROM']))) 
    199194          { 
    200195          $fvalue .= (strlen($fvalue) ? ', ':'').$addr_part['string']; 
     
    204199      } 
    205200    } 
    206   else if ($header && is_object($DRAFT_MESSAGE['headers'])) 
     201  else if ($header && $compose_mode == RCUBE_COMPOSE_DRAFT) 
    207202    { 
    208203    // get drafted headers 
    209     if ($header=='to' && $DRAFT_MESSAGE['headers']->to) 
    210       $fvalue = $IMAP->decode_header($DRAFT_MESSAGE['headers']->to); 
    211  
    212     if ($header=='cc' && $DRAFT_MESSAGE['headers']->cc) 
    213       $fvalue = $IMAP->decode_header($DRAFT_MESSAGE['headers']->cc); 
    214  
    215     if ($header=='bcc' && $DRAFT_MESSAGE['headers']->bcc) 
    216       $fvalue = $IMAP->decode_header($DRAFT_MESSAGE['headers']->bcc); 
     204    if ($header=='to' && !empty($MESSAGE['headers']->to)) 
     205      $fvalue = $IMAP->decode_header($MESSAGE['headers']->to); 
     206 
     207    if ($header=='cc' && !empty($MESSAGE['headers']->cc)) 
     208      $fvalue = $IMAP->decode_header($MESSAGE['headers']->cc); 
     209 
     210    if ($header=='bcc' && !empty($MESSAGE['headers']->bcc)) 
     211      $fvalue = $IMAP->decode_header($MESSAGE['headers']->bcc); 
    217212 
    218213    } 
     
    242237function rcmail_compose_header_from($attrib) 
    243238  { 
    244   global $IMAP, $REPLY_MESSAGE, $DRAFT_MESSAGE, $DB, $OUTPUT, $JS_OBJECT_NAME; 
     239  global $IMAP, $MESSAGE, $DB, $OUTPUT, $JS_OBJECT_NAME, $compose_mode; 
    245240     
    246241  // pass the following attributes to the form class 
     
    252247  // extract all recipients of the reply-message 
    253248  $a_recipients = array(); 
    254   if ($REPLY_MESSAGE && is_object($REPLY_MESSAGE['headers'])) 
    255     { 
    256     $REPLY_MESSAGE['FROM'] = array(); 
    257  
    258     $a_to = $IMAP->decode_address_list($REPLY_MESSAGE['headers']->to);         
     249  if ($compose_mode == RCUBE_COMPOSE_REPLY && is_object($MESSAGE['headers'])) 
     250    { 
     251    $MESSAGE['FROM'] = array(); 
     252 
     253    $a_to = $IMAP->decode_address_list($MESSAGE['headers']->to);         
    259254    foreach ($a_to as $addr) 
    260255      { 
     
    263258      } 
    264259 
    265     if (!empty($REPLY_MESSAGE['headers']->cc)) 
     260    if (!empty($MESSAGE['headers']->cc)) 
    266261      { 
    267       $a_cc = $IMAP->decode_address_list($REPLY_MESSAGE['headers']->cc); 
     262      $a_cc = $IMAP->decode_address_list($MESSAGE['headers']->cc); 
    268263      foreach ($a_cc as $addr) 
    269264        { 
     
    302297        $from_id = $sql_arr['identity_id']; 
    303298         
    304       if ($REPLY_MESSAGE && is_array($REPLY_MESSAGE['FROM'])) 
    305         $REPLY_MESSAGE['FROM'][] = $sql_arr['email']; 
    306  
    307       if (strstr($DRAFT_MESSAGE['headers']->from,$sql_arr['email'])) 
     299      if ($compose_mode == RCUBE_COMPOSE_REPLY && is_array($MESSAGE['FROM'])) 
     300        $MESSAGE['FROM'][] = $sql_arr['email']; 
     301 
     302      if ($compose_mode == RCUBE_COMPOSE_DRAFT && strstr($MESSAGE['headers']->from, $sql_arr['email'])) 
    308303        $from_id = $sql_arr['identity_id']; 
    309304 
     
    312307    // overwrite identity selection with post parameter 
    313308    if (isset($_POST['_from'])) 
    314       $from_id = $_POST['_from']; 
     309      $from_id = get_input_value('_from', RCUBE_INPUT_POST); 
    315310 
    316311    $out = $select_from->show($from_id); 
     
    336331function rcmail_compose_body($attrib) 
    337332  { 
    338   global $CONFIG, $OUTPUT, $REPLY_MESSAGE, $FORWARD_MESSAGE, $DRAFT_MESSAGE, $JS_OBJECT_NAME; 
     333  global $CONFIG, $OUTPUT, $MESSAGE, $JS_OBJECT_NAME, $compose_mode; 
    339334   
    340335  list($form_start, $form_end) = get_form_tags($attrib); 
     
    354349     
    355350  // compose reply-body 
    356   else if (is_array($REPLY_MESSAGE['parts'])) 
    357     { 
    358     $body = rcmail_first_text_part($REPLY_MESSAGE['parts']); 
     351  else if ($compose_mode == RCUBE_COMPOSE_REPLY) 
     352    { 
     353    $body = rcmail_first_text_part($MESSAGE); 
    359354    if (strlen($body)) 
    360355      $body = rcmail_create_reply_body($body); 
     
    362357 
    363358  // forward message body inline 
    364   else if (is_array($FORWARD_MESSAGE['parts'])) 
    365     { 
    366     $body = rcmail_first_text_part($FORWARD_MESSAGE['parts']); 
     359  else if ($compose_mode == RCUBE_COMPOSE_FORWARD) 
     360    { 
     361    $body = rcmail_first_text_part($MESSAGE); 
    367362    if (strlen($body)) 
    368363      $body = rcmail_create_forward_body($body); 
     
    370365 
    371366  // forward message body inline 
    372   else if (is_array($DRAFT_MESSAGE['parts'])) 
    373     { 
    374     $body = rcmail_first_text_part($DRAFT_MESSAGE['parts']); 
     367  else if ($compose_mode == RCUBE_COMPOSE_DRAFT) 
     368    { 
     369    $body = rcmail_first_text_part($MESSAGE); 
    375370    if (strlen($body)) 
    376371      $body = rcmail_create_draft_body($body); 
     
    379374  $out = $form_start ? "$form_start\n" : ''; 
    380375 
    381   $saveid = new hiddenfield(array('name' => '_draft_saveid', 'value' => str_replace(array('<','>'),"",$DRAFT_MESSAGE['headers']->messageID) )); 
     376  $saveid = new hiddenfield(array('name' => '_draft_saveid', 'value' => str_replace(array('<','>'),"",$MESSAGE['headers']->messageID) )); 
    382377  $out .= $saveid->show(); 
    383378 
     
    420415function rcmail_create_reply_body($body) 
    421416  { 
    422   global $IMAP, $REPLY_MESSAGE; 
     417  global $IMAP, $MESSAGE; 
    423418 
    424419  // soft-wrap message first 
     
    441436  // add title line 
    442437  $pefix = sprintf("\n\n\nOn %s, %s wrote:\n", 
    443            $REPLY_MESSAGE['headers']->date, 
    444            $IMAP->decode_header($REPLY_MESSAGE['headers']->from)); 
     438           $MESSAGE['headers']->date, 
     439           $IMAP->decode_header($MESSAGE['headers']->from)); 
    445440            
    446441 
     
    458453function rcmail_create_forward_body($body) 
    459454  { 
    460   global $IMAP, $FORWARD_MESSAGE; 
     455  global $IMAP, $MESSAGE; 
    461456 
    462457  // soft-wrap message first 
     
    464459   
    465460  $prefix = sprintf("\n\n\n-------- Original Message --------\nSubject: %s\nDate: %s\nFrom: %s\nTo: %s\n\n", 
    466                    $FORWARD_MESSAGE['subject'], 
    467                    $FORWARD_MESSAGE['headers']->date, 
    468                    $IMAP->decode_header($FORWARD_MESSAGE['headers']->from), 
    469                    $IMAP->decode_header($FORWARD_MESSAGE['headers']->to)); 
    470  
     461                   $MESSAGE['subject'], 
     462                   $MESSAGE['headers']->date, 
     463                   $IMAP->decode_header($MESSAGE['headers']->from), 
     464                   $IMAP->decode_header($MESSAGE['headers']->to)); 
     465                    
    471466  // add attachments 
    472   if (!isset($_SESSION['compose']['forward_attachments']) && is_array($FORWARD_MESSAGE['parts']) && sizeof($FORWARD_MESSAGE['parts'])>1) 
    473     { 
    474     $temp_dir = rcmail_create_compose_tempdir(); 
    475  
    476     if (!is_array($_SESSION['compose']['attachments'])) 
    477       $_SESSION['compose']['attachments'] = array(); 
    478    
    479     foreach ($FORWARD_MESSAGE['parts'] as $part) 
     467  if (!isset($_SESSION['compose']['forward_attachments']) && 
     468      is_array($MESSAGE['parts']) && sizeof($MESSAGE['parts'])>1) 
     469    rcmail_write_compose_attachments($MESSAGE); 
     470 
     471  return $prefix.$body; 
     472  } 
     473 
     474 
     475function rcmail_create_draft_body($body) 
     476  { 
     477  global $IMAP, $MESSAGE; 
     478     
     479  // add attachments 
     480  if (!isset($_SESSION['compose']['forward_attachments']) && 
     481      is_array($MESSAGE['parts']) && sizeof($MESSAGE['parts'])>1) 
     482    rcmail_write_compose_attachments($MESSAGE); 
     483 
     484  return $body; 
     485  } 
     486   
     487   
     488function rcmail_write_compose_attachments(&$message) 
     489  { 
     490  global $IMAP; 
     491     
     492  $temp_dir = rcmail_create_compose_tempdir(); 
     493 
     494  if (!is_array($_SESSION['compose']['attachments'])) 
     495    $_SESSION['compose']['attachments'] = array(); 
     496   
     497  foreach ($message['parts'] as $pid => $part) 
     498    { 
     499    if ($part->ctype_primary != 'message' && $part->ctype_primary != 'text' && 
     500        ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] || 
     501         (empty($part->disposition) && ($part->d_parameters['filename'] || $part->ctype_parameters['name'])))) 
    480502      { 
    481       if ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] || 
    482                (empty($part->disposition) && ($part->d_parameters['filename'] || $part->ctype_parameters['name']))) 
     503      $tmp_path = tempnam($temp_dir, 'rcmAttmnt'); 
     504      if ($fp = fopen($tmp_path, 'w')) 
    483505        { 
    484         $tmp_path = tempnam($temp_dir, 'rcmAttmnt'); 
    485         if ($fp = fopen($tmp_path, 'w')) 
    486           { 
    487           fwrite($fp, $IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding'])); 
    488           fclose($fp); 
    489  
    490           if ($part->d_parameters['filename']) 
    491             $_SESSION['compose']['attachments'][] = array('name' => $part->d_parameters['filename'], 
    492                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    493                                                           'path' => $tmp_path); 
    494                                     
    495           else if ($part->ctype_parameters['name']) 
    496             $_SESSION['compose']['attachments'][] = array('name' => $part->ctype_parameters['name'], 
    497                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    498                                                           'path' => $tmp_path); 
    499                                                            
    500           else if ($part->headers['content-description']) 
    501             $_SESSION['compose']['attachments'][] = array('name' => $part->headers['content-description'], 
    502                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    503                                                           'path' => $tmp_path); 
    504           } 
    505         } 
    506       } 
    507  
    508     $_SESSION['compose']['forward_attachments'] = TRUE; 
    509     } 
    510  
    511   return $prefix.$body; 
    512   } 
    513  
    514 function rcmail_create_draft_body($body) 
    515   { 
    516   global $IMAP, $DRAFT_MESSAGE; 
    517      
    518   // add attachments 
    519   if (!isset($_SESSION['compose']['forward_attachments']) && is_array($DRAFT_MESSAGE['parts']) && sizeof($DRAFT_MESSAGE['parts'])>1) 
    520     {  
    521     $temp_dir = rcmail_create_compose_tempdir(); 
    522  
    523     if (!is_array($_SESSION['compose']['attachments'])) 
    524       $_SESSION['compose']['attachments'] = array(); 
    525    
    526     foreach ($DRAFT_MESSAGE['parts'] as $part) 
    527       { 
    528       if ($part->disposition=='attachment' || $part->disposition=='inline' || $part->headers['content-id'] || 
    529                (empty($part->disposition) && ($part->d_parameters['filename'] || $part->ctype_parameters['name']))) 
    530         { 
    531         $tmp_path = tempnam($temp_dir, 'rcmAttmnt'); 
    532         if ($fp = fopen($tmp_path, 'w')) 
    533           {                      
    534           fwrite($fp, $IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding'])); 
    535           fclose($fp);           
    536                                  
    537           if ($part->d_parameters['filename']) 
    538             $_SESSION['compose']['attachments'][] = array('name' => $part->d_parameters['filename'], 
    539                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    540                                                           'path' => $tmp_path); 
    541  
    542           else if ($part->ctype_parameters['name']) 
    543             $_SESSION['compose']['attachments'][] = array('name' => $part->ctype_parameters['name'], 
    544                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    545                                                           'path' => $tmp_path); 
    546  
    547           else if ($part->headers['content-description']) 
    548             $_SESSION['compose']['attachments'][] = array('name' => $part->headers['content-description'], 
    549                                                           'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
    550                                                           'path' => $tmp_path); 
    551           } 
     506        fwrite($fp, $IMAP->get_message_part($message['UID'], $pid, $part->encoding)); 
     507        fclose($fp); 
     508         
     509        $filename = !empty($part->d_parameters['filename']) ? $part->d_parameters['filename'] : 
     510                     (!empty($part->ctype_parameters['name']) ? $part->ctype_parameters['name'] : 
     511                      (!empty($part->headers['content-description']) ? $part->headers['content-description'] : 'file')); 
     512 
     513        $_SESSION['compose']['attachments'][] = array( 
     514          'name' => rcube_imap::decode_mime_string($filename), 
     515          'mimetype' => $part->ctype_primary . '/' . $part->ctype_secondary, 
     516          'path' => $tmp_path 
     517          ); 
    552518        } 
    553519      } 
    554  
    555     $_SESSION['compose']['forward_attachments'] = TRUE; 
    556     } 
    557  
    558   return $body; 
     520    } 
     521         
     522  $_SESSION['compose']['forward_attachments'] = TRUE; 
    559523  } 
    560524 
     
    562526function rcmail_compose_subject($attrib) 
    563527  { 
    564   global $CONFIG, $REPLY_MESSAGE, $FORWARD_MESSAGE, $DRAFT_MESSAGE; 
     528  global $CONFIG, $MESSAGE, $compose_mode; 
    565529   
    566530  list($form_start, $form_end) = get_form_tags($attrib); 
     
    577541     
    578542  // create a reply-subject 
    579   else if (isset($REPLY_MESSAGE['subject'])) 
    580     { 
    581     if (eregi('^re:', $REPLY_MESSAGE['subject'])) 
    582       $subject = $REPLY_MESSAGE['subject']; 
     543  else if ($compose_mode == RCUBE_COMPOSE_REPLY) 
     544    { 
     545    if (eregi('^re:', $MESSAGE['subject'])) 
     546      $subject = $MESSAGE['subject']; 
    583547    else 
    584       $subject = 'Re: '.$REPLY_MESSAGE['subject']; 
     548      $subject = 'Re: '.$MESSAGE['subject']; 
    585549    } 
    586550 
    587551  // create a forward-subject 
    588   else if (isset($FORWARD_MESSAGE['subject'])) 
    589     { 
    590     if (eregi('^fwd:', $REPLY_MESSAGE['subject'])) 
    591       $subject = $FORWARD_MESSAGE['subject']; 
     552  else if ($compose_mode == RCUBE_COMPOSE_FORWARD) 
     553    { 
     554    if (eregi('^fwd:', $MESSAGE['subject'])) 
     555      $subject = $MESSAGE['subject']; 
    592556    else 
    593       $subject = 'Fwd: '.$FORWARD_MESSAGE['subject']; 
     557      $subject = 'Fwd: '.$MESSAGE['subject']; 
    594558    } 
    595559 
    596560  // creeate a draft-subject 
    597   else if (isset($DRAFT_MESSAGE['subject'])) 
    598     $subject = $DRAFT_MESSAGE['subject']; 
     561  else if ($compose_mode == RCUBE_COMPOSE_DRAFT) 
     562    $subject = $MESSAGE['subject']; 
    599563   
    600564  $out = $form_start ? "$form_start\n" : ''; 
  • trunk/roundcubemail/program/steps/mail/func.inc

    r314 r320  
    428428     
    429429        // set attachment icon 
    430     if ($attrib['attachmenticon'] && preg_match("/multipart\/m/i", $header->ctype)) 
     430    if ($attrib['attachmenticon'] && preg_match("/multipart\/[mr]/i", $header->ctype)) 
    431431      $attach_icon = $attrib['attachmenticon']; 
    432432         
     
    529529      { 
    530530      if ($col=='from' || $col=='to') 
    531         $cont = rep_specialchars_output(rcmail_address_string($header->$col, 3)); 
     531        $cont = rep_specialchars_output(rcmail_address_string($header->$col, 3), 'html'); 
    532532      else if ($col=='subject') 
    533533        $cont = rep_specialchars_output($IMAP->decode_header($header->$col), 'html', 'all'); 
     
    663663 
    664664 
    665 function rcmail_print_body($part, $safe=FALSE, $plain=FALSE) // $body, $ctype_primary='text', $ctype_secondary='plain', $encoding='7bit', $safe=FALSE, $plain=FALSE) 
     665function rcmail_print_body($part, $safe=FALSE, $plain=FALSE) 
    666666  { 
    667667  global $IMAP, $REMOTE_OBJECTS, $JS_OBJECT_NAME; 
    668  
    669   // extract part properties: body, ctype_primary, ctype_secondary, encoding, parameters 
    670   extract($part); 
    671    
    672   $block = $plain ? '%s' : '%s'; //'<div style="display:block;">%s</div>'; 
    673   $body = $IMAP->mime_decode($body, $encoding);   
    674   $body = $IMAP->charset_decode($body, $parameters); 
    675  
     668   
     669  $body = is_array($part->replaces) ? strtr($part->body, $part->replaces) : $part->body; 
     670   
    676671  // text/html 
    677   if ($ctype_secondary=='html') 
     672  if ($part->ctype_secondary=='html') 
    678673    { 
    679674    if (!$safe)  // remove remote images and scripts 
     
    708703      } 
    709704 
    710     return sprintf($block, rep_specialchars_output($body, 'html', '', FALSE)); 
     705    return rep_specialchars_output($body, 'html', '', FALSE); 
    711706    } 
    712707 
    713708  // text/enriched 
    714   if ($ctype_secondary=='enriched') 
    715     { 
    716     $body = enriched_to_html($body); 
    717     return sprintf($block, rep_specialchars_output($body, 'html')); 
     709  if ($part->ctype_secondary=='enriched') 
     710    { 
     711    return rep_specialchars_output(enriched_to_html($body), 'html'); 
    718712    } 
    719713  else 
     
    765759    $body = preg_replace("/##string_replacement\{([0-9]+)\}##/e", "\$replace_strings[\\1]", join("\n", $a_lines)); 
    766760     
    767     return sprintf($block, "<pre>\n".$body."\n</pre>"); 
     761    return "<pre>\n".$body."\n</pre>"; 
    768762    } 
    769763  } 
     
    780774 
    781775 
    782 function rcmail_parse_message($structure, $arg=array(), $recursive=FALSE) 
     776function rcmail_parse_message(&$structure, $arg=array(), $recursive=FALSE) 
    783777  { 
    784778  global $IMAP; 
     
    797791  // show message headers 
    798792  if ($recursive && is_array($structure->headers) && isset($structure->headers['subject'])) 
    799     $a_return_parts[] = array('type' => 'headers', 
    800                               'headers' => $structure->headers); 
     793    { 
     794    $c = new stdClass; 
     795    $c->type = 'headers'; 
     796    $c->headers = &$structure->headers; 
     797    $a_return_parts[] = $c; 
     798    } 
    801799 
    802800  // print body if message doesn't have multiple parts 
    803801  if ($message_ctype_primary=='text') 
    804802    { 
    805     $a_return_parts[] = array('type' => 'content', 
    806                               'body' => $structure->body, 
    807                               'ctype_primary' => $message_ctype_primary, 
    808                               'ctype_secondary' => $message_ctype_secondary, 
    809                               'parameters' => $structure->ctype_parameters, 
    810                               'encoding' => $structure->headers['content-transfer-encoding']); 
     803    $structure->type = 'content'; 
     804    $a_return_parts[] = &$structure; 
    811805    } 
    812806 
     
    843837    // print html/plain part 
    844838    else if ($html_part!==NULL && $prefer_html) 
    845       $print_part = $structure->parts[$html_part]; 
     839      $print_part = &$structure->parts[$html_part]; 
    846840    else if ($enriched_part!==NULL) 
    847       $print_part = $structure->parts[$enriched_part]; 
     841      $print_part = &$structure->parts[$enriched_part]; 
    848842    else if ($plain_part!==NULL) 
    849       $print_part = $structure->parts[$plain_part]; 
     843      $print_part = &$structure->parts[$plain_part]; 
    850844 
    851845    // show message body 
    852846    if (is_object($print_part)) 
    853       $a_return_parts[] = array('type' => 'content', 
    854                                 'body' => $print_part->body, 
    855                                 'ctype_primary' => strtolower($print_part->ctype_primary), 
    856                                 'ctype_secondary' => strtolower($print_part->ctype_secondary), 
    857                                 'parameters' => $print_part->ctype_parameters, 
    858                                 'encoding' => $print_part->headers['content-transfer-encoding']); 
     847      { 
     848      $print_part->type = 'content'; 
     849      $a_return_parts[] = $print_part; 
     850      } 
    859851    // show plaintext warning 
    860852    else if ($html_part!==NULL) 
    861       $a_return_parts[] = array('type' => 'content', 
    862                                 'body' => rcube_label('htmlmessage'), 
    863                                 'ctype_primary' => 'text', 
    864                                 'ctype_secondary' => 'plain'); 
     853      { 
     854      $c = new stdClass; 
     855      $c->type = 'content'; 
     856      $c->body = rcube_label('htmlmessage'); 
     857      $c->ctype_primary = 'text'; 
     858      $c->ctype_secondary = 'plain'; 
     859       
     860      $a_return_parts[] = $c; 
     861      } 
    865862                                 
    866863    // add html part as attachment 
    867864    if ($html_part!==NULL && $structure->parts[$html_part]!==$print_part) 
    868865      { 
    869       $html_part = $structure->parts[$html_part]; 
    870       $a_attachments[] = array('filename' => rcube_label('htmlmessage'), 
    871                                'encoding' => $html_part->headers['content-transfer-encoding'], 
    872                                'mimetype' => 'text/html', 
    873                                'part_id'  => $html_part->mime_id, 
    874                                'size'     => strlen($IMAP->mime_decode($html_part->body, $html_part->headers['content-transfer-encoding']))); 
     866      $html_part = &$structure->parts[$html_part]; 
     867      $html_part->filename = rcube_label('htmlmessage'); 
     868      $html_part->mimetype = 'text/html'; 
     869       
     870      $a_attachments[] = $html_part; 
    875871      } 
    876872    } 
    877873 
    878874  // message contains multiple parts 
    879   else if ($message_ctype_primary=='multipart' && is_array($structure->parts)) 
    880     { 
    881     foreach ($structure->parts as $mail_part) 
    882       { 
     875  else if (is_array($structure->parts) && !empty($structure->parts)) 
     876    { 
     877    for ($i=0; $i<count($structure->parts); $i++) 
     878      { 
     879      $mail_part = &$structure->parts[$i]; 
    883880      $primary_type = strtolower($mail_part->ctype_primary); 
    884881      $secondary_type = strtolower($mail_part->ctype_secondary); 
    885882 
    886883      // multipart/alternative 
    887       if ($primary_type=='multipart') // && ($secondary_type=='alternative' || $secondary_type=='mixed' || $secondary_type=='related')) 
     884      if ($primary_type=='multipart') 
    888885        { 
    889886        list($parts, $attachmnts) = rcmail_parse_message($mail_part, $arg, TRUE); 
     
    897894               ($primary_type=='message' && $secondary_type=='delivery-status')) 
    898895        { 
    899         $a_return_parts[] = array('type' => 'content', 
    900                                   'body' => $mail_part->body, 
    901                                   'ctype_primary' => $primary_type, 
    902                                   'ctype_secondary' => $secondary_type, 
    903                                   'parameters' => $mail_part->ctype_parameters, 
    904                                   'encoding' => $mail_part->headers['content-transfer-encoding']); 
     896        $mail_part->type = 'content'; 
     897        $a_return_parts[] = $mail_part; 
    905898        } 
    906899 
     
    908901      else if ($primary_type=='message') 
    909902        { 
    910         /* don't parse headers here; they're parsed within the recursive call to rcmail_parse_message() 
    911         if ($mail_part->parts[0]->headers) 
    912           $a_return_parts[] = array('type' => 'headers', 
    913                                     'headers' => $mail_part->parts[0]->headers); 
    914         */ 
    915                                        
    916         list($parts, $attachmnts) = rcmail_parse_message($mail_part->parts[0], $arg, TRUE); 
    917  
     903        list($parts, $attachmnts) = rcmail_parse_message($mail_part, $arg, TRUE); 
     904           
    918905        $a_return_parts = array_merge($a_return_parts, $parts); 
    919906        $a_attachments = array_merge($a_attachments, $attachmnts); 
     
    924911               (empty($mail_part->disposition) && ($mail_part->d_parameters['filename'] || $mail_part->ctype_parameters['name']))) 
    925912        { 
     913        // skip apple ressource files 
     914        if ($message_ctype_secondary=='appledouble' && $secondary_type=='applefile') 
     915          continue; 
     916 
     917        // part belongs to a related message 
    926918        if ($message_ctype_secondary=='related' && $mail_part->headers['content-id']) 
    927           $sa_inline_objects[] = array('filename' => rcube_imap::decode_mime_string($mail_part->d_parameters['filename']), 
    928                                        'mimetype' => strtolower("$primary_type/$secondary_type"), 
    929                                        'part_id'  => $mail_part->mime_id, 
    930                                        'content_id' => preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id'])); 
    931  
    932         else if ($mail_part->d_parameters['filename']) 
    933           $a_attachments[] = array('filename' => rcube_imap::decode_mime_string($mail_part->d_parameters['filename']), 
    934                                    'encoding' => strtolower($mail_part->headers['content-transfer-encoding']), 
    935                                    'mimetype' => strtolower("$primary_type/$secondary_type"), 
    936                                    'part_id'  => $mail_part->mime_id, 
    937                                    'size'     => strlen($IMAP->mime_decode($mail_part->body, $mail_part->headers['content-transfer-encoding'])) /*, 
    938                                    'content'  => $mail_part->body */); 
    939                                     
    940         else if ($mail_part->ctype_parameters['name']) 
    941           $a_attachments[] = array('filename' => rcube_imap::decode_mime_string($mail_part->ctype_parameters['name']), 
    942                                    'encoding' => strtolower($mail_part->headers['content-transfer-encoding']), 
    943                                    'mimetype' => strtolower("$primary_type/$secondary_type"), 
    944                                    'part_id'  => $mail_part->mime_id, 
    945                                    'size'     => strlen($IMAP->mime_decode($mail_part->body, $mail_part->headers['content-transfer-encoding'])) /*, 
    946                                    'content'  => $mail_part->body */); 
    947                                     
    948         else if ($mail_part->headers['content-description']) 
    949           $a_attachments[] = array('filename' => rcube_imap::decode_mime_string($mail_part->headers['content-description']), 
    950                                    'encoding' => strtolower($mail_part->headers['content-transfer-encoding']), 
    951                                    'mimetype' => strtolower("$primary_type/$secondary_type"), 
    952                                    'part_id'  => $mail_part->mime_id, 
    953                                    'size'     => strlen($IMAP->mime_decode($mail_part->body, $mail_part->headers['content-transfer-encoding'])) /*, 
    954                                    'content'  => $mail_part->body */); 
     919          { 
     920          $mail_part->filename = rcube_imap::decode_mime_string($mail_part->d_parameters['filename']); 
     921          $mail_part->content_id = preg_replace(array('/^</', '/>$/'), '', $mail_part->headers['content-id']); 
     922          $sa_inline_objects[] = $mail_part; 
     923          } 
     924        // is regular attachment 
     925        else if (($fname = $mail_part->d_parameters['filename']) || 
     926                 ($fname = $mail_part->ctype_parameters['name']) || 
     927                 ($fname = $mail_part->headers['content-description'])) 
     928          { 
     929          $mail_part->filename = rcube_imap::decode_mime_string($fname); 
     930          $a_attachments[] = $mail_part; 
     931          } 
    955932        } 
    956933      } 
     
    960937    if ($message_ctype_secondary=='related' && sizeof($sa_inline_objects)) 
    961938      { 
    962       $a_replace_patters = array(); 
    963       $a_replace_strings = array(); 
     939      $a_replaces = array(); 
    964940         
    965941      foreach ($sa_inline_objects as $inline_object) 
     942        $a_replaces['cid:'.$inline_object->content_id] = sprintf($get_url, $inline_object->mime_id); 
     943       
     944      // add replace array to each content part 
     945      // (will be applied later when part body is available) 
     946      for ($i=0; $i<count($a_return_parts); $i++) 
    966947        { 
    967         $a_replace_patters[] = 'cid:'.$inline_object['content_id']; 
    968         $a_replace_strings[] = sprintf($get_url, $inline_object['part_id']); 
     948        if ($a_return_parts[$i]->type=='content') 
     949          $a_return_parts[$i]->replaces = $a_replaces; 
    969950        } 
    970        
    971       foreach ($a_return_parts as $i => $return_part) 
    972         { 
    973         if ($return_part['type']!='content') 
    974           continue; 
    975  
    976         // decode body and replace cid:... 
    977         $a_return_parts[$i]['body'] = str_replace($a_replace_patters, $a_replace_strings, $IMAP->mime_decode($return_part['body'], $return_part['encoding'])); 
    978         $a_return_parts[$i]['encoding'] = '7bit'; 
    979         } 
    980       } 
    981     } 
    982      
    983  
    984   // join all parts together 
    985   //$out .= join($part_delimiter, $a_return_parts); 
     951      } 
     952    } 
    986953 
    987954  return array($a_return_parts, $a_attachments); 
     
    10471014function rcmail_message_body($attrib) 
    10481015  { 
    1049   global $CONFIG, $OUTPUT, $MESSAGE, $GET_URL, $REMOTE_OBJECTS, $JS_OBJECT_NAME; 
     1016  global $CONFIG, $OUTPUT, $MESSAGE, $IMAP, $GET_URL, $REMOTE_OBJECTS, $JS_OBJECT_NAME; 
    10501017   
    10511018  if (!is_array($MESSAGE['parts']) && !$MESSAGE['body']) 
     
    10691036  if (!sizeof($MESSAGE['parts']) && $MESSAGE['headers']->ctype=='multipart/encrypted') 
    10701037    { 
    1071     $MESSAGE['parts'][0] = array('type' => 'content', 
    1072                                  'ctype_primary' => 'text', 
    1073                                  'ctype_secondary' => 'plain', 
    1074                                  'body' => rcube_label('encryptedmessage')); 
     1038    $p = new stdClass; 
     1039    $p->type = 'content'; 
     1040    $p->ctype_primary = 'text'; 
     1041    $p->ctype_secondary = 'plain'; 
     1042    $p->body = rcube_label('encryptedmessage'); 
     1043    $MESSAGE['parts'][0] = $p; 
    10751044    } 
    10761045   
     
    10791048    foreach ($MESSAGE['parts'] as $i => $part) 
    10801049      { 
    1081       if ($part['type']=='headers') 
    1082         $out .= rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : NULL, $part['headers']); 
    1083       else if ($part['type']=='content') 
     1050      if ($part->type=='headers') 
     1051        $out .= rcmail_message_headers(sizeof($header_attrib) ? $header_attrib : NULL, $part->headers); 
     1052      else if ($part->type=='content') 
    10841053        { 
    1085         if (empty($part['parameters']) || empty($part['parameters']['charset'])) 
    1086           $part['parameters']['charset'] = $MESSAGE['headers']->charset; 
     1054        if (empty($part->ctype_parameters) || empty($part->ctype_parameters['charset'])) 
     1055          $$part->ctype_parameters['charset'] = $MESSAGE['headers']->charset; 
     1056          
     1057        // fetch part if not available 
     1058        if (!isset($part->body)) 
     1059          $part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part); 
    10871060         
    1088         // $body = rcmail_print_body($part['body'], $part['ctype_primary'], $part['ctype_secondary'], $part['encoding'], $safe_mode); 
    10891061        $body = rcmail_print_body($part, $safe_mode); 
    10901062        $out .= '<div class="message-part">'; 
    10911063         
    1092         if ($part['ctype_secondary']!='plain') 
     1064        if ($part->ctype_secondary != 'plain') 
    10931065          $out .= rcmail_mod_html_body($body, $attrib['id']); 
    10941066        else 
     
    11121084    foreach ($MESSAGE['attachments'] as $attach_prop) 
    11131085      { 
    1114       if (strpos($attach_prop['mimetype'], 'image/')===0) 
     1086      if (strpos($attach_prop->mimetype, 'image/')===0) 
    11151087        $out .= sprintf("\n<hr />\n<p align=\"center\"><img src=\"%s&_part=%s\" alt=\"%s\" title=\"%s\" /></p>\n", 
    1116                         $GET_URL, $attach_prop['part_id'], 
    1117                         $attach_prop['filename'], 
    1118                         $attach_prop['filename']); 
     1088                        $GET_URL, $attach_prop->mime_id, 
     1089                        $attach_prop->filename, 
     1090                        $attach_prop->filename); 
    11191091      } 
    11201092    } 
     
    12431215 
    12441216// return first text part of a message 
    1245 function rcmail_first_text_part($message_parts) 
    1246   { 
    1247   if (!is_array($message_parts)) 
     1217function rcmail_first_text_part($message_struct) 
     1218  { 
     1219  global $IMAP; 
     1220 
     1221  if (!is_array($message_struct['parts'])) 
    12481222    return FALSE; 
    12491223     
    1250   $html_part = NULL; 
     1224  // check all message parts 
     1225  foreach ($message_struct['parts'] as $pid => $part) 
     1226    { 
     1227    $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary); 
     1228 
     1229    if ($mimetype=='text/plain') 
     1230      return $IMAP->get_message_part($message_struct['UID'], $pid, $part); 
     1231 
     1232    else if ($mimetype=='text/html') 
     1233      { 
     1234      $html_part = $IMAP->get_message_part($message_struct['UID'], $pid, $part); 
    12511235       
    1252   // check all message parts 
    1253   foreach ($message_parts as $pid => $part) 
    1254     { 
    1255     $mimetype = strtolower($part->ctype_primary.'/'.$part->ctype_secondary); 
    1256     if ($mimetype=='text/plain') 
    1257       { 
    1258       $body = rcube_imap::mime_decode($part->body, $part->headers['content-transfer-encoding']); 
    1259       $body = rcube_imap::charset_decode($body, $part->ctype_parameters); 
    1260       return $body; 
    1261       } 
    1262     else if ($mimetype=='text/html') 
    1263       { 
    1264       $html_part = rcube_imap::mime_decode($part->body, $part->headers['content-transfer-encoding']); 
    1265       $html_part = rcube_imap::charset_decode($html_part, $part->ctype_parameters); 
    1266       } 
    1267     } 
    1268      
    1269  
    1270   // convert HTML to plain text 
    1271   if ($html_part) 
    1272     {     
    1273     // remove special chars encoding 
    1274     $trans = array_flip(get_html_translation_table(HTML_ENTITIES)); 
    1275     $html_part = strtr($html_part, $trans); 
    1276  
    1277     // create instance of html2text class 
    1278     $txt = new html2text($html_part); 
    1279     return $txt->get_text(); 
     1236      // remove special chars encoding 
     1237      $trans = array_flip(get_html_translation_table(HTML_ENTITIES)); 
     1238      $html_part = strtr($html_part, $trans); 
     1239 
     1240      // create instance of html2text class 
     1241      $txt = new html2text($html_part); 
     1242      return $txt->get_text(); 
     1243      } 
    12801244    } 
    12811245 
     
    12851249 
    12861250// get source code of a specific message and cache it 
     1251// deprecated 
    12871252function rcmail_message_source($uid) 
    12881253  { 
     
    14361401    return ''; 
    14371402     
    1438   $part = $MESSAGE['parts'][$_GET['_part']]; 
     1403  $part = &$MESSAGE['parts'][$_GET['_part']]; 
    14391404   
    14401405  $attrib_str = create_attrib_string($attrib, array('id', 'class', 'style', 'cellspacing', 'cellpadding', 'border', 'summary')); 
     
    14421407   
    14431408  $filename = $part->d_parameters['filename'] ? $part->d_parameters['filename'] : $part->ctype_parameters['name']; 
    1444   $filesize = strlen($IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding'])); 
     1409  $filesize = $part->size; 
    14451410   
    14461411  if ($filename) 
  • trunk/roundcubemail/program/steps/mail/get.inc

    r147 r320  
    3838 
    3939 
    40  
    4140// similar code as in program/steps/mail/show.inc 
    4241if ($_GET['_uid']) 
    4342  { 
    44   $MESSAGE = array(); 
    45   $MESSAGE['source'] = rcmail_message_source($_GET['_uid']); 
    46  
    47   $mmd = new Mail_mimeDecode($MESSAGE['source']); 
    48   $MESSAGE['structure'] = $mmd->decode(array('include_bodies' => TRUE, 
    49                                              'decode_headers' => FALSE, 
    50                                              'decode_bodies' => FALSE)); 
    51  
    52   $MESSAGE['parts'] = $mmd->getMimeNumbers($MESSAGE['structure']); 
     43  $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); 
     44  $MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']); 
     45  $MESSAGE['parts'] = $IMAP->get_mime_numbers($MESSAGE['structure']); 
    5346  } 
    54  
    5547 
    5648 
     
    6254  } 
    6355 
    64 else if ($_GET['_part']) 
     56else if ($pid = get_input_value('_part', RCUBE_INPUT_GET)) 
    6557  { 
    66   if ($part = $MESSAGE['parts'][$_GET['_part']]); 
     58  if ($part = $MESSAGE['parts'][$pid]); 
    6759    { 
    6860    $ctype_primary = strtolower($part->ctype_primary); 
     
    7163    $mimetype = sprintf('%s/%s', $ctype_primary, $ctype_secondary); 
    7264    $filename = $part->d_parameters['filename'] ? $part->d_parameters['filename'] : $part->ctype_parameters['name']; 
    73  
    74     if ($ctype_primary=='text' && $ctype_secondary=='html') 
    75       { 
    76       list($MESSAGE['parts']) = rcmail_parse_message($part, 
    77                                                      array('safe' => (bool)$_GET['_safe'], 
    78                                                            'prefer_html' => TRUE, 
    79                                                            'get_url' => $GET_URL.'&_part=%s')); 
    80  
    81       $cont = rcmail_print_body($MESSAGE['parts'][0], (bool)$_GET['_safe']); 
    82       } 
    83     else 
    84       $cont = $IMAP->mime_decode($part->body, $part->headers['content-transfer-encoding']); 
    8565 
    8666    // send correct headers for content type and length 
     
    9878      } 
    9979 
    100     header(sprintf('Content-Length: %d', strlen($cont))); 
    101  
    10280    // We need to set the following headers to make downloads work using IE in HTTPS mode. 
    10381    if (isset($_SERVER['HTTPS'])) 
     
    10886 
    10987    // deliver part content 
    110     echo $cont; 
     88    if ($ctype_primary=='text' && $ctype_secondary=='html') 
     89      { 
     90      // get part body if not available 
     91      if (!$part->body) 
     92        $part->body = $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part);         
     93 
     94      list($MESSAGE['parts']) = rcmail_parse_message($part, 
     95                                                     array('safe' => (bool)$_GET['_safe'], 
     96                                                           'prefer_html' => TRUE, 
     97                                                           'get_url' => $GET_URL.'&_part=%s')); 
     98 
     99      print rcmail_print_body($MESSAGE['parts'][0], (bool)$_GET['_safe']); 
     100      } 
     101    else 
     102      { 
     103      // turn off output buffering and print part content 
     104      //@ob_end_clean(); 
     105      $IMAP->get_message_part($MESSAGE['UID'], $part->mime_id, $part->encoding, true); 
     106      } 
     107 
    111108    exit; 
    112109    } 
     
    128125                                                 'get_url' => $GET_URL.'&_part=%s')); 
    129126 
    130   if ($MESSAGE['parts'] && $ctype_primary=='multipart') 
    131     { 
    132     // reset output page 
    133     $OUTPUT = new rcube_html_page(); 
    134     parse_template('messagepart'); 
    135     exit; 
    136     } 
    137   else if ($MESSAGE['parts'][0]) 
    138     { 
    139     $part = $MESSAGE['parts'][0]; 
    140     $cont = rcmail_print_body($part, (bool)$_GET['_safe']); 
    141     } 
    142   else 
    143     $cont = $IMAP->get_body($_GET['_uid']); 
     127  $cont = "<html>\n<head><title></title>\n</head>\n<body>"; 
     128  $cont .= rcmail_message_body(array()); 
     129  $cont .= "\n</body>\n</html>"; 
    144130 
    145131  $OUTPUT = new rcube_html_page(); 
    146132  $OUTPUT->write($cont); 
    147133 
    148 /* 
    149     if ($mimetype=='text/html') 
    150       print $cont; 
    151     else 
    152       { 
    153       print "<html>\n<body>\n"; 
    154       print $cont; 
    155       print "\n</body>\n</html>"; 
    156       } 
    157 */ 
    158134  exit; 
    159135  } 
  • trunk/roundcubemail/program/steps/mail/rss.inc

    r134 r320  
    4343        $webmail_url .= dirname($_SERVER['SCRIPT_NAME']).'/'; 
    4444 
    45 $auth_webmail_url = $webmail_url.'?_auth='.$GLOBALS['sess_auth']; 
     45$webmail_url .= '?_task=mail'; 
    4646 
    4747$messagecount_unread = $IMAP->messagecount('INBOX', 'UNSEEN', TRUE); 
     
    6969                <docs>http://blogs.law.harvard.edu/tech/rss</docs> 
    7070                <description>INBOX contains '.$messagecount.' messages, of which '.$messagecount_unread.' unread</description> 
    71                 <link>'.rss_encode($auth_webmail_url, 'xml') .'</link> 
     71                <link>'.rss_encode($webmail_url, 'xml') .'</link> 
    7272                <title>webmail for '.rss_encode($_SESSION['username'].' @ '.$_SESSION['imap_host']).'</title> 
    7373                <generator>'.rss_encode($CONFIG['useragent'], 'xml').' (RSS extension by Sjon Hortensius)</generator> 
     
    9393      $item->from = preg_replace('~"?([^"]*)"? <([^>]*)>~', '\2 (\1)', $item->from); 
    9494 
    95     $item->link = $auth_webmail_url.'&_task=mail&_action=show&_uid='.$item->uid.'&_mbox=INBOX'; 
     95    $item->link = $webmail_url.'&_task=mail&_action=show&_uid='.$item->uid.'&_mbox=INBOX'; 
    9696 
    9797    $item->body = $IMAP->get_body($item->uid); 
  • trunk/roundcubemail/program/steps/mail/show.inc

    r277 r320  
    2828if ($_GET['_uid']) 
    2929  { 
    30   $MESSAGE = array(); 
    31   $MESSAGE['headers'] = $IMAP->get_headers($_GET['_uid']); 
    32   $MESSAGE['source'] = rcmail_message_source($_GET['_uid']); 
    33    
     30  $MESSAGE = array('UID' => get_input_value('_uid', RCUBE_INPUT_GET)); 
     31  $MESSAGE['headers'] = $IMAP->get_headers($MESSAGE['UID']); 
     32  $MESSAGE['structure'] = $IMAP->get_structure($MESSAGE['UID']); 
     33     
    3434  // go back to list if message not found (wrong UID) 
    35   if (!$MESSAGE['headers'] || !$MESSAGE['source']) 
     35  if (!$MESSAGE['headers'] || !$MESSAGE['structure']) 
    3636    { 
    3737    $_action = 'list'; 
     
    3939    } 
    4040 
    41   $mmd = new Mail_mimeDecode($MESSAGE['source']); 
    42   $MESSAGE['structure'] = $mmd->decode(array('include_bodies' => TRUE, 
    43                                              'decode_headers' => FALSE, 
    44                                              'decode_bodies' => FALSE)); 
    45                                               
    46   $mmd->getMimeNumbers($MESSAGE['structure']); 
    47  
    48   $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['structure']->headers['subject']); 
    49  
     41  $MESSAGE['subject'] = $IMAP->decode_header($MESSAGE['headers']->subject); 
     42   
    5043  if ($MESSAGE['structure']) 
    51     list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message($MESSAGE['structure'], 
    52                                                                            array('safe' => (bool)$_GET['_safe'], 
    53                                                                                  'prefer_html' => $CONFIG['prefer_html'], 
    54                                                                                  'get_url' => $GET_URL.'&_part=%s')); 
     44    list($MESSAGE['parts'], $MESSAGE['attachments']) = rcmail_parse_message( 
     45      $MESSAGE['structure'], 
     46      array('safe' => (bool)$_GET['_safe'], 
     47            'prefer_html' => $CONFIG['prefer_html'], 
     48            'get_url' => $GET_URL.'&_part=%s') 
     49      ); 
    5550  else 
    56     $MESSAGE['body'] = $IMAP->get_body($_GET['_uid']); 
     51    $MESSAGE['body'] = $IMAP->get_body($MESSAGE['UID']); 
    5752 
    5853 
     
    6257 
    6358  // give message uid to the client 
    64   $javascript = sprintf("%s.set_env('uid', '%s');\n", $JS_OBJECT_NAME, $_GET['_uid']); 
     59  $javascript = sprintf("%s.set_env('uid', '%s');\n", $JS_OBJECT_NAME, $MESSAGE['UID']); 
    6560  $javascript .= sprintf("%s.set_env('safemode', '%b');", $JS_OBJECT_NAME, $_GET['_safe']); 
    6661 
     
    6863  // get previous and next message UID 
    6964  if (!($_SESSION['sort_col'] == 'date' && $_SESSION['sort_order'] == 'DESC') &&  
    70       $IMAP->get_capability('sort')) { 
    71       // Only if we use custom sorting 
    72       $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']); 
     65      $IMAP->get_capability('sort'))  
     66    { 
     67    // Only if we use custom sorting 
     68    $a_msg_index = $IMAP->message_index(NULL, $_SESSION['sort_col'], $_SESSION['sort_order']); 
    7369  
    74       $MESSAGE['index'] = array_search((string)$_GET['_uid'], $a_msg_index, TRUE); 
    75       $prev = isset($a_msg_index[$MESSAGE['index']-1]) ? $a_msg_index[$MESSAGE['index']-1] : -1 ; 
    76       $next = isset($a_msg_index[$MESSAGE['index']+1]) ? $a_msg_index[$MESSAGE['index']+1] : -1 ; 
    77   } else { 
    78       // this assumes that we are sorted by date_DESC 
    79       $seq = $IMAP->get_id($_GET['_uid']); 
    80       $prev = $IMAP->get_uid($seq + 1); 
    81       $next = $IMAP->get_uid($seq - 1); 
    82       $MESSAGE['index'] = $IMAP->messagecount() - $seq; 
    83   } 
     70    $MESSAGE['index'] = array_search((string)$MESSAGE['UID'], $a_msg_index, TRUE); 
     71    $prev = isset($a_msg_index[$MESSAGE['index']-1]) ? $a_msg_index[$MESSAGE['index']-1] : -1 ; 
     72    $next = isset($a_msg_index[$MESSAGE['index']+1]) ? $a_msg_index[$MESSAGE['index']+1] : -1 ; 
     73    } 
     74  else 
     75    { 
     76    // this assumes that we are sorted by date_DESC 
     77    $seq = $IMAP->get_id($MESSAGE['UID']); 
     78    $prev = $IMAP->get_uid($seq + 1); 
     79    $next = $IMAP->get_uid($seq - 1); 
     80    $MESSAGE['index'] = $IMAP->messagecount() - $seq; 
     81    } 
    8482   
    8583  if ($prev > 0) 
     
    107105      if ($PRINT_MODE) 
    108106        $out .= sprintf('<li>%s (%s)</li>'."\n", 
    109                         $attach_prop['filename'], 
    110                         show_bytes($attach_prop['size'])); 
     107                        $attach_prop->filename, 
     108                        show_bytes($attach_prop->size)); 
    111109      else 
    112110        $out .= sprintf('<li><a href="%s&amp;_part=%s" onclick="return %s.command(\'load-attachment\',{part:\'%s\', mimetype:\'%s\'},this)">%s</a></li>'."\n", 
    113111                        htmlentities($GET_URL), 
    114                         $attach_prop['part_id'], 
     112                        $attach_prop->mime_id, 
    115113                        $JS_OBJECT_NAME, 
    116                         $attach_prop['part_id'], 
    117                         $attach_prop['mimetype'], 
    118                         $attach_prop['filename']); 
     114                        $attach_prop->mime_id, 
     115                        $attach_prop->mimetype, 
     116                        $attach_prop->filename); 
    119117      } 
    120118 
  • trunk/roundcubemail/program/steps/mail/viewsource.inc

    r8 r320  
    2222 
    2323// similar code as in program/steps/mail/get.inc 
    24 if ($_GET['_uid']) 
     24if ($uid = get_input_value('_uid', RCUBE_INPUT_GET)) 
    2525  { 
    2626  header('Content-Type: text/plain'); 
    27   print rcmail_message_source($_GET['_uid']); 
     27  //@ob_end_clean(); 
     28  $IMAP->print_raw_body($uid); 
    2829  } 
    2930else 
     
    3132  raise_error(array('code' => 500, 
    3233                    'type' => 'php', 
    33                     'message' => 'Message UID '.$_GET['_uid'].' not found'), 
     34                    'message' => 'Message UID '.$uid.' not found'), 
    3435              TRUE, 
    3536              TRUE); 
Note: See TracChangeset for help on using the changeset viewer.