From 733ed0a20a025c2534ab9cbfb5880ed44ec2472f Mon Sep 17 00:00:00 2001
From: alecpl <alec@alec.pl>
Date: Wed, 27 Jul 2011 14:21:49 -0400
Subject: [PATCH] - Use rcube_imap_generic::tokenizeResponse() for parsing BODYSTRUCTURE, fixes #1488007

---
 program/include/rcube_imap.php        |    8 ++--
 program/include/rcube_mime_struct.php |   79 ++-------------------------------------
 2 files changed, 9 insertions(+), 78 deletions(-)

diff --git a/program/include/rcube_imap.php b/program/include/rcube_imap.php
index cfea189..f809288 100644
--- a/program/include/rcube_imap.php
+++ b/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];
 
diff --git a/program/include/rcube_mime_struct.php b/program/include/rcube_mime_struct.php
index 3a79aca..c649425 100644
--- a/program/include/rcube_mime_struct.php
+++ b/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);
@@ -78,7 +78,7 @@
 		    else if ($part_a[0])
                 return $part_a[0];
 	    }
-        
+
         return 'other';
     }
 
@@ -89,7 +89,7 @@
 		    if (!is_array($part_a[0]))
                 return $part_a[5];
 	    }
-        
+
         return '';
     }
 
@@ -108,7 +108,7 @@
 			    }
 		    }
 	    }
-        
+
         return '';
     }
 
@@ -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;
-    }
-
 
 }

--
Gitblit v1.9.1