- Use rcube_imap_generic::tokenizeResponse() for parsing BODYSTRUCTURE, fixes #1488007

release-0.6
alecpl 13 years ago
parent 341d9661c7
commit 733ed0a20a

@ -2163,7 +2163,7 @@ class rcube_imap
if (strtolower($part[$i][0]) == 'message' && strtolower($part[$i][1]) == 'rfc822') {
$mime_part_headers[] = $tmp_part_id;
}
else if (in_array('name', (array)$part[$i][2]) && (empty($part[$i][3]) || $part[$i][3]=='NIL')) {
else if (in_array('name', (array)$part[$i][2]) && empty($part[$i][3])) {
$mime_part_headers[] = $tmp_part_id;
}
}
@ -2231,13 +2231,13 @@ class rcube_imap
}
// read content encoding
if (!empty($part[5]) && $part[5]!='NIL') {
if (!empty($part[5])) {
$struct->encoding = strtolower($part[5]);
$struct->headers['content-transfer-encoding'] = $struct->encoding;
}
// get part size
if (!empty($part[6]) && $part[6]!='NIL')
if (!empty($part[6]))
$struct->size = intval($part[6]);
// read part disposition
@ -2264,7 +2264,7 @@ class rcube_imap
}
// get part ID
if (!empty($part[3]) && $part[3]!='NIL') {
if (!empty($part[3])) {
$struct->content_id = $part[3];
$struct->headers['content-id'] = $part[3];

@ -6,7 +6,7 @@
| program/include/rcube_mime_struct.php |
| |
| This file is part of the Roundcube Webmail client |
| Copyright (C) 2005-2010, The Roundcube Dev Team |
| Copyright (C) 2005-2011, The Roundcube Dev Team |
| Licensed under the GNU GPL |
| |
| PURPOSE: |
@ -48,7 +48,7 @@ class rcube_mime_struct
$line = substr($str, 1, strlen($str) - 2);
$line = str_replace(')(', ') (', $line);
$struct = self::parseBSString($line);
$struct = rcube_imap_generic::tokenizeResponse($line);
if (!is_array($struct[0]) && (strcasecmp($struct[0], 'message') == 0)
&& (strcasecmp($struct[1], 'rfc822') == 0)) {
$struct = array($struct);
@ -78,7 +78,7 @@ class rcube_mime_struct
else if ($part_a[0])
return $part_a[0];
}
return 'other';
}
@ -89,7 +89,7 @@ class rcube_mime_struct
if (!is_array($part_a[0]))
return $part_a[5];
}
return '';
}
@ -108,7 +108,7 @@ class rcube_mime_struct
}
}
}
return '';
}
@ -142,73 +142,4 @@ class rcube_mime_struct
}
}
private function closingParenPos($str, $start)
{
$level = 0;
$len = strlen($str);
$in_quote = 0;
for ($i=$start; $i<$len; $i++) {
if ($str[$i] == '"' && $str[$i-1] != "\\") {
$in_quote = ($in_quote + 1) % 2;
}
if (!$in_quote) {
if ($str[$i] == '(')
$level++;
else if (($level > 0) && ($str[$i] == ')'))
$level--;
else if (($level == 0) && ($str[$i] == ')'))
return $i;
}
}
}
/*
* Parses IMAP's BODYSTRUCTURE string into array
*/
private function parseBSString($str)
{
$id = 0;
$a = array();
$len = strlen($str);
$in_quote = 0;
for ($i=0; $i<$len; $i++) {
if ($str[$i] == '"') {
$in_quote = ($in_quote + 1) % 2;
} else if (!$in_quote) {
// space means new element
if ($str[$i] == ' ') {
$id++;
// skip additional spaces
while ($str[$i+1] == ' ')
$i++;
// new part
} else if ($str[$i] == '(') {
$i++;
$endPos = self::closingParenPos($str, $i);
$partLen = $endPos - $i;
if ($partLen < 0)
break;
$part = substr($str, $i, $partLen);
$a[$id] = self::parseBSString($part); // send part string
$i = $endPos;
} else
$a[$id] .= $str[$i]; //add to current element in array
} else if ($in_quote) {
if ($str[$i] == "\\") {
$i++; // escape backslashes
if ($str[$i] == '"' || $str[$i] == "\\")
$a[$id] .= $str[$i];
}
else
$a[$id] .= $str[$i]; //add to current element in array
}
}
reset($a);
return $a;
}
}

Loading…
Cancel
Save