Changeset 5df0ad0 in github


Ignore:
Timestamp:
Sep 3, 2008 6:52:26 AM (5 years ago)
Author:
alecpl <alec@…>
Branches:
master, HEAD, courier-fix, dev-browser-capabilities, pdo, release-0.6, release-0.7, release-0.8
Children:
2a61274
Parents:
08abbac
Message:
  • Add RFC2231 header value continuations support for attachment filenames + hack for servers that not support that feature
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • CHANGELOG

    red132ed r5df0ad0  
    11CHANGELOG RoundCube Webmail 
    22--------------------------- 
     3 
     42008/09/03 (alec) 
     5---------- 
     6- Add RFC2231 header value continuations support for attachment 
     7  filenames + hack for servers that not support that feature 
    38 
    492008/09/02 (thomasb) 
  • program/include/rcube_imap.php

    r11ef977 r5df0ad0  
    11621162 
    11631163    // normalize filename property 
    1164     if ($filename_mime = $struct->d_parameters['filename'] ? $struct->d_parameters['filename'] : $struct->ctype_parameters['name']) 
    1165     { 
    1166       $struct->filename = rcube_imap::decode_mime_string($filename_mime,  
    1167             $struct->charset ? $struct->charset : rc_detect_encoding($filename_mime, $this->default_charset)); 
    1168     } 
    1169     else if ($filename_encoded = $struct->d_parameters['filename*'] ? $struct->d_parameters['filename*'] : $struct->ctype_parameters['name*']) 
    1170     { 
     1164    $this->_set_part_filename($struct); 
     1165 
     1166    return $struct; 
     1167    } 
     1168     
     1169 
     1170  /** 
     1171   * Fetch attachment filename from message part structure  
     1172   * 
     1173   * @access private 
     1174   * @param  object rcube_message_part Part object 
     1175   * @return string Attachment filename 
     1176   */ 
     1177  function _set_part_filename(&$part) 
     1178    { 
     1179    // $this->_msg_id 
     1180     
     1181    if (!empty($part->d_parameters['filename'])) 
     1182      $filename_mime = $part->d_parameters['filename']; 
     1183    else if (!empty($part->ctype_parameters['name'])) 
     1184      $filename_mime = $part->ctype_parameters['name']; 
     1185    else if (!empty($part->d_parameters['filename*'])) 
     1186      $filename_encoded = $part->d_parameters['filename*']; 
     1187    else if (!empty($part->ctype_parameters['name*'])) 
     1188      $filename_encoded = $part->ctype_parameters['name*']; 
     1189    // RFC2231 value continuations 
     1190    // TODO: this should be rewrited to support RFC2231 4.1 combinations 
     1191    else if (!empty($part->d_parameters['filename*0'])) { 
     1192      $i = 0; 
     1193      while (isset($part->d_parameters['filename*'.$i])) { 
     1194        $i++; 
     1195        $filename_mime .= $part->d_parameters['filename*'.$i]; 
     1196        } 
     1197      // some servers (eg. dovecot-1.x) have no support for parameter value continuations 
     1198      // we must fetch and parse headers "manually" 
     1199      if ($i<2) { 
     1200        // TODO: fetch only Content-Type/Content-Disposition header 
     1201        $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); 
     1202        $filename_mime = ''; 
     1203        $i = 0; 
     1204        while (preg_match('/filename\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { 
     1205          $filename_mime .= $matches[1]; 
     1206          $i++; 
     1207          } 
     1208        }        
     1209      } 
     1210    else if (!empty($part->d_parameters['filename*0*'])) { 
     1211      $i = 0; 
     1212      while (isset($part->d_parameters['filename*'.$i.'*'])) { 
     1213        $i++; 
     1214        $filename_encoded .= $part->d_parameters['filename*'.$i.'*']; 
     1215        } 
     1216      if ($i<2) { 
     1217        $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); 
     1218        $filename_encoded = ''; 
     1219        $i = 0; 
     1220        while (preg_match('/filename\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { 
     1221          $filename_encoded .= $matches[1]; 
     1222          $i++; 
     1223          } 
     1224        }        
     1225      } 
     1226    else if (!empty($part->ctype_parameters['name*0'])) { 
     1227      $i = 0; 
     1228      while (isset($part->ctype_parameters['name*'.$i])) { 
     1229        $i++; 
     1230        $filename_mime .= $part->ctype_parameters['name*'.$i]; 
     1231        } 
     1232      if ($i<2) { 
     1233        $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); 
     1234        $filename_mime = ''; 
     1235        $i = 0; 
     1236        while (preg_match('/\s+name\*'.$i.'\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { 
     1237          $filename_mime .= $matches[1]; 
     1238          $i++; 
     1239          } 
     1240        }        
     1241      } 
     1242    else if (!empty($part->ctype_parameters['name*0*'])) { 
     1243      $i = 0; 
     1244      while (isset($part->ctype_parameters['name*'.$i.'*'])) { 
     1245        $i++; 
     1246        $filename_encoded .= $part->ctype_parameters['name*'.$i.'*']; 
     1247        } 
     1248      if ($i<2) { 
     1249        $headers = iil_C_FetchPartBody($this->conn, $this->mailbox, $this->_msg_id, $struct->mime_id.'.HEADER'); 
     1250        $filename_encoded = ''; 
     1251        $i = 0; 
     1252        while (preg_match('/\s+name\*'.$i.'\*\s*=\s*"*([^"\n;]+)[";]*/', $headers, $matches)) { 
     1253          $filename_encoded .= $matches[1]; 
     1254          $i++; 
     1255          } 
     1256        }        
     1257      } 
     1258    // Content-Disposition 
     1259    else if (!empty($part->headers['content-description'])) 
     1260      $filename_mime = $part->headers['content-description']; 
     1261    else 
     1262      return; 
     1263 
     1264    // decode filename 
     1265    if (!empty($filename_mime)) { 
     1266      $part->filename = rcube_imap::decode_mime_string($filename_mime,  
     1267            $part->charset ? $part->charset : rc_detect_encoding($filename_mime, $this->default_charset)); 
     1268      }  
     1269    else if (!empty($filename_encoded)) { 
    11711270      // decode filename according to RFC 2231, Section 4 
    11721271      list($filename_charset,, $filename_urlencoded) = split('\'', $filename_encoded); 
    1173       $struct->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); 
    1174     } 
    1175     else if (!empty($struct->headers['content-description'])) 
    1176       $struct->filename = rcube_imap::decode_mime_string($struct->headers['content-description'], 
    1177             $struct->charset ? $struct->charset : rc_detect_encoding($struct->headers['content-description'],$this->default_charset)); 
    1178        
    1179     return $struct; 
    1180     } 
    1181      
     1272      $part->filename = rcube_charset_convert(urldecode($filename_urlencoded), $filename_charset); 
     1273      } 
     1274    } 
     1275      
    11821276   
    11831277  /** 
Note: See TracChangeset for help on using the changeset viewer.