Changeset 5df0ad0 in github
- Timestamp:
- Sep 3, 2008 6:52:26 AM (5 years ago)
- Branches:
- master, HEAD, courier-fix, dev-browser-capabilities, pdo, release-0.6, release-0.7, release-0.8
- Children:
- 2a61274
- Parents:
- 08abbac
- Files:
-
- 2 edited
-
CHANGELOG (modified) (1 diff)
-
program/include/rcube_imap.php (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
CHANGELOG
red132ed r5df0ad0 1 1 CHANGELOG RoundCube Webmail 2 2 --------------------------- 3 4 2008/09/03 (alec) 5 ---------- 6 - Add RFC2231 header value continuations support for attachment 7 filenames + hack for servers that not support that feature 3 8 4 9 2008/09/02 (thomasb) -
program/include/rcube_imap.php
r11ef977 r5df0ad0 1162 1162 1163 1163 // 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)) { 1171 1270 // decode filename according to RFC 2231, Section 4 1172 1271 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 1182 1276 1183 1277 /**
Note: See TracChangeset
for help on using the changeset viewer.
