alecpl
2011-07-27 733ed0a20a025c2534ab9cbfb5880ed44ec2472f
- Use rcube_imap_generic::tokenizeResponse() for parsing BODYSTRUCTURE, fixes #1488007


2 files modified
81 ■■■■■ changed files
program/include/rcube_imap.php 8 ●●●● patch | view | raw | blame | history
program/include/rcube_mime_struct.php 73 ●●●●● patch | view | raw | blame | history
program/include/rcube_imap.php
@@ -2163,7 +2163,7 @@
                    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 @@
        }
        // 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 @@
        }
        // 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];
program/include/rcube_mime_struct.php
@@ -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 @@
        $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);
@@ -141,74 +141,5 @@
            return $a;
        }
    }
    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;
    }
}