It isn't a workaround
[squirrelmail.git] / class / deliver / Deliver.class.php
index 90fdf0c7f644e6adf2348b729bd375589e311b04..9a9bce0596f9d6bde60f83d514851576dace36ac 100644 (file)
@@ -76,8 +76,17 @@ class Deliver {
         if ($boundary && $message->entity_id && count($message->entities)) {
             if (strpos($boundary,'_part_')) {
                 $boundary = substr($boundary,0,strpos($boundary,'_part_'));
+
+            // the next four lines use strrev to reverse any nested boundaries
+            // because RFC 2046 (5.1.1) says that if a line starts with the outer
+            // boundary string (doesn't matter what the line ends with), that
+            // can be considered a match for the outer boundary; thus the nested
+            // boundary needs to be unique from the outer one
+            //
+            } else if (strpos($boundary,'_trap_')) {
+                $boundary = substr(strrev($boundary),0,strpos(strrev($boundary),'_part_'));
             }
-            $boundary_new = $boundary . '_part_'.$message->entity_id;
+            $boundary_new = strrev($boundary . '_part_'.$message->entity_id);
         } else {
             $boundary_new = $boundary;
         }
@@ -133,6 +142,8 @@ class Deliver {
         case 'message':
             if ($message->body_part) {
                 $body_part = $message->body_part;
+                // remove NUL characters
+                $body_part = str_replace("\0",'',$body_part);
                 $length += $this->clean_crlf($body_part);
                 if ($stream) {
                     $this->preWriteToStream($body_part);
@@ -290,7 +301,7 @@ class Deliver {
         $contenttype = 'Content-Type: '. $mime_header->type0 .'/'.
                         $mime_header->type1;
         if (count($message->entities)) {
-            $contenttype .= ";\r\n " . 'boundary="'.$boundary.'"';
+            $contenttype .= ';' . 'boundary="'.$boundary.'"';
         }
         if (isset($mime_header->parameters['name'])) {
             $contenttype .= '; name="'.
@@ -304,19 +315,19 @@ class Deliver {
 
         $header[] = $contenttype . $rn;
         if ($mime_header->description) {
-            $header[] .= 'Content-Description: ' . $mime_header->description . $rn;
+            $header[] = 'Content-Description: ' . $mime_header->description . $rn;
         }
         if ($mime_header->encoding) {
-            $header[] .= 'Content-Transfer-Encoding: ' . $mime_header->encoding . $rn;
+            $header[] = 'Content-Transfer-Encoding: ' . $mime_header->encoding . $rn;
         } else {
             if ($mime_header->type0 == 'text' || $mime_header->type0 == 'message') {
-                $header[] .= 'Content-Transfer-Encoding: 8bit' .  $rn;
+                $header[] = 'Content-Transfer-Encoding: 8bit' .  $rn;
             } else {
-                $header[] .= 'Content-Transfer-Encoding: base64' .  $rn;
+                $header[] = 'Content-Transfer-Encoding: base64' .  $rn;
             }
         }
         if ($mime_header->id) {
-            $header[] .= 'Content-ID: ' . $mime_header->id . $rn;
+            $header[] = 'Content-ID: ' . $mime_header->id . $rn;
         }
         if ($mime_header->disposition) {
             $disposition = $mime_header->disposition;
@@ -328,10 +339,10 @@ class Deliver {
             $header[] = $contentdisp . $rn;
         }
         if ($mime_header->md5) {
-            $header[] .= 'Content-MD5: ' . $mime_header->md5 . $rn;
+            $header[] = 'Content-MD5: ' . $mime_header->md5 . $rn;
         }
         if ($mime_header->language) {
-            $header[] .= 'Content-Language: ' . $mime_header->language . $rn;
+            $header[] = 'Content-Language: ' . $mime_header->language . $rn;
         }
 
         $cnt = count($header);
@@ -467,9 +478,6 @@ class Deliver {
             case 1:
                 $header[] = 'X-Priority: 1 (Highest)'.$rn;
                 $header[] = 'Importance: High'. $rn; break;
-            case 3:
-                $header[] = 'X-Priority: 3 (Normal)'.$rn;
-                $header[] = 'Importance: Normal'. $rn; break;
             case 5:
                 $header[] = 'X-Priority: 5 (Lowest)'.$rn;
                 $header[] = 'Importance: Low'. $rn; break;
@@ -686,4 +694,4 @@ class Deliver {
         return $refer;
     }
 }
-?>
\ No newline at end of file
+?>